From 345d55669eddd5c9c8e5a017a184e98725d3c20c Mon Sep 17 00:00:00 2001 From: psucien Date: Thu, 2 Jan 2025 23:27:18 +0100 Subject: [PATCH 001/455] texture_cache: 8bpp macro detiler --- src/video_core/host_shaders/CMakeLists.txt | 1 + .../host_shaders/detile_macro32x2.comp | 4 +- .../host_shaders/detile_macro8x1.comp | 101 ++++++++++++++++++ src/video_core/texture_cache/tile_manager.cpp | 8 +- src/video_core/texture_cache/tile_manager.h | 1 + 5 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 src/video_core/host_shaders/detile_macro8x1.comp diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index c2a3b53fd..44761545d 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -7,6 +7,7 @@ set(SHADER_FILES detile_m32x1.comp detile_m32x2.comp detile_m32x4.comp + detile_macro8x1.comp detile_macro32x1.comp detile_macro32x2.comp fs_tri.vert diff --git a/src/video_core/host_shaders/detile_macro32x2.comp b/src/video_core/host_shaders/detile_macro32x2.comp index d161484c1..986acc963 100644 --- a/src/video_core/host_shaders/detile_macro32x2.comp +++ b/src/video_core/host_shaders/detile_macro32x2.comp @@ -87,7 +87,7 @@ void main() { uint offs = slice_offs + tile_offs + (idx * BPP / 8); uint p0 = in_data[(offs >> 2) + 0]; - uint p1 = in_data[(offs >> 2) + 1]; + uint p1 = in_data[(offs >> 2) + 1]; out_data[2 * gl_GlobalInvocationID.x + 0] = p0; - out_data[2 * gl_GlobalInvocationID.x + 1] = p1; + out_data[2 * gl_GlobalInvocationID.x + 1] = p1; } diff --git a/src/video_core/host_shaders/detile_macro8x1.comp b/src/video_core/host_shaders/detile_macro8x1.comp new file mode 100644 index 000000000..cddc8af5b --- /dev/null +++ b/src/video_core/host_shaders/detile_macro8x1.comp @@ -0,0 +1,101 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#version 450 + +layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in; + +layout(std430, binding = 0) buffer input_buf { + uint in_data[]; +}; +layout(std430, binding = 1) buffer output_buf { + uint out_data[]; +}; + +layout(push_constant) uniform image_info { + uint num_levels; + uint pitch; + uint height; + uint c0; + uint c1; +} info; + +const uint lut_8bpp[][16] = { + { + 0x05040100, 0x45444140, + 0x07060302, 0x47464342, + 0x0d0c0908, 0x4d4c4948, + 0x0f0e0b0a, 0x4f4e4b4a, + 0x85848180, 0xc5c4c1c0, + 0x87868382, 0xc7c6c3c2, + 0x8d8c8988, 0xcdccc9c8, + 0x8f8e8b8a, 0xcfcecbca, + }, + { + 0x15141110, 0x55545150, + 0x17161312, 0x57565352, + 0x1d1c1918, 0x5d5c5958, + 0x1f1e1b1a, 0x5f5e5b5a, + 0x95949190, 0xd5d4d1d0, + 0x97969392, 0xd7d6d3d2, + 0x9d9c9998, 0xdddcd9d8, + 0x9f9e9b9a, 0xdfdedbda, + }, + { + 0x25242120, 0x65646160, + 0x27262322, 0x67666362, + 0x2d2c2928, 0x6d6c6968, + 0x2f2e2b2a, 0x6f6e6b6a, + 0xa5a4a1a0, 0xe5e4e1e0, + 0xa7a6a3a2, 0xe7e6e3e2, + 0xadaca9a8, 0xedece9e8, + 0xafaeabaa, 0xefeeebea, + }, + { + 0x35343130, 0x75747170, + 0x37363332, 0x77767372, + 0x3d3c3938, 0x7d7c7978, + 0x3f3e3b3a, 0x7f7e7b7a, + 0xb5b4b1b0, 0xf5f4f1f0, + 0xb7b6b3b2, 0xf7f6f3f2, + 0xbdbcb9b8, 0xfdfcf9f8, + 0xbfbebbba, 0xfffefbfa, + }, +}; + +#define MICRO_TILE_DIM (8) +#define MICRO_TILE_SZ (256) +#define TEXELS_PER_ELEMENT (1) +#define BPP (8) + +shared uint scratch[16]; + +void main() { + uint slot = gl_LocalInvocationID.x >> 2u; + atomicAnd(scratch[slot], 0); + + uint x = gl_GlobalInvocationID.x % info.pitch; + uint y = (gl_GlobalInvocationID.x / info.pitch) % info.height; + uint z = gl_GlobalInvocationID.x / (info.pitch * info.height); + + uint col = bitfieldExtract(x, 0, 3); + uint row = bitfieldExtract(y, 0, 3); + uint lut = bitfieldExtract(z, 0, 2); + uint idx_dw = lut_8bpp[lut][(col + row * MICRO_TILE_DIM) >> 2u]; + uint byte_ofs = (gl_LocalInvocationID.x & 3u) * 8; + uint idx = bitfieldExtract(idx_dw >> byte_ofs, 0, 8); + + uint slice_offs = (z >> 2u) * info.c1 * MICRO_TILE_SZ; + uint tile_row = y / MICRO_TILE_DIM; + uint tile_column = x / MICRO_TILE_DIM; + uint tile_offs = ((tile_row * info.c0) + tile_column) * MICRO_TILE_SZ; + uint offs = (slice_offs + tile_offs) + (idx * BPP / 8); + + uint p0 = in_data[offs >> 2u]; + uint byte = bitfieldExtract(p0 >> (offs * 8), 0, 8); + atomicOr(scratch[slot], byte << byte_ofs); + + if (byte_ofs == 0) { + out_data[gl_GlobalInvocationID.x >> 2u] = scratch[slot]; + } +} diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp index c1243dafb..0e550c7dc 100644 --- a/src/video_core/texture_cache/tile_manager.cpp +++ b/src/video_core/texture_cache/tile_manager.cpp @@ -15,6 +15,7 @@ #include "video_core/host_shaders/detile_m8x2_comp.h" #include "video_core/host_shaders/detile_macro32x1_comp.h" #include "video_core/host_shaders/detile_macro32x2_comp.h" +#include "video_core/host_shaders/detile_macro8x1_comp.h" #include #include @@ -108,6 +109,8 @@ const DetilerContext* TileManager::GetDetiler(const ImageInfo& info) const { } case AmdGpu::TilingMode::Texture_Volume: switch (format) { + case vk::Format::eR8Uint: + return &detilers[DetilerType::Macro8x1]; case vk::Format::eR32Uint: return &detilers[DetilerType::Macro32x1]; case vk::Format::eR32G32Uint: @@ -133,8 +136,8 @@ TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& sc static const std::array detiler_shaders{ HostShaders::DETILE_M8X1_COMP, HostShaders::DETILE_M8X2_COMP, HostShaders::DETILE_M32X1_COMP, HostShaders::DETILE_M32X2_COMP, - HostShaders::DETILE_M32X4_COMP, HostShaders::DETILE_MACRO32X1_COMP, - HostShaders::DETILE_MACRO32X2_COMP, + HostShaders::DETILE_M32X4_COMP, HostShaders::DETILE_MACRO8X1_COMP, + HostShaders::DETILE_MACRO32X1_COMP, HostShaders::DETILE_MACRO32X2_COMP, }; boost::container::static_vector bindings{ @@ -323,7 +326,6 @@ std::pair TileManager::TryDetile(vk::Buffer in_buffer, u32 in_o params.height = info.size.height; if (info.tiling_mode == AmdGpu::TilingMode::Texture_Volume) { ASSERT(info.resources.levels == 1); - ASSERT(info.num_bits >= 32); const auto tiles_per_row = info.pitch / 8u; const auto tiles_per_slice = tiles_per_row * ((info.size.height + 7u) / 8u); params.sizes[0] = tiles_per_row; diff --git a/src/video_core/texture_cache/tile_manager.h b/src/video_core/texture_cache/tile_manager.h index 1d731d2f2..bcf5accd3 100644 --- a/src/video_core/texture_cache/tile_manager.h +++ b/src/video_core/texture_cache/tile_manager.h @@ -18,6 +18,7 @@ enum DetilerType : u32 { Micro32x2, Micro32x4, + Macro8x1, Macro32x1, Macro32x2, From 2951788afc1bb4b53c6d427ca56c598247fd6f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Fri, 3 Jan 2025 20:11:24 +0100 Subject: [PATCH 002/455] texture_cache: Adding some missing textures (#2031) --- src/video_core/texture_cache/tile_manager.cpp | 71 +++++++++++-------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp index 0e550c7dc..6b14b4602 100644 --- a/src/video_core/texture_cache/tile_manager.cpp +++ b/src/video_core/texture_cache/tile_manager.cpp @@ -25,54 +25,69 @@ namespace VideoCore { static vk::Format DemoteImageFormatForDetiling(vk::Format format) { switch (format) { - case vk::Format::eR8Uint: case vk::Format::eR8Unorm: case vk::Format::eR8Snorm: + case vk::Format::eR8Uint: + case vk::Format::eR8Srgb: return vk::Format::eR8Uint; - case vk::Format::eR4G4B4A4UnormPack16: - case vk::Format::eB5G6R5UnormPack16: - case vk::Format::eR5G5B5A1UnormPack16: case vk::Format::eR8G8Unorm: - case vk::Format::eR16Sfloat: - case vk::Format::eR16Uint: + case vk::Format::eR8G8Snorm: + case vk::Format::eR8G8Uint: + case vk::Format::eR8G8Srgb: case vk::Format::eR16Unorm: + case vk::Format::eR16Snorm: + case vk::Format::eR16Uint: + case vk::Format::eR16Sfloat: case vk::Format::eD16Unorm: + case vk::Format::eR4G4B4A4UnormPack16: + case vk::Format::eR5G5B5A1UnormPack16: + case vk::Format::eB5G5R5A1UnormPack16: + case vk::Format::eB5G6R5UnormPack16: return vk::Format::eR8G8Uint; - case vk::Format::eR8G8B8A8Srgb: - case vk::Format::eB8G8R8A8Srgb: - case vk::Format::eB8G8R8A8Unorm: case vk::Format::eR8G8B8A8Unorm: case vk::Format::eR8G8B8A8Snorm: case vk::Format::eR8G8B8A8Uint: - case vk::Format::eR32Sfloat: - case vk::Format::eD32Sfloat: - case vk::Format::eR32Uint: - case vk::Format::eR16G16Sfloat: + case vk::Format::eR8G8B8A8Srgb: + case vk::Format::eB8G8R8A8Unorm: + case vk::Format::eB8G8R8A8Snorm: + case vk::Format::eB8G8R8A8Uint: + case vk::Format::eB8G8R8A8Srgb: case vk::Format::eR16G16Unorm: case vk::Format::eR16G16Snorm: - case vk::Format::eB10G11R11UfloatPack32: + case vk::Format::eR16G16Uint: + case vk::Format::eR16G16Sfloat: + case vk::Format::eR32Uint: + case vk::Format::eR32Sfloat: + case vk::Format::eD32Sfloat: case vk::Format::eA2B10G10R10UnormPack32: + case vk::Format::eA2B10G10R10SnormPack32: + case vk::Format::eA2B10G10R10UintPack32: + case vk::Format::eB10G11R11UfloatPack32: + case vk::Format::eE5B9G9R9UfloatPack32: return vk::Format::eR32Uint; - case vk::Format::eBc1RgbaSrgbBlock: - case vk::Format::eBc1RgbaUnormBlock: - case vk::Format::eBc4UnormBlock: - case vk::Format::eR32G32Sfloat: - case vk::Format::eR32G32Uint: case vk::Format::eR16G16B16A16Unorm: + case vk::Format::eR16G16B16A16Snorm: case vk::Format::eR16G16B16A16Uint: case vk::Format::eR16G16B16A16Sfloat: + case vk::Format::eR32G32Uint: + case vk::Format::eR32G32Sfloat: + case vk::Format::eBc1RgbaUnormBlock: + case vk::Format::eBc1RgbaSrgbBlock: + case vk::Format::eBc4UnormBlock: + case vk::Format::eBc4SnormBlock: return vk::Format::eR32G32Uint; - case vk::Format::eBc2SrgbBlock: - case vk::Format::eBc2UnormBlock: - case vk::Format::eBc3SrgbBlock: - case vk::Format::eBc3UnormBlock: - case vk::Format::eBc5UnormBlock: - case vk::Format::eBc5SnormBlock: - case vk::Format::eBc7SrgbBlock: - case vk::Format::eBc7UnormBlock: - case vk::Format::eBc6HUfloatBlock: case vk::Format::eR32G32B32A32Uint: case vk::Format::eR32G32B32A32Sfloat: + case vk::Format::eBc2UnormBlock: + case vk::Format::eBc2SrgbBlock: + case vk::Format::eBc3UnormBlock: + case vk::Format::eBc3SrgbBlock: + case vk::Format::eBc5UnormBlock: + case vk::Format::eBc5SnormBlock: + case vk::Format::eBc6HUfloatBlock: + case vk::Format::eBc6HSfloatBlock: + case vk::Format::eBc7UnormBlock: + case vk::Format::eBc7SrgbBlock: return vk::Format::eR32G32B32A32Uint; default: break; From 9434cae458ac3a8d815f753c7c522e40a9765acb Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 3 Jan 2025 12:22:27 -0800 Subject: [PATCH 003/455] gnmdriver: Implement neo mode differences. (#2011) * gnmdriver: Implement neo mode differences. * gnmdriver: Move init sequences to separate file. --- CMakeLists.txt | 1 + src/core/libraries/gnmdriver/gnmdriver.cpp | 430 +++++--------- src/core/libraries/gnmdriver/gnmdriver_init.h | 542 ++++++++++++++++++ src/video_core/amdgpu/pm4_cmds.h | 5 + 4 files changed, 696 insertions(+), 282 deletions(-) create mode 100644 src/core/libraries/gnmdriver/gnmdriver_init.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c0f675266..36ebbf583 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,6 +209,7 @@ set(AUDIO_LIB src/core/libraries/audio/audioin.cpp set(GNM_LIB src/core/libraries/gnmdriver/gnmdriver.cpp src/core/libraries/gnmdriver/gnmdriver.h + src/core/libraries/gnmdriver/gnmdriver_init.h src/core/libraries/gnmdriver/gnm_error.h ) diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index 805c9124e..f93b3dbf0 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -12,6 +12,7 @@ #include "core/address_space.h" #include "core/debug_state.h" #include "core/libraries/gnmdriver/gnm_error.h" +#include "core/libraries/gnmdriver/gnmdriver_init.h" #include "core/libraries/kernel/orbis_error.h" #include "core/libraries/kernel/process.h" #include "core/libraries/libs.h" @@ -54,244 +55,11 @@ enum ShaderStages : u32 { static constexpr std::array indirect_sgpr_offsets{0u, 0u, 0x4cu, 0u, 0xccu, 0u, 0x14cu}; -static constexpr auto HwInitPacketSize = 0x100u; - -// clang-format off -static constexpr std::array InitSequence{ - // A fake preamble to mimic context reset sent by FW - 0xc0001200u, 0u, // IT_CLEAR_STATE - - // Actual init state sequence - 0xc0017600u, 0x216u, 0xffffffffu, - 0xc0017600u, 0x217u, 0xffffffffu, - 0xc0017600u, 0x215u, 0u, - 0xc0016900u, 0x2f9u, 0x2du, - 0xc0016900u, 0x282u, 8u, - 0xc0016900u, 0x280u, 0x80008u, - 0xc0016900u, 0x281u, 0xffff0000u, - 0xc0016900u, 0x204u, 0u, - 0xc0016900u, 0x206u, 0x43fu, - 0xc0016900u, 0x83u, 0xffffu, - 0xc0016900u, 0x317u, 0x10u, - 0xc0016900u, 0x2fau, 0x3f800000u, - 0xc0016900u, 0x2fcu, 0x3f800000u, - 0xc0016900u, 0x2fbu, 0x3f800000u, - 0xc0016900u, 0x2fdu, 0x3f800000u, - 0xc0016900u, 0x202u, 0xcc0010u, - 0xc0016900u, 0x30eu, 0xffffffffu, - 0xc0016900u, 0x30fu, 0xffffffffu, - 0xc0002f00u, 1u, - 0xc0017600u, 7u, 0x1ffu, - 0xc0017600u, 0x46u, 0x1ffu, - 0xc0017600u, 0x87u, 0x1ffu, - 0xc0017600u, 0xc7u, 0x1ffu, - 0xc0017600u, 0x107u, 0u, - 0xc0017600u, 0x147u, 0x1ffu, - 0xc0016900u, 0x1b1u, 2u, - 0xc0016900u, 0x101u, 0u, - 0xc0016900u, 0x100u, 0xffffffffu, - 0xc0016900u, 0x103u, 0u, - 0xc0016900u, 0x284u, 0u, - 0xc0016900u, 0x290u, 0u, - 0xc0016900u, 0x2aeu, 0u, - 0xc0016900u, 0x292u, 0u, - 0xc0016900u, 0x293u, 0x6000000u, - 0xc0016900u, 0x2f8u, 0u, - 0xc0016900u, 0x2deu, 0x1e9u, - 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, - 0xc0017900u, 0x200u, 0xe0000000u, -}; -static_assert(InitSequence.size() == 0x73 + 2); - -static constexpr std::array InitSequence175{ - // A fake preamble to mimic context reset sent by FW - 0xc0001200u, 0u, // IT_CLEAR_STATE - - // Actual init state sequence - 0xc0017600u, 0x216u, 0xffffffffu, - 0xc0017600u, 0x217u, 0xffffffffu, - 0xc0017600u, 0x215u, 0u, - 0xc0016900u, 0x2f9u, 0x2du, - 0xc0016900u, 0x282u, 8u, - 0xc0016900u, 0x280u, 0x80008u, - 0xc0016900u, 0x281u, 0xffff0000u, - 0xc0016900u, 0x204u, 0u, - 0xc0016900u, 0x206u, 0x43fu, - 0xc0016900u, 0x83u, 0xffffu, - 0xc0016900u, 0x317u, 0x10u, - 0xc0016900u, 0x2fau, 0x3f800000u, - 0xc0016900u, 0x2fcu, 0x3f800000u, - 0xc0016900u, 0x2fbu, 0x3f800000u, - 0xc0016900u, 0x2fdu, 0x3f800000u, - 0xc0016900u, 0x202u, 0xcc0010u, - 0xc0016900u, 0x30eu, 0xffffffffu, - 0xc0016900u, 0x30fu, 0xffffffffu, - 0xc0002f00u, 1u, - 0xc0017600u, 7u, 0x1ffu, - 0xc0017600u, 0x46u, 0x1ffu, - 0xc0017600u, 0x87u, 0x1ffu, - 0xc0017600u, 0xc7u, 0x1ffu, - 0xc0017600u, 0x107u, 0u, - 0xc0017600u, 0x147u, 0x1ffu, - 0xc0016900u, 0x1b1u, 2u, - 0xc0016900u, 0x101u, 0u, - 0xc0016900u, 0x100u, 0xffffffffu, - 0xc0016900u, 0x103u, 0u, - 0xc0016900u, 0x284u, 0u, - 0xc0016900u, 0x290u, 0u, - 0xc0016900u, 0x2aeu, 0u, - 0xc0016900u, 0x292u, 0u, - 0xc0016900u, 0x293u, 0x6020000u, - 0xc0016900u, 0x2f8u, 0u, - 0xc0016900u, 0x2deu, 0x1e9u, - 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, - 0xc0017900u, 0x200u, 0xe0000000u, -}; -static_assert(InitSequence175.size() == 0x73 + 2); - -static constexpr std::array InitSequence200{ - // A fake preamble to mimic context reset sent by FW - 0xc0001200u, 0u, // IT_CLEAR_STATE - - // Actual init state sequence - 0xc0017600u, 0x216u, 0xffffffffu, - 0xc0017600u, 0x217u, 0xffffffffu, - 0xc0017600u, 0x215u, 0u, - 0xc0016900u, 0x2f9u, 0x2du, - 0xc0016900u, 0x282u, 8u, - 0xc0016900u, 0x280u, 0x80008u, - 0xc0016900u, 0x281u, 0xffff0000u, - 0xc0016900u, 0x204u, 0u, - 0xc0016900u, 0x206u, 0x43fu, - 0xc0016900u, 0x83u, 0xffffu, - 0xc0016900u, 0x317u, 0x10u, - 0xc0016900u, 0x2fau, 0x3f800000u, - 0xc0016900u, 0x2fcu, 0x3f800000u, - 0xc0016900u, 0x2fbu, 0x3f800000u, - 0xc0016900u, 0x2fdu, 0x3f800000u, - 0xc0016900u, 0x202u, 0xcc0010u, - 0xc0016900u, 0x30eu, 0xffffffffu, - 0xc0016900u, 0x30fu, 0xffffffffu, - 0xc0002f00u, 1u, - 0xc0017600u, 7u, 0x1701ffu, - 0xc0017600u, 0x46u, 0x1701fdu, - 0xc0017600u, 0x87u, 0x1701ffu, - 0xc0017600u, 0xc7u, 0x1701fdu, - 0xc0017600u, 0x107u, 0x17u, - 0xc0017600u, 0x147u, 0x1701fdu, - 0xc0017600u, 0x47u, 0x1cu, - 0xc0016900u, 0x1b1u, 2u, - 0xc0016900u, 0x101u, 0u, - 0xc0016900u, 0x100u, 0xffffffffu, - 0xc0016900u, 0x103u, 0u, - 0xc0016900u, 0x284u, 0u, - 0xc0016900u, 0x290u, 0u, - 0xc0016900u, 0x2aeu, 0u, - 0xc0016900u, 0x292u, 0u, - 0xc0016900u, 0x293u, 0x6020000u, - 0xc0016900u, 0x2f8u, 0u, - 0xc0016900u, 0x2deu, 0x1e9u, - 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, - 0xc0017900u, 0x200u, 0xe0000000u, -}; -static_assert(InitSequence200.size() == 0x76 + 2); - -static constexpr std::array InitSequence350{ - // A fake preamble to mimic context reset sent by FW - 0xc0001200u, 0u, // IT_CLEAR_STATE - - // Actual init state sequence - 0xc0017600u, 0x216u, 0xffffffffu, - 0xc0017600u, 0x217u, 0xffffffffu, - 0xc0017600u, 0x215u, 0u, - 0xc0016900u, 0x2f9u, 0x2du, - 0xc0016900u, 0x282u, 8u, - 0xc0016900u, 0x280u, 0x80008u, - 0xc0016900u, 0x281u, 0xffff0000u, - 0xc0016900u, 0x204u, 0u, - 0xc0016900u, 0x206u, 0x43fu, - 0xc0016900u, 0x83u, 0xffffu, - 0xc0016900u, 0x317u, 0x10u, - 0xc0016900u, 0x2fau, 0x3f800000u, - 0xc0016900u, 0x2fcu, 0x3f800000u, - 0xc0016900u, 0x2fbu, 0x3f800000u, - 0xc0016900u, 0x2fdu, 0x3f800000u, - 0xc0016900u, 0x202u, 0xcc0010u, - 0xc0016900u, 0x30eu, 0xffffffffu, - 0xc0016900u, 0x30fu, 0xffffffffu, - 0xc0002f00u, 1u, - 0xc0017600u, 7u, 0x1701ffu, - 0xc0017600u, 0x46u, 0x1701fdu, - 0xc0017600u, 0x87u, 0x1701ffu, - 0xc0017600u, 0xc7u, 0x1701fdu, - 0xc0017600u, 0x107u, 0x17u, - 0xc0017600u, 0x147u, 0x1701fdu, - 0xc0017600u, 0x47u, 0x1cu, - 0xc0016900u, 0x1b1u, 2u, - 0xc0016900u, 0x101u, 0u, - 0xc0016900u, 0x100u, 0xffffffffu, - 0xc0016900u, 0x103u, 0u, - 0xc0016900u, 0x284u, 0u, - 0xc0016900u, 0x290u, 0u, - 0xc0016900u, 0x2aeu, 0u, - 0xc0016900u, 0x102u, 0u, - 0xc0016900u, 0x292u, 0u, - 0xc0016900u, 0x293u, 0x6020000u, - 0xc0016900u, 0x2f8u, 0u, - 0xc0016900u, 0x2deu, 0x1e9u, - 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, - 0xc0017900u, 0x200u, 0xe0000000u, - 0xc0016900u, 0x2aau, 0xffu, -}; -static_assert(InitSequence350.size() == 0x7c + 2); - -static constexpr std::array CtxInitSequence{ - 0xc0012800u, 0x80000000u, 0x80000000u, - 0xc0001200u, 0u, - 0xc0002f00u, 1u, - 0xc0016900u, 0x102u, 0u, - 0xc0016900u, 0x202u, 0xcc0010u, - 0xc0111000u, 0u -}; -static_assert(CtxInitSequence.size() == 0x0f); - -static constexpr std::array CtxInitSequence400{ - 0xc0012800u, 0x80000000u, 0x80000000u, - 0xc0001200u, 0u, - 0xc0016900u, 0x2f9u, 0x2du, - 0xc0016900u, 0x282u, 8u, - 0xc0016900u, 0x280u, 0x80008u, - 0xc0016900u, 0x281u, 0xffff0000u, - 0xc0016900u, 0x204u, 0u, - 0xc0016900u, 0x206u, 0x43fu, - 0xc0016900u, 0x83u, 0xffffu, - 0xc0016900u, 0x317u, 0x10u, - 0xc0016900u, 0x2fau, 0x3f800000u, - 0xc0016900u, 0x2fcu, 0x3f800000u, - 0xc0016900u, 0x2fbu, 0x3f800000u, - 0xc0016900u, 0x2fdu, 0x3f800000u, - 0xc0016900u, 0x202u, 0xcc0010u, - 0xc0016900u, 0x30eu, 0xffffffffu, - 0xc0016900u, 0x30fu, 0xffffffffu, - 0xc0002f00u, 1u, - 0xc0016900u, 0x1b1u, 2u, - 0xc0016900u, 0x101u, 0u, - 0xc0016900u, 0x100u, 0xffffffffu, - 0xc0016900u, 0x103u, 0u, - 0xc0016900u, 0x284u, 0u, - 0xc0016900u, 0x290u, 0u, - 0xc0016900u, 0x2aeu, 0u, - 0xc0016900u, 0x102u, 0u, - 0xc0016900u, 0x292u, 0u, - 0xc0016900u, 0x293u, 0x6020000u, - 0xc0016900u, 0x2f8u, 0u, - 0xc0016900u, 0x2deu, 0x1e9u, - 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, - 0xc0016900u, 0x2aau, 0xffu, - 0xc09e1000u, -}; -static_assert(CtxInitSequence400.size() == 0x61); -// clang-format on +// Gates use of what appear to be the neo-mode init sequences but with the older +// IA_MULTI_VGT_PARAM register address. No idea what this is for as the ioctl +// that controls it is still a mystery, but leaving the sequences in gated behind +// this flag in case we need it in the future. +static constexpr bool UseNeoCompatSequences = false; // In case if `submitDone` is issued we need to block submissions until GPU idle static u32 submission_lock{}; @@ -317,6 +85,14 @@ static void WaitGpuIdle() { cv_lock.wait(lock, [] { return submission_lock == 0; }); } +// Write a special ending NOP packet with N DWs data block +static inline u32* WriteTrailingNop(u32* cmdbuf, u32 data_block_size) { + auto* nop = reinterpret_cast(cmdbuf); + nop->header = PM4Type3Header{PM4ItOpcode::Nop, data_block_size - 1}; + nop->data_block[0] = 0u; // only one out of `data_block_size` is initialized + return cmdbuf + data_block_size + 1 /* header */; +} + // Write a special ending NOP packet with N DWs data block template static inline u32* WriteTrailingNop(u32* cmdbuf) { @@ -619,17 +395,30 @@ u32 PS4_SYSV_ABI sceGnmDispatchInitDefaultHardwareState(u32* cmdbuf, u32 size) { return 0; } - cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 0x216u, - 0xffffffffu); // COMPUTE_STATIC_THREAD_MGMT_SE0 - cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 0x217u, - 0xffffffffu); // COMPUTE_STATIC_THREAD_MGMT_SE1 - cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 0x215u, 0x170u); // COMPUTE_RESOURCE_LIMITS + cmdbuf = PM4CmdSetData::SetShReg( + cmdbuf, 0x216u, + 0xffffffffu); // COMPUTE_STATIC_THREAD_MGMT_SE0 + cmdbuf = PM4CmdSetData::SetShReg( + cmdbuf, 0x217u, + 0xffffffffu); // COMPUTE_STATIC_THREAD_MGMT_SE1 + + if (sceKernelIsNeoMode()) { + cmdbuf = PM4CmdSetData::SetShReg( + cmdbuf, 0x219u, + 0xffffffffu); // COMPUTE_STATIC_THREAD_MGMT_SE2 + cmdbuf = PM4CmdSetData::SetShReg( + cmdbuf, 0x21au, + 0xffffffffu); // COMPUTE_STATIC_THREAD_MGMT_SE3 + } + + cmdbuf = PM4CmdSetData::SetShReg( + cmdbuf, 0x215u, 0x170u); // COMPUTE_RESOURCE_LIMITS cmdbuf = WriteHeader(cmdbuf, 6); - cmdbuf = WriteBody(cmdbuf, 0x28000000u, 0u, 0u, 0u, 0u, 0u); + cmdbuf = WriteBody(cmdbuf, 0x28000000u, 0u, 0u, 0u, 0u, 0xau); - cmdbuf = WriteHeader(cmdbuf, 0xef); - cmdbuf = WriteBody(cmdbuf, 0xau, 0u); + cmdbuf = WriteHeader(cmdbuf, sceKernelIsNeoMode() ? 0xe9 : 0xef); + cmdbuf = WriteBody(cmdbuf, 0u); return HwInitPacketSize; } @@ -646,7 +435,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndex(u32* cmdbuf, u32 size, u32 index_count, uintptr draw_index->index_base_lo = u32(index_addr); draw_index->index_base_hi = u32(index_addr >> 32); draw_index->index_count = index_count; - draw_index->draw_initiator = 0; + draw_index->draw_initiator = sceKernelIsNeoMode() ? flags & 0xe0000000u : 0; WriteTrailingNop<3>(cmdbuf + 6); return ORBIS_OK; @@ -659,8 +448,9 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexAuto(u32* cmdbuf, u32 size, u32 index_count, u32 if (cmdbuf && (size == 7) && (flags & 0x1ffffffe) == 0) { // no predication will be set in the packet - cmdbuf = WritePacket(cmdbuf, PM4ShaderType::ShaderGraphics, - index_count, 2u); + cmdbuf = WritePacket( + cmdbuf, PM4ShaderType::ShaderGraphics, index_count, + sceKernelIsNeoMode() ? flags & 0xe0000000u | 2u : 2u); WriteTrailingNop<3>(cmdbuf); return ORBIS_OK; } @@ -684,7 +474,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexIndirect(u32* cmdbuf, u32 size, u32 data_offset, cmdbuf[0] = data_offset; cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[2] = instance_sgpr_offset == 0 ? 0 : (instance_sgpr_offset & 0xffffu) + sgpr_offset; - cmdbuf[3] = 0; + cmdbuf[3] = sceKernelIsNeoMode() ? flags & 0xe0000000u : 0u; cmdbuf += 4; WriteTrailingNop<3>(cmdbuf); @@ -699,8 +489,9 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexIndirectCountMulti(u32* cmdbuf, u32 size, u32 da u32 flags) { LOG_TRACE(Lib_GnmDriver, "called"); - if (cmdbuf && (size == 16) && (shader_stage < ShaderStages::Max) && - (vertex_sgpr_offset < 0x10u) && (instance_sgpr_offset < 0x10u)) { + if ((!sceKernelIsNeoMode() || !UseNeoCompatSequences) && !cmdbuf && (size == 16) && + (shader_stage < ShaderStages::Max) && (vertex_sgpr_offset < 0x10u) && + (instance_sgpr_offset < 0x10u)) { cmdbuf = WriteHeader(cmdbuf, 2); cmdbuf = WriteBody(cmdbuf, 0u); @@ -719,7 +510,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexIndirectCountMulti(u32* cmdbuf, u32 size, u32 da cmdbuf[4] = max_count; *(u64*)(&cmdbuf[5]) = count_addr; cmdbuf[7] = sizeof(DrawIndexedIndirectArgs); - cmdbuf[8] = 0; + cmdbuf[8] = sceKernelIsNeoMode() ? flags & 0xe0000000u : 0; cmdbuf += 9; WriteTrailingNop<2>(cmdbuf); @@ -748,7 +539,8 @@ s32 PS4_SYSV_ABI sceGnmDrawIndexOffset(u32* cmdbuf, u32 size, u32 index_offset, const auto predicate = flags & 1 ? PM4Predicate::PredEnable : PM4Predicate::PredDisable; cmdbuf = WriteHeader( cmdbuf, 4, PM4ShaderType::ShaderGraphics, predicate); - cmdbuf = WriteBody(cmdbuf, index_count, index_offset, index_count, 0u); + cmdbuf = WriteBody(cmdbuf, index_count, index_offset, index_count, + sceKernelIsNeoMode() ? flags & 0xe0000000u : 0u); WriteTrailingNop<3>(cmdbuf); return ORBIS_OK; @@ -772,7 +564,7 @@ s32 PS4_SYSV_ABI sceGnmDrawIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 cmdbuf[0] = data_offset; cmdbuf[1] = vertex_sgpr_offset == 0 ? 0 : (vertex_sgpr_offset & 0xffffu) + sgpr_offset; cmdbuf[2] = instance_sgpr_offset == 0 ? 0 : (instance_sgpr_offset & 0xffffu) + sgpr_offset; - cmdbuf[3] = 2; // auto index + cmdbuf[3] = sceKernelIsNeoMode() ? flags & 0xe0000000u | 2u : 2u; // auto index cmdbuf += 4; WriteTrailingNop<3>(cmdbuf); @@ -801,6 +593,7 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size) { } const auto& SetupContext = [](u32* cmdbuf, u32 size, bool clear_state) { + const auto* cmdbuf_end = cmdbuf + HwInitPacketSize; if (clear_state) { cmdbuf = ClearContextState(cmdbuf); } @@ -808,10 +601,8 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState(u32* cmdbuf, u32 size) { std::memcpy(cmdbuf, &InitSequence[2], (InitSequence.size() - 2) * 4); cmdbuf += InitSequence.size() - 2; - const auto cmdbuf_left = - HwInitPacketSize - (InitSequence.size() - 2) - (clear_state ? 0xc : 0) - 1; - cmdbuf = WriteHeader(cmdbuf, cmdbuf_left); - cmdbuf = WriteBody(cmdbuf, 0u); + const auto cmdbuf_left = cmdbuf_end - cmdbuf - 1; + WriteTrailingNop(cmdbuf, cmdbuf_left); return HwInitPacketSize; }; @@ -826,12 +617,13 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState175(u32* cmdbuf, u32 size) { return 0; } + const auto* cmdbuf_end = cmdbuf + HwInitPacketSize; cmdbuf = ClearContextState(cmdbuf); std::memcpy(cmdbuf, &InitSequence175[2], (InitSequence175.size() - 2) * 4); cmdbuf += InitSequence175.size() - 2; - constexpr auto cmdbuf_left = HwInitPacketSize - (InitSequence175.size() - 2) - 0xc - 1; - WriteTrailingNop(cmdbuf); + const auto cmdbuf_left = cmdbuf_end - cmdbuf - 1; + WriteTrailingNop(cmdbuf, cmdbuf_left); return HwInitPacketSize; } @@ -844,17 +636,27 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState200(u32* cmdbuf, u32 size) { } const auto& SetupContext200 = [](u32* cmdbuf, u32 size, bool clear_state) { + const auto* cmdbuf_end = cmdbuf + HwInitPacketSize; if (clear_state) { cmdbuf = ClearContextState(cmdbuf); } - std::memcpy(cmdbuf, &InitSequence200[2], (InitSequence200.size() - 2) * 4); - cmdbuf += InitSequence200.size() - 2; + if (sceKernelIsNeoMode()) { + if (!UseNeoCompatSequences) { + std::memcpy(cmdbuf, &InitSequence200Neo[2], (InitSequence200Neo.size() - 2) * 4); + cmdbuf += InitSequence200Neo.size() - 2; + } else { + std::memcpy(cmdbuf, &InitSequence200NeoCompat[2], + (InitSequence200NeoCompat.size() - 2) * 4); + cmdbuf += InitSequence200NeoCompat.size() - 2; + } + } else { + std::memcpy(cmdbuf, &InitSequence200[2], (InitSequence200.size() - 2) * 4); + cmdbuf += InitSequence200.size() - 2; + } - const auto cmdbuf_left = - HwInitPacketSize - (InitSequence200.size() - 2) - (clear_state ? 0xc : 0) - 1; - cmdbuf = WriteHeader(cmdbuf, cmdbuf_left); - cmdbuf = WriteBody(cmdbuf, 0u); + const auto cmdbuf_left = cmdbuf_end - cmdbuf - 1; + WriteTrailingNop(cmdbuf, cmdbuf_left); return HwInitPacketSize; }; @@ -870,17 +672,27 @@ u32 PS4_SYSV_ABI sceGnmDrawInitDefaultHardwareState350(u32* cmdbuf, u32 size) { } const auto& SetupContext350 = [](u32* cmdbuf, u32 size, bool clear_state) { + const auto* cmdbuf_end = cmdbuf + HwInitPacketSize; if (clear_state) { cmdbuf = ClearContextState(cmdbuf); } - std::memcpy(cmdbuf, &InitSequence350[2], (InitSequence350.size() - 2) * 4); - cmdbuf += InitSequence350.size() - 2; + if (sceKernelIsNeoMode()) { + if (!UseNeoCompatSequences) { + std::memcpy(cmdbuf, &InitSequence350Neo[2], (InitSequence350Neo.size() - 2) * 4); + cmdbuf += InitSequence350Neo.size() - 2; + } else { + std::memcpy(cmdbuf, &InitSequence350NeoCompat[2], + (InitSequence350NeoCompat.size() - 2) * 4); + cmdbuf += InitSequence350NeoCompat.size() - 2; + } + } else { + std::memcpy(cmdbuf, &InitSequence350[2], (InitSequence350.size() - 2) * 4); + cmdbuf += InitSequence350.size() - 2; + } - const auto cmdbuf_left = - HwInitPacketSize - (InitSequence350.size() - 2) - (clear_state ? 0xc : 0) - 1; - cmdbuf = WriteHeader(cmdbuf, cmdbuf_left); - cmdbuf = WriteBody(cmdbuf, 0u); + const auto cmdbuf_left = cmdbuf_end - cmdbuf - 1; + WriteTrailingNop(cmdbuf, cmdbuf_left); return HwInitPacketSize; }; @@ -896,7 +708,11 @@ u32 PS4_SYSV_ABI sceGnmDrawInitToDefaultContextState(u32* cmdbuf, u32 size) { return 0; } - std::memcpy(cmdbuf, CtxInitSequence.data(), CtxInitSequence.size() * 4); + if (sceKernelIsNeoMode()) { + std::memcpy(cmdbuf, CtxInitSequenceNeo.data(), CtxInitSequenceNeo.size() * 4); + } else { + std::memcpy(cmdbuf, CtxInitSequence.data(), CtxInitSequence.size() * 4); + } return CtxInitPacketSize; } @@ -908,7 +724,16 @@ u32 PS4_SYSV_ABI sceGnmDrawInitToDefaultContextState400(u32* cmdbuf, u32 size) { return 0; } - std::memcpy(cmdbuf, CtxInitSequence400.data(), CtxInitSequence400.size() * 4); + if (sceKernelIsNeoMode()) { + if (!UseNeoCompatSequences) { + std::memcpy(cmdbuf, CtxInitSequence400Neo.data(), CtxInitSequence400Neo.size() * 4); + } else { + std::memcpy(cmdbuf, CtxInitSequence400NeoCompat.data(), + CtxInitSequence400NeoCompat.size() * 4); + } + } else { + std::memcpy(cmdbuf, CtxInitSequence400.data(), CtxInitSequence400.size() * 4); + } return CtxInitPacketSize; } @@ -1030,7 +855,8 @@ int PS4_SYSV_ABI sceGnmGetGpuBlockStatus() { u32 PS4_SYSV_ABI sceGnmGetGpuCoreClockFrequency() { LOG_TRACE(Lib_GnmDriver, "called"); - return Config::isNeoMode() ? 911'000'000 : 800'000'000; + // On console this uses an ioctl check, but we assume it is equal to just checking for neo mode. + return sceKernelIsNeoMode() ? 911'000'000 : 800'000'000; } int PS4_SYSV_ABI sceGnmGetGpuInfoStatus() { @@ -1369,7 +1195,15 @@ s32 PS4_SYSV_ABI sceGnmResetVgtControl(u32* cmdbuf, u32 size) { if (cmdbuf == nullptr || size != 3) { return -1; } - PM4CmdSetData::SetContextReg(cmdbuf, 0x2aau, 0xffu); // IA_MULTI_VGT_PARAM + if (sceKernelIsNeoMode()) { + if (!UseNeoCompatSequences) { + PM4CmdSetData::SetUconfigReg(cmdbuf, 0x40000258u, 0x6d007fu); // IA_MULTI_VGT_PARAM + } else { + PM4CmdSetData::SetContextReg(cmdbuf, 0x100002aau, 0xd00ffu); // IA_MULTI_VGT_PARAM + } + } else { + PM4CmdSetData::SetContextReg(cmdbuf, 0x2aau, 0xffu); // IA_MULTI_VGT_PARAM + } return ORBIS_OK; } @@ -1830,9 +1664,25 @@ s32 PS4_SYSV_ABI sceGnmSetVgtControl(u32* cmdbuf, u32 size, u32 prim_group_sz_mi return -1; } - const u32 reg_value = - ((partial_vs_wave_mode & 1) << 0x10) | (prim_group_sz_minus_one & 0xffffu); - PM4CmdSetData::SetContextReg(cmdbuf, 0x2aau, reg_value); // IA_MULTI_VGT_PARAM + if (sceKernelIsNeoMode()) { + const u32 wd_switch_on_eop = u32(wd_switch_only_on_eop_mode != 0) << 0x14; + const u32 switch_on_eoi = u32(wd_switch_only_on_eop_mode == 0) << 0x13; + const u32 reg_value = + wd_switch_only_on_eop_mode != 0 + ? (partial_vs_wave_mode & 1) << 0x10 | prim_group_sz_minus_one | wd_switch_on_eop | + switch_on_eoi | 0x40000u + : prim_group_sz_minus_one & 0x1cffffu | wd_switch_on_eop | switch_on_eoi | 0x50000u; + if (!UseNeoCompatSequences) { + PM4CmdSetData::SetUconfigReg(cmdbuf, 0x40000258u, + reg_value | 0x600000u); // IA_MULTI_VGT_PARAM + } else { + PM4CmdSetData::SetContextReg(cmdbuf, 0x100002aau, reg_value); // IA_MULTI_VGT_PARAM + } + } else { + const u32 reg_value = + ((partial_vs_wave_mode & 1) << 0x10) | (prim_group_sz_minus_one & 0xffffu); + PM4CmdSetData::SetContextReg(cmdbuf, 0x2aau, reg_value); // IA_MULTI_VGT_PARAM + } return ORBIS_OK; } @@ -2215,9 +2065,25 @@ int PS4_SYSV_ABI sceGnmSubmitCommandBuffersForWorkload(u32 workload, u32 count, if (sdk_version <= 0x1ffffffu) { liverpool->SubmitGfx(InitSequence, {}); } else if (sdk_version <= 0x3ffffffu) { - liverpool->SubmitGfx(InitSequence200, {}); + if (sceKernelIsNeoMode()) { + if (!UseNeoCompatSequences) { + liverpool->SubmitGfx(InitSequence200Neo, {}); + } else { + liverpool->SubmitGfx(InitSequence200NeoCompat, {}); + } + } else { + liverpool->SubmitGfx(InitSequence200, {}); + } } else { - liverpool->SubmitGfx(InitSequence350, {}); + if (sceKernelIsNeoMode()) { + if (!UseNeoCompatSequences) { + liverpool->SubmitGfx(InitSequence350Neo, {}); + } else { + liverpool->SubmitGfx(InitSequence350NeoCompat, {}); + } + } else { + liverpool->SubmitGfx(InitSequence350, {}); + } } send_init_packet = false; } diff --git a/src/core/libraries/gnmdriver/gnmdriver_init.h b/src/core/libraries/gnmdriver/gnmdriver_init.h new file mode 100644 index 000000000..da6d65f32 --- /dev/null +++ b/src/core/libraries/gnmdriver/gnmdriver_init.h @@ -0,0 +1,542 @@ +// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +namespace Libraries::GnmDriver { + +constexpr auto HwInitPacketSize = 0x100u; + +// clang-format off +constexpr std::array InitSequence{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1ffu, + 0xc0017600u, 0x46u, 0x1ffu, + 0xc0017600u, 0x87u, 0x1ffu, + 0xc0017600u, 0xc7u, 0x1ffu, + 0xc0017600u, 0x107u, 0u, + 0xc0017600u, 0x147u, 0x1ffu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6000000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, +}; +static_assert(InitSequence.size() == 0x73 + 2); + +constexpr std::array InitSequence175{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1ffu, + 0xc0017600u, 0x46u, 0x1ffu, + 0xc0017600u, 0x87u, 0x1ffu, + 0xc0017600u, 0xc7u, 0x1ffu, + 0xc0017600u, 0x107u, 0u, + 0xc0017600u, 0x147u, 0x1ffu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, +}; +static_assert(InitSequence175.size() == 0x73 + 2); + +constexpr std::array InitSequence200{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1701ffu, + 0xc0017600u, 0x46u, 0x1701fdu, + 0xc0017600u, 0x87u, 0x1701ffu, + 0xc0017600u, 0xc7u, 0x1701fdu, + 0xc0017600u, 0x107u, 0x17u, + 0xc0017600u, 0x147u, 0x1701fdu, + 0xc0017600u, 0x47u, 0x1cu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, +}; +static_assert(InitSequence200.size() == 0x76 + 2); + +constexpr std::array InitSequence200Neo{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x219u, 0xffffffffu, + 0xc0017600u, 0x21au, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1701ffu, + 0xc0017600u, 0x46u, 0x1701fdu, + 0xc0017600u, 0x87u, 0x1701ffu, + 0xc0017600u, 0xc7u, 0x1701fdu, + 0xc0017600u, 0x107u, 0x17u, + 0xc0017600u, 0x147u, 0x1701fdu, + 0xc0017600u, 0x47u, 0x1cu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0026900u, 0xebu, 0xff00ff00u, 0xff00u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, + 0xc0017900u, 0x40000258u, 0x6d007fu, +}; +static_assert(InitSequence200Neo.size() == 0x83 + 2); + +constexpr std::array InitSequence200NeoCompat{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x219u, 0xffffffffu, + 0xc0017600u, 0x21au, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1701ffu, + 0xc0017600u, 0x46u, 0x1701fdu, + 0xc0017600u, 0x87u, 0x1701ffu, + 0xc0017600u, 0xc7u, 0x1701fdu, + 0xc0017600u, 0x107u, 0x17u, + 0xc0017600u, 0x147u, 0x1701fdu, + 0xc0017600u, 0x47u, 0x1cu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0026900u, 0xebu, 0xff00ff00u, 0xff00u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, + 0xc0016900u, 0x100002aau, 0xd00ffu, +}; +static_assert(InitSequence200NeoCompat.size() == 0x83 + 2); + +constexpr std::array InitSequence350{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1701ffu, + 0xc0017600u, 0x46u, 0x1701fdu, + 0xc0017600u, 0x87u, 0x1701ffu, + 0xc0017600u, 0xc7u, 0x1701fdu, + 0xc0017600u, 0x107u, 0x17u, + 0xc0017600u, 0x147u, 0x1701fdu, + 0xc0017600u, 0x47u, 0x1cu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, + 0xc0016900u, 0x2aau, 0xffu, +}; +static_assert(InitSequence350.size() == 0x7c + 2); + +constexpr std::array InitSequence350Neo{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x219u, 0xffffffffu, + 0xc0017600u, 0x21au, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1701ffu, + 0xc0017600u, 0x46u, 0x1701fdu, + 0xc0017600u, 0x87u, 0x1701ffu, + 0xc0017600u, 0xc7u, 0x1701fdu, + 0xc0017600u, 0x107u, 0x17u, + 0xc0017600u, 0x147u, 0x1701fdu, + 0xc0017600u, 0x47u, 0x1cu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0026900u, 0xebu, 0xff00ff00u, 0xff00u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, + 0xc0017900u, 0x40000258u, 0x6d007fu, +}; +static_assert(InitSequence350Neo.size() == 0x86 + 2); + +constexpr std::array InitSequence350NeoCompat{ + // A fake preamble to mimic context reset sent by FW + 0xc0001200u, 0u, // IT_CLEAR_STATE + + // Actual init state sequence + 0xc0017600u, 0x216u, 0xffffffffu, + 0xc0017600u, 0x217u, 0xffffffffu, + 0xc0017600u, 0x219u, 0xffffffffu, + 0xc0017600u, 0x21au, 0xffffffffu, + 0xc0017600u, 0x215u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0017600u, 7u, 0x1701ffu, + 0xc0017600u, 0x46u, 0x1701fdu, + 0xc0017600u, 0x87u, 0x1701ffu, + 0xc0017600u, 0xc7u, 0x1701fdu, + 0xc0017600u, 0x107u, 0x17u, + 0xc0017600u, 0x147u, 0x1701fdu, + 0xc0017600u, 0x47u, 0x1cu, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0026900u, 0xebu, 0xff00ff00u, 0xff00u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x200u, 0xe0000000u, + 0xc0016900u, 0x100002aau, 0xd00ffu, +}; +static_assert(InitSequence350NeoCompat.size() == 0x86 + 2); + +constexpr std::array CtxInitSequence{ + 0xc0012800u, 0x80000000u, 0x80000000u, + 0xc0001200u, 0u, + 0xc0002f00u, 1u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0111000u, 0u +}; +static_assert(CtxInitSequence.size() == 0x0f); + +constexpr std::array CtxInitSequenceNeo{ + 0xc0012800u, 0x80000000u, 0x80000000u, + 0xc0001200u, 0u, + 0xc0002f00u, 1u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0026900u, 0xebu, 0xff00ff00u, 0xff00u, + 0xc00d1000, 0u +}; +static_assert(CtxInitSequenceNeo.size() == 0x13); + +constexpr std::array CtxInitSequence400{ + 0xc0012800u, 0x80000000u, 0x80000000u, + 0xc0001200u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0016900u, 0x2aau, 0xffu, + 0xc09e1000u, +}; +static_assert(CtxInitSequence400.size() == 0x61); + +constexpr std::array CtxInitSequence400Neo{ + 0xc0012800u, 0x80000000u, 0x80000000u, + 0xc0001200u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0026900u, 0xebu, 0xff00ff00u, 0xff00u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0017900u, 0x40000258u, 0x6d007fu, + 0xc09a1000u, +}; +static_assert(CtxInitSequence400Neo.size() == 0x65); + +constexpr std::array CtxInitSequence400NeoCompat{ + 0xc0012800u, 0x80000000u, 0x80000000u, + 0xc0001200u, 0u, + 0xc0016900u, 0x2f9u, 0x2du, + 0xc0016900u, 0x282u, 8u, + 0xc0016900u, 0x280u, 0x80008u, + 0xc0016900u, 0x281u, 0xffff0000u, + 0xc0016900u, 0x204u, 0u, + 0xc0016900u, 0x206u, 0x43fu, + 0xc0016900u, 0x83u, 0xffffu, + 0xc0016900u, 0x317u, 0x10u, + 0xc0016900u, 0x2fau, 0x3f800000u, + 0xc0016900u, 0x2fcu, 0x3f800000u, + 0xc0016900u, 0x2fbu, 0x3f800000u, + 0xc0016900u, 0x2fdu, 0x3f800000u, + 0xc0016900u, 0x202u, 0xcc0010u, + 0xc0016900u, 0x30eu, 0xffffffffu, + 0xc0016900u, 0x30fu, 0xffffffffu, + 0xc0002f00u, 1u, + 0xc0016900u, 0x1b1u, 2u, + 0xc0016900u, 0x101u, 0u, + 0xc0016900u, 0x100u, 0xffffffffu, + 0xc0016900u, 0x103u, 0u, + 0xc0016900u, 0x284u, 0u, + 0xc0016900u, 0x290u, 0u, + 0xc0016900u, 0x2aeu, 0u, + 0xc0016900u, 0x102u, 0u, + 0xc0016900u, 0x292u, 0u, + 0xc0016900u, 0x293u, 0x6020000u, + 0xc0016900u, 0x2f8u, 0u, + 0xc0016900u, 0x2deu, 0x1e9u, + 0xc0026900u, 0xebu, 0xff00ff00u, 0xff00u, + 0xc0036900u, 0x295u, 0x100u, 0x100u, 4u, + 0xc0016900u, 0x100002aau, 0xd00ffu, + 0xc09a1000u, +}; +static_assert(CtxInitSequence400Neo.size() == 0x65); +// clang-format on + +} // namespace Libraries::GnmDriver diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index 238e09fad..e7d6b29e5 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -204,6 +204,11 @@ struct PM4CmdSetData { static constexpr u32* SetShReg(u32* cmdbuf, Args... data) { return WritePacket(cmdbuf, type, data...); } + + template + static constexpr u32* SetUconfigReg(u32* cmdbuf, Args... data) { + return WritePacket(cmdbuf, type, data...); + } }; struct PM4CmdNop { From c2be12f009ca3970c713b22fb328a5ae62e9239f Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 3 Jan 2025 12:25:20 -0800 Subject: [PATCH 004/455] amdgpu: Add some resource bits for Neo mode. (#2035) --- src/video_core/amdgpu/liverpool.h | 4 +++- src/video_core/amdgpu/resource.h | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index d2d1aab3c..85ea4a75c 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -814,7 +814,9 @@ struct Liverpool { BitField<26, 1, u32> fmask_compression_disable_ci; BitField<27, 1, u32> fmask_compress_1frag_only; BitField<28, 1, u32> dcc_enable; - BitField<29, 1, u32> cmask_addr_type; + BitField<29, 2, u32> cmask_addr_type; + /// Neo-mode only + BitField<31, 1, u32> alt_tile_mode; u32 u32all; } info; diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 208f7f380..1d9673850 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -263,7 +263,15 @@ struct Image { u64 min_lod_warn : 12; u64 counter_bank_id : 8; u64 lod_hw_cnt_en : 1; - u64 : 43; + /// Neo-mode only + u64 compression_en : 1; + /// Neo-mode only + u64 alpha_is_on_msb : 1; + /// Neo-mode only + u64 color_transform : 1; + /// Neo-mode only + u64 alt_tile_mode : 1; + u64 : 39; static constexpr Image Null() { Image image{}; From 8e8671323accda5df5d3ee3c1908751283c1da5e Mon Sep 17 00:00:00 2001 From: psucien <168137814+psucien@users.noreply.github.com> Date: Fri, 3 Jan 2025 21:42:23 +0100 Subject: [PATCH 005/455] texture_cache: slight detilers refactoring (#2036) --- src/video_core/buffer_cache/buffer_cache.cpp | 2 +- src/video_core/host_shaders/CMakeLists.txt | 16 +- .../macro_32bpp.comp} | 0 .../macro_64bpp.comp} | 0 .../macro_8bpp.comp} | 0 .../micro_128bpp.comp} | 0 .../micro_16bpp.comp} | 0 .../micro_32bpp.comp} | 0 .../micro_64bpp.comp} | 0 .../micro_8bpp.comp} | 0 .../renderer_vulkan/vk_presenter.cpp | 2 +- src/video_core/texture_cache/image.cpp | 2 +- src/video_core/texture_cache/image.h | 2 +- src/video_core/texture_cache/image_info.cpp | 28 ++-- src/video_core/texture_cache/image_info.h | 2 +- .../texture_cache/texture_cache.cpp | 34 ++-- src/video_core/texture_cache/tile_manager.cpp | 147 ++++-------------- src/video_core/texture_cache/tile_manager.h | 16 +- 18 files changed, 87 insertions(+), 164 deletions(-) rename src/video_core/host_shaders/{detile_macro32x1.comp => detilers/macro_32bpp.comp} (100%) rename src/video_core/host_shaders/{detile_macro32x2.comp => detilers/macro_64bpp.comp} (100%) rename src/video_core/host_shaders/{detile_macro8x1.comp => detilers/macro_8bpp.comp} (100%) rename src/video_core/host_shaders/{detile_m32x4.comp => detilers/micro_128bpp.comp} (100%) rename src/video_core/host_shaders/{detile_m8x2.comp => detilers/micro_16bpp.comp} (100%) rename src/video_core/host_shaders/{detile_m32x1.comp => detilers/micro_32bpp.comp} (100%) rename src/video_core/host_shaders/{detile_m32x2.comp => detilers/micro_64bpp.comp} (100%) rename src/video_core/host_shaders/{detile_m8x1.comp => detilers/micro_8bpp.comp} (100%) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 3e43b4fbc..322a9dd4e 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -660,7 +660,7 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, FindFlags::NoCreate | FindFlags::RelaxDim | FindFlags::RelaxFmt | FindFlags::RelaxSize; TextureCache::BaseDesc desc{}; desc.info.guest_address = device_addr; - desc.info.guest_size_bytes = size; + desc.info.guest_size = size; const ImageId image_id = texture_cache.FindImage(desc, find_flags); if (!image_id) { return false; diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index 44761545d..a9c2964ad 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -2,14 +2,14 @@ # SPDX-License-Identifier: GPL-2.0-or-later set(SHADER_FILES - detile_m8x1.comp - detile_m8x2.comp - detile_m32x1.comp - detile_m32x2.comp - detile_m32x4.comp - detile_macro8x1.comp - detile_macro32x1.comp - detile_macro32x2.comp + detilers/macro_32bpp.comp + detilers/macro_64bpp.comp + detilers/macro_8bpp.comp + detilers/micro_128bpp.comp + detilers/micro_16bpp.comp + detilers/micro_32bpp.comp + detilers/micro_64bpp.comp + detilers/micro_8bpp.comp fs_tri.vert post_process.frag ) diff --git a/src/video_core/host_shaders/detile_macro32x1.comp b/src/video_core/host_shaders/detilers/macro_32bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_macro32x1.comp rename to src/video_core/host_shaders/detilers/macro_32bpp.comp diff --git a/src/video_core/host_shaders/detile_macro32x2.comp b/src/video_core/host_shaders/detilers/macro_64bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_macro32x2.comp rename to src/video_core/host_shaders/detilers/macro_64bpp.comp diff --git a/src/video_core/host_shaders/detile_macro8x1.comp b/src/video_core/host_shaders/detilers/macro_8bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_macro8x1.comp rename to src/video_core/host_shaders/detilers/macro_8bpp.comp diff --git a/src/video_core/host_shaders/detile_m32x4.comp b/src/video_core/host_shaders/detilers/micro_128bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_m32x4.comp rename to src/video_core/host_shaders/detilers/micro_128bpp.comp diff --git a/src/video_core/host_shaders/detile_m8x2.comp b/src/video_core/host_shaders/detilers/micro_16bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_m8x2.comp rename to src/video_core/host_shaders/detilers/micro_16bpp.comp diff --git a/src/video_core/host_shaders/detile_m32x1.comp b/src/video_core/host_shaders/detilers/micro_32bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_m32x1.comp rename to src/video_core/host_shaders/detilers/micro_32bpp.comp diff --git a/src/video_core/host_shaders/detile_m32x2.comp b/src/video_core/host_shaders/detilers/micro_64bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_m32x2.comp rename to src/video_core/host_shaders/detilers/micro_64bpp.comp diff --git a/src/video_core/host_shaders/detile_m8x1.comp b/src/video_core/host_shaders/detilers/micro_8bpp.comp similarity index 100% rename from src/video_core/host_shaders/detile_m8x1.comp rename to src/video_core/host_shaders/detilers/micro_8bpp.comp diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 93129842f..1679aa691 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -427,7 +427,7 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { VideoCore::Extent3D{splash->GetImageInfo().width, splash->GetImageInfo().height, 1}; info.pitch = splash->GetImageInfo().width; info.guest_address = VAddr(splash->GetImageData().data()); - info.guest_size_bytes = splash->GetImageData().size(); + info.guest_size = splash->GetImageData().size(); info.mips_layout.emplace_back(splash->GetImageData().size(), splash->GetImageInfo().width, splash->GetImageInfo().height, 0); diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp index 03339d280..23249bf21 100644 --- a/src/video_core/texture_cache/image.cpp +++ b/src/video_core/texture_cache/image.cpp @@ -210,7 +210,7 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, Vulkan::SetObjectName(instance->GetDevice(), (vk::Image)image, "Image {}x{}x{} {:#x}:{:#x}", info.size.width, info.size.height, info.size.depth, info.guest_address, - info.guest_size_bytes); + info.guest_size); } boost::container::small_vector Image::GetBarriers( diff --git a/src/video_core/texture_cache/image.h b/src/video_core/texture_cache/image.h index 473dd731e..b04fd188c 100644 --- a/src/video_core/texture_cache/image.h +++ b/src/video_core/texture_cache/image.h @@ -80,7 +80,7 @@ struct Image { [[nodiscard]] bool Overlaps(VAddr overlap_cpu_addr, size_t overlap_size) const noexcept { const VAddr overlap_end = overlap_cpu_addr + overlap_size; const auto image_addr = info.guest_address; - const auto image_end = info.guest_address + info.guest_size_bytes; + const auto image_end = info.guest_address + info.guest_size; return image_addr < overlap_end && overlap_cpu_addr < image_end; } diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index adc72c21f..8ea9267fd 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -250,15 +250,15 @@ ImageInfo::ImageInfo(const Libraries::VideoOut::BufferAttributeGroup& group, guest_address = cpu_address; if (!props.is_tiled) { - guest_size_bytes = pitch * size.height * 4; + guest_size = pitch * size.height * 4; } else { if (Config::isNeoMode()) { - guest_size_bytes = pitch * ((size.height + 127) & (~127)) * 4; + guest_size = pitch * ((size.height + 127) & (~127)) * 4; } else { - guest_size_bytes = pitch * ((size.height + 63) & (~63)) * 4; + guest_size = pitch * ((size.height + 63) & (~63)) * 4; } } - mips_layout.emplace_back(guest_size_bytes, pitch, 0); + mips_layout.emplace_back(guest_size, pitch, 0); } ImageInfo::ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer, @@ -279,7 +279,7 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer, guest_address = buffer.Address(); const auto color_slice_sz = buffer.GetColorSliceSize(); - guest_size_bytes = color_slice_sz * buffer.NumSlices(); + guest_size = color_slice_sz * buffer.NumSlices(); mips_layout.emplace_back(color_slice_sz, pitch, 0); tiling_idx = static_cast(buffer.attrib.tile_mode_index.Value()); } @@ -303,7 +303,7 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slice guest_address = buffer.Address(); const auto depth_slice_sz = buffer.GetDepthSliceSize(); - guest_size_bytes = depth_slice_sz * num_slices; + guest_size = depth_slice_sz * num_slices; mips_layout.emplace_back(depth_slice_sz, pitch, 0); } @@ -339,7 +339,7 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& de void ImageInfo::UpdateSize() { mips_layout.clear(); MipInfo mip_info{}; - guest_size_bytes = 0; + guest_size = 0; for (auto mip = 0u; mip < resources.levels; ++mip) { auto bpp = num_bits; auto mip_w = pitch >> mip; @@ -392,11 +392,11 @@ void ImageInfo::UpdateSize() { } } mip_info.size *= mip_d; - mip_info.offset = guest_size_bytes; + mip_info.offset = guest_size; mips_layout.emplace_back(mip_info); - guest_size_bytes += mip_info.size; + guest_size += mip_info.size; } - guest_size_bytes *= resources.layers; + guest_size *= resources.layers; } int ImageInfo::IsMipOf(const ImageInfo& info) const { @@ -468,18 +468,18 @@ int ImageInfo::IsSliceOf(const ImageInfo& info) const { } // Check for size alignment. - const bool slice_size = info.guest_size_bytes / info.resources.layers; - if (guest_size_bytes % slice_size != 0) { + const bool slice_size = info.guest_size / info.resources.layers; + if (guest_size % slice_size != 0) { return -1; } // Ensure that address is aligned too. const auto addr_diff = guest_address - info.guest_address; - if ((addr_diff % guest_size_bytes) != 0) { + if ((addr_diff % guest_size) != 0) { return -1; } - return addr_diff / guest_size_bytes; + return addr_diff / guest_size; } } // namespace VideoCore diff --git a/src/video_core/texture_cache/image_info.h b/src/video_core/texture_cache/image_info.h index a657310a8..74f6c5674 100644 --- a/src/video_core/texture_cache/image_info.h +++ b/src/video_core/texture_cache/image_info.h @@ -84,7 +84,7 @@ struct ImageInfo { }; boost::container::small_vector mips_layout; VAddr guest_address{0}; - u32 guest_size_bytes{0}; + u32 guest_size{0}; u32 tiling_idx{0}; // TODO: merge with existing! VAddr stencil_addr{0}; diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 291e1da7c..bef083d1a 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -3,7 +3,9 @@ #include #include + #include "common/assert.h" +#include "common/debug.h" #include "video_core/buffer_cache/buffer_cache.h" #include "video_core/page_manager.h" #include "video_core/renderer_vulkan/vk_instance.h" @@ -34,7 +36,7 @@ TextureCache::TextureCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& Vulkan::SetObjectName(instance.GetDevice(), null_image, "Null Image"); img.flags = ImageFlagBits::Empty; img.track_addr = img.info.guest_address; - img.track_addr_end = img.info.guest_address + img.info.guest_size_bytes; + img.track_addr_end = img.info.guest_address + img.info.guest_size; ImageViewInfo view_info; const auto null_view_id = @@ -50,7 +52,7 @@ void TextureCache::MarkAsMaybeDirty(ImageId image_id, Image& image) { if (image.hash == 0) { // Initialize hash const u8* addr = std::bit_cast(image.info.guest_address); - image.hash = XXH3_64bits(addr, image.info.guest_size_bytes); + image.hash = XXH3_64bits(addr, image.info.guest_size); } image.flags |= ImageFlagBits::MaybeCpuDirty; UntrackImage(image_id); @@ -63,7 +65,7 @@ void TextureCache::InvalidateMemory(VAddr addr, size_t size) { const auto pages_end = PageManager::GetNextPageAddr(addr + size - 1); ForEachImageInRegion(pages_start, pages_end - pages_start, [&](ImageId image_id, Image& image) { const auto image_begin = image.info.guest_address; - const auto image_end = image.info.guest_address + image.info.guest_size_bytes; + const auto image_end = image.info.guest_address + image.info.guest_size; if (image_begin < end && addr < image_end) { // Start or end of the modified region is in the image, or the image is entirely within // the modified region, so the image was definitely accessed by this page fault. @@ -201,7 +203,7 @@ std::tuple TextureCache::ResolveOverlap(const ImageInfo& imag } if (image_info.pixel_format != tex_cache_image.info.pixel_format || - image_info.guest_size_bytes <= tex_cache_image.info.guest_size_bytes) { + image_info.guest_size <= tex_cache_image.info.guest_size) { auto result_id = merged_image_id ? merged_image_id : cache_image_id; const auto& result_image = slot_images[result_id]; return { @@ -302,7 +304,7 @@ ImageId TextureCache::FindImage(BaseDesc& desc, FindFlags flags) { std::scoped_lock lock{mutex}; boost::container::small_vector image_ids; - ForEachImageInRegion(info.guest_address, info.guest_size_bytes, + ForEachImageInRegion(info.guest_address, info.guest_size, [&](ImageId image_id, Image& image) { image_ids.push_back(image_id); }); ImageId image_id{}; @@ -313,8 +315,7 @@ ImageId TextureCache::FindImage(BaseDesc& desc, FindFlags flags) { if (cache_image.info.guest_address != info.guest_address) { continue; } - if (False(flags & FindFlags::RelaxSize) && - cache_image.info.guest_size_bytes != info.guest_size_bytes) { + if (False(flags & FindFlags::RelaxSize) && cache_image.info.guest_size != info.guest_size) { continue; } if (False(flags & FindFlags::RelaxDim) && cache_image.info.size != info.size) { @@ -455,7 +456,7 @@ ImageView& TextureCache::FindDepthTarget(BaseDesc& desc) { if (!stencil_id) { ImageInfo info{}; info.guest_address = desc.info.stencil_addr; - info.guest_size_bytes = desc.info.stencil_size; + info.guest_size = desc.info.stencil_size; info.size = desc.info.size; stencil_id = slot_images.insert(instance, scheduler, info); RegisterImage(stencil_id); @@ -468,6 +469,9 @@ ImageView& TextureCache::FindDepthTarget(BaseDesc& desc) { } void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_scheduler /*= nullptr*/) { + RENDERER_TRACE; + TRACE_HINT(fmt::format("{:x}:{:x}", image.info.guest_address, image.info.guest_size)); + if (False(image.flags & ImageFlagBits::Dirty)) { return; } @@ -543,7 +547,7 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule const auto cmdbuf = sched_ptr->CommandBuffer(); const VAddr image_addr = image.info.guest_address; - const size_t image_size = image.info.guest_size_bytes; + const size_t image_size = image.info.guest_size; const auto [vk_buffer, buf_offset] = buffer_cache.ObtainViewBuffer(image_addr, image_size, is_gpu_dirty); @@ -612,7 +616,7 @@ void TextureCache::RegisterImage(ImageId image_id) { ASSERT_MSG(False(image.flags & ImageFlagBits::Registered), "Trying to register an already registered image"); image.flags |= ImageFlagBits::Registered; - ForEachPage(image.info.guest_address, image.info.guest_size_bytes, + ForEachPage(image.info.guest_address, image.info.guest_size, [this, image_id](u64 page) { page_table[page].push_back(image_id); }); } @@ -621,7 +625,7 @@ void TextureCache::UnregisterImage(ImageId image_id) { ASSERT_MSG(True(image.flags & ImageFlagBits::Registered), "Trying to unregister an already unregistered image"); image.flags &= ~ImageFlagBits::Registered; - ForEachPage(image.info.guest_address, image.info.guest_size_bytes, [this, image_id](u64 page) { + ForEachPage(image.info.guest_address, image.info.guest_size, [this, image_id](u64 page) { const auto page_it = page_table.find(page); if (page_it == nullptr) { UNREACHABLE_MSG("Unregistering unregistered page=0x{:x}", page << PageShift); @@ -640,7 +644,7 @@ void TextureCache::UnregisterImage(ImageId image_id) { void TextureCache::TrackImage(ImageId image_id) { auto& image = slot_images[image_id]; const auto image_begin = image.info.guest_address; - const auto image_end = image.info.guest_address + image.info.guest_size_bytes; + const auto image_end = image.info.guest_address + image.info.guest_size; if (image_begin == image.track_addr && image_end == image.track_addr_end) { return; } @@ -649,7 +653,7 @@ void TextureCache::TrackImage(ImageId image_id) { // Re-track the whole image image.track_addr = image_begin; image.track_addr_end = image_end; - tracker.UpdatePagesCachedCount(image_begin, image.info.guest_size_bytes, 1); + tracker.UpdatePagesCachedCount(image_begin, image.info.guest_size, 1); } else { if (image_begin < image.track_addr) { TrackImageHead(image_id); @@ -674,7 +678,7 @@ void TextureCache::TrackImageHead(ImageId image_id) { void TextureCache::TrackImageTail(ImageId image_id) { auto& image = slot_images[image_id]; - const auto image_end = image.info.guest_address + image.info.guest_size_bytes; + const auto image_end = image.info.guest_address + image.info.guest_size; if (image_end == image.track_addr_end) { return; } @@ -719,7 +723,7 @@ void TextureCache::UntrackImageHead(ImageId image_id) { void TextureCache::UntrackImageTail(ImageId image_id) { auto& image = slot_images[image_id]; - const auto image_end = image.info.guest_address + image.info.guest_size_bytes; + const auto image_end = image.info.guest_address + image.info.guest_size; if (!image.IsTracked() || image.track_addr_end < image_end) { return; } diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp index 6b14b4602..aba255ce5 100644 --- a/src/video_core/texture_cache/tile_manager.cpp +++ b/src/video_core/texture_cache/tile_manager.cpp @@ -8,128 +8,47 @@ #include "video_core/texture_cache/image_view.h" #include "video_core/texture_cache/tile_manager.h" -#include "video_core/host_shaders/detile_m32x1_comp.h" -#include "video_core/host_shaders/detile_m32x2_comp.h" -#include "video_core/host_shaders/detile_m32x4_comp.h" -#include "video_core/host_shaders/detile_m8x1_comp.h" -#include "video_core/host_shaders/detile_m8x2_comp.h" -#include "video_core/host_shaders/detile_macro32x1_comp.h" -#include "video_core/host_shaders/detile_macro32x2_comp.h" -#include "video_core/host_shaders/detile_macro8x1_comp.h" +#include "video_core/host_shaders/detilers/macro_32bpp_comp.h" +#include "video_core/host_shaders/detilers/macro_64bpp_comp.h" +#include "video_core/host_shaders/detilers/macro_8bpp_comp.h" +#include "video_core/host_shaders/detilers/micro_128bpp_comp.h" +#include "video_core/host_shaders/detilers/micro_16bpp_comp.h" +#include "video_core/host_shaders/detilers/micro_32bpp_comp.h" +#include "video_core/host_shaders/detilers/micro_64bpp_comp.h" +#include "video_core/host_shaders/detilers/micro_8bpp_comp.h" -#include +// #include #include #include namespace VideoCore { -static vk::Format DemoteImageFormatForDetiling(vk::Format format) { - switch (format) { - case vk::Format::eR8Unorm: - case vk::Format::eR8Snorm: - case vk::Format::eR8Uint: - case vk::Format::eR8Srgb: - return vk::Format::eR8Uint; - case vk::Format::eR8G8Unorm: - case vk::Format::eR8G8Snorm: - case vk::Format::eR8G8Uint: - case vk::Format::eR8G8Srgb: - case vk::Format::eR16Unorm: - case vk::Format::eR16Snorm: - case vk::Format::eR16Uint: - case vk::Format::eR16Sfloat: - case vk::Format::eD16Unorm: - case vk::Format::eR4G4B4A4UnormPack16: - case vk::Format::eR5G5B5A1UnormPack16: - case vk::Format::eB5G5R5A1UnormPack16: - case vk::Format::eB5G6R5UnormPack16: - return vk::Format::eR8G8Uint; - case vk::Format::eR8G8B8A8Unorm: - case vk::Format::eR8G8B8A8Snorm: - case vk::Format::eR8G8B8A8Uint: - case vk::Format::eR8G8B8A8Srgb: - case vk::Format::eB8G8R8A8Unorm: - case vk::Format::eB8G8R8A8Snorm: - case vk::Format::eB8G8R8A8Uint: - case vk::Format::eB8G8R8A8Srgb: - case vk::Format::eR16G16Unorm: - case vk::Format::eR16G16Snorm: - case vk::Format::eR16G16Uint: - case vk::Format::eR16G16Sfloat: - case vk::Format::eR32Uint: - case vk::Format::eR32Sfloat: - case vk::Format::eD32Sfloat: - case vk::Format::eA2B10G10R10UnormPack32: - case vk::Format::eA2B10G10R10SnormPack32: - case vk::Format::eA2B10G10R10UintPack32: - case vk::Format::eB10G11R11UfloatPack32: - case vk::Format::eE5B9G9R9UfloatPack32: - return vk::Format::eR32Uint; - case vk::Format::eR16G16B16A16Unorm: - case vk::Format::eR16G16B16A16Snorm: - case vk::Format::eR16G16B16A16Uint: - case vk::Format::eR16G16B16A16Sfloat: - case vk::Format::eR32G32Uint: - case vk::Format::eR32G32Sfloat: - case vk::Format::eBc1RgbaUnormBlock: - case vk::Format::eBc1RgbaSrgbBlock: - case vk::Format::eBc4UnormBlock: - case vk::Format::eBc4SnormBlock: - return vk::Format::eR32G32Uint; - case vk::Format::eR32G32B32A32Uint: - case vk::Format::eR32G32B32A32Sfloat: - case vk::Format::eBc2UnormBlock: - case vk::Format::eBc2SrgbBlock: - case vk::Format::eBc3UnormBlock: - case vk::Format::eBc3SrgbBlock: - case vk::Format::eBc5UnormBlock: - case vk::Format::eBc5SnormBlock: - case vk::Format::eBc6HUfloatBlock: - case vk::Format::eBc6HSfloatBlock: - case vk::Format::eBc7UnormBlock: - case vk::Format::eBc7SrgbBlock: - return vk::Format::eR32G32B32A32Uint; - default: - break; - } - - // Log missing formats only once to avoid spamming the log. - static constexpr size_t MaxFormatIndex = 256; - static std::array logged_formats{}; - if (const u32 index = u32(format); !logged_formats[index]) { - LOG_ERROR(Render_Vulkan, "Unexpected format for demotion {}", vk::to_string(format)); - logged_formats[index] = true; - } - return format; -} - const DetilerContext* TileManager::GetDetiler(const ImageInfo& info) const { - const auto format = DemoteImageFormatForDetiling(info.pixel_format); - + const auto bpp = info.num_bits * (info.props.is_block ? 16 : 1); switch (info.tiling_mode) { case AmdGpu::TilingMode::Texture_MicroTiled: - switch (format) { - case vk::Format::eR8Uint: - return &detilers[DetilerType::Micro8x1]; - case vk::Format::eR8G8Uint: - return &detilers[DetilerType::Micro8x2]; - case vk::Format::eR32Uint: - return &detilers[DetilerType::Micro32x1]; - case vk::Format::eR32G32Uint: - return &detilers[DetilerType::Micro32x2]; - case vk::Format::eR32G32B32A32Uint: - return &detilers[DetilerType::Micro32x4]; + switch (bpp) { + case 8: + return &detilers[DetilerType::Micro8]; + case 16: + return &detilers[DetilerType::Micro16]; + case 32: + return &detilers[DetilerType::Micro32]; + case 64: + return &detilers[DetilerType::Micro64]; + case 128: + return &detilers[DetilerType::Micro128]; default: return nullptr; } case AmdGpu::TilingMode::Texture_Volume: - switch (format) { - case vk::Format::eR8Uint: - return &detilers[DetilerType::Macro8x1]; - case vk::Format::eR32Uint: - return &detilers[DetilerType::Macro32x1]; - case vk::Format::eR32G32Uint: - return &detilers[DetilerType::Macro32x2]; + switch (bpp) { + case 8: + return &detilers[DetilerType::Macro8]; + case 32: + return &detilers[DetilerType::Macro32]; + case 64: + return &detilers[DetilerType::Macro64]; default: return nullptr; } @@ -149,10 +68,10 @@ struct DetilerParams { TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& scheduler) : instance{instance}, scheduler{scheduler} { static const std::array detiler_shaders{ - HostShaders::DETILE_M8X1_COMP, HostShaders::DETILE_M8X2_COMP, - HostShaders::DETILE_M32X1_COMP, HostShaders::DETILE_M32X2_COMP, - HostShaders::DETILE_M32X4_COMP, HostShaders::DETILE_MACRO8X1_COMP, - HostShaders::DETILE_MACRO32X1_COMP, HostShaders::DETILE_MACRO32X2_COMP, + HostShaders::MICRO_8BPP_COMP, HostShaders::MICRO_16BPP_COMP, + HostShaders::MICRO_32BPP_COMP, HostShaders::MICRO_64BPP_COMP, + HostShaders::MICRO_128BPP_COMP, HostShaders::MACRO_8BPP_COMP, + HostShaders::MACRO_32BPP_COMP, HostShaders::MACRO_64BPP_COMP, }; boost::container::static_vector bindings{ @@ -293,7 +212,7 @@ std::pair TileManager::TryDetile(vk::Buffer in_buffer, u32 in_o return {in_buffer, in_offset}; } - const u32 image_size = info.guest_size_bytes; + const u32 image_size = info.guest_size; // Prepare output buffer auto out_buffer = AllocBuffer(image_size, true); diff --git a/src/video_core/texture_cache/tile_manager.h b/src/video_core/texture_cache/tile_manager.h index bcf5accd3..4eae7be9e 100644 --- a/src/video_core/texture_cache/tile_manager.h +++ b/src/video_core/texture_cache/tile_manager.h @@ -12,15 +12,15 @@ class TextureCache; struct ImageInfo; enum DetilerType : u32 { - Micro8x1, - Micro8x2, - Micro32x1, - Micro32x2, - Micro32x4, + Micro8, + Micro16, + Micro32, + Micro64, + Micro128, - Macro8x1, - Macro32x1, - Macro32x2, + Macro8, + Macro32, + Macro64, Max }; From 7153bc8d8fab813d36111423cf8dfa2c9c3b756e Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 3 Jan 2025 15:29:09 -0800 Subject: [PATCH 006/455] kernel: Check PSF for neo mode support. (#2028) --- src/common/config.cpp | 2 +- src/common/config.h | 2 +- src/common/elf_info.h | 47 +++++++++ src/core/libraries/kernel/process.cpp | 2 +- src/core/memory.cpp | 3 +- src/emulator.cpp | 105 ++++++++++---------- src/video_core/texture_cache/image_info.cpp | 3 +- 7 files changed, 105 insertions(+), 59 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 246644e2d..9e2cc0020 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -100,7 +100,7 @@ void setTrophyKey(std::string key) { trophyKey = key; } -bool isNeoMode() { +bool isNeoModeConsole() { return isNeo; } diff --git a/src/common/config.h b/src/common/config.h index 9d943008b..2b9a35449 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -18,7 +18,7 @@ void saveMainWindow(const std::filesystem::path& path); std::string getTrophyKey(); void setTrophyKey(std::string key); -bool isNeoMode(); +bool isNeoModeConsole(); bool isFullscreenMode(); bool getPlayBGM(); int getBGMvolume(); diff --git a/src/common/elf_info.h b/src/common/elf_info.h index 6eb144e9a..02eefbb7a 100644 --- a/src/common/elf_info.h +++ b/src/common/elf_info.h @@ -7,6 +7,7 @@ #include #include "assert.h" +#include "bit_field.h" #include "singleton.h" #include "types.h" @@ -16,6 +17,46 @@ class Emulator; namespace Common { +union PSFAttributes { + /// Supports initial user's logout + BitField<0, 1, u32> support_initial_user_logout; + /// Enter button for the common dialog is cross. + BitField<1, 1, u32> enter_button_cross; + /// Warning dialog for PS Move is displayed in the options menu. + BitField<2, 1, u32> ps_move_warning; + /// Supports stereoscopic 3D. + BitField<3, 1, u32> support_stereoscopic_3d; + /// Suspends when PS button is pressed. + BitField<4, 1, u32> ps_button_suspend; + /// Enter button for the common dialog is assigned by the system software. + BitField<5, 1, u32> enter_button_system; + /// Overrides share menu behavior. + BitField<6, 1, u32> override_share_menu; + /// Suspends when PS button is pressed and special output resolution is set. + BitField<8, 1, u32> special_res_ps_button_suspend; + /// Enable HDCP. + BitField<9, 1, u32> enable_hdcp; + /// Disable HDCP for non-game. + BitField<10, 1, u32> disable_hdcp_non_game; + /// Supports PS VR. + BitField<14, 1, u32> support_ps_vr; + /// CPU mode (6 CPU) + BitField<15, 1, u32> six_cpu_mode; + /// CPU mode (7 CPU) + BitField<16, 1, u32> seven_cpu_mode; + /// Supports PS4 Pro (Neo) mode. + BitField<23, 1, u32> support_neo_mode; + /// Requires PS VR. + BitField<26, 1, u32> require_ps_vr; + /// Supports HDR. + BitField<29, 1, u32> support_hdr; + /// Display location. + BitField<31, 1, u32> display_location; + + u32 raw{}; +}; +static_assert(sizeof(PSFAttributes) == 4); + class ElfInfo { friend class Core::Emulator; @@ -26,6 +67,7 @@ class ElfInfo { std::string app_ver{}; u32 firmware_ver = 0; u32 raw_firmware_ver = 0; + PSFAttributes psf_attributes{}; public: static constexpr u32 FW_15 = 0x1500000; @@ -68,6 +110,11 @@ public: ASSERT(initialized); return raw_firmware_ver; } + + [[nodiscard]] const PSFAttributes& PSFAttributes() const { + ASSERT(initialized); + return psf_attributes; + } }; } // namespace Common diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index 97cc01ebc..2fa597d4d 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -14,7 +14,7 @@ namespace Libraries::Kernel { int PS4_SYSV_ABI sceKernelIsNeoMode() { LOG_DEBUG(Kernel_Sce, "called"); - return Config::isNeoMode(); + return Config::isNeoModeConsole() && Common::ElfInfo::Instance().PSFAttributes().support_neo_mode; } int PS4_SYSV_ABI sceKernelGetCompiledSdkVersion(int* ver) { diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 0a69ad773..1327ede5f 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -7,6 +7,7 @@ #include "common/debug.h" #include "core/libraries/kernel/memory.h" #include "core/libraries/kernel/orbis_error.h" +#include "core/libraries/kernel/process.h" #include "core/memory.h" #include "video_core/renderer_vulkan/vk_rasterizer.h" @@ -35,7 +36,7 @@ MemoryManager::~MemoryManager() = default; void MemoryManager::SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1, bool use_extended_mem2) { - const bool is_neo = Config::isNeoMode(); + const bool is_neo = ::Libraries::Kernel::sceKernelIsNeoMode(); auto total_size = is_neo ? SCE_KERNEL_TOTAL_MEM_PRO : SCE_KERNEL_TOTAL_MEM; if (!use_extended_mem1 && is_neo) { total_size -= 256_MB; diff --git a/src/emulator.cpp b/src/emulator.cpp index 4f0c61236..5d037e26c 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -28,8 +28,6 @@ #include "core/file_format/trp.h" #include "core/file_sys/fs.h" #include "core/libraries/disc_map/disc_map.h" -#include "core/libraries/fiber/fiber.h" -#include "core/libraries/jpeg/jpegenc.h" #include "core/libraries/libc_internal/libc_internal.h" #include "core/libraries/libs.h" #include "core/libraries/ngs2/ngs2.h" @@ -59,8 +57,8 @@ Emulator::Emulator() { LOG_INFO(Loader, "Branch {}", Common::g_scm_branch); LOG_INFO(Loader, "Description {}", Common::g_scm_desc); - LOG_INFO(Config, "General Logtype: {}", Config::getLogType()); - LOG_INFO(Config, "General isNeo: {}", Config::isNeoMode()); + LOG_INFO(Config, "General LogType: {}", Config::getLogType()); + LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole()); LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu()); LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders()); LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv()); @@ -101,19 +99,12 @@ Emulator::~Emulator() { } void Emulator::Run(const std::filesystem::path& file) { - - // Use the eboot from the separated updates folder if it's there - std::filesystem::path game_patch_folder = file.parent_path(); - game_patch_folder += "-UPDATE"; - std::filesystem::path eboot_path = std::filesystem::exists(game_patch_folder / file.filename()) - ? game_patch_folder / file.filename() - : file; - // Applications expect to be run from /app0 so mount the file's parent path as app0. auto* mnt = Common::Singleton::Instance(); - mnt->Mount(file.parent_path(), "/app0"); + const auto game_folder = file.parent_path(); + mnt->Mount(game_folder, "/app0"); // Certain games may use /hostapp as well such as CUSA001100 - mnt->Mount(file.parent_path(), "/hostapp"); + mnt->Mount(game_folder, "/hostapp"); auto& game_info = Common::ElfInfo::Instance(); @@ -122,50 +113,52 @@ void Emulator::Run(const std::filesystem::path& file) { std::string title; std::string app_version; u32 fw_version; + Common::PSFAttributes psf_attributes{}; - std::filesystem::path sce_sys_folder = eboot_path.parent_path() / "sce_sys"; - if (std::filesystem::is_directory(sce_sys_folder)) { - for (const auto& entry : std::filesystem::directory_iterator(sce_sys_folder)) { - if (entry.path().filename() == "param.sfo") { - auto* param_sfo = Common::Singleton::Instance(); - const bool success = param_sfo->Open(sce_sys_folder / "param.sfo"); - ASSERT_MSG(success, "Failed to open param.sfo"); - const auto content_id = param_sfo->GetString("CONTENT_ID"); - ASSERT_MSG(content_id.has_value(), "Failed to get CONTENT_ID"); - id = std::string(*content_id, 7, 9); - Libraries::NpTrophy::game_serial = id; - const auto trophyDir = - Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / id / "TrophyFiles"; - if (!std::filesystem::exists(trophyDir)) { - TRP trp; - if (!trp.Extract(eboot_path.parent_path(), id)) { - LOG_ERROR(Loader, "Couldn't extract trophies"); - } - } + const auto param_sfo_path = mnt->GetHostPath("/app0/sce_sys/param.sfo"); + if (std::filesystem::exists(param_sfo_path)) { + auto* param_sfo = Common::Singleton::Instance(); + const bool success = param_sfo->Open(param_sfo_path); + ASSERT_MSG(success, "Failed to open param.sfo"); + const auto content_id = param_sfo->GetString("CONTENT_ID"); + ASSERT_MSG(content_id.has_value(), "Failed to get CONTENT_ID"); + id = std::string(*content_id, 7, 9); + Libraries::NpTrophy::game_serial = id; + const auto trophyDir = + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / id / "TrophyFiles"; + if (!std::filesystem::exists(trophyDir)) { + TRP trp; + if (!trp.Extract(game_folder, id)) { + LOG_ERROR(Loader, "Couldn't extract trophies"); + } + } #ifdef ENABLE_QT_GUI - MemoryPatcher::g_game_serial = id; + MemoryPatcher::g_game_serial = id; - // Timer for 'Play Time' - QTimer* timer = new QTimer(); - QObject::connect(timer, &QTimer::timeout, [this, id]() { - UpdatePlayTime(id); - start_time = std::chrono::steady_clock::now(); - }); - timer->start(60000); // 60000 ms = 1 minute + // Timer for 'Play Time' + QTimer* timer = new QTimer(); + QObject::connect(timer, &QTimer::timeout, [this, id]() { + UpdatePlayTime(id); + start_time = std::chrono::steady_clock::now(); + }); + timer->start(60000); // 60000 ms = 1 minute #endif - title = param_sfo->GetString("TITLE").value_or("Unknown title"); - LOG_INFO(Loader, "Game id: {} Title: {}", id, title); - fw_version = param_sfo->GetInteger("SYSTEM_VER").value_or(0x4700000); - app_version = param_sfo->GetString("APP_VER").value_or("Unknown version"); - LOG_INFO(Loader, "Fw: {:#x} App Version: {}", fw_version, app_version); - } else if (entry.path().filename() == "pic1.png") { - auto* splash = Common::Singleton::Instance(); - if (splash->IsLoaded()) { - continue; - } - if (!splash->Open(entry.path())) { - LOG_ERROR(Loader, "Game splash: unable to open file"); - } + title = param_sfo->GetString("TITLE").value_or("Unknown title"); + LOG_INFO(Loader, "Game id: {} Title: {}", id, title); + fw_version = param_sfo->GetInteger("SYSTEM_VER").value_or(0x4700000); + app_version = param_sfo->GetString("APP_VER").value_or("Unknown version"); + LOG_INFO(Loader, "Fw: {:#x} App Version: {}", fw_version, app_version); + if (const auto raw_attributes = param_sfo->GetInteger("ATTRIBUTE")) { + psf_attributes.raw = *raw_attributes; + } + } + + const auto pic1_path = mnt->GetHostPath("/app0/sce_sys/pic1.png"); + if (std::filesystem::exists(pic1_path)) { + auto* splash = Common::Singleton::Instance(); + if (!splash->IsLoaded()) { + if (!splash->Open(pic1_path)) { + LOG_ERROR(Loader, "Game splash: unable to open file"); } } } @@ -176,6 +169,7 @@ void Emulator::Run(const std::filesystem::path& file) { game_info.app_ver = app_version; game_info.firmware_ver = fw_version & 0xFFF00000; game_info.raw_firmware_ver = fw_version; + game_info.psf_attributes = psf_attributes; std::string game_title = fmt::format("{} - {} <{}>", id, title, app_version); std::string window_title = ""; @@ -219,6 +213,7 @@ void Emulator::Run(const std::filesystem::path& file) { Libraries::InitHLELibs(&linker->GetHLESymbols()); // Load the module with the linker + const auto eboot_path = mnt->GetHostPath("/app0/" + file.filename().string()); linker->LoadModule(eboot_path); // check if we have system modules to load @@ -236,6 +231,8 @@ void Emulator::Run(const std::filesystem::path& file) { } // Load all prx from separate update's sce_module folder + std::filesystem::path game_patch_folder = game_folder; + game_patch_folder += "-UPDATE"; std::filesystem::path update_module_folder = game_patch_folder / "sce_module"; if (std::filesystem::is_directory(update_module_folder)) { for (const auto& entry : std::filesystem::directory_iterator(update_module_folder)) { diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 8ea9267fd..2f69410cd 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -3,6 +3,7 @@ #include "common/assert.h" #include "common/config.h" +#include "core/libraries/kernel/process.h" #include "video_core/renderer_vulkan/liverpool_to_vk.h" #include "video_core/texture_cache/image_info.h" @@ -252,7 +253,7 @@ ImageInfo::ImageInfo(const Libraries::VideoOut::BufferAttributeGroup& group, if (!props.is_tiled) { guest_size = pitch * size.height * 4; } else { - if (Config::isNeoMode()) { + if (Libraries::Kernel::sceKernelIsNeoMode()) { guest_size = pitch * ((size.height + 127) & (~127)) * 4; } else { guest_size = pitch * ((size.height + 63) & (~63)) * 4; From ddc658f8c85a927488c827bd5d79ac8bad1e9b52 Mon Sep 17 00:00:00 2001 From: psucien Date: Sat, 4 Jan 2025 00:32:17 +0100 Subject: [PATCH 007/455] clang-format --- src/core/libraries/kernel/process.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index 2fa597d4d..791a98a36 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -14,7 +14,8 @@ namespace Libraries::Kernel { int PS4_SYSV_ABI sceKernelIsNeoMode() { LOG_DEBUG(Kernel_Sce, "called"); - return Config::isNeoModeConsole() && Common::ElfInfo::Instance().PSFAttributes().support_neo_mode; + return Config::isNeoModeConsole() && + Common::ElfInfo::Instance().PSFAttributes().support_neo_mode; } int PS4_SYSV_ABI sceKernelGetCompiledSdkVersion(int* ver) { From 78a32a3c0f19cc39478def05e14371763a87c3da Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 4 Jan 2025 02:44:14 -0800 Subject: [PATCH 008/455] image_info: Add Neo mode macro tile extents. (#2045) --- src/video_core/texture_cache/image_info.cpp | 194 +---------- src/video_core/texture_cache/image_info.h | 1 + src/video_core/texture_cache/tile.h | 347 ++++++++++++++++++++ 3 files changed, 352 insertions(+), 190 deletions(-) create mode 100644 src/video_core/texture_cache/tile.h diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 2f69410cd..bdbaecda6 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -6,6 +6,7 @@ #include "core/libraries/kernel/process.h" #include "video_core/renderer_vulkan/liverpool_to_vk.h" #include "video_core/texture_cache/image_info.h" +#include "video_core/texture_cache/tile.h" namespace VideoCore { @@ -46,195 +47,6 @@ static vk::ImageType ConvertImageType(AmdGpu::ImageType type) noexcept { } } -// clang-format off -// The table of macro tiles parameters for given tiling index (row) and bpp (column) -static constexpr std::array macro_tile_extents_x1{ - std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 04 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 - std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 - std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 07 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0A - std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0B - std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0C - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0E - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0F - std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 10 - std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 11 - std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 12 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A -}; - -static constexpr std::array macro_tile_extents_x2{ - std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 04 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 07 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0A - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0B - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0C - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0E - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0F - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 10 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 11 - std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 12 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A -}; - -static constexpr std::array macro_tile_extents_x4{ - std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 04 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 07 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0A - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0B - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0C - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0E - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0F - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 10 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 11 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 12 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A -}; - -static constexpr std::array macro_tile_extents_x8{ - std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 04 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 07 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0A - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0B - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0C - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0E - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0F - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 10 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 11 - std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 12 - std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 - std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 - std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 - std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A -}; - -static constexpr std::array macro_tile_extents{ - macro_tile_extents_x1, - macro_tile_extents_x2, - macro_tile_extents_x4, - macro_tile_extents_x8, -}; -// clang-format on - -static constexpr std::pair micro_tile_extent{8u, 8u}; -static constexpr auto hw_pipe_interleave = 256u; - -static constexpr std::pair GetMacroTileExtents(u32 tiling_idx, u32 bpp, u32 num_samples) { - ASSERT(num_samples <= 8); - const auto row = tiling_idx * 5; - const auto column = std::bit_width(bpp) - 4; // bpps are 8, 16, 32, 64, 128 - return (macro_tile_extents[std::log2(num_samples)])[row + column]; -} - -static constexpr std::pair ImageSizeLinearAligned(u32 pitch, u32 height, u32 bpp, - u32 num_samples) { - const auto pitch_align = std::max(8u, 64u / ((bpp + 7) / 8)); - auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); - const auto height_aligned = height; - size_t log_sz = pitch_aligned * height_aligned * num_samples; - const auto slice_align = std::max(64u, 256u / ((bpp + 7) / 8)); - while (log_sz % slice_align) { - pitch_aligned += pitch_align; - log_sz = pitch_aligned * height_aligned * num_samples; - } - return {pitch_aligned, (log_sz * bpp + 7) / 8}; -} - -static constexpr std::pair ImageSizeMicroTiled(u32 pitch, u32 height, u32 bpp, - u32 num_samples) { - const auto& [pitch_align, height_align] = micro_tile_extent; - auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); - const auto height_aligned = (height + height_align - 1) & ~(height_align - 1); - size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; - while (log_sz % 256) { - pitch_aligned += 8; - log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; - } - return {pitch_aligned, log_sz}; -} - -static constexpr std::pair ImageSizeMacroTiled(u32 pitch, u32 height, u32 bpp, - u32 num_samples, u32 tiling_idx, - u32 mip_n) { - const auto& [pitch_align, height_align] = GetMacroTileExtents(tiling_idx, bpp, num_samples); - ASSERT(pitch_align != 0 && height_align != 0); - bool downgrade_to_micro = false; - if (mip_n > 0) { - const bool is_less_than_tile = pitch < pitch_align || height < height_align; - // TODO: threshold check - downgrade_to_micro = is_less_than_tile; - } - - if (downgrade_to_micro) { - return ImageSizeMicroTiled(pitch, height, bpp, num_samples); - } - - const auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); - const auto height_aligned = (height + height_align - 1) & ~(height_align - 1); - const auto log_sz = pitch_aligned * height_aligned * num_samples; - return {pitch_aligned, (log_sz * bpp + 7) / 8}; -} - ImageInfo::ImageInfo(const Libraries::VideoOut::BufferAttributeGroup& group, VAddr cpu_address) noexcept { const auto& attrib = group.attrib; @@ -283,6 +95,7 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer, guest_size = color_slice_sz * buffer.NumSlices(); mips_layout.emplace_back(color_slice_sz, pitch, 0); tiling_idx = static_cast(buffer.attrib.tile_mode_index.Value()); + alt_tile = Libraries::Kernel::sceKernelIsNeoMode() && buffer.info.alt_tile_mode; } ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slices, @@ -334,6 +147,7 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& de mips_layout.reserve(resources.levels); tiling_idx = image.tiling_index; + alt_tile = Libraries::Kernel::sceKernelIsNeoMode() && image.alt_tile_mode; UpdateSize(); } @@ -385,7 +199,7 @@ void ImageInfo::UpdateSize() { case AmdGpu::TilingMode::Depth_MacroTiled: { ASSERT(!props.is_block); std::tie(mip_info.pitch, mip_info.size) = - ImageSizeMacroTiled(mip_w, mip_h, bpp, num_samples, tiling_idx, mip); + ImageSizeMacroTiled(mip_w, mip_h, bpp, num_samples, tiling_idx, mip, alt_tile); break; } default: { diff --git a/src/video_core/texture_cache/image_info.h b/src/video_core/texture_cache/image_info.h index 74f6c5674..6faca49c5 100644 --- a/src/video_core/texture_cache/image_info.h +++ b/src/video_core/texture_cache/image_info.h @@ -86,6 +86,7 @@ struct ImageInfo { VAddr guest_address{0}; u32 guest_size{0}; u32 tiling_idx{0}; // TODO: merge with existing! + bool alt_tile{false}; VAddr stencil_addr{0}; u32 stencil_size{0}; diff --git a/src/video_core/texture_cache/tile.h b/src/video_core/texture_cache/tile.h new file mode 100644 index 000000000..532bf3d88 --- /dev/null +++ b/src/video_core/texture_cache/tile.h @@ -0,0 +1,347 @@ +// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/assert.h" +#include "common/types.h" + +namespace VideoCore { + +// clang-format off +// The table of macro tiles parameters for given tiling index (row) and bpp (column) +/* Calculation: + * - Inputs: + * TileMode, BytesPerPixel, NumFragments + * - Constants: + * MicroTileWidth = 8, MicroTileHeight = 8, + * Tile Mode LUTs: IsDepth(), IsPrt(), TileThickness(), TileSplit(), SampleSplit(), NumPipes() + * Macro Tile Mode LUTs: BankWidth(), BankHeight(), NumBanks(), MacroTileAspect() + * - Determine the macro tile mode: + * TileBytes = MicroTileWidth * MicroTileHeight * TileThickness(TileMode) * BytesPerPixel + * TileSplit = min(IsDepth(TileMode) ? TileSplit(TileMode) : max(TileBytes * SampleSplit(TileMode), 256), NumFragments * TileBytes, 1024) + * MacroTileModeIndex = log2(TileSplit / 64) + * MacroTileMode = IsPrt(TileMode) ? MacroTileModeIndex + 8 : MacroTileModeIndex + * - Calculate macro tile width and height: + * Width = NumPipes(TileMode) * BankWidth(MacroTileMode) * MicroTileWidth * MacroTileAspect(MacroTileMode, AltTileMode) + * Height = NumBanks(MacroTileMode, AltTileMode) * BankHeight(MacroTileMode, AltTileMode) * MicroTileHeight / MacroTileAspect(MacroTileMode, AltTileMode) + */ + +constexpr std::array macro_tile_extents_x1{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0A + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0B + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0E + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 0F + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 10 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 11 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents_x2{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0A + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0B + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0E + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0F + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 10 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 11 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents_x4{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0A + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0B + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0E + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0F + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 10 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 11 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents_x8{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 01 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 02 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 03 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0A + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0B + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0E + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 0F + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 10 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 11 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 14 + std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 18 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 19 + std::pair{128u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, std::pair{64u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents_alt_x1{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 01 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 02 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 03 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, // 0A + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, // 0B + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, // 0E + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, // 0F + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, // 10 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, // 11 + std::pair{256u, 256u}, std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 14 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 18 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 19 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents_alt_x2{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 01 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 02 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 03 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0A + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 0B + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0E + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0F + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 10 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 11 + std::pair{256u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 14 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 18 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 19 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents_alt_x4{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 01 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 02 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 03 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0A + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 0B + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0E + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0F + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 10 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 11 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 14 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 18 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 19 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents_alt_x8{ + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 00 + std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, std::pair{256u, 128u}, // 01 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 02 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 03 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 04 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 05 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, // 06 + std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 07 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 08 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 09 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0A + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 0B + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 0C + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 0D + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0E + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 0F + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 10 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 11 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 12 + std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, std::pair{0u, 0u}, // 13 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 14 + std::pair{128u, 128u}, std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 15 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 16 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 17 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 32u}, std::pair{128u, 32u}, std::pair{128u, 32u}, // 18 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 19 + std::pair{128u, 128u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, std::pair{128u, 64u}, // 1A +}; + +constexpr std::array macro_tile_extents{ + macro_tile_extents_x1, + macro_tile_extents_x2, + macro_tile_extents_x4, + macro_tile_extents_x8, +}; + +constexpr std::array macro_tile_extents_alt{ + macro_tile_extents_alt_x1, + macro_tile_extents_alt_x2, + macro_tile_extents_alt_x4, + macro_tile_extents_alt_x8, +}; +// clang-format on + +constexpr std::pair micro_tile_extent{8u, 8u}; +constexpr auto hw_pipe_interleave = 256u; + +constexpr std::pair GetMacroTileExtents(u32 tiling_idx, u32 bpp, u32 num_samples, + bool alt) { + ASSERT(num_samples <= 8); + const auto samples_log = static_cast(std::log2(num_samples)); + const auto row = tiling_idx * 5; + const auto column = std::bit_width(bpp) - 4; // bpps are 8, 16, 32, 64, 128 + return (alt ? macro_tile_extents_alt : macro_tile_extents)[samples_log][row + column]; +} + +constexpr std::pair ImageSizeLinearAligned(u32 pitch, u32 height, u32 bpp, + u32 num_samples) { + const auto pitch_align = std::max(8u, 64u / ((bpp + 7) / 8)); + auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); + const auto height_aligned = height; + size_t log_sz = pitch_aligned * height_aligned * num_samples; + const auto slice_align = std::max(64u, 256u / ((bpp + 7) / 8)); + while (log_sz % slice_align) { + pitch_aligned += pitch_align; + log_sz = pitch_aligned * height_aligned * num_samples; + } + return {pitch_aligned, (log_sz * bpp + 7) / 8}; +} + +constexpr std::pair ImageSizeMicroTiled(u32 pitch, u32 height, u32 bpp, + u32 num_samples) { + const auto& [pitch_align, height_align] = micro_tile_extent; + auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); + const auto height_aligned = (height + height_align - 1) & ~(height_align - 1); + size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; + while (log_sz % 256) { + pitch_aligned += 8; + log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; + } + return {pitch_aligned, log_sz}; +} + +constexpr std::pair ImageSizeMacroTiled(u32 pitch, u32 height, u32 bpp, + u32 num_samples, u32 tiling_idx, u32 mip_n, + bool alt) { + const auto& [pitch_align, height_align] = + GetMacroTileExtents(tiling_idx, bpp, num_samples, alt); + ASSERT(pitch_align != 0 && height_align != 0); + bool downgrade_to_micro = false; + if (mip_n > 0) { + const bool is_less_than_tile = pitch < pitch_align || height < height_align; + // TODO: threshold check + downgrade_to_micro = is_less_than_tile; + } + + if (downgrade_to_micro) { + return ImageSizeMicroTiled(pitch, height, bpp, num_samples); + } + + const auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); + const auto height_aligned = (height + height_align - 1) & ~(height_align - 1); + const auto log_sz = pitch_aligned * height_aligned * num_samples; + return {pitch_aligned, (log_sz * bpp + 7) / 8}; +} + +} // namespace VideoCore From f42b8acf478f1bfddf212bb42c524b0ba1f84226 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 4 Jan 2025 04:33:07 -0800 Subject: [PATCH 009/455] sdl_audio: Remove buffer samples hint. (#2038) --- src/core/libraries/audio/sdl_audio.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/core/libraries/audio/sdl_audio.cpp b/src/core/libraries/audio/sdl_audio.cpp index 762a9f682..9aee2b447 100644 --- a/src/core/libraries/audio/sdl_audio.cpp +++ b/src/core/libraries/audio/sdl_audio.cpp @@ -15,13 +15,6 @@ class SDLPortBackend : public PortBackend { public: explicit SDLPortBackend(const PortOut& port) : frame_size(port.format_info.FrameSize()), guest_buffer_size(port.BufferSize()) { - // We want the latency for delivering frames out to be as small as possible, - // so set the sample frames hint to the number of frames per buffer. - const auto samples_num_str = std::to_string(port.buffer_frames); - if (!SDL_SetHint(SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES, samples_num_str.c_str())) { - LOG_WARNING(Lib_AudioOut, "Failed to set SDL audio sample frames hint to {}: {}", - samples_num_str, SDL_GetError()); - } const SDL_AudioSpec fmt = { .format = port.format_info.is_float ? SDL_AUDIO_F32LE : SDL_AUDIO_S16LE, .channels = port.format_info.num_channels, From f2f24bb2cd4360eaf05f2245fbc15198b4160741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sat, 4 Jan 2025 19:33:23 +0700 Subject: [PATCH 010/455] input: Add missing poll lock (#2044) --- src/input/controller.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/input/controller.cpp b/src/input/controller.cpp index daef9c940..366d80f8f 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -266,6 +266,7 @@ void GameController::TryOpenSDLController() { } u32 GameController::Poll() { + std::scoped_lock lock{m_mutex}; if (m_connected) { auto time = Libraries::Kernel::sceKernelGetProcessTime(); if (m_states_num == 0) { From 7459d9c333a0011003212948b06a3cac396e3682 Mon Sep 17 00:00:00 2001 From: psucien Date: Sat, 4 Jan 2025 22:23:12 +0100 Subject: [PATCH 011/455] hot-fix: amdgpu: use different indirect dispatch packet on ASC --- src/core/libraries/gnmdriver/gnmdriver.cpp | 13 ++++++++++--- src/core/libraries/gnmdriver/gnmdriver.h | 2 +- src/video_core/amdgpu/liverpool.cpp | 8 ++++---- src/video_core/amdgpu/pm4_cmds.h | 12 ++++++++++++ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index f93b3dbf0..fdc3a1acd 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -383,9 +383,16 @@ s32 PS4_SYSV_ABI sceGnmDispatchIndirect(u32* cmdbuf, u32 size, u32 data_offset, return -1; } -int PS4_SYSV_ABI sceGnmDispatchIndirectOnMec() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +s32 PS4_SYSV_ABI sceGnmDispatchIndirectOnMec(u32* cmdbuf, u32 size, VAddr args, u32 modifier) { + if (cmdbuf != nullptr && size == 8 && args != 0 && ((args & 3u) == 0)) { + cmdbuf[0] = 0xc0021602 | (modifier & 1u); + *(VAddr*)(&cmdbuf[1]) = args; + cmdbuf[3] = (modifier & 0x18) | 1u; + cmdbuf[4] = 0xc0021000; + cmdbuf[5] = 0; + return ORBIS_OK; + } + return ORBIS_FAIL; } u32 PS4_SYSV_ABI sceGnmDispatchInitDefaultHardwareState(u32* cmdbuf, u32 size) { diff --git a/src/core/libraries/gnmdriver/gnmdriver.h b/src/core/libraries/gnmdriver/gnmdriver.h index d15483323..609e26c0d 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.h +++ b/src/core/libraries/gnmdriver/gnmdriver.h @@ -39,7 +39,7 @@ int PS4_SYSV_ABI sceGnmDisableMipStatsReport(); s32 PS4_SYSV_ABI sceGnmDispatchDirect(u32* cmdbuf, u32 size, u32 threads_x, u32 threads_y, u32 threads_z, u32 flags); s32 PS4_SYSV_ABI sceGnmDispatchIndirect(u32* cmdbuf, u32 size, u32 data_offset, u32 flags); -int PS4_SYSV_ABI sceGnmDispatchIndirectOnMec(); +s32 PS4_SYSV_ABI sceGnmDispatchIndirectOnMec(u32* cmdbuf, u32 size, VAddr args, u32 modifier); u32 PS4_SYSV_ABI sceGnmDispatchInitDefaultHardwareState(u32* cmdbuf, u32 size); s32 PS4_SYSV_ABI sceGnmDrawIndex(u32* cmdbuf, u32 size, u32 index_count, uintptr_t index_addr, u32 flags, u32 type); diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 985f3c652..a59d4a64d 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -823,10 +823,10 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { break; } case PM4ItOpcode::DispatchIndirect: { - const auto* dispatch_indirect = reinterpret_cast(header); + const auto* dispatch_indirect = + reinterpret_cast(header); auto& cs_program = GetCsRegs(); - const auto offset = dispatch_indirect->data_offset; - const auto ib_address = mapped_queues[vqid].indirect_args_addr; + const auto ib_address = dispatch_indirect->Address(); const auto size = sizeof(PM4CmdDispatchIndirect::GroupDimensions); if (DebugState.DumpingCurrentReg()) { DebugState.PushRegsDumpCompute(base_addr, reinterpret_cast(header), @@ -835,7 +835,7 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { if (rasterizer && (cs_program.dispatch_initiator & 1)) { const auto cmd_address = reinterpret_cast(header); rasterizer->ScopeMarkerBegin(fmt::format("acb[{}]:{}:Dispatch", vqid, cmd_address)); - rasterizer->DispatchIndirect(ib_address, offset, size); + rasterizer->DispatchIndirect(ib_address, 0, size); rasterizer->ScopeMarkerEnd(); } break; diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index e7d6b29e5..135415458 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -796,6 +796,18 @@ struct PM4CmdDispatchIndirect { u32 dispatch_initiator; ///< Dispatch Initiator Register }; +struct PM4CmdDispatchIndirectMec { + PM4Type3Header header; + u32 address0; + u32 address1; + u32 dispatch_initiator; ///< Dispatch Initiator Register + + template + T Address() const { + return reinterpret_cast(address0 | (u64(address1 & 0xffff) << 32u)); + } +}; + struct DrawIndirectArgs { u32 vertex_count_per_instance; u32 instance_count; From 9d3143231cf64b06515563172105893e4d5c659a Mon Sep 17 00:00:00 2001 From: psucien Date: Sat, 4 Jan 2025 22:44:46 +0100 Subject: [PATCH 012/455] macOS build fixed; `indirect_args_addr` moved out from queues context --- src/video_core/amdgpu/liverpool.cpp | 18 +++++++----------- src/video_core/amdgpu/liverpool.h | 3 ++- src/video_core/amdgpu/pm4_cmds.h | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index a59d4a64d..16ed84f74 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -454,7 +454,6 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); const auto offset = draw_indirect->data_offset; - const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr; const auto size = sizeof(DrawIndirectArgs); if (DebugState.DumpingCurrentReg()) { DebugState.PushRegsDump(base_addr, reinterpret_cast(header), regs); @@ -462,7 +461,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndirect", cmd_address)); - rasterizer->DrawIndirect(false, ib_address, offset, size, 1, 0); + rasterizer->DrawIndirect(false, indirect_args_addr, offset, size, 1, 0); rasterizer->ScopeMarkerEnd(); } break; @@ -471,7 +470,6 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); const auto offset = draw_index_indirect->data_offset; - const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr; const auto size = sizeof(DrawIndexedIndirectArgs); if (DebugState.DumpingCurrentReg()) { DebugState.PushRegsDump(base_addr, reinterpret_cast(header), regs); @@ -480,7 +478,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); rasterizer->ScopeMarkerBegin( fmt::format("dcb:{}:DrawIndexIndirect", cmd_address)); - rasterizer->DrawIndirect(true, ib_address, offset, size, 1, 0); + rasterizer->DrawIndirect(true, indirect_args_addr, offset, size, 1, 0); rasterizer->ScopeMarkerEnd(); } break; @@ -489,7 +487,6 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); const auto offset = draw_index_indirect->data_offset; - const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr; if (DebugState.DumpingCurrentReg()) { DebugState.PushRegsDump(base_addr, reinterpret_cast(header), regs); } @@ -497,9 +494,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); rasterizer->ScopeMarkerBegin( fmt::format("dcb:{}:DrawIndexIndirectCountMulti", cmd_address)); - rasterizer->DrawIndirect(true, ib_address, offset, draw_index_indirect->stride, - draw_index_indirect->count, - draw_index_indirect->countAddr); + rasterizer->DrawIndirect( + true, indirect_args_addr, offset, draw_index_indirect->stride, + draw_index_indirect->count, draw_index_indirect->countAddr); rasterizer->ScopeMarkerEnd(); } break; @@ -528,7 +525,6 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); auto& cs_program = GetCsRegs(); const auto offset = dispatch_indirect->data_offset; - const auto ib_address = mapped_queues[GfxQueueId].indirect_args_addr; const auto size = sizeof(PM4CmdDispatchIndirect::GroupDimensions); if (DebugState.DumpingCurrentReg()) { DebugState.PushRegsDumpCompute(base_addr, reinterpret_cast(header), @@ -538,7 +534,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); rasterizer->ScopeMarkerBegin( fmt::format("dcb:{}:DispatchIndirect", cmd_address)); - rasterizer->DispatchIndirect(ib_address, offset, size); + rasterizer->DispatchIndirect(indirect_args_addr, offset, size); rasterizer->ScopeMarkerEnd(); } break; @@ -562,7 +558,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); ASSERT(set_base->base_index == PM4CmdSetBase::BaseIndex::DrawIndexIndirPatchTable); - mapped_queues[GfxQueueId].indirect_args_addr = set_base->Address(); + indirect_args_addr = set_base->Address(); break; } case PM4ItOpcode::EventWrite: { diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 85ea4a75c..0f1783057 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -1479,11 +1479,12 @@ private: std::vector ccb_buffer; std::queue submits{}; ComputeProgram cs_state{}; - VAddr indirect_args_addr{}; }; std::array mapped_queues{}; u32 num_mapped_queues{1u}; // GFX is always available + VAddr indirect_args_addr{}; + struct ConstantEngine { void Reset() { ce_count = 0; diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index 135415458..311f4d4d0 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -804,7 +804,7 @@ struct PM4CmdDispatchIndirectMec { template T Address() const { - return reinterpret_cast(address0 | (u64(address1 & 0xffff) << 32u)); + return std::bit_cast(address0 | (u64(address1 & 0xffff) << 32u)); } }; From 79663789bdac6d40f0ecb69981f84eba53411ac4 Mon Sep 17 00:00:00 2001 From: Mahmoud Adel <94652220+AboMedoz@users.noreply.github.com> Date: Sun, 5 Jan 2025 00:02:37 +0200 Subject: [PATCH 013/455] bump up vector size to 64 in image_info and image_binding (#2055) solves ```boost::bad_alloc``` error when compiling shaders --- src/video_core/renderer_vulkan/vk_rasterizer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 1bbb90b6c..2905c5ddb 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -108,7 +108,7 @@ private: std::pair, 8> cb_descs; std::optional> db_desc; - boost::container::static_vector image_infos; + boost::container::static_vector image_infos; boost::container::static_vector buffer_views; boost::container::static_vector buffer_infos; boost::container::static_vector bound_images; @@ -121,7 +121,7 @@ private: using TexBufferBindingInfo = std::pair; boost::container::static_vector texbuffer_bindings; using ImageBindingInfo = std::pair; - boost::container::static_vector image_bindings; + boost::container::static_vector image_bindings; }; } // namespace Vulkan From 8f33dfe4f17c6f4616bf273f615d5a42a76380cf Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Sun, 5 Jan 2025 14:10:23 +0300 Subject: [PATCH 014/455] infra: require the log to be attched in template --- .github/ISSUE_TEMPLATE/game-bug-report.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/game-bug-report.yaml b/.github/ISSUE_TEMPLATE/game-bug-report.yaml index 2d984b697..a9c669ff9 100644 --- a/.github/ISSUE_TEMPLATE/game-bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/game-bug-report.yaml @@ -89,7 +89,7 @@ body: - type: textarea id: logs attributes: - label: "Logs" - description: Attach any logs here. Log can be found by right clicking on a game name -> Open Folder... -> Open Log Folder. Make sure that the log type is set to `sync`. + label: "Log File" + description: Drag and drop the log file here. It can be found by right clicking on a game name -> Open Folder... -> Open Log Folder. Make sure that the log type is set to `sync`. validations: - required: false + required: true From c0f57df4e67c41de1939fa6d505a12561c0c51bf Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 5 Jan 2025 14:45:54 -0800 Subject: [PATCH 015/455] vk_instance: Enable additional debug tagging if crash diagnostics is enabled. (#2066) --- src/video_core/renderer_vulkan/vk_instance.cpp | 6 ++++-- src/video_core/renderer_vulkan/vk_instance.h | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 790e76400..9bc627830 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -92,13 +92,15 @@ std::string GetReadableVersion(u32 version) { Instance::Instance(bool enable_validation, bool enable_crash_diagnostic) : instance{CreateInstance(Frontend::WindowSystemType::Headless, enable_validation, enable_crash_diagnostic)}, - physical_devices{EnumeratePhysicalDevices(instance)} {} + physical_devices{EnumeratePhysicalDevices(instance)}, + crash_diagnostic{enable_crash_diagnostic} {} Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index, bool enable_validation /*= false*/, bool enable_crash_diagnostic /*= false*/) : instance{CreateInstance(window.GetWindowInfo().type, enable_validation, enable_crash_diagnostic)}, - physical_devices{EnumeratePhysicalDevices(instance)} { + physical_devices{EnumeratePhysicalDevices(instance)}, + crash_diagnostic{enable_crash_diagnostic} { if (enable_validation) { debug_callback = CreateDebugCallback(*instance); } diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 62838140c..4e091824d 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -81,7 +81,7 @@ public: /// Returns true when a known debugging tool is attached. bool HasDebuggingToolAttached() const { - return has_renderdoc || has_nsight_graphics; + return crash_diagnostic || has_renderdoc || has_nsight_graphics; } /// Returns true if anisotropic filtering is supported @@ -338,6 +338,7 @@ private: u32 subgroup_size{}; bool tooling_info{}; bool debug_utils_supported{}; + bool crash_diagnostic{}; bool has_nsight_graphics{}; bool has_renderdoc{}; }; From 4dcd7f027130db873f268de7b1ab80787046cc03 Mon Sep 17 00:00:00 2001 From: Bettehem Date: Mon, 6 Jan 2025 00:46:08 +0200 Subject: [PATCH 016/455] translation: Update Finnish translation (#2057) --- src/qt_gui/translations/fi.ts | 444 +++++++++++++++++----------------- 1 file changed, 222 insertions(+), 222 deletions(-) diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index cdf331796..99c1de67e 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -8,7 +8,7 @@ About shadPS4 - About shadPS4 + Tietoa shadPS4:sta @@ -18,12 +18,12 @@ shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori. This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + Tätä ohjelmistoa ei saa käyttää pelien pelaamiseen, joita et ole hankkinut laillisesti. @@ -31,7 +31,7 @@ Open Folder - Open Folder + Avaa Hakemisto @@ -39,17 +39,17 @@ Loading game list, please wait :3 - Loading game list, please wait :3 + Ole hyvä ja odota, ladataan pelilistaa :3 Cancel - Cancel + Peruuta Loading... - Loading... + Ladataan... @@ -57,12 +57,12 @@ shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Valitse hakemisto Select which directory you want to install to. - Select which directory you want to install to. + Valitse, mihin hakemistoon haluat asentaa. @@ -70,27 +70,27 @@ shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Valitse hakemisto Directory to install games - Directory to install games + Pelien asennushakemisto Browse - Browse + Selaa Error - Error + Virhe The value for location to install games is not valid. - The value for location to install games is not valid. + Peliasennushakemiston sijainti on virheellinen. @@ -98,7 +98,7 @@ Create Shortcut - Create Shortcut + Luo Pikakuvake @@ -108,157 +108,157 @@ SFO Viewer - SFO Viewer + SFO Selain Trophy Viewer - Trophy Viewer + Trophy Selain Open Folder... - Avaa Kansio... + Avaa Hakemisto... Open Game Folder - Avaa Pelikansio + Avaa Pelihakemisto Open Save Data Folder - Avaa Tallennustiedostokansio + Avaa Tallennustiedostohakemisto Open Log Folder - Avaa Lokikansio + Avaa Lokihakemisto Copy info... - Copy info... + Kopioi tietoja... Copy Name - Copy Name + Kopioi Nimi Copy Serial - Copy Serial + Kopioi Sarjanumero Copy All - Copy All + Kopioi kaikki Delete... - Delete... + Poista... Delete Game - Delete Game + Poista Peli Delete Update - Delete Update + Poista Päivitys Delete DLC - Delete DLC + Poista Lisäsisältö Compatibility... - Compatibility... + Yhteensopivuus... Update database - Update database + Päivitä tietokanta View report - View report + Näytä raportti Submit a report - Submit a report + Tee raportti Shortcut creation - Shortcut creation + Pikakuvakkeen luonti Shortcut created successfully! - Shortcut created successfully! + Pikakuvake luotu onnistuneesti! Error - Error + Virhe Error creating shortcut! - Error creating shortcut! + Virhe pikakuvakkeen luonnissa! Install PKG - Install PKG + Asenna PKG Game - Game + Peli requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. + Tämä ominaisuus vaatii, että 'Ota käyttöön erillinen päivityshakemisto' -asetus on päällä. Jos haluat käyttää tätä ominaisuutta, laita se asetus päälle. This game has no update to delete! - This game has no update to delete! + Tällä pelillä ei ole poistettavaa päivitystä! Update - Update + Päivitä This game has no DLC to delete! - This game has no DLC to delete! + Tällä pelillä ei ole poistettavaa lisäsisältöä! DLC - DLC + Lisäsisältö Delete %1 - Delete %1 + Poista %1 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + Haluatko varmasti poistaa %1n %2hakemiston? @@ -266,107 +266,107 @@ Open/Add Elf Folder - Open/Add Elf Folder + Avaa/Lisää Elf Hakemisto Install Packages (PKG) - Install Packages (PKG) + Asenna Paketteja (PKG) Boot Game - Boot Game + Käynnistä Peli Check for Updates - Tarkista päivitykset + Tarkista Päivitykset About shadPS4 - About shadPS4 + Tietoa shadPS4:sta Configure... - Configure... + Asetukset... Install application from a .pkg file - Install application from a .pkg file + Asenna sovellus .pkg tiedostosta Recent Games - Recent Games + Viimeisimmät Pelit Exit - Exit + Sulje Exit shadPS4 - Exit shadPS4 + Sulje shadPS4 Exit the application. - Exit the application. + Sulje sovellus. Show Game List - Show Game List + Avaa pelilista Game List Refresh - Game List Refresh + Päivitä pelilista Tiny - Tiny + Hyvin pieni Small - Small + Pieni Medium - Medium + Keskikokoinen Large - Large + Suuri List View - List View + Listanäkymä Grid View - Grid View + Ruudukkonäkymä Elf Viewer - Elf Viewer + Elf Selain Game Install Directory - Game Install Directory + Peliasennushakemisto @@ -376,52 +376,52 @@ Dump Game List - Dump Game List + Kirjoita Pelilista Tiedostoon PKG Viewer - PKG Viewer + PKG Selain Search... - Search... + Hae... File - File + Tiedosto View - View + Näkymä Game List Icons - Game List Icons + Pelilistan Ikonit Game List Mode - Game List Mode + Pelilistamuoto Settings - Settings + Asetukset Utils - Utils + Työkalut Themes - Themes + Teemat @@ -431,32 +431,32 @@ Dark - Dark + Tumma Light - Light + Vaalea Green - Green + Vihreä Blue - Blue + Sininen Violet - Violet + Violetti toolBar - toolBar + Työkalupalkki @@ -464,7 +464,7 @@ Open Folder - Open Folder + Avaa Hakemisto @@ -472,7 +472,7 @@ Trophy Viewer - Trophy Viewer + Trophy Selain @@ -480,52 +480,52 @@ Settings - Settings + Asetukset General - General + Yleinen System - System + Järjestelmä Console Language - Console Language + Konsolin Kieli Emulator Language - Emulator Language + Emulaattorin Kieli Emulator - Emulator + Emulaattori Enable Fullscreen - Enable Fullscreen + Ota Käyttöön Koko Ruudun Tila Enable Separate Update Folder - Enable Separate Update Folder + Ota Käyttöön Erillinen Päivityshakemisto Show Splash - Show Splash + Näytä Aloitusnäyttö Is PS4 Pro - Is PS4 Pro + On PS4 Pro @@ -535,12 +535,12 @@ Username - Username + Käyttäjänimi Trophy Key - Trophy Key + Trophy Avain @@ -550,17 +550,17 @@ Logger - Logger + Lokinkerääjä Log Type - Log Type + Lokin Tyyppi Log Filter - Log Filter + Lokisuodatin @@ -575,12 +575,12 @@ Hide Cursor - Piilota kursor + Piilota Kursori Hide Cursor Idle Timeout - Inaktiivisuuden aikaraja kursorin piilottamiselle + Inaktiivisuuden Aikaraja Kursorin Piilottamiseen @@ -595,47 +595,47 @@ Back Button Behavior - Takaisin-painikkeen käyttäytyminen + Takaisin-painikkeen Käyttäytyminen Graphics - Graphics + Grafiikka Graphics Device - Graphics Device + Näytönohjain Width - Width + Leveys Height - Height + Korkeus Vblank Divider - Vblank Divider + Vblank jakaja Advanced - Advanced + Lisäasetukset Enable Shaders Dumping - Enable Shaders Dumping + Ota Käyttöön Varjostinvedokset Enable NULL GPU - Enable NULL GPU + Ota Käyttöön NULL GPU @@ -660,27 +660,27 @@ Debug - Debug + Virheenkorjaus Enable Debug Dumping - Enable Debug Dumping + Ota Käyttöön Virheenkorjausvedokset Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Ota Käyttöön Vulkan-validointikerrokset Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Ota Käyttöön Vulkan-synkronointivalidointi Enable RenderDoc Debugging - Enable RenderDoc Debugging + Ota Käyttöön RenderDoc Virheenkorjaus @@ -690,7 +690,7 @@ Check for Updates at Startup - Tarkista päivitykset alussa + Tarkista Päivitykset Käynnistäessä @@ -700,42 +700,42 @@ Check for Updates - Tarkista päivitykset + Tarkista Päivitykset GUI Settings - GUI-Asetukset + GUI-asetukset Disable Trophy Pop-ups - Disable Trophy Pop-ups + Poista Trophy Pop-upit Käytöstä Play title music - Soita otsikkomusiikkia + Soita Otsikkomusiikkia Update Compatibility Database On Startup - Update Compatibility Database On Startup + Päivitä Yhteensopivuustietokanta Käynnistäessä Game Compatibility - Game Compatibility + Peliyhteensopivuus Display Compatibility Data - Display Compatibility Data + Näytä Yhteensopivuustiedot Update Compatibility Database - Update Compatibility Database + Päivitä Yhteensopivuustietokanta @@ -745,7 +745,7 @@ Audio Backend - Audio Backend + Äänijärjestelmä @@ -758,22 +758,22 @@ * Unsupported Vulkan Version - * Tuettu Vulkan-versio + * Ei Tuettu Vulkan-versio Download Cheats For All Installed Games - Lataa huijaukset kaikille asennetuille peleille + Lataa Huijaukset Kaikille Asennetuille Peleille Download Patches For All Games - Lataa korjaukset kaikille peleille + Lataa Paikkaukset Kaikille Peleille Download Complete - Lataus valmis + Lataus Valmis @@ -783,12 +783,12 @@ Patches Downloaded Successfully! - Korjaukset ladattu onnistuneesti! + Paikkaukset Ladattu Onnistuneesti! All Patches available for all games have been downloaded. - Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu. + Kaikki saatavilla olevat Paikkaukset kaikille peleille on ladattu. @@ -808,12 +808,12 @@ Game Boot - Pelin käynnistys + Pelin Käynnistys Only one file can be selected! - Vain yksi tiedosto voidaan valita! + Vain yksi tiedosto voi olla valittuna! @@ -848,22 +848,22 @@ Would you like to install Patch: - Haluatko asentaa päivityksen: + Haluatko asentaa Päivityksen: DLC Installation - DLC-asennus + Lisäsisällön asennus Would you like to install DLC: %1? - Haluatko asentaa DLC:n: %1? + Haluatko asentaa lisäsisällön: %1? DLC already installed: - DLC on jo asennettu: + Lisäsisältö on jo asennettu: @@ -873,7 +873,7 @@ PKG is a patch, please install the game first! - PKG on korjaus, asenna peli ensin! + PKG on päivitys, asenna peli ensin! @@ -888,7 +888,7 @@ Extraction Finished - Purku valmis + Purku Valmis @@ -906,12 +906,12 @@ Cheats / Patches for - Cheats / Patches for + Huijaukset / Paikkaukset pelille defaultTextEdit_MSG - Cheats/Patches ovat kokeellisia.\nKäytä varoen.\n\nLataa cheats yksitellen valitsemalla repositorio ja napsauttamalla latauspainiketta.\nPatches-välilehdellä voit ladata kaikki patchit kerralla, valita, mitä haluat käyttää, ja tallentaa valinnan.\n\nKoska emme kehitä Cheats/Patches,\nilmoita ongelmista cheatin tekijälle.\n\nLuo uusi cheat? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats + Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats @@ -936,27 +936,27 @@ Select Cheat File: - Valitse huijaustiedosto: + Valitse Huijaustiedosto: Repository: - Repo: + Repositorio: Download Cheats - Lataa huijaukset + Lataa Huijaukset Delete File - Poista tiedosto + Poista Tiedosto No files selected. - Ei tiedostoja valittu. + Tiedostoja ei ole valittuna. @@ -971,12 +971,12 @@ Select Patch File: - Valitse korjaustiedosto: + Valitse Paikkaustiedosto: Download Patches - Lataa korjaukset + Lataa Paikkaukset @@ -991,7 +991,7 @@ Patches - Korjaukset + Paikkaukset @@ -1001,7 +1001,7 @@ No patch selected. - Ei korjausta valittu. + Paikkausta ei ole valittuna. @@ -1011,7 +1011,7 @@ No patch file found for the current serial. - Nykyiselle sarjanumerolle ei löytynyt korjaustiedostoa. + Nykyiselle sarjanumerolle ei löytynyt paikkaustiedostoa. @@ -1031,7 +1031,7 @@ Success - Onnistui + Onnistuminen @@ -1041,7 +1041,7 @@ Invalid Source - Virheellinen lähde + Virheellinen Lähde @@ -1051,7 +1051,7 @@ File Exists - Tiedosto on olemassa + Olemassaoleva Tiedosto @@ -1071,22 +1071,22 @@ Cheats Not Found - Huijauksia ei löytynyt + Huijauksia Ei Löytynyt CheatsNotFound_MSG - Huijauksia ei löytynyt tälle pelille tämän version valitusta repositoriosta, yritä toista repositoriota tai pelin eri versiota. + Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. Cheats Downloaded Successfully - Huijaukset ladattu onnistuneesti + Huijaukset Ladattu Onnistuneesti CheatsDownloadedSuccessfully_MSG - Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta, jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston luettelosta. + Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. @@ -1096,7 +1096,7 @@ Failed to download: - Lataaminen epäonnistui: + Lataus epäonnistui: @@ -1106,7 +1106,7 @@ DownloadComplete_MSG - Korjaukset ladattu onnistuneesti! Kaikki saatavilla olevat korjaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille kuten huijauksissa. Jos päivitystä ei näy, se saattaa olla, että sitä ei ole saatavilla tietylle sarjanumerolle ja peliversiolle. + Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. @@ -1126,12 +1126,12 @@ The downloaded patch only works on version: %1 - ladattu päivitys toimii vain versiossa: %1 + Ladattu paikkaus toimii vain versiossa: %1 You may need to update your game. - Sinun on ehkä päivitettävä peliäsi. + Sinun on ehkä päivitettävä pelisi. @@ -1161,7 +1161,7 @@ Directory does not exist: - Kansiota ei ole olemassa: + Hakemistoa ei ole olemassa: @@ -1176,7 +1176,7 @@ Can't apply cheats before the game is started - Ei voi käyttää huijauksia ennen kuin peli on aloitettu. + Huijauksia ei voi käyttää ennen kuin peli on käynnissä. @@ -1189,12 +1189,12 @@ Apply - Ota käyttöön + Ota Käyttöön Restore Defaults - Palauta oletukset + Palauta Oletukset @@ -1204,12 +1204,12 @@ Point your mouse at an option to display its description. - Siirrä hiiri vaihtoehdon päälle näyttämään sen kuvaus. + Siirrä hiiri vaihtoehdon päälle näyttääksesi sen kuvauksen. consoleLanguageGroupBox - Konsoli Kieli:\nAseta PS4 pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. + Konsolin Kieli:\nAseta PS4-pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. @@ -1219,22 +1219,22 @@ fullscreenCheckBox - Ota Täysikokoisuus käyttöön:\nSiirtää pelin ikkunan automaattisesti täysikokoiseen tilaan.\nTätä voidaan vaihtaa painamalla F11-näppäintä. + Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. showSplashCheckBox - Näytä Alkunäyttö:\nNäyttää pelin alkunäytön (erityinen kuva) pelin käynnistyessä. + Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. ps4proCheckBox - Onko PS4 Pro:\nAsettaa emulaattorin toimimaan PS4 PRO:na, mikä voi mahdollistaa erityisiä ominaisuuksia peleissä, jotka tukevat sitä. + On PS4 Pro:\nAsettaa emulaattorin toimimaan PS4 PRO:na, mikä voi mahdollistaa erityisiä ominaisuuksia peleissä, jotka tukevat sitä. @@ -1244,12 +1244,12 @@ userName - Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissakin peleissä. + Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissain peleissä. TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Avain:\nThrophyjen dekryptoinnissa käytetty avain. Pitää hankkia jailbreakatusta konsolista.\nSaa sisältää vain hex-merkkejä. @@ -1259,12 +1259,12 @@ logFilter - Lokifiltteri:\nSuodattaa lokia tulostamaan vain erityistä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tasot: Jälki, Virheenkorjaus, Tieto, Varoitus, Virhe, Kriittinen - tällä järjestyksellä, tietty taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. + Lokisuodatin:\nSuodattaa lokia tulostamaan vain määrättyä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nTasot: Trace, Debug, Info, Warning, Error, Critical - tässä järjestyksessä. Valittu taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. updaterGroupBox - Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan joka kuukausi ja voivat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne voivat sisältää bugeja ja ovat vähemmän vakaita. + Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. @@ -1274,17 +1274,17 @@ disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Poista Trophy Pop-upit Käytöstä:\nPoista trophy ilmoitukset pelin aikana. Trophyjen edistystä voi silti seurata Trophy Selainta käyttämällä (klikkaa peliä hiiren oikealla emulaattorin pääikkunassa). hideCursorGroupBox - Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nAktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. + Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nInaktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. idleTimeoutGroupBox - Aseta aika, jolloin hiiri häviää oltuaan aktiivinen. + Aseta aika, milloin hiiri häviää oltuaan aktiivinen. @@ -1294,17 +1294,17 @@ enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön "Päivitä Yhteensopivuustietokanta Käynnistäessä" saadaksesi ajantasaista tietoa. checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Päivitä Yhteensopivuustiedot Käynnistäessä:\nPäivitä yhteensopivuustiedot automaattisesti shadPS4:n käynnistyessä. updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. @@ -1314,27 +1314,27 @@ Idle - Odotustila + Inaktiivinen Always - aina + Aina Touchpad Left - Kosketuslevy Vasemmalla + Kosketuslevyn Vasen Puoli Touchpad Right - Kosketuslevy Oikealla + Kosketuslevyn Oikea Puoli Touchpad Center - Kosketuslevy Keskellä + Kosketuslevyn Keskikohta @@ -1344,62 +1344,62 @@ graphicsAdapterGroupBox - Kuvakortti:\nValitse GPU, jota emulaattori käyttää monigpu-järjestelmissä pudotusvalikosta,\n tai valitse "Auto Select" automaattiseen määrittämiseen. + Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse "Auto Select" automaattiseen määritykseen. resolutionLayout - Leveys/Korkeus:\nAsettaa emulaattorin ikkunan koon käynnistyksen aikana, jota voidaan muuttaa pelin aikana.\nTämä on eri kuin pelin sisäinen resoluutio. + Leveys/Korkeus:\nAsettaa käynnistetyn emulaattori-ikkunan koon, jota voidaan muuttaa pelin aikana.\nTämä on eri, kuin pelin sisäinen resoluutio. heightDivider - Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten pelin nopeuden lisääminen tai kriittisten pelitoimintojen rikkoutuminen, jotka eivät odota tämän muuttuvan! + Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten lisätä pelin nopeutta tai rikkoa kriittisiä pelitoimintoja, jotka eivät odota tämän muuttuvan! dumpShadersCheckBox - Ota Shadersin dumpaus käyttöön:\nTeknistä vianetsintää varten pelin shadereita tallennetaan kansioon niiden renderöinnin aikana. + Ota Käyttöön Varjostinvedokset:\nTeknistä vianetsintää varten. Pelin varjostimia tallennetaan hakemistoon niiden renderöityessä. nullGpuCheckBox - Ota Null GPU käyttöön:\nTeknistä vianetsintää varten pelin renderöinti estetään niin, että ikään kuin grafiikkakorttia ei olisi. + Ota Null GPU käyttöön:\nTeknistä vianetsintää varten. Pelin renderöinti estetään, ikään kuin näytönohjainta ei olisi. gameFoldersBox - Pelihakemistot:\nLuettelo hakemistoista asennettujen pelien tarkistamiseksi. + Pelihakemistot:\nLista hakemistoista, joista pelejä haetaan. addFolderButton - Lisää:\nLisää hakemisto luetteloon. + Lisää:\nLisää hakemisto listalle. removeFolderButton - Poista:\nPoista hakemisto luettelosta. + Poista:\nPoista hakemisto listalta. debugDump - Ota Debug Dumpaus käyttöön:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. + Ota Käyttöön Virheenkorjausvedokset:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. vkValidationCheckBox - Ota Vulkanin Validointikerrokset käyttöön:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + Ota Käyttöön Vulkan-validointikerrokset:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. vkSyncValidationCheckBox - Ota Vulkanin Synkronointivalaistus käyttöön:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + Ota Käyttöön Vulkan-synkronointivalidointi:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. rdocCheckBox - Ota RenderDoc Debugging käyttöön:\nJos se on käytössä, emulaattori tarjoaa yhteensopivuuden Renderdocin kanssa, mikä mahdollistaa nykyisen renderöidyn kehyksen tallennuksen ja analysoinnin. + Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. @@ -1457,7 +1457,7 @@ Never Played - Never Played + Pelaamaton @@ -1477,32 +1477,32 @@ Compatibility is untested - Compatibility is untested + Yhteensopivuutta ei ole testattu Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Peli ei alustaudu kunnolla / kaataa emulaattorin Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Peli käynnistyy, mutta näyttää vain tyhjän ruudun Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Peli näyttää kuvan mutta ei mene valikosta eteenpäin Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Pelissä on pelikokemusta rikkovia häiriöitä tai kelvoton suorituskyky Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Pelillä on hyväksyttävä suorituskyky, eikä mitään suuria häiriöitä @@ -1510,7 +1510,7 @@ Auto Updater - Automaattinen päivitys + Automaattinen Päivitys @@ -1525,7 +1525,7 @@ Failed to parse update information. - Päivitysinformaation jäsentäminen epäonnistui. + Päivitystietojen jäsentäminen epäonnistui. @@ -1540,7 +1540,7 @@ No download URL found for the specified asset. - Ei lataus-URL:ia löytynyt määritetylle omaisuudelle. + Lataus-URL:ia ei löytynyt määritetylle omaisuudelle. @@ -1550,7 +1550,7 @@ Update Available - Päivitys saatavilla + Päivitys Saatavilla @@ -1560,12 +1560,12 @@ Current Version - Nykyinen versio + Nykyinen Versio Latest Version - Uusin versio + Uusin Versio @@ -1575,12 +1575,12 @@ Show Changelog - Näytä muutospäiväkirja + Näytä Muutoshistoria Check for Updates at Startup - Tarkista päivitykset alussa + Tarkista Päivitykset Käynnistettäessä @@ -1595,22 +1595,22 @@ Hide Changelog - Piilota muutospäiväkirja + Piilota Muutoshistoria Changes - Muutos + Muutokset Network error occurred while trying to access the URL - Verkkovirhe tapahtui yrittäessäsi päästä URL-osoitteeseen + URL-osoitteeseen yhdistettäessä tapahtui verkkovirhe Download Complete - Download valmis + Lataus Valmis @@ -1620,12 +1620,12 @@ Failed to save the update file at - Päivitystiedoston tallentaminen epäonnistui osoitteeseen + Päivitystiedoston tallentaminen epäonnistui sijaintiin Starting Update... - Aloitetaan päivitys... + Aloitetaan päivitystä... @@ -1661,4 +1661,4 @@ TB - \ No newline at end of file + From e5f638b378393bc87ed444c1047a8b833a5b6288 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:46:26 -0600 Subject: [PATCH 017/455] fix scePlayGoGetLocus (#2067) Due to an issue with the if statement, scePlayGoGetLocus outputs an extra locus compared to real hardware. --- src/core/libraries/playgo/playgo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/playgo/playgo.cpp b/src/core/libraries/playgo/playgo.cpp index 848533ff7..ade2ee496 100644 --- a/src/core/libraries/playgo/playgo.cpp +++ b/src/core/libraries/playgo/playgo.cpp @@ -157,7 +157,7 @@ s32 PS4_SYSV_ABI scePlayGoGetLocus(OrbisPlayGoHandle handle, const OrbisPlayGoCh } for (int i = 0; i < numberOfEntries; i++) { - if (chunkIds[i] <= playgo->chunks.size()) { + if (chunkIds[i] < playgo->chunks.size()) { outLoci[i] = OrbisPlayGoLocus::LocalFast; } else { outLoci[i] = OrbisPlayGoLocus::NotDownloaded; From 887938042702821bfd858480517d1c8ff89c157b Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 5 Jan 2025 15:08:27 -0800 Subject: [PATCH 018/455] shader_recompiler: Implement S_BITSET(0/1)_B32 (#2039) --- .../frontend/translate/scalar_alu.cpp | 11 +++++++++++ src/shader_recompiler/frontend/translate/translate.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index e18cda012..7f34126f5 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -106,6 +106,10 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { return S_FF1_I32_B32(inst); case Opcode::S_FF1_I32_B64: return S_FF1_I32_B64(inst); + case Opcode::S_BITSET0_B32: + return S_BITSET_B32(inst, 0); + case Opcode::S_BITSET1_B32: + return S_BITSET_B32(inst, 1); case Opcode::S_AND_SAVEEXEC_B64: return S_SAVEEXEC_B64(NegateMode::None, false, inst); case Opcode::S_ORN2_SAVEEXEC_B64: @@ -607,6 +611,13 @@ void Translator::S_FF1_I32_B64(const GcnInst& inst) { SetDst(inst.dst[0], result); } +void Translator::S_BITSET_B32(const GcnInst& inst, u32 bit_value) { + const IR::U32 old_value{GetSrc(inst.dst[0])}; + const IR::U32 offset{ir.BitFieldExtract(GetSrc(inst.src[0]), ir.Imm32(0U), ir.Imm32(5U))}; + const IR::U32 result{ir.BitFieldInsert(old_value, ir.Imm32(bit_value), offset, ir.Imm32(1U))}; + SetDst(inst.dst[0], result); +} + void Translator::S_SAVEEXEC_B64(NegateMode negate, bool is_or, const GcnInst& inst) { // This instruction normally operates on 64-bit data (EXEC, VCC, SGPRs) // However here we flatten it to 1-bit EXEC and 1-bit VCC. For the destination diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 9da0844e4..7a0b736d4 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -114,6 +114,7 @@ public: void S_BCNT1_I32_B64(const GcnInst& inst); void S_FF1_I32_B32(const GcnInst& inst); void S_FF1_I32_B64(const GcnInst& inst); + void S_BITSET_B32(const GcnInst& inst, u32 bit_value); void S_GETPC_B64(u32 pc, const GcnInst& inst); void S_SAVEEXEC_B64(NegateMode negate, bool is_or, const GcnInst& inst); void S_ABS_I32(const GcnInst& inst); From 7cdeb516706a2659232305808bd3fbdbcad2bf6c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 6 Jan 2025 05:31:25 -0800 Subject: [PATCH 019/455] renderer_vulkan: Add debug names to pipelines. (#2069) --- .../renderer_vulkan/vk_compute_pipeline.cpp | 6 +++++- .../renderer_vulkan/vk_graphics_pipeline.cpp | 5 ++++- .../renderer_vulkan/vk_pipeline_common.cpp | 16 ++++++++++++++++ .../renderer_vulkan/vk_pipeline_common.h | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 71659c06c..b24767e8a 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -18,6 +18,7 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler : Pipeline{instance_, scheduler_, desc_heap_, pipeline_cache, true}, compute_key{compute_key_} { auto& info = stages[int(Shader::LogicalStage::Compute)]; info = &info_; + const auto debug_str = GetDebugString(); const vk::PipelineShaderStageCreateInfo shader_ci = { .stage = vk::ShaderStageFlagBits::eCompute, @@ -89,8 +90,9 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler .bindingCount = static_cast(bindings.size()), .pBindings = bindings.data(), }; + const auto device = instance.GetDevice(); auto [descriptor_set_result, descriptor_set] = - instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); + device.createDescriptorSetLayoutUnique(desc_layout_ci); ASSERT_MSG(descriptor_set_result == vk::Result::eSuccess, "Failed to create compute descriptor set layout: {}", vk::to_string(descriptor_set_result)); @@ -107,6 +109,7 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler ASSERT_MSG(layout_result == vk::Result::eSuccess, "Failed to create compute pipeline layout: {}", vk::to_string(layout_result)); pipeline_layout = std::move(layout); + SetObjectName(device, *pipeline_layout, "Compute PipelineLayout {}", debug_str); const vk::ComputePipelineCreateInfo compute_pipeline_ci = { .stage = shader_ci, @@ -117,6 +120,7 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler ASSERT_MSG(pipeline_result == vk::Result::eSuccess, "Failed to create compute pipeline: {}", vk::to_string(pipeline_result)); pipeline = std::move(pipe); + SetObjectName(device, *pipeline, "Compute Pipeline {}", debug_str); } ComputePipeline::~ComputePipeline() = default; diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index ffa474a1c..0ca1bed8b 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -8,7 +8,6 @@ #include "common/assert.h" #include "common/io_file.h" -#include "common/scope_exit.h" #include "shader_recompiler/backend/spirv/emit_spirv_quad_rect.h" #include "shader_recompiler/frontend/fetch_shader.h" #include "shader_recompiler/runtime_info.h" @@ -16,6 +15,7 @@ #include "video_core/buffer_cache/buffer_cache.h" #include "video_core/renderer_vulkan/vk_graphics_pipeline.h" #include "video_core/renderer_vulkan/vk_instance.h" +#include "video_core/renderer_vulkan/vk_pipeline_cache.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_shader_util.h" #include "video_core/texture_cache/texture_cache.h" @@ -36,6 +36,7 @@ GraphicsPipeline::GraphicsPipeline( const vk::Device device = instance.GetDevice(); std::ranges::copy(infos, stages.begin()); BuildDescSetLayout(); + const auto debug_str = GetDebugString(); const vk::PushConstantRange push_constants = { .stageFlags = gp_stage_flags, @@ -54,6 +55,7 @@ GraphicsPipeline::GraphicsPipeline( ASSERT_MSG(layout_result == vk::Result::eSuccess, "Failed to create graphics pipeline layout: {}", vk::to_string(layout_result)); pipeline_layout = std::move(layout); + SetObjectName(device, *pipeline_layout, "Graphics PipelineLayout {}", debug_str); boost::container::static_vector vertex_bindings; boost::container::static_vector vertex_attributes; @@ -322,6 +324,7 @@ GraphicsPipeline::GraphicsPipeline( ASSERT_MSG(pipeline_result == vk::Result::eSuccess, "Failed to create graphics pipeline: {}", vk::to_string(pipeline_result)); pipeline = std::move(pipe); + SetObjectName(device, *pipeline, "Graphics Pipeline {}", debug_str); } GraphicsPipeline::~GraphicsPipeline() = default; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp index 6b48a40a0..91f53109e 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp @@ -6,6 +6,7 @@ #include "shader_recompiler/info.h" #include "video_core/buffer_cache/buffer_cache.h" #include "video_core/renderer_vulkan/vk_instance.h" +#include "video_core/renderer_vulkan/vk_pipeline_cache.h" #include "video_core/renderer_vulkan/vk_pipeline_common.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/texture_cache/texture_cache.h" @@ -55,4 +56,19 @@ void Pipeline::BindResources(DescriptorWrites& set_writes, const BufferBarriers& cmdbuf.bindDescriptorSets(bind_point, *pipeline_layout, 0, desc_set, {}); } +std::string Pipeline::GetDebugString() const { + std::string stage_desc; + for (const auto& stage : stages) { + if (stage) { + const auto shader_name = PipelineCache::GetShaderName(stage->stage, stage->pgm_hash); + if (stage_desc.empty()) { + stage_desc = shader_name; + } else { + stage_desc = fmt::format("{},{}", stage_desc, shader_name); + } + } + } + return stage_desc; +} + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.h b/src/video_core/renderer_vulkan/vk_pipeline_common.h index 1b13a1797..f71631da0 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_common.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.h @@ -61,6 +61,8 @@ public: const Shader::PushData& push_data) const; protected: + [[nodiscard]] std::string GetDebugString() const; + const Instance& instance; Scheduler& scheduler; DescriptorHeap& desc_heap; From fb67d948b63bc0298f8fd4597a18e2994df5d426 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 6 Jan 2025 05:31:45 -0800 Subject: [PATCH 020/455] vk_resource_pool: Handle eErrorFragmentedPool. (#2071) --- src/video_core/renderer_vulkan/vk_resource_pool.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_resource_pool.cpp b/src/video_core/renderer_vulkan/vk_resource_pool.cpp index 25a134528..dba603e71 100644 --- a/src/video_core/renderer_vulkan/vk_resource_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_resource_pool.cpp @@ -153,7 +153,8 @@ vk::DescriptorSet DescriptorHeap::Commit(vk::DescriptorSetLayout set_layout) { } // The pool has run out. Record current tick and place it in pending list. - ASSERT_MSG(result == vk::Result::eErrorOutOfPoolMemory, + ASSERT_MSG(result == vk::Result::eErrorOutOfPoolMemory || + result == vk::Result::eErrorFragmentedPool, "Unexpected error during descriptor set allocation {}", vk::to_string(result)); pending_pools.emplace_back(curr_pool, master_semaphore->CurrentTick()); if (const auto [pool, tick] = pending_pools.front(); master_semaphore->IsFree(tick)) { From 121328ecedc6bcbe1eb319308f621df8a8b28f09 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 6 Jan 2025 18:45:53 +0200 Subject: [PATCH 021/455] dummy sceMouse module and change sceMouseRead to debug to reduce spam (#2074) --- CMakeLists.txt | 2 + src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/libs.cpp | 2 + src/core/libraries/mouse/mouse.cpp | 99 ++++++++++++++++++++++++++++++ src/core/libraries/mouse/mouse.h | 29 +++++++++ 6 files changed, 134 insertions(+) create mode 100644 src/core/libraries/mouse/mouse.cpp create mode 100644 src/core/libraries/mouse/mouse.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 36ebbf583..886824934 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -336,6 +336,8 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp src/core/libraries/share_play/shareplay.h src/core/libraries/razor_cpu/razor_cpu.cpp src/core/libraries/razor_cpu/razor_cpu.h + src/core/libraries/mouse/mouse.cpp + src/core/libraries/mouse/mouse.h ) set(VIDEOOUT_LIB src/core/libraries/videoout/buffer.h diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index a2fd2c0a4..5ee2dce73 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -126,6 +126,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, Vdec2) \ SUB(Lib, Videodec) \ SUB(Lib, RazorCpu) \ + SUB(Lib, Mouse) \ CLS(Frontend) \ CLS(Render) \ SUB(Render, Vulkan) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 5b496d175..6829e2d1b 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -93,6 +93,7 @@ enum class Class : u8 { Lib_Vdec2, ///< The LibSceVideodec2 implementation. Lib_Videodec, ///< The LibSceVideodec implementation. Lib_RazorCpu, ///< The LibRazorCpu implementation. + Lib_Mouse, ///< The LibSceMouse implementation Frontend, ///< Emulator UI Render, ///< Video Core Render_Vulkan, ///< Vulkan backend diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 49cd54a5b..69728e523 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -18,6 +18,7 @@ #include "core/libraries/libc_internal/libc_internal.h" #include "core/libraries/libpng/pngdec.h" #include "core/libraries/libs.h" +#include "core/libraries/mouse/mouse.h" #include "core/libraries/move/move.h" #include "core/libraries/network/http.h" #include "core/libraries/network/net.h" @@ -97,6 +98,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::Move::RegisterlibSceMove(sym); Libraries::Fiber::RegisterlibSceFiber(sym); Libraries::JpegEnc::RegisterlibSceJpegEnc(sym); + Libraries::Mouse::RegisterlibSceMouse(sym); } } // namespace Libraries diff --git a/src/core/libraries/mouse/mouse.cpp b/src/core/libraries/mouse/mouse.cpp new file mode 100644 index 000000000..dffd2346c --- /dev/null +++ b/src/core/libraries/mouse/mouse.cpp @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +// Generated By moduleGenerator +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "mouse.h" + +namespace Libraries::Mouse { + +int PS4_SYSV_ABI sceMouseClose() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseConnectPort() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseDebugGetDeviceId() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseDeviceOpen() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseDisconnectDevice() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseDisconnectPort() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseGetDeviceInfo() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseInit() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseMbusInit() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseOpen() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseRead() { + LOG_DEBUG(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseSetHandType() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseSetPointerSpeed() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceMouseSetProcessPrivilege() { + LOG_ERROR(Lib_Mouse, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceMouse(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("cAnT0Rw-IwU", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseClose); + LIB_FUNCTION("Ymyy1HSSJLQ", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseConnectPort); + LIB_FUNCTION("BRXOoXQtb+k", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDebugGetDeviceId); + LIB_FUNCTION("WiGKINCZWkc", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDeviceOpen); + LIB_FUNCTION("eDQTFHbgeTU", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDisconnectDevice); + LIB_FUNCTION("jJP1vYMEPd4", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseDisconnectPort); + LIB_FUNCTION("QA9Qupz3Zjw", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseGetDeviceInfo); + LIB_FUNCTION("Qs0wWulgl7U", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseInit); + LIB_FUNCTION("1FeceR5YhAo", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseMbusInit); + LIB_FUNCTION("RaqxZIf6DvE", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseOpen); + LIB_FUNCTION("x8qnXqh-tiM", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseRead); + LIB_FUNCTION("crkFfp-cmFo", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseSetHandType); + LIB_FUNCTION("ghLUU2Z5Lcg", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseSetPointerSpeed); + LIB_FUNCTION("6aANndpS0Wo", "libSceMouse", 1, "libSceMouse", 1, 1, sceMouseSetProcessPrivilege); +}; + +} // namespace Libraries::Mouse \ No newline at end of file diff --git a/src/core/libraries/mouse/mouse.h b/src/core/libraries/mouse/mouse.h new file mode 100644 index 000000000..8264f62e0 --- /dev/null +++ b/src/core/libraries/mouse/mouse.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Mouse { + +int PS4_SYSV_ABI sceMouseClose(); +int PS4_SYSV_ABI sceMouseConnectPort(); +int PS4_SYSV_ABI sceMouseDebugGetDeviceId(); +int PS4_SYSV_ABI sceMouseDeviceOpen(); +int PS4_SYSV_ABI sceMouseDisconnectDevice(); +int PS4_SYSV_ABI sceMouseDisconnectPort(); +int PS4_SYSV_ABI sceMouseGetDeviceInfo(); +int PS4_SYSV_ABI sceMouseInit(); +int PS4_SYSV_ABI sceMouseMbusInit(); +int PS4_SYSV_ABI sceMouseOpen(); +int PS4_SYSV_ABI sceMouseRead(); +int PS4_SYSV_ABI sceMouseSetHandType(); +int PS4_SYSV_ABI sceMouseSetPointerSpeed(); +int PS4_SYSV_ABI sceMouseSetProcessPrivilege(); + +void RegisterlibSceMouse(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Mouse \ No newline at end of file From 6f3c767b99d815dc99417366f3d26118822a5706 Mon Sep 17 00:00:00 2001 From: Daniel Nylander Date: Mon, 6 Jan 2025 22:10:15 +0100 Subject: [PATCH 022/455] Adding Swedish translation (#2075) --- src/qt_gui/translations/sv.ts | 1336 +++++++++++++++++++++++++++++++++ 1 file changed, 1336 insertions(+) create mode 100644 src/qt_gui/translations/sv.ts diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts new file mode 100644 index 000000000..756119ba4 --- /dev/null +++ b/src/qt_gui/translations/sv.ts @@ -0,0 +1,1336 @@ + + + + + + AboutDialog + + About shadPS4 + Om shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 är en experimentell emulator för PlayStation 4 baserad på öppen källkod. + + + This software should not be used to play games you have not legally obtained. + Denna programvara bör inte användas för att spela spel som du inte legalt äger. + + + + ElfViewer + + Open Folder + Öppna mapp + + + + GameInfoClass + + Loading game list, please wait :3 + Läser in spellistan, vänta :3 + + + Cancel + Avbryt + + + Loading... + Läser in... + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Välj katalog + + + Select which directory you want to install to. + Välj vilken katalog som du vill installera till. + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Välj katalog + + + Directory to install games + Katalog att installera spel till + + + Browse + Bläddra + + + Error + Fel + + + The value for location to install games is not valid. + Värdet för platsen att installera spel till är inte giltig. + + + + GuiContextMenus + + Create Shortcut + Skapa genväg + + + Cheats / Patches + Fusk / Patchar + + + SFO Viewer + SFO-visare + + + Trophy Viewer + Trofé-visare + + + Open Folder... + Öppna mapp... + + + Open Game Folder + Öppna spelmapp + + + Open Save Data Folder + Öppna mapp för sparat data + + + Open Log Folder + Öppna loggmapp + + + Copy info... + Kopiera till... + + + Copy Name + Kopiera namn + + + Copy Serial + Kopiera serienummer + + + Copy All + Kopiera alla + + + Delete... + Ta bort... + + + Delete Game + Ta bort spel + + + Delete Update + Ta bort uppdatering + + + Delete DLC + Ta bort DLC + + + Compatibility... + Kompatibilitet... + + + Update database + Uppdatera databasen + + + View report + Visa rapport + + + Submit a report + Skicka en rapport + + + Shortcut creation + Skapa genväg + + + Shortcut created successfully! + Genvägen skapades! + + + Error + Fel + + + Error creating shortcut! + Fel vid skapandet av genväg! + + + Install PKG + Installera PKG + + + Game + Spel + + + requiresEnableSeparateUpdateFolder_MSG + Denna funktion kräver konfigurationsalternativet 'Aktivera separat uppdateringsmapp' för att fungera. Om du vill använda denna funktion, aktivera den + + + This game has no update to delete! + Detta spel har ingen uppdatering att ta bort! + + + Update + Uppdatera + + + This game has no DLC to delete! + Detta spel har inga DLC att ta bort! + + + DLC + DLC + + + Delete %1 + Ta bort %1 + + + Are you sure you want to delete %1's %2 directory? + Är du säker på att du vill ta bort %1s %2-katalog? + + + + MainWindow + + Open/Add Elf Folder + Öppna/Lägg till Elf-mapp + + + Install Packages (PKG) + Installera paket (PKG) + + + Boot Game + Starta spel + + + Check for Updates + Leta efter uppdateringar + + + About shadPS4 + Om shadPS4 + + + Configure... + Konfigurera... + + + Install application from a .pkg file + Installera program från en .pkg-fil + + + Recent Games + Senaste spel + + + Exit + Avsluta + + + Exit shadPS4 + Avsluta shadPS4 + + + Exit the application. + Avsluta programmet. + + + Show Game List + Visa spellista + + + Game List Refresh + Uppdatera spellista + + + Tiny + Mycket små + + + Small + Små + + + Medium + Medel + + + Large + Stora + + + List View + Listvy + + + Grid View + Rutnätsvy + + + Elf Viewer + Elf-visare + + + Game Install Directory + Installationskatalog för spel + + + Download Cheats/Patches + Hämta fusk/patchar + + + Dump Game List + Dumpa spellista + + + PKG Viewer + PKG-visare + + + Search... + Sök... + + + File + Arkiv + + + View + Visa + + + Game List Icons + Ikoner för spellista + + + Game List Mode + Läge för spellista + + + Settings + Inställningar + + + Utils + Verktyg + + + Themes + Teman + + + Help + Hjälp + + + Dark + Mörk + + + Light + Ljus + + + Green + Grön + + + Blue + Blå + + + Violet + Lila + + + toolBar + toolBar + + + Game List + Spellista + + + * Unsupported Vulkan Version + * Vulkan-versionen stöds inte + + + Download Cheats For All Installed Games + Hämta fusk för alla installerade spel + + + Download Patches For All Games + Hämta patchar för alla spel + + + Download Complete + Hämtning färdig + + + You have downloaded cheats for all the games you have installed. + Du har hämtat fusk till alla spelen som du har installerade. + + + Patches Downloaded Successfully! + Patchar hämtades ner! + + + All Patches available for all games have been downloaded. + Alla patchar tillgängliga för alla spel har hämtats ner. + + + Games: + Spel: + + + PKG File (*.PKG) + PKG-fil (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + Game Boot + Starta spel + + + Only one file can be selected! + Endast en fil kan väljas! + + + PKG Extraction + PKG-extrahering + + + Patch detected! + Patch upptäcktes! + + + PKG and Game versions match: + PKG och spelversioner matchar: + + + Would you like to overwrite? + Vill du skriva över? + + + PKG Version %1 is older than installed version: + PKG-versionen %1 är äldre än installerad version: + + + Game is installed: + Spelet är installerat: + + + Would you like to install Patch: + Vill du installera patch: + + + DLC Installation + DLC-installation + + + Would you like to install DLC: %1? + Vill du installera DLC: %1? + + + DLC already installed: + DLC redan installerat: + + + Game already installed + Spelet redan installerat + + + PKG is a patch, please install the game first! + PKH är en patch. Installera spelet först! + + + PKG ERROR + PKG-FEL + + + Extracting PKG %1/%2 + Extraherar PKG %1/%2 + + + Extraction Finished + Extrahering färdig + + + Game successfully installed at %1 + Spelet installerades i %1 + + + File doesn't appear to be a valid PKG file + Filen verkar inte vara en giltig PKG-fil + + + + PKGViewer + + Open Folder + Öppna mapp + + + + TrophyViewer + + Trophy Viewer + Trofé-visare + + + + SettingsDialog + + Settings + Inställningar + + + General + Allmänt + + + System + System + + + Console Language + Konsollspråk + + + Emulator Language + Emulatorspråk + + + Emulator + Emulator + + + Enable Fullscreen + Aktivera helskärm + + + Enable Separate Update Folder + Aktivera separat uppdateringsmapp + + + Show Splash + Visa startskärm + + + Is PS4 Pro + Är PS4 Pro + + + Enable Discord Rich Presence + Aktivera Discord Rich Presence + + + Username + Användarnamn + + + Trophy Key + Trofényckel + + + Trophy + Trofé + + + Logger + Loggning + + + Log Type + Loggtyp + + + Log Filter + Loggfilter + + + Input + Inmatning + + + Cursor + Pekare + + + Hide Cursor + Dölj pekare + + + Hide Cursor Idle Timeout + Dölj pekare vid overksam + + + s + s + + + Controller + Handkontroller + + + Back Button Behavior + Beteende för bakåtknapp + + + Graphics + Grafik + + + Graphics Device + Grafikenhet + + + Width + Bredd + + + Height + Höjd + + + Vblank Divider + Vblank Divider + + + Advanced + Avancerat + + + Enable Shaders Dumping + Aktivera Shaders Dumping + + + Enable NULL GPU + Aktivera NULL GPU + + + Paths + Sökvägar + + + Game Folders + Spelmappar + + + Add... + Lägg till... + + + Remove + Ta bort + + + Debug + Felsök + + + Enable Debug Dumping + Aktivera felsökningsdumpning + + + Enable Vulkan Validation Layers + Aktivera Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Aktivera Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Aktivera RenderDoc-felsökning + + + Update + Uppdatera + + + Check for Updates at Startup + Leta efter uppdateringar vid uppstart + + + Update Channel + Uppdateringskanal + + + Check for Updates + Leta efter uppdateringar + + + GUI Settings + Gränssnittsinställningar + + + Disable Trophy Pop-ups + Inaktivera popup för troféer + + + Play title music + Spela titelmusik + + + Update Compatibility Database On Startup + Uppdatera databas vid uppstart + + + Game Compatibility + Spelkompatibilitet + + + Display Compatibility Data + Visa kompatibilitetsdata + + + Update Compatibility Database + Uppdatera kompatibilitetsdatabasen + + + Volume + Volym + + + Audio Backend + Ljudbakände + + + Save + Spara + + + Apply + Verkställ + + + Restore Defaults + Återställ till standard + + + Close + Stäng + + + Point your mouse at an option to display its description. + Peka din mus på ett alternativ för att visa dess beskrivning. + + + consoleLanguageGroupBox + Konsollspråk:\nStäller in språket som PS4-spelet använder.\nDet rekommenderas att ställa in detta till ett språk som spelet har stöd för, vilket kan skilja sig mellan regioner + + + emulatorLanguageGroupBox + Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt + + + fullscreenCheckBox + Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka på F11-tangenten + + + separateUpdatesCheckBox + Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id + + + showSplashCheckBox + Visa startskärm:\nVisar spelets startskärm (en speciell bild) när spelet startas + + + ps4proCheckBox + Är PS4 Pro:\nGör att emulatorn fungerar som en PS4 PRO, som kan aktivera speciella funktioner i spel som har stöds för det + + + discordRPCCheckbox + Aktivera Discord Rich Presence:\nVisar emulatorikonen och relevant information på din Discord-profil + + + userName + Användarnamn:\nStäller in PS4ans användarkonto, som kan visas av vissa spel + + + TrophyKey + Trofényckel:\nNyckel som används för att avkryptera troféer. Måste hämtas från din konsoll (jailbroken).\nMåste innehålla endast hex-tecken + + + logTypeGroupBox + Loggtyp:\nStäller in huruvida synkronisering av utdata för loggfönstret för prestanda. Kan ha inverkan på emulationen + + + logFilter + Loggfilter:\nFiltrera loggen till att endast skriva ut specifik information.\nExempel: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNivåer: Trace, Debug, Info, Warning, Error, Critical - i den ordningen, en specifik nivå som tystar alla nivåer före den i listan och loggar allting efter den + + + updaterGroupBox + updaterGroupBox + + + GUIgroupBox + Spela upp titelmusik:\nOm ett spel har stöd för det kan speciell musik spelas upp från spelet i gränssnittet + + + disableTrophycheckBox + Inaktivera popup för troféer:\nInaktivera troféeaviseringar i spel. Troféförlopp kan fortfarande följas med Troféevisaren (högerklicka på spelet i huvudfönstret) + + + hideCursorGroupBox + Dölj pekare:\nVälj när muspekaren ska försvinna:\nAldrig: Du kommer alltid se muspekaren.\nOverksam: Ställ in en tid för när den ska försvinna efter den inte använts.\nAlltid: du kommer aldrig se muspekaren + + + idleTimeoutGroupBox + Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv + + + backButtonBehaviorGroupBox + Beteende för bakåtknapp:\nStäller in handkontrollerns bakåtknapp för att emulera ett tryck på angivna positionen på PS4ns touchpad + + + enableCompatibilityCheckBox + Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera "Uppdatera kompatibilitet vid uppstart" för att få uppdaterad information + + + checkCompatibilityOnStartupCheckBox + Uppdatera kompatibilitet vid uppstart:\nUppdatera automatiskt kompatibilitetsdatabasen när shadPS4 startar + + + updateCompatibilityButton + Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt + + + Never + Aldrig + + + Idle + Overksam + + + Always + Alltid + + + Touchpad Left + Touchpad vänster + + + Touchpad Right + Touchpad höger + + + Touchpad Center + Touchpad mitten + + + None + Ingen + + + graphicsAdapterGroupBox + Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja "Auto Select" för att automatiskt bestämma det + + + resolutionLayout + Bredd/Höjd:\nStäller in storleken för emulatorfönstret vid uppstart, som kan storleksändras under spelning.\nDetta är inte det samma som spelupplösningen + + + heightDivider + Vblank Divider:\nBildfrekvensen som emulatorn uppdaterar vid multipliceras med detta tal. Ändra detta kan ha inverkan på saker, såsom ökad spelhastighet eller göra sönder kritisk spelfunktionalitet, som inte förväntar sig denna ändring + + + dumpShadersCheckBox + Aktivera Shaders Dumping:\nFör teknisk felsökning, sparar spelets shaders till en mapp när de renderas + + + nullGpuCheckBox + Aktivera Null GPU:\nFör teknisk felsökning, inaktiverar spelrenderingen som om det inte fanns något grafikkort + + + gameFoldersBox + Spelmappar:\nListan över mappar att leta i efter installerade spel + + + addFolderButton + Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar till en separat mapp för enkel hantering.\nDetta kan manuellt skapas genom att lägga till den uppackade uppdateringen till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id + + + removeFolderButton + Ta bort:\nTa bort en mapp från listan + + + debugDump + Aktivera felsökningsdumpning:\nSparar import och export av symboler och fil-header-information för aktuellt körande PS4-program till en katalog + + + vkValidationCheckBox + Aktivera Vulkan Validation Layers:\nAktiverar ett system som validerar tillståndet för Vulkan renderer och loggar information om dess interna tillstånd.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen + + + vkSyncValidationCheckBox + Aktivera Vulkan Synchronization Validation:\nAktiverar ett system som validerar timing för Vulkan rendering tasks.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen + + + rdocCheckBox + Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta + + + + CheatsPatches + + Cheats / Patches for + Fusk / Patchar för + + + defaultTextEdit_MSG + Fusk/Patchar är experimentella.\nAnvänd med försiktighet.\n\nHämta fusk individuellt genom att välja förrådet och klicka på hämtningsknappen.\nUnder Patchar-fliken kan du hämta alla patchar på en gång, välj vilken du vill använda och spara ditt val.\n\nEftersom vi inte utvecklar fusk eller patchar,\nrapportera gärna problem till fuskets upphovsperson.\n\nSkapat ett nytt fusk? Besök:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Ingen bild tillgänglig + + + Serial: + Serienummer: + + + Version: + Version: + + + Size: + Storlek: + + + Select Cheat File: + Välj fuskfil: + + + Repository: + Förråd: + + + Download Cheats + Hämta fusk + + + Delete File + Ta bort fil + + + No files selected. + Inga filer valda. + + + You can delete the cheats you don't want after downloading them. + Du kan ta bort fusk som du inte vill ha efter de hämtats ner. + + + Do you want to delete the selected file?\n%1 + Vill du ta bort markerade filen?\n%1 + + + Select Patch File: + Välj patchfil: + + + Download Patches + Hämta patchar + + + Save + Spara + + + Cheats + Fusk + + + Patches + Patchar + + + Error + Fel + + + No patch selected. + Ingen patch vald. + + + Unable to open files.json for reading. + Kunde inte öppna files.json för läsning. + + + No patch file found for the current serial. + Ingen patchfil hittades för aktuella serienumret. + + + Unable to open the file for reading. + Kunde inte öppna filen för läsning. + + + Unable to open the file for writing. + Kunde inte öppna filen för skrivning. + + + Failed to parse XML: + Misslyckades med att tolka XML: + + + Success + Lyckades + + + Options saved successfully. + Inställningarna sparades. + + + Invalid Source + Ogiltig källa + + + The selected source is invalid. + Vald källa är ogiltig. + + + File Exists + Filen finns + + + File already exists. Do you want to replace it? + Filen finns redan. Vill du ersätta den? + + + Failed to save file: + Misslyckades med att spara fil: + + + Failed to download file: + Misslyckades med att hämta filen: + + + Cheats Not Found + Fusk hittades inte + + + CheatsNotFound_MSG + Inga fusk hittades för detta spel i denna version av det valda förrådet. Prova ett annat förråd eller en annan version av spelet + + + Cheats Downloaded Successfully + Fusk hämtades ner + + + CheatsDownloadedSuccessfully_MSG + Du har hämtat ner fusken för denna version av spelet från valt förråd. Du kan försöka att hämta från andra förråd, om de är tillgängliga så kan det vara möjligt att använda det genom att välja det genom att välja filen från listan + + + Failed to save: + Misslyckades med att spara: + + + Failed to download: + Misslyckades med att hämta: + + + Download Complete + Hämtning färdig + + + DownloadComplete_MSG + Patchhämtningen är färdig! Alla patchar tillgängliga för alla spel har hämtats och de behövs inte hämtas individuellt för varje spel som med fusk. Om patchen inte dyker upp kan det bero på att den inte finns för det specifika serienumret och versionen av spelet + + + Failed to parse JSON data from HTML. + Misslyckades med att tolka JSON-data från HTML. + + + Failed to retrieve HTML page. + Misslyckades med att hämta HTML-sida. + + + The game is in version: %1 + Spelet är i version: %1 + + + The downloaded patch only works on version: %1 + Hämtad patch fungerar endast på version: %1 + + + You may need to update your game. + Du kan behöva uppdatera ditt spel. + + + Incompatibility Notice + Inkompatibilitetsmeddelande + + + Failed to open file: + Misslyckades med att öppna filen: + + + XML ERROR: + XML-FEL: + + + Failed to open files.json for writing + Misslyckades med att öppna files.json för skrivning + + + Author: + Upphovsperson: + + + Directory does not exist: + Katalogen finns inte: + + + Failed to open files.json for reading. + Misslyckades med att öppna files.json för läsning. + + + Name: + Namn: + + + Can't apply cheats before the game is started + Kan inte tillämpa fusk innan spelet är startat + + + + GameListFrame + + Icon + Ikon + + + Name + Namn + + + Serial + Serienummer + + + Compatibility + Kompatibilitet + + + Region + Region + + + Firmware + Firmware + + + Size + Storlek + + + Version + Version + + + Path + Sökväg + + + Play Time + Speltid + + + Never Played + Aldrig spelat + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Kompatibilitet är otestat + + + Game does not initialize properly / crashes the emulator + Spelet initierar inte korrekt / kraschar emulatorn + + + Game boots, but only displays a blank screen + Spelet startar men visar endast en blank skärm + + + Game displays an image but does not go past the menu + Spelet visar en bild men kommer inte förbi menyn + + + Game has game-breaking glitches or unplayable performance + Spelet har allvarliga problem eller ospelbar prestanda + + + Game can be completed with playable performance and no major glitches + Spelet kan spelas klart med spelbar prestanda och utan större problem + + + + CheckUpdate + + Auto Updater + Automatisk uppdatering + + + Error + Fel + + + Network error: + Nätverksfel: + + + Failed to parse update information. + Misslyckades med att tolka uppdateringsinformationen. + + + No pre-releases found. + Inga förutgåva hittades. + + + Invalid release data. + Ogiltig release-data. + + + No download URL found for the specified asset. + Ingen hämtnings-URL hittades för angiven tillgång. + + + Your version is already up to date! + Din version är redan den senaste! + + + Update Available + Uppdatering tillgänglig + + + Update Channel + Uppdateringskanal + + + Current Version + Aktuell version + + + Latest Version + Senaste version + + + Do you want to update? + Vill du uppdatera? + + + Show Changelog + Visa ändringslogg + + + Check for Updates at Startup + Leta efter uppdateringar vid uppstart + + + Update + Uppdatera + + + No + Nej + + + Hide Changelog + Dölj ändringslogg + + + Changes + Ändringar + + + Network error occurred while trying to access the URL + Nätverksfel inträffade vid försök att komma åt URL:en + + + Download Complete + Hämtning färdig + + + The update has been downloaded, press OK to install. + Uppdateringen har hämtats. Tryck på Ok för att installera. + + + Failed to save the update file at + Misslyckades med att spara uppdateringsfilen i + + + Starting Update... + Startar uppdatering... + + + Failed to create the update script file + Misslyckades med att skapa uppdateringsskriptfil + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + \ No newline at end of file From 5559f3590599a1b0534a830c2a4f855722b79142 Mon Sep 17 00:00:00 2001 From: psucien Date: Mon, 6 Jan 2025 22:50:09 +0100 Subject: [PATCH 023/455] hot-fix: buffers resolve barriers fixed --- src/video_core/buffer_cache/buffer.h | 16 ++++-- src/video_core/buffer_cache/buffer_cache.cpp | 60 +++++++++----------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/video_core/buffer_cache/buffer.h b/src/video_core/buffer_cache/buffer.h index feeafd9bd..63391a180 100644 --- a/src/video_core/buffer_cache/buffer.h +++ b/src/video_core/buffer_cache/buffer.h @@ -119,19 +119,23 @@ public: return buffer; } - std::optional GetBarrier(vk::AccessFlagBits2 dst_acess_mask, - vk::PipelineStageFlagBits2 dst_stage) { + std::optional GetBarrier( + vk::Flags dst_acess_mask, vk::PipelineStageFlagBits2 dst_stage, + u32 offset = 0) { if (dst_acess_mask == access_mask && stage == dst_stage) { return {}; } + DEBUG_ASSERT(offset < size_bytes); + auto barrier = vk::BufferMemoryBarrier2{ .srcStageMask = stage, .srcAccessMask = access_mask, .dstStageMask = dst_stage, .dstAccessMask = dst_acess_mask, .buffer = buffer.buffer, - .size = size_bytes, + .offset = offset, + .size = size_bytes - offset, }; access_mask = dst_acess_mask; stage = dst_stage; @@ -150,8 +154,10 @@ public: Vulkan::Scheduler* scheduler; MemoryUsage usage; UniqueBuffer buffer; - vk::AccessFlagBits2 access_mask{vk::AccessFlagBits2::eNone}; - vk::PipelineStageFlagBits2 stage{vk::PipelineStageFlagBits2::eNone}; + vk::Flags access_mask{ + vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite | + vk::AccessFlagBits2::eTransferRead | vk::AccessFlagBits2::eTransferWrite}; + vk::PipelineStageFlagBits2 stage{vk::PipelineStageFlagBits2::eAllCommands}; }; class StreamBuffer : public Buffer { diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 322a9dd4e..d5ebd85fc 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -479,43 +479,36 @@ void BufferCache::JoinOverlap(BufferId new_buffer_id, BufferId overlap_id, }; scheduler.EndRendering(); const auto cmdbuf = scheduler.CommandBuffer(); - const std::array pre_barriers = { - vk::BufferMemoryBarrier2{ - .srcStageMask = vk::PipelineStageFlagBits2::eAllCommands, - .srcAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite, - .dstStageMask = vk::PipelineStageFlagBits2::eTransfer, - .dstAccessMask = vk::AccessFlagBits2::eTransferRead, - .buffer = overlap.Handle(), - .offset = 0, - .size = overlap.SizeBytes(), - }, - }; - const std::array post_barriers = { - vk::BufferMemoryBarrier2{ - .srcStageMask = vk::PipelineStageFlagBits2::eTransfer, - .srcAccessMask = vk::AccessFlagBits2::eTransferRead, - .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands, - .dstAccessMask = vk::AccessFlagBits2::eMemoryWrite, - .buffer = overlap.Handle(), - .offset = 0, - .size = overlap.SizeBytes(), - }, - vk::BufferMemoryBarrier2{ - .srcStageMask = vk::PipelineStageFlagBits2::eTransfer, - .srcAccessMask = vk::AccessFlagBits2::eTransferWrite, - .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands, - .dstAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite, - .buffer = new_buffer.Handle(), - .offset = dst_base_offset, - .size = overlap.SizeBytes(), - }, - }; + + boost::container::static_vector pre_barriers{}; + if (auto src_barrier = overlap.GetBarrier(vk::AccessFlagBits2::eTransferRead, + vk::PipelineStageFlagBits2::eTransfer)) { + pre_barriers.push_back(*src_barrier); + } + if (auto dst_barrier = + new_buffer.GetBarrier(vk::AccessFlagBits2::eTransferWrite, + vk::PipelineStageFlagBits2::eTransfer, dst_base_offset)) { + pre_barriers.push_back(*dst_barrier); + } cmdbuf.pipelineBarrier2(vk::DependencyInfo{ .dependencyFlags = vk::DependencyFlagBits::eByRegion, - .bufferMemoryBarrierCount = 1, + .bufferMemoryBarrierCount = static_cast(pre_barriers.size()), .pBufferMemoryBarriers = pre_barriers.data(), }); + cmdbuf.copyBuffer(overlap.Handle(), new_buffer.Handle(), copy); + + boost::container::static_vector post_barriers{}; + if (auto src_barrier = + overlap.GetBarrier(vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite, + vk::PipelineStageFlagBits2::eAllCommands)) { + post_barriers.push_back(*src_barrier); + } + if (auto dst_barrier = new_buffer.GetBarrier( + vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite, + vk::PipelineStageFlagBits2::eAllCommands, dst_base_offset)) { + post_barriers.push_back(*dst_barrier); + } cmdbuf.pipelineBarrier2(vk::DependencyInfo{ .dependencyFlags = vk::DependencyFlagBits::eByRegion, .bufferMemoryBarrierCount = static_cast(post_barriers.size()), @@ -626,7 +619,8 @@ void BufferCache::SynchronizeBuffer(Buffer& buffer, VAddr device_addr, u32 size, const auto cmdbuf = scheduler.CommandBuffer(); const vk::BufferMemoryBarrier2 pre_barrier = { .srcStageMask = vk::PipelineStageFlagBits2::eAllCommands, - .srcAccessMask = vk::AccessFlagBits2::eMemoryRead, + .srcAccessMask = vk::AccessFlagBits2::eMemoryRead | vk::AccessFlagBits2::eMemoryWrite | + vk::AccessFlagBits2::eTransferRead | vk::AccessFlagBits2::eTransferWrite, .dstStageMask = vk::PipelineStageFlagBits2::eTransfer, .dstAccessMask = vk::AccessFlagBits2::eTransferWrite, .buffer = buffer.Handle(), From 39b511070ac781447b7015d115c80bc394e51e06 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Tue, 7 Jan 2025 01:58:49 -0300 Subject: [PATCH 024/455] TR: remove 'location' (#2078) --- src/qt_gui/translations/ar.ts | 1018 ++++++++++------------------- src/qt_gui/translations/da_DK.ts | 1018 ++++++++++------------------- src/qt_gui/translations/de.ts | 1018 ++++++++++------------------- src/qt_gui/translations/el.ts | 1018 ++++++++++------------------- src/qt_gui/translations/en.ts | 1018 ++++++++++------------------- src/qt_gui/translations/es_ES.ts | 1018 ++++++++++------------------- src/qt_gui/translations/fa_IR.ts | 1020 ++++++++++------------------- src/qt_gui/translations/fi.ts | 1028 ++++++++++-------------------- src/qt_gui/translations/fr.ts | 1018 ++++++++++------------------- src/qt_gui/translations/hu_HU.ts | 1018 ++++++++++------------------- src/qt_gui/translations/id.ts | 1018 ++++++++++------------------- src/qt_gui/translations/it.ts | 1022 ++++++++++------------------- src/qt_gui/translations/ja_JP.ts | 1018 ++++++++++------------------- src/qt_gui/translations/ko_KR.ts | 1018 ++++++++++------------------- src/qt_gui/translations/lt_LT.ts | 1018 ++++++++++------------------- src/qt_gui/translations/nb.ts | 1018 ++++++++++------------------- src/qt_gui/translations/nl.ts | 1018 ++++++++++------------------- src/qt_gui/translations/pl_PL.ts | 1018 ++++++++++------------------- src/qt_gui/translations/pt_BR.ts | 1020 ++++++++++------------------- src/qt_gui/translations/ro_RO.ts | 1018 ++++++++++------------------- src/qt_gui/translations/ru_RU.ts | 1018 ++++++++++------------------- src/qt_gui/translations/sq.ts | 1020 ++++++++++------------------- src/qt_gui/translations/tr_TR.ts | 1018 ++++++++++------------------- src/qt_gui/translations/uk_UA.ts | 1018 ++++++++++------------------- src/qt_gui/translations/vi_VN.ts | 1018 ++++++++++------------------- src/qt_gui/translations/zh_CN.ts | 1020 ++++++++++------------------- src/qt_gui/translations/zh_TW.ts | 1018 ++++++++++------------------- 27 files changed, 9326 insertions(+), 18182 deletions(-) diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index e851f59a7..c1964356a 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 حول shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. - This software should not be used to play games you have not legally obtained. يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني. @@ -29,7 +25,6 @@ ElfViewer - Open Folder فتح المجلد @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3 - Cancel إلغاء - Loading... ...جارٍ التحميل @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - اختر المجلد - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - اختر المجلد - Directory to install games مجلد تثبيت الألعاب - Browse تصفح - Error خطأ - The value for location to install games is not valid. قيمة موقع تثبيت الألعاب غير صالحة. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut إنشاء اختصار - Cheats / Patches الغش / التصحيحات - SFO Viewer عارض SFO - Trophy Viewer عارض الجوائز - Open Folder... فتح المجلد... - Open Game Folder فتح مجلد اللعبة - Open Save Data Folder فتح مجلد بيانات الحفظ - Open Log Folder فتح مجلد السجل - Copy info... ...نسخ المعلومات - Copy Name نسخ الاسم - Copy Serial نسخ الرقم التسلسلي - Copy All نسخ الكل - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation إنشاء اختصار - Shortcut created successfully! تم إنشاء الاختصار بنجاح! - Error خطأ - Error creating shortcut! خطأ في إنشاء الاختصار - Install PKG PKG تثبيت - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Elf فتح/إضافة مجلد - Install Packages (PKG) (PKG) تثبيت الحزم - Boot Game تشغيل اللعبة - Check for Updates تحقق من التحديثات - About shadPS4 shadPS4 حول - Configure... ...تكوين - Install application from a .pkg file .pkg تثبيت التطبيق من ملف - Recent Games الألعاب الأخيرة - Exit خروج - Exit shadPS4 الخروج من shadPS4 - Exit the application. الخروج من التطبيق. - Show Game List إظهار قائمة الألعاب - Game List Refresh تحديث قائمة الألعاب - Tiny صغير جدًا - Small صغير - Medium متوسط - Large كبير - List View عرض القائمة - Grid View عرض الشبكة - Elf Viewer عارض Elf - Game Install Directory دليل تثبيت اللعبة - Download Cheats/Patches تنزيل الغش/التصحيحات - Dump Game List تفريغ قائمة الألعاب - PKG Viewer عارض PKG - Search... ...بحث - File ملف - View عرض - Game List Icons أيقونات قائمة الألعاب - Game List Mode وضع قائمة الألعاب - Settings الإعدادات - Utils الأدوات - Themes السمات - Help مساعدة - Dark داكن - Light فاتح - Green أخضر - Blue أزرق - Violet بنفسجي - toolBar شريط الأدوات + + Game List + ققائمة الألعاب + + + * Unsupported Vulkan Version + * إصدار Vulkan غير مدعوم + + + Download Cheats For All Installed Games + تنزيل الغش لجميع الألعاب المثبتة + + + Download Patches For All Games + تنزيل التصحيحات لجميع الألعاب + + + Download Complete + اكتمل التنزيل + + + You have downloaded cheats for all the games you have installed. + لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. + + + Patches Downloaded Successfully! + !تم تنزيل التصحيحات بنجاح + + + All Patches available for all games have been downloaded. + .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب + + + Games: + :الألعاب + + + PKG File (*.PKG) + PKG (*.PKG) ملف + + + ELF files (*.bin *.elf *.oelf) + ELF (*.bin *.elf *.oelf) ملفات + + + Game Boot + تشغيل اللعبة + + + Only one file can be selected! + !يمكن تحديد ملف واحد فقط + + + PKG Extraction + PKG استخراج + + + Patch detected! + تم اكتشاف تصحيح! + + + PKG and Game versions match: + :واللعبة تتطابق إصدارات PKG + + + Would you like to overwrite? + هل ترغب في الكتابة فوق الملف الموجود؟ + + + PKG Version %1 is older than installed version: + :أقدم من الإصدار المثبت PKG Version %1 + + + Game is installed: + :اللعبة مثبتة + + + Would you like to install Patch: + :هل ترغب في تثبيت التصحيح + + + DLC Installation + تثبيت المحتوى القابل للتنزيل + + + Would you like to install DLC: %1? + هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ + + + DLC already installed: + :المحتوى القابل للتنزيل مثبت بالفعل + + + Game already installed + اللعبة مثبتة بالفعل + + + PKG is a patch, please install the game first! + !PKG هو تصحيح، يرجى تثبيت اللعبة أولاً + + + PKG ERROR + PKG خطأ في + + + Extracting PKG %1/%2 + PKG %1/%2 جاري استخراج + + + Extraction Finished + اكتمل الاستخراج + + + Game successfully installed at %1 + تم تثبيت اللعبة بنجاح في %1 + + + File doesn't appear to be a valid PKG file + يبدو أن الملف ليس ملف PKG صالحًا + PKGViewer - Open Folder فتح المجلد @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer عارض الجوائز @@ -478,1029 +509,700 @@ SettingsDialog - Settings الإعدادات - General عام - System النظام - Console Language لغة وحدة التحكم - Emulator Language لغة المحاكي - Emulator المحاكي - Enable Fullscreen تمكين ملء الشاشة - Enable Separate Update Folder Enable Separate Update Folder - Show Splash إظهار شاشة البداية - Is PS4 Pro PS4 Pro هل هو - Enable Discord Rich Presence تفعيل حالة الثراء في ديسكورد - Username اسم المستخدم - Trophy Key Trophy Key - Trophy Trophy - Logger المسجل - Log Type نوع السجل - Log Filter مرشح السجل - Input إدخال - Cursor مؤشر - Hide Cursor إخفاء المؤشر - Hide Cursor Idle Timeout مهلة إخفاء المؤشر عند الخمول - s s - Controller التحكم - Back Button Behavior سلوك زر العودة - Graphics الرسومات - Graphics Device جهاز الرسومات - Width العرض - Height الارتفاع - Vblank Divider Vblank مقسم - Advanced متقدم - Enable Shaders Dumping تمكين تفريغ الشيدرات - Enable NULL GPU تمكين وحدة معالجة الرسومات الفارغة - Paths المسارات - Game Folders مجلدات اللعبة - Add... إضافة... - Remove إزالة - Debug تصحيح الأخطاء - Enable Debug Dumping تمكين تفريغ التصحيح - Enable Vulkan Validation Layers Vulkan تمكين طبقات التحقق من - Enable Vulkan Synchronization Validation Vulkan تمكين التحقق من تزامن - Enable RenderDoc Debugging RenderDoc تمكين تصحيح أخطاء - Update تحديث - Check for Updates at Startup تحقق من التحديثات عند بدء التشغيل - Update Channel قناة التحديث - Check for Updates التحقق من التحديثات - GUI Settings إعدادات الواجهة - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music تشغيل موسيقى العنوان - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume الصوت - Audio Backend Audio Backend - - - MainWindow - - Game List - ققائمة الألعاب - - - - * Unsupported Vulkan Version - * إصدار Vulkan غير مدعوم - - - - Download Cheats For All Installed Games - تنزيل الغش لجميع الألعاب المثبتة - - - - Download Patches For All Games - تنزيل التصحيحات لجميع الألعاب - - - - Download Complete - اكتمل التنزيل - - - - You have downloaded cheats for all the games you have installed. - لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. - - - - Patches Downloaded Successfully! - !تم تنزيل التصحيحات بنجاح - - - - All Patches available for all games have been downloaded. - .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب - - - - Games: - :الألعاب - - - - PKG File (*.PKG) - PKG (*.PKG) ملف - - - - ELF files (*.bin *.elf *.oelf) - ELF (*.bin *.elf *.oelf) ملفات - - - - Game Boot - تشغيل اللعبة - - - - Only one file can be selected! - !يمكن تحديد ملف واحد فقط - - - - PKG Extraction - PKG استخراج - - - - Patch detected! - تم اكتشاف تصحيح! - - - - PKG and Game versions match: - :واللعبة تتطابق إصدارات PKG - - - - Would you like to overwrite? - هل ترغب في الكتابة فوق الملف الموجود؟ - - - - PKG Version %1 is older than installed version: - :أقدم من الإصدار المثبت PKG Version %1 - - - - Game is installed: - :اللعبة مثبتة - - - - Would you like to install Patch: - :هل ترغب في تثبيت التصحيح - - - - DLC Installation - تثبيت المحتوى القابل للتنزيل - - - - Would you like to install DLC: %1? - هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ - - - - DLC already installed: - :المحتوى القابل للتنزيل مثبت بالفعل - - - - Game already installed - اللعبة مثبتة بالفعل - - - - PKG is a patch, please install the game first! - !PKG هو تصحيح، يرجى تثبيت اللعبة أولاً - - - - PKG ERROR - PKG خطأ في - - - - Extracting PKG %1/%2 - PKG %1/%2 جاري استخراج - - - - Extraction Finished - اكتمل الاستخراج - - - - Game successfully installed at %1 - تم تثبيت اللعبة بنجاح في %1 - - - - File doesn't appear to be a valid PKG file - يبدو أن الملف ليس ملف PKG صالحًا - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - لا تتوفر صورة - - - - Serial: - الرقم التسلسلي: - - - - Version: - الإصدار: - - - - Size: - الحجم: - - - - Select Cheat File: - اختر ملف الغش: - - - - Repository: - المستودع: - - - - Download Cheats - تنزيل الغش - - - - Delete File - حذف الملف - - - - No files selected. - لم يتم اختيار أي ملفات. - - - - You can delete the cheats you don't want after downloading them. - يمكنك حذف الغش الذي لا تريده بعد تنزيله. - - - - Do you want to delete the selected file?\n%1 - هل تريد حذف الملف المحدد؟\n%1 - - - - Select Patch File: - اختر ملف التصحيح: - - - - Download Patches - تنزيل التصحيحات - - - Save حفظ - - Cheats - الغش - - - - Patches - التصحيحات - - - - Error - خطأ - - - - No patch selected. - لم يتم اختيار أي تصحيح. - - - - Unable to open files.json for reading. - تعذر فتح files.json للقراءة. - - - - No patch file found for the current serial. - لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. - - - - Unable to open the file for reading. - تعذر فتح الملف للقراءة. - - - - Unable to open the file for writing. - تعذر فتح الملف للكتابة. - - - - Failed to parse XML: - :فشل في تحليل XML - - - - Success - نجاح - - - - Options saved successfully. - تم حفظ الخيارات بنجاح. - - - - Invalid Source - مصدر غير صالح - - - - The selected source is invalid. - المصدر المحدد غير صالح. - - - - File Exists - الملف موجود - - - - File already exists. Do you want to replace it? - الملف موجود بالفعل. هل تريد استبداله؟ - - - - Failed to save file: - :فشل في حفظ الملف - - - - Failed to download file: - :فشل في تنزيل الملف - - - - Cheats Not Found - لم يتم العثور على الغش - - - - CheatsNotFound_MSG - لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. - - - - Cheats Downloaded Successfully - تم تنزيل الغش بنجاح - - - - CheatsDownloadedSuccessfully_MSG - لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. - - - - Failed to save: - :فشل في الحفظ - - - - Failed to download: - :فشل في التنزيل - - - - Download Complete - اكتمل التنزيل - - - - DownloadComplete_MSG - تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. - - - - Failed to parse JSON data from HTML. - فشل في تحليل بيانات JSON من HTML. - - - - Failed to retrieve HTML page. - .HTML فشل في استرجاع صفحة - - - - The game is in version: %1 - اللعبة في الإصدار: %1 - - - - The downloaded patch only works on version: %1 - الباتش الذي تم تنزيله يعمل فقط على الإصدار: %1 - - - - You may need to update your game. - قد تحتاج إلى تحديث لعبتك. - - - - Incompatibility Notice - إشعار عدم التوافق - - - - Failed to open file: - :فشل في فتح الملف - - - - XML ERROR: - :خطأ في XML - - - - Failed to open files.json for writing - فشل في فتح files.json للكتابة - - - - Author: - :المؤلف - - - - Directory does not exist: - :المجلد غير موجود - - - - Failed to open files.json for reading. - فشل في فتح files.json للقراءة. - - - - Name: - :الاسم - - - - Can't apply cheats before the game is started - لا يمكن تطبيق الغش قبل بدء اللعبة. - - - - SettingsDialog - - - Save - حفظ - - - Apply تطبيق - Restore Defaults استعادة الإعدادات الافتراضية - Close إغلاق - Point your mouse at an option to display its description. وجّه الماوس نحو خيار لعرض وصفه. - consoleLanguageGroupBox لغة الجهاز:\nتحدد لغة اللعبة التي يستخدمها جهاز PS4.\nيوصى بضبطها على لغة يدعمها الجهاز، والتي قد تختلف حسب المنطقة. - emulatorLanguageGroupBox لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. - fullscreenCheckBox تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox إظهار شاشة البداية:\nيعرض شاشة البداية الخاصة باللعبة (صورة خاصة) أثناء بدء التشغيل. - ps4proCheckBox هل هو PS4 Pro:\nيجعل المحاكي يعمل كـ PS4 PRO، مما قد يتيح ميزات خاصة في الألعاب التي تدعمه. - discordRPCCheckbox تفعيل حالة الثراء في ديسكورد:\nيعرض أيقونة المحاكي ومعلومات ذات صلة على ملفك الشخصي في ديسكورد. - userName اسم المستخدم:\nيضبط اسم حساب PS4، الذي قد يتم عرضه في بعض الألعاب. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox نوع السجل:\nيضبط ما إذا كان سيتم مزامنة مخرجات نافذة السجل للأداء. قد يؤثر سلبًا على المحاكاة. - logFilter فلتر السجل:\nيقوم بتصفية السجل لطباعة معلومات محددة فقط.\nأمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده. - updaterGroupBox تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. - GUIgroupBox تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox إخفاء المؤشر:\nاختر متى سيختفي المؤشر:\nأبداً: سترى الفأرة دائماً.\nعاطل: حدد وقتاً لاختفائه بعد أن يكون غير مستخدم.\nدائماً: لن ترى الفأرة أبداً. - idleTimeoutGroupBox حدد وقتاً لاختفاء الفأرة بعد أن تكون غير مستخدم. - backButtonBehaviorGroupBox سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never أبداً - Idle خامل - Always دائماً - Touchpad Left لوحة اللمس اليسرى - Touchpad Right لوحة اللمس اليمنى - Touchpad Center وسط لوحة اللمس - None لا شيء - graphicsAdapterGroupBox جهاز الرسومات:\nعلى الأنظمة متعددة وحدات معالجة الرسومات، اختر وحدة معالجة الرسومات التي سيستخدمها المحاكي من قائمة منسدلة،\nأو اختر "Auto Select" لتحديدها تلقائيًا. - resolutionLayout العرض / الارتفاع:\nيضبط حجم نافذة المحاكي عند التشغيل، والذي يمكن تغيير حجمه أثناء اللعب.\nهذا يختلف عن دقة اللعبة نفسها. - heightDivider مقسم معدل التحديث:\nيتم مضاعفة معدل الإطارات الذي يتم تحديث المحاكي به بواسطة هذا الرقم. قد يؤدي تغيير هذا إلى آثار سلبية، مثل زيادة سرعة اللعبة أو كسر الوظائف الأساسية التي لا تتوقع هذا التغيير! - dumpShadersCheckBox تمكين تفريغ الـ Shaders:\nلأغراض تصحيح الأخطاء التقنية، يحفظ الـ Shaders الخاصة باللعبة في مجلد أثناء التشغيل. - nullGpuCheckBox تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات. - gameFoldersBox مجلدات اللعبة:\nقائمة بالمجلدات للتحقق من الألعاب المثبتة. - addFolderButton إضافة:\nأضف مجلداً إلى القائمة. - removeFolderButton إزالة:\nأزل مجلداً من القائمة. - debugDump تمكين تفريغ التصحيح:\nيحفظ رموز الاستيراد والتصدير ومعلومات رأس الملف للبرنامج الحالي لجهاز PS4 إلى دليل. - vkValidationCheckBox تمكين طبقات التحقق من Vulkan:\nيتيح نظام يتحقق من حالة مشغل Vulkan ويسجل معلومات حول حالته الداخلية. سيؤدي هذا إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - vkSyncValidationCheckBox تمكين التحقق من تزامن Vulkan:\nيتيح نظام يتحقق من توقيت مهام عرض Vulkan. سيؤدي ذلك إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - rdocCheckBox تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + لا تتوفر صورة + + + Serial: + الرقم التسلسلي: + + + Version: + الإصدار: + + + Size: + الحجم: + + + Select Cheat File: + اختر ملف الغش: + + + Repository: + المستودع: + + + Download Cheats + تنزيل الغش + + + Delete File + حذف الملف + + + No files selected. + لم يتم اختيار أي ملفات. + + + You can delete the cheats you don't want after downloading them. + يمكنك حذف الغش الذي لا تريده بعد تنزيله. + + + Do you want to delete the selected file?\n%1 + هل تريد حذف الملف المحدد؟\n%1 + + + Select Patch File: + اختر ملف التصحيح: + + + Download Patches + تنزيل التصحيحات + + + Save + حفظ + + + Cheats + الغش + + + Patches + التصحيحات + + + Error + خطأ + + + No patch selected. + لم يتم اختيار أي تصحيح. + + + Unable to open files.json for reading. + تعذر فتح files.json للقراءة. + + + No patch file found for the current serial. + لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. + + + Unable to open the file for reading. + تعذر فتح الملف للقراءة. + + + Unable to open the file for writing. + تعذر فتح الملف للكتابة. + + + Failed to parse XML: + :فشل في تحليل XML + + + Success + نجاح + + + Options saved successfully. + تم حفظ الخيارات بنجاح. + + + Invalid Source + مصدر غير صالح + + + The selected source is invalid. + المصدر المحدد غير صالح. + + + File Exists + الملف موجود + + + File already exists. Do you want to replace it? + الملف موجود بالفعل. هل تريد استبداله؟ + + + Failed to save file: + :فشل في حفظ الملف + + + Failed to download file: + :فشل في تنزيل الملف + + + Cheats Not Found + لم يتم العثور على الغش + + + CheatsNotFound_MSG + لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. + + + Cheats Downloaded Successfully + تم تنزيل الغش بنجاح + + + CheatsDownloadedSuccessfully_MSG + لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. + + + Failed to save: + :فشل في الحفظ + + + Failed to download: + :فشل في التنزيل + + + Download Complete + اكتمل التنزيل + + + DownloadComplete_MSG + تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. + + + Failed to parse JSON data from HTML. + فشل في تحليل بيانات JSON من HTML. + + + Failed to retrieve HTML page. + .HTML فشل في استرجاع صفحة + + + The game is in version: %1 + اللعبة في الإصدار: %1 + + + The downloaded patch only works on version: %1 + الباتش الذي تم تنزيله يعمل فقط على الإصدار: %1 + + + You may need to update your game. + قد تحتاج إلى تحديث لعبتك. + + + Incompatibility Notice + إشعار عدم التوافق + + + Failed to open file: + :فشل في فتح الملف + + + XML ERROR: + :خطأ في XML + + + Failed to open files.json for writing + فشل في فتح files.json للكتابة + + + Author: + :المؤلف + + + Directory does not exist: + :المجلد غير موجود + + + Failed to open files.json for reading. + فشل في فتح files.json للقراءة. + + + Name: + :الاسم + + + Can't apply cheats before the game is started + لا يمكن تطبيق الغش قبل بدء اللعبة. + + GameListFrame - Icon أيقونة - Name اسم - Serial سيريال - Compatibility Compatibility - Region منطقة - Firmware البرمجيات الثابتة - Size حجم - Version إصدار - Path مسار - Play Time وقت اللعب - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater محدث تلقائي - Error خطأ - Network error: خطأ في الشبكة: - Failed to parse update information. فشل في تحليل معلومات التحديث. - No pre-releases found. لم يتم العثور على أي إصدارات مسبقة. - Invalid release data. بيانات الإصدار غير صالحة. - No download URL found for the specified asset. لم يتم العثور على عنوان URL للتنزيل للأصل المحدد. - Your version is already up to date! نسختك محدثة بالفعل! - Update Available تحديث متاح - Update Channel قناة التحديث - Current Version الإصدار الحالي - Latest Version آخر إصدار - Do you want to update? هل تريد التحديث؟ - Show Changelog عرض سجل التغييرات - Check for Updates at Startup تحقق من التحديثات عند بدء التشغيل - Update تحديث - No لا - Hide Changelog إخفاء سجل التغييرات - Changes تغييرات - Network error occurred while trying to access the URL حدث خطأ في الشبكة أثناء محاولة الوصول إلى عنوان URL - Download Complete اكتمل التنزيل - The update has been downloaded, press OK to install. تم تنزيل التحديث، اضغط على OK للتثبيت. - Failed to save the update file at فشل في حفظ ملف التحديث في - Starting Update... بدء التحديث... - Failed to create the update script file فشل في إنشاء ملف سكريبت التحديث @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 41319c7ff..51fa2ca5f 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches Trick / Patches - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Åbn Mappe... - Open Game Folder Åbn Spilmappe - Open Save Data Folder Åbn Gem Data Mappe - Open Log Folder Åbn Log Mappe - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Tjek for opdateringer - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Download Tricks / Patches - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Hjælp - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Spiloversigt + + + * Unsupported Vulkan Version + * Ikke understøttet Vulkan-version + + + Download Cheats For All Installed Games + Hent snyd til alle installerede spil + + + Download Patches For All Games + Hent patches til alle spil + + + Download Complete + Download fuldført + + + You have downloaded cheats for all the games you have installed. + Du har hentet snyd til alle de spil, du har installeret. + + + Patches Downloaded Successfully! + Patcher hentet med succes! + + + All Patches available for all games have been downloaded. + Alle patches til alle spil er blevet hentet. + + + Games: + Spil: + + + PKG File (*.PKG) + PKG-fil (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + Game Boot + Spil-boot + + + Only one file can be selected! + Kun én fil kan vælges! + + + PKG Extraction + PKG-udtrækning + + + Patch detected! + Opdatering detekteret! + + + PKG and Game versions match: + PKG og spilversioner matcher: + + + Would you like to overwrite? + Vil du overskrive? + + + PKG Version %1 is older than installed version: + PKG Version %1 er ældre end den installerede version: + + + Game is installed: + Spillet er installeret: + + + Would you like to install Patch: + Vil du installere opdateringen: + + + DLC Installation + DLC Installation + + + Would you like to install DLC: %1? + Vil du installere DLC: %1? + + + DLC already installed: + DLC allerede installeret: + + + Game already installed + Spillet er allerede installeret + + + PKG is a patch, please install the game first! + PKG er en patch, venligst installer spillet først! + + + PKG ERROR + PKG FEJL + + + Extracting PKG %1/%2 + Udvinding af PKG %1/%2 + + + Extraction Finished + Udvinding afsluttet + + + Game successfully installed at %1 + Spillet blev installeret succesfuldt på %1 + + + File doesn't appear to be a valid PKG file + Filen ser ikke ud til at være en gyldig PKG-fil + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Aktiver Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Indtastning - Cursor Markør - Hide Cursor Skjul markør - Hide Cursor Idle Timeout Timeout for skjul markør ved inaktivitet - s s - Controller Controller - Back Button Behavior Tilbageknap adfærd - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Stier - Game Folders Spilmapper - Add... Tilføj... - Remove Fjern - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Opdatering - Check for Updates at Startup Tjek for opdateringer ved start - Update Channel Opdateringskanal - Check for Updates Tjek for opdateringer - GUI Settings GUI-Indstillinger - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Afspil titelsang - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Lydstyrke - Audio Backend Audio Backend - - - MainWindow - - Game List - Spiloversigt - - - - * Unsupported Vulkan Version - * Ikke understøttet Vulkan-version - - - - Download Cheats For All Installed Games - Hent snyd til alle installerede spil - - - - Download Patches For All Games - Hent patches til alle spil - - - - Download Complete - Download fuldført - - - - You have downloaded cheats for all the games you have installed. - Du har hentet snyd til alle de spil, du har installeret. - - - - Patches Downloaded Successfully! - Patcher hentet med succes! - - - - All Patches available for all games have been downloaded. - Alle patches til alle spil er blevet hentet. - - - - Games: - Spil: - - - - PKG File (*.PKG) - PKG-fil (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - - Game Boot - Spil-boot - - - - Only one file can be selected! - Kun én fil kan vælges! - - - - PKG Extraction - PKG-udtrækning - - - - Patch detected! - Opdatering detekteret! - - - - PKG and Game versions match: - PKG og spilversioner matcher: - - - - Would you like to overwrite? - Vil du overskrive? - - - - PKG Version %1 is older than installed version: - PKG Version %1 er ældre end den installerede version: - - - - Game is installed: - Spillet er installeret: - - - - Would you like to install Patch: - Vil du installere opdateringen: - - - - DLC Installation - DLC Installation - - - - Would you like to install DLC: %1? - Vil du installere DLC: %1? - - - - DLC already installed: - DLC allerede installeret: - - - - Game already installed - Spillet er allerede installeret - - - - PKG is a patch, please install the game first! - PKG er en patch, venligst installer spillet først! - - - - PKG ERROR - PKG FEJL - - - - Extracting PKG %1/%2 - Udvinding af PKG %1/%2 - - - - Extraction Finished - Udvinding afsluttet - - - - Game successfully installed at %1 - Spillet blev installeret succesfuldt på %1 - - - - File doesn't appear to be a valid PKG file - Filen ser ikke ud til at være en gyldig PKG-fil - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Ingen billede tilgængelig - - - - Serial: - Serienummer: - - - - Version: - Version: - - - - Size: - Størrelse: - - - - Select Cheat File: - Vælg snyd-fil: - - - - Repository: - Repository: - - - - Download Cheats - Hent snyd - - - - Delete File - Slet fil - - - - No files selected. - Ingen filer valgt. - - - - You can delete the cheats you don't want after downloading them. - Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. - - - - Do you want to delete the selected file?\n%1 - Ønsker du at slette den valgte fil?\n%1 - - - - Select Patch File: - Vælg patch-fil: - - - - Download Patches - Hent patches - - - Save Gem - - Cheats - Snyd - - - - Patches - Patches - - - - Error - Fejl - - - - No patch selected. - Ingen patch valgt. - - - - Unable to open files.json for reading. - Kan ikke åbne files.json til læsning. - - - - No patch file found for the current serial. - Ingen patch-fil fundet for det nuværende serienummer. - - - - Unable to open the file for reading. - Kan ikke åbne filen til læsning. - - - - Unable to open the file for writing. - Kan ikke åbne filen til skrivning. - - - - Failed to parse XML: - Kunne ikke analysere XML: - - - - Success - Succes - - - - Options saved successfully. - Indstillinger gemt med succes. - - - - Invalid Source - Ugyldig kilde - - - - The selected source is invalid. - Den valgte kilde er ugyldig. - - - - File Exists - Fil findes - - - - File already exists. Do you want to replace it? - Filen findes allerede. Vil du erstatte den? - - - - Failed to save file: - Kunne ikke gemme fil: - - - - Failed to download file: - Kunne ikke hente fil: - - - - Cheats Not Found - Snyd ikke fundet - - - - CheatsNotFound_MSG - Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. - - - - Cheats Downloaded Successfully - Snyd hentet med succes - - - - CheatsDownloadedSuccessfully_MSG - Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. - - - - Failed to save: - Kunne ikke gemme: - - - - Failed to download: - Kunne ikke hente: - - - - Download Complete - Download fuldført - - - - DownloadComplete_MSG - Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. - - - - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. - - - - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. - - - - The game is in version: %1 - Spillet er i version: %1 - - - - The downloaded patch only works on version: %1 - Den downloadede patch fungerer kun på version: %1 - - - - You may need to update your game. - Du skal muligvis opdatere dit spil. - - - - Incompatibility Notice - Uforenelighedsmeddelelse - - - - Failed to open file: - Kunne ikke åbne fil: - - - - XML ERROR: - XML FEJL: - - - - Failed to open files.json for writing - Kunne ikke åbne files.json til skrivning - - - - Author: - Forfatter: - - - - Directory does not exist: - Mappe findes ikke: - - - - Failed to open files.json for reading. - Kunne ikke åbne files.json til læsning. - - - - Name: - Navn: - - - - Can't apply cheats before the game is started - Kan ikke anvende snyd før spillet er startet. - - - - SettingsDialog - - - Save - Gem - - - Apply Anvend - Restore Defaults Gendan standardindstillinger - Close Luk - Point your mouse at an option to display its description. Peg musen over et valg for at vise dets beskrivelse. - consoleLanguageGroupBox Konsolsprog:\nIndstiller sproget, som PS4-spillet bruger.\nDet anbefales at indstille dette til et sprog, som spillet understøtter, hvilket kan variere efter region. - emulatorLanguageGroupBox Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. - fullscreenCheckBox Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Vis startskærm:\nViser en startskærm (speciel grafik) under opstarten. - ps4proCheckBox Er det en PS4 Pro:\nGør det muligt for emulatoren at fungere som en PS4 PRO, hvilket kan aktivere visse funktioner i spil, der understøtter det. - discordRPCCheckbox Aktiver Discord Rich Presence:\nViser emulatorikonet og relevante oplysninger på din Discord-profil. - userName Brugernavn:\nIndstiller PS4-kontoens navn, som kan blive vist i nogle spil. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Logtype:\nIndstiller, om logvinduets output vil blive synkroniseret for at øge ydeevnen. Dette kan påvirke emulatorens ydeevne negativt. - logFilter Logfilter:\nFiltrerer loggen for kun at udskrive bestemte oplysninger.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer. - updaterGroupBox Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. - GUIgroupBox Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Skjul Cursor:\nVælg hvornår cursoren skal forsvinde:\nAldrig: Du vil altid se musen.\nInaktiv: Indstil en tid for, hvornår den skal forsvinde efter at være inaktiv.\nAltid: du vil aldrig se musen. - idleTimeoutGroupBox Indstil en tid for, at musen skal forsvinde efter at være inaktiv. - backButtonBehaviorGroupBox Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk på den angivne position på PS4 berøringsflade. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Aldrig - Idle Inaktiv - Always Altid - Touchpad Left Berøringsplade Venstre - Touchpad Right Berøringsplade Højre - Touchpad Center Berøringsplade Center - None Ingen - graphicsAdapterGroupBox Grafikadapter:\nPå systemer med flere GPU'er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge "Auto Select" for at vælge den automatisk. - resolutionLayout Skærmopløsning:\nIndstiller emulatorvinduets størrelse under afspilning, som kan ændres under afspilning.\nDette er forskelligt fra selve spillets opløsning. - heightDivider Opdateringshastighedsdeler:\nMultiplicerer den frekvens, som emulatoren opdaterer billedet med, med dette tal. Ændring af dette kan have negative effekter, såsom hurtigere spil eller ødelagte funktioner! - dumpShadersCheckBox Aktiver dumping af Shaders:\nTil teknisk fejlfinding gemmer det spillets shaders i en mappe under afspilning. - nullGpuCheckBox Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort. - gameFoldersBox Spilmappen:\nListen over mapper til at tjekke for installerede spil. - addFolderButton Tilføj:\nTilføj en mappe til listen. - removeFolderButton Fjern:\nFjern en mappe fra listen. - debugDump Aktiver debugging-dump:\nGemmer import/export-symboler og headeroplysninger for det aktuelle PS4-program til en mappe. - vkValidationCheckBox Aktiver Vulkan-valideringslag:\nAktiverer et system, der validerer Vulkan-driverens tilstand og logger oplysninger om dens interne tilstand. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - vkSyncValidationCheckBox Aktiver Vulkan-synkroniseringsvalidering:\nAktiverer et system, der validerer tidspunktet for Vulkan's renderingsopgaver. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - rdocCheckBox Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Ingen billede tilgængelig + + + Serial: + Serienummer: + + + Version: + Version: + + + Size: + Størrelse: + + + Select Cheat File: + Vælg snyd-fil: + + + Repository: + Repository: + + + Download Cheats + Hent snyd + + + Delete File + Slet fil + + + No files selected. + Ingen filer valgt. + + + You can delete the cheats you don't want after downloading them. + Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. + + + Do you want to delete the selected file?\n%1 + Ønsker du at slette den valgte fil?\n%1 + + + Select Patch File: + Vælg patch-fil: + + + Download Patches + Hent patches + + + Save + Gem + + + Cheats + Snyd + + + Patches + Patches + + + Error + Fejl + + + No patch selected. + Ingen patch valgt. + + + Unable to open files.json for reading. + Kan ikke åbne files.json til læsning. + + + No patch file found for the current serial. + Ingen patch-fil fundet for det nuværende serienummer. + + + Unable to open the file for reading. + Kan ikke åbne filen til læsning. + + + Unable to open the file for writing. + Kan ikke åbne filen til skrivning. + + + Failed to parse XML: + Kunne ikke analysere XML: + + + Success + Succes + + + Options saved successfully. + Indstillinger gemt med succes. + + + Invalid Source + Ugyldig kilde + + + The selected source is invalid. + Den valgte kilde er ugyldig. + + + File Exists + Fil findes + + + File already exists. Do you want to replace it? + Filen findes allerede. Vil du erstatte den? + + + Failed to save file: + Kunne ikke gemme fil: + + + Failed to download file: + Kunne ikke hente fil: + + + Cheats Not Found + Snyd ikke fundet + + + CheatsNotFound_MSG + Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. + + + Cheats Downloaded Successfully + Snyd hentet med succes + + + CheatsDownloadedSuccessfully_MSG + Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. + + + Failed to save: + Kunne ikke gemme: + + + Failed to download: + Kunne ikke hente: + + + Download Complete + Download fuldført + + + DownloadComplete_MSG + Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. + + + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. + + + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. + + + The game is in version: %1 + Spillet er i version: %1 + + + The downloaded patch only works on version: %1 + Den downloadede patch fungerer kun på version: %1 + + + You may need to update your game. + Du skal muligvis opdatere dit spil. + + + Incompatibility Notice + Uforenelighedsmeddelelse + + + Failed to open file: + Kunne ikke åbne fil: + + + XML ERROR: + XML FEJL: + + + Failed to open files.json for writing + Kunne ikke åbne files.json til skrivning + + + Author: + Forfatter: + + + Directory does not exist: + Mappe findes ikke: + + + Failed to open files.json for reading. + Kunne ikke åbne files.json til læsning. + + + Name: + Navn: + + + Can't apply cheats before the game is started + Kan ikke anvende snyd før spillet er startet. + + GameListFrame - Icon Ikon - Name Navn - Serial Seriel - Compatibility Compatibility - Region Region - Firmware Firmware - Size Størrelse - Version Version - Path Sti - Play Time Spilletid - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automatisk opdatering - Error Fejl - Network error: Netsværksfejl: - Failed to parse update information. Kunne ikke analysere opdateringsoplysninger. - No pre-releases found. Ingen forhåndsudgivelser fundet. - Invalid release data. Ugyldige udgivelsesdata. - No download URL found for the specified asset. Ingen download-URL fundet for den specificerede aktiver. - Your version is already up to date! Din version er allerede opdateret! - Update Available Opdatering tilgængelig - Update Channel Opdateringskanal - Current Version Nuværende version - Latest Version Nyeste version - Do you want to update? Vil du opdatere? - Show Changelog Vis ændringslog - Check for Updates at Startup Tjek for opdateringer ved start - Update Opdater - No Nej - Hide Changelog Skjul ændringslog - Changes Ændringer - Network error occurred while trying to access the URL Netsværksfejl opstod, mens der blev forsøgt at få adgang til URL'en - Download Complete Download fuldført - The update has been downloaded, press OK to install. Opdateringen er blevet downloadet, tryk på OK for at installere. - Failed to save the update file at Kunne ikke gemme opdateringsfilen på - Starting Update... Starter opdatering... - Failed to create the update script file Kunne ikke oprette opdateringsscriptfilen @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 62897fe24..1653298cf 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Über shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. - This software should not be used to play games you have not legally obtained. Diese Software soll nicht dazu benutzt werden illegal kopierte Spiele zu spielen. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Ordner öffnen @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Lade Spielliste, bitte warten :3 - Cancel Abbrechen - Loading... Lade... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Wähle Ordner - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Wähle Ordner - Directory to install games Installationsverzeichnis für Spiele - Browse Durchsuchen - Error Fehler - The value for location to install games is not valid. Der ausgewählte Ordner ist nicht gültig. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Verknüpfung erstellen - Cheats / Patches Cheats / Patches - SFO Viewer SFO anzeigen - Trophy Viewer Trophäen anzeigen - Open Folder... Ordner öffnen... - Open Game Folder Spielordner öffnen - Open Save Data Folder Speicherordner öffnen - Open Log Folder Protokollordner öffnen - Copy info... Infos kopieren... - Copy Name Namen kopieren - Copy Serial Seriennummer kopieren - Copy All Alles kopieren - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Verknüpfungserstellung - Shortcut created successfully! Verknüpfung erfolgreich erstellt! - Error Fehler - Error creating shortcut! Fehler beim Erstellen der Verknüpfung! - Install PKG PKG installieren - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Elf-Ordner öffnen/hinzufügen - Install Packages (PKG) Pakete installieren (PKG) - Boot Game Spiel starten - Check for Updates Nach Updates suchen - About shadPS4 Über shadPS4 - Configure... Konfigurieren... - Install application from a .pkg file Installiere Anwendung aus .pkg-Datei - Recent Games Zuletzt gespielt - Exit Beenden - Exit shadPS4 shadPS4 beenden - Exit the application. Die Anwendung beenden. - Show Game List Spielliste anzeigen - Game List Refresh Spielliste aktualisieren - Tiny Winzig - Small Klein - Medium Mittel - Large Groß - List View Listenansicht - Grid View Gitteransicht - Elf Viewer Elf-Ansicht - Game Install Directory Installationsverzeichnis für Spiele - Download Cheats/Patches Cheats / Patches herunterladen - Dump Game List Spielliste ausgeben - PKG Viewer PKG-Ansicht - Search... Suchen... - File Datei - View Ansicht - Game List Icons Game List Icons - Game List Mode Spiellisten-Symoble - Settings Einstellungen - Utils Werkzeuge - Themes Stile - Help Hilfe - Dark Dunkel - Light Hell - Green Grün - Blue Blau - Violet Violett - toolBar toolBar + + Game List + Spieleliste + + + * Unsupported Vulkan Version + * Nicht unterstützte Vulkan-Version + + + Download Cheats For All Installed Games + Cheats für alle installierten Spiele herunterladen + + + Download Patches For All Games + Patches für alle Spiele herunterladen + + + Download Complete + Download abgeschlossen + + + You have downloaded cheats for all the games you have installed. + Sie haben Cheats für alle installierten Spiele heruntergeladen. + + + Patches Downloaded Successfully! + Patches erfolgreich heruntergeladen! + + + All Patches available for all games have been downloaded. + Alle Patches für alle Spiele wurden heruntergeladen. + + + Games: + Spiele: + + + PKG File (*.PKG) + PKG-Datei (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF-Dateien (*.bin *.elf *.oelf) + + + Game Boot + Spiel-Start + + + Only one file can be selected! + Es kann nur eine Datei ausgewählt werden! + + + PKG Extraction + PKG-Extraktion + + + Patch detected! + Patch erkannt! + + + PKG and Game versions match: + PKG- und Spielversionen stimmen überein: + + + Would you like to overwrite? + Willst du überschreiben? + + + PKG Version %1 is older than installed version: + PKG-Version %1 ist älter als die installierte Version: + + + Game is installed: + Spiel ist installiert: + + + Would you like to install Patch: + Willst du den Patch installieren: + + + DLC Installation + DLC-Installation + + + Would you like to install DLC: %1? + Willst du den DLC installieren: %1? + + + DLC already installed: + DLC bereits installiert: + + + Game already installed + Spiel bereits installiert + + + PKG is a patch, please install the game first! + PKG ist ein Patch, bitte installieren Sie zuerst das Spiel! + + + PKG ERROR + PKG-FEHLER + + + Extracting PKG %1/%2 + Extrahiere PKG %1/%2 + + + Extraction Finished + Extraktion abgeschlossen + + + Game successfully installed at %1 + Spiel erfolgreich installiert auf %1 + + + File doesn't appear to be a valid PKG file + Die Datei scheint keine gültige PKG-Datei zu sein + PKGViewer - Open Folder Ordner öffnen @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophäenansicht @@ -478,1029 +509,700 @@ SettingsDialog - Settings Einstellungen - General Allgemein - System System - Console Language Konsolensprache - Emulator Language Emulatorsprache - Emulator Emulator - Enable Fullscreen Vollbild aktivieren - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Startbildschirm anzeigen - Is PS4 Pro Ist PS4 Pro - Enable Discord Rich Presence Discord Rich Presence aktivieren - Username Benutzername - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Logtyp - Log Filter Log-Filter - Input Eingabe - Cursor Cursor - Hide Cursor Cursor ausblenden - Hide Cursor Idle Timeout Inaktivitätszeitüberschreitung zum Ausblenden des Cursors - s s - Controller Controller - Back Button Behavior Verhalten der Zurück-Taste - Graphics Grafik - Graphics Device Grafikgerät - Width Breite - Height Höhe - Vblank Divider Vblank-Teiler - Advanced Erweitert - Enable Shaders Dumping Shader-Dumping aktivieren - Enable NULL GPU NULL GPU aktivieren - Paths Pfad - Game Folders Spieleordner - Add... Hinzufügen... - Remove Entfernen - Debug Debug - Enable Debug Dumping Debug-Dumping aktivieren - Enable Vulkan Validation Layers Vulkan Validations-Ebenen aktivieren - Enable Vulkan Synchronization Validation Vulkan Synchronisations-Validierung aktivieren - Enable RenderDoc Debugging RenderDoc-Debugging aktivieren - Update Aktualisieren - Check for Updates at Startup Beim Start nach Updates suchen - Update Channel Update-Kanal - Check for Updates Nach Updates suchen - GUI Settings GUI-Einstellungen - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Titelmusik abspielen - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Lautstärke - Audio Backend Audio Backend - - - MainWindow - - Game List - Spieleliste - - - - * Unsupported Vulkan Version - * Nicht unterstützte Vulkan-Version - - - - Download Cheats For All Installed Games - Cheats für alle installierten Spiele herunterladen - - - - Download Patches For All Games - Patches für alle Spiele herunterladen - - - - Download Complete - Download abgeschlossen - - - - You have downloaded cheats for all the games you have installed. - Sie haben Cheats für alle installierten Spiele heruntergeladen. - - - - Patches Downloaded Successfully! - Patches erfolgreich heruntergeladen! - - - - All Patches available for all games have been downloaded. - Alle Patches für alle Spiele wurden heruntergeladen. - - - - Games: - Spiele: - - - - PKG File (*.PKG) - PKG-Datei (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-Dateien (*.bin *.elf *.oelf) - - - - Game Boot - Spiel-Start - - - - Only one file can be selected! - Es kann nur eine Datei ausgewählt werden! - - - - PKG Extraction - PKG-Extraktion - - - - Patch detected! - Patch erkannt! - - - - PKG and Game versions match: - PKG- und Spielversionen stimmen überein: - - - - Would you like to overwrite? - Willst du überschreiben? - - - - PKG Version %1 is older than installed version: - PKG-Version %1 ist älter als die installierte Version: - - - - Game is installed: - Spiel ist installiert: - - - - Would you like to install Patch: - Willst du den Patch installieren: - - - - DLC Installation - DLC-Installation - - - - Would you like to install DLC: %1? - Willst du den DLC installieren: %1? - - - - DLC already installed: - DLC bereits installiert: - - - - Game already installed - Spiel bereits installiert - - - - PKG is a patch, please install the game first! - PKG ist ein Patch, bitte installieren Sie zuerst das Spiel! - - - - PKG ERROR - PKG-FEHLER - - - - Extracting PKG %1/%2 - Extrahiere PKG %1/%2 - - - - Extraction Finished - Extraktion abgeschlossen - - - - Game successfully installed at %1 - Spiel erfolgreich installiert auf %1 - - - - File doesn't appear to be a valid PKG file - Die Datei scheint keine gültige PKG-Datei zu sein - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Kein Bild verfügbar - - - - Serial: - Seriennummer: - - - - Version: - Version: - - - - Size: - Größe: - - - - Select Cheat File: - Cheat-Datei auswählen: - - - - Repository: - Repository: - - - - Download Cheats - Cheats herunterladen - - - - Delete File - Datei löschen - - - - No files selected. - Keine Dateien ausgewählt. - - - - You can delete the cheats you don't want after downloading them. - Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. - - - - Do you want to delete the selected file?\n%1 - Willst du die ausgewählte Datei löschen?\n%1 - - - - Select Patch File: - Patch-Datei auswählen: - - - - Download Patches - Patches herunterladen - - - Save Speichern - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Fehler - - - - No patch selected. - Kein Patch ausgewählt. - - - - Unable to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. - - - - No patch file found for the current serial. - Keine Patch-Datei für die aktuelle Seriennummer gefunden. - - - - Unable to open the file for reading. - Kann die Datei nicht zum Lesen öffnen. - - - - Unable to open the file for writing. - Kann die Datei nicht zum Schreiben öffnen. - - - - Failed to parse XML: - Fehler beim Parsen von XML: - - - - Success - Erfolg - - - - Options saved successfully. - Optionen erfolgreich gespeichert. - - - - Invalid Source - Ungültige Quelle - - - - The selected source is invalid. - Die ausgewählte Quelle ist ungültig. - - - - File Exists - Datei existiert - - - - File already exists. Do you want to replace it? - Datei existiert bereits. Möchtest du sie ersetzen? - - - - Failed to save file: - Fehler beim Speichern der Datei: - - - - Failed to download file: - Fehler beim Herunterladen der Datei: - - - - Cheats Not Found - Cheats nicht gefunden - - - - CheatsNotFound_MSG - Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. - - - - Cheats Downloaded Successfully - Cheats erfolgreich heruntergeladen - - - - CheatsDownloadedSuccessfully_MSG - Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. - - - - Failed to save: - Speichern fehlgeschlagen: - - - - Failed to download: - Herunterladen fehlgeschlagen: - - - - Download Complete - Download abgeschlossen - - - - DownloadComplete_MSG - Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. - - - - Failed to parse JSON data from HTML. - Fehler beim Parsen der JSON-Daten aus HTML. - - - - Failed to retrieve HTML page. - Fehler beim Abrufen der HTML-Seite. - - - - The game is in version: %1 - Das Spiel ist in der Version: %1 - - - - The downloaded patch only works on version: %1 - Der heruntergeladene Patch funktioniert nur in der Version: %1 - - - - You may need to update your game. - Sie müssen möglicherweise Ihr Spiel aktualisieren. - - - - Incompatibility Notice - Inkompatibilitätsbenachrichtigung - - - - Failed to open file: - Fehler beim Öffnen der Datei: - - - - XML ERROR: - XML-Fehler: - - - - Failed to open files.json for writing - Kann files.json nicht zum Schreiben öffnen - - - - Author: - Autor: - - - - Directory does not exist: - Verzeichnis existiert nicht: - - - - Failed to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. - - - - Name: - Name: - - - - Can't apply cheats before the game is started - Kann keine Cheats anwenden, bevor das Spiel gestartet ist. - - - - SettingsDialog - - - Save - Speichern - - - Apply Übernehmen - Restore Defaults Werkseinstellungen wiederherstellen - Close Schließen - Point your mouse at an option to display its description. Bewege die Maus über eine Option, um deren Beschreibung anzuzeigen. - consoleLanguageGroupBox Konsolensprache:\nLegt die Sprache fest, die das PS4-Spiel verwendet.\nEs wird empfohlen, diese auf eine vom Spiel unterstützte Sprache einzustellen, die je nach Region unterschiedlich sein kann. - emulatorLanguageGroupBox Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. - fullscreenCheckBox Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Startbildschirm anzeigen:\nZeigt beim Start einen speziellen Bildschirm (Splash) des Spiels an. - ps4proCheckBox Ist es eine PS4 Pro:\nErmöglicht es dem Emulator, als PS4 PRO zu arbeiten, was in Spielen, die dies unterstützen, spezielle Funktionen aktivieren kann. - discordRPCCheckbox Discord Rich Presence aktivieren:\nZeigt das Emulator-Icon und relevante Informationen in deinem Discord-Profil an. - userName Benutzername:\nLegt den Namen des PS4-Kontos fest, der in einigen Spielen angezeigt werden kann. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Protokolltyp:\nLegt fest, ob die Ausgabe des Protokollfensters synchronisiert wird, um die Leistung zu verbessern. Dies kann sich negativ auf die Emulation auswirken. - logFilter Protokollfilter:\nFiltert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden.\nBeispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an. - updaterGroupBox Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. - GUIgroupBox Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Maus ausblenden:\nWählen Sie, wann der Cursor verschwinden soll:\nNie: Sie sehen die Maus immer.\nInaktiv: Legen Sie eine Zeit fest, nach der sie nach Inaktivität verschwindet.\nImmer: Sie sehen die Maus niemals. - idleTimeoutGroupBox Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll. - backButtonBehaviorGroupBox Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Niemals - Idle Im Leerlauf - Always Immer - Touchpad Left Touchpad Links - Touchpad Right Touchpad Rechts - Touchpad Center Touchpad Mitte - None Keine - graphicsAdapterGroupBox Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie "Auto Select", um sie automatisch auszuwählen. - resolutionLayout Auflösung:\nLegt die Größe des Emulator-Fensters während der Wiedergabe fest, die während der Wiedergabe geändert werden kann.\nDies unterscheidet sich von der tatsächlichen Spielauflösung. - heightDivider Framerate-Teiler:\nMultipliziert die Bildrate, mit der der Emulator aktualisiert wird, mit diesem Wert. Dies kann sich negativ auswirken, wie z.B. beschleunigtes Gameplay oder Funktionsstörungen! - dumpShadersCheckBox Shader-Dumping aktivieren:\nZum technischen Debuggen speichert es die Shaders des Spiels in einem Ordner während der Wiedergabe. - nullGpuCheckBox Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre. - gameFoldersBox Spieleordner:\nDie Liste der Ordner, in denen nach installierten Spielen gesucht wird. - addFolderButton Hinzufügen:\nFügen Sie einen Ordner zur Liste hinzu. - removeFolderButton Entfernen:\nEntfernen Sie einen Ordner aus der Liste. - debugDump Debug-Dump aktivieren:\nSpeichert Import-/Exportsymbole und Headerinformationen des aktuellen PS4-Programms in einem Verzeichnis. - vkValidationCheckBox Vulkan-Validierungsebenen aktivieren:\nAktiviert ein System, das den Zustand des Vulkan-Treibers validiert und Informationen über dessen internen Zustand protokolliert. Dies verringert die Leistung und kann möglicherweise das Verhalten der Emulation ändern. - vkSyncValidationCheckBox Vulkan-Synchronisationsvalidierung aktivieren:\nAktiviert ein System, das die Zeitplanung der Rendering-Aufgaben von Vulkan validiert. Dies wird die Leistung verringern und kann möglicherweise das Verhalten der Emulation ändern. - rdocCheckBox RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Kein Bild verfügbar + + + Serial: + Seriennummer: + + + Version: + Version: + + + Size: + Größe: + + + Select Cheat File: + Cheat-Datei auswählen: + + + Repository: + Repository: + + + Download Cheats + Cheats herunterladen + + + Delete File + Datei löschen + + + No files selected. + Keine Dateien ausgewählt. + + + You can delete the cheats you don't want after downloading them. + Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. + + + Do you want to delete the selected file?\n%1 + Willst du die ausgewählte Datei löschen?\n%1 + + + Select Patch File: + Patch-Datei auswählen: + + + Download Patches + Patches herunterladen + + + Save + Speichern + + + Cheats + Cheats + + + Patches + Patches + + + Error + Fehler + + + No patch selected. + Kein Patch ausgewählt. + + + Unable to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. + + + No patch file found for the current serial. + Keine Patch-Datei für die aktuelle Seriennummer gefunden. + + + Unable to open the file for reading. + Kann die Datei nicht zum Lesen öffnen. + + + Unable to open the file for writing. + Kann die Datei nicht zum Schreiben öffnen. + + + Failed to parse XML: + Fehler beim Parsen von XML: + + + Success + Erfolg + + + Options saved successfully. + Optionen erfolgreich gespeichert. + + + Invalid Source + Ungültige Quelle + + + The selected source is invalid. + Die ausgewählte Quelle ist ungültig. + + + File Exists + Datei existiert + + + File already exists. Do you want to replace it? + Datei existiert bereits. Möchtest du sie ersetzen? + + + Failed to save file: + Fehler beim Speichern der Datei: + + + Failed to download file: + Fehler beim Herunterladen der Datei: + + + Cheats Not Found + Cheats nicht gefunden + + + CheatsNotFound_MSG + Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. + + + Cheats Downloaded Successfully + Cheats erfolgreich heruntergeladen + + + CheatsDownloadedSuccessfully_MSG + Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. + + + Failed to save: + Speichern fehlgeschlagen: + + + Failed to download: + Herunterladen fehlgeschlagen: + + + Download Complete + Download abgeschlossen + + + DownloadComplete_MSG + Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. + + + Failed to parse JSON data from HTML. + Fehler beim Parsen der JSON-Daten aus HTML. + + + Failed to retrieve HTML page. + Fehler beim Abrufen der HTML-Seite. + + + The game is in version: %1 + Das Spiel ist in der Version: %1 + + + The downloaded patch only works on version: %1 + Der heruntergeladene Patch funktioniert nur in der Version: %1 + + + You may need to update your game. + Sie müssen möglicherweise Ihr Spiel aktualisieren. + + + Incompatibility Notice + Inkompatibilitätsbenachrichtigung + + + Failed to open file: + Fehler beim Öffnen der Datei: + + + XML ERROR: + XML-Fehler: + + + Failed to open files.json for writing + Kann files.json nicht zum Schreiben öffnen + + + Author: + Autor: + + + Directory does not exist: + Verzeichnis existiert nicht: + + + Failed to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. + + + Name: + Name: + + + Can't apply cheats before the game is started + Kann keine Cheats anwenden, bevor das Spiel gestartet ist. + + GameListFrame - Icon Symbol - Name Name - Serial Seriennummer - Compatibility Compatibility - Region Region - Firmware Firmware - Size Größe - Version Version - Path Pfad - Play Time Spielzeit - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automatischer Aktualisierer - Error Fehler - Network error: Netzwerkfehler: - Failed to parse update information. Fehler beim Parsen der Aktualisierungsinformationen. - No pre-releases found. Keine Vorabveröffentlichungen gefunden. - Invalid release data. Ungültige Versionsdaten. - No download URL found for the specified asset. Keine Download-URL für das angegebene Asset gefunden. - Your version is already up to date! Ihre Version ist bereits aktuell! - Update Available Aktualisierung verfügbar - Update Channel Update-Kanal - Current Version Aktuelle Version - Latest Version Neueste Version - Do you want to update? Möchten Sie aktualisieren? - Show Changelog Änderungsprotokoll anzeigen - Check for Updates at Startup Beim Start nach Updates suchen - Update Aktualisieren - No Nein - Hide Changelog Änderungsprotokoll ausblenden - Changes Änderungen - Network error occurred while trying to access the URL Beim Zugriff auf die URL ist ein Netzwerkfehler aufgetreten - Download Complete Download abgeschlossen - The update has been downloaded, press OK to install. Die Aktualisierung wurde heruntergeladen, drücken Sie OK, um zu installieren. - Failed to save the update file at Fehler beim Speichern der Aktualisierungsdatei in - Starting Update... Aktualisierung wird gestartet... - Failed to create the update script file Fehler beim Erstellen der Aktualisierungs-Skriptdatei @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 43ed81c33..6226e1292 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches Kodikí / Enimeróseis - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Άνοιγμα Φακέλου... - Open Game Folder Άνοιγμα Φακέλου Παιχνιδιού - Open Save Data Folder Άνοιγμα Φακέλου Αποθηκευμένων Δεδομένων - Open Log Folder Άνοιγμα Φακέλου Καταγραφής - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Έλεγχος για ενημερώσεις - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Κατεβάστε Κωδικούς / Ενημερώσεις - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Βοήθεια - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Λίστα παιχνιδιών + + + * Unsupported Vulkan Version + * Μη υποστηριζόμενη έκδοση Vulkan + + + Download Cheats For All Installed Games + Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια + + + Download Patches For All Games + Λήψη Patches για όλα τα παιχνίδια + + + Download Complete + Η λήψη ολοκληρώθηκε + + + You have downloaded cheats for all the games you have installed. + Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. + + + Patches Downloaded Successfully! + Τα Patches κατέβηκαν επιτυχώς! + + + All Patches available for all games have been downloaded. + Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. + + + Games: + Παιχνίδια: + + + PKG File (*.PKG) + Αρχείο PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Αρχεία ELF (*.bin *.elf *.oelf) + + + Game Boot + Εκκίνηση παιχνιδιού + + + Only one file can be selected! + Μπορεί να επιλεγεί μόνο ένα αρχείο! + + + PKG Extraction + Εξαγωγή PKG + + + Patch detected! + Αναγνώριση ενημέρωσης! + + + PKG and Game versions match: + Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: + + + Would you like to overwrite? + Θέλετε να αντικαταστήσετε; + + + PKG Version %1 is older than installed version: + Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: + + + Game is installed: + Το παιχνίδι είναι εγκατεστημένο: + + + Would you like to install Patch: + Θέλετε να εγκαταστήσετε την ενημέρωση: + + + DLC Installation + Εγκατάσταση DLC + + + Would you like to install DLC: %1? + Θέλετε να εγκαταστήσετε το DLC: %1; + + + DLC already installed: + DLC ήδη εγκατεστημένο: + + + Game already installed + Παιχνίδι ήδη εγκατεστημένο + + + PKG is a patch, please install the game first! + Το PKG είναι patch, παρακαλώ εγκαταστήστε πρώτα το παιχνίδι! + + + PKG ERROR + ΣΦΑΛΜΑ PKG + + + Extracting PKG %1/%2 + Εξαγωγή PKG %1/%2 + + + Extraction Finished + Η εξαγωγή ολοκληρώθηκε + + + Game successfully installed at %1 + Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 + + + File doesn't appear to be a valid PKG file + Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Ενεργοποίηση Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Είσοδος - Cursor Δείκτης - Hide Cursor Απόκρυψη δείκτη - Hide Cursor Idle Timeout Χρόνος αδράνειας απόκρυψης δείκτη - s s - Controller Controller - Back Button Behavior Συμπεριφορά κουμπιού επιστροφής - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Διαδρομές - Game Folders Φάκελοι παιχνιδιών - Add... Προσθήκη... - Remove Αφαίρεση - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Ενημέρωση - Check for Updates at Startup Έλεγχος για ενημερώσεις κατά την εκκίνηση - Update Channel Κανάλι Ενημέρωσης - Check for Updates Έλεγχος για ενημερώσεις - GUI Settings Ρυθμίσεις GUI - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Αναπαραγωγή μουσικής τίτλου - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume ένταση - Audio Backend Audio Backend - - - MainWindow - - Game List - Λίστα παιχνιδιών - - - - * Unsupported Vulkan Version - * Μη υποστηριζόμενη έκδοση Vulkan - - - - Download Cheats For All Installed Games - Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια - - - - Download Patches For All Games - Λήψη Patches για όλα τα παιχνίδια - - - - Download Complete - Η λήψη ολοκληρώθηκε - - - - You have downloaded cheats for all the games you have installed. - Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. - - - - Patches Downloaded Successfully! - Τα Patches κατέβηκαν επιτυχώς! - - - - All Patches available for all games have been downloaded. - Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. - - - - Games: - Παιχνίδια: - - - - PKG File (*.PKG) - Αρχείο PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Αρχεία ELF (*.bin *.elf *.oelf) - - - - Game Boot - Εκκίνηση παιχνιδιού - - - - Only one file can be selected! - Μπορεί να επιλεγεί μόνο ένα αρχείο! - - - - PKG Extraction - Εξαγωγή PKG - - - - Patch detected! - Αναγνώριση ενημέρωσης! - - - - PKG and Game versions match: - Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: - - - - Would you like to overwrite? - Θέλετε να αντικαταστήσετε; - - - - PKG Version %1 is older than installed version: - Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: - - - - Game is installed: - Το παιχνίδι είναι εγκατεστημένο: - - - - Would you like to install Patch: - Θέλετε να εγκαταστήσετε την ενημέρωση: - - - - DLC Installation - Εγκατάσταση DLC - - - - Would you like to install DLC: %1? - Θέλετε να εγκαταστήσετε το DLC: %1; - - - - DLC already installed: - DLC ήδη εγκατεστημένο: - - - - Game already installed - Παιχνίδι ήδη εγκατεστημένο - - - - PKG is a patch, please install the game first! - Το PKG είναι patch, παρακαλώ εγκαταστήστε πρώτα το παιχνίδι! - - - - PKG ERROR - ΣΦΑΛΜΑ PKG - - - - Extracting PKG %1/%2 - Εξαγωγή PKG %1/%2 - - - - Extraction Finished - Η εξαγωγή ολοκληρώθηκε - - - - Game successfully installed at %1 - Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 - - - - File doesn't appear to be a valid PKG file - Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Δεν διατίθεται εικόνα - - - - Serial: - Σειριακός αριθμός: - - - - Version: - Έκδοση: - - - - Size: - Μέγεθος: - - - - Select Cheat File: - Επιλέξτε αρχείο Cheat: - - - - Repository: - Αποθετήριο: - - - - Download Cheats - Λήψη Cheats - - - - Delete File - Διαγραφή αρχείου - - - - No files selected. - Δεν έχουν επιλεγεί αρχεία. - - - - You can delete the cheats you don't want after downloading them. - Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. - - - - Do you want to delete the selected file?\n%1 - Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 - - - - Select Patch File: - Επιλέξτε αρχείο Patch: - - - - Download Patches - Λήψη Patches - - - Save Αποθήκευση - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Σφάλμα - - - - No patch selected. - Δεν έχει επιλεγεί κανένα patch. - - - - Unable to open files.json for reading. - Αδυναμία ανοίγματος του files.json για ανάγνωση. - - - - No patch file found for the current serial. - Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. - - - - Unable to open the file for reading. - Αδυναμία ανοίγματος του αρχείου για ανάγνωση. - - - - Unable to open the file for writing. - Αδυναμία ανοίγματος του αρχείου για εγγραφή. - - - - Failed to parse XML: - Αποτυχία ανάλυσης XML: - - - - Success - Επιτυχία - - - - Options saved successfully. - Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. - - - - Invalid Source - Μη έγκυρη Πηγή - - - - The selected source is invalid. - Η επιλεγμένη πηγή είναι μη έγκυρη. - - - - File Exists - Η αρχείο υπάρχει - - - - File already exists. Do you want to replace it? - Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; - - - - Failed to save file: - Αποτυχία αποθήκευσης αρχείου: - - - - Failed to download file: - Αποτυχία λήψης αρχείου: - - - - Cheats Not Found - Δεν βρέθηκαν Cheats - - - - CheatsNotFound_MSG - Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. - - - - Cheats Downloaded Successfully - Cheats κατεβάστηκαν επιτυχώς - - - - CheatsDownloadedSuccessfully_MSG - Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. - - - - Failed to save: - Αποτυχία αποθήκευσης: - - - - Failed to download: - Αποτυχία λήψης: - - - - Download Complete - Η λήψη ολοκληρώθηκε - - - - DownloadComplete_MSG - Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. - - - - Failed to parse JSON data from HTML. - Αποτυχία ανάλυσης δεδομένων JSON από HTML. - - - - Failed to retrieve HTML page. - Αποτυχία ανάκτησης σελίδας HTML. - - - - The game is in version: %1 - Το παιχνίδι είναι στην έκδοση: %1 - - - - The downloaded patch only works on version: %1 - Η ληφθείσα ενημέρωση λειτουργεί μόνο στην έκδοση: %1 - - - - You may need to update your game. - Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι σας. - - - - Incompatibility Notice - Ειδοποίηση ασυμβατότητας - - - - Failed to open file: - Αποτυχία ανοίγματος αρχείου: - - - - XML ERROR: - ΣΦΑΛΜΑ XML: - - - - Failed to open files.json for writing - Αποτυχία ανοίγματος του files.json για εγγραφή - - - - Author: - Συγγραφέας: - - - - Directory does not exist: - Ο φάκελος δεν υπάρχει: - - - - Failed to open files.json for reading. - Αποτυχία ανοίγματος του files.json για ανάγνωση. - - - - Name: - Όνομα: - - - - Can't apply cheats before the game is started - Δεν μπορείτε να εφαρμόσετε cheats πριν ξεκινήσει το παιχνίδι. - - - - SettingsDialog - - - Save - Αποθήκευση - - - Apply Εφαρμογή - Restore Defaults Επαναφορά Προεπιλογών - Close Κλείσιμο - Point your mouse at an option to display its description. Τοποθετήστε το ποντίκι σας πάνω σε μια επιλογή για να εμφανίσετε την περιγραφή της. - consoleLanguageGroupBox Γλώσσα Κονσόλας:\nΡυθμίζει τη γλώσσα που θα χρησιμοποιήσει το παιχνίδι PS4.\nΣυνιστάται να επιλέξετε μία από τις γλώσσες που υποστηρίζονται από το παιχνίδι, η οποία ενδέχεται να διαφέρει ανάλογα με την περιοχή. - emulatorLanguageGroupBox Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. - fullscreenCheckBox Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Εμφάνιση Splash Screen:\nΕμφανίζει ειδική γραφική οθόνη κατά την εκκίνηση. - ps4proCheckBox Είναι PS4 Pro:\nΕπιτρέπει στον εξομοιωτή να λειτουργεί σαν PS4 PRO, κάτι που μπορεί να ενεργοποιήσει συγκεκριμένες λειτουργίες σε παιχνίδια που το υποστηρίζουν. - discordRPCCheckbox Ενεργοποίηση Discord Rich Presence:\nΕμφανίζει το εικονίδιο του emulator και σχετικές πληροφορίες στο προφίλ σας στο Discord. - userName Όνομα Χρήστη:\nΟρίζει το όνομα του λογαριασμού PS4, το οποίο μπορεί να εμφανιστεί σε ορισμένα παιχνίδια. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Τύπος Καταγραφής:\nΚαθορίζει αν η έξοδος του παραθύρου καταγραφής θα συγχρονιστεί για αύξηση της απόδοσης. Αυτό μπορεί να επηρεάσει αρνητικά τις επιδόσεις του εξομοιωτή. - logFilter Φίλτρο Καταγραφής:\nΦιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες.\nΠαραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα. - updaterGroupBox Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. - GUIgroupBox Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Απόκρυψη Κέρσορα:\nΕπιλέξτε πότε θα εξαφανιστεί ο κέρσορας:\nΠοτέ: θα βλέπετε πάντα το ποντίκι.\nΑδρανές: ορίστε έναν χρόνο για να εξαφανιστεί μετά από αδράνεια.\nΠάντα: δεν θα δείτε ποτέ το ποντίκι. - idleTimeoutGroupBox Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια. - backButtonBehaviorGroupBox Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Ποτέ - Idle Αδρανής - Always Πάντα - Touchpad Left Touchpad Αριστερά - Touchpad Right Touchpad Δεξιά - Touchpad Center Κέντρο Touchpad - None Κανένα - graphicsAdapterGroupBox Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\nή επιλέξτε "Auto Select" για αυτόματη επιλογή. - resolutionLayout Ανάλυση Οθόνης:\nΚαθορίζει το μέγεθος του παραθύρου του εξομοιωτή κατά την αναπαραγωγή, το οποίο μπορεί να αλλάξει κατά τη διάρκεια του παιχνιδιού.\nΑυτό είναι διαφορετικό από την ανάλυση του ίδιου του παιχνιδιού. - heightDivider Διαιρέτης Συχνότητας Ανανέωσης:\nΠολλαπλασιάζει τον ρυθμό με τον οποίο ο εξομοιωτής ενημερώνει την εικόνα με αυτόν τον αριθμό. Η αλλαγή αυτής της ρύθμισης μπορεί να έχει αρνητικές επιπτώσεις, όπως ταχύτερο παιχνίδι ή σπασμένες λειτουργίες! - dumpShadersCheckBox Ενεργοποίηση Καταγραφής Σκιάσεων (Shaders):\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις σκιάσεις του παιχνιδιού σε φάκελο κατά τη διάρκεια της αναπαραγωγής. - nullGpuCheckBox Ενεργοποίηση Εικονικής GPU:\nΓια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών. - gameFoldersBox Φάκελοι Παιχνιδιών:\nΗ λίστα των φακέλων για έλεγχο των εγκατεστημένων παιχνιδιών. - addFolderButton Προσθήκη:\nΠροσθέστε έναν φάκελο στη λίστα. - removeFolderButton Αφαίρεση:\nΑφαιρέστε έναν φάκελο από τη λίστα. - debugDump Ενεργοποίηση Καταγραφής Αποσφαλμάτωσης:\nΑποθηκεύει τα σύμβολα εισαγωγής/εξαγωγής και τις κεφαλίδες πληροφοριών του τρέχοντος προγράμματος PS4 σε έναν φάκελο. - vkValidationCheckBox Ενεργοποίηση Επικύρωσης Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει την κατάσταση του προγράμματος οδήγησης Vulkan και καταγράφει πληροφορίες για την εσωτερική του κατάσταση. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - vkSyncValidationCheckBox Ενεργοποίηση Επικύρωσης Συγχρονισμού Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει τον συγχρονισμό των εργασιών απόδοσης του Vulkan. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - rdocCheckBox Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Δεν διατίθεται εικόνα + + + Serial: + Σειριακός αριθμός: + + + Version: + Έκδοση: + + + Size: + Μέγεθος: + + + Select Cheat File: + Επιλέξτε αρχείο Cheat: + + + Repository: + Αποθετήριο: + + + Download Cheats + Λήψη Cheats + + + Delete File + Διαγραφή αρχείου + + + No files selected. + Δεν έχουν επιλεγεί αρχεία. + + + You can delete the cheats you don't want after downloading them. + Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. + + + Do you want to delete the selected file?\n%1 + Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 + + + Select Patch File: + Επιλέξτε αρχείο Patch: + + + Download Patches + Λήψη Patches + + + Save + Αποθήκευση + + + Cheats + Cheats + + + Patches + Patches + + + Error + Σφάλμα + + + No patch selected. + Δεν έχει επιλεγεί κανένα patch. + + + Unable to open files.json for reading. + Αδυναμία ανοίγματος του files.json για ανάγνωση. + + + No patch file found for the current serial. + Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. + + + Unable to open the file for reading. + Αδυναμία ανοίγματος του αρχείου για ανάγνωση. + + + Unable to open the file for writing. + Αδυναμία ανοίγματος του αρχείου για εγγραφή. + + + Failed to parse XML: + Αποτυχία ανάλυσης XML: + + + Success + Επιτυχία + + + Options saved successfully. + Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. + + + Invalid Source + Μη έγκυρη Πηγή + + + The selected source is invalid. + Η επιλεγμένη πηγή είναι μη έγκυρη. + + + File Exists + Η αρχείο υπάρχει + + + File already exists. Do you want to replace it? + Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; + + + Failed to save file: + Αποτυχία αποθήκευσης αρχείου: + + + Failed to download file: + Αποτυχία λήψης αρχείου: + + + Cheats Not Found + Δεν βρέθηκαν Cheats + + + CheatsNotFound_MSG + Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. + + + Cheats Downloaded Successfully + Cheats κατεβάστηκαν επιτυχώς + + + CheatsDownloadedSuccessfully_MSG + Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. + + + Failed to save: + Αποτυχία αποθήκευσης: + + + Failed to download: + Αποτυχία λήψης: + + + Download Complete + Η λήψη ολοκληρώθηκε + + + DownloadComplete_MSG + Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. + + + Failed to parse JSON data from HTML. + Αποτυχία ανάλυσης δεδομένων JSON από HTML. + + + Failed to retrieve HTML page. + Αποτυχία ανάκτησης σελίδας HTML. + + + The game is in version: %1 + Το παιχνίδι είναι στην έκδοση: %1 + + + The downloaded patch only works on version: %1 + Η ληφθείσα ενημέρωση λειτουργεί μόνο στην έκδοση: %1 + + + You may need to update your game. + Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι σας. + + + Incompatibility Notice + Ειδοποίηση ασυμβατότητας + + + Failed to open file: + Αποτυχία ανοίγματος αρχείου: + + + XML ERROR: + ΣΦΑΛΜΑ XML: + + + Failed to open files.json for writing + Αποτυχία ανοίγματος του files.json για εγγραφή + + + Author: + Συγγραφέας: + + + Directory does not exist: + Ο φάκελος δεν υπάρχει: + + + Failed to open files.json for reading. + Αποτυχία ανοίγματος του files.json για ανάγνωση. + + + Name: + Όνομα: + + + Can't apply cheats before the game is started + Δεν μπορείτε να εφαρμόσετε cheats πριν ξεκινήσει το παιχνίδι. + + GameListFrame - Icon Εικονίδιο - Name Όνομα - Serial Σειριακός αριθμός - Compatibility Compatibility - Region Περιοχή - Firmware Λογισμικό - Size Μέγεθος - Version Έκδοση - Path Διαδρομή - Play Time Χρόνος παιχνιδιού - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Αυτόματος Ενημερωτής - Error Σφάλμα - Network error: Σφάλμα δικτύου: - Failed to parse update information. Αποτυχία ανάλυσης πληροφοριών ενημέρωσης. - No pre-releases found. Δεν βρέθηκαν προ-κυκλοφορίες. - Invalid release data. Μη έγκυρα δεδομένα έκδοσης. - No download URL found for the specified asset. Δεν βρέθηκε URL λήψης για το συγκεκριμένο στοιχείο. - Your version is already up to date! Η έκδοσή σας είναι ήδη ενημερωμένη! - Update Available Διαθέσιμη Ενημέρωση - Update Channel Κανάλι Ενημέρωσης - Current Version Τρέχουσα Έκδοση - Latest Version Τελευταία Έκδοση - Do you want to update? Θέλετε να ενημερώσετε; - Show Changelog Εμφάνιση Ιστορικού Αλλαγών - Check for Updates at Startup Έλεγχος για ενημερώσεις κατά την εκκίνηση - Update Ενημέρωση - No Όχι - Hide Changelog Απόκρυψη Ιστορικού Αλλαγών - Changes Αλλαγές - Network error occurred while trying to access the URL Σφάλμα δικτύου κατά την προσπάθεια πρόσβασης στη διεύθυνση URL - Download Complete Λήψη ολοκληρώθηκε - The update has been downloaded, press OK to install. Η ενημέρωση έχει ληφθεί, πατήστε OK για να εγκαταστήσετε. - Failed to save the update file at Αποτυχία αποθήκευσης του αρχείου ενημέρωσης στο - Starting Update... Εκκίνηση Ενημέρωσης... - Failed to create the update script file Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 293b5fae7..1f932ea97 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches Cheats / Patches - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Open Folder... - Open Game Folder Open Game Folder - Open Save Data Folder Open Save Data Folder - Open Log Folder Open Log Folder - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Check for Updates - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Download Cheats / Patches - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Help - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Game List + + + * Unsupported Vulkan Version + * Unsupported Vulkan Version + + + Download Cheats For All Installed Games + Download Cheats For All Installed Games + + + Download Patches For All Games + Download Patches For All Games + + + Download Complete + Download Complete + + + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + + + Patches Downloaded Successfully! + Patches Downloaded Successfully! + + + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + + + Games: + Games: + + + PKG File (*.PKG) + PKG File (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + + + Game Boot + Game Boot + + + Only one file can be selected! + Only one file can be selected! + + + PKG Extraction + PKG Extraction + + + Patch detected! + Patch detected! + + + PKG and Game versions match: + PKG and Game versions match: + + + Would you like to overwrite? + Would you like to overwrite? + + + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + + + Game is installed: + Game is installed: + + + Would you like to install Patch: + Would you like to install Patch: + + + DLC Installation + DLC Installation + + + Would you like to install DLC: %1? + Would you like to install DLC: %1? + + + DLC already installed: + DLC already installed: + + + Game already installed + Game already installed + + + PKG is a patch, please install the game first! + PKG is a patch, please install the game first! + + + PKG ERROR + PKG ERROR + + + Extracting PKG %1/%2 + Extracting PKG %1/%2 + + + Extraction Finished + Extraction Finished + + + Game successfully installed at %1 + Game successfully installed at %1 + + + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Enable Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Input - Cursor Cursor - Hide Cursor Hide Cursor - Hide Cursor Idle Timeout Hide Cursor Idle Timeout - s s - Controller Controller - Back Button Behavior Back Button Behavior - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Paths - Game Folders Game Folders - Add... Add... - Remove Remove - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Update - Check for Updates at Startup Check for Updates at Startup - Update Channel Update Channel - Check for Updates Check for Updates - GUI Settings GUI Settings - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Play title music - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Volume - Audio Backend Audio Backend - - - MainWindow - - Game List - Game List - - - - * Unsupported Vulkan Version - * Unsupported Vulkan Version - - - - Download Cheats For All Installed Games - Download Cheats For All Installed Games - - - - Download Patches For All Games - Download Patches For All Games - - - - Download Complete - Download Complete - - - - You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. - - - - Patches Downloaded Successfully! - Patches Downloaded Successfully! - - - - All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. - - - - Games: - Games: - - - - PKG File (*.PKG) - PKG File (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) - - - - Game Boot - Game Boot - - - - Only one file can be selected! - Only one file can be selected! - - - - PKG Extraction - PKG Extraction - - - - Patch detected! - Patch detected! - - - - PKG and Game versions match: - PKG and Game versions match: - - - - Would you like to overwrite? - Would you like to overwrite? - - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - - Game is installed: - Game is installed: - - - - Would you like to install Patch: - Would you like to install Patch: - - - - DLC Installation - DLC Installation - - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - - DLC already installed: - DLC already installed: - - - - Game already installed - Game already installed - - - - PKG is a patch, please install the game first! - PKG is a patch, please install the game first! - - - - PKG ERROR - PKG ERROR - - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - - Extraction Finished - Extraction Finished - - - - Game successfully installed at %1 - Game successfully installed at %1 - - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - No Image Available - - - - Serial: - Serial: - - - - Version: - Version: - - - - Size: - Size: - - - - Select Cheat File: - Select Cheat File: - - - - Repository: - Repository: - - - - Download Cheats - Download Cheats - - - - Delete File - Delete File - - - - No files selected. - No files selected. - - - - You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. - - - - Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 - - - - Select Patch File: - Select Patch File: - - - - Download Patches - Download Patches - - - Save Save - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Error - - - - No patch selected. - No patch selected. - - - - Unable to open files.json for reading. - Unable to open files.json for reading. - - - - No patch file found for the current serial. - No patch file found for the current serial. - - - - Unable to open the file for reading. - Unable to open the file for reading. - - - - Unable to open the file for writing. - Unable to open the file for writing. - - - - Failed to parse XML: - Failed to parse XML: - - - - Success - Success - - - - Options saved successfully. - Options saved successfully. - - - - Invalid Source - Invalid Source - - - - The selected source is invalid. - The selected source is invalid. - - - - File Exists - File Exists - - - - File already exists. Do you want to replace it? - File already exists. Do you want to replace it? - - - - Failed to save file: - Failed to save file: - - - - Failed to download file: - Failed to download file: - - - - Cheats Not Found - Cheats Not Found - - - - CheatsNotFound_MSG - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - - - - Cheats Downloaded Successfully - Cheats Downloaded Successfully - - - - CheatsDownloadedSuccessfully_MSG - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - - - - Failed to save: - Failed to save: - - - - Failed to download: - Failed to download: - - - - Download Complete - Download Complete - - - - DownloadComplete_MSG - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - - - - Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. - - - - Failed to retrieve HTML page. - Failed to retrieve HTML page. - - - - The game is in version: %1 - The game is in version: %1 - - - - The downloaded patch only works on version: %1 - The downloaded patch only works on version: %1 - - - - You may need to update your game. - You may need to update your game. - - - - Incompatibility Notice - Incompatibility Notice - - - - Failed to open file: - Failed to open file: - - - - XML ERROR: - XML ERROR: - - - - Failed to open files.json for writing - Failed to open files.json for writing - - - - Author: - Author: - - - - Directory does not exist: - Directory does not exist: - - - - Failed to open files.json for reading. - Failed to open files.json for reading. - - - - Name: - Name: - - - - Can't apply cheats before the game is started - Can't apply cheats before the game is started. - - - - SettingsDialog - - - Save - Save - - - Apply Apply - Restore Defaults Restore Defaults - Close Close - Point your mouse at an option to display its description. Point your mouse at an option to display its description. - consoleLanguageGroupBox Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - emulatorLanguageGroupBox Emulator Language:\nSets the language of the emulator's user interface. - fullscreenCheckBox Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - showSplashCheckBox Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - ps4proCheckBox Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it. - discordRPCCheckbox Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. - userName Username:\nSets the PS4's account username, which may be displayed by some games. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - logFilter Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - updaterGroupBox Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - GUIgroupBox Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - idleTimeoutGroupBox Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - backButtonBehaviorGroupBox Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Never - Idle Idle - Always Always - Touchpad Left Touchpad Left - Touchpad Right Touchpad Right - Touchpad Center Touchpad Center - None None - graphicsAdapterGroupBox Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - resolutionLayout Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - heightDivider Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - dumpShadersCheckBox Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - nullGpuCheckBox Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - gameFoldersBox Game Folders:\nThe list of folders to check for installed games. - addFolderButton Add:\nAdd a folder to the list. - removeFolderButton Remove:\nRemove a folder from the list. - debugDump Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - vkValidationCheckBox Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - vkSyncValidationCheckBox Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - rdocCheckBox Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + No Image Available + + + Serial: + Serial: + + + Version: + Version: + + + Size: + Size: + + + Select Cheat File: + Select Cheat File: + + + Repository: + Repository: + + + Download Cheats + Download Cheats + + + Delete File + Delete File + + + No files selected. + No files selected. + + + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + + + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + + + Select Patch File: + Select Patch File: + + + Download Patches + Download Patches + + + Save + Save + + + Cheats + Cheats + + + Patches + Patches + + + Error + Error + + + No patch selected. + No patch selected. + + + Unable to open files.json for reading. + Unable to open files.json for reading. + + + No patch file found for the current serial. + No patch file found for the current serial. + + + Unable to open the file for reading. + Unable to open the file for reading. + + + Unable to open the file for writing. + Unable to open the file for writing. + + + Failed to parse XML: + Failed to parse XML: + + + Success + Success + + + Options saved successfully. + Options saved successfully. + + + Invalid Source + Invalid Source + + + The selected source is invalid. + The selected source is invalid. + + + File Exists + File Exists + + + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + + + Failed to save file: + Failed to save file: + + + Failed to download file: + Failed to download file: + + + Cheats Not Found + Cheats Not Found + + + CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + + + Cheats Downloaded Successfully + Cheats Downloaded Successfully + + + CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + + + Failed to save: + Failed to save: + + + Failed to download: + Failed to download: + + + Download Complete + Download Complete + + + DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + + + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + + + Failed to retrieve HTML page. + Failed to retrieve HTML page. + + + The game is in version: %1 + The game is in version: %1 + + + The downloaded patch only works on version: %1 + The downloaded patch only works on version: %1 + + + You may need to update your game. + You may need to update your game. + + + Incompatibility Notice + Incompatibility Notice + + + Failed to open file: + Failed to open file: + + + XML ERROR: + XML ERROR: + + + Failed to open files.json for writing + Failed to open files.json for writing + + + Author: + Author: + + + Directory does not exist: + Directory does not exist: + + + Failed to open files.json for reading. + Failed to open files.json for reading. + + + Name: + Name: + + + Can't apply cheats before the game is started + Can't apply cheats before the game is started. + + GameListFrame - Icon Icon - Name Name - Serial Serial - Compatibility Compatibility - Region Region - Firmware Firmware - Size Size - Version Version - Path Path - Play Time Play Time - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Auto Updater - Error Error - Network error: Network error: - Failed to parse update information. Failed to parse update information. - No pre-releases found. No pre-releases found. - Invalid release data. Invalid release data. - No download URL found for the specified asset. No download URL found for the specified asset. - Your version is already up to date! Your version is already up to date! - Update Available Update Available - Update Channel Update Channel - Current Version Current Version - Latest Version Latest Version - Do you want to update? Do you want to update? - Show Changelog Show Changelog - Check for Updates at Startup Check for Updates at Startup - Update Update - No No - Hide Changelog Hide Changelog - Changes Changes - Network error occurred while trying to access the URL Network error occurred while trying to access the URL - Download Complete Download Complete - The update has been downloaded, press OK to install. The update has been downloaded, press OK to install. - Failed to save the update file at Failed to save the update file at - Starting Update... Starting Update... - Failed to create the update script file Failed to create the update script file @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 096e104e3..021b39ed8 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Acerca de shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 es un emulador experimental de código abierto para la PlayStation 4. - This software should not be used to play games you have not legally obtained. Este software no debe utilizarse para jugar juegos que hayas obtenido ilegalmente. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Abrir carpeta @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Cargando lista de juegos, por favor espera :3 - Cancel Cancelar - Loading... Cargando... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Elegir carpeta - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Elegir carpeta - Directory to install games Carpeta para instalar juegos - Browse Buscar - Error Error - The value for location to install games is not valid. El valor para la ubicación de instalación de los juegos no es válido. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Crear acceso directo - Cheats / Patches Trucos / Parches - SFO Viewer Vista SFO - Trophy Viewer Ver trofeos - Open Folder... Abrir Carpeta... - Open Game Folder Abrir Carpeta del Juego - Open Save Data Folder Abrir Carpeta de Datos Guardados - Open Log Folder Abrir Carpeta de Registros - Copy info... Copiar información... - Copy Name Copiar nombre - Copy Serial Copiar número de serie - Copy All Copiar todo - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Acceso directo creado - Shortcut created successfully! ¡Acceso directo creado con éxito! - Error Error - Error creating shortcut! ¡Error al crear el acceso directo! - Install PKG Instalar PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Abrir/Agregar carpeta Elf - Install Packages (PKG) Instalar paquetes (PKG) - Boot Game Iniciar juego - Check for Updates Buscar actualizaciones - About shadPS4 Acerca de shadPS4 - Configure... Configurar... - Install application from a .pkg file Instalar aplicación desde un archivo .pkg - Recent Games Juegos recientes - Exit Salir - Exit shadPS4 Salir de shadPS4 - Exit the application. Salir de la aplicación. - Show Game List Mostrar lista de juegos - Game List Refresh Actualizar lista de juegos - Tiny Muy pequeño - Small Pequeño - Medium Mediano - Large Grande - List View Vista de lista - Grid View Vista de cuadrícula - Elf Viewer Vista Elf - Game Install Directory Carpeta de instalación de los juegos - Download Cheats/Patches Descargar Trucos / Parches - Dump Game List Volcar lista de juegos - PKG Viewer Vista PKG - Search... Buscar... - File Archivo - View Vista - Game List Icons Iconos de los juegos - Game List Mode Tipo de lista - Settings Configuración - Utils Utilidades - Themes Temas - Help Ayuda - Dark Oscuro - Light Claro - Green Verde - Blue Azul - Violet Violeta - toolBar Barra de herramientas + + Game List + Lista de juegos + + + * Unsupported Vulkan Version + * Versión de Vulkan no soportada + + + Download Cheats For All Installed Games + Descargar trucos para todos los juegos instalados + + + Download Patches For All Games + Descargar parches para todos los juegos + + + Download Complete + Descarga completa + + + You have downloaded cheats for all the games you have installed. + Has descargado trucos para todos los juegos que tienes instalados. + + + Patches Downloaded Successfully! + ¡Parches descargados exitosamente! + + + All Patches available for all games have been downloaded. + Todos los parches disponibles han sido descargados para todos los juegos. + + + Games: + Juegos: + + + PKG File (*.PKG) + Archivo PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Archivos ELF (*.bin *.elf *.oelf) + + + Game Boot + Inicio del juego + + + Only one file can be selected! + ¡Solo se puede seleccionar un archivo! + + + PKG Extraction + Extracción de PKG + + + Patch detected! + ¡Actualización detectada! + + + PKG and Game versions match: + Las versiones de PKG y del juego coinciden: + + + Would you like to overwrite? + ¿Desea sobrescribir? + + + PKG Version %1 is older than installed version: + La versión de PKG %1 es más antigua que la versión instalada: + + + Game is installed: + El juego está instalado: + + + Would you like to install Patch: + ¿Desea instalar la actualización: + + + DLC Installation + Instalación de DLC + + + Would you like to install DLC: %1? + ¿Desea instalar el DLC: %1? + + + DLC already installed: + DLC ya instalado: + + + Game already installed + Juego ya instalado + + + PKG is a patch, please install the game first! + PKG es un parche, ¡por favor instala el juego primero! + + + PKG ERROR + ERROR PKG + + + Extracting PKG %1/%2 + Extrayendo PKG %1/%2 + + + Extraction Finished + Extracción terminada + + + Game successfully installed at %1 + Juego instalado exitosamente en %1 + + + File doesn't appear to be a valid PKG file + El archivo parece no ser un archivo PKG válido + PKGViewer - Open Folder Abrir carpeta @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Vista de trofeos @@ -478,1029 +509,700 @@ SettingsDialog - Settings Configuración - General General - System Sistema - Console Language Idioma de la consola - Emulator Language Idioma del emulador - Emulator Emulador - Enable Fullscreen Habilitar pantalla completa - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Mostrar splash - Is PS4 Pro Modo PS4 Pro - Enable Discord Rich Presence Habilitar Discord Rich Presence - Username Nombre de usuario - Trophy Key Trophy Key - Trophy Trophy - Logger Registro - Log Type Tipo de registro - Log Filter Filtro de registro - Input Entrada - Cursor Cursor - Hide Cursor Ocultar cursor - Hide Cursor Idle Timeout Tiempo de espera para ocultar cursor inactivo - s s - Controller Controlador - Back Button Behavior Comportamiento del botón de retroceso - Graphics Gráficos - Graphics Device Dispositivo gráfico - Width Ancho - Height Alto - Vblank Divider Divisor de Vblank - Advanced Avanzado - Enable Shaders Dumping Habilitar volcado de shaders - Enable NULL GPU Habilitar GPU NULL - Paths Rutas - Game Folders Carpetas de juego - Add... Añadir... - Remove Eliminar - Debug Depuración - Enable Debug Dumping Habilitar volcado de depuración - Enable Vulkan Validation Layers Habilitar capas de validación de Vulkan - Enable Vulkan Synchronization Validation Habilitar validación de sincronización de Vulkan - Enable RenderDoc Debugging Habilitar depuración de RenderDoc - Update Actualización - Check for Updates at Startup Buscar actualizaciones al iniciar - Update Channel Canal de Actualización - Check for Updates Verificar actualizaciones - GUI Settings Configuraciones de la Interfaz - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Reproducir la música de apertura - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Volumen - Audio Backend Audio Backend - - - MainWindow - - Game List - Lista de juegos - - - - * Unsupported Vulkan Version - * Versión de Vulkan no soportada - - - - Download Cheats For All Installed Games - Descargar trucos para todos los juegos instalados - - - - Download Patches For All Games - Descargar parches para todos los juegos - - - - Download Complete - Descarga completa - - - - You have downloaded cheats for all the games you have installed. - Has descargado trucos para todos los juegos que tienes instalados. - - - - Patches Downloaded Successfully! - ¡Parches descargados exitosamente! - - - - All Patches available for all games have been downloaded. - Todos los parches disponibles han sido descargados para todos los juegos. - - - - Games: - Juegos: - - - - PKG File (*.PKG) - Archivo PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Archivos ELF (*.bin *.elf *.oelf) - - - - Game Boot - Inicio del juego - - - - Only one file can be selected! - ¡Solo se puede seleccionar un archivo! - - - - PKG Extraction - Extracción de PKG - - - - Patch detected! - ¡Actualización detectada! - - - - PKG and Game versions match: - Las versiones de PKG y del juego coinciden: - - - - Would you like to overwrite? - ¿Desea sobrescribir? - - - - PKG Version %1 is older than installed version: - La versión de PKG %1 es más antigua que la versión instalada: - - - - Game is installed: - El juego está instalado: - - - - Would you like to install Patch: - ¿Desea instalar la actualización: - - - - DLC Installation - Instalación de DLC - - - - Would you like to install DLC: %1? - ¿Desea instalar el DLC: %1? - - - - DLC already installed: - DLC ya instalado: - - - - Game already installed - Juego ya instalado - - - - PKG is a patch, please install the game first! - PKG es un parche, ¡por favor instala el juego primero! - - - - PKG ERROR - ERROR PKG - - - - Extracting PKG %1/%2 - Extrayendo PKG %1/%2 - - - - Extraction Finished - Extracción terminada - - - - Game successfully installed at %1 - Juego instalado exitosamente en %1 - - - - File doesn't appear to be a valid PKG file - El archivo parece no ser un archivo PKG válido - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - No hay imagen disponible - - - - Serial: - Número de serie: - - - - Version: - Versión: - - - - Size: - Tamaño: - - - - Select Cheat File: - Seleccionar archivo de trucos: - - - - Repository: - Repositorio: - - - - Download Cheats - Descargar trucos - - - - Delete File - Eliminar archivo - - - - No files selected. - No se han seleccionado archivos. - - - - You can delete the cheats you don't want after downloading them. - Puedes eliminar los trucos que no quieras una vez descargados. - - - - Do you want to delete the selected file?\n%1 - ¿Deseas eliminar el archivo seleccionado?\n%1 - - - - Select Patch File: - Seleccionar archivo de parche: - - - - Download Patches - Descargar parches - - - Save Guardar - - Cheats - Trucos - - - - Patches - Parches - - - - Error - Error - - - - No patch selected. - No se ha seleccionado ningún parche. - - - - Unable to open files.json for reading. - No se puede abrir files.json para lectura. - - - - No patch file found for the current serial. - No se encontró ningún archivo de parche para el número de serie actual. - - - - Unable to open the file for reading. - No se puede abrir el archivo para lectura. - - - - Unable to open the file for writing. - No se puede abrir el archivo para escritura. - - - - Failed to parse XML: - Error al analizar XML: - - - - Success - Éxito - - - - Options saved successfully. - Opciones guardadas exitosamente. - - - - Invalid Source - Fuente inválida - - - - The selected source is invalid. - La fuente seleccionada es inválida. - - - - File Exists - El archivo ya existe - - - - File already exists. Do you want to replace it? - El archivo ya existe. ¿Deseas reemplazarlo? - - - - Failed to save file: - Error al guardar el archivo: - - - - Failed to download file: - Error al descargar el archivo: - - - - Cheats Not Found - Trucos no encontrados - - - - CheatsNotFound_MSG - No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. - - - - Cheats Downloaded Successfully - Trucos descargados exitosamente - - - - CheatsDownloadedSuccessfully_MSG - Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. - - - - Failed to save: - Error al guardar: - - - - Failed to download: - Error al descargar: - - - - Download Complete - Descarga completa - - - - DownloadComplete_MSG - ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. - - - - Failed to parse JSON data from HTML. - Error al analizar los datos JSON del HTML. - - - - Failed to retrieve HTML page. - Error al recuperar la página HTML. - - - - The game is in version: %1 - El juego está en la versión: %1 - - - - The downloaded patch only works on version: %1 - El parche descargado solo funciona en la versión: %1 - - - - You may need to update your game. - Puede que necesites actualizar tu juego. - - - - Incompatibility Notice - Aviso de incompatibilidad - - - - Failed to open file: - Error al abrir el archivo: - - - - XML ERROR: - ERROR XML: - - - - Failed to open files.json for writing - Error al abrir files.json para escritura - - - - Author: - Autor: - - - - Directory does not exist: - El directorio no existe: - - - - Failed to open files.json for reading. - Error al abrir files.json para lectura. - - - - Name: - Nombre: - - - - Can't apply cheats before the game is started - No se pueden aplicar trucos antes de que se inicie el juego. - - - - SettingsDialog - - - Save - Guardar - - - Apply Aplicar - Restore Defaults Restaurar Valores Predeterminados - Close Cerrar - Point your mouse at an option to display its description. Coloque el mouse sobre una opción para mostrar su descripción. - consoleLanguageGroupBox Idioma de la Consola:\nEstablece el idioma que utiliza el juego de PS4.\nSe recomienda configurarlo a un idioma que el juego soporte, lo cual varía por región. - emulatorLanguageGroupBox Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. - fullscreenCheckBox Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Mostrar Pantalla de Inicio:\nMuestra la pantalla de inicio del juego (una imagen especial) mientras el juego se está iniciando. - ps4proCheckBox Es PS4 Pro:\nHace que el emulador actúe como una PS4 PRO, lo que puede habilitar funciones especiales en los juegos que lo admitan. - discordRPCCheckbox Habilitar Discord Rich Presence:\nMuestra el ícono del emulador y la información relevante en tu perfil de Discord. - userName Nombre de Usuario:\nEstablece el nombre de usuario de la cuenta de PS4, que puede ser mostrado por algunos juegos. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Tipo de Registro:\nEstablece si sincronizar la salida de la ventana de registro para mejorar el rendimiento. Puede tener efectos adversos en la emulación. - logFilter Filtro de Registro:\nFiltra el registro para imprimir solo información específica.\nEjemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior. - updaterGroupBox Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. - GUIgroupBox Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse. - idleTimeoutGroupBox Establezca un tiempo para que el mouse desaparezca después de estar inactivo. - backButtonBehaviorGroupBox Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Nunca - Idle Inactivo - Always Siempre - Touchpad Left Touchpad Izquierda - Touchpad Right Touchpad Derecha - Touchpad Center Centro del Touchpad - None Ninguno - graphicsAdapterGroupBox Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona "Auto Select" para determinarla automáticamente. - resolutionLayout Anchura/Altura:\nEstablece el tamaño de la ventana del emulador al iniciar, que se puede redimensionar durante el juego.\nEsto es diferente de la resolución en el juego. - heightDivider Divisor de Vblank:\nLa tasa de cuadros a la que se refresca el emulador se multiplica por este número. Cambiar esto puede tener efectos adversos, como aumentar la velocidad del juego, o romper la funcionalidad crítica del juego que no espera que esto cambie. - dumpShadersCheckBox Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. - nullGpuCheckBox Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica. - gameFoldersBox Carpetas de Juegos:\nLa lista de carpetas para verificar los juegos instalados. - addFolderButton Añadir:\nAgregar una carpeta a la lista. - removeFolderButton Eliminar:\nEliminar una carpeta de la lista. - debugDump Habilitar la Volcadura de Depuración:\nGuarda los símbolos de importación y exportación y la información del encabezado del archivo del programa de PS4 que se está ejecutando actualmente en un directorio. - vkValidationCheckBox Habilitar Capas de Validación de Vulkan:\nHabilita un sistema que valida el estado del renderizador de Vulkan y registra información sobre su estado interno. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - vkSyncValidationCheckBox Habilitar Validación de Sincronización de Vulkan:\nHabilita un sistema que valida el tiempo de las tareas de renderizado de Vulkan. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - rdocCheckBox Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + No hay imagen disponible + + + Serial: + Número de serie: + + + Version: + Versión: + + + Size: + Tamaño: + + + Select Cheat File: + Seleccionar archivo de trucos: + + + Repository: + Repositorio: + + + Download Cheats + Descargar trucos + + + Delete File + Eliminar archivo + + + No files selected. + No se han seleccionado archivos. + + + You can delete the cheats you don't want after downloading them. + Puedes eliminar los trucos que no quieras una vez descargados. + + + Do you want to delete the selected file?\n%1 + ¿Deseas eliminar el archivo seleccionado?\n%1 + + + Select Patch File: + Seleccionar archivo de parche: + + + Download Patches + Descargar parches + + + Save + Guardar + + + Cheats + Trucos + + + Patches + Parches + + + Error + Error + + + No patch selected. + No se ha seleccionado ningún parche. + + + Unable to open files.json for reading. + No se puede abrir files.json para lectura. + + + No patch file found for the current serial. + No se encontró ningún archivo de parche para el número de serie actual. + + + Unable to open the file for reading. + No se puede abrir el archivo para lectura. + + + Unable to open the file for writing. + No se puede abrir el archivo para escritura. + + + Failed to parse XML: + Error al analizar XML: + + + Success + Éxito + + + Options saved successfully. + Opciones guardadas exitosamente. + + + Invalid Source + Fuente inválida + + + The selected source is invalid. + La fuente seleccionada es inválida. + + + File Exists + El archivo ya existe + + + File already exists. Do you want to replace it? + El archivo ya existe. ¿Deseas reemplazarlo? + + + Failed to save file: + Error al guardar el archivo: + + + Failed to download file: + Error al descargar el archivo: + + + Cheats Not Found + Trucos no encontrados + + + CheatsNotFound_MSG + No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. + + + Cheats Downloaded Successfully + Trucos descargados exitosamente + + + CheatsDownloadedSuccessfully_MSG + Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. + + + Failed to save: + Error al guardar: + + + Failed to download: + Error al descargar: + + + Download Complete + Descarga completa + + + DownloadComplete_MSG + ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. + + + Failed to parse JSON data from HTML. + Error al analizar los datos JSON del HTML. + + + Failed to retrieve HTML page. + Error al recuperar la página HTML. + + + The game is in version: %1 + El juego está en la versión: %1 + + + The downloaded patch only works on version: %1 + El parche descargado solo funciona en la versión: %1 + + + You may need to update your game. + Puede que necesites actualizar tu juego. + + + Incompatibility Notice + Aviso de incompatibilidad + + + Failed to open file: + Error al abrir el archivo: + + + XML ERROR: + ERROR XML: + + + Failed to open files.json for writing + Error al abrir files.json para escritura + + + Author: + Autor: + + + Directory does not exist: + El directorio no existe: + + + Failed to open files.json for reading. + Error al abrir files.json para lectura. + + + Name: + Nombre: + + + Can't apply cheats before the game is started + No se pueden aplicar trucos antes de que se inicie el juego. + + GameListFrame - Icon Icono - Name Nombre - Serial Numero de serie - Compatibility Compatibility - Region Región - Firmware Firmware - Size Tamaño - Version Versión - Path Ruta - Play Time Tiempo de Juego - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Actualizador Automático - Error Error - Network error: Error de red: - Failed to parse update information. Error al analizar la información de actualización. - No pre-releases found. No se encontraron prelanzamientos. - Invalid release data. Datos de versión no válidos. - No download URL found for the specified asset. No se encontró URL de descarga para el activo especificado. - Your version is already up to date! ¡Su versión ya está actualizada! - Update Available Actualización disponible - Update Channel Canal de Actualización - Current Version Versión actual - Latest Version Última versión - Do you want to update? ¿Quieres actualizar? - Show Changelog Mostrar registro de cambios - Check for Updates at Startup Buscar actualizaciones al iniciar - Update Actualizar - No No - Hide Changelog Ocultar registro de cambios - Changes Cambios - Network error occurred while trying to access the URL Se produjo un error de red al intentar acceder a la URL - Download Complete Descarga completa - The update has been downloaded, press OK to install. La actualización se ha descargado, presione Aceptar para instalar. - Failed to save the update file at No se pudo guardar el archivo de actualización en - Starting Update... Iniciando actualización... - Failed to create the update script file No se pudo crear el archivo del script de actualización @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 7b93c6769..ee37cd22a 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 درباره ShadPS4 - shadPS4 ShadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. یک شبیه ساز متن باز برای پلی استیشن 4 است. - This software should not be used to play games you have not legally obtained. این برنامه نباید برای بازی هایی که شما به صورت غیرقانونی به دست آوردید استفاده شود. @@ -29,7 +25,6 @@ ElfViewer - Open Folder فولدر را بازکن @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 درحال بارگیری لیست بازی ها,لطفا کمی صبرکنید :3 - Cancel لغو - Loading... ...درحال بارگیری @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory ShadPS4 - انتخاب محل نصب بازی - Select which directory you want to install to. محلی را که می‌خواهید در آن نصب شود، انتخاب کنید. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory ShadPS4 - انتخاب محل نصب بازی - Directory to install games محل نصب بازی ها - Browse انتخاب دستی - Error ارور - The value for location to install games is not valid. .مکان داده شده برای نصب بازی درست نمی باشد @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut ایجاد میانبر - Cheats / Patches چیت/پچ ها - SFO Viewer SFO مشاهده - Trophy Viewer مشاهده جوایز - Open Folder... باز کردن پوشه... - Open Game Folder باز کردن پوشه بازی - Open Save Data Folder پوشه ذخیره داده را باز کنید - Open Log Folder باز کردن پوشه لاگ - Copy info... ...کپی کردن اطلاعات - Copy Name کپی کردن نام - Copy Serial کپی کردن سریال - Copy All کپی کردن تمامی مقادیر - Delete... حذف... - Delete Game حذف بازی - Delete Update حذف به‌روزرسانی - Delete DLC حذف محتوای اضافی (DLC) - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation ایجاد میانبر - Shortcut created successfully! میانبر با موفقیت ساخته شد! - Error ارور - Error creating shortcut! مشکلی در هنگام ساخت میانبر بوجود آمد! - Install PKG نصب PKG - Game بازی - requiresEnableSeparateUpdateFolder_MSG این قابلیت نیازمند فعال‌سازی گزینه تنظیمات «ایجاد پوشه جداگانه برای به‌روزرسانی» است. در صورت تمایل به استفاده از این قابلیت، لطفاً آن را فعال کنید. - This game has no update to delete! این بازی به‌روزرسانی‌ای برای حذف ندارد! - - + Update به‌روزرسانی - This game has no DLC to delete! این بازی محتوای اضافی (DLC) برای حذف ندارد! - DLC DLC - Delete %1 حذف %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder ELF بازکردن/ساختن پوشه - Install Packages (PKG) نصب بسته (PKG) - Boot Game اجرای بازی - Check for Updates به روز رسانی را بررسی کنید - About shadPS4 ShadPS4 درباره - Configure... ...تنظیمات - Install application from a .pkg file .PKG نصب بازی از فایل - Recent Games بازی های اخیر - Exit خروج - Exit shadPS4 ShadPS4 بستن - Exit the application. بستن برنامه - Show Game List نشان دادن بازی ها - Game List Refresh رفرش لیست بازی ها - Tiny کوچک ترین - Small کوچک - Medium متوسط - Large بزرگ - List View نمایش لیست - Grid View شبکه ای (چهارخونه) - Elf Viewer مشاهده گر Elf - Game Install Directory محل نصب بازی - Download Cheats/Patches دانلود چیت/پچ - Dump Game List استخراج لیست بازی ها - PKG Viewer PKG مشاهده گر - Search... جست و جو... - File فایل - View شخصی سازی - Game List Icons آیکون ها - Game List Mode حالت نمایش لیست بازی ها - Settings تنظیمات - Utils ابزارها - Themes تم ها - Help کمک - Dark تیره - Light روشن - Green سبز - Blue آبی - Violet بنفش - toolBar نوار ابزار + + Game List + لیست بازی + + + * Unsupported Vulkan Version + شما پشتیبانی نمیشود Vulkan ورژن * + + + Download Cheats For All Installed Games + دانلود چیت برای همه بازی ها + + + Download Patches For All Games + دانلود پچ برای همه بازی ها + + + Download Complete + دانلود کامل شد✅ + + + You have downloaded cheats for all the games you have installed. + چیت برای همه بازی های شما دانلودشد✅ + + + Patches Downloaded Successfully! + پچ ها با موفقیت دانلود شد✅ + + + All Patches available for all games have been downloaded. + ✅تمام پچ های موجود برای همه بازی های شما دانلود شد + + + Games: + بازی ها: + + + PKG File (*.PKG) + PKG فایل (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF فایل های (*.bin *.elf *.oelf) + + + Game Boot + اجرای بازی + + + Only one file can be selected! + فقط یک فایل انتخاب کنید! + + + PKG Extraction + PKG استخراج فایل + + + Patch detected! + پچ شناسایی شد! + + + PKG and Game versions match: + و نسخه بازی همخوانی دارد PKG فایل: + + + Would you like to overwrite? + آیا مایل به جایگزینی فایل هستید؟ + + + PKG Version %1 is older than installed version: + نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: + + + Game is installed: + بازی نصب شد: + + + Would you like to install Patch: + آیا مایل به نصب پچ هستید: + + + DLC Installation + نصب DLC + + + Would you like to install DLC: %1? + آیا مایل به نصب DLC هستید: %1 + + + DLC already installed: + قبلا نصب شده DLC این: + + + Game already installed + این بازی قبلا نصب شده + + + PKG is a patch, please install the game first! + فایل انتخاب شده یک پچ است, لطفا اول بازی را نصب کنید + + + PKG ERROR + PKG ارور فایل + + + Extracting PKG %1/%2 + درحال استخراج PKG %1/%2 + + + Extraction Finished + استخراج به پایان رسید + + + Game successfully installed at %1 + بازی با موفقیت در %1 نصب شد + + + File doesn't appear to be a valid PKG file + این فایل یک PKG درست به نظر نمی آید + PKGViewer - Open Folder بازکردن پوشه @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer مشاهده جوایز @@ -478,1029 +509,700 @@ SettingsDialog - Settings تنظیمات - General عمومی - System سیستم - Console Language زبان کنسول - Emulator Language زبان شبیه ساز - Emulator شبیه ساز - Enable Fullscreen تمام صفحه - Enable Separate Update Folder فعال‌سازی پوشه جداگانه برای به‌روزرسانی - Show Splash Splash نمایش - Is PS4 Pro PS4 Pro حالت - Enable Discord Rich Presence Discord Rich Presence را فعال کنید - Username نام کاربری - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log نوع - Log Filter Log فیلتر - Input ورودی - Cursor نشانگر - Hide Cursor پنهان کردن نشانگر - Hide Cursor Idle Timeout مخفی کردن زمان توقف مکان نما - s s - Controller دسته بازی - Back Button Behavior رفتار دکمه بازگشت - Graphics گرافیک - Graphics Device کارت گرافیک مورداستفاده - Width عرض - Height طول - Vblank Divider تقسیم‌کننده Vblank - Advanced ...بیشتر - Enable Shaders Dumping فعال‌سازی ذخیره‌سازی شیدرها - Enable NULL GPU NULL GPU فعال کردن - Paths مسیرها - Game Folders پوشه های بازی - Add... افزودن... - Remove حذف - Debug دیباگ - Enable Debug Dumping Debug Dumping - Enable Vulkan Validation Layers Vulkan Validation Layers - Enable Vulkan Synchronization Validation Vulkan Synchronization Validation - Enable RenderDoc Debugging RenderDoc Debugging - Update به‌روزرسانی - Check for Updates at Startup بررسی به‌روزرسانی‌ها در زمان راه‌اندازی - Update Channel کانال به‌روزرسانی - Check for Updates بررسی به‌روزرسانی‌ها - GUI Settings تنظیمات رابط کاربری - Disable Trophy Pop-ups غیرفعال کردن نمایش جوایز - Play title music پخش موسیقی عنوان - Update Compatibility Database On Startup به‌روزرسانی پایگاه داده سازگاری هنگام راه‌اندازی - Game Compatibility سازگاری بازی با سیستم - Display Compatibility Data نمایش داده‌های سازگاری - Update Compatibility Database به‌روزرسانی پایگاه داده سازگاری - Volume صدا - Audio Backend Audio Backend - - - MainWindow - - Game List - لیست بازی - - - - * Unsupported Vulkan Version - شما پشتیبانی نمیشود Vulkan ورژن * - - - - Download Cheats For All Installed Games - دانلود چیت برای همه بازی ها - - - - Download Patches For All Games - دانلود پچ برای همه بازی ها - - - - Download Complete - دانلود کامل شد✅ - - - - You have downloaded cheats for all the games you have installed. - چیت برای همه بازی های شما دانلودشد✅ - - - - Patches Downloaded Successfully! - پچ ها با موفقیت دانلود شد✅ - - - - All Patches available for all games have been downloaded. - ✅تمام پچ های موجود برای همه بازی های شما دانلود شد - - - - Games: - بازی ها: - - - - PKG File (*.PKG) - PKG فایل (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF فایل های (*.bin *.elf *.oelf) - - - - Game Boot - اجرای بازی - - - - Only one file can be selected! - فقط یک فایل انتخاب کنید! - - - - PKG Extraction - PKG استخراج فایل - - - - Patch detected! - پچ شناسایی شد! - - - - PKG and Game versions match: - و نسخه بازی همخوانی دارد PKG فایل: - - - - Would you like to overwrite? - آیا مایل به جایگزینی فایل هستید؟ - - - - PKG Version %1 is older than installed version: - نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: - - - - Game is installed: - بازی نصب شد: - - - - Would you like to install Patch: - آیا مایل به نصب پچ هستید: - - - - DLC Installation - نصب DLC - - - - Would you like to install DLC: %1? - آیا مایل به نصب DLC هستید: %1 - - - - DLC already installed: - قبلا نصب شده DLC این: - - - - Game already installed - این بازی قبلا نصب شده - - - - PKG is a patch, please install the game first! - فایل انتخاب شده یک پچ است, لطفا اول بازی را نصب کنید - - - - PKG ERROR - PKG ارور فایل - - - - Extracting PKG %1/%2 - درحال استخراج PKG %1/%2 - - - - Extraction Finished - استخراج به پایان رسید - - - - Game successfully installed at %1 - بازی با موفقیت در %1 نصب شد - - - - File doesn't appear to be a valid PKG file - این فایل یک PKG درست به نظر نمی آید - - - - CheatsPatches - - - Cheats / Patches for - چیت / پچ برای - - - - defaultTextEdit_MSG - defaultTextEdit_MSG - - - - No Image Available - تصویری موجود نمی باشد - - - - Serial: - سریال: - - - - Version: - نسخه: - - - - Size: - حجم: - - - - Select Cheat File: - فایل چیت را انتخاب کنید: - - - - Repository: - :منبع - - - - Download Cheats - دانلود چیت ها - - - - Delete File - حذف فایل - - - - No files selected. - فایلی انتخاب نشده. - - - - You can delete the cheats you don't want after downloading them. - شما میتوانید بعد از دانلود چیت هایی که نمیخواهید را پاک کنید - - - - Do you want to delete the selected file?\n%1 - آیا میخواهید فایل های انتخاب شده را پاک کنید؟ \n%1 - - - - Select Patch File: - فایل پچ را انتخاب کنید - - - - Download Patches - دانلود کردن پچ ها - - - Save ذخیره - - Cheats - چیت ها - - - - Patches - پچ ها - - - - Error - ارور - - - - No patch selected. - هیچ پچ انتخاب نشده - - - - Unable to open files.json for reading. - .json مشکل در خواندن فایل - - - - No patch file found for the current serial. - هیچ فایل پچ برای سریال بازی شما پیدا نشد. - - - - Unable to open the file for reading. - خطا در خواندن فایل - - - - Unable to open the file for writing. - خطا در نوشتن فایل - - - - Failed to parse XML: - انجام نشد XML تجزیه فایل: - - - - Success - عملیات موفق بود - - - - Options saved successfully. - تغییرات با موفقیت ذخیره شد✅ - - - - Invalid Source - منبع نامعتبر❌ - - - - The selected source is invalid. - منبع انتخاب شده نامعتبر است - - - - File Exists - فایل وجود دارد - - - - File already exists. Do you want to replace it? - فایل از قبل وجود دارد. آیا می خواهید آن را جایگزین کنید؟ - - - - Failed to save file: - ذخیره فایل موفقیت آمیز نبود: - - - - Failed to download file: - خطا در دانلود فایل: - - - - Cheats Not Found - چیت یافت نشد - - - - CheatsNotFound_MSG - متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید. - - - - Cheats Downloaded Successfully - دانلود چیت ها موفقیت آمیز بود✅ - - - - CheatsDownloadedSuccessfully_MSG - تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید. - - - - Failed to save: - خطا در ذخیره اطلاعات: - - - - Failed to download: - خطا در دانلود❌ - - - - Download Complete - دانلود کامل شد - - - - DownloadComplete_MSG - پچ ها با موفقیت بارگیری شدند! تمام وصله های موجود برای همه بازی ها دانلود شده اند، نیازی به دانلود جداگانه آنها برای هر بازی نیست، همانطور که در Cheats اتفاق می افتد. اگر پچ ظاهر نشد، ممکن است برای سریال و نسخه خاصی از بازی وجود نداشته باشد. - - - - Failed to parse JSON data from HTML. - HTML از JSON خطا در تجزیه اطلاعات. - - - - Failed to retrieve HTML page. - HTML خطا دربازیابی صفحه - - - - The game is in version: %1 - بازی در نسخه: %1 است - - - - The downloaded patch only works on version: %1 - وصله دانلود شده فقط در نسخه: %1 کار می کند - - - - You may need to update your game. - شاید لازم باشد بازی خود را به روز کنید. - - - - Incompatibility Notice - اطلاعیه عدم سازگاری - - - - Failed to open file: - خطا در اجرای فایل: - - - - XML ERROR: - XML ERROR: - - - - Failed to open files.json for writing - .json خطا در نوشتن فایل - - - - Author: - تولید کننده: - - - - Directory does not exist: - پوشه وجود ندارد: - - - - Failed to open files.json for reading. - .json خطا در خواندن فایل - - - - Name: - نام: - - - - Can't apply cheats before the game is started - قبل از شروع بازی نمی توانید تقلب ها را اعمال کنید. - - - - SettingsDialog - - - Save - ذخیره - - - Apply اعمال - Restore Defaults بازیابی پیش فرض ها - Close بستن - Point your mouse at an option to display its description. ماوس خود را بر روی یک گزینه قرار دهید تا توضیحات آن نمایش داده شود. - consoleLanguageGroupBox Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - emulatorLanguageGroupBox زبان شبیه‌ساز:\nزبان رابط کاربری شبیه‌ساز را انتخاب می‌کند. - fullscreenCheckBox فعال‌سازی تمام صفحه:\nپنجره بازی را به‌طور خودکار به حالت تمام صفحه در می‌آورد.\nبرای تغییر این حالت می‌توانید کلید F11 را فشار دهید. - separateUpdatesCheckBox فعال‌سازی پوشه جداگانه برای به‌روزرسانی:\nامکان نصب به‌روزرسانی‌های بازی در یک پوشه جداگانه برای مدیریت راحت‌تر را فراهم می‌کند. - showSplashCheckBox نمایش صفحه شروع:\nصفحه شروع بازی (تصویری ویژه) را هنگام بارگذاری بازی نمایش می‌دهد. - ps4proCheckBox حالت PS4 Pro:\nشبیه‌ساز را به‌عنوان PS4 Pro شبیه‌سازی می‌کند که ممکن است ویژگی‌های ویژه‌ای را در بازی‌های پشتیبانی‌شده فعال کند. - discordRPCCheckbox فعال کردن Discord Rich Presence:\nآیکون شبیه ساز و اطلاعات مربوطه را در نمایه Discord شما نمایش می دهد. - userName نام کاربری:\nنام کاربری حساب PS4 را تنظیم می‌کند که ممکن است توسط برخی بازی‌ها نمایش داده شود. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox نوع لاگ:\nتنظیم می‌کند که آیا خروجی پنجره لاگ برای بهبود عملکرد همگام‌سازی شود یا خیر. این ممکن است تأثیر منفی بر شبیه‌سازی داشته باشد. - logFilter Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - updaterGroupBox به‌روزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر می‌شوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست‌ شده‌تر هستند.\nشبانه: نسخه‌های توسعه‌ای که شامل جدیدترین ویژگی‌ها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند. - GUIgroupBox پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال می‌کند. - disableTrophycheckBox غیرفعال کردن نمایش جوایز:\nنمایش اعلان‌های جوایز درون بازی را غیرفعال می‌کند. پیشرفت جوایز همچنان از طریق نمایشگر جوایز (کلیک راست روی بازی در پنجره اصلی) قابل پیگیری است.. - hideCursorGroupBox پنهان کردن نشانگر:\nانتخاب کنید که نشانگر چه زمانی ناپدید شود:\nهرگز: شما همیشه ماوس را خواهید دید.\nغیرفعال: زمانی را برای ناپدید شدن بعد از غیرفعالی تعیین کنید.\nهمیشه: شما هرگز ماوس را نخواهید دید. - idleTimeoutGroupBox زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید. - backButtonBehaviorGroupBox رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند. - enableCompatibilityCheckBox نمایش داده‌های سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش می‌دهد. برای دریافت اطلاعات به‌روز، گزینه "به‌روزرسانی سازگاری هنگام راه‌اندازی" را فعال کنید. - checkCompatibilityOnStartupCheckBox به‌روزرسانی سازگاری هنگام راه‌اندازی:\nبه‌طور خودکار پایگاه داده سازگاری را هنگام راه‌اندازی ShadPS4 به‌روزرسانی می‌کند. - updateCompatibilityButton به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. - Never هرگز - Idle بیکار - Always همیشه - Touchpad Left صفحه لمسی سمت چپ - Touchpad Right صفحه لمسی سمت راست - Touchpad Center مرکز صفحه لمسی - None هیچ کدام - graphicsAdapterGroupBox دستگاه گرافیکی:\nدر سیستم‌های با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیه‌ساز از آن استفاده می‌کند را انتخاب کنید، یا گزینه "انتخاب خودکار" را انتخاب کنید تا به طور خودکار تعیین شود. - resolutionLayout عرض/ارتفاع:\nاندازه پنجره شبیه‌ساز را در هنگام راه‌اندازی تنظیم می‌کند، که در حین بازی قابل تغییر اندازه است.\nاین با وضوح داخل بازی متفاوت است. - heightDivider تقسیم‌کننده Vblank:\nمیزان فریم ریت که شبیه‌ساز با آن به‌روزرسانی می‌شود، در این عدد ضرب می‌شود. تغییر این مقدار ممکن است تأثیرات منفی داشته باشد، مانند افزایش سرعت بازی یا خراب شدن عملکردهای حیاتی بازی که انتظار تغییر آن را ندارند! - dumpShadersCheckBox فعال‌سازی ذخیره‌سازی شیدرها:\nبه‌منظور اشکال‌زدایی فنی، شیدرهای بازی را هنگام رندر شدن در یک پوشه ذخیره می‌کند. - nullGpuCheckBox Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - gameFoldersBox پوشه های بازی:\nلیست پوشه هایی که باید بازی های نصب شده را بررسی کنید. - addFolderButton اضافه کردن:\nیک پوشه به لیست اضافه کنید. - removeFolderButton حذف:\nیک پوشه را از لیست حذف کنید. - debugDump فعال‌سازی ذخیره‌سازی دیباگ:\nنمادهای import و export و اطلاعات هدر فایل برنامه در حال اجرای PS4 را در یک پوشه ذخیره می‌کند. - vkValidationCheckBox Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - vkSyncValidationCheckBox Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - rdocCheckBox Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + CheatsPatches + + Cheats / Patches for + چیت / پچ برای + + + defaultTextEdit_MSG + defaultTextEdit_MSG + + + No Image Available + تصویری موجود نمی باشد + + + Serial: + سریال: + + + Version: + نسخه: + + + Size: + حجم: + + + Select Cheat File: + فایل چیت را انتخاب کنید: + + + Repository: + :منبع + + + Download Cheats + دانلود چیت ها + + + Delete File + حذف فایل + + + No files selected. + فایلی انتخاب نشده. + + + You can delete the cheats you don't want after downloading them. + شما میتوانید بعد از دانلود چیت هایی که نمیخواهید را پاک کنید + + + Do you want to delete the selected file?\n%1 + آیا میخواهید فایل های انتخاب شده را پاک کنید؟ \n%1 + + + Select Patch File: + فایل پچ را انتخاب کنید + + + Download Patches + دانلود کردن پچ ها + + + Save + ذخیره + + + Cheats + چیت ها + + + Patches + پچ ها + + + Error + ارور + + + No patch selected. + هیچ پچ انتخاب نشده + + + Unable to open files.json for reading. + .json مشکل در خواندن فایل + + + No patch file found for the current serial. + هیچ فایل پچ برای سریال بازی شما پیدا نشد. + + + Unable to open the file for reading. + خطا در خواندن فایل + + + Unable to open the file for writing. + خطا در نوشتن فایل + + + Failed to parse XML: + انجام نشد XML تجزیه فایل: + + + Success + عملیات موفق بود + + + Options saved successfully. + تغییرات با موفقیت ذخیره شد✅ + + + Invalid Source + منبع نامعتبر❌ + + + The selected source is invalid. + منبع انتخاب شده نامعتبر است + + + File Exists + فایل وجود دارد + + + File already exists. Do you want to replace it? + فایل از قبل وجود دارد. آیا می خواهید آن را جایگزین کنید؟ + + + Failed to save file: + ذخیره فایل موفقیت آمیز نبود: + + + Failed to download file: + خطا در دانلود فایل: + + + Cheats Not Found + چیت یافت نشد + + + CheatsNotFound_MSG + متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید. + + + Cheats Downloaded Successfully + دانلود چیت ها موفقیت آمیز بود✅ + + + CheatsDownloadedSuccessfully_MSG + تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید. + + + Failed to save: + خطا در ذخیره اطلاعات: + + + Failed to download: + خطا در دانلود❌ + + + Download Complete + دانلود کامل شد + + + DownloadComplete_MSG + پچ ها با موفقیت بارگیری شدند! تمام وصله های موجود برای همه بازی ها دانلود شده اند، نیازی به دانلود جداگانه آنها برای هر بازی نیست، همانطور که در Cheats اتفاق می افتد. اگر پچ ظاهر نشد، ممکن است برای سریال و نسخه خاصی از بازی وجود نداشته باشد. + + + Failed to parse JSON data from HTML. + HTML از JSON خطا در تجزیه اطلاعات. + + + Failed to retrieve HTML page. + HTML خطا دربازیابی صفحه + + + The game is in version: %1 + بازی در نسخه: %1 است + + + The downloaded patch only works on version: %1 + وصله دانلود شده فقط در نسخه: %1 کار می کند + + + You may need to update your game. + شاید لازم باشد بازی خود را به روز کنید. + + + Incompatibility Notice + اطلاعیه عدم سازگاری + + + Failed to open file: + خطا در اجرای فایل: + + + XML ERROR: + XML ERROR: + + + Failed to open files.json for writing + .json خطا در نوشتن فایل + + + Author: + تولید کننده: + + + Directory does not exist: + پوشه وجود ندارد: + + + Failed to open files.json for reading. + .json خطا در خواندن فایل + + + Name: + نام: + + + Can't apply cheats before the game is started + قبل از شروع بازی نمی توانید تقلب ها را اعمال کنید. + + GameListFrame - Icon آیکون - Name نام - Serial سریال - Compatibility سازگاری - Region منطقه - Firmware فریم‌ور - Size اندازه - Version نسخه - Path مسیر - Play Time زمان بازی - Never Played هرگز بازی نشده - h h - m m - s s - Compatibility is untested سازگاری تست نشده است - Game does not initialize properly / crashes the emulator بازی به درستی راه‌اندازی نمی‌شود / شبیه‌ساز کرش می‌کند - Game boots, but only displays a blank screen بازی اجرا می‌شود، اما فقط یک صفحه خالی نمایش داده می‌شود - Game displays an image but does not go past the menu بازی تصویری نمایش می‌دهد، اما از منو فراتر نمی‌رود - Game has game-breaking glitches or unplayable performance بازی دارای اشکالات بحرانی یا عملکرد غیرقابل بازی است - Game can be completed with playable performance and no major glitches بازی با عملکرد قابل قبول و بدون اشکالات عمده قابل بازی است. @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater به‌روزرسانی خودکار - Error خطا - Network error: خطای شبکه: - Failed to parse update information. خطا در تجزیه اطلاعات بهروزرسانی. - No pre-releases found. هیچ پیش انتشاری یافت نشد. - Invalid release data. داده های نسخه نامعتبر است. - No download URL found for the specified asset. هیچ URL دانلودی برای دارایی مشخص شده پیدا نشد. - Your version is already up to date! نسخه شما اکنون به روز شده است! - Update Available به روز رسانی موجود است - Update Channel کانال به‌روزرسانی - Current Version نسخه فعلی - Latest Version جدیدترین نسخه - Do you want to update? آیا می خواهید به روز رسانی کنید؟ - Show Changelog نمایش تغییرات - Check for Updates at Startup بررسی به‌روزرسانی هنگام شروع - Update به روز رسانی - No خیر - Hide Changelog مخفی کردن تغییرات - Changes تغییرات - Network error occurred while trying to access the URL در حین تلاش برای دسترسی به URL خطای شبکه رخ داد - Download Complete دانلود کامل شد - The update has been downloaded, press OK to install. به روز رسانی دانلود شده است، برای نصب OK را فشار دهید. - Failed to save the update file at فایل به روز رسانی ذخیره نشد - Starting Update... شروع به روز رسانی... - Failed to create the update script file فایل اسکریپت به روز رسانی ایجاد نشد @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + - + \ No newline at end of file diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 99c1de67e..47c38fc46 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Tietoa shadPS4:sta - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori. - This software should not be used to play games you have not legally obtained. Tätä ohjelmistoa ei saa käyttää pelien pelaamiseen, joita et ole hankkinut laillisesti. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Avaa Hakemisto @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Ole hyvä ja odota, ladataan pelilistaa :3 - Cancel Peruuta - Loading... Ladataan... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Valitse hakemisto - Select which directory you want to install to. Valitse, mihin hakemistoon haluat asentaa. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Valitse hakemisto - Directory to install games Pelien asennushakemisto - Browse Selaa - Error Virhe - The value for location to install games is not valid. Peliasennushakemiston sijainti on virheellinen. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Luo Pikakuvake - Cheats / Patches Huijaukset / Korjaukset - SFO Viewer SFO Selain - Trophy Viewer Trophy Selain - Open Folder... Avaa Hakemisto... - Open Game Folder Avaa Pelihakemisto - Open Save Data Folder Avaa Tallennustiedostohakemisto - Open Log Folder Avaa Lokihakemisto - Copy info... Kopioi tietoja... - Copy Name Kopioi Nimi - Copy Serial Kopioi Sarjanumero - Copy All Kopioi kaikki - Delete... Poista... - Delete Game Poista Peli - Delete Update Poista Päivitys - Delete DLC Poista Lisäsisältö - Compatibility... Yhteensopivuus... - Update database Päivitä tietokanta - View report Näytä raportti - Submit a report Tee raportti - Shortcut creation Pikakuvakkeen luonti - Shortcut created successfully! Pikakuvake luotu onnistuneesti! - Error Virhe - Error creating shortcut! Virhe pikakuvakkeen luonnissa! - Install PKG Asenna PKG - Game Peli - requiresEnableSeparateUpdateFolder_MSG Tämä ominaisuus vaatii, että 'Ota käyttöön erillinen päivityshakemisto' -asetus on päällä. Jos haluat käyttää tätä ominaisuutta, laita se asetus päälle. - This game has no update to delete! Tällä pelillä ei ole poistettavaa päivitystä! - - + Update Päivitä - This game has no DLC to delete! Tällä pelillä ei ole poistettavaa lisäsisältöä! - DLC Lisäsisältö - Delete %1 Poista %1 - Are you sure you want to delete %1's %2 directory? Haluatko varmasti poistaa %1n %2hakemiston? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Avaa/Lisää Elf Hakemisto - Install Packages (PKG) Asenna Paketteja (PKG) - Boot Game Käynnistä Peli - Check for Updates Tarkista Päivitykset - About shadPS4 Tietoa shadPS4:sta - Configure... Asetukset... - Install application from a .pkg file Asenna sovellus .pkg tiedostosta - Recent Games Viimeisimmät Pelit - Exit Sulje - Exit shadPS4 Sulje shadPS4 - Exit the application. Sulje sovellus. - Show Game List Avaa pelilista - Game List Refresh Päivitä pelilista - Tiny Hyvin pieni - Small Pieni - Medium Keskikokoinen - Large Suuri - List View Listanäkymä - Grid View Ruudukkonäkymä - Elf Viewer Elf Selain - Game Install Directory Peliasennushakemisto - Download Cheats/Patches Lataa Huijaukset / Korjaukset - Dump Game List Kirjoita Pelilista Tiedostoon - PKG Viewer PKG Selain - Search... Hae... - File Tiedosto - View Näkymä - Game List Icons Pelilistan Ikonit - Game List Mode Pelilistamuoto - Settings Asetukset - Utils Työkalut - Themes Teemat - Help Apua - Dark Tumma - Light Vaalea - Green Vihreä - Blue Sininen - Violet Violetti - toolBar Työkalupalkki + + Game List + Pelilista + + + * Unsupported Vulkan Version + * Ei Tuettu Vulkan-versio + + + Download Cheats For All Installed Games + Lataa Huijaukset Kaikille Asennetuille Peleille + + + Download Patches For All Games + Lataa Paikkaukset Kaikille Peleille + + + Download Complete + Lataus Valmis + + + You have downloaded cheats for all the games you have installed. + Olet ladannut huijaukset kaikkiin asennettuihin peleihin. + + + Patches Downloaded Successfully! + Paikkaukset Ladattu Onnistuneesti! + + + All Patches available for all games have been downloaded. + Kaikki saatavilla olevat Paikkaukset kaikille peleille on ladattu. + + + Games: + Pelit: + + + PKG File (*.PKG) + PKG-tiedosto (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF-tiedostot (*.bin *.elf *.oelf) + + + Game Boot + Pelin Käynnistys + + + Only one file can be selected! + Vain yksi tiedosto voi olla valittuna! + + + PKG Extraction + PKG:n purku + + + Patch detected! + Päivitys havaittu! + + + PKG and Game versions match: + PKG- ja peliversiot vastaavat: + + + Would you like to overwrite? + Haluatko korvata? + + + PKG Version %1 is older than installed version: + PKG-versio %1 on vanhempi kuin asennettu versio: + + + Game is installed: + Peli on asennettu: + + + Would you like to install Patch: + Haluatko asentaa päivityksen: + + + DLC Installation + Lisäsisällön asennus + + + Would you like to install DLC: %1? + Haluatko asentaa lisäsisällön: %1? + + + DLC already installed: + Lisäsisältö on jo asennettu: + + + Game already installed + Peli on jo asennettu + + + PKG is a patch, please install the game first! + PKG on päivitys, asenna peli ensin! + + + PKG ERROR + PKG VIRHE + + + Extracting PKG %1/%2 + Purkaminen PKG %1/%2 + + + Extraction Finished + Purku valmis + + + Game successfully installed at %1 + Peli asennettu onnistuneesti kohtaan %1 + + + File doesn't appear to be a valid PKG file + Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto + PKGViewer - Open Folder Avaa Hakemisto @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Selain @@ -478,1029 +509,700 @@ SettingsDialog - Settings Asetukset - General Yleinen - System Järjestelmä - Console Language Konsolin Kieli - Emulator Language Emulaattorin Kieli - Emulator Emulaattori - Enable Fullscreen Ota Käyttöön Koko Ruudun Tila - Enable Separate Update Folder Ota Käyttöön Erillinen Päivityshakemisto - Show Splash Näytä Aloitusnäyttö - Is PS4 Pro On PS4 Pro - Enable Discord Rich Presence Ota käyttöön Discord Rich Presence - Username Käyttäjänimi - Trophy Key Trophy Avain - Trophy Trophy - Logger Lokinkerääjä - Log Type Lokin Tyyppi - Log Filter Lokisuodatin - Input Syöttö - Cursor Kursori - Hide Cursor Piilota Kursori - Hide Cursor Idle Timeout Inaktiivisuuden Aikaraja Kursorin Piilottamiseen - s s - Controller Ohjain - Back Button Behavior Takaisin-painikkeen Käyttäytyminen - Graphics Grafiikka - Graphics Device Näytönohjain - Width Leveys - Height Korkeus - Vblank Divider Vblank jakaja - Advanced Lisäasetukset - Enable Shaders Dumping Ota Käyttöön Varjostinvedokset - Enable NULL GPU Ota Käyttöön NULL GPU - Paths Polut - Game Folders Pelihakemistot - Add... - Lisää... + Lisää... - Remove Poista - Debug Virheenkorjaus - Enable Debug Dumping Ota Käyttöön Virheenkorjausvedokset - Enable Vulkan Validation Layers Ota Käyttöön Vulkan-validointikerrokset - Enable Vulkan Synchronization Validation Ota Käyttöön Vulkan-synkronointivalidointi - Enable RenderDoc Debugging Ota Käyttöön RenderDoc Virheenkorjaus - Update Päivitys - Check for Updates at Startup Tarkista Päivitykset Käynnistäessä - Update Channel Päivityskanava - Check for Updates Tarkista Päivitykset - GUI Settings GUI-asetukset - Disable Trophy Pop-ups Poista Trophy Pop-upit Käytöstä - Play title music Soita Otsikkomusiikkia - Update Compatibility Database On Startup Päivitä Yhteensopivuustietokanta Käynnistäessä - Game Compatibility Peliyhteensopivuus - Display Compatibility Data Näytä Yhteensopivuustiedot - Update Compatibility Database Päivitä Yhteensopivuustietokanta - Volume Äänenvoimakkuus - Audio Backend Äänijärjestelmä - - - MainWindow - - Game List - Pelilista - - - - * Unsupported Vulkan Version - * Ei Tuettu Vulkan-versio - - - - Download Cheats For All Installed Games - Lataa Huijaukset Kaikille Asennetuille Peleille - - - - Download Patches For All Games - Lataa Paikkaukset Kaikille Peleille - - - - Download Complete - Lataus Valmis - - - - You have downloaded cheats for all the games you have installed. - Olet ladannut huijaukset kaikkiin asennettuihin peleihin. - - - - Patches Downloaded Successfully! - Paikkaukset Ladattu Onnistuneesti! - - - - All Patches available for all games have been downloaded. - Kaikki saatavilla olevat Paikkaukset kaikille peleille on ladattu. - - - - Games: - Pelit: - - - - PKG File (*.PKG) - PKG-tiedosto (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-tiedostot (*.bin *.elf *.oelf) - - - - Game Boot - Pelin Käynnistys - - - - Only one file can be selected! - Vain yksi tiedosto voi olla valittuna! - - - - PKG Extraction - PKG:n purku - - - - Patch detected! - Päivitys havaittu! - - - - PKG and Game versions match: - PKG- ja peliversiot vastaavat: - - - - Would you like to overwrite? - Haluatko korvata? - - - - PKG Version %1 is older than installed version: - PKG-versio %1 on vanhempi kuin asennettu versio: - - - - Game is installed: - Peli on asennettu: - - - - Would you like to install Patch: - Haluatko asentaa Päivityksen: - - - - DLC Installation - Lisäsisällön asennus - - - - Would you like to install DLC: %1? - Haluatko asentaa lisäsisällön: %1? - - - - DLC already installed: - Lisäsisältö on jo asennettu: - - - - Game already installed - Peli on jo asennettu - - - - PKG is a patch, please install the game first! - PKG on päivitys, asenna peli ensin! - - - - PKG ERROR - PKG VIRHE - - - - Extracting PKG %1/%2 - Purkaminen PKG %1/%2 - - - - Extraction Finished - Purku Valmis - - - - Game successfully installed at %1 - Peli asennettu onnistuneesti kohtaan %1 - - - - File doesn't appear to be a valid PKG file - Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto - - - - CheatsPatches - - - Cheats / Patches for - Huijaukset / Paikkaukset pelille - - - - defaultTextEdit_MSG - Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Kuvaa ei saatavilla - - - - Serial: - Sarjanumero: - - - - Version: - Versio: - - - - Size: - Koko: - - - - Select Cheat File: - Valitse Huijaustiedosto: - - - - Repository: - Repositorio: - - - - Download Cheats - Lataa Huijaukset - - - - Delete File - Poista Tiedosto - - - - No files selected. - Tiedostoja ei ole valittuna. - - - - You can delete the cheats you don't want after downloading them. - Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. - - - - Do you want to delete the selected file?\n%1 - Haluatko poistaa valitun tiedoston?\n%1 - - - - Select Patch File: - Valitse Paikkaustiedosto: - - - - Download Patches - Lataa Paikkaukset - - - Save Tallenna - - Cheats - Huijaukset - - - - Patches - Paikkaukset - - - - Error - Virhe - - - - No patch selected. - Paikkausta ei ole valittuna. - - - - Unable to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. - - - - No patch file found for the current serial. - Nykyiselle sarjanumerolle ei löytynyt paikkaustiedostoa. - - - - Unable to open the file for reading. - Tiedostoa ei voitu avata lukemista varten. - - - - Unable to open the file for writing. - Tiedostoa ei voitu avata kirjoittamista varten. - - - - Failed to parse XML: - XML:n jäsentäminen epäonnistui: - - - - Success - Onnistuminen - - - - Options saved successfully. - Vaihtoehdot tallennettu onnistuneesti. - - - - Invalid Source - Virheellinen Lähde - - - - The selected source is invalid. - Valittu lähde on virheellinen. - - - - File Exists - Olemassaoleva Tiedosto - - - - File already exists. Do you want to replace it? - Tiedosto on jo olemassa. Haluatko korvata sen? - - - - Failed to save file: - Tiedoston tallentaminen epäonnistui: - - - - Failed to download file: - Tiedoston lataaminen epäonnistui: - - - - Cheats Not Found - Huijauksia Ei Löytynyt - - - - CheatsNotFound_MSG - Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. - - - - Cheats Downloaded Successfully - Huijaukset Ladattu Onnistuneesti - - - - CheatsDownloadedSuccessfully_MSG - Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. - - - - Failed to save: - Tallentaminen epäonnistui: - - - - Failed to download: - Lataus epäonnistui: - - - - Download Complete - Lataus valmis - - - - DownloadComplete_MSG - Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. - - - - Failed to parse JSON data from HTML. - JSON-tietojen jäsentäminen HTML:stä epäonnistui. - - - - Failed to retrieve HTML page. - HTML-sivun hakeminen epäonnistui. - - - - The game is in version: %1 - Peli on versiossa: %1 - - - - The downloaded patch only works on version: %1 - Ladattu paikkaus toimii vain versiossa: %1 - - - - You may need to update your game. - Sinun on ehkä päivitettävä pelisi. - - - - Incompatibility Notice - Yhteensopivuusilmoitus - - - - Failed to open file: - Tiedoston avaaminen epäonnistui: - - - - XML ERROR: - XML VIRHE: - - - - Failed to open files.json for writing - Tiedostoa files.json ei voitu avata kirjoittamista varten - - - - Author: - Tekijä: - - - - Directory does not exist: - Hakemistoa ei ole olemassa: - - - - Failed to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. - - - - Name: - Nimi: - - - - Can't apply cheats before the game is started - Huijauksia ei voi käyttää ennen kuin peli on käynnissä. - - - - SettingsDialog - - - Save - Tallenna - - - Apply - Ota Käyttöön + Ota käyttöön - Restore Defaults Palauta Oletukset - Close Sulje - Point your mouse at an option to display its description. Siirrä hiiri vaihtoehdon päälle näyttääksesi sen kuvauksen. - consoleLanguageGroupBox Konsolin Kieli:\nAseta PS4-pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. - emulatorLanguageGroupBox Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. - fullscreenCheckBox Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. - separateUpdatesCheckBox Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. - showSplashCheckBox - Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. + Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. - ps4proCheckBox On PS4 Pro:\nAsettaa emulaattorin toimimaan PS4 PRO:na, mikä voi mahdollistaa erityisiä ominaisuuksia peleissä, jotka tukevat sitä. - discordRPCCheckbox Ota käyttöön Discord Rich Presence:\nNäyttää emulaattorin kuvakkeen ja asiaankuuluvat tiedot Discord-profiilissasi. - userName Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissain peleissä. - TrophyKey Trophy Avain:\nThrophyjen dekryptoinnissa käytetty avain. Pitää hankkia jailbreakatusta konsolista.\nSaa sisältää vain hex-merkkejä. - logTypeGroupBox Lokityyppi:\nAsettaa, synkronoidaanko loki-ikkunan ulostulo suorituskyvyn vuoksi. Tämä voi vaikuttaa haitallisesti emulointiin. - logFilter Lokisuodatin:\nSuodattaa lokia tulostamaan vain määrättyä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nTasot: Trace, Debug, Info, Warning, Error, Critical - tässä järjestyksessä. Valittu taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. - updaterGroupBox Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. - GUIgroupBox Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. - disableTrophycheckBox Poista Trophy Pop-upit Käytöstä:\nPoista trophy ilmoitukset pelin aikana. Trophyjen edistystä voi silti seurata Trophy Selainta käyttämällä (klikkaa peliä hiiren oikealla emulaattorin pääikkunassa). - hideCursorGroupBox Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nInaktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. - idleTimeoutGroupBox Aseta aika, milloin hiiri häviää oltuaan aktiivinen. - backButtonBehaviorGroupBox Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan. - enableCompatibilityCheckBox Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön "Päivitä Yhteensopivuustietokanta Käynnistäessä" saadaksesi ajantasaista tietoa. - checkCompatibilityOnStartupCheckBox Päivitä Yhteensopivuustiedot Käynnistäessä:\nPäivitä yhteensopivuustiedot automaattisesti shadPS4:n käynnistyessä. - updateCompatibilityButton Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. - Never Ei koskaan - Idle Inaktiivinen - Always Aina - Touchpad Left Kosketuslevyn Vasen Puoli - Touchpad Right Kosketuslevyn Oikea Puoli - Touchpad Center Kosketuslevyn Keskikohta - None Ei mitään - graphicsAdapterGroupBox Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse "Auto Select" automaattiseen määritykseen. - resolutionLayout Leveys/Korkeus:\nAsettaa käynnistetyn emulaattori-ikkunan koon, jota voidaan muuttaa pelin aikana.\nTämä on eri, kuin pelin sisäinen resoluutio. - heightDivider Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten lisätä pelin nopeutta tai rikkoa kriittisiä pelitoimintoja, jotka eivät odota tämän muuttuvan! - dumpShadersCheckBox Ota Käyttöön Varjostinvedokset:\nTeknistä vianetsintää varten. Pelin varjostimia tallennetaan hakemistoon niiden renderöityessä. - nullGpuCheckBox Ota Null GPU käyttöön:\nTeknistä vianetsintää varten. Pelin renderöinti estetään, ikään kuin näytönohjainta ei olisi. - gameFoldersBox Pelihakemistot:\nLista hakemistoista, joista pelejä haetaan. - addFolderButton Lisää:\nLisää hakemisto listalle. - removeFolderButton Poista:\nPoista hakemisto listalta. - debugDump Ota Käyttöön Virheenkorjausvedokset:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. - vkValidationCheckBox Ota Käyttöön Vulkan-validointikerrokset:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - vkSyncValidationCheckBox Ota Käyttöön Vulkan-synkronointivalidointi:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - rdocCheckBox Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. + + CheatsPatches + + Cheats / Patches for + Huijaukset / Paikkaukset pelille + + + defaultTextEdit_MSG + Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Kuvaa ei saatavilla + + + Serial: + Sarjanumero: + + + Version: + Versio: + + + Size: + Koko: + + + Select Cheat File: + Valitse Huijaustiedosto: + + + Repository: + Repositorio: + + + Download Cheats + Lataa Huijaukset + + + Delete File + Poista Tiedosto + + + No files selected. + Tiedostoja ei ole valittuna. + + + You can delete the cheats you don't want after downloading them. + Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. + + + Do you want to delete the selected file?\n%1 + Haluatko poistaa valitun tiedoston?\n%1 + + + Select Patch File: + Valitse Paikkaustiedosto: + + + Download Patches + Lataa Paikkaukset + + + Save + Tallenna + + + Cheats + Huijaukset + + + Patches + Paikkaukset + + + Error + Virhe + + + No patch selected. + Paikkausta ei ole valittuna. + + + Unable to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. + + + No patch file found for the current serial. + Nykyiselle sarjanumerolle ei löytynyt paikkaustiedostoa. + + + Unable to open the file for reading. + Tiedostoa ei voitu avata lukemista varten. + + + Unable to open the file for writing. + Tiedostoa ei voitu avata kirjoittamista varten. + + + Failed to parse XML: + XML:n jäsentäminen epäonnistui: + + + Success + Onnistuminen + + + Options saved successfully. + Vaihtoehdot tallennettu onnistuneesti. + + + Invalid Source + Virheellinen Lähde + + + The selected source is invalid. + Valittu lähde on virheellinen. + + + File Exists + Olemassaoleva Tiedosto + + + File already exists. Do you want to replace it? + Tiedosto on jo olemassa. Haluatko korvata sen? + + + Failed to save file: + Tiedoston tallentaminen epäonnistui: + + + Failed to download file: + Tiedoston lataaminen epäonnistui: + + + Cheats Not Found + Huijauksia Ei Löytynyt + + + CheatsNotFound_MSG + Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. + + + Cheats Downloaded Successfully + Huijaukset Ladattu Onnistuneesti + + + CheatsDownloadedSuccessfully_MSG + Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. + + + Failed to save: + Tallentaminen epäonnistui: + + + Failed to download: + Lataus epäonnistui: + + + Download Complete + Lataus valmis + + + DownloadComplete_MSG + Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. + + + Failed to parse JSON data from HTML. + JSON-tietojen jäsentäminen HTML:stä epäonnistui. + + + Failed to retrieve HTML page. + HTML-sivun hakeminen epäonnistui. + + + The game is in version: %1 + Peli on versiossa: %1 + + + The downloaded patch only works on version: %1 + Ladattu paikkaus toimii vain versiossa: %1 + + + You may need to update your game. + Sinun on ehkä päivitettävä pelisi. + + + Incompatibility Notice + Yhteensopivuusilmoitus + + + Failed to open file: + Tiedoston avaaminen epäonnistui: + + + XML ERROR: + XML VIRHE: + + + Failed to open files.json for writing + Tiedostoa files.json ei voitu avata kirjoittamista varten + + + Author: + Tekijä: + + + Directory does not exist: + Hakemistoa ei ole olemassa: + + + Failed to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. + + + Name: + Nimi: + + + Can't apply cheats before the game is started + Huijauksia ei voi käyttää ennen kuin peli on käynnissä. + + GameListFrame - Icon Ikoni - Name Nimi - Serial Sarjanumero - Compatibility Compatibility - Region Alue - Firmware Ohjelmisto - Size Koko - Version Versio - Path Polku - Play Time Peliaika - Never Played Pelaamaton - h h - m m - s s - Compatibility is untested Yhteensopivuutta ei ole testattu - Game does not initialize properly / crashes the emulator - Peli ei alustaudu kunnolla / kaataa emulaattorin + Peli ei alustaudu kunnolla / kaataa emulaattorin - Game boots, but only displays a blank screen Peli käynnistyy, mutta näyttää vain tyhjän ruudun - Game displays an image but does not go past the menu Peli näyttää kuvan mutta ei mene valikosta eteenpäin - Game has game-breaking glitches or unplayable performance Pelissä on pelikokemusta rikkovia häiriöitä tai kelvoton suorituskyky - Game can be completed with playable performance and no major glitches Pelillä on hyväksyttävä suorituskyky, eikä mitään suuria häiriöitä @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automaattinen Päivitys - Error Virhe - Network error: Verkkovirhe: - Failed to parse update information. Päivitystietojen jäsentäminen epäonnistui. - No pre-releases found. Ennakkojulkaisuja ei löytynyt. - Invalid release data. Virheelliset julkaisutiedot. - No download URL found for the specified asset. Lataus-URL:ia ei löytynyt määritetylle omaisuudelle. - Your version is already up to date! Versiosi on jo ajan tasalla! - Update Available Päivitys Saatavilla - Update Channel Päivityskanava - Current Version Nykyinen Versio - Latest Version Uusin Versio - Do you want to update? Haluatko päivittää? - Show Changelog Näytä Muutoshistoria - Check for Updates at Startup Tarkista Päivitykset Käynnistettäessä - Update Päivitä - No Ei - Hide Changelog Piilota Muutoshistoria - Changes Muutokset - Network error occurred while trying to access the URL URL-osoitteeseen yhdistettäessä tapahtui verkkovirhe - Download Complete Lataus Valmis - The update has been downloaded, press OK to install. Päivitys on ladattu, paina OK asentaaksesi. - Failed to save the update file at Päivitystiedoston tallentaminen epäonnistui sijaintiin - Starting Update... Aloitetaan päivitystä... - Failed to create the update script file Päivitysskripttitiedoston luominen epäonnistui @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + - + \ No newline at end of file diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 441eaddb1..c2a2a64d7 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 À propos de shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 est un émulateur open-source expérimental de la PlayStation 4. - This software should not be used to play games you have not legally obtained. Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Ouvrir un dossier @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Chargement de la liste de jeu, veuillez patienter... - Cancel Annuler - Loading... Chargement... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choisir un répertoire - Select which directory you want to install to. Sélectionnez le répertoire où vous souhaitez effectuer l'installation. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choisir un répertoire - Directory to install games Répertoire d'installation des jeux - Browse Parcourir - Error Erreur - The value for location to install games is not valid. Le répertoire d'installation des jeux n'est pas valide. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Créer un raccourci - Cheats / Patches Cheats/Patchs - SFO Viewer Visionneuse SFO - Trophy Viewer Visionneuse de trophées - Open Folder... Ouvrir le Dossier... - Open Game Folder Ouvrir le Dossier du Jeu - Open Save Data Folder Ouvrir le Dossier des Données de Sauvegarde - Open Log Folder Ouvrir le Dossier des Logs - Copy info... Copier infos... - Copy Name Copier le nom - Copy Serial Copier le N° de série - Copy All Copier tout - Delete... Supprimer... - Delete Game Supprimer jeu - Delete Update Supprimer MÀJ - Delete DLC Supprimer DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Création du raccourci - Shortcut created successfully! Raccourci créé avec succès ! - Error Erreur - Error creating shortcut! Erreur lors de la création du raccourci ! - Install PKG Installer un PKG - Game Jeu - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! Ce jeu n'a pas de mise à jour à supprimer! - - + Update Mise à jour - This game has no DLC to delete! Ce jeu n'a pas de DLC à supprimer! - DLC DLC - Delete %1 Supprime %1 - Are you sure you want to delete %1's %2 directory? Êtes vous sûr de vouloir supprimer le répertoire %1 %2 ? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Ouvrir/Ajouter un dossier ELF - Install Packages (PKG) Installer des packages (PKG) - Boot Game Démarrer un jeu - Check for Updates Vérifier les mises à jour - About shadPS4 À propos de shadPS4 - Configure... Configurer... - Install application from a .pkg file Installer une application depuis un fichier .pkg - Recent Games Jeux récents - Exit Fermer - Exit shadPS4 Fermer shadPS4 - Exit the application. Fermer l'application. - Show Game List Afficher la liste de jeux - Game List Refresh Rafraîchir la liste de jeux - Tiny Très Petit - Small Petit - Medium Moyen - Large Grand - List View Mode liste - Grid View Mode grille - Elf Viewer Visionneuse ELF - Game Install Directory Répertoire des jeux - Download Cheats/Patches Télécharger Cheats/Patchs - Dump Game List Dumper la liste des jeux - PKG Viewer Visionneuse PKG - Search... Chercher... - File Fichier - View Affichage - Game List Icons Icônes des jeux - Game List Mode Mode d'affichage - Settings Paramètres - Utils Utilitaires - Themes Thèmes - Help Aide - Dark Sombre - Light Clair - Green Vert - Blue Bleu - Violet Violet - toolBar Bare d'outils + + Game List + Liste de jeux + + + * Unsupported Vulkan Version + * Version de Vulkan non prise en charge + + + Download Cheats For All Installed Games + Télécharger les Cheats pour tous les jeux installés + + + Download Patches For All Games + Télécharger les patchs pour tous les jeux + + + Download Complete + Téléchargement terminé + + + You have downloaded cheats for all the games you have installed. + Vous avez téléchargé des Cheats pour tous les jeux installés. + + + Patches Downloaded Successfully! + Patchs téléchargés avec succès ! + + + All Patches available for all games have been downloaded. + Tous les patchs disponibles ont été téléchargés. + + + Games: + Jeux: + + + PKG File (*.PKG) + Fichiers PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Fichiers ELF (*.bin *.elf *.oelf) + + + Game Boot + Démarrer un jeu + + + Only one file can be selected! + Un seul fichier peut être sélectionné ! + + + PKG Extraction + Extraction du PKG + + + Patch detected! + Patch détecté ! + + + PKG and Game versions match: + Les versions PKG et jeu correspondent: + + + Would you like to overwrite? + Souhaitez-vous remplacer ? + + + PKG Version %1 is older than installed version: + La version PKG %1 est plus ancienne que la version installée: + + + Game is installed: + Jeu installé: + + + Would you like to install Patch: + Souhaitez-vous installer le patch: + + + DLC Installation + Installation du DLC + + + Would you like to install DLC: %1? + Souhaitez-vous installer le DLC: %1 ? + + + DLC already installed: + DLC déjà installé: + + + Game already installed + Jeu déjà installé + + + PKG is a patch, please install the game first! + Le PKG est un patch, veuillez d'abord installer le jeu ! + + + PKG ERROR + Erreur PKG + + + Extracting PKG %1/%2 + Extraction PKG %1/%2 + + + Extraction Finished + Extraction terminée + + + Game successfully installed at %1 + Jeu installé avec succès à %1 + + + File doesn't appear to be a valid PKG file + Le fichier ne semble pas être un PKG valide + PKGViewer - Open Folder Ouvrir un dossier @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Visionneuse de trophées @@ -478,1029 +509,700 @@ SettingsDialog - Settings Paramètres - General Général - System Système - Console Language Langage de la console - Emulator Language Langage de l'émulateur - Emulator Émulateur - Enable Fullscreen Plein écran - Enable Separate Update Folder Dossier séparé pour les mises à jours - Show Splash Afficher l'image du jeu - Is PS4 Pro Mode PS4 Pro - Enable Discord Rich Presence Activer la présence Discord - Username Nom d'utilisateur - Trophy Key Trophy Key - Trophy Trophy - Logger Journalisation - Log Type Type - Log Filter Filtre - Input Entrée - Cursor Curseur - Hide Cursor Masquer le curseur - Hide Cursor Idle Timeout Délai d'inactivité pour masquer le curseur - s s - Controller Manette - Back Button Behavior Comportement du bouton retour - Graphics Graphismes - Graphics Device Carte graphique - Width Largeur - Height Hauteur - Vblank Divider Vblank - Advanced Avancé - Enable Shaders Dumping Dumper les shaders - Enable NULL GPU NULL GPU - Paths Chemins - Game Folders Dossiers de jeu - Add... Ajouter... - Remove Supprimer - Debug Débogage - Enable Debug Dumping Activer le débogage - Enable Vulkan Validation Layers Activer la couche de validation Vulkan - Enable Vulkan Synchronization Validation Activer la synchronisation de la validation Vulkan - Enable RenderDoc Debugging Activer le débogage RenderDoc - Update Mise à jour - Check for Updates at Startup Vérif. maj au démarrage - Update Channel Canal de Mise à Jour - Check for Updates Vérifier les mises à jour - GUI Settings Paramètres de l'interface - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Lire la musique du titre - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Volume - Audio Backend Audio Backend - - - MainWindow - - Game List - Liste de jeux - - - - * Unsupported Vulkan Version - * Version de Vulkan non prise en charge - - - - Download Cheats For All Installed Games - Télécharger les Cheats pour tous les jeux installés - - - - Download Patches For All Games - Télécharger les patchs pour tous les jeux - - - - Download Complete - Téléchargement terminé - - - - You have downloaded cheats for all the games you have installed. - Vous avez téléchargé des Cheats pour tous les jeux installés. - - - - Patches Downloaded Successfully! - Patchs téléchargés avec succès ! - - - - All Patches available for all games have been downloaded. - Tous les patchs disponibles ont été téléchargés. - - - - Games: - Jeux: - - - - PKG File (*.PKG) - Fichiers PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Fichiers ELF (*.bin *.elf *.oelf) - - - - Game Boot - Démarrer un jeu - - - - Only one file can be selected! - Un seul fichier peut être sélectionné ! - - - - PKG Extraction - Extraction du PKG - - - - Patch detected! - Patch détecté ! - - - - PKG and Game versions match: - Les versions PKG et jeu correspondent: - - - - Would you like to overwrite? - Souhaitez-vous remplacer ? - - - - PKG Version %1 is older than installed version: - La version PKG %1 est plus ancienne que la version installée: - - - - Game is installed: - Jeu installé: - - - - Would you like to install Patch: - Souhaitez-vous installer le patch: - - - - DLC Installation - Installation du DLC - - - - Would you like to install DLC: %1? - Souhaitez-vous installer le DLC: %1 ? - - - - DLC already installed: - DLC déjà installé: - - - - Game already installed - Jeu déjà installé - - - - PKG is a patch, please install the game first! - Le PKG est un patch, veuillez d'abord installer le jeu ! - - - - PKG ERROR - Erreur PKG - - - - Extracting PKG %1/%2 - Extraction PKG %1/%2 - - - - Extraction Finished - Extraction terminée - - - - Game successfully installed at %1 - Jeu installé avec succès à %1 - - - - File doesn't appear to be a valid PKG file - Le fichier ne semble pas être un PKG valide - - - - CheatsPatches - - - Cheats / Patches for - Cheats/Patchs pour - - - - defaultTextEdit_MSG - Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Aucune image disponible - - - - Serial: - Série: - - - - Version: - Version: - - - - Size: - Taille: - - - - Select Cheat File: - Sélectionner le fichier de Cheat: - - - - Repository: - Dépôt: - - - - Download Cheats - Télécharger les Cheats - - - - Delete File - Supprimer le fichier - - - - No files selected. - Aucun fichier sélectionné. - - - - You can delete the cheats you don't want after downloading them. - Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. - - - - Do you want to delete the selected file?\n%1 - Voulez-vous supprimer le fichier sélectionné ?\n%1 - - - - Select Patch File: - Sélectionner le fichier de patch: - - - - Download Patches - Télécharger les patchs - - - Save Enregistrer - - Cheats - Cheats - - - - Patches - Patchs - - - - Error - Erreur - - - - No patch selected. - Aucun patch sélectionné. - - - - Unable to open files.json for reading. - Impossible d'ouvrir files.json pour la lecture. - - - - No patch file found for the current serial. - Aucun fichier de patch trouvé pour la série actuelle. - - - - Unable to open the file for reading. - Impossible d'ouvrir le fichier pour la lecture. - - - - Unable to open the file for writing. - Impossible d'ouvrir le fichier pour l'écriture. - - - - Failed to parse XML: - Échec de l'analyse XML: - - - - Success - Succès - - - - Options saved successfully. - Options enregistrées avec succès. - - - - Invalid Source - Source invalide - - - - The selected source is invalid. - La source sélectionnée est invalide. - - - - File Exists - Le fichier existe - - - - File already exists. Do you want to replace it? - Le fichier existe déjà. Voulez-vous le remplacer ? - - - - Failed to save file: - Échec de l'enregistrement du fichier: - - - - Failed to download file: - Échec du téléchargement du fichier: - - - - Cheats Not Found - Cheats non trouvés - - - - CheatsNotFound_MSG - Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. - - - - Cheats Downloaded Successfully - Cheats téléchargés avec succès - - - - CheatsDownloadedSuccessfully_MSG - Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. - - - - Failed to save: - Échec de l'enregistrement: - - - - Failed to download: - Échec du téléchargement: - - - - Download Complete - Téléchargement terminé - - - - DownloadComplete_MSG - Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour le numéro de série et la version spécifiques du jeu. - - - - Failed to parse JSON data from HTML. - Échec de l'analyse des données JSON à partir du HTML. - - - - Failed to retrieve HTML page. - Échec de la récupération de la page HTML. - - - - The game is in version: %1 - Le jeu est en version: %1 - - - - The downloaded patch only works on version: %1 - Le patch téléchargé ne fonctionne que sur la version: %1 - - - - You may need to update your game. - Vous devrez peut-être mettre à jour votre jeu. - - - - Incompatibility Notice - Avis d'incompatibilité - - - - Failed to open file: - Échec de l'ouverture du fichier: - - - - XML ERROR: - Erreur XML: - - - - Failed to open files.json for writing - Échec de l'ouverture de files.json pour l'écriture - - - - Author: - Auteur: - - - - Directory does not exist: - Répertoire n'existe pas: - - - - Failed to open files.json for reading. - Échec de l'ouverture de files.json pour la lecture. - - - - Name: - Nom: - - - - Can't apply cheats before the game is started - Impossible d'appliquer les Cheats avant que le jeu ne commence. - - - - SettingsDialog - - - Save - Enregistrer - - - Apply Appliquer - Restore Defaults Restaurer les paramètres par défaut - Close Fermer - Point your mouse at an option to display its description. Pointez votre souris sur une option pour afficher sa description. - consoleLanguageGroupBox Langue de la console:\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région. - emulatorLanguageGroupBox Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur. - fullscreenCheckBox Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. - separateUpdatesCheckBox Dossier séparé pour les mises à jours:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. - showSplashCheckBox Afficher l'écran de démarrage:\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu. - ps4proCheckBox Mode PS4 Pro:\nFait en sorte que l'émulateur se comporte comme un PS4 PRO, ce qui peut activer des fonctionnalités spéciales dans les jeux qui le prennent en charge. - discordRPCCheckbox Activer Discord Rich Presence:\nAffiche l'icône de l'émulateur et les informations pertinentes sur votre profil Discord. - userName Nom d'utilisateur:\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Type de journal:\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation. - logFilter Filtre de journal:\n n'imprime que des informations spécifiques.\nExemples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux: Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants. - updaterGroupBox Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. - GUIgroupBox Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Masquer le curseur:\nChoisissez quand le curseur disparaîtra:\nJamais: Vous verrez toujours la souris.\nInactif: Définissez un temps pour qu'il disparaisse après inactivité.\nToujours: vous ne verrez jamais la souris. - idleTimeoutGroupBox Définissez un temps pour que la souris disparaisse après être inactif. - backButtonBehaviorGroupBox Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Jamais - Idle Inactif - Always Toujours - Touchpad Left Pavé Tactile Gauche - Touchpad Right Pavé Tactile Droit - Touchpad Center Centre du Pavé Tactile - None Aucun - graphicsAdapterGroupBox Adaptateur graphique:\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement. - resolutionLayout Largeur/Hauteur:\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu. - heightDivider Diviseur Vblank:\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement ! - dumpShadersCheckBox Activer l'exportation de shaders:\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu. - nullGpuCheckBox Activer le GPU nul:\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique. - gameFoldersBox Dossiers de jeux:\nLa liste des dossiers à vérifier pour les jeux installés. - addFolderButton Ajouter:\nAjouter un dossier à la liste. - removeFolderButton Supprimer:\nSupprimer un dossier de la liste. - debugDump Activer l'exportation de débogage:\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire. - vkValidationCheckBox Activer les couches de validation Vulkan:\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation. - vkSyncValidationCheckBox Activer la validation de synchronisation Vulkan:\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation. - rdocCheckBox Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. + + CheatsPatches + + Cheats / Patches for + Cheats/Patchs pour + + + defaultTextEdit_MSG + Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Aucune image disponible + + + Serial: + Série: + + + Version: + Version: + + + Size: + Taille: + + + Select Cheat File: + Sélectionner le fichier de Cheat: + + + Repository: + Dépôt: + + + Download Cheats + Télécharger les Cheats + + + Delete File + Supprimer le fichier + + + No files selected. + Aucun fichier sélectionné. + + + You can delete the cheats you don't want after downloading them. + Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. + + + Do you want to delete the selected file?\n%1 + Voulez-vous supprimer le fichier sélectionné ?\n%1 + + + Select Patch File: + Sélectionner le fichier de patch: + + + Download Patches + Télécharger les patchs + + + Save + Enregistrer + + + Cheats + Cheats + + + Patches + Patchs + + + Error + Erreur + + + No patch selected. + Aucun patch sélectionné. + + + Unable to open files.json for reading. + Impossible d'ouvrir files.json pour la lecture. + + + No patch file found for the current serial. + Aucun fichier de patch trouvé pour la série actuelle. + + + Unable to open the file for reading. + Impossible d'ouvrir le fichier pour la lecture. + + + Unable to open the file for writing. + Impossible d'ouvrir le fichier pour l'écriture. + + + Failed to parse XML: + Échec de l'analyse XML: + + + Success + Succès + + + Options saved successfully. + Options enregistrées avec succès. + + + Invalid Source + Source invalide + + + The selected source is invalid. + La source sélectionnée est invalide. + + + File Exists + Le fichier existe + + + File already exists. Do you want to replace it? + Le fichier existe déjà. Voulez-vous le remplacer ? + + + Failed to save file: + Échec de l'enregistrement du fichier: + + + Failed to download file: + Échec du téléchargement du fichier: + + + Cheats Not Found + Cheats non trouvés + + + CheatsNotFound_MSG + Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. + + + Cheats Downloaded Successfully + Cheats téléchargés avec succès + + + CheatsDownloadedSuccessfully_MSG + Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. + + + Failed to save: + Échec de l'enregistrement: + + + Failed to download: + Échec du téléchargement: + + + Download Complete + Téléchargement terminé + + + DownloadComplete_MSG + Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour le numéro de série et la version spécifiques du jeu. + + + Failed to parse JSON data from HTML. + Échec de l'analyse des données JSON à partir du HTML. + + + Failed to retrieve HTML page. + Échec de la récupération de la page HTML. + + + The game is in version: %1 + Le jeu est en version: %1 + + + The downloaded patch only works on version: %1 + Le patch téléchargé ne fonctionne que sur la version: %1 + + + You may need to update your game. + Vous devrez peut-être mettre à jour votre jeu. + + + Incompatibility Notice + Avis d'incompatibilité + + + Failed to open file: + Échec de l'ouverture du fichier: + + + XML ERROR: + Erreur XML: + + + Failed to open files.json for writing + Échec de l'ouverture de files.json pour l'écriture + + + Author: + Auteur: + + + Directory does not exist: + Répertoire n'existe pas: + + + Failed to open files.json for reading. + Échec de l'ouverture de files.json pour la lecture. + + + Name: + Nom: + + + Can't apply cheats before the game is started + Impossible d'appliquer les Cheats avant que le jeu ne commence. + + GameListFrame - Icon Icône - Name Nom - Serial Série - Compatibility Compatibility - Region Région - Firmware Firmware - Size Taille - Version Version - Path Répertoire - Play Time Temps de jeu - Never Played Jamais joué - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Mise à jour automatique - Error Erreur - Network error: Erreur réseau: - Failed to parse update information. Échec de l'analyse des informations de mise à jour. - No pre-releases found. Aucune pré-version trouvée. - Invalid release data. Données de version invalides. - No download URL found for the specified asset. Aucune URL de téléchargement trouvée pour l'élément spécifié. - Your version is already up to date! Votre version est déjà à jour ! - Update Available Mise à jour disponible - Update Channel Canal de Mise à Jour - Current Version Version actuelle - Latest Version Dernière version - Do you want to update? Voulez-vous mettre à jour ? - Show Changelog Afficher le journal des modifications - Check for Updates at Startup Vérif. maj au démarrage - Update Mettre à jour - No Non - Hide Changelog Cacher le journal des modifications - Changes Modifications - Network error occurred while trying to access the URL Une erreur réseau s'est produite en essayant d'accéder à l'URL - Download Complete Téléchargement terminé - The update has been downloaded, press OK to install. La mise à jour a été téléchargée, appuyez sur OK pour l'installer. - Failed to save the update file at Échec de la sauvegarde du fichier de mise à jour à - Starting Update... Démarrage de la mise à jour... - Failed to create the update script file Échec de la création du fichier de script de mise à jour @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index f6b853e4b..677302e01 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 A shadPS4-ről - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. - This software should not be used to play games you have not legally obtained. Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Mappa megnyitása @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Játék könyvtár betöltése, kérjük várjon :3 - Cancel Megszakítás - Loading... Betöltés.. @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Mappa kiválasztása - Select which directory you want to install to. Válassza ki a mappát a játékok telepítésére. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Mappa kiválasztása - Directory to install games Mappa a játékok telepítésére - Browse Böngészés - Error Hiba - The value for location to install games is not valid. A játékok telepítéséhez megadott útvonal nem érvényes. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Parancsikon Létrehozása - Cheats / Patches Csalások / Javítások - SFO Viewer SFO Nézegető - Trophy Viewer Trófeák Megtekintése - Open Folder... Mappa megnyitása... - Open Game Folder Játék Mappa Megnyitása - Open Save Data Folder Mentési adatok mappa megnyitása - Open Log Folder Napló mappa megnyitása - Copy info... Információ Másolása... - Copy Name Név Másolása - Copy Serial Széria Másolása - Copy All Összes Másolása - Delete... Törlés... - Delete Game Játék törlése - Delete Update Frissítések törlése - Delete DLC DLC-k törlése - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Parancsikon létrehozása - Shortcut created successfully! Parancsikon sikeresen létrehozva! - Error Hiba - Error creating shortcut! Hiba a parancsikon létrehozásával! - Install PKG PKG telepítése - Game Játék - requiresEnableSeparateUpdateFolder_MSG Ehhez a funkcióhoz szükséges a 'Külön Frissítési Mappa Engedélyezése' opció, hogy működjön. Ha használni akarja, először engedélyezze azt. - This game has no update to delete! Ehhez a játékhoz nem tartozik törlendő frissítés! - - + Update Frissítés - This game has no DLC to delete! Ehhez a játékhoz nem tartozik törlendő DLC! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Biztosan törölni akarja a %1's %2 mappát? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder ELF Mappa Megnyitása/Hozzáadása - Install Packages (PKG) PKG-k Telepítése (PKG) - Boot Game Játék Indítása - Check for Updates Frissítések keresése - About shadPS4 A shadPS4-ről - Configure... Konfigurálás... - Install application from a .pkg file Program telepítése egy .pkg fájlból - Recent Games Legutóbbi Játékok - Exit Kilépés - Exit shadPS4 Kilépés a shadPS4-ből - Exit the application. Lépjen ki a programból. - Show Game List Játék Könyvtár Megjelenítése - Game List Refresh Játék Könyvtár Újratöltése - Tiny Apró - Small Kicsi - Medium Közepes - Large Nagy - List View Lista Nézet - Grid View Rács Nézet - Elf Viewer Elf Nézegető - Game Install Directory Játék Telepítési Mappa - Download Cheats/Patches Csalások / Javítások letöltése - Dump Game List Játéklista Dumpolása - PKG Viewer PKG Nézegető - Search... Keresés... - File Fájl - View Nézet - Game List Icons Játékkönyvtár Ikonok - Game List Mode Játékkönyvtár Nézet - Settings Beállítások - Utils Segédeszközök - Themes Témák - Help Segítség - Dark Sötét - Light Világos - Green Zöld - Blue Kék - Violet Ibolya - toolBar Eszköztár + + Game List + Játéklista + + + * Unsupported Vulkan Version + * Nem támogatott Vulkan verzió + + + Download Cheats For All Installed Games + Csalások letöltése minden telepített játékhoz + + + Download Patches For All Games + Javítások letöltése minden játékhoz + + + Download Complete + Letöltés befejezve + + + You have downloaded cheats for all the games you have installed. + Minden elérhető csalás letöltődött az összes telepített játékhoz. + + + Patches Downloaded Successfully! + Javítások sikeresen letöltve! + + + All Patches available for all games have been downloaded. + Az összes játékhoz elérhető javítás letöltésre került. + + + Games: + Játékok: + + + PKG File (*.PKG) + PKG fájl (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF fájlok (*.bin *.elf *.oelf) + + + Game Boot + Játék indító + + + Only one file can be selected! + Csak egy fájl választható ki! + + + PKG Extraction + PKG kicsomagolás + + + Patch detected! + Frissítés észlelve! + + + PKG and Game versions match: + A PKG és a játék verziói egyeznek: + + + Would you like to overwrite? + Szeretné felülírni? + + + PKG Version %1 is older than installed version: + A(z) %1-es PKG verzió régebbi, mint a telepített verzió: + + + Game is installed: + A játék telepítve van: + + + Would you like to install Patch: + Szeretné telepíteni a frissítést: + + + DLC Installation + DLC Telepítés + + + Would you like to install DLC: %1? + Szeretné telepíteni a %1 DLC-t? + + + DLC already installed: + DLC már telepítve: + + + Game already installed + A játék már telepítve van + + + PKG is a patch, please install the game first! + A PKG egy javítás, először telepítsd a játékot! + + + PKG ERROR + PKG HIBA + + + Extracting PKG %1/%2 + PKG kicsomagolása %1/%2 + + + Extraction Finished + Kicsomagolás befejezve + + + Game successfully installed at %1 + A játék sikeresen telepítve itt: %1 + + + File doesn't appear to be a valid PKG file + A fájl nem tűnik érvényes PKG fájlnak + PKGViewer - Open Folder Mappa Megnyitása @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trófeák Megtekintése @@ -478,1029 +509,700 @@ SettingsDialog - Settings Beállítások - General Általános - System Rendszer - Console Language A Konzol Nyelvezete - Emulator Language Az Emulátor Nyelvezete - Emulator Emulátor - Enable Fullscreen Teljes Képernyő Engedélyezése - Enable Separate Update Folder Külön Frissítési Mappa Engedélyezése - Show Splash Indítóképernyő Mutatása - Is PS4 Pro PS4 Pro mód - Enable Discord Rich Presence A Discord Rich Presence engedélyezése - Username Felhasználónév - Trophy Key Trophy Key - Trophy Trophy - Logger Naplózó - Log Type Naplózási Típus - Log Filter Naplózási Filter - Input Bemenet - Cursor Kurzor - Hide Cursor Kurzor elrejtése - Hide Cursor Idle Timeout Kurzor inaktivitási időtúllépés - s s - Controller Kontroller - Back Button Behavior Vissza gomb Viselkedése - Graphics Grafika - Graphics Device Grafikai Eszköz - Width Szélesség - Height Magasság - Vblank Divider Vblank Elosztó - Advanced Haladó - Enable Shaders Dumping Shader Dumpolás Engedélyezése - Enable NULL GPU NULL GPU Engedélyezése - Paths Útvonalak - Game Folders Játékmappák - Add... Hozzáadás... - Remove Eltávolítás - Debug Debugolás - Enable Debug Dumping Debug Dumpolás Engedélyezése - Enable Vulkan Validation Layers Vulkan Validációs Rétegek Engedélyezése - Enable Vulkan Synchronization Validation Vulkan Szinkronizálás Validáció - Enable RenderDoc Debugging RenderDoc Debugolás Engedélyezése - Update Frissítés - Check for Updates at Startup Frissítések keresése indításkor - Update Channel Frissítési Csatorna - Check for Updates Frissítések keresése - GUI Settings GUI Beállítások - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Címzene lejátszása - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Hangerő - Audio Backend Audio Backend - - - MainWindow - - Game List - Játéklista - - - - * Unsupported Vulkan Version - * Nem támogatott Vulkan verzió - - - - Download Cheats For All Installed Games - Csalások letöltése minden telepített játékhoz - - - - Download Patches For All Games - Javítások letöltése minden játékhoz - - - - Download Complete - Letöltés befejezve - - - - You have downloaded cheats for all the games you have installed. - Minden elérhető csalás letöltődött az összes telepített játékhoz. - - - - Patches Downloaded Successfully! - Javítások sikeresen letöltve! - - - - All Patches available for all games have been downloaded. - Az összes játékhoz elérhető javítás letöltésre került. - - - - Games: - Játékok: - - - - PKG File (*.PKG) - PKG fájl (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF fájlok (*.bin *.elf *.oelf) - - - - Game Boot - Játék indító - - - - Only one file can be selected! - Csak egy fájl választható ki! - - - - PKG Extraction - PKG kicsomagolás - - - - Patch detected! - Frissítés észlelve! - - - - PKG and Game versions match: - A PKG és a játék verziói egyeznek: - - - - Would you like to overwrite? - Szeretné felülírni? - - - - PKG Version %1 is older than installed version: - A(z) %1-es PKG verzió régebbi, mint a telepített verzió: - - - - Game is installed: - A játék telepítve van: - - - - Would you like to install Patch: - Szeretné telepíteni a frissítést: - - - - DLC Installation - DLC Telepítés - - - - Would you like to install DLC: %1? - Szeretné telepíteni a %1 DLC-t? - - - - DLC already installed: - DLC már telepítve: - - - - Game already installed - A játék már telepítve van - - - - PKG is a patch, please install the game first! - A PKG egy javítás, először telepítsd a játékot! - - - - PKG ERROR - PKG HIBA - - - - Extracting PKG %1/%2 - PKG kicsomagolása %1/%2 - - - - Extraction Finished - Kicsomagolás befejezve - - - - Game successfully installed at %1 - A játék sikeresen telepítve itt: %1 - - - - File doesn't appear to be a valid PKG file - A fájl nem tűnik érvényes PKG fájlnak - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nincs elérhető kép - - - - Serial: - Sorozatszám: - - - - Version: - Verzió: - - - - Size: - Méret: - - - - Select Cheat File: - Válaszd ki a csalás fájlt: - - - - Repository: - Tároló: - - - - Download Cheats - Csalások letöltése - - - - Delete File - Fájl törlése - - - - No files selected. - Nincsenek kiválasztott fájlok. - - - - You can delete the cheats you don't want after downloading them. - Törölheted a nem kívánt csalásokat a letöltés után. - - - - Do you want to delete the selected file?\n%1 - Szeretnéd törölni a kiválasztott fájlt?\n%1 - - - - Select Patch File: - Válaszd ki a javítás fájlt: - - - - Download Patches - Javítások letöltése - - - Save Mentés - - Cheats - Csalások - - - - Patches - Javítások - - - - Error - Hiba - - - - No patch selected. - Nincs kiválasztva javítás. - - - - Unable to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. - - - - No patch file found for the current serial. - Nincs található javítási fájl a jelenlegi sorozatszámhoz. - - - - Unable to open the file for reading. - Nem sikerült megnyitni a fájlt olvasásra. - - - - Unable to open the file for writing. - Nem sikerült megnyitni a fájlt írásra. - - - - Failed to parse XML: - XML elemzési hiba: - - - - Success - Siker - - - - Options saved successfully. - A beállítások sikeresen elmentve. - - - - Invalid Source - Érvénytelen forrás - - - - The selected source is invalid. - A kiválasztott forrás érvénytelen. - - - - File Exists - A fájl létezik - - - - File already exists. Do you want to replace it? - A fájl már létezik. Szeretnéd helyettesíteni? - - - - Failed to save file: - Nem sikerült elmenteni a fájlt: - - - - Failed to download file: - Nem sikerült letölteni a fájlt: - - - - Cheats Not Found - Csalások nem találhatóak - - - - CheatsNotFound_MSG - Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban, próbálj meg egy másik tárolót vagy a játék egy másik verzióját. - - - - Cheats Downloaded Successfully - Csalások sikeresen letöltve - - - - CheatsDownloadedSuccessfully_MSG - Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. - - - - Failed to save: - Nem sikerült menteni: - - - - Failed to download: - Nem sikerült letölteni: - - - - Download Complete - Letöltés befejezve - - - - DownloadComplete_MSG - Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítások nem jelennek meg, lehet, hogy nem léteznek a játék adott sorozatszámához és verziójához. - - - - Failed to parse JSON data from HTML. - Nem sikerült az JSON adatok elemzése HTML-ből. - - - - Failed to retrieve HTML page. - Nem sikerült HTML oldal lekérése. - - - - The game is in version: %1 - A játék verziója: %1 - - - - The downloaded patch only works on version: %1 - A letöltött javításhoz a(z) %1 verzió működik - - - - You may need to update your game. - Lehet, hogy frissítened kell a játékodat. - - - - Incompatibility Notice - Inkompatibilitási értesítés - - - - Failed to open file: - Nem sikerült megnyitni a fájlt: - - - - XML ERROR: - XML HIBA: - - - - Failed to open files.json for writing - Nem sikerült megnyitni a files.json fájlt írásra - - - - Author: - Szerző: - - - - Directory does not exist: - A mappa nem létezik: - - - - Failed to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. - - - - Name: - Név: - - - - Can't apply cheats before the game is started - Nem lehet csalásokat alkalmazni, mielőtt a játék elindul. - - - - SettingsDialog - - - Save - Mentés - - - Apply Alkalmaz - Restore Defaults Alapértelmezett értékek visszaállítása - Close Bezárás - Point your mouse at an option to display its description. Helyezze az egérmutatót egy lehetőség fölé, hogy megjelenítse annak leírását. - consoleLanguageGroupBox Konzol nyelve:\nBeállítja a PS4 játék nyelvét.\nAjánlott a játék által támogatott nyelvre állítani, amely régiónként változhat. - emulatorLanguageGroupBox Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. - fullscreenCheckBox Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. - separateUpdatesCheckBox Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében. - showSplashCheckBox Indítóképernyő megjelenítése:\nMegjeleníti a játék indítóképernyőjét (különleges képet) a játék elindításakor. - ps4proCheckBox PS4 Pro:\nAz emulátort PS4 PRO-ként kezeli, ami engedélyezhet speciális funkciókat olyan játékokban, amelyek támogatják azt. - discordRPCCheckbox A Discord Rich Presence engedélyezése:\nMegjeleníti az emulator ikonját és a kapcsolódó információkat a Discord profilján. - userName Felhasználónév:\nBeállítja a PS4 fiók felhasználónevét, amelyet egyes játékok megjeleníthetnek. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Napló típusa:\nBeállítja, hogy szinkronizálja-e a naplóablak kimenetét a teljesítmény érdekében. Ennek kedvezőtlen hatásai lehetnek az emulációra. - logFilter Napló szűrő:\nCsak bizonyos információk megjelenítésére szűri a naplót.\nPéldák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket. - updaterGroupBox Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. - GUIgroupBox Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Kurzor elrejtése:\nVálassza ki, mikor tűnjön el az egérmutató:\nSoha: Az egér mindig látható.\nInaktív: Állítson be egy időt, amennyi idő mozdulatlanság után eltűnik.\nMindig: az egér mindig el lesz rejtve. - idleTimeoutGroupBox Állítson be egy időt, ami után egér inaktív állapotban eltűnik. - backButtonBehaviorGroupBox Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Soha - Idle Inaktív - Always Mindig - Touchpad Left Érintőpad Bal - Touchpad Right Érintőpad Jobb - Touchpad Center Érintőpad Közép - None Semmi - graphicsAdapterGroupBox Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az "Auto Select" lehetőséget, hogy automatikusan kiválassza azt. - resolutionLayout Szélesség/Magasság:\nBeállítja az emulátor ablakának méretét induláskor, amely a játék során átméretezhető.\nEz különbözik a játékbeli felbontástól. - heightDivider Vblank elosztó:\nAz emulátor frissítési sebessége e számot megszorozva működik. Ennek megváltoztatása kedvezőtlen hatásokat okozhat, például növelheti a játék sebességét, vagy megszakíthat kritikus játékfunkciókat, amelyek nem számítanak arra, hogy ez megváltozik! - dumpShadersCheckBox Shader dumping engedélyezése:\nMűszaki hibaelhárítás céljából a játékok shaderjeit elmenti egy mappába, ahogy renderelődnek. - nullGpuCheckBox Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya. - gameFoldersBox Játék mappák:\nA mappák listája, ahol telepített játékok vannak. - addFolderButton Hozzáadás:\nHozzon létre egy mappát a listában. - removeFolderButton Eltávolítás:\nTávolítson el egy mappát a listából. - debugDump Debug dumpolás engedélyezése:\nElmenti a futó PS4 program import- és exportszimbólumait, valamint a fájl fejlécinformációit egy könyvtárba. - vkValidationCheckBox Vulkan validációs rétegek engedélyezése:\nEngedélyezi a Vulkan renderelő állapotának validálását és információk naplózását annak belső állapotáról. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - vkSyncValidationCheckBox Vulkan szinkronizációs validáció engedélyezése:\nEngedélyezi a Vulkan renderelési feladatok időzítésének validálását. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - rdocCheckBox RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nincs elérhető kép + + + Serial: + Sorozatszám: + + + Version: + Verzió: + + + Size: + Méret: + + + Select Cheat File: + Válaszd ki a csalás fájlt: + + + Repository: + Tároló: + + + Download Cheats + Csalások letöltése + + + Delete File + Fájl törlése + + + No files selected. + Nincsenek kiválasztott fájlok. + + + You can delete the cheats you don't want after downloading them. + Törölheted a nem kívánt csalásokat a letöltés után. + + + Do you want to delete the selected file?\n%1 + Szeretnéd törölni a kiválasztott fájlt?\n%1 + + + Select Patch File: + Válaszd ki a javítás fájlt: + + + Download Patches + Javítások letöltése + + + Save + Mentés + + + Cheats + Csalások + + + Patches + Javítások + + + Error + Hiba + + + No patch selected. + Nincs kiválasztva javítás. + + + Unable to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. + + + No patch file found for the current serial. + Nincs található javítási fájl a jelenlegi sorozatszámhoz. + + + Unable to open the file for reading. + Nem sikerült megnyitni a fájlt olvasásra. + + + Unable to open the file for writing. + Nem sikerült megnyitni a fájlt írásra. + + + Failed to parse XML: + XML elemzési hiba: + + + Success + Siker + + + Options saved successfully. + A beállítások sikeresen elmentve. + + + Invalid Source + Érvénytelen forrás + + + The selected source is invalid. + A kiválasztott forrás érvénytelen. + + + File Exists + A fájl létezik + + + File already exists. Do you want to replace it? + A fájl már létezik. Szeretnéd helyettesíteni? + + + Failed to save file: + Nem sikerült elmenteni a fájlt: + + + Failed to download file: + Nem sikerült letölteni a fájlt: + + + Cheats Not Found + Csalások nem találhatóak + + + CheatsNotFound_MSG + Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban, próbálj meg egy másik tárolót vagy a játék egy másik verzióját. + + + Cheats Downloaded Successfully + Csalások sikeresen letöltve + + + CheatsDownloadedSuccessfully_MSG + Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. + + + Failed to save: + Nem sikerült menteni: + + + Failed to download: + Nem sikerült letölteni: + + + Download Complete + Letöltés befejezve + + + DownloadComplete_MSG + Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítások nem jelennek meg, lehet, hogy nem léteznek a játék adott sorozatszámához és verziójához. + + + Failed to parse JSON data from HTML. + Nem sikerült az JSON adatok elemzése HTML-ből. + + + Failed to retrieve HTML page. + Nem sikerült HTML oldal lekérése. + + + The game is in version: %1 + A játék verziója: %1 + + + The downloaded patch only works on version: %1 + A letöltött javításhoz a(z) %1 verzió működik + + + You may need to update your game. + Lehet, hogy frissítened kell a játékodat. + + + Incompatibility Notice + Inkompatibilitási értesítés + + + Failed to open file: + Nem sikerült megnyitni a fájlt: + + + XML ERROR: + XML HIBA: + + + Failed to open files.json for writing + Nem sikerült megnyitni a files.json fájlt írásra + + + Author: + Szerző: + + + Directory does not exist: + A mappa nem létezik: + + + Failed to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. + + + Name: + Név: + + + Can't apply cheats before the game is started + Nem lehet csalásokat alkalmazni, mielőtt a játék elindul. + + GameListFrame - Icon Ikon - Name Név - Serial Sorozatszám - Compatibility Compatibility - Region Régió - Firmware Firmware - Size Méret - Version Verzió - Path Útvonal - Play Time Játékidő - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automatikus frissítő - Error Hiba - Network error: Hálózati hiba: - Failed to parse update information. A frissítési információk elemzése sikertelen. - No pre-releases found. Nem található előzetes kiadás. - Invalid release data. Érvénytelen kiadási adatok. - No download URL found for the specified asset. Nincs letöltési URL a megadott eszközhöz. - Your version is already up to date! A verziód már naprakész! - Update Available Frissítés elérhető - Update Channel Frissítési Csatorna - Current Version Jelenlegi verzió - Latest Version Új verzió - Do you want to update? Szeretnéd frissíteni? - Show Changelog Változások megjelenítése - Check for Updates at Startup Frissítések keresése indításkor - Update Frissítés - No Mégse - Hide Changelog Változások elrejtése - Changes Változások - Network error occurred while trying to access the URL Hálózati hiba történt az URL elérésekor - Download Complete Letöltés kész - The update has been downloaded, press OK to install. A frissítés letöltődött, nyomja meg az OK gombot az telepítéshez. - Failed to save the update file at A frissítési fájl mentése nem sikerült a következő helyre - Starting Update... Frissítés indítása... - Failed to create the update script file A frissítési szkript fájl létrehozása nem sikerült @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index bee61083c..7a1391c0e 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches Cheat / Patch - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Buka Folder... - Open Game Folder Buka Folder Game - Open Save Data Folder Buka Folder Data Simpanan - Open Log Folder Buka Folder Log - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Periksa pembaruan - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Unduh Cheat / Patch - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Bantuan - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Daftar game + + + * Unsupported Vulkan Version + * Versi Vulkan Tidak Didukung + + + Download Cheats For All Installed Games + Unduh Cheat Untuk Semua Game Yang Terpasang + + + Download Patches For All Games + Unduh Patch Untuk Semua Game + + + Download Complete + Unduhan Selesai + + + You have downloaded cheats for all the games you have installed. + Anda telah mengunduh cheat untuk semua game yang terpasang. + + + Patches Downloaded Successfully! + Patch Berhasil Diunduh! + + + All Patches available for all games have been downloaded. + Semua Patch yang tersedia untuk semua game telah diunduh. + + + Games: + Game: + + + PKG File (*.PKG) + File PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) + + + Game Boot + Boot Game + + + Only one file can be selected! + Hanya satu file yang bisa dipilih! + + + PKG Extraction + Ekstraksi PKG + + + Patch detected! + Patch terdeteksi! + + + PKG and Game versions match: + Versi PKG dan Game cocok: + + + Would you like to overwrite? + Apakah Anda ingin menimpa? + + + PKG Version %1 is older than installed version: + Versi PKG %1 lebih lama dari versi yang terpasang: + + + Game is installed: + Game telah terpasang: + + + Would you like to install Patch: + Apakah Anda ingin menginstal patch: + + + DLC Installation + Instalasi DLC + + + Would you like to install DLC: %1? + Apakah Anda ingin menginstal DLC: %1? + + + DLC already installed: + DLC sudah terpasang: + + + Game already installed + Game sudah terpasang + + + PKG is a patch, please install the game first! + PKG adalah patch, harap pasang game terlebih dahulu! + + + PKG ERROR + KESALAHAN PKG + + + Extracting PKG %1/%2 + Mengekstrak PKG %1/%2 + + + Extraction Finished + Ekstraksi Selesai + + + Game successfully installed at %1 + Game berhasil dipasang di %1 + + + File doesn't appear to be a valid PKG file + File tampaknya bukan file PKG yang valid + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Aktifkan Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Masukan - Cursor Kursor - Hide Cursor Sembunyikan kursor - Hide Cursor Idle Timeout Batas waktu sembunyikan kursor tidak aktif - s s - Controller Pengontrol - Back Button Behavior Perilaku tombol kembali - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Jalur - Game Folders Folder Permainan - Add... Tambah... - Remove Hapus - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Pembaruan - Check for Updates at Startup Periksa pembaruan saat mulai - Update Channel Saluran Pembaruan - Check for Updates Periksa pembaruan - GUI Settings Pengaturan GUI - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Putar musik judul - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Volume - Audio Backend Audio Backend - - - MainWindow - - Game List - Daftar game - - - - * Unsupported Vulkan Version - * Versi Vulkan Tidak Didukung - - - - Download Cheats For All Installed Games - Unduh Cheat Untuk Semua Game Yang Terpasang - - - - Download Patches For All Games - Unduh Patch Untuk Semua Game - - - - Download Complete - Unduhan Selesai - - - - You have downloaded cheats for all the games you have installed. - Anda telah mengunduh cheat untuk semua game yang terpasang. - - - - Patches Downloaded Successfully! - Patch Berhasil Diunduh! - - - - All Patches available for all games have been downloaded. - Semua Patch yang tersedia untuk semua game telah diunduh. - - - - Games: - Game: - - - - PKG File (*.PKG) - File PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) - - - - Game Boot - Boot Game - - - - Only one file can be selected! - Hanya satu file yang bisa dipilih! - - - - PKG Extraction - Ekstraksi PKG - - - - Patch detected! - Patch terdeteksi! - - - - PKG and Game versions match: - Versi PKG dan Game cocok: - - - - Would you like to overwrite? - Apakah Anda ingin menimpa? - - - - PKG Version %1 is older than installed version: - Versi PKG %1 lebih lama dari versi yang terpasang: - - - - Game is installed: - Game telah terpasang: - - - - Would you like to install Patch: - Apakah Anda ingin menginstal patch: - - - - DLC Installation - Instalasi DLC - - - - Would you like to install DLC: %1? - Apakah Anda ingin menginstal DLC: %1? - - - - DLC already installed: - DLC sudah terpasang: - - - - Game already installed - Game sudah terpasang - - - - PKG is a patch, please install the game first! - PKG adalah patch, harap pasang game terlebih dahulu! - - - - PKG ERROR - KESALAHAN PKG - - - - Extracting PKG %1/%2 - Mengekstrak PKG %1/%2 - - - - Extraction Finished - Ekstraksi Selesai - - - - Game successfully installed at %1 - Game berhasil dipasang di %1 - - - - File doesn't appear to be a valid PKG file - File tampaknya bukan file PKG yang valid - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Tidak Ada Gambar Tersedia - - - - Serial: - Serial: - - - - Version: - Versi: - - - - Size: - Ukuran: - - - - Select Cheat File: - Pilih File Cheat: - - - - Repository: - Repositori: - - - - Download Cheats - Unduh Cheat - - - - Delete File - Hapus File - - - - No files selected. - Tidak ada file yang dipilih. - - - - You can delete the cheats you don't want after downloading them. - Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. - - - - Do you want to delete the selected file?\n%1 - Apakah Anda ingin menghapus berkas yang dipilih?\n%1 - - - - Select Patch File: - Pilih File Patch: - - - - Download Patches - Unduh Patch - - - Save Simpan - - Cheats - Cheat - - - - Patches - Patch - - - - Error - Kesalahan - - - - No patch selected. - Tidak ada patch yang dipilih. - - - - Unable to open files.json for reading. - Tidak dapat membuka files.json untuk dibaca. - - - - No patch file found for the current serial. - Tidak ada file patch ditemukan untuk serial saat ini. - - - - Unable to open the file for reading. - Tidak dapat membuka file untuk dibaca. - - - - Unable to open the file for writing. - Tidak dapat membuka file untuk menulis. - - - - Failed to parse XML: - Gagal menganalisis XML: - - - - Success - Sukses - - - - Options saved successfully. - Opsi berhasil disimpan. - - - - Invalid Source - Sumber Tidak Valid - - - - The selected source is invalid. - Sumber yang dipilih tidak valid. - - - - File Exists - File Ada - - - - File already exists. Do you want to replace it? - File sudah ada. Apakah Anda ingin menggantinya? - - - - Failed to save file: - Gagal menyimpan file: - - - - Failed to download file: - Gagal mengunduh file: - - - - Cheats Not Found - Cheat Tidak Ditemukan - - - - CheatsNotFound_MSG - Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. - - - - Cheats Downloaded Successfully - Cheat Berhasil Diunduh - - - - CheatsDownloadedSuccessfully_MSG - Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. - - - - Failed to save: - Gagal menyimpan: - - - - Failed to download: - Gagal mengunduh: - - - - Download Complete - Unduhan Selesai - - - - DownloadComplete_MSG - Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. - - - - Failed to parse JSON data from HTML. - Gagal menganalisis data JSON dari HTML. - - - - Failed to retrieve HTML page. - Gagal mengambil halaman HTML. - - - - The game is in version: %1 - Permainan berada di versi: %1 - - - - The downloaded patch only works on version: %1 - Patch yang diunduh hanya berfungsi pada versi: %1 - - - - You may need to update your game. - Anda mungkin perlu memperbarui permainan Anda. - - - - Incompatibility Notice - Pemberitahuan Ketidakcocokan - - - - Failed to open file: - Gagal membuka file: - - - - XML ERROR: - KESALAHAN XML: - - - - Failed to open files.json for writing - Gagal membuka files.json untuk menulis - - - - Author: - Penulis: - - - - Directory does not exist: - Direktori tidak ada: - - - - Failed to open files.json for reading. - Gagal membuka files.json untuk dibaca. - - - - Name: - Nama: - - - - Can't apply cheats before the game is started - Tidak bisa menerapkan cheat sebelum permainan dimulai. - - - - SettingsDialog - - - Save - Simpan - - - Apply Terapkan - Restore Defaults Kembalikan Pengaturan Default - Close Tutup - Point your mouse at an option to display its description. Arahkan mouse Anda pada opsi untuk menampilkan deskripsinya. - consoleLanguageGroupBox Bahasa Konsol:\nMenetapkan bahasa yang digunakan oleh permainan PS4.\nDisarankan untuk mengatur ini ke bahasa yang didukung oleh permainan, yang dapat bervariasi berdasarkan wilayah. - emulatorLanguageGroupBox Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. - fullscreenCheckBox Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Tampilkan Layar Pembuka:\nMenampilkan layar pembuka permainan (gambar khusus) saat permainan dimulai. - ps4proCheckBox Adalah PS4 Pro:\nMembuat emulator berfungsi sebagai PS4 PRO, yang mungkin mengaktifkan fitur khusus dalam permainan yang mendukungnya. - discordRPCCheckbox Aktifkan Discord Rich Presence:\nMenampilkan ikon emulator dan informasi relevan di profil Discord Anda. - userName Nama Pengguna:\nMenetapkan nama pengguna akun PS4, yang mungkin ditampilkan oleh beberapa permainan. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Jenis Log:\nMenetapkan apakah untuk menyinkronkan output jendela log untuk kinerja. Dapat memiliki efek buruk pada emulasi. - logFilter Filter Log:\nMenyaring log untuk hanya mencetak informasi tertentu.\nContoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya. - updaterGroupBox Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. - GUIgroupBox Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Sembunyikan Kursor:\nPilih kapan kursor akan menghilang:\nTidak Pernah: Anda akan selalu melihat mouse.\nTidak Aktif: Tetapkan waktu untuk menghilang setelah tidak aktif.\nSelalu: Anda tidak akan pernah melihat mouse. - idleTimeoutGroupBox Tetapkan waktu untuk mouse menghilang setelah tidak aktif. - backButtonBehaviorGroupBox Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Tidak Pernah - Idle Diam - Always Selalu - Touchpad Left Touchpad Kiri - Touchpad Right Touchpad Kanan - Touchpad Center Pusat Touchpad - None Tidak Ada - graphicsAdapterGroupBox Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih "Auto Select" untuk menentukan secara otomatis. - resolutionLayout Lebar/Tinggi:\nMenetapkan ukuran jendela emulator saat diluncurkan, yang dapat diubah ukurannya selama permainan.\nIni berbeda dari resolusi dalam permainan. - heightDivider Pembagi Vblank:\nKecepatan bingkai di mana emulator menyegarkan dikalikan dengan angka ini. Mengubah ini dapat memiliki efek buruk, seperti meningkatkan kecepatan permainan, atau merusak fungsi kritis permainan yang tidak mengharapkan ini berubah! - dumpShadersCheckBox Aktifkan Pembuangan Shader:\nUntuk tujuan debugging teknis, menyimpan shader permainan ke folder saat mereka dirender. - nullGpuCheckBox Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis. - gameFoldersBox Folder Permainan:\nDaftar folder untuk memeriksa permainan yang diinstal. - addFolderButton Tambah:\nTambahkan folder ke daftar. - removeFolderButton Hapus:\nHapus folder dari daftar. - debugDump Aktifkan Pembuangan Debug:\nMenyimpan simbol impor dan ekspor serta informasi header file dari program PS4 yang sedang berjalan ke direktori. - vkValidationCheckBox Aktifkan Vulkan Validation Layers:\nMengaktifkan sistem yang memvalidasi status penggambaran Vulkan dan mencatat informasi tentang status internalnya. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - vkSyncValidationCheckBox Aktifkan Vulkan Synchronization Validation:\nMengaktifkan sistem yang memvalidasi waktu tugas penggambaran Vulkan. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - rdocCheckBox Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Tidak Ada Gambar Tersedia + + + Serial: + Serial: + + + Version: + Versi: + + + Size: + Ukuran: + + + Select Cheat File: + Pilih File Cheat: + + + Repository: + Repositori: + + + Download Cheats + Unduh Cheat + + + Delete File + Hapus File + + + No files selected. + Tidak ada file yang dipilih. + + + You can delete the cheats you don't want after downloading them. + Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. + + + Do you want to delete the selected file?\n%1 + Apakah Anda ingin menghapus berkas yang dipilih?\n%1 + + + Select Patch File: + Pilih File Patch: + + + Download Patches + Unduh Patch + + + Save + Simpan + + + Cheats + Cheat + + + Patches + Patch + + + Error + Kesalahan + + + No patch selected. + Tidak ada patch yang dipilih. + + + Unable to open files.json for reading. + Tidak dapat membuka files.json untuk dibaca. + + + No patch file found for the current serial. + Tidak ada file patch ditemukan untuk serial saat ini. + + + Unable to open the file for reading. + Tidak dapat membuka file untuk dibaca. + + + Unable to open the file for writing. + Tidak dapat membuka file untuk menulis. + + + Failed to parse XML: + Gagal menganalisis XML: + + + Success + Sukses + + + Options saved successfully. + Opsi berhasil disimpan. + + + Invalid Source + Sumber Tidak Valid + + + The selected source is invalid. + Sumber yang dipilih tidak valid. + + + File Exists + File Ada + + + File already exists. Do you want to replace it? + File sudah ada. Apakah Anda ingin menggantinya? + + + Failed to save file: + Gagal menyimpan file: + + + Failed to download file: + Gagal mengunduh file: + + + Cheats Not Found + Cheat Tidak Ditemukan + + + CheatsNotFound_MSG + Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. + + + Cheats Downloaded Successfully + Cheat Berhasil Diunduh + + + CheatsDownloadedSuccessfully_MSG + Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. + + + Failed to save: + Gagal menyimpan: + + + Failed to download: + Gagal mengunduh: + + + Download Complete + Unduhan Selesai + + + DownloadComplete_MSG + Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. + + + Failed to parse JSON data from HTML. + Gagal menganalisis data JSON dari HTML. + + + Failed to retrieve HTML page. + Gagal mengambil halaman HTML. + + + The game is in version: %1 + Permainan berada di versi: %1 + + + The downloaded patch only works on version: %1 + Patch yang diunduh hanya berfungsi pada versi: %1 + + + You may need to update your game. + Anda mungkin perlu memperbarui permainan Anda. + + + Incompatibility Notice + Pemberitahuan Ketidakcocokan + + + Failed to open file: + Gagal membuka file: + + + XML ERROR: + KESALAHAN XML: + + + Failed to open files.json for writing + Gagal membuka files.json untuk menulis + + + Author: + Penulis: + + + Directory does not exist: + Direktori tidak ada: + + + Failed to open files.json for reading. + Gagal membuka files.json untuk dibaca. + + + Name: + Nama: + + + Can't apply cheats before the game is started + Tidak bisa menerapkan cheat sebelum permainan dimulai. + + GameListFrame - Icon Ikon - Name Nama - Serial Serial - Compatibility Compatibility - Region Wilayah - Firmware Firmware - Size Ukuran - Version Versi - Path Jalur - Play Time Waktu Bermain - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Pembaruan Otomatis - Error Kesalahan - Network error: Kesalahan jaringan: - Failed to parse update information. Gagal memparse informasi pembaruan. - No pre-releases found. Tidak ada pra-rilis yang ditemukan. - Invalid release data. Data rilis tidak valid. - No download URL found for the specified asset. Tidak ada URL unduhan ditemukan untuk aset yang ditentukan. - Your version is already up to date! Versi Anda sudah terbaru! - Update Available Pembaruan Tersedia - Update Channel Saluran Pembaruan - Current Version Versi Saat Ini - Latest Version Versi Terbaru - Do you want to update? Apakah Anda ingin memperbarui? - Show Changelog Tampilkan Catatan Perubahan - Check for Updates at Startup Periksa pembaruan saat mulai - Update Perbarui - No Tidak - Hide Changelog Sembunyikan Catatan Perubahan - Changes Perubahan - Network error occurred while trying to access the URL Kesalahan jaringan terjadi saat mencoba mengakses URL - Download Complete Unduhan Selesai - The update has been downloaded, press OK to install. Pembaruan telah diunduh, tekan OK untuk menginstal. - Failed to save the update file at Gagal menyimpan file pembaruan di - Starting Update... Memulai Pembaruan... - Failed to create the update script file Gagal membuat file skrip pembaruan @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 9e375a45e..8bdb7a8fd 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Riguardo shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 è un emulatore sperimentale open-source per PlayStation 4. - This software should not be used to play games you have not legally obtained. Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Apri Cartella @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Caricamento lista giochi, attendere :3 - Cancel Annulla - Loading... Caricamento... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Scegli cartella - Select which directory you want to install to. Seleziona in quale cartella vuoi effettuare l'installazione. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Scegli cartella - Directory to install games Cartella di installazione dei giochi - Browse Sfoglia - Error Errore - The value for location to install games is not valid. Il valore del percorso di installazione dei giochi non è valido. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Crea scorciatoia - Cheats / Patches Trucchi / Patch - SFO Viewer Visualizzatore SFO - Trophy Viewer Visualizzatore Trofei - Open Folder... Apri Cartella... - Open Game Folder Apri Cartella del Gioco - Open Save Data Folder Apri Cartella dei Dati di Salvataggio - Open Log Folder Apri Cartella dei Log - Copy info... Copia informazioni... - Copy Name Copia Nome - Copy Serial Copia Seriale - Copy All Copia Tutto - Delete... Elimina... - Delete Game Elimina Gioco - Delete Update Elimina Aggiornamento - Delete DLC Elimina DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Creazione scorciatoia - Shortcut created successfully! Scorciatoia creata con successo! - Error Errore - Error creating shortcut! Errore nella creazione della scorciatoia! - Install PKG Installa PKG - Game Gioco - requiresEnableSeparateUpdateFolder_MSG Questa feature richiede che venga attivata l'opzione "Abilita Cartella Aggiornamenti Separata" per poter funzionare, per favore abilitala. - This game has no update to delete! Questo gioco non ha alcun aggiornamento da eliminare! - - + Update Update - This game has no DLC to delete! Questo gioco non ha alcun DLC da eliminare! - DLC DLC - Delete %1 Elimina %1 - Are you sure you want to delete %1's %2 directory? Sei sicuro di eliminale la cartella %2 di %1? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Apri/Aggiungi cartella Elf - Install Packages (PKG) Installa Pacchetti (PKG) - Boot Game Avvia Gioco - Check for Updates Controlla aggiornamenti - About shadPS4 Riguardo a shadPS4 - Configure... Configura... - Install application from a .pkg file Installa applicazione da un file .pkg - Recent Games Giochi Recenti - Exit Uscita - Exit shadPS4 Esci da shadPS4 - Exit the application. Esci dall'applicazione. - Show Game List Mostra Lista Giochi - Game List Refresh Aggiorna Lista Giochi - Tiny Minuscolo - Small Piccolo - Medium Medio - Large Grande - List View Visualizzazione Lista - Grid View Visualizzazione Griglia - Elf Viewer Visualizzatore Elf - Game Install Directory Cartella Installazione Giochi - Download Cheats/Patches Scarica Trucchi/Patch - Dump Game List Scarica Lista Giochi - PKG Viewer Visualizzatore PKG - Search... Cerca... - File File - View Visualizza - Game List Icons Icone Lista Giochi - Game List Mode Modalità Lista Giochi - Settings Impostazioni - Utils Utilità - Themes Temi - Help Aiuto - Dark Scuro - Light Chiaro - Green Verde - Blue Blu - Violet Viola - toolBar Barra strumenti + + Game List + Elenco giochi + + + * Unsupported Vulkan Version + * Versione Vulkan non supportata + + + Download Cheats For All Installed Games + Scarica Trucchi per tutti i giochi installati + + + Download Patches For All Games + Scarica Patch per tutti i giochi + + + Download Complete + Download completato + + + You have downloaded cheats for all the games you have installed. + Hai scaricato trucchi per tutti i giochi installati. + + + Patches Downloaded Successfully! + Patch scaricate con successo! + + + All Patches available for all games have been downloaded. + Tutte le patch disponibili per tutti i giochi sono state scaricate. + + + Games: + Giochi: + + + PKG File (*.PKG) + File PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) + + + Game Boot + Avvia Gioco + + + Only one file can be selected! + Si può selezionare solo un file! + + + PKG Extraction + Estrazione file PKG + + + Patch detected! + Patch rilevata! + + + PKG and Game versions match: + Le versioni di PKG e del Gioco corrispondono: + + + Would you like to overwrite? + Vuoi sovrascrivere? + + + PKG Version %1 is older than installed version: + La versione PKG %1 è più vecchia rispetto alla versione installata: + + + Game is installed: + Gioco installato: + + + Would you like to install Patch: + Vuoi installare la patch: + + + DLC Installation + Installazione DLC + + + Would you like to install DLC: %1? + Vuoi installare il DLC: %1? + + + DLC already installed: + DLC già installato: + + + Game already installed + Gioco già installato + + + PKG is a patch, please install the game first! + Questo file PKG contiene una patch. Per favore, installa prima il gioco! + + + PKG ERROR + ERRORE PKG + + + Extracting PKG %1/%2 + Estrazione file PKG %1/%2 + + + Extraction Finished + Estrazione Completata + + + Game successfully installed at %1 + Gioco installato correttamente in %1 + + + File doesn't appear to be a valid PKG file + Il file sembra non essere un file PKG valido + PKGViewer - Open Folder Apri Cartella @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Visualizzatore Trofei @@ -478,1029 +509,700 @@ SettingsDialog - Settings Impostazioni - General Generale - System Sistema - Console Language Lingua della console - Emulator Language Lingua dell'emulatore - Emulator Emulatore - Enable Fullscreen Abilita Schermo Intero - Enable Separate Update Folder Abilita Cartella Aggiornamenti Separata - Show Splash Mostra Schermata Iniziale - Is PS4 Pro Modalità Ps4 Pro - Enable Discord Rich Presence Abilita Discord Rich Presence - Username Nome Utente - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Tipo di Log - Log Filter Filtro Log - Input Input - Cursor Cursore - Hide Cursor Nascondi Cursore - Hide Cursor Idle Timeout Timeout inattività per nascondere il cursore - s s - Controller Controller - Back Button Behavior Comportamento del pulsante Indietro - Graphics Grafica - Graphics Device Scheda Grafica - Width Larghezza - Height Altezza - Vblank Divider Divisore Vblank - Advanced Avanzate - Enable Shaders Dumping Abilita Dump Shader - Enable NULL GPU Abilita NULL GPU - Paths Percorsi - Game Folders Cartelle di gioco - Add... - Aggiungi... + Aggiungi... - Remove Rimuovi - Debug Debug - Enable Abilita Debug Dumping - Enable Vulkan Validation Layers Abilita Vulkan Validation Layers - Enable Vulkan Synchronization Validation Abilita Vulkan Synchronization Validation - Enable RenderDoc Debugging Abilita RenderDoc Debugging - Update Aggiornamento - Check for Updates at Startup Verifica aggiornamenti all’avvio - Update Channel Canale di Aggiornamento - Check for Updates Controlla aggiornamenti - GUI Settings Impostazioni GUI - Disable Trophy Pop-ups Disabilita Notifica Trofei - Play title music Riproduci musica del titolo - Update Compatibility Database On Startup Aggiorna Database Compatibilità all'Avvio - Game Compatibility Compatibilità Gioco - Display Compatibility Data Mostra Dati Compatibilità - Update Compatibility Database Aggiorna Database Compatibilità - Volume Volume - Audio Backend Audio Backend - - - MainWindow - - Game List - Elenco giochi - - - - * Unsupported Vulkan Version - * Versione Vulkan non supportata - - - - Download Cheats For All Installed Games - Scarica Trucchi per tutti i giochi installati - - - - Download Patches For All Games - Scarica Patch per tutti i giochi - - - - Download Complete - Download completato - - - - You have downloaded cheats for all the games you have installed. - Hai scaricato trucchi per tutti i giochi installati. - - - - Patches Downloaded Successfully! - Patch scaricate con successo! - - - - All Patches available for all games have been downloaded. - Tutte le patch disponibili per tutti i giochi sono state scaricate. - - - - Games: - Giochi: - - - - PKG File (*.PKG) - File PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) - - - - Game Boot - Avvia Gioco - - - - Only one file can be selected! - Si può selezionare solo un file! - - - - PKG Extraction - Estrazione file PKG - - - - Patch detected! - Patch rilevata! - - - - PKG and Game versions match: - Le versioni di PKG e del Gioco corrispondono: - - - - Would you like to overwrite? - Vuoi sovrascrivere? - - - - PKG Version %1 is older than installed version: - La versione PKG %1 è più vecchia rispetto alla versione installata: - - - - Game is installed: - Gioco installato: - - - - Would you like to install Patch: - Vuoi installare la patch: - - - - DLC Installation - Installazione DLC - - - - Would you like to install DLC: %1? - Vuoi installare il DLC: %1? - - - - DLC already installed: - DLC già installato: - - - - Game already installed - Gioco già installato - - - - PKG is a patch, please install the game first! - Questo file PKG contiene una patch. Per favore, installa prima il gioco! - - - - PKG ERROR - ERRORE PKG - - - - Extracting PKG %1/%2 - Estrazione file PKG %1/%2 - - - - Extraction Finished - Estrazione Completata - - - - Game successfully installed at %1 - Gioco installato correttamente in %1 - - - - File doesn't appear to be a valid PKG file - Il file sembra non essere un file PKG valido - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nessuna immagine disponibile - - - - Serial: - Seriale: - - - - Version: - Versione: - - - - Size: - Dimensione: - - - - Select Cheat File: - Seleziona File Trucchi: - - - - Repository: - Archivio: - - - - Download Cheats - Scarica trucchi - - - - Delete File - Cancella File - - - - No files selected. - Nessun file selezionato. - - - - You can delete the cheats you don't want after downloading them. - Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. - - - - Do you want to delete the selected file?\n%1 - Vuoi cancellare il file selezionato?\n%1 - - - - Select Patch File: - Seleziona File Patch: - - - - Download Patches - Scarica Patch - - - Save Salva - - Cheats - Trucchi - - - - Patches - Patch - - - - Error - Errore - - - - No patch selected. - Nessuna patch selezionata. - - - - Unable to open files.json for reading. - Impossibile aprire il file .json per la lettura. - - - - No patch file found for the current serial. - Nessun file patch trovato per il seriale selezionato. - - - - Unable to open the file for reading. - Impossibile aprire il file per la lettura. - - - - Unable to open the file for writing. - Impossibile aprire il file per la scrittura. - - - - Failed to parse XML: - Analisi XML fallita: - - - - Success - Successo - - - - Options saved successfully. - Opzioni salvate con successo. - - - - Invalid Source - Fonte non valida - - - - The selected source is invalid. - La fonte selezionata non è valida. - - - - File Exists - Il file è presente - - - - File already exists. Do you want to replace it? - Il file è già presente. Vuoi sostituirlo? - - - - Failed to save file: - Salvataggio file fallito: - - - - Failed to download file: - Scaricamento file fallito: - - - - Cheats Not Found - Trucchi non trovati - - - - CheatsNotFound_MSG - Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. - - - - Cheats Downloaded Successfully - Trucchi scaricati con successo! - - - - CheatsDownloadedSuccessfully_MSG - Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. - - - - Failed to save: - Salvataggio fallito: - - - - Failed to download: - Impossibile scaricare: - - - - Download Complete - Scaricamento completo - - - - DownloadComplete_MSG - Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. - - - - Failed to parse JSON data from HTML. - Impossibile analizzare i dati JSON dall'HTML. - - - - Failed to retrieve HTML page. - Impossibile recuperare la pagina HTML. - - - - The game is in version: %1 - Il gioco è nella versione: %1 - - - - The downloaded patch only works on version: %1 - La patch scaricata funziona solo sulla versione: %1 - - - - You may need to update your game. - Potresti aver bisogno di aggiornare il tuo gioco. - - - - Incompatibility Notice - Avviso di incompatibilità - - - - Failed to open file: - Impossibile aprire file: - - - - XML ERROR: - ERRORE XML: - - - - Failed to open files.json for writing - Impossibile aprire i file .json per la scrittura - - - - Author: - Autore: - - - - Directory does not exist: - La cartella non esiste: - - - - Failed to open files.json for reading. - Impossibile aprire i file .json per la lettura. - - - - Name: - Nome: - - - - Can't apply cheats before the game is started - Non è possibile applicare i trucchi prima dell'inizio del gioco. - - - - SettingsDialog - - - Save - Salva - - - Apply Applica - Restore Defaults Ripristina Impostazioni Predefinite - Close Chiudi - Point your mouse at an option to display its description. Sposta il mouse su un'opzione per visualizzarne la descrizione. - consoleLanguageGroupBox Lingua della Console:\nImposta la lingua utilizzata dal gioco PS4.\nÈ consigliabile impostare questa su una lingua supportata dal gioco, che può variare a seconda della regione. - emulatorLanguageGroupBox Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. - fullscreenCheckBox Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. - separateUpdatesCheckBox Abilita Cartella Aggiornamenti Separata:\nAbilita l'installazione degli aggiornamenti in una cartella separata per una più facile gestione. - showSplashCheckBox Mostra Schermata di Avvio:\nMostra la schermata di avvio del gioco (un'immagine speciale) mentre il gioco si sta avviando. - ps4proCheckBox È PS4 Pro:\nFa sì che l'emulatore si comporti come una PS4 PRO, il che può abilitare funzionalità speciali in giochi che la supportano. - discordRPCCheckbox Abilita Discord Rich Presence:\nMostra l'icona dell'emulatore e informazioni pertinenti sul tuo profilo Discord. - userName Nome Utente:\nImposta il nome utente dell'account PS4, che potrebbe essere visualizzato da alcuni giochi. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Tipo di Log:\nImposta se sincronizzare l'output della finestra di log per le prestazioni. Potrebbe avere effetti avversi sull'emulazione. - logFilter Filtro Log:\nFiltra il log per stampare solo informazioni specifiche.\nEsempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo. - updaterGroupBox Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. - GUIgroupBox Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Nascondi cursore:\nScegli quando il cursore scomparirà:\nMai: Vedrai sempre il mouse.\nInattivo: Imposta un tempo per farlo scomparire dopo essere stato inattivo.\nSempre: non vedrai mai il mouse. - - idleTimeoutGroupBox + idleTimeoutGroupBox Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo. - backButtonBehaviorGroupBox Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4. - enableCompatibilityCheckBox Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita "Aggiorna Compatiblità all'Avvio" per ottenere informazioni aggiornate. - checkCompatibilityOnStartupCheckBox Aggiorna Compatibilità all'Avvio:\nAggiorna automaticamente il database della compatibilità quando si avvia shadps4. - updateCompatibilityButton Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. - Never Mai - Idle Inattivo - Always Sempre - Touchpad Left Touchpad Sinistra - Touchpad Right Touchpad Destra - Touchpad Center Centro del Touchpad - None Nessuno - graphicsAdapterGroupBox Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. - resolutionLayout Larghezza/Altezza:\nImposta la dimensione della finestra dell'emulatore all'avvio, che può essere ridimensionata durante il gioco.\nQuesto è diverso dalla risoluzione in gioco. - heightDivider Divisore Vblank:\nIl frame rate con cui l'emulatore si aggiorna viene moltiplicato per questo numero. Cambiare questo potrebbe avere effetti avversi, come aumentare la velocità del gioco o rompere funzionalità critiche del gioco che non si aspettano questa modifica! - dumpShadersCheckBox Abilita Pompaggio Shader:\nPer scopi di debug tecnico, salva gli shader dei giochi in una cartella mentre vengono resi. - nullGpuCheckBox Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica. - gameFoldersBox Cartelle di Gioco:\nL'elenco delle cartelle da controllare per i giochi installati. - addFolderButton Aggiungi:\nAggiungi una cartella all'elenco. - removeFolderButton Rimuovi:\nRimuovi una cartella dall'elenco. - debugDump Abilita Pompaggio di Debug:\nSalva i simboli di importazione ed esportazione e le informazioni sull'intestazione del file del programma PS4 attualmente in esecuzione in una directory. - vkValidationCheckBox Abilita Strati di Validazione Vulkan:\nAbilita un sistema che convalida lo stato del renderer Vulkan e registra informazioni sul suo stato interno. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - vkSyncValidationCheckBox Abilita Validazione della Sincronizzazione Vulkan:\nAbilita un sistema che convalida il timing delle attività di rendering Vulkan. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - rdocCheckBox Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nessuna immagine disponibile + + + Serial: + Seriale: + + + Version: + Versione: + + + Size: + Dimensione: + + + Select Cheat File: + Seleziona File Trucchi: + + + Repository: + Archivio: + + + Download Cheats + Scarica trucchi + + + Delete File + Cancella File + + + No files selected. + Nessun file selezionato. + + + You can delete the cheats you don't want after downloading them. + Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. + + + Do you want to delete the selected file?\n%1 + Vuoi cancellare il file selezionato?\n%1 + + + Select Patch File: + Seleziona File Patch: + + + Download Patches + Scarica Patch + + + Save + Salva + + + Cheats + Trucchi + + + Patches + Patch + + + Error + Errore + + + No patch selected. + Nessuna patch selezionata. + + + Unable to open files.json for reading. + Impossibile aprire il file .json per la lettura. + + + No patch file found for the current serial. + Nessun file patch trovato per il seriale selezionato. + + + Unable to open the file for reading. + Impossibile aprire il file per la lettura. + + + Unable to open the file for writing. + Impossibile aprire il file per la scrittura. + + + Failed to parse XML: + Analisi XML fallita: + + + Success + Successo + + + Options saved successfully. + Opzioni salvate con successo. + + + Invalid Source + Fonte non valida + + + The selected source is invalid. + La fonte selezionata non è valida. + + + File Exists + Il file è presente + + + File already exists. Do you want to replace it? + Il file è già presente. Vuoi sostituirlo? + + + Failed to save file: + Salvataggio file fallito: + + + Failed to download file: + Scaricamento file fallito: + + + Cheats Not Found + Trucchi non trovati + + + CheatsNotFound_MSG + Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. + + + Cheats Downloaded Successfully + Trucchi scaricati con successo! + + + CheatsDownloadedSuccessfully_MSG + Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. + + + Failed to save: + Salvataggio fallito: + + + Failed to download: + Impossibile scaricare: + + + Download Complete + Scaricamento completo + + + DownloadComplete_MSG + Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. + + + Failed to parse JSON data from HTML. + Impossibile analizzare i dati JSON dall'HTML. + + + Failed to retrieve HTML page. + Impossibile recuperare la pagina HTML. + + + The game is in version: %1 + Il gioco è nella versione: %1 + + + The downloaded patch only works on version: %1 + La patch scaricata funziona solo sulla versione: %1 + + + You may need to update your game. + Potresti aver bisogno di aggiornare il tuo gioco. + + + Incompatibility Notice + Avviso di incompatibilità + + + Failed to open file: + Impossibile aprire file: + + + XML ERROR: + ERRORE XML: + + + Failed to open files.json for writing + Impossibile aprire i file .json per la scrittura + + + Author: + Autore: + + + Directory does not exist: + La cartella non esiste: + + + Failed to open files.json for reading. + Impossibile aprire i file .json per la lettura. + + + Name: + Nome: + + + Can't apply cheats before the game is started + Non è possibile applicare i trucchi prima dell'inizio del gioco. + + GameListFrame - Icon Icona - Name Nome - Serial Seriale - Compatibility Compatibilità - Region Regione - Firmware Firmware - Size Dimensione - Version Versione - Path Percorso - Play Time Tempo di Gioco - Never Played Mai Giocato - h h - m m - s s - Compatibility is untested Nessuna informazione sulla compatibilità - Game does not initialize properly / crashes the emulator Il gioco non si avvia in modo corretto / forza chiusura dell'emulatore - Game boots, but only displays a blank screen Il gioco si avvia, ma mostra solo una schermata nera - Game displays an image but does not go past the menu Il gioco mostra immagini ma non va oltre il menu - Game has game-breaking glitches or unplayable performance Il gioco ha problemi gravi di emulazione oppure framerate troppo basso - Game can be completed with playable performance and no major glitches Il gioco può essere completato con buone prestazioni e senza problemi gravi @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Aggiornamento automatico - Error Errore - Network error: Errore di rete: - Failed to parse update information. Impossibile analizzare le informazioni di aggiornamento. - No pre-releases found. Nessuna anteprima trovata. - Invalid release data. Dati della release non validi. - No download URL found for the specified asset. Nessun URL di download trovato per l'asset specificato. - Your version is already up to date! La tua versione è già aggiornata! - Update Available Aggiornamento disponibile - Update Channel Canale di Aggiornamento - Current Version Versione attuale - Latest Version Ultima versione - Do you want to update? Vuoi aggiornare? - Show Changelog Mostra il Changelog - Check for Updates at Startup Controlla aggiornamenti all’avvio - Update Aggiorna - No No - Hide Changelog Nascondi il Changelog - Changes Modifiche - Network error occurred while trying to access the URL Si è verificato un errore di rete durante il tentativo di accesso all'URL - Download Complete Download completato - The update has been downloaded, press OK to install. L'aggiornamento è stato scaricato, premi OK per installare. - Failed to save the update file at Impossibile salvare il file di aggiornamento in - Starting Update... Inizio aggiornamento... - Failed to create the update script file Impossibile creare il file di script di aggiornamento @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 409900ade..f34747549 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 shadPS4について - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 - This software should not be used to play games you have not legally obtained. このソフトウェアは、合法的に入手していないゲームをプレイするために使用するものではありません。 @@ -29,7 +25,6 @@ ElfViewer - Open Folder フォルダを開く @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 ゲームリストを読み込み中です。お待ちください :3 - Cancel キャンセル - Loading... 読み込み中... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - ディレクトリを選択 - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - ディレクトリを選択 - Directory to install games ゲームをインストールするディレクトリ - Browse 参照 - Error エラー - The value for location to install games is not valid. ゲームをインストールする場所が無効です。 @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut ショートカットを作成 - Cheats / Patches チート / パッチ - SFO Viewer SFOビューワー - Trophy Viewer トロフィービューワー - Open Folder... フォルダを開く... - Open Game Folder ゲームフォルダを開く - Open Save Data Folder セーブデータフォルダを開く - Open Log Folder ログフォルダを開く - Copy info... 情報をコピー... - Copy Name 名前をコピー - Copy Serial シリアルをコピー - Copy All すべてコピー - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation ショートカットの作成 - Shortcut created successfully! ショートカットが正常に作成されました! - Error エラー - Error creating shortcut! ショートカットの作成に失敗しました! - Install PKG PKGをインストール - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Elfフォルダを開く/追加する - Install Packages (PKG) パッケージをインストール (PKG) - Boot Game ゲームを起動 - Check for Updates 更新を確認する - About shadPS4 shadPS4について - Configure... 設定... - Install application from a .pkg file .pkgファイルからアプリケーションをインストールする - Recent Games 最近のゲーム - Exit 終了 - Exit shadPS4 shadPS4を終了 - Exit the application. アプリケーションを終了します。 - Show Game List ゲームリストを表示 - Game List Refresh ゲームリストの更新 - Tiny 極小 - Small - Medium - Large - List View リストビュー - Grid View グリッドビュー - Elf Viewer Elfビュワー - Game Install Directory ゲームインストールディレクトリ - Download Cheats/Patches チート / パッチをダウンロード - Dump Game List ゲームリストをダンプ - PKG Viewer PKGビューアー - Search... 検索... - File ファイル - View 表示 - Game List Icons ゲームリストアイコン - Game List Mode ゲームリストモード - Settings 設定 - Utils ユーティリティ - Themes テーマ - Help ヘルプ - Dark ダーク - Light ライト - Green グリーン - Blue ブルー - Violet バイオレット - toolBar ツールバー + + Game List + ゲームリスト + + + * Unsupported Vulkan Version + * サポートされていないVulkanバージョン + + + Download Cheats For All Installed Games + すべてのインストール済みゲームのチートをダウンロード + + + Download Patches For All Games + すべてのゲームのパッチをダウンロード + + + Download Complete + ダウンロード完了 + + + You have downloaded cheats for all the games you have installed. + インストールしたすべてのゲームのチートをダウンロードしました。 + + + Patches Downloaded Successfully! + パッチが正常にダウンロードされました! + + + All Patches available for all games have been downloaded. + すべてのゲームに利用可能なパッチがダウンロードされました。 + + + Games: + ゲーム: + + + PKG File (*.PKG) + PKGファイル (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELFファイル (*.bin *.elf *.oelf) + + + Game Boot + ゲームブート + + + Only one file can be selected! + 1つのファイルしか選択できません! + + + PKG Extraction + PKG抽出 + + + Patch detected! + パッチが検出されました! + + + PKG and Game versions match: + PKGとゲームのバージョンが一致しています: + + + Would you like to overwrite? + 上書きしてもよろしいですか? + + + PKG Version %1 is older than installed version: + PKGバージョン %1 はインストールされているバージョンよりも古いです: + + + Game is installed: + ゲームはインストール済みです: + + + Would you like to install Patch: + パッチをインストールしてもよろしいですか: + + + DLC Installation + DLCのインストール + + + Would you like to install DLC: %1? + DLCをインストールしてもよろしいですか: %1? + + + DLC already installed: + DLCはすでにインストールされています: + + + Game already installed + ゲームはすでにインストールされています + + + PKG is a patch, please install the game first! + PKGはパッチです。ゲームを先にインストールしてください! + + + PKG ERROR + PKGエラー + + + Extracting PKG %1/%2 + PKGを抽出中 %1/%2 + + + Extraction Finished + 抽出完了 + + + Game successfully installed at %1 + ゲームが %1 に正常にインストールされました + + + File doesn't appear to be a valid PKG file + ファイルが有効なPKGファイルでないようです + PKGViewer - Open Folder フォルダーを開く @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer トロフィービューアー @@ -478,1029 +509,700 @@ SettingsDialog - Settings 設定 - General 一般 - System システム - Console Language コンソール言語 - Emulator Language エミュレーター言語 - Emulator エミュレーター - Enable Fullscreen フルスクリーンを有効にする - Enable Separate Update Folder Enable Separate Update Folder - Show Splash スプラッシュを表示する - Is PS4 Pro PS4 Proモード - Enable Discord Rich Presence Discord Rich Presenceを有効にする - Username ユーザー名 - Trophy Key Trophy Key - Trophy Trophy - Logger ロガー - Log Type ログタイプ - Log Filter ログフィルター - Input 入力 - Cursor カーソル - Hide Cursor カーソルを隠す - Hide Cursor Idle Timeout カーソル非アクティブタイムアウト - s s - Controller コントローラー - Back Button Behavior 戻るボタンの動作 - Graphics グラフィックス - Graphics Device グラフィックスデバイス - Width - Height 高さ - Vblank Divider Vblankディバイダー - Advanced 高度な設定 - Enable Shaders Dumping シェーダーのダンプを有効にする - Enable NULL GPU NULL GPUを有効にする - Paths パス - Game Folders ゲームフォルダ - Add... 追加... - Remove 削除 - Debug デバッグ - Enable Debug Dumping デバッグダンプを有効にする - Enable Vulkan Validation Layers Vulkan検証レイヤーを有効にする - Enable Vulkan Synchronization Validation Vulkan同期検証を有効にする - Enable RenderDoc Debugging RenderDocデバッグを有効にする - Update 更新 - Check for Updates at Startup 起動時に更新確認 - Update Channel アップデートチャネル - Check for Updates 更新を確認 - GUI Settings GUI設定 - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music タイトル音楽を再生する - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume 音量 - Audio Backend Audio Backend - - - MainWindow - - Game List - ゲームリスト - - - - * Unsupported Vulkan Version - * サポートされていないVulkanバージョン - - - - Download Cheats For All Installed Games - すべてのインストール済みゲームのチートをダウンロード - - - - Download Patches For All Games - すべてのゲームのパッチをダウンロード - - - - Download Complete - ダウンロード完了 - - - - You have downloaded cheats for all the games you have installed. - インストールしたすべてのゲームのチートをダウンロードしました。 - - - - Patches Downloaded Successfully! - パッチが正常にダウンロードされました! - - - - All Patches available for all games have been downloaded. - すべてのゲームに利用可能なパッチがダウンロードされました。 - - - - Games: - ゲーム: - - - - PKG File (*.PKG) - PKGファイル (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELFファイル (*.bin *.elf *.oelf) - - - - Game Boot - ゲームブート - - - - Only one file can be selected! - 1つのファイルしか選択できません! - - - - PKG Extraction - PKG抽出 - - - - Patch detected! - パッチが検出されました! - - - - PKG and Game versions match: - PKGとゲームのバージョンが一致しています: - - - - Would you like to overwrite? - 上書きしてもよろしいですか? - - - - PKG Version %1 is older than installed version: - PKGバージョン %1 はインストールされているバージョンよりも古いです: - - - - Game is installed: - ゲームはインストール済みです: - - - - Would you like to install Patch: - パッチをインストールしてもよろしいですか: - - - - DLC Installation - DLCのインストール - - - - Would you like to install DLC: %1? - DLCをインストールしてもよろしいですか: %1? - - - - DLC already installed: - DLCはすでにインストールされています: - - - - Game already installed - ゲームはすでにインストールされています - - - - PKG is a patch, please install the game first! - PKGはパッチです。ゲームを先にインストールしてください! - - - - PKG ERROR - PKGエラー - - - - Extracting PKG %1/%2 - PKGを抽出中 %1/%2 - - - - Extraction Finished - 抽出完了 - - - - Game successfully installed at %1 - ゲームが %1 に正常にインストールされました - - - - File doesn't appear to be a valid PKG file - ファイルが有効なPKGファイルでないようです - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチを開発していないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 - - - - No Image Available - 画像は利用できません - - - - Serial: - シリアル: - - - - Version: - バージョン: - - - - Size: - サイズ: - - - - Select Cheat File: - チートファイルを選択: - - - - Repository: - リポジトリ: - - - - Download Cheats - チートをダウンロード - - - - Delete File - ファイルを削除 - - - - No files selected. - ファイルが選択されていません。 - - - - You can delete the cheats you don't want after downloading them. - ダウンロード後に不要なチートを削除できます。 - - - - Do you want to delete the selected file?\n%1 - 選択したファイルを削除しますか?\n%1 - - - - Select Patch File: - パッチファイルを選択: - - - - Download Patches - パッチをダウンロード - - - Save 保存 - - Cheats - チート - - - - Patches - パッチ - - - - Error - エラー - - - - No patch selected. - パッチが選択されていません。 - - - - Unable to open files.json for reading. - files.jsonを読み込み用に開けません。 - - - - No patch file found for the current serial. - 現在のシリアルに対するパッチファイルが見つかりません。 - - - - Unable to open the file for reading. - ファイルを読み込み用に開けません。 - - - - Unable to open the file for writing. - ファイルを記録用に開けません。 - - - - Failed to parse XML: - XMLの解析に失敗しました: - - - - Success - 成功 - - - - Options saved successfully. - オプションが正常に保存されました。 - - - - Invalid Source - 無効なソース - - - - The selected source is invalid. - 選択したソースは無効です。 - - - - File Exists - ファイルが存在します - - - - File already exists. Do you want to replace it? - ファイルはすでに存在します。置き換えますか? - - - - Failed to save file: - ファイルの保存に失敗しました: - - - - Failed to download file: - ファイルのダウンロードに失敗しました: - - - - Cheats Not Found - チートが見つかりません - - - - CheatsNotFound_MSG - このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 - - - - Cheats Downloaded Successfully - チートが正常にダウンロードされました - - - - CheatsDownloadedSuccessfully_MSG - このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 - - - - Failed to save: - 保存に失敗しました: - - - - Failed to download: - ダウンロードに失敗しました: - - - - Download Complete - ダウンロード完了 - - - - DownloadComplete_MSG - パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。 - - - - Failed to parse JSON data from HTML. - HTMLからJSONデータの解析に失敗しました。 - - - - Failed to retrieve HTML page. - HTMLページの取得に失敗しました。 - - - - The game is in version: %1 - ゲームのバージョン: %1 - - - - The downloaded patch only works on version: %1 - ダウンロードしたパッチはバージョン: %1 のみ機能します - - - - You may need to update your game. - ゲームを更新する必要があるかもしれません。 - - - - Incompatibility Notice - 互換性のない通知 - - - - Failed to open file: - ファイルを開くのに失敗しました: - - - - XML ERROR: - XMLエラー: - - - - Failed to open files.json for writing - files.jsonを記録用に開けません - - - - Author: - 著者: - - - - Directory does not exist: - ディレクトリが存在しません: - - - - Failed to open files.json for reading. - files.jsonを読み込み用に開けません。 - - - - Name: - 名前: - - - - Can't apply cheats before the game is started - ゲームが開始される前にチートを適用することはできません。 - - - - SettingsDialog - - - Save - 保存 - - - Apply 適用 - Restore Defaults デフォルトに戻す - Close 閉じる - Point your mouse at an option to display its description. オプションにマウスをポイントすると、その説明が表示されます。 - consoleLanguageGroupBox コンソール言語:\nPS4ゲームが使用する言語を設定します。\nこれはゲームがサポートする言語に設定することをお勧めしますが、地域によって異なる場合があります。 - emulatorLanguageGroupBox エミュレーター言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 - fullscreenCheckBox 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox スプラッシュスクリーンを表示:\nゲーム起動中にゲームのスプラッシュスクリーン(特別な画像)を表示します。 - ps4proCheckBox PS4 Proです:\nエミュレーターがPS4 PROとして動作するようにし、これをサポートするゲームで特別な機能を有効にする場合があります。 - discordRPCCheckbox Discord Rich Presenceを有効にする:\nエミュレーターのアイコンと関連情報をDiscordプロフィールに表示します。 - userName ユーザー名:\nPS4のアカウントユーザー名を設定します。これは、一部のゲームで表示される場合があります。 - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox ログタイプ:\nパフォーマンスのためにログウィンドウの出力を同期させるかどうかを設定します。エミュレーションに悪影響を及ぼす可能性があります。 - logFilter ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" レベル: Trace, Debug, Info, Warning, Error, Critical - この順序で、特定のレベルはリスト内のすべての前のレベルをサイレンスし、その後のすべてのレベルをログに記録します。 - updaterGroupBox 更新:\nRelease: 非常に古いかもしれないが、より信頼性が高くテスト済みの公式バージョンを毎月リリースします。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 - GUIgroupBox タイトルミュージックを再生:\nゲームがそれをサポートしている場合、GUIでゲームを選択したときに特別な音楽を再生することを有効にします。 - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n決して: いつでもマウスが見えます。\nアイドル: アイダルの後に消えるまでの時間を設定します。\n常に: マウスは決して見えません。 - idleTimeoutGroupBox アイドル後にマウスが消えるまでの時間を設定します。 - backButtonBehaviorGroupBox 戻るボタンの動作:\nコントローラーの戻るボタンを、PS4のタッチパッドの指定された位置をタッチするように設定します。 - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never 決して - Idle アイドル - Always 常に - Touchpad Left タッチパッド左 - Touchpad Right タッチパッド右 - Touchpad Center タッチパッド中央 - None なし - graphicsAdapterGroupBox グラフィックデバイス:\n複数のGPUシステムで、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 - resolutionLayout 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中にサイズ変更できます。\nこれはゲーム内の解像度とは異なります。 - heightDivider Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! - dumpShadersCheckBox シェーダーダンプを有効にする:\n技術的なデバッグの目的で、レンダリング中にゲームのシェーダーをフォルダーに保存します。 - nullGpuCheckBox Null GPUを有効にする:\n技術的なデバッグの目的で、グラフィックスカードがないかのようにゲームのレンダリングを無効にします。 - gameFoldersBox ゲームフォルダ:\nインストールされたゲームを確認するためのフォルダのリスト。 - addFolderButton 追加:\nリストにフォルダを追加します。 - removeFolderButton 削除:\nリストからフォルダを削除します。 - debugDump デバッグダンプを有効にする:\n現在実行中のPS4プログラムのインポートおよびエクスポートシンボルとファイルヘッダー情報をディレクトリに保存します。 - vkValidationCheckBox Vulkanバリデーションレイヤーを有効にする:\nVulkanのレンダリングステータスを検証し、内部状態に関する情報をログに記録するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - vkSyncValidationCheckBox Vulkan同期バリデーションを有効にする:\nVulkanのレンダリングタスクのタイミングを検証するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - rdocCheckBox RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチを開発していないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 + + + No Image Available + 画像は利用できません + + + Serial: + シリアル: + + + Version: + バージョン: + + + Size: + サイズ: + + + Select Cheat File: + チートファイルを選択: + + + Repository: + リポジトリ: + + + Download Cheats + チートをダウンロード + + + Delete File + ファイルを削除 + + + No files selected. + ファイルが選択されていません。 + + + You can delete the cheats you don't want after downloading them. + ダウンロード後に不要なチートを削除できます。 + + + Do you want to delete the selected file?\n%1 + 選択したファイルを削除しますか?\n%1 + + + Select Patch File: + パッチファイルを選択: + + + Download Patches + パッチをダウンロード + + + Save + 保存 + + + Cheats + チート + + + Patches + パッチ + + + Error + エラー + + + No patch selected. + パッチが選択されていません。 + + + Unable to open files.json for reading. + files.jsonを読み込み用に開けません。 + + + No patch file found for the current serial. + 現在のシリアルに対するパッチファイルが見つかりません。 + + + Unable to open the file for reading. + ファイルを読み込み用に開けません。 + + + Unable to open the file for writing. + ファイルを記録用に開けません。 + + + Failed to parse XML: + XMLの解析に失敗しました: + + + Success + 成功 + + + Options saved successfully. + オプションが正常に保存されました。 + + + Invalid Source + 無効なソース + + + The selected source is invalid. + 選択したソースは無効です。 + + + File Exists + ファイルが存在します + + + File already exists. Do you want to replace it? + ファイルはすでに存在します。置き換えますか? + + + Failed to save file: + ファイルの保存に失敗しました: + + + Failed to download file: + ファイルのダウンロードに失敗しました: + + + Cheats Not Found + チートが見つかりません + + + CheatsNotFound_MSG + このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 + + + Cheats Downloaded Successfully + チートが正常にダウンロードされました + + + CheatsDownloadedSuccessfully_MSG + このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 + + + Failed to save: + 保存に失敗しました: + + + Failed to download: + ダウンロードに失敗しました: + + + Download Complete + ダウンロード完了 + + + DownloadComplete_MSG + パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。 + + + Failed to parse JSON data from HTML. + HTMLからJSONデータの解析に失敗しました。 + + + Failed to retrieve HTML page. + HTMLページの取得に失敗しました。 + + + The game is in version: %1 + ゲームのバージョン: %1 + + + The downloaded patch only works on version: %1 + ダウンロードしたパッチはバージョン: %1 のみ機能します + + + You may need to update your game. + ゲームを更新する必要があるかもしれません。 + + + Incompatibility Notice + 互換性のない通知 + + + Failed to open file: + ファイルを開くのに失敗しました: + + + XML ERROR: + XMLエラー: + + + Failed to open files.json for writing + files.jsonを記録用に開けません + + + Author: + 著者: + + + Directory does not exist: + ディレクトリが存在しません: + + + Failed to open files.json for reading. + files.jsonを読み込み用に開けません。 + + + Name: + 名前: + + + Can't apply cheats before the game is started + ゲームが開始される前にチートを適用することはできません。 + + GameListFrame - Icon アイコン - Name 名前 - Serial シリアル - Compatibility Compatibility - Region 地域 - Firmware ファームウェア - Size サイズ - Version バージョン - Path パス - Play Time プレイ時間 - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater 自動アップデーター - Error エラー - Network error: ネットワークエラー: - Failed to parse update information. アップデート情報の解析に失敗しました。 - No pre-releases found. プレリリースは見つかりませんでした。 - Invalid release data. リリースデータが無効です。 - No download URL found for the specified asset. 指定されたアセットのダウンロードURLが見つかりませんでした。 - Your version is already up to date! あなたのバージョンはすでに最新です! - Update Available アップデートがあります - Update Channel アップデートチャネル - Current Version 現在のバージョン - Latest Version 最新バージョン - Do you want to update? アップデートしますか? - Show Changelog 変更ログを表示 - Check for Updates at Startup 起動時に更新確認 - Update アップデート - No いいえ - Hide Changelog 変更ログを隠す - Changes 変更点 - Network error occurred while trying to access the URL URLにアクセス中にネットワークエラーが発生しました - Download Complete ダウンロード完了 - The update has been downloaded, press OK to install. アップデートがダウンロードされました。インストールするにはOKを押してください。 - Failed to save the update file at 更新ファイルの保存に失敗しました - Starting Update... アップデートを開始しています... - Failed to create the update script file アップデートスクリプトファイルの作成に失敗しました @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index ab6404a7e..410f9bead 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches 치트 / 패치 - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Open Folder... - Open Game Folder Open Game Folder - Open Save Data Folder Open Save Data Folder - Open Log Folder Open Log Folder - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Check for Updates - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches 치트 / 패치 다운로드 - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Help - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Game List + + + * Unsupported Vulkan Version + * Unsupported Vulkan Version + + + Download Cheats For All Installed Games + Download Cheats For All Installed Games + + + Download Patches For All Games + Download Patches For All Games + + + Download Complete + Download Complete + + + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + + + Patches Downloaded Successfully! + Patches Downloaded Successfully! + + + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + + + Games: + Games: + + + PKG File (*.PKG) + PKG File (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + + + Game Boot + Game Boot + + + Only one file can be selected! + Only one file can be selected! + + + PKG Extraction + PKG Extraction + + + Patch detected! + Patch detected! + + + PKG and Game versions match: + PKG and Game versions match: + + + Would you like to overwrite? + Would you like to overwrite? + + + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + + + Game is installed: + Game is installed: + + + Would you like to install Patch: + Would you like to install Patch: + + + DLC Installation + DLC Installation + + + Would you like to install DLC: %1? + Would you like to install DLC: %1? + + + DLC already installed: + DLC already installed: + + + Game already installed + Game already installed + + + PKG is a patch, please install the game first! + PKG is a patch, please install the game first! + + + PKG ERROR + PKG ERROR + + + Extracting PKG %1/%2 + Extracting PKG %1/%2 + + + Extraction Finished + Extraction Finished + + + Game successfully installed at %1 + Game successfully installed at %1 + + + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Enable Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Input - Cursor Cursor - Hide Cursor Hide Cursor - Hide Cursor Idle Timeout Hide Cursor Idle Timeout - s s - Controller Controller - Back Button Behavior Back Button Behavior - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Paths - Game Folders Game Folders - Add... Add... - Remove Remove - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Update - Check for Updates at Startup Check for Updates at Startup - Update Channel Update Channel - Check for Updates Check for Updates - GUI Settings GUI Settings - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Play title music - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume 음량 - Audio Backend Audio Backend - - - MainWindow - - Game List - Game List - - - - * Unsupported Vulkan Version - * Unsupported Vulkan Version - - - - Download Cheats For All Installed Games - Download Cheats For All Installed Games - - - - Download Patches For All Games - Download Patches For All Games - - - - Download Complete - Download Complete - - - - You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. - - - - Patches Downloaded Successfully! - Patches Downloaded Successfully! - - - - All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. - - - - Games: - Games: - - - - PKG File (*.PKG) - PKG File (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) - - - - Game Boot - Game Boot - - - - Only one file can be selected! - Only one file can be selected! - - - - PKG Extraction - PKG Extraction - - - - Patch detected! - Patch detected! - - - - PKG and Game versions match: - PKG and Game versions match: - - - - Would you like to overwrite? - Would you like to overwrite? - - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - - Game is installed: - Game is installed: - - - - Would you like to install Patch: - Would you like to install Patch: - - - - DLC Installation - DLC Installation - - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - - DLC already installed: - DLC already installed: - - - - Game already installed - Game already installed - - - - PKG is a patch, please install the game first! - PKG is a patch, please install the game first! - - - - PKG ERROR - PKG ERROR - - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - - Extraction Finished - Extraction Finished - - - - Game successfully installed at %1 - Game successfully installed at %1 - - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - No Image Available - - - - Serial: - Serial: - - - - Version: - Version: - - - - Size: - Size: - - - - Select Cheat File: - Select Cheat File: - - - - Repository: - Repository: - - - - Download Cheats - Download Cheats - - - - Delete File - Delete File - - - - No files selected. - No files selected. - - - - You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. - - - - Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 - - - - Select Patch File: - Select Patch File: - - - - Download Patches - Download Patches - - - Save Save - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Error - - - - No patch selected. - No patch selected. - - - - Unable to open files.json for reading. - Unable to open files.json for reading. - - - - No patch file found for the current serial. - No patch file found for the current serial. - - - - Unable to open the file for reading. - Unable to open the file for reading. - - - - Unable to open the file for writing. - Unable to open the file for writing. - - - - Failed to parse XML: - Failed to parse XML: - - - - Success - Success - - - - Options saved successfully. - Options saved successfully. - - - - Invalid Source - Invalid Source - - - - The selected source is invalid. - The selected source is invalid. - - - - File Exists - File Exists - - - - File already exists. Do you want to replace it? - File already exists. Do you want to replace it? - - - - Failed to save file: - Failed to save file: - - - - Failed to download file: - Failed to download file: - - - - Cheats Not Found - Cheats Not Found - - - - CheatsNotFound_MSG - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - - - - Cheats Downloaded Successfully - Cheats Downloaded Successfully - - - - CheatsDownloadedSuccessfully_MSG - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - - - - Failed to save: - Failed to save: - - - - Failed to download: - Failed to download: - - - - Download Complete - Download Complete - - - - DownloadComplete_MSG - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - - - - Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. - - - - Failed to retrieve HTML page. - Failed to retrieve HTML page. - - - - The game is in version: %1 - The game is in version: %1 - - - - The downloaded patch only works on version: %1 - The downloaded patch only works on version: %1 - - - - You may need to update your game. - You may need to update your game. - - - - Incompatibility Notice - Incompatibility Notice - - - - Failed to open file: - Failed to open file: - - - - XML ERROR: - XML ERROR: - - - - Failed to open files.json for writing - Failed to open files.json for writing - - - - Author: - Author: - - - - Directory does not exist: - Directory does not exist: - - - - Failed to open files.json for reading. - Failed to open files.json for reading. - - - - Name: - Name: - - - - Can't apply cheats before the game is started - Can't apply cheats before the game is started. - - - - SettingsDialog - - - Save - Save - - - Apply Apply - Restore Defaults Restore Defaults - Close Close - Point your mouse at an option to display its description. Point your mouse at an option to display its description. - consoleLanguageGroupBox Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - emulatorLanguageGroupBox Emulator Language:\nSets the language of the emulator's user interface. - fullscreenCheckBox Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - ps4proCheckBox Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it. - discordRPCCheckbox Discord Rich Presence 활성화:\nDiscord 프로필에 에뮬레이터 아이콘과 관련 정보를 표시합니다. - userName Username:\nSets the PS4's account username, which may be displayed by some games. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - logFilter Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - updaterGroupBox Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - GUIgroupBox Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - idleTimeoutGroupBox Set a time for the mouse to disappear after being after being idle. - backButtonBehaviorGroupBox Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Never - Idle Idle - Always Always - Touchpad Left Touchpad Left - Touchpad Right Touchpad Right - Touchpad Center Touchpad Center - None None - graphicsAdapterGroupBox Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - resolutionLayout Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - heightDivider Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - dumpShadersCheckBox Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - nullGpuCheckBox Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - gameFoldersBox Game Folders:\nThe list of folders to check for installed games. - addFolderButton Add:\nAdd a folder to the list. - removeFolderButton Remove:\nRemove a folder from the list. - debugDump Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - vkValidationCheckBox Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - vkSyncValidationCheckBox Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - rdocCheckBox Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + No Image Available + + + Serial: + Serial: + + + Version: + Version: + + + Size: + Size: + + + Select Cheat File: + Select Cheat File: + + + Repository: + Repository: + + + Download Cheats + Download Cheats + + + Delete File + Delete File + + + No files selected. + No files selected. + + + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + + + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + + + Select Patch File: + Select Patch File: + + + Download Patches + Download Patches + + + Save + Save + + + Cheats + Cheats + + + Patches + Patches + + + Error + Error + + + No patch selected. + No patch selected. + + + Unable to open files.json for reading. + Unable to open files.json for reading. + + + No patch file found for the current serial. + No patch file found for the current serial. + + + Unable to open the file for reading. + Unable to open the file for reading. + + + Unable to open the file for writing. + Unable to open the file for writing. + + + Failed to parse XML: + Failed to parse XML: + + + Success + Success + + + Options saved successfully. + Options saved successfully. + + + Invalid Source + Invalid Source + + + The selected source is invalid. + The selected source is invalid. + + + File Exists + File Exists + + + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + + + Failed to save file: + Failed to save file: + + + Failed to download file: + Failed to download file: + + + Cheats Not Found + Cheats Not Found + + + CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + + + Cheats Downloaded Successfully + Cheats Downloaded Successfully + + + CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + + + Failed to save: + Failed to save: + + + Failed to download: + Failed to download: + + + Download Complete + Download Complete + + + DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + + + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + + + Failed to retrieve HTML page. + Failed to retrieve HTML page. + + + The game is in version: %1 + The game is in version: %1 + + + The downloaded patch only works on version: %1 + The downloaded patch only works on version: %1 + + + You may need to update your game. + You may need to update your game. + + + Incompatibility Notice + Incompatibility Notice + + + Failed to open file: + Failed to open file: + + + XML ERROR: + XML ERROR: + + + Failed to open files.json for writing + Failed to open files.json for writing + + + Author: + Author: + + + Directory does not exist: + Directory does not exist: + + + Failed to open files.json for reading. + Failed to open files.json for reading. + + + Name: + Name: + + + Can't apply cheats before the game is started + Can't apply cheats before the game is started. + + GameListFrame - Icon Icon - Name Name - Serial Serial - Compatibility Compatibility - Region Region - Firmware Firmware - Size Size - Version Version - Path Path - Play Time Play Time - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Auto Updater - Error Error - Network error: Network error: - Failed to parse update information. Failed to parse update information. - No pre-releases found. No pre-releases found. - Invalid release data. Invalid release data. - No download URL found for the specified asset. No download URL found for the specified asset. - Your version is already up to date! Your version is already up to date! - Update Available Update Available - Update Channel Update Channel - Current Version Current Version - Latest Version Latest Version - Do you want to update? Do you want to update? - Show Changelog Show Changelog - Check for Updates at Startup Check for Updates at Startup - Update Update - No No - Hide Changelog Hide Changelog - Changes Changes - Network error occurred while trying to access the URL Network error occurred while trying to access the URL - Download Complete Download Complete - The update has been downloaded, press OK to install. The update has been downloaded, press OK to install. - Failed to save the update file at Failed to save the update file at - Starting Update... Starting Update... - Failed to create the update script file Failed to create the update script file @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 0b9c5b542..770a9b09e 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Apgaulės / Pleistrai Cheats / Patches - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Atidaryti Katalogą... - Open Game Folder Atidaryti Žaidimo Katalogą - Open Save Data Folder Atidaryti Išsaugotų Duomenų Katalogą - Open Log Folder Atidaryti Žurnalų Katalogą - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Patikrinti atnaujinimus - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Atsisiųsti Apgaules / Pleistrus - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Pagalba - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Žaidimų sąrašas + + + * Unsupported Vulkan Version + * Nepalaikoma Vulkan versija + + + Download Cheats For All Installed Games + Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams + + + Download Patches For All Games + Atsisiųsti pataisas visiems žaidimams + + + Download Complete + Atsisiuntimas baigtas + + + You have downloaded cheats for all the games you have installed. + Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. + + + Patches Downloaded Successfully! + Pataisos sėkmingai atsisiųstos! + + + All Patches available for all games have been downloaded. + Visos pataisos visiems žaidimams buvo atsisiųstos. + + + Games: + Žaidimai: + + + PKG File (*.PKG) + PKG failas (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF failai (*.bin *.elf *.oelf) + + + Game Boot + Žaidimo paleidimas + + + Only one file can be selected! + Galite pasirinkti tik vieną failą! + + + PKG Extraction + PKG ištraukimas + + + Patch detected! + Rasta atnaujinimą! + + + PKG and Game versions match: + PKG ir žaidimo versijos sutampa: + + + Would you like to overwrite? + Ar norite perrašyti? + + + PKG Version %1 is older than installed version: + PKG versija %1 yra senesnė nei įdiegta versija: + + + Game is installed: + Žaidimas įdiegtas: + + + Would you like to install Patch: + Ar norite įdiegti atnaujinimą: + + + DLC Installation + DLC diegimas + + + Would you like to install DLC: %1? + Ar norite įdiegti DLC: %1? + + + DLC already installed: + DLC jau įdiegtas: + + + Game already installed + Žaidimas jau įdiegtas + + + PKG is a patch, please install the game first! + PKG yra pataisa, prašome pirmiausia įdiegti žaidimą! + + + PKG ERROR + PKG KLAIDA + + + Extracting PKG %1/%2 + Ekstrakcinis PKG %1/%2 + + + Extraction Finished + Ekstrakcija baigta + + + Game successfully installed at %1 + Žaidimas sėkmingai įdiegtas %1 + + + File doesn't appear to be a valid PKG file + Failas atrodo, kad nėra galiojantis PKG failas + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Įjungti Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Įvestis - Cursor Žymeklis - Hide Cursor Slėpti žymeklį - Hide Cursor Idle Timeout Žymeklio paslėpimo neveikimo laikas - s s - Controller Valdiklis - Back Button Behavior Atgal mygtuko elgsena - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Keliai - Game Folders Žaidimų aplankai - Add... Pridėti... - Remove Pašalinti - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Atnaujinimas - Check for Updates at Startup Tikrinti naujinimus paleidus - Update Channel Atnaujinimo Kanalas - Check for Updates Patikrinkite atnaujinimus - GUI Settings GUI Nustatymai - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Groti antraštės muziką - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Garsumas - Audio Backend Audio Backend - - - MainWindow - - Game List - Žaidimų sąrašas - - - - * Unsupported Vulkan Version - * Nepalaikoma Vulkan versija - - - - Download Cheats For All Installed Games - Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams - - - - Download Patches For All Games - Atsisiųsti pataisas visiems žaidimams - - - - Download Complete - Atsisiuntimas baigtas - - - - You have downloaded cheats for all the games you have installed. - Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. - - - - Patches Downloaded Successfully! - Pataisos sėkmingai atsisiųstos! - - - - All Patches available for all games have been downloaded. - Visos pataisos visiems žaidimams buvo atsisiųstos. - - - - Games: - Žaidimai: - - - - PKG File (*.PKG) - PKG failas (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF failai (*.bin *.elf *.oelf) - - - - Game Boot - Žaidimo paleidimas - - - - Only one file can be selected! - Galite pasirinkti tik vieną failą! - - - - PKG Extraction - PKG ištraukimas - - - - Patch detected! - Rasta atnaujinimą! - - - - PKG and Game versions match: - PKG ir žaidimo versijos sutampa: - - - - Would you like to overwrite? - Ar norite perrašyti? - - - - PKG Version %1 is older than installed version: - PKG versija %1 yra senesnė nei įdiegta versija: - - - - Game is installed: - Žaidimas įdiegtas: - - - - Would you like to install Patch: - Ar norite įdiegti atnaujinimą: - - - - DLC Installation - DLC diegimas - - - - Would you like to install DLC: %1? - Ar norite įdiegti DLC: %1? - - - - DLC already installed: - DLC jau įdiegtas: - - - - Game already installed - Žaidimas jau įdiegtas - - - - PKG is a patch, please install the game first! - PKG yra pataisa, prašome pirmiausia įdiegti žaidimą! - - - - PKG ERROR - PKG KLAIDA - - - - Extracting PKG %1/%2 - Ekstrakcinis PKG %1/%2 - - - - Extraction Finished - Ekstrakcija baigta - - - - Game successfully installed at %1 - Žaidimas sėkmingai įdiegtas %1 - - - - File doesn't appear to be a valid PKG file - Failas atrodo, kad nėra galiojantis PKG failas - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nuotrauka neprieinama - - - - Serial: - Seriinis numeris: - - - - Version: - Versija: - - - - Size: - Dydis: - - - - Select Cheat File: - Pasirinkite sukčiavimo failą: - - - - Repository: - Saugykla: - - - - Download Cheats - Atsisiųsti sukčiavimus - - - - Delete File - Pašalinti failą - - - - No files selected. - Failai nepasirinkti. - - - - You can delete the cheats you don't want after downloading them. - Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. - - - - Do you want to delete the selected file?\n%1 - Ar norite ištrinti pasirinktą failą?\n%1 - - - - Select Patch File: - Pasirinkite pataisos failą: - - - - Download Patches - Atsisiųsti pataisas - - - Save Įrašyti - - Cheats - Sukčiavimai - - - - Patches - Pataisos - - - - Error - Klaida - - - - No patch selected. - Nieko nepataisyta. - - - - Unable to open files.json for reading. - Neįmanoma atidaryti files.json skaitymui. - - - - No patch file found for the current serial. - Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. - - - - Unable to open the file for reading. - Neįmanoma atidaryti failo skaitymui. - - - - Unable to open the file for writing. - Neįmanoma atidaryti failo rašymui. - - - - Failed to parse XML: - Nepavyko išanalizuoti XML: - - - - Success - Sėkmė - - - - Options saved successfully. - Nustatymai sėkmingai išsaugoti. - - - - Invalid Source - Netinkamas šaltinis - - - - The selected source is invalid. - Pasirinktas šaltinis yra netinkamas. - - - - File Exists - Failas egzistuoja - - - - File already exists. Do you want to replace it? - Failas jau egzistuoja. Ar norite jį pakeisti? - - - - Failed to save file: - Nepavyko išsaugoti failo: - - - - Failed to download file: - Nepavyko atsisiųsti failo: - - - - Cheats Not Found - Sukčiavimai nerasti - - - - CheatsNotFound_MSG - Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. - - - - Cheats Downloaded Successfully - Sukčiavimai sėkmingai atsisiųsti - - - - CheatsDownloadedSuccessfully_MSG - Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. - - - - Failed to save: - Nepavyko išsaugoti: - - - - Failed to download: - Nepavyko atsisiųsti: - - - - Download Complete - Atsisiuntimas baigtas - - - - DownloadComplete_MSG - Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. - - - - Failed to parse JSON data from HTML. - Nepavyko išanalizuoti JSON duomenų iš HTML. - - - - Failed to retrieve HTML page. - Nepavyko gauti HTML puslapio. - - - - The game is in version: %1 - Žaidimas yra versijoje: %1 - - - - The downloaded patch only works on version: %1 - Parsisiųstas pataisas veikia tik versijoje: %1 - - - - You may need to update your game. - Gali tekti atnaujinti savo žaidimą. - - - - Incompatibility Notice - Suderinamumo pranešimas - - - - Failed to open file: - Nepavyko atidaryti failo: - - - - XML ERROR: - XML KLAIDA: - - - - Failed to open files.json for writing - Nepavyko atidaryti files.json rašymui - - - - Author: - Autorius: - - - - Directory does not exist: - Katalogas neegzistuoja: - - - - Failed to open files.json for reading. - Nepavyko atidaryti files.json skaitymui. - - - - Name: - Pavadinimas: - - - - Can't apply cheats before the game is started - Negalima taikyti sukčiavimų prieš pradedant žaidimą. - - - - SettingsDialog - - - Save - Įrašyti - - - Apply Taikyti - Restore Defaults Atkurti numatytuosius nustatymus - Close Uždaryti - Point your mouse at an option to display its description. Žymeklį nukreipkite ant pasirinkimo, kad pamatytumėte jo aprašymą. - consoleLanguageGroupBox Konsole kalba:\nNustato kalbą, kurią naudoja PS4 žaidimai.\nRekomenduojama nustatyti kalbą, kurią palaiko žaidimas, priklausomai nuo regiono. - emulatorLanguageGroupBox Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. - fullscreenCheckBox Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Rodyti paleidimo ekraną:\nPaleidimo metu rodo žaidimo paleidimo ekraną (ypatingą vaizdą). - ps4proCheckBox Ar PS4 Pro:\nPadaro, kad emuliatorius veiktų kaip PS4 PRO, kas gali įjungti specialias funkcijas žaidimuose, kurie tai palaiko. - discordRPCCheckbox Įjungti Discord Rich Presence:\nRodo emuliatoriaus ikoną ir susijusią informaciją jūsų Discord profilyje. - userName Vartotojo vardas:\nNustato PS4 paskyros vartotojo vardą, kuris gali būti rodomas kai kuriuose žaidimuose. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Žurnalo tipas:\nNustato, ar sinchronizuoti žurnalo lango išvestį našumui. Tai gali turėti neigiamą poveikį emuliacijai. - logFilter Žurnalo filtras:\nFiltruojamas žurnalas, kad būtų spausdinama tik konkreti informacija.\nPavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius. - updaterGroupBox Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. - GUIgroupBox Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Slėpti žymeklį:\nPasirinkite, kada žymeklis dings:\nNiekuomet: Visada matysite pelę.\nNeaktyvus: Nustatykite laiką, po kurio ji dings, kai bus neaktyvi.\nVisada: niekada nematysite pelės. - idleTimeoutGroupBox Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi. - backButtonBehaviorGroupBox Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Niekada - Idle Neaktyvus - Always Visada - Touchpad Left Jutiklinis Paviršius Kairėje - Touchpad Right Jutiklinis Paviršius Dešinėje - Touchpad Center Jutiklinis Paviršius Centre - None Nieko - graphicsAdapterGroupBox Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos iš išskleidžiamojo sąrašo,\n arba pasirinkite "Auto Select", kad jis būtų nustatytas automatiškai. - resolutionLayout Plotis/Aukštis:\nNustato emuliatoriaus lango dydį paleidimo metu, kurį galima keisti žaidimo metu.\nTai skiriasi nuo žaidimo rezoliucijos. - heightDivider Vblank daliklis:\nKadrų dažnis, kuriuo emuliatorius atnaujinamas, dauginamas iš šio skaičiaus. Pakeitus tai gali turėti neigiamą poveikį, pvz., padidinti žaidimo greitį arba sukelti kritinių žaidimo funkcijų sugadinimą, kurios to nesitikėjo! - dumpShadersCheckBox Įjungti šešėlių išmetimą:\nTechninio derinimo tikslais saugo žaidimo šešėlius į aplanką juos renderuojant. - nullGpuCheckBox Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės. - gameFoldersBox Žaidimų aplankai:\nAplankų sąrašas, kurį reikia patikrinti, ar yra įdiegtų žaidimų. - addFolderButton Pridėti:\nPridėti aplanką į sąrašą. - removeFolderButton Pašalinti:\nPašalinti aplanką iš sąrašo. - debugDump Įjungti derinimo išmetimą:\nIšsaugo importo ir eksporto simbolius bei failo antraštės informaciją apie šiuo metu vykdomą PS4 programą į katalogą. - vkValidationCheckBox Įjungti Vulkan patvirtinimo sluoksnius:\nĮjungia sistemą, kuri patvirtina Vulkan renderio būseną ir registruoja informaciją apie jo vidinę būseną. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - vkSyncValidationCheckBox Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - rdocCheckBox Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nuotrauka neprieinama + + + Serial: + Seriinis numeris: + + + Version: + Versija: + + + Size: + Dydis: + + + Select Cheat File: + Pasirinkite sukčiavimo failą: + + + Repository: + Saugykla: + + + Download Cheats + Atsisiųsti sukčiavimus + + + Delete File + Pašalinti failą + + + No files selected. + Failai nepasirinkti. + + + You can delete the cheats you don't want after downloading them. + Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. + + + Do you want to delete the selected file?\n%1 + Ar norite ištrinti pasirinktą failą?\n%1 + + + Select Patch File: + Pasirinkite pataisos failą: + + + Download Patches + Atsisiųsti pataisas + + + Save + Įrašyti + + + Cheats + Sukčiavimai + + + Patches + Pataisos + + + Error + Klaida + + + No patch selected. + Nieko nepataisyta. + + + Unable to open files.json for reading. + Neįmanoma atidaryti files.json skaitymui. + + + No patch file found for the current serial. + Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. + + + Unable to open the file for reading. + Neįmanoma atidaryti failo skaitymui. + + + Unable to open the file for writing. + Neįmanoma atidaryti failo rašymui. + + + Failed to parse XML: + Nepavyko išanalizuoti XML: + + + Success + Sėkmė + + + Options saved successfully. + Nustatymai sėkmingai išsaugoti. + + + Invalid Source + Netinkamas šaltinis + + + The selected source is invalid. + Pasirinktas šaltinis yra netinkamas. + + + File Exists + Failas egzistuoja + + + File already exists. Do you want to replace it? + Failas jau egzistuoja. Ar norite jį pakeisti? + + + Failed to save file: + Nepavyko išsaugoti failo: + + + Failed to download file: + Nepavyko atsisiųsti failo: + + + Cheats Not Found + Sukčiavimai nerasti + + + CheatsNotFound_MSG + Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. + + + Cheats Downloaded Successfully + Sukčiavimai sėkmingai atsisiųsti + + + CheatsDownloadedSuccessfully_MSG + Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. + + + Failed to save: + Nepavyko išsaugoti: + + + Failed to download: + Nepavyko atsisiųsti: + + + Download Complete + Atsisiuntimas baigtas + + + DownloadComplete_MSG + Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. + + + Failed to parse JSON data from HTML. + Nepavyko išanalizuoti JSON duomenų iš HTML. + + + Failed to retrieve HTML page. + Nepavyko gauti HTML puslapio. + + + The game is in version: %1 + Žaidimas yra versijoje: %1 + + + The downloaded patch only works on version: %1 + Parsisiųstas pataisas veikia tik versijoje: %1 + + + You may need to update your game. + Gali tekti atnaujinti savo žaidimą. + + + Incompatibility Notice + Suderinamumo pranešimas + + + Failed to open file: + Nepavyko atidaryti failo: + + + XML ERROR: + XML KLAIDA: + + + Failed to open files.json for writing + Nepavyko atidaryti files.json rašymui + + + Author: + Autorius: + + + Directory does not exist: + Katalogas neegzistuoja: + + + Failed to open files.json for reading. + Nepavyko atidaryti files.json skaitymui. + + + Name: + Pavadinimas: + + + Can't apply cheats before the game is started + Negalima taikyti sukčiavimų prieš pradedant žaidimą. + + GameListFrame - Icon Ikona - Name Vardas - Serial Serijinis numeris - Compatibility Compatibility - Region Regionas - Firmware Firmvare - Size Dydis - Version Versija - Path Kelias - Play Time Žaidimo laikas - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automatinis atnaujinimas - Error Klaida - Network error: Tinklo klaida: - Failed to parse update information. Nepavyko išanalizuoti atnaujinimo informacijos. - No pre-releases found. Išankstinių leidimų nerasta. - Invalid release data. Neteisingi leidimo duomenys. - No download URL found for the specified asset. Nerasta atsisiuntimo URL nurodytam turtui. - Your version is already up to date! Jūsų versija jau atnaujinta! - Update Available Prieinama atnaujinimas - Update Channel Atnaujinimo Kanalas - Current Version Esama versija - Latest Version Paskutinė versija - Do you want to update? Ar norite atnaujinti? - Show Changelog Rodyti pakeitimų sąrašą - Check for Updates at Startup Tikrinti naujinimus paleidus - Update Atnaujinti - No Ne - Hide Changelog Slėpti pakeitimų sąrašą - Changes Pokyčiai - Network error occurred while trying to access the URL Tinklo klaida bandant pasiekti URL - Download Complete Atsisiuntimas baigtas - The update has been downloaded, press OK to install. Atnaujinimas buvo atsisiųstas, paspauskite OK, kad įdiegtumėte. - Failed to save the update file at Nepavyko išsaugoti atnaujinimo failo - Starting Update... Pradedama atnaujinimas... - Failed to create the update script file Nepavyko sukurti atnaujinimo scenarijaus failo @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index 4d3c4f5af..711542773 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Om shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 er en eksperimentell åpen kildekode-etterligner for PlayStation 4. - This software should not be used to play games you have not legally obtained. Denne programvaren skal ikke brukes til å spille spill du ikke har fått lovlig. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Åpne mappe @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Laster spill-liste, vennligst vent :3 - Cancel Avbryt - Loading... Laster... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Velg mappe - Select which directory you want to install to. Velg hvilken mappe du vil installere til. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Velg mappe - Directory to install games Mappe for å installere spill - Browse Bla gjennom - Error Feil - The value for location to install games is not valid. Stien for å installere spillet er ikke gyldig. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Lag snarvei - Cheats / Patches Juks / Programrettelse - SFO Viewer SFO viser - Trophy Viewer Trofé viser - Open Folder... Åpne mappen... - Open Game Folder Åpne spillmappen - Open Save Data Folder Åpne lagrede datamappen - Open Log Folder Åpne loggmappen - Copy info... Kopier info... - Copy Name Kopier navn - Copy Serial Kopier serienummer - Copy All Kopier alle - Delete... Slett... - Delete Game Slett spill - Delete Update Slett oppdatering - Delete DLC Slett DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Snarvei opprettelse - Shortcut created successfully! Snarvei opprettet! - Error Feil - Error creating shortcut! Feil ved opprettelse av snarvei! - Install PKG Installer PKG - Game Spill - requiresEnableSeparateUpdateFolder_MSG Denne funksjonen krever 'Aktiver seperat oppdateringsmappe' konfigurasjonsalternativet. Hvis du vil bruke denne funksjonen, må du aktiver den. - This game has no update to delete! Dette spillet har ingen oppdatering å slette! - - + Update Oppdater - This game has no DLC to delete! Dette spillet har ingen DLC å slette! - DLC DLC - Delete %1 Slett %1 - Are you sure you want to delete %1's %2 directory? Er du sikker på at du vil slette %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Åpne/Legg til Elf-mappe - Install Packages (PKG) Installer pakker (PKG) - Boot Game Start spill - Check for Updates Se etter oppdateringer - About shadPS4 Om shadPS4 - Configure... Konfigurer... - Install application from a .pkg file Installer fra en .pkg fil - Recent Games Nylige spill - Exit Avslutt - Exit shadPS4 Avslutt shadPS4 - Exit the application. Avslutt programmet. - Show Game List Vis spill-listen - Game List Refresh Oppdater spill-listen - Tiny Bitteliten - Small Liten - Medium Medium - Large Stor - List View Liste-visning - Grid View Rute-visning - Elf Viewer Elf-visning - Game Install Directory Spillinstallasjons-mappe - Download Cheats/Patches Last ned juks/programrettelse - Dump Game List Dump spill-liste - PKG Viewer PKG viser - Search... Søk... - File Fil - View Oversikt - Game List Icons Spill-liste ikoner - Game List Mode Spill-liste modus - Settings Innstillinger - Utils Verktøy - Themes Tema - Help Hjelp - Dark Mørk - Light Lys - Green Grønn - Blue Blå - Violet Lilla - toolBar Verktøylinje + + Game List + Spill-liste + + + * Unsupported Vulkan Version + * Ustøttet Vulkan-versjon + + + Download Cheats For All Installed Games + Last ned juks for alle installerte spill + + + Download Patches For All Games + Last ned programrettelser for alle spill + + + Download Complete + Nedlasting fullført + + + You have downloaded cheats for all the games you have installed. + Du har lastet ned juks for alle spillene du har installert. + + + Patches Downloaded Successfully! + Programrettelser ble lastet ned! + + + All Patches available for all games have been downloaded. + Programrettelser tilgjengelige for alle spill har blitt lastet ned. + + + Games: + Spill: + + + PKG File (*.PKG) + PKG-fil (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + Game Boot + Spilloppstart + + + Only one file can be selected! + Kun én fil kan velges! + + + PKG Extraction + PKG-utpakking + + + Patch detected! + Programrettelse oppdaget! + + + PKG and Game versions match: + PKG og spillversjoner stemmer overens: + + + Would you like to overwrite? + Ønsker du å overskrive? + + + PKG Version %1 is older than installed version: + PKG-versjon %1 er eldre enn installert versjon: + + + Game is installed: + Spillet er installert: + + + Would you like to install Patch: + Ønsker du å installere programrettelsen: + + + DLC Installation + DLC installasjon + + + Would you like to install DLC: %1? + Ønsker du å installere DLC: %1? + + + DLC already installed: + DLC allerede installert: + + + Game already installed + Spillet er allerede installert + + + PKG is a patch, please install the game first! + PKG er en programrettelse, vennligst installer spillet først! + + + PKG ERROR + PKG FEIL + + + Extracting PKG %1/%2 + Pakker ut PKG %1/%2 + + + Extraction Finished + Utpakking fullført + + + Game successfully installed at %1 + Spillet ble installert i %1 + + + File doesn't appear to be a valid PKG file + Filen ser ikke ut til å være en gyldig PKG-fil + PKGViewer - Open Folder Åpne mappe @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trofé viser @@ -478,1029 +509,700 @@ SettingsDialog - Settings Innstillinger - General Generell - System System - Console Language Konsollspråk - Emulator Language Etterlignerspråk - Emulator Etterligner - Enable Fullscreen Aktiver fullskjerm - Enable Separate Update Folder Aktiver seperat oppdateringsmappe - Show Splash Vis velkomstbilde - Is PS4 Pro Er PS4 Pro - Enable Discord Rich Presence Aktiver Discord Rich Presence - Username Brukernavn - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Logg type - Log Filter Logg filter - Input Inndata - Cursor Musepeker - Hide Cursor Skjul musepeker - Hide Cursor Idle Timeout Skjul musepeker ved inaktivitet - s s - Controller Kontroller - Back Button Behavior Tilbakeknapp atferd - Graphics Grafikk - Graphics Device Grafikkenhet - Width Bredde - Height Høyde - Vblank Divider Vblank skillelinje - Advanced Avansert - Enable Shaders Dumping Aktiver dumping av skyggelegger - Enable NULL GPU Aktiver NULL GPU - Paths Stier - Game Folders Spillmapper - Add... Legg til... - Remove Fjern - Debug Feilretting - Enable Debug Dumping Aktiver dumping av feilretting - Enable Vulkan Validation Layers Aktiver Vulkan valideringslag - Enable Vulkan Synchronization Validation Aktiver Vulkan synkroniseringslag - Enable RenderDoc Debugging Aktiver RenderDoc feilretting - Update Oppdatering - Check for Updates at Startup Se etter oppdateringer ved oppstart - Update Channel Oppdateringskanal - Check for Updates Se etter oppdateringer - GUI Settings GUI-innstillinger - Disable Trophy Pop-ups Deaktiver trofé hurtigmeny - Play title music Spill tittelmusikk - Update Compatibility Database On Startup Oppdater kompatibilitets-database ved oppstart - Game Compatibility Spill kompatibilitet - Display Compatibility Data Vis kompatibilitets-data - Update Compatibility Database Oppdater kompatibilitets-database - Volume Volum - Audio Backend Audio Backend - - - MainWindow - - Game List - Spill-liste - - - - * Unsupported Vulkan Version - * Ustøttet Vulkan-versjon - - - - Download Cheats For All Installed Games - Last ned juks for alle installerte spill - - - - Download Patches For All Games - Last ned programrettelser for alle spill - - - - Download Complete - Nedlasting fullført - - - - You have downloaded cheats for all the games you have installed. - Du har lastet ned juks for alle spillene du har installert. - - - - Patches Downloaded Successfully! - Programrettelser ble lastet ned! - - - - All Patches available for all games have been downloaded. - Programrettelser tilgjengelige for alle spill har blitt lastet ned. - - - - Games: - Spill: - - - - PKG File (*.PKG) - PKG-fil (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - - Game Boot - Spilloppstart - - - - Only one file can be selected! - Kun én fil kan velges! - - - - PKG Extraction - PKG-utpakking - - - - Patch detected! - Programrettelse oppdaget! - - - - PKG and Game versions match: - PKG og spillversjoner stemmer overens: - - - - Would you like to overwrite? - Ønsker du å overskrive? - - - - PKG Version %1 is older than installed version: - PKG-versjon %1 er eldre enn installert versjon: - - - - Game is installed: - Spillet er installert: - - - - Would you like to install Patch: - Ønsker du å installere programrettelsen: - - - - DLC Installation - DLC installasjon - - - - Would you like to install DLC: %1? - Ønsker du å installere DLC: %1? - - - - DLC already installed: - DLC allerede installert: - - - - Game already installed - Spillet er allerede installert - - - - PKG is a patch, please install the game first! - PKG er en programrettelse, vennligst installer spillet først! - - - - PKG ERROR - PKG FEIL - - - - Extracting PKG %1/%2 - Pakker ut PKG %1/%2 - - - - Extraction Finished - Utpakking fullført - - - - Game successfully installed at %1 - Spillet ble installert i %1 - - - - File doesn't appear to be a valid PKG file - Filen ser ikke ut til å være en gyldig PKG-fil - - - - CheatsPatches - - - Cheats / Patches for - Juks / Programrettelser for - - - - defaultTextEdit_MSG - Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Ingen bilde tilgjengelig - - - - Serial: - Serienummer: - - - - Version: - Versjon: - - - - Size: - Størrelse: - - - - Select Cheat File: - Velg juksefil: - - - - Repository: - Pakkebrønn: - - - - Download Cheats - Last ned juks - - - - Delete File - Slett fil - - - - No files selected. - Ingen filer valgt. - - - - You can delete the cheats you don't want after downloading them. - Du kan slette juks du ikke ønsker etter å ha lastet dem ned. - - - - Do you want to delete the selected file?\n%1 - Ønsker du å slette den valgte filen?\n%1 - - - - Select Patch File: - Velg programrettelse-filen: - - - - Download Patches - Last ned programrettelser - - - Save Lagre - - Cheats - Juks - - - - Patches - Programrettelse - - - - Error - Feil - - - - No patch selected. - Ingen programrettelse valgt. - - - - Unable to open files.json for reading. - Kan ikke åpne files.json for lesing. - - - - No patch file found for the current serial. - Ingen programrettelse-fil funnet for det aktuelle serienummeret. - - - - Unable to open the file for reading. - Kan ikke åpne filen for lesing. - - - - Unable to open the file for writing. - Kan ikke åpne filen for skriving. - - - - Failed to parse XML: - Feil ved tolkning av XML: - - - - Success - Vellykket - - - - Options saved successfully. - Alternativer ble lagret. - - - - Invalid Source - Ugyldig kilde - - - - The selected source is invalid. - Den valgte kilden er ugyldig. - - - - File Exists - Filen eksisterer - - - - File already exists. Do you want to replace it? - Filen eksisterer allerede. Ønsker du å erstatte den? - - - - Failed to save file: - Kunne ikke lagre filen: - - - - Failed to download file: - Kunne ikke laste ned filen: - - - - Cheats Not Found - Fant ikke juks - - - - CheatsNotFound_MSG - Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. - - - - Cheats Downloaded Successfully - Juks ble lastet ned - - - - CheatsDownloadedSuccessfully_MSG - Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. - - - - Failed to save: - Kunne ikke lagre: - - - - Failed to download: - Kunne ikke laste ned: - - - - Download Complete - Nedlasting fullført - - - - DownloadComplete_MSG - Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. - - - - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. - - - - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. - - - - The game is in version: %1 - Spillet er i versjon: %1 - - - - The downloaded patch only works on version: %1 - Den nedlastede programrettelsen fungerer bare på versjon: %1 - - - - You may need to update your game. - Du må kanskje oppdatere spillet ditt. - - - - Incompatibility Notice - Inkompatibilitets-varsel - - - - Failed to open file: - Kunne ikke åpne filen: - - - - XML ERROR: - XML FEIL: - - - - Failed to open files.json for writing - Kunne ikke åpne files.json for skriving - - - - Author: - Forfatter: - - - - Directory does not exist: - Mappen eksisterer ikke: - - - - Failed to open files.json for reading. - Kunne ikke åpne files.json for lesing. - - - - Name: - Navn: - - - - Can't apply cheats before the game is started - Kan ikke bruke juks før spillet er startet. - - - - SettingsDialog - - - Save - Lagre - - - Apply Bruk - Restore Defaults Gjenopprett standardinnstillinger - Close Lukk - Point your mouse at an option to display its description. Pek musen over et alternativ for å vise beskrivelsen. - consoleLanguageGroupBox Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. - emulatorLanguageGroupBox Etterlignerspråket:\nAngir språket for etterlignerens brukergrensesnitt. - fullscreenCheckBox Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. - separateUpdatesCheckBox Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. - showSplashCheckBox Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. - ps4proCheckBox Er PS4 Pro:\nFår etterligneren til å fungere som en PS4 PRO, noe som kan aktivere spesielle funksjoner i spill som støtter dette. - discordRPCCheckbox Aktiver Discord Rich Presence:\nViser etterlignerikonet og relevant informasjon på Discord-profilen din. - userName Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for etterligneren. - logFilter Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. - updaterGroupBox Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. - GUIgroupBox Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. - disableTrophycheckBox Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). - hideCursorGroupBox Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. - idleTimeoutGroupBox Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. - backButtonBehaviorGroupBox Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. - enableCompatibilityCheckBox Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. - checkCompatibilityOnStartupCheckBox Oppdater kompatibilitets-data ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. - updateCompatibilityButton Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. - Never Aldri - Idle Inaktiv - Always Alltid - Touchpad Left Berøringsplate Venstre - Touchpad Right Berøringsplate Høyre - Touchpad Center Berøringsplate Midt - None Ingen - graphicsAdapterGroupBox Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en etterligneren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. - resolutionLayout Bredde/Høyde:\nAngir størrelsen på etterlignerkvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. - heightDivider Vblank skillelinje:\nBildehastigheten som etterligneren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! - dumpShadersCheckBox Aktiver dumping av skyggelegger:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. - nullGpuCheckBox Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. - gameFoldersBox Spillmapper:\nListen over mapper som brukes for å se etter installerte spill. - addFolderButton Legg til:\nLegg til en mappe til listen. - removeFolderButton Fjern:\nFjern en mappe fra listen. - debugDump Aktiver dumping av feilsøking:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. - vkValidationCheckBox Aktiver Vulkan valideringslag:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre etterlignerens atferd. - vkSyncValidationCheckBox Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre etterlignerens atferd. - rdocCheckBox Aktiver RenderDoc feilsøking:\nHvis aktivert, vil etterligneren gi kompatibilitet med Renderdoc for å tillate opptak og analyse av det nåværende gjengitte bildet. + + CheatsPatches + + Cheats / Patches for + Juks / Programrettelser for + + + defaultTextEdit_MSG + Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Ingen bilde tilgjengelig + + + Serial: + Serienummer: + + + Version: + Versjon: + + + Size: + Størrelse: + + + Select Cheat File: + Velg juksefil: + + + Repository: + Pakkebrønn: + + + Download Cheats + Last ned juks + + + Delete File + Slett fil + + + No files selected. + Ingen filer valgt. + + + You can delete the cheats you don't want after downloading them. + Du kan slette juks du ikke ønsker etter å ha lastet dem ned. + + + Do you want to delete the selected file?\n%1 + Ønsker du å slette den valgte filen?\n%1 + + + Select Patch File: + Velg programrettelse-filen: + + + Download Patches + Last ned programrettelser + + + Save + Lagre + + + Cheats + Juks + + + Patches + Programrettelse + + + Error + Feil + + + No patch selected. + Ingen programrettelse valgt. + + + Unable to open files.json for reading. + Kan ikke åpne files.json for lesing. + + + No patch file found for the current serial. + Ingen programrettelse-fil funnet for det aktuelle serienummeret. + + + Unable to open the file for reading. + Kan ikke åpne filen for lesing. + + + Unable to open the file for writing. + Kan ikke åpne filen for skriving. + + + Failed to parse XML: + Feil ved tolkning av XML: + + + Success + Vellykket + + + Options saved successfully. + Alternativer ble lagret. + + + Invalid Source + Ugyldig kilde + + + The selected source is invalid. + Den valgte kilden er ugyldig. + + + File Exists + Filen eksisterer + + + File already exists. Do you want to replace it? + Filen eksisterer allerede. Ønsker du å erstatte den? + + + Failed to save file: + Kunne ikke lagre filen: + + + Failed to download file: + Kunne ikke laste ned filen: + + + Cheats Not Found + Fant ikke juks + + + CheatsNotFound_MSG + Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. + + + Cheats Downloaded Successfully + Juks ble lastet ned + + + CheatsDownloadedSuccessfully_MSG + Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. + + + Failed to save: + Kunne ikke lagre: + + + Failed to download: + Kunne ikke laste ned: + + + Download Complete + Nedlasting fullført + + + DownloadComplete_MSG + Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. + + + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. + + + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. + + + The game is in version: %1 + Spillet er i versjon: %1 + + + The downloaded patch only works on version: %1 + Den nedlastede programrettelsen fungerer bare på versjon: %1 + + + You may need to update your game. + Du må kanskje oppdatere spillet ditt. + + + Incompatibility Notice + Inkompatibilitets-varsel + + + Failed to open file: + Kunne ikke åpne filen: + + + XML ERROR: + XML FEIL: + + + Failed to open files.json for writing + Kunne ikke åpne files.json for skriving + + + Author: + Forfatter: + + + Directory does not exist: + Mappen eksisterer ikke: + + + Failed to open files.json for reading. + Kunne ikke åpne files.json for lesing. + + + Name: + Navn: + + + Can't apply cheats before the game is started + Kan ikke bruke juks før spillet er startet. + + GameListFrame - Icon Ikon - Name Navn - Serial Serienummer - Compatibility Kompatibilitet - Region Region - Firmware Fastvare - Size Størrelse - Version Versjon - Path Sti - Play Time Spilletid - Never Played Aldri spilt - h h - m m - s s - Compatibility is untested kompatibilitet er utestet - Game does not initialize properly / crashes the emulator Spillet initialiseres ikke riktig / krasjer etterligneren - Game boots, but only displays a blank screen Spillet starter, men viser bare en tom skjerm - Game displays an image but does not go past the menu Spillet viser et bilde, men går ikke forbi menyen - Game has game-breaking glitches or unplayable performance Spillet har spillbrytende feil eller uspillbar ytelse - Game can be completed with playable performance and no major glitches Spillet kan fullføres med spillbar ytelse og ingen store feil @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automatisk oppdatering - Error Feil - Network error: Nettverksfeil: - Failed to parse update information. Kunne ikke analysere oppdaterings-informasjonen. - No pre-releases found. Fant ingen forhåndsutgivelser. - Invalid release data. Ugyldige utgivelsesdata. - No download URL found for the specified asset. Ingen nedlastings-URL funnet for den spesifiserte ressursen. - Your version is already up to date! Din versjon er allerede oppdatert! - Update Available Oppdatering tilgjengelig - Update Channel Oppdateringskanal - Current Version Gjeldende versjon - Latest Version Nyeste versjon - Do you want to update? Vil du oppdatere? - Show Changelog Vis endringslogg - Check for Updates at Startup Se etter oppdateringer ved oppstart - Update Oppdater - No Nei - Hide Changelog Skjul endringslogg - Changes Endringer - Network error occurred while trying to access the URL Nettverksfeil oppstod mens vi prøvde å få tilgang til URL - Download Complete Nedlasting fullført - The update has been downloaded, press OK to install. Oppdateringen har blitt lastet ned, trykk OK for å installere. - Failed to save the update file at Kunne ikke lagre oppdateringsfilen på - Starting Update... Starter oppdatering... - Failed to create the update script file Kunne ikke opprette oppdateringsskriptfilen @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 0cb890186..2aa996413 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches Cheats / Patches - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Map openen... - Open Game Folder Open Spelmap - Open Save Data Folder Open Map voor Opslagdata - Open Log Folder Open Logmap - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Controleren op updates - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Download Cheats/Patches - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Help - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Lijst met spellen + + + * Unsupported Vulkan Version + * Niet ondersteunde Vulkan-versie + + + Download Cheats For All Installed Games + Download cheats voor alle geïnstalleerde spellen + + + Download Patches For All Games + Download patches voor alle spellen + + + Download Complete + Download voltooid + + + You have downloaded cheats for all the games you have installed. + Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. + + + Patches Downloaded Successfully! + Patches succesvol gedownload! + + + All Patches available for all games have been downloaded. + Alle patches voor alle spellen zijn gedownload. + + + Games: + Spellen: + + + PKG File (*.PKG) + PKG-bestand (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF-bestanden (*.bin *.elf *.oelf) + + + Game Boot + Spelopstart + + + Only one file can be selected! + Je kunt slechts één bestand selecteren! + + + PKG Extraction + PKG-extractie + + + Patch detected! + Patch gedetecteerd! + + + PKG and Game versions match: + PKG- en gameversies komen overeen: + + + Would you like to overwrite? + Wilt u overschrijven? + + + PKG Version %1 is older than installed version: + PKG-versie %1 is ouder dan de geïnstalleerde versie: + + + Game is installed: + Game is geïnstalleerd: + + + Would you like to install Patch: + Wilt u de patch installeren: + + + DLC Installation + DLC-installatie + + + Would you like to install DLC: %1? + Wilt u DLC installeren: %1? + + + DLC already installed: + DLC al geïnstalleerd: + + + Game already installed + Game al geïnstalleerd + + + PKG is a patch, please install the game first! + PKG is een patch, installeer eerst het spel! + + + PKG ERROR + PKG FOUT + + + Extracting PKG %1/%2 + PKG %1/%2 aan het extraheren + + + Extraction Finished + Extractie voltooid + + + Game successfully installed at %1 + Spel succesvol geïnstalleerd op %1 + + + File doesn't appear to be a valid PKG file + Het bestand lijkt geen geldig PKG-bestand te zijn + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Discord Rich Presence inschakelen - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Invoer - Cursor Cursor - Hide Cursor Cursor verbergen - Hide Cursor Idle Timeout Inactiviteit timeout voor het verbergen van de cursor - s s - Controller Controller - Back Button Behavior Achterknop gedrag - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Pad - Game Folders Spelmappen - Add... Toevoegen... - Remove Verwijderen - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Bijwerken - Check for Updates at Startup Bij opstart op updates controleren - Update Channel Updatekanaal - Check for Updates Controleren op updates - GUI Settings GUI-Instellingen - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Titelmuziek afspelen - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Volume - Audio Backend Audio Backend - - - MainWindow - - Game List - Lijst met spellen - - - - * Unsupported Vulkan Version - * Niet ondersteunde Vulkan-versie - - - - Download Cheats For All Installed Games - Download cheats voor alle geïnstalleerde spellen - - - - Download Patches For All Games - Download patches voor alle spellen - - - - Download Complete - Download voltooid - - - - You have downloaded cheats for all the games you have installed. - Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. - - - - Patches Downloaded Successfully! - Patches succesvol gedownload! - - - - All Patches available for all games have been downloaded. - Alle patches voor alle spellen zijn gedownload. - - - - Games: - Spellen: - - - - PKG File (*.PKG) - PKG-bestand (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF-bestanden (*.bin *.elf *.oelf) - - - - Game Boot - Spelopstart - - - - Only one file can be selected! - Je kunt slechts één bestand selecteren! - - - - PKG Extraction - PKG-extractie - - - - Patch detected! - Patch gedetecteerd! - - - - PKG and Game versions match: - PKG- en gameversies komen overeen: - - - - Would you like to overwrite? - Wilt u overschrijven? - - - - PKG Version %1 is older than installed version: - PKG-versie %1 is ouder dan de geïnstalleerde versie: - - - - Game is installed: - Game is geïnstalleerd: - - - - Would you like to install Patch: - Wilt u de patch installeren: - - - - DLC Installation - DLC-installatie - - - - Would you like to install DLC: %1? - Wilt u DLC installeren: %1? - - - - DLC already installed: - DLC al geïnstalleerd: - - - - Game already installed - Game al geïnstalleerd - - - - PKG is a patch, please install the game first! - PKG is een patch, installeer eerst het spel! - - - - PKG ERROR - PKG FOUT - - - - Extracting PKG %1/%2 - PKG %1/%2 aan het extraheren - - - - Extraction Finished - Extractie voltooid - - - - Game successfully installed at %1 - Spel succesvol geïnstalleerd op %1 - - - - File doesn't appear to be a valid PKG file - Het bestand lijkt geen geldig PKG-bestand te zijn - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Geen afbeelding beschikbaar - - - - Serial: - Serie: - - - - Version: - Versie: - - - - Size: - Grootte: - - - - Select Cheat File: - Selecteer cheatbestand: - - - - Repository: - Repository: - - - - Download Cheats - Download cheats - - - - Delete File - Bestand verwijderen - - - - No files selected. - Geen bestanden geselecteerd. - - - - You can delete the cheats you don't want after downloading them. - Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. - - - - Do you want to delete the selected file?\n%1 - Wil je het geselecteerde bestand verwijderen?\n%1 - - - - Select Patch File: - Selecteer patchbestand: - - - - Download Patches - Download patches - - - Save Opslaan - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Fout - - - - No patch selected. - Geen patch geselecteerd. - - - - Unable to open files.json for reading. - Kan files.json niet openen voor lezen. - - - - No patch file found for the current serial. - Geen patchbestand gevonden voor het huidige serienummer. - - - - Unable to open the file for reading. - Kan het bestand niet openen voor lezen. - - - - Unable to open the file for writing. - Kan het bestand niet openen voor schrijven. - - - - Failed to parse XML: - XML parsing mislukt: - - - - Success - Succes - - - - Options saved successfully. - Opties succesvol opgeslagen. - - - - Invalid Source - Ongeldige bron - - - - The selected source is invalid. - De geselecteerde bron is ongeldig. - - - - File Exists - Bestand bestaat - - - - File already exists. Do you want to replace it? - Bestand bestaat al. Wil je het vervangen? - - - - Failed to save file: - Kan bestand niet opslaan: - - - - Failed to download file: - Kan bestand niet downloaden: - - - - Cheats Not Found - Cheats niet gevonden - - - - CheatsNotFound_MSG - Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. - - - - Cheats Downloaded Successfully - Cheats succesvol gedownload - - - - CheatsDownloadedSuccessfully_MSG - Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. - - - - Failed to save: - Opslaan mislukt: - - - - Failed to download: - Downloaden mislukt: - - - - Download Complete - Download voltooid - - - - DownloadComplete_MSG - Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. - - - - Failed to parse JSON data from HTML. - Kan JSON-gegevens uit HTML niet parseren. - - - - Failed to retrieve HTML page. - Kan HTML-pagina niet ophalen. - - - - The game is in version: %1 - Het spel is in versie: %1 - - - - The downloaded patch only works on version: %1 - De gedownloade patch werkt alleen op versie: %1 - - - - You may need to update your game. - Misschien moet je je spel bijwerken. - - - - Incompatibility Notice - Incompatibiliteitsmelding - - - - Failed to open file: - Kan bestand niet openen: - - - - XML ERROR: - XML FOUT: - - - - Failed to open files.json for writing - Kan files.json niet openen voor schrijven - - - - Author: - Auteur: - - - - Directory does not exist: - Map bestaat niet: - - - - Failed to open files.json for reading. - Kan files.json niet openen voor lezen. - - - - Name: - Naam: - - - - Can't apply cheats before the game is started - Je kunt geen cheats toepassen voordat het spel is gestart. - - - - SettingsDialog - - - Save - Opslaan - - - Apply Toepassen - Restore Defaults Standaardinstellingen herstellen - Close Sluiten - Point your mouse at an option to display its description. Wijzig de muisaanwijzer naar een optie om de beschrijving weer te geven. - consoleLanguageGroupBox Console Taal:\nStelt de taal in die het PS4-spel gebruikt.\nHet wordt aanbevolen om dit in te stellen op een taal die het spel ondersteunt, wat kan variëren per regio. - emulatorLanguageGroupBox Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. - fullscreenCheckBox Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Opstartscherm weergeven:\nToont het opstartscherm van het spel (een speciale afbeelding) tijdens het starten van het spel. - ps4proCheckBox Is PS4 Pro:\nLaat de emulator zich gedragen als een PS4 PRO, wat speciale functies kan inschakelen in games die dit ondersteunen. - discordRPCCheckbox Discord Rich Presence inschakelen:\nToont het emulatoricoon en relevante informatie op je Discord-profiel. - userName Gebruikersnaam:\nStelt de gebruikersnaam van het PS4-account in, die door sommige games kan worden weergegeven. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Logtype:\nStelt in of de uitvoer van het logvenster moet worden gesynchroniseerd voor prestaties. Kan nadelige effecten hebben op emulatie. - logFilter Logfilter:\nFiltert het logboek om alleen specifieke informatie af te drukken.\nVoorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna. - updaterGroupBox Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. - GUIgroupBox Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Verberg cursor:\nKies wanneer de cursor verdwijnt:\nNooit: Je ziet altijd de muis.\nInactief: Stel een tijd in waarna deze verdwijnt na inactiviteit.\nAltijd: je ziet de muis nooit. - idleTimeoutGroupBox Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit. - backButtonBehaviorGroupBox Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Nooit - Idle Inactief - Always Altijd - Touchpad Left Touchpad Links - Touchpad Right Touchpad Rechts - Touchpad Center Touchpad Midden - None Geen - graphicsAdapterGroupBox Grafische adapter:\nIn systemen met meerdere GPU's, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies "Auto Select" om dit automatisch in te stellen. - resolutionLayout Breedte/Hoogte:\nStelt de grootte van het emulatorvenster bij het opstarten in, wat tijdens het spelen kan worden gewijzigd.\nDit is anders dan de resolutie in de game. - heightDivider Vblank deler:\nDe frame-rate waartegen de emulator wordt vernieuwd, vermenigvuldigd met dit getal. Dit veranderen kan nadelige effecten hebben, zoals het versnellen van het spel of het verpesten van kritieke gamefunctionaliteiten die niet verwachtten dat dit zou veranderen! - dumpShadersCheckBox Shaderdump inschakelen:\nVoor technische foutopsporing slaat het de shaders van de game op in een map terwijl ze worden gerenderd. - nullGpuCheckBox Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is. - gameFoldersBox Spelmap:\nDe lijst met mappen om te controleren op geïnstalleerde spellen. - addFolderButton Toevoegen:\nVoeg een map toe aan de lijst. - removeFolderButton Verwijderen:\nVerwijder een map uit de lijst. - debugDump Foutopsporing dump inschakelen:\nSlaat de import- en export-symbolen en de bestandsheaderinformatie van de momenteel draaiende PS4-toepassing op in een map. - vkValidationCheckBox Vulkan validatielaag inschakelen:\nSchakelt een systeem in dat de status van de Vulkan-renderer valideert en informatie over de interne status ervan logt. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - vkSyncValidationCheckBox Vulkan synchronisatievalidatie inschakelen:\nSchakelt een systeem in dat de timing van Vulkan-renderingtaken valideert. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - rdocCheckBox RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Geen afbeelding beschikbaar + + + Serial: + Serie: + + + Version: + Versie: + + + Size: + Grootte: + + + Select Cheat File: + Selecteer cheatbestand: + + + Repository: + Repository: + + + Download Cheats + Download cheats + + + Delete File + Bestand verwijderen + + + No files selected. + Geen bestanden geselecteerd. + + + You can delete the cheats you don't want after downloading them. + Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. + + + Do you want to delete the selected file?\n%1 + Wil je het geselecteerde bestand verwijderen?\n%1 + + + Select Patch File: + Selecteer patchbestand: + + + Download Patches + Download patches + + + Save + Opslaan + + + Cheats + Cheats + + + Patches + Patches + + + Error + Fout + + + No patch selected. + Geen patch geselecteerd. + + + Unable to open files.json for reading. + Kan files.json niet openen voor lezen. + + + No patch file found for the current serial. + Geen patchbestand gevonden voor het huidige serienummer. + + + Unable to open the file for reading. + Kan het bestand niet openen voor lezen. + + + Unable to open the file for writing. + Kan het bestand niet openen voor schrijven. + + + Failed to parse XML: + XML parsing mislukt: + + + Success + Succes + + + Options saved successfully. + Opties succesvol opgeslagen. + + + Invalid Source + Ongeldige bron + + + The selected source is invalid. + De geselecteerde bron is ongeldig. + + + File Exists + Bestand bestaat + + + File already exists. Do you want to replace it? + Bestand bestaat al. Wil je het vervangen? + + + Failed to save file: + Kan bestand niet opslaan: + + + Failed to download file: + Kan bestand niet downloaden: + + + Cheats Not Found + Cheats niet gevonden + + + CheatsNotFound_MSG + Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. + + + Cheats Downloaded Successfully + Cheats succesvol gedownload + + + CheatsDownloadedSuccessfully_MSG + Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. + + + Failed to save: + Opslaan mislukt: + + + Failed to download: + Downloaden mislukt: + + + Download Complete + Download voltooid + + + DownloadComplete_MSG + Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. + + + Failed to parse JSON data from HTML. + Kan JSON-gegevens uit HTML niet parseren. + + + Failed to retrieve HTML page. + Kan HTML-pagina niet ophalen. + + + The game is in version: %1 + Het spel is in versie: %1 + + + The downloaded patch only works on version: %1 + De gedownloade patch werkt alleen op versie: %1 + + + You may need to update your game. + Misschien moet je je spel bijwerken. + + + Incompatibility Notice + Incompatibiliteitsmelding + + + Failed to open file: + Kan bestand niet openen: + + + XML ERROR: + XML FOUT: + + + Failed to open files.json for writing + Kan files.json niet openen voor schrijven + + + Author: + Auteur: + + + Directory does not exist: + Map bestaat niet: + + + Failed to open files.json for reading. + Kan files.json niet openen voor lezen. + + + Name: + Naam: + + + Can't apply cheats before the game is started + Je kunt geen cheats toepassen voordat het spel is gestart. + + GameListFrame - Icon Pictogram - Name Naam - Serial Serienummer - Compatibility Compatibility - Region Regio - Firmware Firmware - Size Grootte - Version Versie - Path Pad - Play Time Speeltijd - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automatische updater - Error Fout - Network error: Netwerkfout: - Failed to parse update information. Kon update-informatie niet parseren. - No pre-releases found. Geen pre-releases gevonden. - Invalid release data. Ongeldige releasegegevens. - No download URL found for the specified asset. Geen download-URL gevonden voor het opgegeven bestand. - Your version is already up to date! Uw versie is al up-to-date! - Update Available Update beschikbaar - Update Channel Updatekanaal - Current Version Huidige versie - Latest Version Laatste versie - Do you want to update? Wilt u updaten? - Show Changelog Toon changelog - Check for Updates at Startup Bij opstart op updates controleren - Update Bijwerken - No Nee - Hide Changelog Verberg changelog - Changes Wijzigingen - Network error occurred while trying to access the URL Netwerkfout opgetreden tijdens toegang tot de URL - Download Complete Download compleet - The update has been downloaded, press OK to install. De update is gedownload, druk op OK om te installeren. - Failed to save the update file at Kon het updatebestand niet opslaan op - Starting Update... Starten van update... - Failed to create the update script file Kon het update-scriptbestand niet maken @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 1aed08394..20c9861c3 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 O programie - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. - This software should not be used to play games you have not legally obtained. To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Otwórz folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Ładowanie listy gier, proszę poczekaj :3 - Cancel Anuluj - Loading... Ładowanie... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Wybierz katalog - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Wybierz katalog - Directory to install games Katalog do instalacji gier - Browse Przeglądaj - Error Błąd - The value for location to install games is not valid. Podana ścieżka do instalacji gier nie jest prawidłowa. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Utwórz skrót - Cheats / Patches Kody / poprawki - SFO Viewer Menedżer plików SFO - Trophy Viewer Menedżer trofeów - Open Folder... Otwórz Folder... - Open Game Folder Otwórz Katalog Gry - Open Save Data Folder Otwórz Folder Danych Zapisów - Open Log Folder Otwórz Folder Dziennika - Copy info... Kopiuj informacje... - Copy Name Kopiuj nazwę - Copy Serial Kopiuj numer seryjny - Copy All Kopiuj wszystko - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Tworzenie skrótu - Shortcut created successfully! Utworzenie skrótu zakończone pomyślnie! - Error Błąd - Error creating shortcut! Utworzenie skrótu zakończone niepowodzeniem! - Install PKG Zainstaluj PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Otwórz/Dodaj folder Elf - Install Packages (PKG) Zainstaluj paczkę (PKG) - Boot Game Uruchom grę - Check for Updates Sprawdź aktualizacje - About shadPS4 O programie - Configure... Konfiguruj... - Install application from a .pkg file Zainstaluj aplikacje z pliku .pkg - Recent Games Ostatnie gry - Exit Wyjdź - Exit shadPS4 Wyjdź z shadPS4 - Exit the application. Wyjdź z aplikacji. - Show Game List Pokaż listę gier - Game List Refresh Odśwież listę gier - Tiny Malutkie - Small Małe - Medium Średnie - Large Wielkie - List View Widok listy - Grid View Widok siatki - Elf Viewer Menedżer plików ELF - Game Install Directory Katalog zainstalowanych gier - Download Cheats/Patches Pobierz kody / poprawki - Dump Game List Zgraj listę gier - PKG Viewer Menedżer plików PKG - Search... Szukaj... - File Plik - View Widok - Game List Icons Ikony w widoku listy - Game List Mode Tryb listy gier - Settings Ustawienia - Utils Narzędzia - Themes Motywy - Help Pomoc - Dark Ciemny - Light Jasny - Green Zielony - Blue Niebieski - Violet Fioletowy - toolBar Pasek narzędzi + + Game List + Lista gier + + + * Unsupported Vulkan Version + * Nieobsługiwana wersja Vulkan + + + Download Cheats For All Installed Games + Pobierz kody do wszystkich zainstalowanych gier + + + Download Patches For All Games + Pobierz poprawki do wszystkich gier + + + Download Complete + Pobieranie zakończone + + + You have downloaded cheats for all the games you have installed. + Pobrałeś kody do wszystkich zainstalowanych gier. + + + Patches Downloaded Successfully! + Poprawki pobrane pomyślnie! + + + All Patches available for all games have been downloaded. + Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. + + + Games: + Gry: + + + PKG File (*.PKG) + Plik PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Pliki ELF (*.bin *.elf *.oelf) + + + Game Boot + Uruchomienie gry + + + Only one file can be selected! + Można wybrać tylko jeden plik! + + + PKG Extraction + Wypakowywanie PKG + + + Patch detected! + Wykryto łatkę! + + + PKG and Game versions match: + Wersje PKG i gry są zgodne: + + + Would you like to overwrite? + Czy chcesz nadpisać? + + + PKG Version %1 is older than installed version: + Wersja PKG %1 jest starsza niż zainstalowana wersja: + + + Game is installed: + Gra jest zainstalowana: + + + Would you like to install Patch: + Czy chcesz zainstalować łatkę: + + + DLC Installation + Instalacja DLC + + + Would you like to install DLC: %1? + Czy chcesz zainstalować DLC: %1? + + + DLC already installed: + DLC już zainstalowane: + + + Game already installed + Gra już zainstalowana + + + PKG is a patch, please install the game first! + PKG jest poprawką, proszę najpierw zainstalować grę! + + + PKG ERROR + BŁĄD PKG + + + Extracting PKG %1/%2 + Wypakowywanie PKG %1/%2 + + + Extraction Finished + Wypakowywanie zakończone + + + Game successfully installed at %1 + Gra pomyślnie zainstalowana w %1 + + + File doesn't appear to be a valid PKG file + Plik nie wydaje się być prawidłowym plikiem PKG + PKGViewer - Open Folder Otwórz folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Menedżer trofeów @@ -478,1029 +509,700 @@ SettingsDialog - Settings Ustawienia - General Ogólne - System System - Console Language Język konsoli - Emulator Language Język emulatora - Emulator Emulator - Enable Fullscreen Włącz pełny ekran - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Pokaż ekran powitania - Is PS4 Pro Emulacja PS4 Pro - Enable Discord Rich Presence Włącz Discord Rich Presence - Username Nazwa użytkownika - Trophy Key Trophy Key - Trophy Trophy - Logger Dziennik zdarzeń - Log Type Typ dziennika - Log Filter Filtrowanie dziennika - Input Wejście - Cursor Kursor - Hide Cursor Ukryj kursor - Hide Cursor Idle Timeout Czas oczekiwania na ukrycie kursora przy bezczynności - s s - Controller Kontroler - Back Button Behavior Zachowanie przycisku wstecz - Graphics Grafika - Graphics Device Karta graficzna - Width Szerokość - Height Wysokość - Vblank Divider Dzielnik przerwy pionowej (Vblank) - Advanced Zaawansowane - Enable Shaders Dumping Włącz zgrywanie cieni - Enable NULL GPU Wyłącz kartę graficzną - Paths Ścieżki - Game Folders Foldery gier - Add... Dodaj... - Remove Usuń - Debug Debugowanie - Enable Debug Dumping Włącz zgrywanie debugowania - Enable Vulkan Validation Layers Włącz warstwy walidacji Vulkan - Enable Vulkan Synchronization Validation Włącz walidację synchronizacji Vulkan - Enable RenderDoc Debugging Włącz debugowanie RenderDoc - Update Aktualizacja - Check for Updates at Startup Sprawdź aktualizacje przy starcie - Update Channel Kanał Aktualizacji - Check for Updates Sprawdź aktualizacje - GUI Settings Ustawienia Interfejsu - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Odtwórz muzykę tytułową - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Głośność - Audio Backend Audio Backend - - - MainWindow - - Game List - Lista gier - - - - * Unsupported Vulkan Version - * Nieobsługiwana wersja Vulkan - - - - Download Cheats For All Installed Games - Pobierz kody do wszystkich zainstalowanych gier - - - - Download Patches For All Games - Pobierz poprawki do wszystkich gier - - - - Download Complete - Pobieranie zakończone - - - - You have downloaded cheats for all the games you have installed. - Pobrałeś kody do wszystkich zainstalowanych gier. - - - - Patches Downloaded Successfully! - Poprawki pobrane pomyślnie! - - - - All Patches available for all games have been downloaded. - Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. - - - - Games: - Gry: - - - - PKG File (*.PKG) - Plik PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Pliki ELF (*.bin *.elf *.oelf) - - - - Game Boot - Uruchomienie gry - - - - Only one file can be selected! - Można wybrać tylko jeden plik! - - - - PKG Extraction - Wypakowywanie PKG - - - - Patch detected! - Wykryto łatkę! - - - - PKG and Game versions match: - Wersje PKG i gry są zgodne: - - - - Would you like to overwrite? - Czy chcesz nadpisać? - - - - PKG Version %1 is older than installed version: - Wersja PKG %1 jest starsza niż zainstalowana wersja: - - - - Game is installed: - Gra jest zainstalowana: - - - - Would you like to install Patch: - Czy chcesz zainstalować łatkę: - - - - DLC Installation - Instalacja DLC - - - - Would you like to install DLC: %1? - Czy chcesz zainstalować DLC: %1? - - - - DLC already installed: - DLC już zainstalowane: - - - - Game already installed - Gra już zainstalowana - - - - PKG is a patch, please install the game first! - PKG jest poprawką, proszę najpierw zainstalować grę! - - - - PKG ERROR - BŁĄD PKG - - - - Extracting PKG %1/%2 - Wypakowywanie PKG %1/%2 - - - - Extraction Finished - Wypakowywanie zakończone - - - - Game successfully installed at %1 - Gra pomyślnie zainstalowana w %1 - - - - File doesn't appear to be a valid PKG file - Plik nie wydaje się być prawidłowym plikiem PKG - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Brak dostępnego obrazu - - - - Serial: - Numer seryjny: - - - - Version: - Wersja: - - - - Size: - Rozmiar: - - - - Select Cheat File: - Wybierz plik kodu: - - - - Repository: - Repozytorium: - - - - Download Cheats - Pobierz kody - - - - Remove Old Files - Usuń stare pliki - - - - Do you want to delete the files after downloading them? - Czy chcesz usunąć pliki po ich pobraniu? - - - - Do you want to delete the files after downloading them?\n%1 - Czy chcesz usunąć pliki po ich pobraniu?\n%1 - - - - Do you want to delete the selected file?\n%1 - Czy chcesz usunąć wybrany plik?\n%1 - - - - Select Patch File: - Wybierz plik poprawki: - - - - Download Patches - Pobierz poprawki - - - Save Zapisz - - Cheats - Kody - - - - Patches - Poprawki - - - - Error - Błąd - - - - No patch selected. - Nie wybrano poprawki. - - - - Unable to open files.json for reading. - Nie można otworzyć pliku files.json do odczytu. - - - - No patch file found for the current serial. - Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. - - - - Unable to open the file for reading. - Nie można otworzyć pliku do odczytu. - - - - Unable to open the file for writing. - Nie można otworzyć pliku do zapisu. - - - - Failed to parse XML: - Nie udało się przeanalizować XML: - - - - Success - Sukces - - - - Options saved successfully. - Opcje zostały pomyślnie zapisane. - - - - Invalid Source - Nieprawidłowe źródło - - - - The selected source is invalid. - Wybrane źródło jest nieprawidłowe. - - - - File Exists - Plik istnieje - - - - File already exists. Do you want to replace it? - Plik już istnieje. Czy chcesz go zastąpić? - - - - Failed to save file: - Nie udało się zapisać pliku: - - - - Failed to download file: - Nie udało się pobrać pliku: - - - - Cheats Not Found - Nie znaleziono kodów - - - - CheatsNotFound_MSG - Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. - - - - Cheats Downloaded Successfully - Kody pobrane pomyślnie - - - - CheatsDownloadedSuccessfully_MSG - Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. - - - - Failed to save: - Nie udało się zapisać: - - - - Failed to download: - Nie udało się pobrać: - - - - Download Complete - Pobieranie zakończone - - - - DownloadComplete_MSG - Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. - - - - Failed to parse JSON data from HTML. - Nie udało się przeanalizować danych JSON z HTML. - - - - Failed to retrieve HTML page. - Nie udało się pobrać strony HTML. - - - - The game is in version: %1 - Gra jest w wersji: %1 - - - - The downloaded patch only works on version: %1 - Pobrana łatka działa tylko w wersji: %1 - - - - You may need to update your game. - Możesz potrzebować zaktualizować swoją grę. - - - - Incompatibility Notice - Powiadomienie o niezgodności - - - - Failed to open file: - Nie udało się otworzyć pliku: - - - - XML ERROR: - BŁĄD XML: - - - - Failed to open files.json for writing - Nie udało się otworzyć pliku files.json do zapisu - - - - Author: - Autor: - - - - Directory does not exist: - Katalog nie istnieje: - - - - Directory does not exist: %1 - Katalog nie istnieje: %1 - - - - Failed to parse JSON: - Nie udało się przeanlizować JSON: - - - - Can't apply cheats before the game is started - Nie można zastosować kodów przed uruchomieniem gry. - - - - SettingsDialog - - - Save - Zapisz - - - Apply Zastosuj - Restore Defaults Przywróć ustawienia domyślne - Close Zamknij - Point your mouse at an option to display its description. Najedź kursorem na opcję, aby wyświetlić jej opis. - consoleLanguageGroupBox Język konsoli:\nUstala język, który używa gra PS4.\nZaleca się ustawienie tego na język, który obsługuje gra, co może się różnić w zależności od regionu. - emulatorLanguageGroupBox Język emulatora:\nUstala język interfejsu użytkownika emulatora. - fullscreenCheckBox Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Wyświetl ekran powitalny:\nPodczas uruchamiania gry wyświetla ekran powitalny (specjalny obraz). - ps4proCheckBox Czy PS4 Pro:\nSprawia, że emulator działa jak PS4 PRO, co może aktywować specjalne funkcje w grach, które to obsługują. - discordRPCCheckbox Włącz Discord Rich Presence:\nWyświetla ikonę emuladora i odpowiednie informacje na twoim profilu Discord. - userName Nazwa użytkownika:\nUstala nazwę użytkownika konta PS4, która może być wyświetlana w niektórych grach. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Typ logu:\nUstala, czy synchronizować wyjście okna dziennika dla wydajności. Może to mieć negatywny wpływ na emulację. - logFilter Filtr logu:\nFiltruje dziennik, aby drukować tylko określone informacje.\nPrzykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później. - updaterGroupBox Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. - GUIgroupBox Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Ukryj kursor:\nWybierz, kiedy kursor zniknie:\nNigdy: Zawsze będziesz widział myszkę.\nNieaktywny: Ustaw czas, po którym zniknie po bezczynności.\nZawsze: nigdy nie zobaczysz myszki. - idleTimeoutGroupBox Ustaw czas, po którym mysz zniknie po bezczynności. - backButtonBehaviorGroupBox Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Nigdy - Idle Bezczynny - Always Zawsze - Touchpad Left Touchpad Lewy - Touchpad Right Touchpad Prawy - Touchpad Center Touchpad Środkowy - None Brak - graphicsAdapterGroupBox Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz "Auto Select", aby ustawić go automatycznie. - resolutionLayout Szerokość/Wysokość:\nUstala rozmiar okna emulatora podczas uruchamiania, który może być zmieniany w trakcie gry.\nTo różni się od rozdzielczości w grze. - heightDivider Dzielnik Vblank:\nWskaźnik klatek, z jakim emulator jest odświeżany, pomnożony przez tę liczbę. Zmiana tego może mieć negatywne skutki, takie jak przyspieszenie gry lub zniszczenie krytycznej funkcjonalności gry, która nie spodziewa się, że to zostanie zmienione! - dumpShadersCheckBox Włącz zrzucanie shaderów:\nDla technicznego debugowania zapisuje shadery z gry w folderze podczas renderowania. - nullGpuCheckBox Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej. - gameFoldersBox Foldery gier:\nLista folderów do sprawdzenia zainstalowanych gier. - addFolderButton Dodaj:\nDodaj folder do listy. - removeFolderButton Usuń:\nUsuń folder z listy. - debugDump Włącz zrzut debugowania:\nZapisuje symbole importu i eksportu oraz informacje nagłówkowe pliku dla aktualnie działającej aplikacji PS4 w katalogu. - vkValidationCheckBox Włącz warstwę walidacji Vulkan:\nWłącza system, który waliduje stan renderera Vulkan i loguje informacje o jego wewnętrznym stanie. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - vkSyncValidationCheckBox Włącz walidację synchronizacji Vulkan:\nWłącza system, który waliduje timing zadań renderowania Vulkan. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - rdocCheckBox Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Brak dostępnego obrazu + + + Serial: + Numer seryjny: + + + Version: + Wersja: + + + Size: + Rozmiar: + + + Select Cheat File: + Wybierz plik kodu: + + + Repository: + Repozytorium: + + + Download Cheats + Pobierz kody + + + Remove Old Files + Usuń stare pliki + + + Do you want to delete the files after downloading them? + Czy chcesz usunąć pliki po ich pobraniu? + + + Do you want to delete the files after downloading them?\n%1 + Czy chcesz usunąć pliki po ich pobraniu?\n%1 + + + Do you want to delete the selected file?\n%1 + Czy chcesz usunąć wybrany plik?\n%1 + + + Select Patch File: + Wybierz plik poprawki: + + + Download Patches + Pobierz poprawki + + + Save + Zapisz + + + Cheats + Kody + + + Patches + Poprawki + + + Error + Błąd + + + No patch selected. + Nie wybrano poprawki. + + + Unable to open files.json for reading. + Nie można otworzyć pliku files.json do odczytu. + + + No patch file found for the current serial. + Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. + + + Unable to open the file for reading. + Nie można otworzyć pliku do odczytu. + + + Unable to open the file for writing. + Nie można otworzyć pliku do zapisu. + + + Failed to parse XML: + Nie udało się przeanalizować XML: + + + Success + Sukces + + + Options saved successfully. + Opcje zostały pomyślnie zapisane. + + + Invalid Source + Nieprawidłowe źródło + + + The selected source is invalid. + Wybrane źródło jest nieprawidłowe. + + + File Exists + Plik istnieje + + + File already exists. Do you want to replace it? + Plik już istnieje. Czy chcesz go zastąpić? + + + Failed to save file: + Nie udało się zapisać pliku: + + + Failed to download file: + Nie udało się pobrać pliku: + + + Cheats Not Found + Nie znaleziono kodów + + + CheatsNotFound_MSG + Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. + + + Cheats Downloaded Successfully + Kody pobrane pomyślnie + + + CheatsDownloadedSuccessfully_MSG + Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. + + + Failed to save: + Nie udało się zapisać: + + + Failed to download: + Nie udało się pobrać: + + + Download Complete + Pobieranie zakończone + + + DownloadComplete_MSG + Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. + + + Failed to parse JSON data from HTML. + Nie udało się przeanalizować danych JSON z HTML. + + + Failed to retrieve HTML page. + Nie udało się pobrać strony HTML. + + + The game is in version: %1 + Gra jest w wersji: %1 + + + The downloaded patch only works on version: %1 + Pobrana łatka działa tylko w wersji: %1 + + + You may need to update your game. + Możesz potrzebować zaktualizować swoją grę. + + + Incompatibility Notice + Powiadomienie o niezgodności + + + Failed to open file: + Nie udało się otworzyć pliku: + + + XML ERROR: + BŁĄD XML: + + + Failed to open files.json for writing + Nie udało się otworzyć pliku files.json do zapisu + + + Author: + Autor: + + + Directory does not exist: + Katalog nie istnieje: + + + Directory does not exist: %1 + Katalog nie istnieje: %1 + + + Failed to parse JSON: + Nie udało się przeanlizować JSON: + + + Can't apply cheats before the game is started + Nie można zastosować kodów przed uruchomieniem gry. + + GameListFrame - Icon Ikona - Name Nazwa - Serial Numer seryjny - Compatibility Compatibility - Region Region - Firmware Oprogramowanie - Size Rozmiar - Version Wersja - Path Ścieżka - Play Time Czas gry - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Automatyczne aktualizacje - Error Błąd - Network error: Błąd sieci: - Failed to parse update information. Nie udało się sparsować informacji o aktualizacji. - No pre-releases found. Nie znaleziono wersji przedpremierowych. - Invalid release data. Nieprawidłowe dane wydania. - No download URL found for the specified asset. Nie znaleziono adresu URL do pobrania dla określonego zasobu. - Your version is already up to date! Twoja wersja jest już aktualna! - Update Available Dostępna aktualizacja - Update Channel Kanał Aktualizacji - Current Version Aktualna wersja - Latest Version Ostatnia wersja - Do you want to update? Czy chcesz zaktualizować? - Show Changelog Pokaż zmiany - Check for Updates at Startup Sprawdź aktualizacje przy starcie - Update Aktualizuj - No Nie - Hide Changelog Ukryj zmiany - Changes Zmiany - Network error occurred while trying to access the URL Błąd sieci wystąpił podczas próby uzyskania dostępu do URL - Download Complete Pobieranie zakończone - The update has been downloaded, press OK to install. Aktualizacja została pobrana, naciśnij OK, aby zainstalować. - Failed to save the update file at Nie udało się zapisać pliku aktualizacji w - Starting Update... Rozpoczynanie aktualizacji... - Failed to create the update script file Nie udało się utworzyć pliku skryptu aktualizacji @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index cce66c105..2d623dfbf 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Sobre o shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. - This software should not be used to play games you have not legally obtained. Este software não deve ser usado para jogar jogos piratas. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Abrir Pasta @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Carregando a lista de jogos, por favor aguarde :3 - Cancel Cancelar - Loading... Carregando... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Escolha o diretório - Select which directory you want to install to. Selecione o diretório em que você deseja instalar. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Escolha o diretório - Directory to install games Diretório para instalar jogos - Browse Procurar - Error Erro - The value for location to install games is not valid. O diretório da instalação dos jogos não é válido. @@ -96,373 +81,420 @@ GuiContextMenus - Create Shortcut Criar Atalho - Cheats / Patches Cheats / Patches - SFO Viewer Visualizador de SFO - Trophy Viewer Visualizador de Troféu - Open Folder... Abrir Pasta... - Open Game Folder Abrir Pasta do Jogo - Open Save Data Folder Abrir Pasta de Save - Open Log Folder Abrir Pasta de Log - Copy info... Copiar informação... - Copy Name Copiar Nome - Copy Serial Copiar Serial - Copy All Copiar Tudo - Delete... Deletar... - Delete Game Deletar Jogo - Delete Update Deletar Atualização - Delete DLC Deletar DLC - Compatibility... Compatibilidade... - Update database Atualizar banco de dados - View report Ver status - Submit a report Enviar status - Shortcut creation Criação de atalho - Shortcut created successfully! Atalho criado com sucesso! - Error Erro - Error creating shortcut! Erro ao criar atalho! - Install PKG Instalar PKG - Game Jogo - requiresEnableSeparateUpdateFolder_MSG Este recurso requer a opção de configuração 'Habilitar Pasta de Atualização Separada' para funcionar. Se você quiser usar este recurso, habilite-o. - This game has no update to delete! Este jogo não tem atualização para excluir! - - + Update Atualização - This game has no DLC to delete! Este jogo não tem DLC para excluir! - DLC DLC - Delete %1 Deletar %1 - Are you sure you want to delete %1's %2 directory? Tem certeza de que deseja excluir o diretório %2 de %1 ? - + MainWindow - Open/Add Elf Folder Abrir/Adicionar pasta Elf - Install Packages (PKG) Instalar Pacotes (PKG) - Boot Game Iniciar Jogo - Check for Updates Verificar atualizações - About shadPS4 Sobre o shadPS4 - Configure... Configurar... - Install application from a .pkg file Instalar aplicação de um arquivo .pkg - Recent Games Jogos Recentes - Exit Sair - Exit shadPS4 Sair do shadPS4 - Exit the application. Sair da aplicação. - Show Game List Mostrar Lista de Jogos - Game List Refresh Atualizar Lista de Jogos - Tiny Muito pequeno - Small Pequeno - Medium Médio - Large Grande - List View Visualizar em Lista - Grid View Visualizar em Grade - Elf Viewer Visualizador de Elf - Game Install Directory Diretório de Instalação de Jogos - Download Cheats/Patches Baixar Cheats/Patches - Dump Game List Dumpar Lista de Jogos - PKG Viewer Visualizador de PKG - Search... Pesquisar... - File Arquivo - View Ver - Game List Icons Ícones da Lista de Jogos - Game List Mode Modo da Lista de Jogos - Settings Configurações - Utils Utilitários - Themes Temas - Help Ajuda - Dark Escuro - Light Claro - Green Verde - Blue Azul - Violet Violeta - toolBar Barra de Ferramentas + + Game List + Lista de Jogos + + + * Unsupported Vulkan Version + * Versão Vulkan não suportada + + + Download Cheats For All Installed Games + Baixar Cheats para Todos os Jogos Instalados + + + Download Patches For All Games + Baixar Patches para Todos os Jogos + + + Download Complete + Download Completo + + + You have downloaded cheats for all the games you have installed. + Você baixou cheats para todos os jogos que instalou. + + + Patches Downloaded Successfully! + Patches Baixados com Sucesso! + + + All Patches available for all games have been downloaded. + Todos os patches disponíveis para todos os jogos foram baixados. + + + Games: + Jogos: + + + PKG File (*.PKG) + Arquivo PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Arquivos ELF (*.bin *.elf *.oelf) + + + Game Boot + Inicialização do Jogo + + + Only one file can be selected! + Apenas um arquivo pode ser selecionado! + + + PKG Extraction + Extração de PKG + + + Patch detected! + Atualização detectada! + + + PKG and Game versions match: + As versões do PKG e do Jogo são igual: + + + Would you like to overwrite? + Gostaria de substituir? + + + PKG Version %1 is older than installed version: + Versão do PKG %1 é mais antiga do que a versão instalada: + + + Game is installed: + Jogo instalado: + + + Would you like to install Patch: + Você gostaria de instalar a atualização: + + + DLC Installation + Instalação de DLC + + + Would you like to install DLC: %1? + Você gostaria de instalar o DLC: %1? + + + DLC already installed: + DLC já instalada: + + + Game already installed + O jogo já está instalado: + + + PKG is a patch, please install the game first! + O PKG é um patch, por favor, instale o jogo primeiro! + + + PKG ERROR + ERRO de PKG + + + Extracting PKG %1/%2 + Extraindo PKG %1/%2 + + + Extraction Finished + Extração Concluída + + + Game successfully installed at %1 + Jogo instalado com sucesso em %1 + + + File doesn't appear to be a valid PKG file + O arquivo não parece ser um arquivo PKG válido + PKGViewer - Open Folder Abrir Pasta @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Visualizador de Troféu @@ -478,1029 +509,700 @@ SettingsDialog - Settings Configurações - General Geral - System Sistema - Console Language Idioma do Console - Emulator Language Idioma do Emulador - Emulator Emulador - Enable Fullscreen Ativar Tela Cheia - Enable Separate Update Folder Habilitar pasta de atualização separada - Show Splash Mostrar Splash Inicial - Is PS4 Pro Modo PS4 Pro - Enable Discord Rich Presence Ativar Discord Rich Presence - Username Nome de usuário - Trophy Key Trophy Key - Trophy Troféus - Logger Registro - Log Type Tipo de Registro - Log Filter Filtro do Registro - Input Entradas - Cursor Cursor - Hide Cursor Ocultar Cursor - Hide Cursor Idle Timeout Tempo de Inatividade para Ocultar Cursor - s s - Controller Controle - Back Button Behavior Comportamento do botão Voltar - Graphics Gráficos - Graphics Device Placa de Vídeo - Width Largura - Height Altura - Vblank Divider Divisor Vblank - Advanced Avançado - Enable Shaders Dumping Ativar Dumping de Shaders - Enable NULL GPU Ativar GPU NULA - Paths Pastas - Game Folders Pastas dos Jogos - Add... Adicionar... - Remove Remover - Debug Depuração - Enable Debug Dumping Ativar Depuração de Dumping - Enable Vulkan Validation Layers Ativar Camadas de Validação do Vulkan - Enable Vulkan Synchronization Validation Ativar Validação de Sincronização do Vulkan - Enable RenderDoc Debugging Ativar Depuração por RenderDoc - Update Atualização - Check for Updates at Startup Verificar Atualizações ao Iniciar - Update Channel Canal de Atualização - Check for Updates Verificar atualizações - GUI Settings Configurações da Interface - Disable Trophy Pop-ups Desabilitar Pop-ups dos Troféus - Play title music Reproduzir música de abertura - Update Compatibility Database On Startup Atualizar Compatibilidade ao Inicializar - Game Compatibility Compatibilidade dos Jogos - Display Compatibility Data Exibir Dados de Compatibilidade - Update Compatibility Database Atualizar Lista de Compatibilidade - Volume Volume - Audio Backend Backend de Áudio - - - MainWindow - - Game List - Lista de Jogos - - - - * Unsupported Vulkan Version - * Versão Vulkan não suportada - - - - Download Cheats For All Installed Games - Baixar Cheats para Todos os Jogos Instalados - - - - Download Patches For All Games - Baixar Patches para Todos os Jogos - - - - Download Complete - Download Completo - - - - You have downloaded cheats for all the games you have installed. - Você baixou cheats para todos os jogos que instalou. - - - - Patches Downloaded Successfully! - Patches Baixados com Sucesso! - - - - All Patches available for all games have been downloaded. - Todos os patches disponíveis para todos os jogos foram baixados. - - - - Games: - Jogos: - - - - PKG File (*.PKG) - Arquivo PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Arquivos ELF (*.bin *.elf *.oelf) - - - - Game Boot - Inicialização do Jogo - - - - Only one file can be selected! - Apenas um arquivo pode ser selecionado! - - - - PKG Extraction - Extração de PKG - - - - Patch detected! - Atualização detectada! - - - - PKG and Game versions match: - As versões do PKG e do Jogo são igual: - - - - Would you like to overwrite? - Gostaria de substituir? - - - - PKG Version %1 is older than installed version: - Versão do PKG %1 é mais antiga do que a versão instalada: - - - - Game is installed: - Jogo instalado: - - - - Would you like to install Patch: - Você gostaria de instalar a atualização: - - - - DLC Installation - Instalação de DLC - - - - Would you like to install DLC: %1? - Você gostaria de instalar o DLC: %1? - - - - DLC already installed: - DLC já instalada: - - - - Game already installed - O jogo já está instalado: - - - - PKG is a patch, please install the game first! - O PKG é um patch, por favor, instale o jogo primeiro! - - - - PKG ERROR - ERRO de PKG - - - - Extracting PKG %1/%2 - Extraindo PKG %1/%2 - - - - Extraction Finished - Extração Concluída - - - - Game successfully installed at %1 - Jogo instalado com sucesso em %1 - - - - File doesn't appear to be a valid PKG file - O arquivo não parece ser um arquivo PKG válido - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches para - - - - defaultTextEdit_MSG - Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Imagem Não Disponível - - - - Serial: - Serial: - - - - Version: - Versão: - - - - Size: - Tamanho: - - - - Select Cheat File: - Selecione o Arquivo de Cheat: - - - - Repository: - Repositório: - - - - Download Cheats - Baixar Cheats - - - - Delete File - Excluir Arquivo - - - - No files selected. - Nenhum arquivo selecionado. - - - - You can delete the cheats you don't want after downloading them. - Você pode excluir os cheats que não deseja após baixá-las. - - - - Do you want to delete the selected file?\n%1 - Deseja excluir o arquivo selecionado?\n%1 - - - - Select Patch File: - Selecione o Arquivo de Patch: - - - - Download Patches - Baixar Patches - - - Save Salvar - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Erro - - - - No patch selected. - Nenhum patch selecionado. - - - - Unable to open files.json for reading. - Não foi possível abrir files.json para leitura. - - - - No patch file found for the current serial. - Nenhum arquivo de patch encontrado para o serial atual. - - - - Unable to open the file for reading. - Não foi possível abrir o arquivo para leitura. - - - - Unable to open the file for writing. - Não foi possível abrir o arquivo para gravação. - - - - Failed to parse XML: - Falha ao analisar XML: - - - - Success - Sucesso - - - - Options saved successfully. - Opções salvas com sucesso. - - - - Invalid Source - Fonte Inválida - - - - The selected source is invalid. - A fonte selecionada é inválida. - - - - File Exists - Arquivo Existe - - - - File already exists. Do you want to replace it? - O arquivo já existe. Deseja substituí-lo? - - - - Failed to save file: - Falha ao salvar o arquivo: - - - - Failed to download file: - Falha ao baixar o arquivo: - - - - Cheats Not Found - Cheats Não Encontrados - - - - CheatsNotFound_MSG - Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. - - - - Cheats Downloaded Successfully - Cheats Baixados com Sucesso - - - - CheatsDownloadedSuccessfully_MSG - Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. - - - - Failed to save: - Falha ao salvar: - - - - Failed to download: - Falha ao baixar: - - - - Download Complete - Download Completo - - - - DownloadComplete_MSG - Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. - - - - Failed to parse JSON data from HTML. - Falha ao analisar dados JSON do HTML. - - - - Failed to retrieve HTML page. - Falha ao recuperar a página HTML. - - - - The game is in version: %1 - O jogo está na versão: %1 - - - - The downloaded patch only works on version: %1 - O patch baixado só funciona na versão: %1 - - - - You may need to update your game. - Talvez você precise atualizar seu jogo. - - - - Incompatibility Notice - Aviso de incompatibilidade - - - - Failed to open file: - Falha ao abrir o arquivo: - - - - XML ERROR: - ERRO de XML: - - - - Failed to open files.json for writing - Falha ao abrir files.json para gravação - - - - Author: - Autor: - - - - Directory does not exist: - O Diretório não existe: - - - - Failed to open files.json for reading. - Falha ao abrir files.json para leitura. - - - - Name: - Nome: - - - - Can't apply cheats before the game is started - Não é possível aplicar cheats antes que o jogo comece. - - - - SettingsDialog - - - Save - Salvar - - - Apply Aplicar - Restore Defaults Restaurar Padrões - Close Fechar - Point your mouse at an option to display its description. Passe o mouse sobre uma opção para exibir sua descrição. - consoleLanguageGroupBox Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. - emulatorLanguageGroupBox Idioma do emulador:\nDefine o idioma da interface do emulador. - fullscreenCheckBox Ativar Tela Cheia:\nMove automaticamente a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. - separateUpdatesCheckBox Habilitar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento. - showSplashCheckBox Mostrar Splash Inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo. - ps4proCheckBox Modo PS4 Pro:\nFaz o emulador agir como um PS4 PRO, o que pode ativar recursos especiais em jogos que o suportam. - discordRPCCheckbox Ativar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. - userName Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. - logFilter Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. - updaterGroupBox Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. - GUIgroupBox Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. - disableTrophycheckBox Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal). - hideCursorGroupBox Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Você sempre verá o mouse.\nParado: Defina um tempo para ele desaparecer após ficar inativo.\nSempre: Você nunca verá o mouse. - idleTimeoutGroupBox Defina um tempo em segundos para o mouse desaparecer após ficar inativo. - backButtonBehaviorGroupBox Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4. - enableCompatibilityCheckBox Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. - checkCompatibilityOnStartupCheckBox Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado. - updateCompatibilityButton Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade. - Never Nunca - Idle Parado - Always Sempre - Touchpad Left Touchpad Esquerdo - Touchpad Right Touchpad Direito - Touchpad Center Touchpad Centro - None Nenhum - graphicsAdapterGroupBox Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. - resolutionLayout Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. - heightDivider Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! - dumpShadersCheckBox Ativar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. - nullGpuCheckBox Ativar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. - gameFoldersBox Pastas dos jogos:\nA lista de pastas para verificar se há jogos instalados. - addFolderButton Adicionar:\nAdicione uma pasta à lista. - removeFolderButton Remover:\nRemove uma pasta da lista. - debugDump Ativar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. - vkValidationCheckBox Ativar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - vkSyncValidationCheckBox Ativar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - rdocCheckBox Ativar depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches para + + + defaultTextEdit_MSG + Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Imagem Não Disponível + + + Serial: + Serial: + + + Version: + Versão: + + + Size: + Tamanho: + + + Select Cheat File: + Selecione o Arquivo de Cheat: + + + Repository: + Repositório: + + + Download Cheats + Baixar Cheats + + + Delete File + Excluir Arquivo + + + No files selected. + Nenhum arquivo selecionado. + + + You can delete the cheats you don't want after downloading them. + Você pode excluir os cheats que não deseja após baixá-las. + + + Do you want to delete the selected file?\n%1 + Deseja excluir o arquivo selecionado?\n%1 + + + Select Patch File: + Selecione o Arquivo de Patch: + + + Download Patches + Baixar Patches + + + Save + Salvar + + + Cheats + Cheats + + + Patches + Patches + + + Error + Erro + + + No patch selected. + Nenhum patch selecionado. + + + Unable to open files.json for reading. + Não foi possível abrir files.json para leitura. + + + No patch file found for the current serial. + Nenhum arquivo de patch encontrado para o serial atual. + + + Unable to open the file for reading. + Não foi possível abrir o arquivo para leitura. + + + Unable to open the file for writing. + Não foi possível abrir o arquivo para gravação. + + + Failed to parse XML: + Falha ao analisar XML: + + + Success + Sucesso + + + Options saved successfully. + Opções salvas com sucesso. + + + Invalid Source + Fonte Inválida + + + The selected source is invalid. + A fonte selecionada é inválida. + + + File Exists + Arquivo Existe + + + File already exists. Do you want to replace it? + O arquivo já existe. Deseja substituí-lo? + + + Failed to save file: + Falha ao salvar o arquivo: + + + Failed to download file: + Falha ao baixar o arquivo: + + + Cheats Not Found + Cheats Não Encontrados + + + CheatsNotFound_MSG + Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. + + + Cheats Downloaded Successfully + Cheats Baixados com Sucesso + + + CheatsDownloadedSuccessfully_MSG + Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. + + + Failed to save: + Falha ao salvar: + + + Failed to download: + Falha ao baixar: + + + Download Complete + Download Completo + + + DownloadComplete_MSG + Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. + + + Failed to parse JSON data from HTML. + Falha ao analisar dados JSON do HTML. + + + Failed to retrieve HTML page. + Falha ao recuperar a página HTML. + + + The game is in version: %1 + O jogo está na versão: %1 + + + The downloaded patch only works on version: %1 + O patch baixado só funciona na versão: %1 + + + You may need to update your game. + Talvez você precise atualizar seu jogo. + + + Incompatibility Notice + Aviso de incompatibilidade + + + Failed to open file: + Falha ao abrir o arquivo: + + + XML ERROR: + ERRO de XML: + + + Failed to open files.json for writing + Falha ao abrir files.json para gravação + + + Author: + Autor: + + + Directory does not exist: + O Diretório não existe: + + + Failed to open files.json for reading. + Falha ao abrir files.json para leitura. + + + Name: + Nome: + + + Can't apply cheats before the game is started + Não é possível aplicar cheats antes que o jogo comece. + + GameListFrame - Icon Icone - Name Nome - Serial Serial - Compatibility Compatibilidade - Region Região - Firmware Firmware - Size Tamanho - Version Versão - Path Diretório - Play Time Tempo Jogado - Never Played Nunca jogado - h h - m m - s s - Compatibility is untested Compatibilidade não testada - Game does not initialize properly / crashes the emulator Jogo não inicializa corretamente / trava o emulador - Game boots, but only displays a blank screen O jogo inicializa, mas exibe apenas uma tela vazia - Game displays an image but does not go past the menu Jogo exibe imagem mas não passa do menu - Game has game-breaking glitches or unplayable performance O jogo tem falhas que interrompem o jogo ou desempenho injogável - Game can be completed with playable performance and no major glitches O jogo pode ser concluído com desempenho jogável e sem grandes falhas @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Atualizador automático - Error Erro - Network error: Erro de rede: - Failed to parse update information. Falha ao analisar as informações de atualização. - No pre-releases found. Nenhuma pre-release encontrada. - Invalid release data. Dados da release inválidos. - No download URL found for the specified asset. Nenhuma URL de download encontrada para o asset especificado. - Your version is already up to date! Sua versão já está atualizada! - Update Available Atualização disponível - Update Channel Canal de Atualização - Current Version Versão atual - Latest Version Última versão - Do you want to update? Você quer atualizar? - Show Changelog Mostrar Changelog - Check for Updates at Startup Verificar Atualizações ao Iniciar - Update Atualizar - No Não - Hide Changelog Ocultar Changelog - Changes Alterações - Network error occurred while trying to access the URL Ocorreu um erro de rede ao tentar acessar o URL - Download Complete Download Completo - The update has been downloaded, press OK to install. A atualização foi baixada, pressione OK para instalar. - Failed to save the update file at Falha ao salvar o arquivo de atualização em - Starting Update... Iniciando atualização... - Failed to create the update script file Falha ao criar o arquivo de script de atualização @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 63df2ff80..fbbabfac0 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Trapaças / Patches Coduri / Patch-uri - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Deschide Folder... - Open Game Folder Deschide Folder Joc - Open Save Data Folder Deschide Folder Date Salvate - Open Log Folder Deschide Folder Jurnal - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Verifică actualizările - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Descarcă Coduri / Patch-uri - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Ajutor - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Lista jocurilor + + + * Unsupported Vulkan Version + * Versiune Vulkan nesuportată + + + Download Cheats For All Installed Games + Descarcă Cheats pentru toate jocurile instalate + + + Download Patches For All Games + Descarcă Patches pentru toate jocurile + + + Download Complete + Descărcare completă + + + You have downloaded cheats for all the games you have installed. + Ai descărcat cheats pentru toate jocurile instalate. + + + Patches Downloaded Successfully! + Patches descărcate cu succes! + + + All Patches available for all games have been downloaded. + Toate Patches disponibile pentru toate jocurile au fost descărcate. + + + Games: + Jocuri: + + + PKG File (*.PKG) + Fișier PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Fișiere ELF (*.bin *.elf *.oelf) + + + Game Boot + Boot Joc + + + Only one file can be selected! + Numai un fișier poate fi selectat! + + + PKG Extraction + Extracție PKG + + + Patch detected! + Patch detectat! + + + PKG and Game versions match: + Versiunile PKG și ale jocului sunt compatibile: + + + Would you like to overwrite? + Doriți să suprascrieți? + + + PKG Version %1 is older than installed version: + Versiunea PKG %1 este mai veche decât versiunea instalată: + + + Game is installed: + Jocul este instalat: + + + Would you like to install Patch: + Doriți să instalați patch-ul: + + + DLC Installation + Instalare DLC + + + Would you like to install DLC: %1? + Doriți să instalați DLC-ul: %1? + + + DLC already installed: + DLC deja instalat: + + + Game already installed + Jocul deja instalat + + + PKG is a patch, please install the game first! + PKG este un patch, te rugăm să instalezi mai întâi jocul! + + + PKG ERROR + EROARE PKG + + + Extracting PKG %1/%2 + Extracție PKG %1/%2 + + + Extraction Finished + Extracție terminată + + + Game successfully installed at %1 + Jocul a fost instalat cu succes la %1 + + + File doesn't appear to be a valid PKG file + Fișierul nu pare să fie un fișier PKG valid + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Activați Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Introducere - Cursor Cursor - Hide Cursor Ascunde cursorul - Hide Cursor Idle Timeout Timeout pentru ascunderea cursorului inactiv - s s - Controller Controler - Back Button Behavior Comportament buton înapoi - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Trasee - Game Folders Dosare de joc - Add... Adaugă... - Remove Eliminare - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Actualizare - Check for Updates at Startup Verifică actualizări la pornire - Update Channel Canal de Actualizare - Check for Updates Verifică actualizări - GUI Settings Setări GUI - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Redă muzica titlului - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Volum - Audio Backend Audio Backend - - - MainWindow - - Game List - Lista jocurilor - - - - * Unsupported Vulkan Version - * Versiune Vulkan nesuportată - - - - Download Cheats For All Installed Games - Descarcă Cheats pentru toate jocurile instalate - - - - Download Patches For All Games - Descarcă Patches pentru toate jocurile - - - - Download Complete - Descărcare completă - - - - You have downloaded cheats for all the games you have installed. - Ai descărcat cheats pentru toate jocurile instalate. - - - - Patches Downloaded Successfully! - Patches descărcate cu succes! - - - - All Patches available for all games have been downloaded. - Toate Patches disponibile pentru toate jocurile au fost descărcate. - - - - Games: - Jocuri: - - - - PKG File (*.PKG) - Fișier PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Fișiere ELF (*.bin *.elf *.oelf) - - - - Game Boot - Boot Joc - - - - Only one file can be selected! - Numai un fișier poate fi selectat! - - - - PKG Extraction - Extracție PKG - - - - Patch detected! - Patch detectat! - - - - PKG and Game versions match: - Versiunile PKG și ale jocului sunt compatibile: - - - - Would you like to overwrite? - Doriți să suprascrieți? - - - - PKG Version %1 is older than installed version: - Versiunea PKG %1 este mai veche decât versiunea instalată: - - - - Game is installed: - Jocul este instalat: - - - - Would you like to install Patch: - Doriți să instalați patch-ul: - - - - DLC Installation - Instalare DLC - - - - Would you like to install DLC: %1? - Doriți să instalați DLC-ul: %1? - - - - DLC already installed: - DLC deja instalat: - - - - Game already installed - Jocul deja instalat - - - - PKG is a patch, please install the game first! - PKG este un patch, te rugăm să instalezi mai întâi jocul! - - - - PKG ERROR - EROARE PKG - - - - Extracting PKG %1/%2 - Extracție PKG %1/%2 - - - - Extraction Finished - Extracție terminată - - - - Game successfully installed at %1 - Jocul a fost instalat cu succes la %1 - - - - File doesn't appear to be a valid PKG file - Fișierul nu pare să fie un fișier PKG valid - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nu este disponibilă imaginea - - - - Serial: - Serial: - - - - Version: - Versiune: - - - - Size: - Dimensiune: - - - - Select Cheat File: - Selectează fișierul Cheat: - - - - Repository: - Repository: - - - - Download Cheats - Descarcă Cheats - - - - Delete File - Șterge Fișierul - - - - No files selected. - Nu sunt fișiere selectate. - - - - You can delete the cheats you don't want after downloading them. - Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. - - - - Do you want to delete the selected file?\n%1 - Vrei să ștergi fișierul selectat?\n%1 - - - - Select Patch File: - Selectează fișierul Patch: - - - - Download Patches - Descarcă Patches - - - Save Salvează - - Cheats - Cheats - - - - Patches - Patches - - - - Error - Eroare - - - - No patch selected. - Nu este selectat niciun patch. - - - - Unable to open files.json for reading. - Imposibil de deschis files.json pentru citire. - - - - No patch file found for the current serial. - Nu s-a găsit niciun fișier patch pentru serialul curent. - - - - Unable to open the file for reading. - Imposibil de deschis fișierul pentru citire. - - - - Unable to open the file for writing. - Imposibil de deschis fișierul pentru scriere. - - - - Failed to parse XML: - Nu s-a reușit pararea XML: - - - - Success - Succes - - - - Options saved successfully. - Opțiunile au fost salvate cu succes. - - - - Invalid Source - Sursă invalidă - - - - The selected source is invalid. - Sursa selectată este invalidă. - - - - File Exists - Fișier existent - - - - File already exists. Do you want to replace it? - Fișierul există deja. Vrei să-l înlocuiești? - - - - Failed to save file: - Nu s-a reușit salvarea fișierului: - - - - Failed to download file: - Nu s-a reușit descărcarea fișierului: - - - - Cheats Not Found - Cheats Nu au fost găsite - - - - CheatsNotFound_MSG - Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. - - - - Cheats Downloaded Successfully - Cheats descărcate cu succes - - - - CheatsDownloadedSuccessfully_MSG - Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. - - - - Failed to save: - Nu s-a reușit salvarea: - - - - Failed to download: - Nu s-a reușit descărcarea: - - - - Download Complete - Descărcare completă - - - - DownloadComplete_MSG - Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. - - - - Failed to parse JSON data from HTML. - Nu s-a reușit pararea datelor JSON din HTML. - - - - Failed to retrieve HTML page. - Nu s-a reușit obținerea paginii HTML. - - - - The game is in version: %1 - Jocul este în versiunea: %1 - - - - The downloaded patch only works on version: %1 - Patch-ul descărcat funcționează doar pe versiunea: %1 - - - - You may need to update your game. - Este posibil să trebuiască să actualizezi jocul tău. - - - - Incompatibility Notice - Avertizare de incompatibilitate - - - - Failed to open file: - Nu s-a reușit deschiderea fișierului: - - - - XML ERROR: - EROARE XML: - - - - Failed to open files.json for writing - Nu s-a reușit deschiderea files.json pentru scriere - - - - Author: - Autor: - - - - Directory does not exist: - Directorul nu există: - - - - Failed to open files.json for reading. - Nu s-a reușit deschiderea files.json pentru citire. - - - - Name: - Nume: - - - - Can't apply cheats before the game is started - Nu poți aplica cheats înainte ca jocul să înceapă. - - - - SettingsDialog - - - Save - Salvează - - - Apply Aplică - Restore Defaults Restabilește Impozitivele - Close Închide - Point your mouse at an option to display its description. Indicați mouse-ul asupra unei opțiuni pentru a afișa descrierea acesteia. - consoleLanguageGroupBox Limba consolei:\nSetează limba pe care o folosește jocul PS4.\nSe recomandă să setezi această opțiune pe o limbă pe care jocul o suportă, ceea ce poate varia în funcție de regiune. - emulatorLanguageGroupBox Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. - fullscreenCheckBox Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Afișează ecranul de încărcare:\nAfișează ecranul de încărcare al jocului (o imagine specială) în timp ce jocul pornește. - ps4proCheckBox Este PS4 Pro:\nFace ca emulatorul să se comporte ca un PS4 PRO, ceea ce poate activa funcții speciale în jocurile care o suportă. - discordRPCCheckbox Activați Discord Rich Presence:\nAfișează pictograma emulatorului și informații relevante pe profilul dumneavoastră Discord. - userName Nume utilizator:\nSetează numele de utilizator al contului PS4, care poate fi afișat de unele jocuri. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Tip jurnal:\nSetează dacă să sincronizezi ieșirea ferestrei de jurnal pentru performanță. Aceasta poate avea efecte adverse asupra emulării. - logFilter Filtrul jurnalului:\nFiltrează jurnalul pentru a imprima doar informații specifice.\nExemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare. - updaterGroupBox Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. - GUIgroupBox Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Ascunde cursorul:\nAlegeți când va dispărea cursorul:\nNiciodată: Vei vedea întotdeauna mouse-ul.\nInactiv: Setează un timp pentru a dispărea după inactivitate.\nÎntotdeauna: nu vei vedea niciodată mouse-ul. - idleTimeoutGroupBox Setați un timp pentru ca mouse-ul să dispară după ce a fost inactiv. - backButtonBehaviorGroupBox Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului să imite atingerea poziției specificate pe touchpad-ul PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Niciodată - Idle Inactiv - Always Întotdeauna - Touchpad Left Touchpad Stânga - Touchpad Right Touchpad Dreapta - Touchpad Center Centru Touchpad - None Niciunul - graphicsAdapterGroupBox Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează "Auto Select" pentru a-l determina automat. - resolutionLayout Lățime/Înălțime:\nSetează dimensiunea ferestrei emulatorului la lansare, care poate fi redimensionată în timpul jocului.\nAceasta este diferită de rezoluția din joc. - heightDivider Împărțitor Vblank:\nRata de cadre cu care emulatorul se reîmprospătează este multiplicată cu acest număr. Schimbarea acestuia poate avea efecte adverse, cum ar fi creșterea vitezei jocului sau distrugerea funcționalității critice a jocului care nu se așteaptă ca aceasta să se schimbe! - dumpShadersCheckBox Activează salvarea shaderelor:\nÎn scopuri de depanare tehnică, salvează shader-urile jocului într-un folder pe măsură ce sunt randate. - nullGpuCheckBox Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică. - gameFoldersBox Folderele jocurilor:\nLista folderelor pentru a verifica jocurile instalate. - addFolderButton Adăugați:\nAdăugați un folder la listă. - removeFolderButton Eliminați:\nÎndepărtați un folder din listă. - debugDump Activează salvarea pentru depanare:\nSalvează simbolurile de import și export și informațiile din antetul fișierului pentru aplicația PS4 care rulează în prezent într-un director. - vkValidationCheckBox Activează straturile de validare Vulkan:\nActivează un sistem care validează starea renderer-ului Vulkan și înregistrează informații despre starea sa internă. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - vkSyncValidationCheckBox Activează validarea sincronizării Vulkan:\nActivează un sistem care validează sincronizarea sarcinilor de redare Vulkan. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - rdocCheckBox Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nu este disponibilă imaginea + + + Serial: + Serial: + + + Version: + Versiune: + + + Size: + Dimensiune: + + + Select Cheat File: + Selectează fișierul Cheat: + + + Repository: + Repository: + + + Download Cheats + Descarcă Cheats + + + Delete File + Șterge Fișierul + + + No files selected. + Nu sunt fișiere selectate. + + + You can delete the cheats you don't want after downloading them. + Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. + + + Do you want to delete the selected file?\n%1 + Vrei să ștergi fișierul selectat?\n%1 + + + Select Patch File: + Selectează fișierul Patch: + + + Download Patches + Descarcă Patches + + + Save + Salvează + + + Cheats + Cheats + + + Patches + Patches + + + Error + Eroare + + + No patch selected. + Nu este selectat niciun patch. + + + Unable to open files.json for reading. + Imposibil de deschis files.json pentru citire. + + + No patch file found for the current serial. + Nu s-a găsit niciun fișier patch pentru serialul curent. + + + Unable to open the file for reading. + Imposibil de deschis fișierul pentru citire. + + + Unable to open the file for writing. + Imposibil de deschis fișierul pentru scriere. + + + Failed to parse XML: + Nu s-a reușit pararea XML: + + + Success + Succes + + + Options saved successfully. + Opțiunile au fost salvate cu succes. + + + Invalid Source + Sursă invalidă + + + The selected source is invalid. + Sursa selectată este invalidă. + + + File Exists + Fișier existent + + + File already exists. Do you want to replace it? + Fișierul există deja. Vrei să-l înlocuiești? + + + Failed to save file: + Nu s-a reușit salvarea fișierului: + + + Failed to download file: + Nu s-a reușit descărcarea fișierului: + + + Cheats Not Found + Cheats Nu au fost găsite + + + CheatsNotFound_MSG + Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. + + + Cheats Downloaded Successfully + Cheats descărcate cu succes + + + CheatsDownloadedSuccessfully_MSG + Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. + + + Failed to save: + Nu s-a reușit salvarea: + + + Failed to download: + Nu s-a reușit descărcarea: + + + Download Complete + Descărcare completă + + + DownloadComplete_MSG + Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. + + + Failed to parse JSON data from HTML. + Nu s-a reușit pararea datelor JSON din HTML. + + + Failed to retrieve HTML page. + Nu s-a reușit obținerea paginii HTML. + + + The game is in version: %1 + Jocul este în versiunea: %1 + + + The downloaded patch only works on version: %1 + Patch-ul descărcat funcționează doar pe versiunea: %1 + + + You may need to update your game. + Este posibil să trebuiască să actualizezi jocul tău. + + + Incompatibility Notice + Avertizare de incompatibilitate + + + Failed to open file: + Nu s-a reușit deschiderea fișierului: + + + XML ERROR: + EROARE XML: + + + Failed to open files.json for writing + Nu s-a reușit deschiderea files.json pentru scriere + + + Author: + Autor: + + + Directory does not exist: + Directorul nu există: + + + Failed to open files.json for reading. + Nu s-a reușit deschiderea files.json pentru citire. + + + Name: + Nume: + + + Can't apply cheats before the game is started + Nu poți aplica cheats înainte ca jocul să înceapă. + + GameListFrame - Icon Icon - Name Nume - Serial Serie - Compatibility Compatibility - Region Regiune - Firmware Firmware - Size Dimensiune - Version Versiune - Path Drum - Play Time Timp de Joacă - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Actualizator automat - Error Eroare - Network error: Eroare de rețea: - Failed to parse update information. Nu s-au putut analiza informațiile de actualizare. - No pre-releases found. Nu au fost găsite pre-lansări. - Invalid release data. Datele versiunii sunt invalide. - No download URL found for the specified asset. Nu s-a găsit URL de descărcare pentru resursa specificată. - Your version is already up to date! Versiunea ta este deja actualizată! - Update Available Actualizare disponibilă - Update Channel Canal de Actualizare - Current Version Versiunea curentă - Latest Version Ultima versiune - Do you want to update? Doriți să actualizați? - Show Changelog Afișați jurnalul de modificări - Check for Updates at Startup Verifică actualizări la pornire - Update Actualizare - No Nu - Hide Changelog Ascunde jurnalul de modificări - Changes Modificări - Network error occurred while trying to access the URL A apărut o eroare de rețea în timpul încercării de a accesa URL-ul - Download Complete Descărcare completă - The update has been downloaded, press OK to install. Actualizarea a fost descărcată, apăsați OK pentru a instala. - Failed to save the update file at Nu s-a putut salva fișierul de actualizare la - Starting Update... Încep actualizarea... - Failed to create the update script file Nu s-a putut crea fișierul script de actualizare @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 88eff1aeb..e914e4d49 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 О shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. - This software should not be used to play games you have not legally obtained. Это програмное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Открыть папку @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Загрузка списка игр, пожалуйста подождите :3 - Cancel Отмена - Loading... Загрузка... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Выберите папку - Select which directory you want to install to. Выберите папку, в которую вы хотите установить. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Выберите папку - Directory to install games Папка для установки игр - Browse Обзор - Error Ошибка - The value for location to install games is not valid. Недопустимое значение местоположения для установки игр. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Создать ярлык - Cheats / Patches Читы и патчи - SFO Viewer Просмотр SFO - Trophy Viewer Просмотр трофеев - Open Folder... Открыть папку... - Open Game Folder Открыть папку с игрой - Open Save Data Folder Открыть папку сохранений - Open Log Folder Открыть папку логов - Copy info... Копировать информацию... - Copy Name Копировать имя - Copy Serial Копировать серийный номер - Copy All Копировать все - Delete... Удаление... - Delete Game Удалить игру - Delete Update Удалить обновление - Delete DLC Удалить DLC - Compatibility... Совместимость... - Update database Обновить базу данных - View report Посмотреть отчет - Submit a report Отправить отчет - Shortcut creation Создание ярлыка - Shortcut created successfully! Ярлык создан успешно! - Error Ошибка - Error creating shortcut! Ошибка создания ярлыка! - Install PKG Установить PKG - Game Игры - requiresEnableSeparateUpdateFolder_MSG Эта функция требует включения настройки 'Отдельная папка обновлений'. Если вы хотите использовать эту функцию, пожалуйста включите её. - This game has no update to delete! У этой игры нет обновлений для удаления! - - + Update Обновления - This game has no DLC to delete! У этой игры нет DLC для удаления! - DLC DLC - Delete %1 Удалить %1 - Are you sure you want to delete %1's %2 directory? Вы уверены, что хотите удалить папку %2 %1? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Открыть/Добавить папку Elf - Install Packages (PKG) Установить пакеты (PKG) - Boot Game Запустить игру - Check for Updates Проверить обновления - About shadPS4 О shadPS4 - Configure... Настроить... - Install application from a .pkg file Установить приложение из файла .pkg - Recent Games Недавние игры - Exit Выход - Exit shadPS4 Выйти из shadPS4 - Exit the application. Выйти из приложения. - Show Game List Показать список игр - Game List Refresh Обновить список игр - Tiny Крошечный - Small Маленький - Medium Средний - Large Большой - List View Список - Grid View Сетка - Elf Viewer Elf - Game Install Directory Каталог установки игры - Download Cheats/Patches Скачать читы или патчи - Dump Game List Дамп списка игр - PKG Viewer Просмотр PKG - Search... Поиск... - File Файл - View Вид - Game List Icons Размер иконок списка игр - Game List Mode Вид списка игр - Settings Настройки - Utils Утилиты - Themes Темы - Help Помощь - Dark Темная - Light Светлая - Green Зеленая - Blue Синяя - Violet Фиолетовая - toolBar Панель инструментов + + Game List + Список игр + + + * Unsupported Vulkan Version + * Неподдерживаемая версия Vulkan + + + Download Cheats For All Installed Games + Скачать читы для всех установленных игр + + + Download Patches For All Games + Скачать патчи для всех игр + + + Download Complete + Скачивание завершено + + + You have downloaded cheats for all the games you have installed. + Вы скачали читы для всех установленных игр. + + + Patches Downloaded Successfully! + Патчи успешно скачаны! + + + All Patches available for all games have been downloaded. + Все доступные патчи для всех игр были скачаны. + + + Games: + Игры: + + + PKG File (*.PKG) + Файл PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Файлы ELF (*.bin *.elf *.oelf) + + + Game Boot + Запуск игры + + + Only one file can be selected! + Можно выбрать только один файл! + + + PKG Extraction + Извлечение PKG + + + Patch detected! + Обнаружен патч! + + + PKG and Game versions match: + Версии PKG и игры совпадают: + + + Would you like to overwrite? + Хотите перезаписать? + + + PKG Version %1 is older than installed version: + Версия PKG %1 старее установленной версии: + + + Game is installed: + Игра установлена: + + + Would you like to install Patch: + Хотите установить патч: + + + DLC Installation + Установка DLC + + + Would you like to install DLC: %1? + Вы хотите установить DLC: %1? + + + DLC already installed: + DLC уже установлен: + + + Game already installed + Игра уже установлена + + + PKG is a patch, please install the game first! + PKG - это патч, сначала установите игру! + + + PKG ERROR + ОШИБКА PKG + + + Extracting PKG %1/%2 + Извлечение PKG %1/%2 + + + Extraction Finished + Извлечение завершено + + + Game successfully installed at %1 + Игра успешно установлена в %1 + + + File doesn't appear to be a valid PKG file + Файл не является допустимым файлом PKG + PKGViewer - Open Folder Открыть папку @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Просмотр трофеев @@ -478,1029 +509,700 @@ SettingsDialog - Settings Настройки - General Общее - System Система - Console Language Язык консоли - Emulator Language Язык эмулятора - Emulator Эмулятор - Enable Fullscreen Полноэкранный режим - Enable Separate Update Folder Отдельная папка обновлений - Show Splash Показывать заставку - Is PS4 Pro Режим PS4 Pro - Enable Discord Rich Presence Включить Discord Rich Presence - Username Имя пользователя - Trophy Key Trophy Key - Trophy Trophy - Logger Логирование - Log Type Тип логов - Log Filter Фильтр логов - Input Ввод - Cursor Курсор мыши - Hide Cursor Скрывать курсор - Hide Cursor Idle Timeout Время скрытия курсора при бездействии - s сек - Controller Контроллер - Back Button Behavior Поведение кнопки назад - Graphics Графика - Graphics Device Графическое устройство - Width Ширина - Height Высота - Vblank Divider Делитель Vblank - Advanced Продвинутые - Enable Shaders Dumping Включить дамп шейдеров - Enable NULL GPU Включить NULL GPU - Paths Пути - Game Folders Игровые папки - Add... Добавить... - Remove Удалить - Debug Отладка - Enable Debug Dumping Включить отладочные дампы - Enable Vulkan Validation Layers Включить слои валидации Vulkan - Enable Vulkan Synchronization Validation Включить валидацию синхронизации Vulkan - Enable RenderDoc Debugging Включить отладку RenderDoc - Update Обновление - Check for Updates at Startup Проверка при запуске - Update Channel Канал обновления - Check for Updates Проверить обновления - GUI Settings Интерфейс - Disable Trophy Pop-ups Отключить уведомления о трофеях - Play title music Играть заглавную музыку - Update Compatibility Database On Startup Обновлять базу совместимости при запуске - Game Compatibility Совместимость игр - Display Compatibility Data Показывать данные совместимости - Update Compatibility Database Обновить базу совместимости - Volume Громкость - Audio Backend Звуковая Подсистема - - - MainWindow - - Game List - Список игр - - - - * Unsupported Vulkan Version - * Неподдерживаемая версия Vulkan - - - - Download Cheats For All Installed Games - Скачать читы для всех установленных игр - - - - Download Patches For All Games - Скачать патчи для всех игр - - - - Download Complete - Скачивание завершено - - - - You have downloaded cheats for all the games you have installed. - Вы скачали читы для всех установленных игр. - - - - Patches Downloaded Successfully! - Патчи успешно скачаны! - - - - All Patches available for all games have been downloaded. - Все доступные патчи для всех игр были скачаны. - - - - Games: - Игры: - - - - PKG File (*.PKG) - Файл PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Файлы ELF (*.bin *.elf *.oelf) - - - - Game Boot - Запуск игры - - - - Only one file can be selected! - Можно выбрать только один файл! - - - - PKG Extraction - Извлечение PKG - - - - Patch detected! - Обнаружен патч! - - - - PKG and Game versions match: - Версии PKG и игры совпадают: - - - - Would you like to overwrite? - Хотите перезаписать? - - - - PKG Version %1 is older than installed version: - Версия PKG %1 старее установленной версии: - - - - Game is installed: - Игра установлена: - - - - Would you like to install Patch: - Хотите установить патч: - - - - DLC Installation - Установка DLC - - - - Would you like to install DLC: %1? - Вы хотите установить DLC: %1? - - - - DLC already installed: - DLC уже установлен: - - - - Game already installed - Игра уже установлена - - - - PKG is a patch, please install the game first! - PKG - это патч, сначала установите игру! - - - - PKG ERROR - ОШИБКА PKG - - - - Extracting PKG %1/%2 - Извлечение PKG %1/%2 - - - - Extraction Finished - Извлечение завершено - - - - Game successfully installed at %1 - Игра успешно установлена в %1 - - - - File doesn't appear to be a valid PKG file - Файл не является допустимым файлом PKG - - - - CheatsPatches - - - Cheats / Patches for - Читы и патчи для - - - - defaultTextEdit_MSG - Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Изображение недоступно - - - - Serial: - Серийный номер: - - - - Version: - Версия: - - - - Size: - Размер: - - - - Select Cheat File: - Выберите файл чита: - - - - Repository: - Репозиторий: - - - - Download Cheats - Скачать читы - - - - Delete File - Удалить файл - - - - No files selected. - Файлы не выбраны. - - - - You can delete the cheats you don't want after downloading them. - Вы можете удалить ненужные читы после их скачивания. - - - - Do you want to delete the selected file?\n%1 - Вы хотите удалить выбранный файл?\n%1 - - - - Select Patch File: - Выберите файл патча: - - - - Download Patches - Скачать патчи - - - Save Сохранить - - Cheats - Читы - - - - Patches - Патчи - - - - Error - Ошибка - - - - No patch selected. - Патч не выбран. - - - - Unable to open files.json for reading. - Не удалось открыть файл files.json для чтения. - - - - No patch file found for the current serial. - Не найден файл патча для текущего серийного номера. - - - - Unable to open the file for reading. - Не удалось открыть файл для чтения. - - - - Unable to open the file for writing. - Не удалось открыть файл для записи. - - - - Failed to parse XML: - Не удалось разобрать XML: - - - - Success - Успех - - - - Options saved successfully. - Опции успешно сохранены. - - - - Invalid Source - Неверный источник - - - - The selected source is invalid. - Выбранный источник недействителен. - - - - File Exists - Файл существует - - - - File already exists. Do you want to replace it? - Файл уже существует. Хотите заменить его? - - - - Failed to save file: - Не удалось сохранить файл: - - - - Failed to download file: - Не удалось скачать файл: - - - - Cheats Not Found - Читы не найдены - - - - CheatsNotFound_MSG - Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. - - - - Cheats Downloaded Successfully - Читы успешно скачаны - - - - CheatsDownloadedSuccessfully_MSG - Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. - - - - Failed to save: - Не удалось сохранить: - - - - Failed to download: - Не удалось скачать: - - - - Download Complete - Скачивание завершено - - - - DownloadComplete_MSG - Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. - - - - Failed to parse JSON data from HTML. - Не удалось разобрать данные JSON из HTML. - - - - Failed to retrieve HTML page. - Не удалось получить HTML-страницу. - - - - The game is in version: %1 - Игра в версии: %1 - - - - The downloaded patch only works on version: %1 - Скачанный патч работает только на версии: %1 - - - - You may need to update your game. - Вам может понадобиться обновить игру. - - - - Incompatibility Notice - Уведомление о несовместимости - - - - Failed to open file: - Не удалось открыть файл: - - - - XML ERROR: - ОШИБКА XML: - - - - Failed to open files.json for writing - Не удалось открыть файл files.json для записи - - - - Author: - Автор: - - - - Directory does not exist: - Каталог не существует: - - - - Failed to open files.json for reading. - Не удалось открыть файл files.json для чтения. - - - - Name: - Имя: - - - - Can't apply cheats before the game is started - Невозможно применить читы до начала игры - - - - SettingsDialog - - - Save - Сохранить - - - Apply Применить - Restore Defaults По умолчанию - Close Закрыть - Point your mouse at an option to display its description. Наведите указатель мыши на опцию, чтобы отобразить ее описание. - consoleLanguageGroupBox Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык который поддерживается игрой, так как он может отличаться в зависимости от региона. - emulatorLanguageGroupBox Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. - fullscreenCheckBox Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nВы можете отключить это, нажав клавишу F11. - separateUpdatesCheckBox Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства. - showSplashCheckBox Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. - ps4proCheckBox Режим PS4 Pro:\nЗаставляет эмулятор работать как PS4 Pro, что может включить специальные функции в играх, поддерживающих это. - discordRPCCheckbox Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. - userName Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. - logFilter Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. - updaterGroupBox Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. - GUIgroupBox Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. - disableTrophycheckBox Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по прежнему можно отслеживать в меню Просмотр трофеев (правая кнопка мыши по игре в главном окне). - hideCursorGroupBox Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. - idleTimeoutGroupBox Установите время, через которое курсор исчезнет при бездействии. - backButtonBehaviorGroupBox Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. - enableCompatibilityCheckBox Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. - checkCompatibilityOnStartupCheckBox Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. - updateCompatibilityButton Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. - Never Никогда - Idle При бездействии - Always Всегда - Touchpad Left Тачпад слева - Touchpad Right Тачпад справа - Touchpad Center Центр тачпада - None Нет - graphicsAdapterGroupBox Графическое устройство:\nВ системах с несколькими GPU выберите GPU, который будет использовать эмулятор.\nВыберите "Auto Select", чтобы определить его автоматически. - resolutionLayout Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. - heightDivider Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! - dumpShadersCheckBox Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. - nullGpuCheckBox Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. - gameFoldersBox Игровые папки:\nСписок папок для проверки установленных игр. - addFolderButton Добавить:\nДобавить папку в список. - removeFolderButton Удалить:\nУдалить папку из списка. - debugDump Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. - vkValidationCheckBox Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. - vkSyncValidationCheckBox Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. - rdocCheckBox Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с Renderdoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. + + CheatsPatches + + Cheats / Patches for + Читы и патчи для + + + defaultTextEdit_MSG + Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Изображение недоступно + + + Serial: + Серийный номер: + + + Version: + Версия: + + + Size: + Размер: + + + Select Cheat File: + Выберите файл чита: + + + Repository: + Репозиторий: + + + Download Cheats + Скачать читы + + + Delete File + Удалить файл + + + No files selected. + Файлы не выбраны. + + + You can delete the cheats you don't want after downloading them. + Вы можете удалить ненужные читы после их скачивания. + + + Do you want to delete the selected file?\n%1 + Вы хотите удалить выбранный файл?\n%1 + + + Select Patch File: + Выберите файл патча: + + + Download Patches + Скачать патчи + + + Save + Сохранить + + + Cheats + Читы + + + Patches + Патчи + + + Error + Ошибка + + + No patch selected. + Патч не выбран. + + + Unable to open files.json for reading. + Не удалось открыть файл files.json для чтения. + + + No patch file found for the current serial. + Не найден файл патча для текущего серийного номера. + + + Unable to open the file for reading. + Не удалось открыть файл для чтения. + + + Unable to open the file for writing. + Не удалось открыть файл для записи. + + + Failed to parse XML: + Не удалось разобрать XML: + + + Success + Успех + + + Options saved successfully. + Опции успешно сохранены. + + + Invalid Source + Неверный источник + + + The selected source is invalid. + Выбранный источник недействителен. + + + File Exists + Файл существует + + + File already exists. Do you want to replace it? + Файл уже существует. Хотите заменить его? + + + Failed to save file: + Не удалось сохранить файл: + + + Failed to download file: + Не удалось скачать файл: + + + Cheats Not Found + Читы не найдены + + + CheatsNotFound_MSG + Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. + + + Cheats Downloaded Successfully + Читы успешно скачаны + + + CheatsDownloadedSuccessfully_MSG + Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. + + + Failed to save: + Не удалось сохранить: + + + Failed to download: + Не удалось скачать: + + + Download Complete + Скачивание завершено + + + DownloadComplete_MSG + Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. + + + Failed to parse JSON data from HTML. + Не удалось разобрать данные JSON из HTML. + + + Failed to retrieve HTML page. + Не удалось получить HTML-страницу. + + + The game is in version: %1 + Игра в версии: %1 + + + The downloaded patch only works on version: %1 + Скачанный патч работает только на версии: %1 + + + You may need to update your game. + Вам может понадобиться обновить игру. + + + Incompatibility Notice + Уведомление о несовместимости + + + Failed to open file: + Не удалось открыть файл: + + + XML ERROR: + ОШИБКА XML: + + + Failed to open files.json for writing + Не удалось открыть файл files.json для записи + + + Author: + Автор: + + + Directory does not exist: + Каталог не существует: + + + Failed to open files.json for reading. + Не удалось открыть файл files.json для чтения. + + + Name: + Имя: + + + Can't apply cheats before the game is started + Невозможно применить читы до начала игры + + GameListFrame - Icon Иконка - Name Название - Serial Серийный номер - Compatibility Совместимость - Region Регион - Firmware Прошивка - Size Размер - Version Версия - Path Путь - Play Time Времени в игре - Never Played Вы не играли - h ч - m м - s с - Compatibility is untested Совместимость не проверена - Game does not initialize properly / crashes the emulator Игра не иницализируется правильно / крашит эмулятор - Game boots, but only displays a blank screen Игра запускается, но показывает только пустой экран - Game displays an image but does not go past the menu Игра показывает картинку, но не проходит дальше меню - Game has game-breaking glitches or unplayable performance Игра имеет ломающие игру глюки или плохую производительность - Game can be completed with playable performance and no major glitches Игра может быть пройдена с хорошей производительностью и без серьезных сбоев @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Автообновление - Error Ошибка - Network error: Сетевая ошибка: - Failed to parse update information. Не удалось разобрать информацию об обновлении. - No pre-releases found. Предварительных версий не найдено. - Invalid release data. Недопустимые данные релиза. - No download URL found for the specified asset. Не найден URL для загрузки указанного ресурса. - Your version is already up to date! Ваша версия уже обновлена! - Update Available Доступно обновление - Update Channel Канал обновления - Current Version Текущая версия - Latest Version Последняя версия - Do you want to update? Вы хотите обновиться? - Show Changelog Показать журнал изменений - Check for Updates at Startup Проверка при запуске - Update Обновить - No Нет - Hide Changelog Скрыть журнал изменений - Changes Журнал изменений - Network error occurred while trying to access the URL Произошла сетевая ошибка при попытке доступа к URL - Download Complete Скачивание завершено - The update has been downloaded, press OK to install. Обновление загружено, нажмите OK для установки. - Failed to save the update file at Не удалось сохранить файл обновления в - Starting Update... Начало обновления... - Failed to create the update script file Не удалось создать файл скрипта обновления @@ -1636,29 +1313,24 @@ GameListUtils - B Б - KB КБ - MB МБ - GB ГБ - TB ТБ - + \ No newline at end of file diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 1df2a40e2..80f3876d4 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Rreth shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. - This software should not be used to play games you have not legally obtained. Ky program nuk duhet përdorur për të luajtur lojëra që nuk ke marrë ligjërisht. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Hap Dosjen @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Po ngarkohet lista e lojërave, të lutem prit :3 - Cancel Anulo - Loading... Duke ngarkuar... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Përzgjidh dosjen - Select which directory you want to install to. Përzgjidh në cilën dosje do që të instalosh. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Përzgjidh dosjen - Directory to install games Dosja ku do instalohen lojërat - Browse Shfleto - Error Gabim - The value for location to install games is not valid. Vlera për vendndodhjen e instalimit të lojërave nuk është e vlefshme. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Krijo Shkurtore - Cheats / Patches Mashtrime / Arna - SFO Viewer Shikuesi i SFO - Trophy Viewer Shikuesi i Trofeve - Open Folder... Hap Dosjen... - Open Game Folder Hap Dosjen e Lojës - Open Save Data Folder Hap Dosjen e të Dhënave të Ruajtura - Open Log Folder Hap Dosjen e Ditarit - Copy info... Kopjo informacionin... - Copy Name Kopjo Emrin - Copy Serial Kopjo Serikun - Copy All Kopjo të Gjitha - Delete... Fshi... - Delete Game Fshi lojën - Delete Update Fshi përditësimin - Delete DLC Fshi DLC-në - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Krijimi i shkurtores - Shortcut created successfully! Shkurtorja u krijua me sukses! - Error Gabim - Error creating shortcut! Gabim në krijimin e shkurtores! - Install PKG Instalo PKG - Game Loja - requiresEnableSeparateUpdateFolder_MSG Kjo veçori kërkon cilësimin 'Aktivizo dosjen e ndarë të përditësimit' për të punuar. Në qoftë se do ta përdorësh këtë veçori, të lutem aktivizoje. - This game has no update to delete! Kjo lojë nuk ka përditësim për të fshirë! - - + Update Përditësim - This game has no DLC to delete! Kjo lojë nuk ka DLC për të fshirë! - DLC DLC - Delete %1 Fshi %1 - Are you sure you want to delete %1's %2 directory? Je i sigurt që do të fsish dosjen %2 të %1? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Hap/Shto Dosje ELF - Install Packages (PKG) Instalo Paketat (PKG) - Boot Game Nis Lojën - Check for Updates Kontrollo për përditësime - About shadPS4 Rreth shadPS4 - Configure... Konfiguro... - Install application from a .pkg file Instalo aplikacionin nga një skedar .pkg - Recent Games Lojërat e fundit - Exit Dil - Exit shadPS4 Dil nga shadPS4 - Exit the application. Dil nga aplikacioni. - Show Game List Shfaq Listën e Lojërave - Game List Refresh Rifresko Listën e Lojërave - Tiny Të vockla - Small Të vogla - Medium Të mesme - Large Të mëdha - List View Pamja e Listës - Grid View Pamja e Rrjetës - Elf Viewer Shikuesi i Elf - Game Install Directory Dosja e Instalimit të Lojës - Download Cheats/Patches Shkarko Mashtrime/Arna - Dump Game List Zbraz Listën e Lojërave - PKG Viewer Shikuesi i PKG - Search... Kërko... - File Skedari - View Pamja - Game List Icons Ikonat e Listës së Lojërave - Game List Mode Mënyra e Listës së Lojërave - Settings Cilësimet - Utils Shërbimet - Themes Motivet - Help Ndihmë - Dark E errët - Light E çelët - Green E gjelbër - Blue E kaltër - Violet Vjollcë - toolBar Shiriti i veglave + + Game List + Lista e lojërave + + + * Unsupported Vulkan Version + * Version i pambështetur i Vulkan + + + Download Cheats For All Installed Games + Shkarko Mashtrime Për Të Gjitha Lojërat e Instaluara + + + Download Patches For All Games + Shkarko Arna Për Të Gjitha Lojërat e Instaluara + + + Download Complete + Shkarkimi Përfundoi + + + You have downloaded cheats for all the games you have installed. + Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. + + + Patches Downloaded Successfully! + Arnat u shkarkuan me sukses! + + + All Patches available for all games have been downloaded. + Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. + + + Games: + Lojërat: + + + PKG File (*.PKG) + Skedar PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Skedarë ELF (*.bin *.elf *.oelf) + + + Game Boot + Nis Lojën + + + Only one file can be selected! + Mund të përzgjidhet vetëm një skedar! + + + PKG Extraction + Nxjerrja e PKG-së + + + Patch detected! + U zbulua një arnë! + + + PKG and Game versions match: + PKG-ja dhe versioni i Lojës përputhen: + + + Would you like to overwrite? + Dëshiron të mbishkruash? + + + PKG Version %1 is older than installed version: + Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: + + + Game is installed: + Loja është instaluar: + + + Would you like to install Patch: + Dëshiron të instalosh Arnën: + + + DLC Installation + Instalimi i DLC-ve + + + Would you like to install DLC: %1? + Dëshiron të instalosh DLC-në: %1? + + + DLC already installed: + DLC-ja është instaluar tashmë: + + + Game already installed + Loja është instaluar tashmë + + + PKG is a patch, please install the game first! + PKG-ja është një arnë, të lutem instalo lojën fillimisht! + + + PKG ERROR + GABIM PKG + + + Extracting PKG %1/%2 + Po nxirret PKG-ja %1/%2 + + + Extraction Finished + Nxjerrja Përfundoi + + + Game successfully installed at %1 + Loja u instalua me sukses në %1 + + + File doesn't appear to be a valid PKG file + Skedari nuk duket si skedar PKG i vlefshëm + PKGViewer - Open Folder Hap Dosjen @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Shikuesi i Trofeve @@ -478,1029 +509,700 @@ SettingsDialog - Settings Cilësimet - General Të përgjithshme - System Sistemi - Console Language Gjuha e Konsolës - Emulator Language Gjuha e emulatorit - Emulator Emulatori - Enable Fullscreen Aktivizo Ekranin e plotë - Enable Separate Update Folder Aktivizo dosjen e ndarë të përditësimit - Show Splash Shfaq Pamjen e nisjes - Is PS4 Pro Mënyra PS4 Pro - Enable Discord Rich Presence Aktivizo Discord Rich Presence - Username Përdoruesi - Trophy Key Trophy Key - Trophy Trophy - Logger Regjistruesi i ditarit - Log Type Lloji i Ditarit - Log Filter Filtri i Ditarit - Input Hyrja - Cursor Kursori - Hide Cursor Fshih kursorin - Hide Cursor Idle Timeout Koha për fshehjen e kursorit joaktiv - s s - Controller Dorezë - Back Button Behavior Sjellja e butonit mbrapa - Graphics Grafika - Graphics Device Pajisja e Grafikës - Width Gjerësia - Height Lartësia - Vblank Divider Ndarës Vblank - Advanced Të përparuara - Enable Shaders Dumping Aktivizo Zbrazjen e Shaders-ave - Enable NULL GPU Aktivizo GPU-në NULL - Paths Shtigjet - Game Folders Dosjet e lojës - Add... Shto... - Remove Hiq - Debug Korrigjim - Enable Debug Dumping Aktivizo Zbrazjen për Korrigjim - Enable Vulkan Validation Layers Aktivizo Shtresat e Vlefshmërisë Vulkan - Enable Vulkan Synchronization Validation Aktivizo Vërtetimin e Sinkronizimit Vulkan - Enable RenderDoc Debugging Aktivizo Korrigjimin RenderDoc - Update Përditëso - Check for Updates at Startup Kontrollo për përditësime në nisje - Update Channel Kanali i përditësimit - Check for Updates Kontrollo për përditësime - GUI Settings Cilësimet e GUI - Disable Trophy Pop-ups Çaktivizo njoftimet për Trofetë - Play title music Luaj muzikën e titullit - Update Compatibility Database On Startup Përditëso bazën e të dhënave të përputhshmërisë gjatë nisjes - Game Compatibility Përputhshmëria e lojës - Display Compatibility Data Shfaq të dhënat e përputhshmërisë - Update Compatibility Database Përditëso bazën e të dhënave të përputhshmërisë - Volume Vëllimi i zërit - Audio Backend Audio Backend - - - MainWindow - - Game List - Lista e lojërave - - - - * Unsupported Vulkan Version - * Version i pambështetur i Vulkan - - - - Download Cheats For All Installed Games - Shkarko Mashtrime Për Të Gjitha Lojërat e Instaluara - - - - Download Patches For All Games - Shkarko Arna Për Të Gjitha Lojërat e Instaluara - - - - Download Complete - Shkarkimi Përfundoi - - - - You have downloaded cheats for all the games you have installed. - Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. - - - - Patches Downloaded Successfully! - Arnat u shkarkuan me sukses! - - - - All Patches available for all games have been downloaded. - Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. - - - - Games: - Lojërat: - - - - PKG File (*.PKG) - Skedar PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Skedarë ELF (*.bin *.elf *.oelf) - - - - Game Boot - Nis Lojën - - - - Only one file can be selected! - Mund të përzgjidhet vetëm një skedar! - - - - PKG Extraction - Nxjerrja e PKG-së - - - - Patch detected! - U zbulua një arnë! - - - - PKG and Game versions match: - PKG-ja dhe versioni i Lojës përputhen: - - - - Would you like to overwrite? - Dëshiron të mbishkruash? - - - - PKG Version %1 is older than installed version: - Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: - - - - Game is installed: - Loja është instaluar: - - - - Would you like to install Patch: - Dëshiron të instalosh Arnën: - - - - DLC Installation - Instalimi i DLC-ve - - - - Would you like to install DLC: %1? - Dëshiron të instalosh DLC-në: %1? - - - - DLC already installed: - DLC-ja është instaluar tashmë: - - - - Game already installed - Loja është instaluar tashmë - - - - PKG is a patch, please install the game first! - PKG-ja është një arnë, të lutem instalo lojën fillimisht! - - - - PKG ERROR - GABIM PKG - - - - Extracting PKG %1/%2 - Po nxirret PKG-ja %1/%2 - - - - Extraction Finished - Nxjerrja Përfundoi - - - - Game successfully installed at %1 - Loja u instalua me sukses në %1 - - - - File doesn't appear to be a valid PKG file - Skedari nuk duket si skedar PKG i vlefshëm - - - - CheatsPatches - - - Cheats / Patches for - Mashtrime / Arna për - - - - defaultTextEdit_MSG - Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Nuk ofrohet asnjë imazh - - - - Serial: - Seriku: - - - - Version: - Versioni: - - - - Size: - Madhësia: - - - - Select Cheat File: - Përzgjidh Skedarin e Mashtrimit: - - - - Repository: - Depo: - - - - Download Cheats - Shkarko Mashtrimet - - - - Delete File - Fshi Skedarin - - - - No files selected. - Nuk u zgjodh asnjë skedar. - - - - You can delete the cheats you don't want after downloading them. - Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. - - - - Do you want to delete the selected file?\n%1 - Dëshiron të fshish skedarin e përzgjedhur?\n%1 - - - - Select Patch File: - Përzgjidh Skedarin e Arnës: - - - - Download Patches - Shkarko Arnat - - - Save Ruaj - - Cheats - Mashtrime - - - - Patches - Arna - - - - Error - Gabim - - - - No patch selected. - Asnjë arnë e përzgjedhur. - - - - Unable to open files.json for reading. - files.json nuk mund të hapet për lexim. - - - - No patch file found for the current serial. - Nuk u gjet asnjë skedar patch për serikun aktual. - - - - Unable to open the file for reading. - Skedari nuk mund të hapet për lexim. - - - - Unable to open the file for writing. - Skedari nuk mund të hapet për shkrim. - - - - Failed to parse XML: - Analiza e XML-së dështoi: - - - - Success - Sukses - - - - Options saved successfully. - Rregullimet u ruajtën me sukses. - - - - Invalid Source - Burim i pavlefshëm - - - - The selected source is invalid. - Burimi i përzgjedhur është i pavlefshëm. - - - - File Exists - Skedari Ekziston - - - - File already exists. Do you want to replace it? - Skedari ekziston tashmë. Dëshiron ta zëvendësosh? - - - - Failed to save file: - Ruajtja e skedarit dështoi: - - - - Failed to download file: - Shkarkimi i skedarit dështoi: - - - - Cheats Not Found - Mashtrimet nuk u gjetën - - - - CheatsNotFound_MSG - Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. - - - - Cheats Downloaded Successfully - Mashtrimet u shkarkuan me sukses - - - - CheatsDownloadedSuccessfully_MSG - Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. - - - - Failed to save: - Ruajtja dështoi: - - - - Failed to download: - Shkarkimi dështoi: - - - - Download Complete - Shkarkimi përfundoi - - - - DownloadComplete_MSG - Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse arna nuk shfaqet, mund të mos ekzistojë për numrin e serikut dhe versionin specifik të lojës. - - - - Failed to parse JSON data from HTML. - Analiza e të dhënave JSON nga HTML dështoi. - - - - Failed to retrieve HTML page. - Gjetja e faqes HTML dështoi. - - - - The game is in version: %1 - Loja është në versionin: %1 - - - - The downloaded patch only works on version: %1 - Arna e shkarkuar funksionon vetëm në versionin: %1 - - - - You may need to update your game. - Mund të duhet të përditësosh lojën tënde. - - - - Incompatibility Notice - Njoftim për papajtueshmëri - - - - Failed to open file: - Hapja e skedarit dështoi: - - - - XML ERROR: - GABIM XML: - - - - Failed to open files.json for writing - Hapja e files.json për shkrim dështoi - - - - Author: - Autori: - - - - Directory does not exist: - Dosja nuk ekziston: - - - - Failed to open files.json for reading. - Hapja e files.json për lexim dështoi. - - - - Name: - Emri: - - - - Can't apply cheats before the game is started - Nuk mund të zbatohen mashtrime para fillimit të lojës. - - - - SettingsDialog - - - Save - Ruaj - - - Apply Zbato - Restore Defaults Rikthe paracaktimet - Close Mbyll - Point your mouse at an option to display its description. Vendos miun mbi një rregullim për të shfaqur përshkrimin e tij. - consoleLanguageGroupBox Gjuha e konsolës:\nPërcakton gjuhën që përdor loja PS4.\nKëshillohet të caktosh një gjuhë që loja mbështet, e cila do të ndryshojë sipas rajonit. - emulatorLanguageGroupBox Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. - fullscreenCheckBox Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës në mënyrën e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur tastin F11. - separateUpdatesCheckBox Aktivizo dosjen e ndarë të përditësimit:\nAktivizon instalimin e përditësimeve të lojërave në dosje të veçanta për menaxhim më të lehtë.\nKjo mund të krijohet manualisht duke shtuar përditësimin e shpaketuar në dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID-në e lojës. - showSplashCheckBox Shfaq ekranin e ngarkesës:\nShfaq ekranin e ngarkesës së lojës (një pamje e veçantë) gjatë fillimit të lojës. - ps4proCheckBox Është PS4 Pro:\nBën që emulatori të veprojë si një PS4 PRO, gjë që mund të aktivizojë veçori të veçanta në lojrat që e mbështesin. - discordRPCCheckbox Aktivizo Discord Rich Presence:\nShfaq ikonën e emulatorit dhe informacionin përkatës në profilin tënd në Discord. - userName Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Lloji i ditarit:\nPërcakton nëse të sinkronizohet dalja e dritares së ditarit për performancë. Mund të ketë efekte të këqija në emulim. - logFilter Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. - updaterGroupBox Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. - GUIgroupBox Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në GUI. - disableTrophycheckBox Çaktivizo njoftimet për Trofetë:\nÇaktivizo njoftimet për trofetë gjatë lojës. Përparimi i trofeve mund të ndiqet duke përdorur Shikuesin e Trofeve (kliko me të djathtën mbi lojën në dritaren kryesore). - hideCursorGroupBox Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nInaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. - idleTimeoutGroupBox Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja (në sekonda) pas së cilës kursori që nuk ka qënë në veprim fshihet. - backButtonBehaviorGroupBox Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mprapa. - enableCompatibilityCheckBox Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për të marrë informacion të përditësuar. - checkCompatibilityOnStartupCheckBox Përditëso përputhshmërinë gjatë nisjes:\nPërditëson automatikisht bazën e të dhënave të përputhshmërisë kur shadPS4 niset. - updateCompatibilityButton Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. - Never Kurrë - Idle Joaktiv - Always Gjithmonë - Touchpad Left Tastiera prekëse majtas - Touchpad Right Tastiera prekëse djathtas - Touchpad Center Tastiera prekëse në qendër - None Asnjë - graphicsAdapterGroupBox Pajisja grafike:\nNë sistemet me GPU të shumëfishta, zgjidh GPU-në që do të përdorë emulatori nga lista rënëse,\nose zgjidh "Auto Select" për ta përcaktuar automatikisht. - resolutionLayout Gjerësia/Lartësia:\nPërcakton madhësinë e dritares së emulatorit në nisje, e cila mund të rregullohet gjatë lojës.\nKjo është ndryshe nga rezolucioni në lojë. - heightDivider Ndarësi Vblank:\nFrekuenca pamore me të cilën rifreskohet emulatori shumëzohet me këtë numër. Ndryshimi i këtij mund të ketë efekte të këqija, si rritja e shpejtësisë së lojës ose prishja e punimit thelbësor të lojës që nuk e pret këtë ndryshim! - dumpShadersCheckBox Aktivizo zbrazjen e shaders-ave:\nPër qëllime të korrigjimit teknik, ruan shaders-at e lojës në një dosje ndërsa ato pasqyrohen. - nullGpuCheckBox Aktivizo GPU-në Null:\nPër qëllime të korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike. - gameFoldersBox Dosjet e lojërave:\nLista e dosjeve për të kontrolluar lojërat e instaluara. - addFolderButton Shto:\nShto një dosje në listë. - removeFolderButton Hiq:\nHiq një dosje nga lista. - debugDump Aktivizo zbrazjen për korrigjim:\nRuan simbolet e importit dhe eksportit dhe informacionin e kreut të skedarit për aplikacionin PS4 që po ekzekutohet në një dosje. - vkValidationCheckBox Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - vkSyncValidationCheckBox Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - rdocCheckBox Aktivizo korrigjimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e pamjes të pasqyruar në moment. + + CheatsPatches + + Cheats / Patches for + Mashtrime / Arna për + + + defaultTextEdit_MSG + Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nuk ofrohet asnjë imazh + + + Serial: + Seriku: + + + Version: + Versioni: + + + Size: + Madhësia: + + + Select Cheat File: + Përzgjidh Skedarin e Mashtrimit: + + + Repository: + Depo: + + + Download Cheats + Shkarko Mashtrimet + + + Delete File + Fshi Skedarin + + + No files selected. + Nuk u zgjodh asnjë skedar. + + + You can delete the cheats you don't want after downloading them. + Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. + + + Do you want to delete the selected file?\n%1 + Dëshiron të fshish skedarin e përzgjedhur?\n%1 + + + Select Patch File: + Përzgjidh Skedarin e Arnës: + + + Download Patches + Shkarko Arnat + + + Save + Ruaj + + + Cheats + Mashtrime + + + Patches + Arna + + + Error + Gabim + + + No patch selected. + Asnjë arnë e përzgjedhur. + + + Unable to open files.json for reading. + files.json nuk mund të hapet për lexim. + + + No patch file found for the current serial. + Nuk u gjet asnjë skedar patch për serikun aktual. + + + Unable to open the file for reading. + Skedari nuk mund të hapet për lexim. + + + Unable to open the file for writing. + Skedari nuk mund të hapet për shkrim. + + + Failed to parse XML: + Analiza e XML-së dështoi: + + + Success + Sukses + + + Options saved successfully. + Rregullimet u ruajtën me sukses. + + + Invalid Source + Burim i pavlefshëm + + + The selected source is invalid. + Burimi i përzgjedhur është i pavlefshëm. + + + File Exists + Skedari Ekziston + + + File already exists. Do you want to replace it? + Skedari ekziston tashmë. Dëshiron ta zëvendësosh? + + + Failed to save file: + Ruajtja e skedarit dështoi: + + + Failed to download file: + Shkarkimi i skedarit dështoi: + + + Cheats Not Found + Mashtrimet nuk u gjetën + + + CheatsNotFound_MSG + Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. + + + Cheats Downloaded Successfully + Mashtrimet u shkarkuan me sukses + + + CheatsDownloadedSuccessfully_MSG + Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. + + + Failed to save: + Ruajtja dështoi: + + + Failed to download: + Shkarkimi dështoi: + + + Download Complete + Shkarkimi përfundoi + + + DownloadComplete_MSG + Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse arna nuk shfaqet, mund të mos ekzistojë për numrin e serikut dhe versionin specifik të lojës. + + + Failed to parse JSON data from HTML. + Analiza e të dhënave JSON nga HTML dështoi. + + + Failed to retrieve HTML page. + Gjetja e faqes HTML dështoi. + + + The game is in version: %1 + Loja është në versionin: %1 + + + The downloaded patch only works on version: %1 + Arna e shkarkuar funksionon vetëm në versionin: %1 + + + You may need to update your game. + Mund të duhet të përditësosh lojën tënde. + + + Incompatibility Notice + Njoftim për papajtueshmëri + + + Failed to open file: + Hapja e skedarit dështoi: + + + XML ERROR: + GABIM XML: + + + Failed to open files.json for writing + Hapja e files.json për shkrim dështoi + + + Author: + Autori: + + + Directory does not exist: + Dosja nuk ekziston: + + + Failed to open files.json for reading. + Hapja e files.json për lexim dështoi. + + + Name: + Emri: + + + Can't apply cheats before the game is started + Nuk mund të zbatohen mashtrime para fillimit të lojës. + + GameListFrame - Icon Ikona - Name Emri - Serial Seriku - Compatibility Përputhshmëria - Region Rajoni - Firmware Firmueri - Size Madhësia - Version Versioni - Path Shtegu - Play Time Koha e luajtjes - Never Played Nuk është luajtur kurrë - h h - m m - s s - Compatibility is untested Përputhshmëria nuk është e testuar - Game does not initialize properly / crashes the emulator Loja nuk niset siç duhet / rrëzon emulatorin - Game boots, but only displays a blank screen Loja niset, por shfaq vetëm një ekran të zbrazët - Game displays an image but does not go past the menu Loja shfaq një imazh, por nuk kalon përtej menysë - Game has game-breaking glitches or unplayable performance Loja ka probleme kritike ose performancë të papërshtatshme për lojë - Game can be completed with playable performance and no major glitches Loja mund të përfundohet me performancë të luajtshme dhe pa probleme të mëdha @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Përditësues automatik - Error Gabim - Network error: Gabim rrjeti: - Failed to parse update information. Analizimi i informacionit të përditësimit deshtoi. - No pre-releases found. Nuk u gjetën botime paraprake. - Invalid release data. Të dhënat e lëshimit janë të pavlefshme. - No download URL found for the specified asset. Nuk u gjet URL-ja e shkarkimit për burimin e specifikuar. - Your version is already up to date! Versioni jotë është i përditësuar tashmë! - Update Available Ofrohet një përditësim - Update Channel Kanali i përditësimit - Current Version Versioni i tanishëm - Latest Version Versioni më i fundit - Do you want to update? Do të përditësosh? - Show Changelog Trego ndryshimet - Check for Updates at Startup Kontrollo për përditësime në nisje - Update Përditëso - No Jo - Hide Changelog Fshih ndryshimet - Changes Ndryshimet - Network error occurred while trying to access the URL Ka ndodhur një gabim rrjeti gjatë përpjekjes për të qasur në URL-në - Download Complete Shkarkimi përfundoi - The update has been downloaded, press OK to install. Përditësimi është shkarkuar, shtyp OK për ta instaluar. - Failed to save the update file at Dështoi ruajtja e skedarit të përditësimit në - Starting Update... Po fillon përditësimi... - Failed to create the update script file Krijimi i skedarit skript të përditësimit dështoi @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + - + \ No newline at end of file diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index a03a48660..48f291e99 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 shadPS4 Hakkında - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. - This software should not be used to play games you have not legally obtained. Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Klasörü Aç @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Oyun listesi yükleniyor, lütfen bekleyin :3 - Cancel İptal - Loading... Yükleniyor... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Klasörü Seç - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Klasörü Seç - Directory to install games Oyunların yükleneceği klasör - Browse Gözat - Error Hata - The value for location to install games is not valid. Oyunların yükleneceği konum için girilen klasör geçerli değil. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Kısayol Oluştur - Cheats / Patches Hileler / Yamanlar - SFO Viewer SFO Görüntüleyici - Trophy Viewer Kupa Görüntüleyici - Open Folder... Klasörü Aç... - Open Game Folder Oyun Klasörünü Aç - Open Save Data Folder Kaydetme Verileri Klasörünü Aç - Open Log Folder Log Klasörünü Aç - Copy info... Bilgiyi Kopyala... - Copy Name Adı Kopyala - Copy Serial Seri Numarasını Kopyala - Copy All Tümünü Kopyala - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Kısayol oluşturma - Shortcut created successfully! Kısayol başarıyla oluşturuldu! - Error Hata - Error creating shortcut! Kısayol oluşturulurken hata oluştu! - Install PKG PKG Yükle - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Elf Klasörünü Aç/Ekle - Install Packages (PKG) Paketleri Kur (PKG) - Boot Game Oyunu Başlat - Check for Updates Güncellemeleri kontrol et - About shadPS4 shadPS4 Hakkında - Configure... Yapılandır... - Install application from a .pkg file .pkg dosyasından uygulama yükle - Recent Games Son Oyunlar - Exit Çıkış - Exit shadPS4 shadPS4'ten Çık - Exit the application. Uygulamadan çık. - Show Game List Oyun Listesini Göster - Game List Refresh Oyun Listesini Yenile - Tiny Küçük - Small Ufak - Medium Orta - Large Büyük - List View Liste Görünümü - Grid View Izgara Görünümü - Elf Viewer Elf Görüntüleyici - Game Install Directory Oyun Kurulum Klasörü - Download Cheats/Patches Hileleri/Yamaları İndir - Dump Game List Oyun Listesini Kaydet - PKG Viewer PKG Görüntüleyici - Search... Ara... - File Dosya - View Görünüm - Game List Icons Oyun Listesi Simgeleri - Game List Mode Oyun Listesi Modu - Settings Ayarlar - Utils Yardımcı Araçlar - Themes Temalar - Help Yardım - Dark Koyu - Light Açık - Green Yeşil - Blue Mavi - Violet Mor - toolBar Araç Çubuğu + + Game List + Oyun Listesi + + + * Unsupported Vulkan Version + * Desteklenmeyen Vulkan Sürümü + + + Download Cheats For All Installed Games + Tüm Yüklenmiş Oyunlar İçin Hileleri İndir + + + Download Patches For All Games + Tüm Oyunlar İçin Yamaları İndir + + + Download Complete + İndirme Tamamlandı + + + You have downloaded cheats for all the games you have installed. + Yüklediğiniz tüm oyunlar için hileleri indirdiniz. + + + Patches Downloaded Successfully! + Yamalar Başarıyla İndirildi! + + + All Patches available for all games have been downloaded. + Tüm oyunlar için mevcut tüm yamalar indirildi. + + + Games: + Oyunlar: + + + PKG File (*.PKG) + PKG Dosyası (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF Dosyaları (*.bin *.elf *.oelf) + + + Game Boot + Oyun Başlatma + + + Only one file can be selected! + Sadece bir dosya seçilebilir! + + + PKG Extraction + PKG Çıkartma + + + Patch detected! + Yama tespit edildi! + + + PKG and Game versions match: + PKG ve oyun sürümleri uyumlu: + + + Would you like to overwrite? + Üzerine yazmak ister misiniz? + + + PKG Version %1 is older than installed version: + PKG Sürümü %1, kurulu sürümden daha eski: + + + Game is installed: + Oyun yüklendi: + + + Would you like to install Patch: + Yamanın yüklenmesini ister misiniz: + + + DLC Installation + DLC Yükleme + + + Would you like to install DLC: %1? + DLC'yi yüklemek ister misiniz: %1? + + + DLC already installed: + DLC zaten yüklü: + + + Game already installed + Oyun zaten yüklü + + + PKG is a patch, please install the game first! + PKG bir yama, lütfen önce oyunu yükleyin! + + + PKG ERROR + PKG HATASI + + + Extracting PKG %1/%2 + PKG Çıkarılıyor %1/%2 + + + Extraction Finished + Çıkarma Tamamlandı + + + Game successfully installed at %1 + Oyun başarıyla %1 konumuna yüklendi + + + File doesn't appear to be a valid PKG file + Dosya geçerli bir PKG dosyası gibi görünmüyor + PKGViewer - Open Folder Klasörü Aç @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Kupa Görüntüleyici @@ -478,1029 +509,700 @@ SettingsDialog - Settings Ayarlar - General Genel - System Sistem - Console Language Konsol Dili - Emulator Language Emülatör Dili - Emulator Emülatör - Enable Fullscreen Tam Ekranı Etkinleştir - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Başlangıç Ekranını Göster - Is PS4 Pro PS4 Pro - Enable Discord Rich Presence Discord Rich Presence'i etkinleştir - Username Kullanıcı Adı - Trophy Key Trophy Key - Trophy Trophy - Logger Kayıt Tutucu - Log Type Kayıt Türü - Log Filter Kayıt Filtresi - Input Girdi - Cursor İmleç - Hide Cursor İmleci Gizle - Hide Cursor Idle Timeout İmleç İçin Hareketsizlik Zaman Aşımı - s s - Controller Kontrolcü - Back Button Behavior Geri Dön Butonu Davranışı - Graphics Grafikler - Graphics Device Grafik Cihazı - Width Genişlik - Height Yükseklik - Vblank Divider Vblank Bölücü - Advanced Gelişmiş - Enable Shaders Dumping Shader Kaydını Etkinleştir - Enable NULL GPU NULL GPU'yu Etkinleştir - Paths Yollar - Game Folders Oyun Klasörleri - Add... Ekle... - Remove Kaldır - Debug Hata Ayıklama - Enable Debug Dumping Hata Ayıklama Dökümü Etkinleştir - Enable Vulkan Validation Layers Vulkan Doğrulama Katmanlarını Etkinleştir - Enable Vulkan Synchronization Validation Vulkan Senkronizasyon Doğrulamasını Etkinleştir - Enable RenderDoc Debugging RenderDoc Hata Ayıklamayı Etkinleştir - Update Güncelle - Check for Updates at Startup Başlangıçta güncellemeleri kontrol et - Update Channel Güncelleme Kanalı - Check for Updates Güncellemeleri Kontrol Et - GUI Settings GUI Ayarları - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Başlık müziğini çal - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Ses seviyesi - Audio Backend Audio Backend - - - MainWindow - - Game List - Oyun Listesi - - - - * Unsupported Vulkan Version - * Desteklenmeyen Vulkan Sürümü - - - - Download Cheats For All Installed Games - Tüm Yüklenmiş Oyunlar İçin Hileleri İndir - - - - Download Patches For All Games - Tüm Oyunlar İçin Yamaları İndir - - - - Download Complete - İndirme Tamamlandı - - - - You have downloaded cheats for all the games you have installed. - Yüklediğiniz tüm oyunlar için hileleri indirdiniz. - - - - Patches Downloaded Successfully! - Yamalar Başarıyla İndirildi! - - - - All Patches available for all games have been downloaded. - Tüm oyunlar için mevcut tüm yamalar indirildi. - - - - Games: - Oyunlar: - - - - PKG File (*.PKG) - PKG Dosyası (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF Dosyaları (*.bin *.elf *.oelf) - - - - Game Boot - Oyun Başlatma - - - - Only one file can be selected! - Sadece bir dosya seçilebilir! - - - - PKG Extraction - PKG Çıkartma - - - - Patch detected! - Yama tespit edildi! - - - - PKG and Game versions match: - PKG ve oyun sürümleri uyumlu: - - - - Would you like to overwrite? - Üzerine yazmak ister misiniz? - - - - PKG Version %1 is older than installed version: - PKG Sürümü %1, kurulu sürümden daha eski: - - - - Game is installed: - Oyun yüklendi: - - - - Would you like to install Patch: - Yamanın yüklenmesini ister misiniz: - - - - DLC Installation - DLC Yükleme - - - - Would you like to install DLC: %1? - DLC'yi yüklemek ister misiniz: %1? - - - - DLC already installed: - DLC zaten yüklü: - - - - Game already installed - Oyun zaten yüklü - - - - PKG is a patch, please install the game first! - PKG bir yama, lütfen önce oyunu yükleyin! - - - - PKG ERROR - PKG HATASI - - - - Extracting PKG %1/%2 - PKG Çıkarılıyor %1/%2 - - - - Extraction Finished - Çıkarma Tamamlandı - - - - Game successfully installed at %1 - Oyun başarıyla %1 konumuna yüklendi - - - - File doesn't appear to be a valid PKG file - Dosya geçerli bir PKG dosyası gibi görünmüyor - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Görüntü Mevcut Değil - - - - Serial: - Seri Numarası: - - - - Version: - Sürüm: - - - - Size: - Boyut: - - - - Select Cheat File: - Hile Dosyasını Seçin: - - - - Repository: - Depo: - - - - Download Cheats - Hileleri İndir - - - - Delete File - Dosyayı Sil - - - - No files selected. - Hiçbir dosya seçilmedi. - - - - You can delete the cheats you don't want after downloading them. - İndirdikten sonra istemediğiniz hileleri silebilirsiniz. - - - - Do you want to delete the selected file?\n%1 - Seçilen dosyayı silmek istiyor musunuz?\n%1 - - - - Select Patch File: - Yama Dosyasını Seçin: - - - - Download Patches - Yamaları İndir - - - Save Kaydet - - Cheats - Hileler - - - - Patches - Yamalar - - - - Error - Hata - - - - No patch selected. - Hiç yama seçilmedi. - - - - Unable to open files.json for reading. - files.json dosyası okumak için açılamadı. - - - - No patch file found for the current serial. - Mevcut seri numarası için hiç yama dosyası bulunamadı. - - - - Unable to open the file for reading. - Dosya okumak için açılamadı. - - - - Unable to open the file for writing. - Dosya yazmak için açılamadı. - - - - Failed to parse XML: - XML ayrıştırılamadı: - - - - Success - Başarı - - - - Options saved successfully. - Ayarlar başarıyla kaydedildi. - - - - Invalid Source - Geçersiz Kaynak - - - - The selected source is invalid. - Seçilen kaynak geçersiz. - - - - File Exists - Dosya Var - - - - File already exists. Do you want to replace it? - Dosya zaten var. Üzerine yazmak ister misiniz? - - - - Failed to save file: - Dosya kaydedilemedi: - - - - Failed to download file: - Dosya indirilemedi: - - - - Cheats Not Found - Hileler Bulunamadı - - - - CheatsNotFound_MSG - Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. - - - - Cheats Downloaded Successfully - Hileler Başarıyla İndirildi - - - - CheatsDownloadedSuccessfully_MSG - Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. - - - - Failed to save: - Kaydedilemedi: - - - - Failed to download: - İndirilemedi: - - - - Download Complete - İndirme Tamamlandı - - - - DownloadComplete_MSG - Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. - - - - Failed to parse JSON data from HTML. - HTML'den JSON verileri ayrıştırılamadı. - - - - Failed to retrieve HTML page. - HTML sayfası alınamadı. - - - - The game is in version: %1 - Oyun sürümde: %1 - - - - The downloaded patch only works on version: %1 - İndirilen yamanın sadece sürümde çalışıyor: %1 - - - - You may need to update your game. - Oyunuzu güncellemeniz gerekebilir. - - - - Incompatibility Notice - Uyumsuzluk Bildirimi - - - - Failed to open file: - Dosya açılamadı: - - - - XML ERROR: - XML HATASI: - - - - Failed to open files.json for writing - files.json dosyası yazmak için açılamadı - - - - Author: - Yazar: - - - - Directory does not exist: - Klasör mevcut değil: - - - - Failed to open files.json for reading. - files.json dosyası okumak için açılamadı. - - - - Name: - İsim: - - - - Can't apply cheats before the game is started - Hileleri oyuna başlamadan önce uygulayamazsınız. - - - - SettingsDialog - - - Save - Kaydet - - - Apply Uygula - Restore Defaults Varsayılanları Geri Yükle - Close Kapat - Point your mouse at an option to display its description. Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. - consoleLanguageGroupBox Konsol Dili:\nPS4 oyununun kullandığı dili ayarlar.\nBu seçeneği, oyunun desteklediği bir dilde ayarlamanız önerilir; bu durum bölgeye göre değişebilir. - emulatorLanguageGroupBox Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. - fullscreenCheckBox Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Açılış Ekranını Göster:\nOyun açılırken (özel bir görüntü) açılış ekranını gösterir. - ps4proCheckBox PS4 Pro:\nEmülatörü bir PS4 PRO gibi çalıştırır; bu, bunu destekleyen oyunlarda özel özellikleri etkinleştirebilir. - discordRPCCheckbox Discord Rich Presence'i etkinleştir:\nEmülatör simgesini ve Discord profilinizdeki ilgili bilgileri gösterir. - userName Kullanıcı Adı:\nBazı oyunlar tarafından gösterilebilen PS4 hesabının kullanıcı adını ayarlar. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Günlük Türü:\nPerformans için günlük penceresi çıkışını senkronize etme durumunu ayarlar. Bu, emülasyonda olumsuz etkilere yol açabilir. - logFilter Günlük Filtre:\nSadece belirli bilgileri yazdırmak için günlüğü filtreler.\nÖrnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder. - updaterGroupBox Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. - GUIgroupBox Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox İmleci gizle:\nİmlecin ne zaman kaybolacağını seçin:\nAsla: Fareyi her zaman göreceksiniz.\nPasif: Hareketsiz kaldıktan sonra kaybolması için bir süre belirleyin.\nHer zaman: fareyi asla göremeyeceksiniz. - idleTimeoutGroupBox Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın. - backButtonBehaviorGroupBox Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Asla - Idle Boşta - Always Her zaman - Touchpad Left Dokunmatik Yüzey Sol - Touchpad Right Dokunmatik Yüzey Sağ - Touchpad Center Dokunmatik Yüzey Orta - None Yok - graphicsAdapterGroupBox Grafik Aygıtı:\nBirden fazla GPU'ya sahip sistemlerde, emülatörün kullanacağı GPU'yu açılır listeden seçin,\nor "Auto Select" seçeneğini seçerek otomatik olarak belirlenmesini sağlayın. - resolutionLayout Genişlik/Yükseklik:\nEmülatör penceresinin açılışta boyutunu ayarlar; bu, oyun sırasında yeniden boyutlandırılabilir.\nBu, oyundaki çözünürlükten farklıdır. - heightDivider Vblank Bölücü:\nEmülatörün yenileme hızı bu sayı ile çarpılır. Bu değerin değiştirilmesi olumsuz etkilere yol açabilir; oyun hızını artırabilir veya oyunun beklemediği kritik işlevselliği bozabilir! - dumpShadersCheckBox Shader'ları Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, shader'ları render edildikçe bir klasöre kaydeder. - nullGpuCheckBox Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır. - gameFoldersBox Oyun klasörleri:\nYüklenmiş oyunları kontrol etmek için klasörlerin listesi. - addFolderButton Ekle:\nListeye bir klasör ekle. - removeFolderButton Kaldır:\nListeden bir klasörü kaldır. - debugDump Hata Ayıklama için Dışa Aktarmayı Etkinleştir:\nŞu anda çalışan PS4 uygulaması için içe aktarılan ve dışa aktarılan sembolleri ve dosya başlık bilgilerini bir dizine kaydedin. - vkValidationCheckBox Vulkan Doğrulama Katmanlarını Etkinleştir:\nVulkan renderlayıcısının durumunu doğrulayan ve iç durum hakkında bilgi kaydeden bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - vkSyncValidationCheckBox Vulkan Senkronizasyon Doğrulamasını Etkinleştir:\nVulkan renderlama görevlerinin senkronizasyonunu doğrulayan bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - rdocCheckBox RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Görüntü Mevcut Değil + + + Serial: + Seri Numarası: + + + Version: + Sürüm: + + + Size: + Boyut: + + + Select Cheat File: + Hile Dosyasını Seçin: + + + Repository: + Depo: + + + Download Cheats + Hileleri İndir + + + Delete File + Dosyayı Sil + + + No files selected. + Hiçbir dosya seçilmedi. + + + You can delete the cheats you don't want after downloading them. + İndirdikten sonra istemediğiniz hileleri silebilirsiniz. + + + Do you want to delete the selected file?\n%1 + Seçilen dosyayı silmek istiyor musunuz?\n%1 + + + Select Patch File: + Yama Dosyasını Seçin: + + + Download Patches + Yamaları İndir + + + Save + Kaydet + + + Cheats + Hileler + + + Patches + Yamalar + + + Error + Hata + + + No patch selected. + Hiç yama seçilmedi. + + + Unable to open files.json for reading. + files.json dosyası okumak için açılamadı. + + + No patch file found for the current serial. + Mevcut seri numarası için hiç yama dosyası bulunamadı. + + + Unable to open the file for reading. + Dosya okumak için açılamadı. + + + Unable to open the file for writing. + Dosya yazmak için açılamadı. + + + Failed to parse XML: + XML ayrıştırılamadı: + + + Success + Başarı + + + Options saved successfully. + Ayarlar başarıyla kaydedildi. + + + Invalid Source + Geçersiz Kaynak + + + The selected source is invalid. + Seçilen kaynak geçersiz. + + + File Exists + Dosya Var + + + File already exists. Do you want to replace it? + Dosya zaten var. Üzerine yazmak ister misiniz? + + + Failed to save file: + Dosya kaydedilemedi: + + + Failed to download file: + Dosya indirilemedi: + + + Cheats Not Found + Hileler Bulunamadı + + + CheatsNotFound_MSG + Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. + + + Cheats Downloaded Successfully + Hileler Başarıyla İndirildi + + + CheatsDownloadedSuccessfully_MSG + Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. + + + Failed to save: + Kaydedilemedi: + + + Failed to download: + İndirilemedi: + + + Download Complete + İndirme Tamamlandı + + + DownloadComplete_MSG + Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. + + + Failed to parse JSON data from HTML. + HTML'den JSON verileri ayrıştırılamadı. + + + Failed to retrieve HTML page. + HTML sayfası alınamadı. + + + The game is in version: %1 + Oyun sürümde: %1 + + + The downloaded patch only works on version: %1 + İndirilen yamanın sadece sürümde çalışıyor: %1 + + + You may need to update your game. + Oyunuzu güncellemeniz gerekebilir. + + + Incompatibility Notice + Uyumsuzluk Bildirimi + + + Failed to open file: + Dosya açılamadı: + + + XML ERROR: + XML HATASI: + + + Failed to open files.json for writing + files.json dosyası yazmak için açılamadı + + + Author: + Yazar: + + + Directory does not exist: + Klasör mevcut değil: + + + Failed to open files.json for reading. + files.json dosyası okumak için açılamadı. + + + Name: + İsim: + + + Can't apply cheats before the game is started + Hileleri oyuna başlamadan önce uygulayamazsınız. + + GameListFrame - Icon Simge - Name Ad - Serial Seri Numarası - Compatibility Compatibility - Region Bölge - Firmware Yazılım - Size Boyut - Version Sürüm - Path Yol - Play Time Oynama Süresi - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Otomatik Güncelleyici - Error Hata - Network error: Ağ hatası: - Failed to parse update information. Güncelleme bilgilerini ayrıştırma başarısız oldu. - No pre-releases found. Ön sürüm bulunamadı. - Invalid release data. Geçersiz sürüm verisi. - No download URL found for the specified asset. Belirtilen varlık için hiçbir indirme URL'si bulunamadı. - Your version is already up to date! Versiyonunuz zaten güncel! - Update Available Güncelleme Mevcut - Update Channel Güncelleme Kanalı - Current Version Mevcut Versiyon - Latest Version Son Versiyon - Do you want to update? Güncellemek istiyor musunuz? - Show Changelog Değişiklik Günlüğünü Göster - Check for Updates at Startup Başlangıçta güncellemeleri kontrol et - Update Güncelle - No Hayır - Hide Changelog Değişiklik Günlüğünü Gizle - Changes Değişiklikler - Network error occurred while trying to access the URL URL'ye erişmeye çalışırken bir ağ hatası oluştu - Download Complete İndirme Tamamlandı - The update has been downloaded, press OK to install. Güncelleme indirildi, yüklemek için Tamam'a basın. - Failed to save the update file at Güncelleme dosyası kaydedilemedi - Starting Update... Güncelleme Başlatılıyor... - Failed to create the update script file Güncelleme betiği dosyası oluşturulamadı @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 7e0a58ffb..03aca7cd9 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 Про shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 - це експериментальний емулятор з відкритим вихідним кодом для PlayStation 4. - This software should not be used to play games you have not legally obtained. Це програмне забезпечення не повинно використовуватися для запуску ігор, котрі ви отримали не легально. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Відкрити папку @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Завантажуємо список ігор, будь ласка, зачекайте :3 - Cancel Відмінити - Loading... Завантаження... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Виберіть папку - Select which directory you want to install to. Виберіть папку, до якої ви хочете встановити. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Виберіть папку - Directory to install games Папка для встановлення ігор - Browse Обрати - Error Помилка - The value for location to install games is not valid. Не коректне значення розташування для встановлення ігор. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Створити Ярлик - Cheats / Patches Чити та Патчі - SFO Viewer Перегляд SFO - Trophy Viewer Перегляд трофеїв - Open Folder... Відкрити Папку... - Open Game Folder Відкрити папку з грою - Open Save Data Folder Відкрити Папку Збережених Даних - Open Log Folder Відкрити Папку Логів - Copy info... Копіювати інформацію... - Copy Name Копіювати Ім’я - Copy Serial Копіювати серійний номер - Copy All Копіювати все - Delete... Видалення... - Delete Game Видалити гру - Delete Update Видалити оновлення - Delete DLC Видалити DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Створення ярлика - Shortcut created successfully! Ярлик створений успішно! - Error Помилка - Error creating shortcut! Помилка при створенні ярлика! - Install PKG Встановити PKG - Game Ігри - requiresEnableSeparateUpdateFolder_MSG Ця функція потребує увімкнути опцію 'Окрема папка оновлень'. Якщо ви хочете використовувати цю функцію, будь ласка, увімкніть її. - This game has no update to delete! Ця гра не має оновлень для видалення! - - + Update Оновлення - This game has no DLC to delete! Ця гра не має DLC для видалення! - DLC DLC - Delete %1 Видалити %1 - Are you sure you want to delete %1's %2 directory? Ви впевнені, що хочете видалити папку %1 з папки %2?? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Відкрити/Додати папку Elf - Install Packages (PKG) Встановити пакети (PKG) - Boot Game Запустити гру - Check for Updates Перевити наявність оновлень - About shadPS4 Про shadPS4 - Configure... Налаштувати... - Install application from a .pkg file Встановити додаток з файлу .pkg - Recent Games Нещодавні ігри - Exit Вихід - Exit shadPS4 Вийти з shadPS4 - Exit the application. Вийти з додатку. - Show Game List Показати список ігор - Game List Refresh Оновити список ігор - Tiny Крихітний - Small Маленький - Medium Середній - Large Великий - List View Список - Grid View Сітка - Elf Viewer Elf - Game Install Directory Каталог встановлення гри - Download Cheats/Patches Завантажити Чити або Патчі - Dump Game List Дамп списку ігор - PKG Viewer Перегляд PKG - Search... Пошук... - File Файл - View Вид - Game List Icons Розмір значків списку игр - Game List Mode Вид списку ігор - Settings Налаштування - Utils Утиліти - Themes Теми - Help Допомога - Dark Темна - Light Світла - Green Зелена - Blue Синя - Violet Фіолетова - toolBar Панель інструментів + + Game List + Список ігор + + + * Unsupported Vulkan Version + * Непідтримувана версія Vulkan + + + Download Cheats For All Installed Games + Завантажити чити для всіх встановлених ігор + + + Download Patches For All Games + Завантажити патчі для всіх ігор + + + Download Complete + Завантаження завершено + + + You have downloaded cheats for all the games you have installed. + Ви завантажили чити для всіх встановлених ігор. + + + Patches Downloaded Successfully! + Патчі успішно завантажено! + + + All Patches available for all games have been downloaded. + Завантажено всі доступні патчі для всіх ігор. + + + Games: + Ігри: + + + PKG File (*.PKG) + Файл PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Файл ELF (*.bin *.elf *.oelf) + + + Game Boot + Запуск гри + + + Only one file can be selected! + Можна вибрати лише один файл! + + + PKG Extraction + Видобуток PKG + + + Patch detected! + Виявлено патч! + + + PKG and Game versions match: + Версії PKG та гри збігаються: + + + Would you like to overwrite? + Бажаєте перезаписати? + + + PKG Version %1 is older than installed version: + Версія PKG %1 старіша за встановлену версію: + + + Game is installed: + Гра встановлена: + + + Would you like to install Patch: + Бажаєте встановити патч: + + + DLC Installation + Встановлення DLC + + + Would you like to install DLC: %1? + Ви бажаєте встановити DLC: %1?? + + + DLC already installed: + DLC вже встановлено: + + + Game already installed + Гра вже встановлена + + + PKG is a patch, please install the game first! + PKG - це патч, будь ласка, спочатку встановіть гру! + + + PKG ERROR + ПОМИЛКА PKG + + + Extracting PKG %1/%2 + Вилучення PKG %1/%2 + + + Extraction Finished + Вилучення завершено + + + Game successfully installed at %1 + Гру успішно встановлено у %1 + + + File doesn't appear to be a valid PKG file + Файл не є дійсним PKG-файлом + PKGViewer - Open Folder Відкрити папку @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Трофеї @@ -478,1029 +509,700 @@ SettingsDialog - Settings Налаштування - General Загальні - System Система - Console Language Мова консолі - Emulator Language Мова емулятора - Emulator Емулятор - Enable Fullscreen Увімкнути повноекранний режим - Enable Separate Update Folder Увімкнути окрему папку оновлень - Show Splash Показувати заставку - Is PS4 Pro Режим PS4 Pro - Enable Discord Rich Presence Увімкнути Discord Rich Presence - Username Ім'я користувача - Trophy Key Trophy Key - Trophy Trophy - Logger Логування - Log Type Тип логів - Log Filter Фільтр логів - Input Введення - Cursor Курсор миші - Hide Cursor Приховати курсор - Hide Cursor Idle Timeout Тайм-аут приховування курсора при бездіяльності - s s - Controller Контролер - Back Button Behavior Поведінка кнопки назад - Graphics Графіка - Graphics Device Графічний пристрій - Width Ширина - Height Висота - Vblank Divider Розділювач Vblank - Advanced Розширені - Enable Shaders Dumping Увімкнути дамп шейдерів - Enable NULL GPU Увімкнути NULL GPU - Paths Шляхи - Game Folders Ігрові папки - Add... Додати... - Remove Видалити - Debug Налагодження - Enable Debug Dumping Увімкнути налагоджувальні дампи - Enable Vulkan Validation Layers Увімкнути шари валідації Vulkan - Enable Vulkan Synchronization Validation Увімкнути валідацію синхронізації Vulkan - Enable RenderDoc Debugging Увімкнути налагодження RenderDoc - Update Оновлення - Check for Updates at Startup Перевірка оновлень під час запуску - Update Channel Канал оновлення - Check for Updates Перевірити оновлення - GUI Settings Інтерфейс - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Програвати заголовну музику - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Гучність - Audio Backend Audio Backend - - - MainWindow - - Game List - Список ігор - - - - * Unsupported Vulkan Version - * Непідтримувана версія Vulkan - - - - Download Cheats For All Installed Games - Завантажити чити для всіх встановлених ігор - - - - Download Patches For All Games - Завантажити патчі для всіх ігор - - - - Download Complete - Завантаження завершено - - - - You have downloaded cheats for all the games you have installed. - Ви завантажили чити для всіх встановлених ігор. - - - - Patches Downloaded Successfully! - Патчі успішно завантажено! - - - - All Patches available for all games have been downloaded. - Завантажено всі доступні патчі для всіх ігор. - - - - Games: - Ігри: - - - - PKG File (*.PKG) - Файл PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Файл ELF (*.bin *.elf *.oelf) - - - - Game Boot - Запуск гри - - - - Only one file can be selected! - Можна вибрати лише один файл! - - - - PKG Extraction - Видобуток PKG - - - - Patch detected! - Виявлено патч! - - - - PKG and Game versions match: - Версії PKG та гри збігаються: - - - - Would you like to overwrite? - Бажаєте перезаписати? - - - - PKG Version %1 is older than installed version: - Версія PKG %1 старіша за встановлену версію: - - - - Game is installed: - Гра встановлена: - - - - Would you like to install Patch: - Бажаєте встановити патч: - - - - DLC Installation - Встановлення DLC - - - - Would you like to install DLC: %1? - Ви бажаєте встановити DLC: %1?? - - - - DLC already installed: - DLC вже встановлено: - - - - Game already installed - Гра вже встановлена - - - - PKG is a patch, please install the game first! - PKG - це патч, будь ласка, спочатку встановіть гру! - - - - PKG ERROR - ПОМИЛКА PKG - - - - Extracting PKG %1/%2 - Вилучення PKG %1/%2 - - - - Extraction Finished - Вилучення завершено - - - - Game successfully installed at %1 - Гру успішно встановлено у %1 - - - - File doesn't appear to be a valid PKG file - Файл не є дійсним PKG-файлом - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Зображення відсутнє - - - - Serial: - Серійний номер: - - - - Version: - Версія: - - - - Size: - Розмір: - - - - Select Cheat File: - Виберіть файл читу: - - - - Repository: - Репозиторій: - - - - Download Cheats - Завантажити чити - - - - Delete File - Видалити файл - - - - No files selected. - Файли не вибрані. - - - - You can delete the cheats you don't want after downloading them. - Ви можете видалити непотрібні чити після їх завантаження. - - - - Do you want to delete the selected file?\n%1 - Ви хочете видалити вибраний файл?\n%1 - - - - Select Patch File: - Виберіть файл патчу: - - - - Download Patches - Завантажити патчі - - - Save Зберегти - - Cheats - Чити - - - - Patches - Патчі - - - - Error - Помилка - - - - No patch selected. - Патч не вибрано. - - - - Unable to open files.json for reading. - Не вдалось відкрити files.json для читання. - - - - No patch file found for the current serial. - Файл патча для поточного серійного номера не знайдено. - - - - Unable to open the file for reading. - Не вдалося відкрити файл для читання. - - - - Unable to open the file for writing. - Не вдалось відкрити файл для запису. - - - - Failed to parse XML: - Не вдалося розібрати XML: - - - - Success - Успіх - - - - Options saved successfully. - Параметри успішно збережено. - - - - Invalid Source - Неправильне джерело - - - - The selected source is invalid. - Вибране джерело є недійсним. - - - - File Exists - Файл існує - - - - File already exists. Do you want to replace it? - Файл вже існує. Ви хочете замінити його? - - - - Failed to save file: - Не вдалося зберегти файл: - - - - Failed to download file: - Не вдалося завантажити файл: - - - - Cheats Not Found - Читів не знайдено - - - - CheatsNotFound_MSG - У вибраному репозиторії не знайдено Читів для цієї гри, спробуйте інший репозиторій або іншу версію гри. - - - - Cheats Downloaded Successfully - Чити успішно завантажено - - - - CheatsDownloadedSuccessfully_MSG - Ви успішно завантажили чити для цієї версії гри з обраного репозиторія. Ви можете спробувати завантажити з іншого репозиторія, якщо він буде доступним, ви також зможете скористатися ним, вибравши файл зі списку. - - - - Failed to save: - Не вдалося зберегти: - - - - Failed to download: - Не вдалося завантажити: - - - - Download Complete - Заватнаження завершено - - - - DownloadComplete_MSG - Патчі успішно завантажено! Всі доступні патчі для усіх ігор, завантажено, немає необхідності завантажувати їх окремо для кожної гри, як це відбувається у випадку з читами. Якщо патч не з’являється, можливо, його не існує для конкретного серійного номера та версії гри. Можливо, необхідно оновити гру. - - - - Failed to parse JSON data from HTML. - Не вдалося розібрати JSON-дані з HTML. - - - - Failed to retrieve HTML page. - Не вдалося отримати HTML-сторінку. - - - - The game is in version: %1 - Гра у версії: %1 - - - - The downloaded patch only works on version: %1 - Завантажений патч працює лише на версії: %1 - - - - You may need to update your game. - Можливо, вам потрібно оновити гру. - - - - Incompatibility Notice - Повідомлення про несумісність - - - - Failed to open file: - Не вдалося відкрити файл: - - - - XML ERROR: - ПОМИЛКА XML: - - - - Failed to open files.json for writing - Не вдалося відкрити files.json для запису - - - - Author: - Автор: - - - - Directory does not exist: - Каталогу не існує: - - - - Failed to open files.json for reading. - Не вдалося відкрити files.json для читання. - - - - Name: - Ім'я: - - - - Can't apply cheats before the game is started - Неможливо застосовувати чити до початку гри. - - - - SettingsDialog - - - Save - Зберегти - - - Apply Застосувати - Restore Defaults За замовчуванням - Close Закрити - Point your mouse at an option to display its description. Наведіть курсор миші на опцію, щоб відобразити її опис. - consoleLanguageGroupBox Мова консолі:\nВстановіть мову, яка буде використовуватись у іграх PS4.\nРекомендується встановити мову котра підтримується грою, оскільки вона може відрізнятися в залежності від регіону. - emulatorLanguageGroupBox Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора. - fullscreenCheckBox Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11. - separateUpdatesCheckBox Окрема папка для оновлень:\nДає змогу встановлювати оновлення гри в окрему папку для зручності. - showSplashCheckBox Показувати заставку:\nВідображає заставку гри (спеціальне зображення) під час запуску гри. - ps4proCheckBox Режим PS4 Pro:\nЗмушує емулятор працювати як PS4 Pro, що може ввімкнути спеціальні функції в іграх, які підтримують це. - discordRPCCheckbox Увімкнути Discord Rich Presence:\nВідображає значок емулятора та відповідну інформацію у вашому профілі Discord. - userName Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Це може відображатися в деяких іграх. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Тип логів:\nВстановіть, чи синхронізувати виведення вікна логів заради продуктивності. Це може негативно вплинути на емуляцію. - logFilter Фільтр логів:\nФільтрує логи, щоб показувати тільки певну інформацію.\nПриклади: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Рівні: Trace, Debug, Info, Warning, Error, Critical - у цьому порядку, конкретний рівень глушить усі попередні рівні у списку і показує всі наступні рівні. - updaterGroupBox Оновлення:\nRelease: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nNightly: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. - GUIgroupBox Грати заголовну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Приховувати курсор:\nВиберіть, коли курсор зникне:\nНіколи: Ви завжди будете бачити мишу.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Ви ніколи не будете бачити мишу. - idleTimeoutGroupBox Встановіть час, через який курсор зникне в разі бездіяльності. - backButtonBehaviorGroupBox Поведінка кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Ніколи - Idle При бездіяльності - Always Завжди - Touchpad Left Тачпад ліворуч - Touchpad Right Тачпад праворуч - Touchpad Center Тачпад по центру - None Ні - graphicsAdapterGroupBox Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Auto Select", щоб визначити його автоматично. - resolutionLayout Ширина/Висота:\nВстановіть розмір вікна емулятора під час запуску, який може бути змінений під час гри.\nЦе відрізняється від роздільної здатності в грі. - heightDivider Розділювач Vblank:\nЧастота кадрів, з якою оновлюється емулятор, множиться на це число. Зміна цього параметра може мати негативні наслідки, такі як збільшення швидкості гри або порушення критичних функцій гри, які цього не очікують! - dumpShadersCheckBox Увімкнути дамп шейдерів:\nДля технічного налагодження зберігає шейдери ігор у папку під час рендерингу. - nullGpuCheckBox Увімкнути NULL GPU:\nДля технічного налагодження відключає рендеринг гри так, ніби графічної карти немає. - gameFoldersBox Ігрові папки:\nСписок папок для перевірки встановлених ігор. - addFolderButton Додати:\nДодати папку в список. - removeFolderButton Видалити:\nВидалити папку зі списку. - debugDump Увімкнути налагоджувальні дампи:\nЗберігає символи імпорту, експорту та інформацію про заголовок файлу поточної виконуваної програми PS4 у папку. - vkValidationCheckBox Увімкнути шари валідації Vulkan:\nВключає систему, яка перевіряє стан рендерера Vulkan і логує інформацію про його внутрішній стан. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - vkSyncValidationCheckBox Увімкнути валідацію синхронізації Vulkan:\nВключає систему, яка перевіряє таймінг завдань рендерингу Vulkan. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - rdocCheckBox Увімкнути налагодження RenderDoc:\nЯкщо увімкнено, емулятор забезпечить сумісність із Renderdoc, даючи змогу захоплювати й аналізувати поточні кадри під час рендерингу. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Зображення відсутнє + + + Serial: + Серійний номер: + + + Version: + Версія: + + + Size: + Розмір: + + + Select Cheat File: + Виберіть файл читу: + + + Repository: + Репозиторій: + + + Download Cheats + Завантажити чити + + + Delete File + Видалити файл + + + No files selected. + Файли не вибрані. + + + You can delete the cheats you don't want after downloading them. + Ви можете видалити непотрібні чити після їх завантаження. + + + Do you want to delete the selected file?\n%1 + Ви хочете видалити вибраний файл?\n%1 + + + Select Patch File: + Виберіть файл патчу: + + + Download Patches + Завантажити патчі + + + Save + Зберегти + + + Cheats + Чити + + + Patches + Патчі + + + Error + Помилка + + + No patch selected. + Патч не вибрано. + + + Unable to open files.json for reading. + Не вдалось відкрити files.json для читання. + + + No patch file found for the current serial. + Файл патча для поточного серійного номера не знайдено. + + + Unable to open the file for reading. + Не вдалося відкрити файл для читання. + + + Unable to open the file for writing. + Не вдалось відкрити файл для запису. + + + Failed to parse XML: + Не вдалося розібрати XML: + + + Success + Успіх + + + Options saved successfully. + Параметри успішно збережено. + + + Invalid Source + Неправильне джерело + + + The selected source is invalid. + Вибране джерело є недійсним. + + + File Exists + Файл існує + + + File already exists. Do you want to replace it? + Файл вже існує. Ви хочете замінити його? + + + Failed to save file: + Не вдалося зберегти файл: + + + Failed to download file: + Не вдалося завантажити файл: + + + Cheats Not Found + Читів не знайдено + + + CheatsNotFound_MSG + У вибраному репозиторії не знайдено Читів для цієї гри, спробуйте інший репозиторій або іншу версію гри. + + + Cheats Downloaded Successfully + Чити успішно завантажено + + + CheatsDownloadedSuccessfully_MSG + Ви успішно завантажили чити для цієї версії гри з обраного репозиторія. Ви можете спробувати завантажити з іншого репозиторія, якщо він буде доступним, ви також зможете скористатися ним, вибравши файл зі списку. + + + Failed to save: + Не вдалося зберегти: + + + Failed to download: + Не вдалося завантажити: + + + Download Complete + Заватнаження завершено + + + DownloadComplete_MSG + Патчі успішно завантажено! Всі доступні патчі для усіх ігор, завантажено, немає необхідності завантажувати їх окремо для кожної гри, як це відбувається у випадку з читами. Якщо патч не з’являється, можливо, його не існує для конкретного серійного номера та версії гри. Можливо, необхідно оновити гру. + + + Failed to parse JSON data from HTML. + Не вдалося розібрати JSON-дані з HTML. + + + Failed to retrieve HTML page. + Не вдалося отримати HTML-сторінку. + + + The game is in version: %1 + Гра у версії: %1 + + + The downloaded patch only works on version: %1 + Завантажений патч працює лише на версії: %1 + + + You may need to update your game. + Можливо, вам потрібно оновити гру. + + + Incompatibility Notice + Повідомлення про несумісність + + + Failed to open file: + Не вдалося відкрити файл: + + + XML ERROR: + ПОМИЛКА XML: + + + Failed to open files.json for writing + Не вдалося відкрити files.json для запису + + + Author: + Автор: + + + Directory does not exist: + Каталогу не існує: + + + Failed to open files.json for reading. + Не вдалося відкрити files.json для читання. + + + Name: + Ім'я: + + + Can't apply cheats before the game is started + Неможливо застосовувати чити до початку гри. + + GameListFrame - Icon Значок - Name Назва - Serial Серійний номер - Compatibility Compatibility - Region Регіон - Firmware Прошивка - Size Розмір - Version Версія - Path Шлях - Play Time Час у грі - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Автооновлення - Error Помилка - Network error: Мережева помилка: - Failed to parse update information. Не вдалося розібрати інформацію про оновлення. - No pre-releases found. Попередніх версій не знайдено. - Invalid release data. Неприпустимі дані релізу. - No download URL found for the specified asset. Не знайдено URL для завантаження зазначеного ресурсу. - Your version is already up to date! Вашу версію вже оновлено! - Update Available Доступне оновлення - Update Channel Канал оновлення - Current Version Поточна версія - Latest Version Остання версія - Do you want to update? Ви хочете оновитися? - Show Changelog Показати журнал змін - Check for Updates at Startup Перевірка оновлень під час запуску - Update Оновитись - No Ні - Hide Changelog Приховати журнал змін - Changes Журнал змін - Network error occurred while trying to access the URL Сталася мережева помилка під час спроби доступу до URL - Download Complete Завантаження завершено - The update has been downloaded, press OK to install. Оновлення завантажено, натисніть OK для встановлення. - Failed to save the update file at Не вдалося зберегти файл оновлення в - Starting Update... Початок оновлення... - Failed to create the update script file Не вдалося створити файл скрипта оновлення @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 997c3d3f9..3f92c1836 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches Mẹo / Bản vá - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... Mở Thư Mục... - Open Game Folder Mở Thư Mục Trò Chơi - Open Save Data Folder Mở Thư Mục Dữ Liệu Lưu - Open Log Folder Mở Thư Mục Nhật Ký - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates Kiểm tra bản cập nhật - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Tải Mẹo / Bản vá - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help Giúp đỡ - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + Danh sách trò chơi + + + * Unsupported Vulkan Version + * Phiên bản Vulkan không được hỗ trợ + + + Download Cheats For All Installed Games + Tải xuống cheat cho tất cả các trò chơi đã cài đặt + + + Download Patches For All Games + Tải xuống bản vá cho tất cả các trò chơi + + + Download Complete + Tải xuống hoàn tất + + + You have downloaded cheats for all the games you have installed. + Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. + + + Patches Downloaded Successfully! + Bản vá đã tải xuống thành công! + + + All Patches available for all games have been downloaded. + Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. + + + Games: + Trò chơi: + + + PKG File (*.PKG) + Tệp PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Tệp ELF (*.bin *.elf *.oelf) + + + Game Boot + Khởi động trò chơi + + + Only one file can be selected! + Chỉ có thể chọn một tệp duy nhất! + + + PKG Extraction + Giải nén PKG + + + Patch detected! + Đã phát hiện bản vá! + + + PKG and Game versions match: + Các phiên bản PKG và trò chơi khớp nhau: + + + Would you like to overwrite? + Bạn có muốn ghi đè không? + + + PKG Version %1 is older than installed version: + Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: + + + Game is installed: + Trò chơi đã được cài đặt: + + + Would you like to install Patch: + Bạn có muốn cài đặt bản vá: + + + DLC Installation + Cài đặt DLC + + + Would you like to install DLC: %1? + Bạn có muốn cài đặt DLC: %1? + + + DLC already installed: + DLC đã được cài đặt: + + + Game already installed + Trò chơi đã được cài đặt + + + PKG is a patch, please install the game first! + PKG là bản vá, vui lòng cài đặt trò chơi trước! + + + PKG ERROR + LOI PKG + + + Extracting PKG %1/%2 + Đang giải nén PKG %1/%2 + + + Extraction Finished + Giải nén hoàn tất + + + Game successfully installed at %1 + Trò chơi đã được cài đặt thành công tại %1 + + + File doesn't appear to be a valid PKG file + Tệp không có vẻ là tệp PKG hợp lệ + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence Bật Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input Đầu vào - Cursor Con trỏ - Hide Cursor Ẩn con trỏ - Hide Cursor Idle Timeout Thời gian chờ ẩn con trỏ - s s - Controller Điều khiển - Back Button Behavior Hành vi nút quay lại - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths Đường dẫn - Game Folders Thư mục trò chơi - Add... Thêm... - Remove Xóa - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update Cập nhật - Check for Updates at Startup Kiểm tra cập nhật khi khởi động - Update Channel Kênh Cập Nhật - Check for Updates Kiểm tra cập nhật - GUI Settings Cài đặt GUI - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music Phát nhạc tiêu đề - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume Âm lượng - Audio Backend Audio Backend - - - MainWindow - - Game List - Danh sách trò chơi - - - - * Unsupported Vulkan Version - * Phiên bản Vulkan không được hỗ trợ - - - - Download Cheats For All Installed Games - Tải xuống cheat cho tất cả các trò chơi đã cài đặt - - - - Download Patches For All Games - Tải xuống bản vá cho tất cả các trò chơi - - - - Download Complete - Tải xuống hoàn tất - - - - You have downloaded cheats for all the games you have installed. - Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. - - - - Patches Downloaded Successfully! - Bản vá đã tải xuống thành công! - - - - All Patches available for all games have been downloaded. - Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. - - - - Games: - Trò chơi: - - - - PKG File (*.PKG) - Tệp PKG (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - Tệp ELF (*.bin *.elf *.oelf) - - - - Game Boot - Khởi động trò chơi - - - - Only one file can be selected! - Chỉ có thể chọn một tệp duy nhất! - - - - PKG Extraction - Giải nén PKG - - - - Patch detected! - Đã phát hiện bản vá! - - - - PKG and Game versions match: - Các phiên bản PKG và trò chơi khớp nhau: - - - - Would you like to overwrite? - Bạn có muốn ghi đè không? - - - - PKG Version %1 is older than installed version: - Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: - - - - Game is installed: - Trò chơi đã được cài đặt: - - - - Would you like to install Patch: - Bạn có muốn cài đặt bản vá: - - - - DLC Installation - Cài đặt DLC - - - - Would you like to install DLC: %1? - Bạn có muốn cài đặt DLC: %1? - - - - DLC already installed: - DLC đã được cài đặt: - - - - Game already installed - Trò chơi đã được cài đặt - - - - PKG is a patch, please install the game first! - PKG là bản vá, vui lòng cài đặt trò chơi trước! - - - - PKG ERROR - LOI PKG - - - - Extracting PKG %1/%2 - Đang giải nén PKG %1/%2 - - - - Extraction Finished - Giải nén hoàn tất - - - - Game successfully installed at %1 - Trò chơi đã được cài đặt thành công tại %1 - - - - File doesn't appear to be a valid PKG file - Tệp không có vẻ là tệp PKG hợp lệ - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - Không có hình ảnh - - - - Serial: - Số seri: - - - - Version: - Phiên bản: - - - - Size: - Kích thước: - - - - Select Cheat File: - Chọn tệp Cheat: - - - - Repository: - Kho lưu trữ: - - - - Download Cheats - Tải xuống Cheat - - - - Delete File - Xóa tệp - - - - No files selected. - Không có tệp nào được chọn. - - - - You can delete the cheats you don't want after downloading them. - Bạn có thể xóa các cheat không muốn sau khi tải xuống. - - - - Do you want to delete the selected file?\n%1 - Bạn có muốn xóa tệp đã chọn?\n%1 - - - - Select Patch File: - Chọn tệp Bản vá: - - - - Download Patches - Tải xuống Bản vá - - - Save Lưu - - Cheats - Cheat - - - - Patches - Bản vá - - - - Error - Lỗi - - - - No patch selected. - Không có bản vá nào được chọn. - - - - Unable to open files.json for reading. - Không thể mở files.json để đọc. - - - - No patch file found for the current serial. - Không tìm thấy tệp bản vá cho số seri hiện tại. - - - - Unable to open the file for reading. - Không thể mở tệp để đọc. - - - - Unable to open the file for writing. - Không thể mở tệp để ghi. - - - - Failed to parse XML: - Không thể phân tích XML: - - - - Success - Thành công - - - - Options saved successfully. - Các tùy chọn đã được lưu thành công. - - - - Invalid Source - Nguồn không hợp lệ - - - - The selected source is invalid. - Nguồn đã chọn không hợp lệ. - - - - File Exists - Tệp đã tồn tại - - - - File already exists. Do you want to replace it? - Tệp đã tồn tại. Bạn có muốn thay thế nó không? - - - - Failed to save file: - Không thể lưu tệp: - - - - Failed to download file: - Không thể tải xuống tệp: - - - - Cheats Not Found - Không tìm thấy Cheat - - - - CheatsNotFound_MSG - Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. - - - - Cheats Downloaded Successfully - Cheat đã tải xuống thành công - - - - CheatsDownloadedSuccessfully_MSG - Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. - - - - Failed to save: - Không thể lưu: - - - - Failed to download: - Không thể tải xuống: - - - - Download Complete - Tải xuống hoàn tất - - - - DownloadComplete_MSG - Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. - - - - Failed to parse JSON data from HTML. - Không thể phân tích dữ liệu JSON từ HTML. - - - - Failed to retrieve HTML page. - Không thể lấy trang HTML. - - - - The game is in version: %1 - Trò chơi đang ở phiên bản: %1 - - - - The downloaded patch only works on version: %1 - Patch đã tải về chỉ hoạt động trên phiên bản: %1 - - - - You may need to update your game. - Bạn có thể cần cập nhật trò chơi của mình. - - - - Incompatibility Notice - Thông báo không tương thích - - - - Failed to open file: - Không thể mở tệp: - - - - XML ERROR: - LỖI XML: - - - - Failed to open files.json for writing - Không thể mở files.json để ghi - - - - Author: - Tác giả: - - - - Directory does not exist: - Thư mục không tồn tại: - - - - Failed to open files.json for reading. - Không thể mở files.json để đọc. - - - - Name: - Tên: - - - - Can't apply cheats before the game is started - Không thể áp dụng cheat trước khi trò chơi bắt đầu. - - - - SettingsDialog - - - Save - Lưu - - - Apply Áp dụng - Restore Defaults Khôi phục cài đặt mặc định - Close Đóng - Point your mouse at an option to display its description. Di chuyển chuột đến tùy chọn để hiển thị mô tả của nó. - consoleLanguageGroupBox Ngôn ngữ console:\nChọn ngôn ngữ mà trò chơi PS4 sẽ sử dụng.\nKhuyên bạn nên đặt tùy chọn này thành một ngôn ngữ mà trò chơi hỗ trợ, có thể thay đổi tùy theo vùng. - emulatorLanguageGroupBox Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. - fullscreenCheckBox Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox Hiển thị màn hình khởi động:\nHiển thị màn hình khởi động của trò chơi (một hình ảnh đặc biệt) trong khi trò chơi khởi động. - ps4proCheckBox Là PS4 Pro:\nKhiến trình giả lập hoạt động như một PS4 PRO, điều này có thể kích hoạt các tính năng đặc biệt trong các trò chơi hỗ trợ điều này. - discordRPCCheckbox Bật Discord Rich Presence:\nHiển thị biểu tượng trình giả lập và thông tin liên quan trên hồ sơ Discord của bạn. - userName Tên người dùng:\nChọn tên người dùng của tài khoản PS4, có thể được một số trò chơi hiển thị. - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox Loại nhật ký:\nChọn xem có đồng bộ hóa đầu ra cửa sổ nhật ký cho hiệu suất hay không. Điều này có thể có tác động tiêu cực đến việc giả lập. - logFilter Bộ lọc nhật ký:\nLọc nhật ký để in chỉ thông tin cụ thể.\nVí dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách và ghi lại tất cả các mức sau đó. - updaterGroupBox Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. - GUIgroupBox Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox Ẩn con trỏ:\nChọn khi nào con trỏ sẽ biến mất:\nKhông bao giờ: Bạn sẽ luôn thấy chuột.\nKhông hoạt động: Đặt một khoảng thời gian để nó biến mất sau khi không hoạt động.\nLuôn luôn: bạn sẽ không bao giờ thấy chuột. - idleTimeoutGroupBox Đặt thời gian để chuột biến mất sau khi không hoạt động. - backButtonBehaviorGroupBox Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm để mô phỏng việc chạm vào vị trí đã chỉ định trên touchpad của PS4. - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never Không bao giờ - Idle Nhàn rỗi - Always Luôn luôn - Touchpad Left Touchpad Trái - Touchpad Right Touchpad Phải - Touchpad Center Giữa Touchpad - None Không có - graphicsAdapterGroupBox Thiết bị đồ họa:\nTrên các hệ thống có GPU đa năng, hãy chọn GPU mà trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn "Auto Select" để tự động xác định. - resolutionLayout Chiều rộng/Cao:\nChọn kích thước cửa sổ của trình giả lập khi khởi động, có thể điều chỉnh trong quá trình chơi.\nĐiều này khác với độ phân giải trong trò chơi. - heightDivider Bộ chia Vblank:\nTốc độ khung hình mà trình giả lập làm mới được nhân với số này. Thay đổi này có thể có tác động tiêu cực như tăng tốc độ trò chơi hoặc làm hỏng chức năng quan trọng mà trò chơi không mong đợi thay đổi điều này! - dumpShadersCheckBox Bật xuất shader:\nĐể mục đích gỡ lỗi kỹ thuật, lưu shader của trò chơi vào một thư mục khi chúng được kết xuất. - nullGpuCheckBox Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, vô hiệu hóa việc kết xuất trò chơi như thể không có card đồ họa. - gameFoldersBox Thư mục trò chơi:\nDanh sách các thư mục để kiểm tra các trò chơi đã cài đặt. - addFolderButton Thêm:\nThêm một thư mục vào danh sách. - removeFolderButton Xóa:\nXóa một thư mục khỏi danh sách. - debugDump Bật xuất gỡ lỗi:\nLưu biểu tượng nhập và xuất và thông tin tiêu đề tệp cho ứng dụng PS4 hiện đang chạy vào một thư mục. - vkValidationCheckBox Bật lớp xác thực Vulkan:\nKích hoạt một hệ thống xác thực trạng thái của bộ kết xuất Vulkan và ghi lại thông tin về trạng thái nội bộ của nó. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - vkSyncValidationCheckBox Bật xác thực đồng bộ Vulkan:\nKích hoạt một hệ thống xác thực thời gian của nhiệm vụ kết xuất Vulkan. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - rdocCheckBox Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Không có hình ảnh + + + Serial: + Số seri: + + + Version: + Phiên bản: + + + Size: + Kích thước: + + + Select Cheat File: + Chọn tệp Cheat: + + + Repository: + Kho lưu trữ: + + + Download Cheats + Tải xuống Cheat + + + Delete File + Xóa tệp + + + No files selected. + Không có tệp nào được chọn. + + + You can delete the cheats you don't want after downloading them. + Bạn có thể xóa các cheat không muốn sau khi tải xuống. + + + Do you want to delete the selected file?\n%1 + Bạn có muốn xóa tệp đã chọn?\n%1 + + + Select Patch File: + Chọn tệp Bản vá: + + + Download Patches + Tải xuống Bản vá + + + Save + Lưu + + + Cheats + Cheat + + + Patches + Bản vá + + + Error + Lỗi + + + No patch selected. + Không có bản vá nào được chọn. + + + Unable to open files.json for reading. + Không thể mở files.json để đọc. + + + No patch file found for the current serial. + Không tìm thấy tệp bản vá cho số seri hiện tại. + + + Unable to open the file for reading. + Không thể mở tệp để đọc. + + + Unable to open the file for writing. + Không thể mở tệp để ghi. + + + Failed to parse XML: + Không thể phân tích XML: + + + Success + Thành công + + + Options saved successfully. + Các tùy chọn đã được lưu thành công. + + + Invalid Source + Nguồn không hợp lệ + + + The selected source is invalid. + Nguồn đã chọn không hợp lệ. + + + File Exists + Tệp đã tồn tại + + + File already exists. Do you want to replace it? + Tệp đã tồn tại. Bạn có muốn thay thế nó không? + + + Failed to save file: + Không thể lưu tệp: + + + Failed to download file: + Không thể tải xuống tệp: + + + Cheats Not Found + Không tìm thấy Cheat + + + CheatsNotFound_MSG + Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. + + + Cheats Downloaded Successfully + Cheat đã tải xuống thành công + + + CheatsDownloadedSuccessfully_MSG + Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. + + + Failed to save: + Không thể lưu: + + + Failed to download: + Không thể tải xuống: + + + Download Complete + Tải xuống hoàn tất + + + DownloadComplete_MSG + Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. + + + Failed to parse JSON data from HTML. + Không thể phân tích dữ liệu JSON từ HTML. + + + Failed to retrieve HTML page. + Không thể lấy trang HTML. + + + The game is in version: %1 + Trò chơi đang ở phiên bản: %1 + + + The downloaded patch only works on version: %1 + Patch đã tải về chỉ hoạt động trên phiên bản: %1 + + + You may need to update your game. + Bạn có thể cần cập nhật trò chơi của mình. + + + Incompatibility Notice + Thông báo không tương thích + + + Failed to open file: + Không thể mở tệp: + + + XML ERROR: + LỖI XML: + + + Failed to open files.json for writing + Không thể mở files.json để ghi + + + Author: + Tác giả: + + + Directory does not exist: + Thư mục không tồn tại: + + + Failed to open files.json for reading. + Không thể mở files.json để đọc. + + + Name: + Tên: + + + Can't apply cheats before the game is started + Không thể áp dụng cheat trước khi trò chơi bắt đầu. + + GameListFrame - Icon Biểu tượng - Name Tên - Serial Số seri - Compatibility Compatibility - Region Khu vực - Firmware Phần mềm - Size Kích thước - Version Phiên bản - Path Đường dẫn - Play Time Thời gian chơi - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater Trình cập nhật tự động - Error Lỗi - Network error: Lỗi mạng: - Failed to parse update information. Không thể phân tích thông tin cập nhật. - No pre-releases found. Không tìm thấy bản phát hành trước. - Invalid release data. Dữ liệu bản phát hành không hợp lệ. - No download URL found for the specified asset. Không tìm thấy URL tải xuống cho tài sản đã chỉ định. - Your version is already up to date! Phiên bản của bạn đã được cập nhật! - Update Available Có bản cập nhật - Update Channel Kênh Cập Nhật - Current Version Phiên bản hiện tại - Latest Version Phiên bản mới nhất - Do you want to update? Bạn có muốn cập nhật không? - Show Changelog Hiện nhật ký thay đổi - Check for Updates at Startup Kiểm tra cập nhật khi khởi động - Update Cập nhật - No Không - Hide Changelog Ẩn nhật ký thay đổi - Changes Thay đổi - Network error occurred while trying to access the URL Xảy ra lỗi mạng khi cố gắng truy cập URL - Download Complete Tải xuống hoàn tất - The update has been downloaded, press OK to install. Bản cập nhật đã được tải xuống, nhấn OK để cài đặt. - Failed to save the update file at Không thể lưu tệp cập nhật tại - Starting Update... Đang bắt đầu cập nhật... - Failed to create the update script file Không thể tạo tệp kịch bản cập nhật @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index fecb8857f..60e50a2bc 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 关于 shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 是一款实验性质的开源 PlayStation 4 模拟器软件。 - This software should not be used to play games you have not legally obtained. 本软件不得用于运行未经合法授权而获得的游戏。 @@ -29,7 +25,6 @@ ElfViewer - Open Folder 打开文件夹 @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 加载游戏列表中, 请稍等 :3 - Cancel 取消 - Loading... 加载中... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - 选择文件目录 - Select which directory you want to install to. 选择你想要安装到的目录。 @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - 选择文件目录 - Directory to install games 要安装游戏的目录 - Browse 浏览 - Error 错误 - The value for location to install games is not valid. 游戏安装位置无效。 @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut 创建快捷方式 - Cheats / Patches 作弊码/补丁 - SFO Viewer SFO 查看器 - Trophy Viewer 奖杯查看器 - Open Folder... 打开文件夹... - Open Game Folder 打开游戏文件夹 - Open Save Data Folder 打开存档数据文件夹 - Open Log Folder 打开日志文件夹 - Copy info... 复制信息... - Copy Name 复制名称 - Copy Serial 复制序列号 - Copy All 复制全部 - Delete... 删除... - Delete Game 删除游戏 - Delete Update 删除更新 - Delete DLC 删除 DLC - Compatibility... 兼容性... - Update database 更新数据库 - View report 查看报告 - Submit a report 提交报告 - Shortcut creation 创建快捷方式 - Shortcut created successfully! 创建快捷方式成功! - Error 错误 - Error creating shortcut! 创建快捷方式出错! - Install PKG 安装 PKG - Game 游戏 - requiresEnableSeparateUpdateFolder_MSG 这个功能需要“启用单独的更新目录”配置选项才能正常运行,如果你想要使用这个功能,请启用它。 - This game has no update to delete! 这个游戏没有更新可以删除! - - + Update 更新 - This game has no DLC to delete! 这个游戏没有 DLC 可以删除! - DLC DLC - Delete %1 删除 %1 - Are you sure you want to delete %1's %2 directory? 你确定要删除 %1 的%2目录? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder 打开/添加 Elf 文件夹 - Install Packages (PKG) 安装 Packages (PKG) - Boot Game 启动游戏 - Check for Updates 检查更新 - About shadPS4 关于 shadPS4 - Configure... 设置... - Install application from a .pkg file 从 .pkg 文件安装应用程序 - Recent Games 最近启动的游戏 - Exit 退出 - Exit shadPS4 退出 shadPS4 - Exit the application. 退出应用程序。 - Show Game List 显示游戏列表 - Game List Refresh 刷新游戏列表 - Tiny 微小 - Small - Medium - Large - List View 列表视图 - Grid View 表格视图 - Elf Viewer Elf 查看器 - Game Install Directory 游戏安装目录 - Download Cheats/Patches 下载作弊码/补丁 - Dump Game List 导出游戏列表 - PKG Viewer PKG 查看器 - Search... 搜索... - File 文件 - View 显示 - Game List Icons 游戏列表图标 - Game List Mode 游戏列表模式 - Settings 设置 - Utils 工具 - Themes 主题 - Help 帮助 - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar 工具栏 + + Game List + 游戏列表 + + + * Unsupported Vulkan Version + * 不支持的 Vulkan 版本 + + + Download Cheats For All Installed Games + 下载所有已安装游戏的作弊码 + + + Download Patches For All Games + 下载所有游戏的补丁 + + + Download Complete + 下载完成 + + + You have downloaded cheats for all the games you have installed. + 您已下载了所有已安装游戏的作弊码。 + + + Patches Downloaded Successfully! + 补丁下载成功! + + + All Patches available for all games have been downloaded. + 所有游戏的可用补丁都已下载。 + + + Games: + 游戏: + + + PKG File (*.PKG) + PKG 文件 (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF 文件 (*.bin *.elf *.oelf) + + + Game Boot + 启动游戏 + + + Only one file can be selected! + 只能选择一个文件! + + + PKG Extraction + PKG 解压 + + + Patch detected! + 检测到补丁! + + + PKG and Game versions match: + PKG 和游戏版本匹配: + + + Would you like to overwrite? + 您想要覆盖吗? + + + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安装版本更旧: + + + Game is installed: + 游戏已安装: + + + Would you like to install Patch: + 您想安装补丁吗: + + + DLC Installation + DLC 安装 + + + Would you like to install DLC: %1? + 您想安装 DLC:%1 吗? + + + DLC already installed: + DLC 已经安装: + + + Game already installed + 游戏已经安装 + + + PKG is a patch, please install the game first! + PKG 是一个补丁,请先安装游戏! + + + PKG ERROR + PKG 错误 + + + Extracting PKG %1/%2 + 正在解压 PKG %1/%2 + + + Extraction Finished + 解压完成 + + + Game successfully installed at %1 + 游戏成功安装在 %1 + + + File doesn't appear to be a valid PKG file + 文件似乎不是有效的 PKG 文件 + PKGViewer - Open Folder 打开文件夹 @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer 奖杯查看器 @@ -478,1029 +509,700 @@ SettingsDialog - Settings 设置 - General 常规 - System 系统 - Console Language 主机语言 - Emulator Language 模拟器语言 - Emulator 模拟器 - Enable Fullscreen 启用全屏 - Enable Separate Update Folder 启用单独的更新目录 - Show Splash 显示启动画面 - Is PS4 Pro 模拟 PS4 Pro - Enable Discord Rich Presence 启用 Discord Rich Presence - Username 用户名 - Trophy Key Trophy Key - Trophy Trophy - Logger 日志 - Log Type 日志类型 - Log Filter 日志过滤 - Input 输入 - Cursor 光标 - Hide Cursor 隐藏光标 - Hide Cursor Idle Timeout 光标隐藏闲置时长 - s - Controller 手柄 - Back Button Behavior 返回按钮行为 - Graphics 图像 - Graphics Device 图形设备 - Width 宽度 - Height 高度 - Vblank Divider Vblank Divider - Advanced 高级 - Enable Shaders Dumping 启用着色器转储 - Enable NULL GPU 启用 NULL GPU - Paths 路径 - Game Folders 游戏文件夹 - Add... 添加... - Remove 删除 - Debug 调试 - Enable Debug Dumping 启用调试转储 - Enable Vulkan Validation Layers 启用 Vulkan 验证层 - Enable Vulkan Synchronization Validation 启用 Vulkan 同步验证 - Enable RenderDoc Debugging 启用 RenderDoc 调试 - Update 更新 - Check for Updates at Startup 启动时检查更新 - Update Channel 更新频道 - Check for Updates 检查更新 - GUI Settings 界面设置 - Disable Trophy Pop-ups 禁止弹出奖杯 - Play title music 播放标题音乐 - Update Compatibility Database On Startup 启动时更新兼容性数据库 - Game Compatibility 游戏兼容性 - Display Compatibility Data 显示兼容性数据 - Update Compatibility Database 更新兼容性数据库 - Volume 音量 - Audio Backend 音频后端 - - - MainWindow - - Game List - 游戏列表 - - - - * Unsupported Vulkan Version - * 不支持的 Vulkan 版本 - - - - Download Cheats For All Installed Games - 下载所有已安装游戏的作弊码 - - - - Download Patches For All Games - 下载所有游戏的补丁 - - - - Download Complete - 下载完成 - - - - You have downloaded cheats for all the games you have installed. - 您已下载了所有已安装游戏的作弊码。 - - - - Patches Downloaded Successfully! - 补丁下载成功! - - - - All Patches available for all games have been downloaded. - 所有游戏的可用补丁都已下载。 - - - - Games: - 游戏: - - - - PKG File (*.PKG) - PKG 文件 (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF 文件 (*.bin *.elf *.oelf) - - - - Game Boot - 启动游戏 - - - - Only one file can be selected! - 只能选择一个文件! - - - - PKG Extraction - PKG 解压 - - - - Patch detected! - 检测到补丁! - - - - PKG and Game versions match: - PKG 和游戏版本匹配: - - - - Would you like to overwrite? - 您想要覆盖吗? - - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安装版本更旧: - - - - Game is installed: - 游戏已安装: - - - - Would you like to install Patch: - 您想安装补丁吗: - - - - DLC Installation - DLC 安装 - - - - Would you like to install DLC: %1? - 您想安装 DLC:%1 吗? - - - - DLC already installed: - DLC 已经安装: - - - - Game already installed - 游戏已经安装 - - - - PKG is a patch, please install the game first! - PKG 是一个补丁,请先安装游戏! - - - - PKG ERROR - PKG 错误 - - - - Extracting PKG %1/%2 - 正在解压 PKG %1/%2 - - - - Extraction Finished - 解压完成 - - - - Game successfully installed at %1 - 游戏成功安装在 %1 - - - - File doesn't appear to be a valid PKG file - 文件似乎不是有效的 PKG 文件 - - - - CheatsPatches - - - Cheats / Patches for - 作弊码/补丁: - - - - defaultTextEdit_MSG - 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - 没有可用的图片 - - - - Serial: - 序列号: - - - - Version: - 版本: - - - - Size: - 大小: - - - - Select Cheat File: - 选择作弊码文件: - - - - Repository: - 存储库: - - - - Download Cheats - 下载作弊码 - - - - Delete File - 删除文件 - - - - No files selected. - 没有选择文件。 - - - - You can delete the cheats you don't want after downloading them. - 您可以在下载后删除不想要的作弊码。 - - - - Do you want to delete the selected file?\n%1 - 您要删除选中的文件吗?\n%1 - - - - Select Patch File: - 选择补丁文件: - - - - Download Patches - 下载补丁 - - - Save 保存 - - Cheats - 作弊码 - - - - Patches - 补丁 - - - - Error - 错误 - - - - No patch selected. - 没有选择补丁。 - - - - Unable to open files.json for reading. - 无法打开 files.json 进行读取。 - - - - No patch file found for the current serial. - 未找到当前序列号的补丁文件。 - - - - Unable to open the file for reading. - 无法打开文件进行读取。 - - - - Unable to open the file for writing. - 无法打开文件进行写入。 - - - - Failed to parse XML: - 解析 XML 失败: - - - - Success - 成功 - - - - Options saved successfully. - 选项已成功保存。 - - - - Invalid Source - 无效的来源 - - - - The selected source is invalid. - 选择的来源无效。 - - - - File Exists - 文件已存在 - - - - File already exists. Do you want to replace it? - 文件已存在,您要替换它吗? - - - - Failed to save file: - 保存文件失败: - - - - Failed to download file: - 下载文件失败: - - - - Cheats Not Found - 未找到作弊码 - - - - CheatsNotFound_MSG - 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 - - - - Cheats Downloaded Successfully - 作弊码下载成功 - - - - CheatsDownloadedSuccessfully_MSG - 您已从所选存储库中成功下载了该游戏版本的作弊码。您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 - - - - Failed to save: - 保存失败: - - - - Failed to download: - 下载失败: - - - - Download Complete - 下载完成 - - - - DownloadComplete_MSG - 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不适用于当前游戏的序列号和版本。 - - - - Failed to parse JSON data from HTML. - 无法解析 HTML 中的 JSON 数据。 - - - - Failed to retrieve HTML page. - 无法获取 HTML 页面。 - - - - The game is in version: %1 - 游戏版本:%1 - - - - The downloaded patch only works on version: %1 - 下载的补丁仅适用于版本:%1 - - - - You may need to update your game. - 您可能需要更新您的游戏。 - - - - Incompatibility Notice - 不兼容通知 - - - - Failed to open file: - 无法打开文件: - - - - XML ERROR: - XML 错误: - - - - Failed to open files.json for writing - 无法打开 files.json 进行写入 - - - - Author: - 作者: - - - - Directory does not exist: - 目录不存在: - - - - Failed to open files.json for reading. - 无法打开 files.json 进行读取。 - - - - Name: - 名称: - - - - Can't apply cheats before the game is started - 在游戏启动之前无法应用作弊码。 - - - - SettingsDialog - - - Save - 保存 - - - Apply 应用 - Restore Defaults 恢复默认 - Close 关闭 - Point your mouse at an option to display its description. 将鼠标指针指向选项以显示其描述。 - consoleLanguageGroupBox 主机语言:\n设置 PS4 游戏中使用的语言。\n建议设置为支持的语言,这将因地区而异。 - emulatorLanguageGroupBox 模拟器语言:\n设置模拟器用户界面的语言。 - fullscreenCheckBox 启用全屏:\n以全屏模式启动游戏。\n您可以按 F11 键切换回窗口模式。 - separateUpdatesCheckBox 启用单独的更新目录:\n启用安装游戏更新到一个单独的目录中以更便于管理。 - showSplashCheckBox 显示启动画面:\n在游戏启动时显示游戏的启动画面(特殊图像)。 - ps4proCheckBox 模拟 PS4 Pro:\n使模拟器作为 PS4 Pro 运行,可以在支持的游戏中激活特殊功能。 - discordRPCCheckbox 启用 Discord Rich Presence:\n在您的 Discord 个人资料上显示模拟器图标和相关信息。 - userName 用户名:\n设置 PS4 帐户的用户名,某些游戏中可能会显示此名称。 - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox 日志类型:\n设置日志窗口输出的同步方式以提高性能。可能会对模拟产生不良影响。 - logFilter 日志过滤器:\n过滤日志,仅打印特定信息。\n例如:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - 按此顺序,特定级别将静默列表中所有先前的级别,并记录所有后续级别。 - updaterGroupBox 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 - GUIgroupBox 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 - disableTrophycheckBox 禁止弹出奖杯:\n禁用游戏内奖杯通知。可以在奖杯查看器中继续跟踪奖杯进度(在主窗口中右键点击游戏)。 - hideCursorGroupBox 隐藏光标:\n选择光标何时消失:\n从不: 始终显示光标。\闲置: 光标在闲置若干秒后消失。\n始终: 始终显示光标。 - idleTimeoutGroupBox 光标隐藏闲置时长:\n光标自动隐藏之前的闲置时长。 - backButtonBehaviorGroupBox 返回按钮行为:\n设置手柄的返回按钮模拟在 PS4 触控板上指定位置的点击。 - enableCompatibilityCheckBox 显示兼容性数据:\n在列表视图中显示游戏兼容性信息。启用“启动时更新兼容性数据库”以获取最新信息。 - checkCompatibilityOnStartupCheckBox 启动时更新兼容性数据库:\n当 shadPS4 启动时自动更新兼容性数据库。 - updateCompatibilityButton 更新兼容性数据库:\n立即更新兼容性数据库。 - Never 从不 - Idle 闲置 - Always 始终 - Touchpad Left 触控板左侧 - Touchpad Right 触控板右侧 - Touchpad Center 触控板中间 - None - graphicsAdapterGroupBox 图形设备:\n在具有多个 GPU 的系统中,从下拉列表中选择要使用的 GPU,\n或者选择“自动选择”由模拟器决定。 - resolutionLayout 宽度/高度:\n设置启动游戏时的窗口大小,游戏过程中可以调整。\n这与游戏内的分辨率不同。 - heightDivider Vblank Divider:\n模拟器刷新的帧率会乘以此数字。改变此项可能会导致游戏速度加快,或破坏游戏中不期望此变化的关键功能! - dumpShadersCheckBox 启用着色器转储:\n用于技术调试,在渲染期间将游戏着色器保存到文件夹中。 - nullGpuCheckBox 启用 NULL GPU:\n用于技术调试,禁用游戏渲染,就像没有显卡一样。 - gameFoldersBox 游戏文件夹:\n检查已安装游戏的文件夹列表。 - addFolderButton 添加:\n将文件夹添加到列表。 - removeFolderButton 移除:\n从列表中移除文件夹。 - debugDump 启用调试转储:\n将当前正在运行的 PS4 程序的导入和导出符号及文件头信息保存到目录中。 - vkValidationCheckBox 启用 Vulkan 验证层:\n启用一个系统来验证 Vulkan 渲染器的状态并记录其内部状态的信息。\n这将降低性能并可能改变模拟的行为。 - vkSyncValidationCheckBox 启用 Vulkan 同步验证:\n启用一个系统来验证 Vulkan 渲染任务的时间。\n这将降低性能并可能改变模拟的行为。 - rdocCheckBox 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 + + CheatsPatches + + Cheats / Patches for + 作弊码/补丁: + + + defaultTextEdit_MSG + 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + 没有可用的图片 + + + Serial: + 序列号: + + + Version: + 版本: + + + Size: + 大小: + + + Select Cheat File: + 选择作弊码文件: + + + Repository: + 存储库: + + + Download Cheats + 下载作弊码 + + + Delete File + 删除文件 + + + No files selected. + 没有选择文件。 + + + You can delete the cheats you don't want after downloading them. + 您可以在下载后删除不想要的作弊码。 + + + Do you want to delete the selected file?\n%1 + 您要删除选中的文件吗?\n%1 + + + Select Patch File: + 选择补丁文件: + + + Download Patches + 下载补丁 + + + Save + 保存 + + + Cheats + 作弊码 + + + Patches + 补丁 + + + Error + 错误 + + + No patch selected. + 没有选择补丁。 + + + Unable to open files.json for reading. + 无法打开 files.json 进行读取。 + + + No patch file found for the current serial. + 未找到当前序列号的补丁文件。 + + + Unable to open the file for reading. + 无法打开文件进行读取。 + + + Unable to open the file for writing. + 无法打开文件进行写入。 + + + Failed to parse XML: + 解析 XML 失败: + + + Success + 成功 + + + Options saved successfully. + 选项已成功保存。 + + + Invalid Source + 无效的来源 + + + The selected source is invalid. + 选择的来源无效。 + + + File Exists + 文件已存在 + + + File already exists. Do you want to replace it? + 文件已存在,您要替换它吗? + + + Failed to save file: + 保存文件失败: + + + Failed to download file: + 下载文件失败: + + + Cheats Not Found + 未找到作弊码 + + + CheatsNotFound_MSG + 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 + + + Cheats Downloaded Successfully + 作弊码下载成功 + + + CheatsDownloadedSuccessfully_MSG + 您已从所选存储库中成功下载了该游戏版本的作弊码。您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 + + + Failed to save: + 保存失败: + + + Failed to download: + 下载失败: + + + Download Complete + 下载完成 + + + DownloadComplete_MSG + 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不适用于当前游戏的序列号和版本。 + + + Failed to parse JSON data from HTML. + 无法解析 HTML 中的 JSON 数据。 + + + Failed to retrieve HTML page. + 无法获取 HTML 页面。 + + + The game is in version: %1 + 游戏版本:%1 + + + The downloaded patch only works on version: %1 + 下载的补丁仅适用于版本:%1 + + + You may need to update your game. + 您可能需要更新您的游戏。 + + + Incompatibility Notice + 不兼容通知 + + + Failed to open file: + 无法打开文件: + + + XML ERROR: + XML 错误: + + + Failed to open files.json for writing + 无法打开 files.json 进行写入 + + + Author: + 作者: + + + Directory does not exist: + 目录不存在: + + + Failed to open files.json for reading. + 无法打开 files.json 进行读取。 + + + Name: + 名称: + + + Can't apply cheats before the game is started + 在游戏启动之前无法应用作弊码。 + + GameListFrame - Icon 图标 - Name 名称 - Serial 序列号 - Compatibility 兼容性 - Region 区域 - Firmware 固件 - Size 大小 - Version 版本 - Path 路径 - Play Time 游戏时间 - Never Played 未玩过 - h 小时 - m 分钟 - s - Compatibility is untested 兼容性未经测试 - Game does not initialize properly / crashes the emulator 游戏无法正确初始化/模拟器崩溃 - Game boots, but only displays a blank screen 游戏启动,但只显示白屏 - Game displays an image but does not go past the menu 游戏显示图像但无法通过菜单页面 - Game has game-breaking glitches or unplayable performance 游戏有严重的 Bug 或太卡无法游玩 - Game can be completed with playable performance and no major glitches 游戏能在可玩的性能下完成且没有重大 Bug @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater 自动更新程序 - Error 错误 - Network error: 网络错误: - Failed to parse update information. 无法解析更新信息。 - No pre-releases found. 未找到预发布版本。 - Invalid release data. 无效的发布数据。 - No download URL found for the specified asset. 未找到指定资源的下载地址。 - Your version is already up to date! 您的版本已经是最新的! - Update Available 可用更新 - Update Channel 更新频道 - Current Version 当前版本 - Latest Version 最新版本 - Do you want to update? 您想要更新吗? - Show Changelog 显示更新日志 - Check for Updates at Startup 启动时检查更新 - Update 更新 - No - Hide Changelog 隐藏更新日志 - Changes 更新日志 - Network error occurred while trying to access the URL 尝试访问网址时发生网络错误 - Download Complete 下载完成 - The update has been downloaded, press OK to install. 更新已下载,请按 OK 安装。 - Failed to save the update file at 无法保存更新文件到 - Starting Update... 正在开始更新... - Failed to create the update script file 无法创建更新脚本文件 @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + - + \ No newline at end of file diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 293ed81a6..d1e822b5c 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -6,22 +6,18 @@ AboutDialog - About shadPS4 About shadPS4 - shadPS4 shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. This software should not be used to play games you have not legally obtained. @@ -29,7 +25,6 @@ ElfViewer - Open Folder Open Folder @@ -37,17 +32,14 @@ GameInfoClass - Loading game list, please wait :3 Loading game list, please wait :3 - Cancel Cancel - Loading... Loading... @@ -55,12 +47,10 @@ InstallDirSelect - shadPS4 - Choose directory shadPS4 - Choose directory - Select which directory you want to install to. Select which directory you want to install to. @@ -68,27 +58,22 @@ GameInstallDialog - shadPS4 - Choose directory shadPS4 - Choose directory - Directory to install games Directory to install games - Browse Browse - Error Error - The value for location to install games is not valid. The value for location to install games is not valid. @@ -96,167 +81,134 @@ GuiContextMenus - Create Shortcut Create Shortcut - Cheats / Patches Zuòbì / Xiūbǔ chéngshì - SFO Viewer SFO Viewer - Trophy Viewer Trophy Viewer - Open Folder... 打開資料夾... - Open Game Folder 打開遊戲資料夾 - Open Save Data Folder 打開存檔資料夾 - Open Log Folder 打開日誌資料夾 - Copy info... Copy info... - Copy Name Copy Name - Copy Serial Copy Serial - Copy All Copy All - Delete... Delete... - Delete Game Delete Game - Delete Update Delete Update - Delete DLC Delete DLC - Compatibility... Compatibility... - Update database Update database - View report View report - Submit a report Submit a report - Shortcut creation Shortcut creation - Shortcut created successfully! Shortcut created successfully! - Error Error - Error creating shortcut! Error creating shortcut! - Install PKG Install PKG - Game Game - requiresEnableSeparateUpdateFolder_MSG This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - This game has no update to delete! This game has no update to delete! - - + Update Update - This game has no DLC to delete! This game has no DLC to delete! - DLC DLC - Delete %1 Delete %1 - Are you sure you want to delete %1's %2 directory? Are you sure you want to delete %1's %2 directory? @@ -264,205 +216,285 @@ MainWindow - Open/Add Elf Folder Open/Add Elf Folder - Install Packages (PKG) Install Packages (PKG) - Boot Game Boot Game - Check for Updates 檢查更新 - About shadPS4 About shadPS4 - Configure... Configure... - Install application from a .pkg file Install application from a .pkg file - Recent Games Recent Games - Exit Exit - Exit shadPS4 Exit shadPS4 - Exit the application. Exit the application. - Show Game List Show Game List - Game List Refresh Game List Refresh - Tiny Tiny - Small Small - Medium Medium - Large Large - List View List View - Grid View Grid View - Elf Viewer Elf Viewer - Game Install Directory Game Install Directory - Download Cheats/Patches Xiàzài Zuòbì / Xiūbǔ chéngshì - Dump Game List Dump Game List - PKG Viewer PKG Viewer - Search... Search... - File File - View View - Game List Icons Game List Icons - Game List Mode Game List Mode - Settings Settings - Utils Utils - Themes Themes - Help 幫助 - Dark Dark - Light Light - Green Green - Blue Blue - Violet Violet - toolBar toolBar + + Game List + 遊戲列表 + + + * Unsupported Vulkan Version + * 不支援的 Vulkan 版本 + + + Download Cheats For All Installed Games + 下載所有已安裝遊戲的作弊碼 + + + Download Patches For All Games + 下載所有遊戲的修補檔 + + + Download Complete + 下載完成 + + + You have downloaded cheats for all the games you have installed. + 您已經下載了所有已安裝遊戲的作弊碼。 + + + Patches Downloaded Successfully! + 修補檔下載成功! + + + All Patches available for all games have been downloaded. + 所有遊戲的修補檔已經下載完成。 + + + Games: + 遊戲: + + + PKG File (*.PKG) + PKG 檔案 (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + ELF 檔案 (*.bin *.elf *.oelf) + + + Game Boot + 遊戲啟動 + + + Only one file can be selected! + 只能選擇一個檔案! + + + PKG Extraction + PKG 解壓縮 + + + Patch detected! + 檢測到補丁! + + + PKG and Game versions match: + PKG 和遊戲版本匹配: + + + Would you like to overwrite? + 您想要覆蓋嗎? + + + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安裝版本更舊: + + + Game is installed: + 遊戲已安裝: + + + Would you like to install Patch: + 您想要安裝補丁嗎: + + + DLC Installation + DLC 安裝 + + + Would you like to install DLC: %1? + 您想要安裝 DLC: %1 嗎? + + + DLC already installed: + DLC 已經安裝: + + + Game already installed + 遊戲已經安裝 + + + PKG is a patch, please install the game first! + PKG 是修補檔,請先安裝遊戲! + + + PKG ERROR + PKG 錯誤 + + + Extracting PKG %1/%2 + 正在解壓縮 PKG %1/%2 + + + Extraction Finished + 解壓縮完成 + + + Game successfully installed at %1 + 遊戲成功安裝於 %1 + + + File doesn't appear to be a valid PKG file + 檔案似乎不是有效的 PKG 檔案 + PKGViewer - Open Folder Open Folder @@ -470,7 +502,6 @@ TrophyViewer - Trophy Viewer Trophy Viewer @@ -478,1029 +509,700 @@ SettingsDialog - Settings Settings - General General - System System - Console Language Console Language - Emulator Language Emulator Language - Emulator Emulator - Enable Fullscreen Enable Fullscreen - Enable Separate Update Folder Enable Separate Update Folder - Show Splash Show Splash - Is PS4 Pro Is PS4 Pro - Enable Discord Rich Presence 啟用 Discord Rich Presence - Username Username - Trophy Key Trophy Key - Trophy Trophy - Logger Logger - Log Type Log Type - Log Filter Log Filter - Input 輸入 - Cursor 游標 - Hide Cursor 隱藏游標 - Hide Cursor Idle Timeout 游標空閒超時隱藏 - s s - Controller 控制器 - Back Button Behavior 返回按鈕行為 - Graphics Graphics - Graphics Device Graphics Device - Width Width - Height Height - Vblank Divider Vblank Divider - Advanced Advanced - Enable Shaders Dumping Enable Shaders Dumping - Enable NULL GPU Enable NULL GPU - Paths 路徑 - Game Folders 遊戲資料夾 - Add... 添加... - Remove 刪除 - Debug Debug - Enable Debug Dumping Enable Debug Dumping - Enable Vulkan Validation Layers Enable Vulkan Validation Layers - Enable Vulkan Synchronization Validation Enable Vulkan Synchronization Validation - Enable RenderDoc Debugging Enable RenderDoc Debugging - Update 更新 - Check for Updates at Startup 啟動時檢查更新 - Update Channel 更新頻道 - Check for Updates 檢查更新 - GUI Settings 介面設置 - Disable Trophy Pop-ups Disable Trophy Pop-ups - Play title music 播放標題音樂 - Update Compatibility Database On Startup Update Compatibility Database On Startup - Game Compatibility Game Compatibility - Display Compatibility Data Display Compatibility Data - Update Compatibility Database Update Compatibility Database - Volume 音量 - Audio Backend Audio Backend - - - MainWindow - - Game List - 遊戲列表 - - - - * Unsupported Vulkan Version - * 不支援的 Vulkan 版本 - - - - Download Cheats For All Installed Games - 下載所有已安裝遊戲的作弊碼 - - - - Download Patches For All Games - 下載所有遊戲的修補檔 - - - - Download Complete - 下載完成 - - - - You have downloaded cheats for all the games you have installed. - 您已經下載了所有已安裝遊戲的作弊碼。 - - - - Patches Downloaded Successfully! - 修補檔下載成功! - - - - All Patches available for all games have been downloaded. - 所有遊戲的修補檔已經下載完成。 - - - - Games: - 遊戲: - - - - PKG File (*.PKG) - PKG 檔案 (*.PKG) - - - - ELF files (*.bin *.elf *.oelf) - ELF 檔案 (*.bin *.elf *.oelf) - - - - Game Boot - 遊戲啟動 - - - - Only one file can be selected! - 只能選擇一個檔案! - - - - PKG Extraction - PKG 解壓縮 - - - - Patch detected! - 檢測到補丁! - - - - PKG and Game versions match: - PKG 和遊戲版本匹配: - - - - Would you like to overwrite? - 您想要覆蓋嗎? - - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安裝版本更舊: - - - - Game is installed: - 遊戲已安裝: - - - - Would you like to install Patch: - 您想要安裝補丁嗎: - - - - DLC Installation - DLC 安裝 - - - - Would you like to install DLC: %1? - 您想要安裝 DLC: %1 嗎? - - - - DLC already installed: - DLC 已經安裝: - - - - Game already installed - 遊戲已經安裝 - - - - PKG is a patch, please install the game first! - PKG 是修補檔,請先安裝遊戲! - - - - PKG ERROR - PKG 錯誤 - - - - Extracting PKG %1/%2 - 正在解壓縮 PKG %1/%2 - - - - Extraction Finished - 解壓縮完成 - - - - Game successfully installed at %1 - 遊戲成功安裝於 %1 - - - - File doesn't appear to be a valid PKG file - 檔案似乎不是有效的 PKG 檔案 - - - - CheatsPatches - - - Cheats / Patches for - Cheats / Patches for - - - - defaultTextEdit_MSG - 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats - - - - No Image Available - 沒有可用的圖片 - - - - Serial: - 序號: - - - - Version: - 版本: - - - - Size: - 大小: - - - - Select Cheat File: - 選擇作弊檔案: - - - - Repository: - 儲存庫: - - - - Download Cheats - 下載作弊碼 - - - - Delete File - 刪除檔案 - - - - No files selected. - 沒有選擇檔案。 - - - - You can delete the cheats you don't want after downloading them. - 您可以在下載後刪除不需要的作弊碼。 - - - - Do you want to delete the selected file?\n%1 - 您是否要刪除選定的檔案?\n%1 - - - - Select Patch File: - 選擇修補檔案: - - - - Download Patches - 下載修補檔 - - - Save 儲存 - - Cheats - 作弊碼 - - - - Patches - 修補檔 - - - - Error - 錯誤 - - - - No patch selected. - 未選擇修補檔。 - - - - Unable to open files.json for reading. - 無法打開 files.json 進行讀取。 - - - - No patch file found for the current serial. - 找不到當前序號的修補檔。 - - - - Unable to open the file for reading. - 無法打開檔案進行讀取。 - - - - Unable to open the file for writing. - 無法打開檔案進行寫入。 - - - - Failed to parse XML: - 解析 XML 失敗: - - - - Success - 成功 - - - - Options saved successfully. - 選項已成功儲存。 - - - - Invalid Source - 無效的來源 - - - - The selected source is invalid. - 選擇的來源無效。 - - - - File Exists - 檔案已存在 - - - - File already exists. Do you want to replace it? - 檔案已存在。您是否希望替換它? - - - - Failed to save file: - 無法儲存檔案: - - - - Failed to download file: - 無法下載檔案: - - - - Cheats Not Found - 未找到作弊碼 - - - - CheatsNotFound_MSG - 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 - - - - Cheats Downloaded Successfully - 作弊碼下載成功 - - - - CheatsDownloadedSuccessfully_MSG - 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 - - - - Failed to save: - 儲存失敗: - - - - Failed to download: - 下載失敗: - - - - Download Complete - 下載完成 - - - - DownloadComplete_MSG - 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。 - - - - Failed to parse JSON data from HTML. - 無法從 HTML 解析 JSON 數據。 - - - - Failed to retrieve HTML page. - 無法檢索 HTML 頁面。 - - - - The game is in version: %1 - 遊戲版本: %1 - - - - The downloaded patch only works on version: %1 - 下載的補丁僅適用於版本: %1 - - - - You may need to update your game. - 您可能需要更新遊戲。 - - - - Incompatibility Notice - 不相容通知 - - - - Failed to open file: - 無法打開檔案: - - - - XML ERROR: - XML 錯誤: - - - - Failed to open files.json for writing - 無法打開 files.json 進行寫入 - - - - Author: - 作者: - - - - Directory does not exist: - 目錄不存在: - - - - Failed to open files.json for reading. - 無法打開 files.json 進行讀取。 - - - - Name: - 名稱: - - - - Can't apply cheats before the game is started - 在遊戲開始之前無法應用作弊。 - - - - SettingsDialog - - - Save - 儲存 - - - Apply 應用 - Restore Defaults 還原預設值 - Close 關閉 - Point your mouse at an option to display its description. 將鼠標指向選項以顯示其描述。 - consoleLanguageGroupBox 主機語言:\n設定PS4遊戲使用的語言。\n建議將其設置為遊戲支持的語言,這會因地區而異。 - emulatorLanguageGroupBox 模擬器語言:\n設定模擬器的用戶介面的語言。 - fullscreenCheckBox 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 - separateUpdatesCheckBox Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox 顯示啟動畫面:\n在遊戲啟動時顯示遊戲的啟動畫面(特殊圖片)。 - ps4proCheckBox 為PS4 Pro:\n讓模擬器像PS4 PRO一樣運作,這可能啟用支持此功能的遊戲中的特殊功能。 - discordRPCCheckbox 啟用 Discord Rich Presence:\n在您的 Discord 個人檔案上顯示模擬器圖標和相關信息。 - userName 用戶名:\n設定PS4帳號的用戶名,某些遊戲中可能會顯示。 - TrophyKey Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox 日誌類型:\n設定是否同步日誌窗口的輸出以提高性能。可能對模擬產生不良影響。 - logFilter 日誌過濾器:\n過濾日誌以僅打印特定信息。\n範例:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - 以此順序,特定級別靜音所有前面的級別,並記錄其後的每個級別。 - updaterGroupBox 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 - GUIgroupBox 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 - disableTrophycheckBox Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox 隱藏游標:\n選擇游標何時消失:\n從不: 您將始終看到滑鼠。\n閒置: 設定在閒置後消失的時間。\n始終: 您將永遠看不到滑鼠。 - idleTimeoutGroupBox 設定滑鼠在閒置後消失的時間。 - backButtonBehaviorGroupBox 返回按鈕行為:\n設定控制器的返回按鈕模擬在 PS4 觸控板上指定位置的觸碰。 - enableCompatibilityCheckBox Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton Update Compatibility Database:\nImmediately update the compatibility database. - Never 從不 - Idle 閒置 - Always 始終 - Touchpad Left 觸控板左側 - Touchpad Right 觸控板右側 - Touchpad Center 觸控板中間 - None - graphicsAdapterGroupBox 圖形設備:\n在多GPU系統中,從下拉列表中選擇模擬器將使用的GPU,\n或選擇「自動選擇」以自動確定。 - resolutionLayout 寬度/高度:\n設定模擬器啟動時的窗口大小,可以在遊戲過程中調整。\n這與遊戲內解析度不同。 - heightDivider Vblank分隔符:\n模擬器的幀速率將乘以這個數字。更改此數字可能會有不良影響,例如增加遊戲速度,或破壞不預期此變化的關鍵遊戲功能! - dumpShadersCheckBox 啟用著色器轉儲:\n為了技術調試,將遊戲的著色器在渲染時保存到文件夾中。 - nullGpuCheckBox 啟用空GPU:\n為了技術調試,禁用遊戲渲染,彷彿沒有顯示卡。 - gameFoldersBox 遊戲資料夾:\n檢查已安裝遊戲的資料夾列表。 - addFolderButton 添加:\n將資料夾添加到列表。 - removeFolderButton 移除:\n從列表中移除資料夾。 - debugDump 啟用調試轉儲:\n將當前運行的PS4程序的輸入和輸出符號及文件頭信息保存到目錄中。 - vkValidationCheckBox 啟用Vulkan驗證層:\n啟用一個系統來驗證Vulkan渲染器的狀態並記錄其內部狀態的信息。這將降低性能並可能改變模擬行為。 - vkSyncValidationCheckBox 啟用Vulkan同步驗證:\n啟用一個系統來驗證Vulkan渲染任務的時間。這將降低性能並可能改變模擬行為。 - rdocCheckBox 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + 沒有可用的圖片 + + + Serial: + 序號: + + + Version: + 版本: + + + Size: + 大小: + + + Select Cheat File: + 選擇作弊檔案: + + + Repository: + 儲存庫: + + + Download Cheats + 下載作弊碼 + + + Delete File + 刪除檔案 + + + No files selected. + 沒有選擇檔案。 + + + You can delete the cheats you don't want after downloading them. + 您可以在下載後刪除不需要的作弊碼。 + + + Do you want to delete the selected file?\n%1 + 您是否要刪除選定的檔案?\n%1 + + + Select Patch File: + 選擇修補檔案: + + + Download Patches + 下載修補檔 + + + Save + 儲存 + + + Cheats + 作弊碼 + + + Patches + 修補檔 + + + Error + 錯誤 + + + No patch selected. + 未選擇修補檔。 + + + Unable to open files.json for reading. + 無法打開 files.json 進行讀取。 + + + No patch file found for the current serial. + 找不到當前序號的修補檔。 + + + Unable to open the file for reading. + 無法打開檔案進行讀取。 + + + Unable to open the file for writing. + 無法打開檔案進行寫入。 + + + Failed to parse XML: + 解析 XML 失敗: + + + Success + 成功 + + + Options saved successfully. + 選項已成功儲存。 + + + Invalid Source + 無效的來源 + + + The selected source is invalid. + 選擇的來源無效。 + + + File Exists + 檔案已存在 + + + File already exists. Do you want to replace it? + 檔案已存在。您是否希望替換它? + + + Failed to save file: + 無法儲存檔案: + + + Failed to download file: + 無法下載檔案: + + + Cheats Not Found + 未找到作弊碼 + + + CheatsNotFound_MSG + 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 + + + Cheats Downloaded Successfully + 作弊碼下載成功 + + + CheatsDownloadedSuccessfully_MSG + 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 + + + Failed to save: + 儲存失敗: + + + Failed to download: + 下載失敗: + + + Download Complete + 下載完成 + + + DownloadComplete_MSG + 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。 + + + Failed to parse JSON data from HTML. + 無法從 HTML 解析 JSON 數據。 + + + Failed to retrieve HTML page. + 無法檢索 HTML 頁面。 + + + The game is in version: %1 + 遊戲版本: %1 + + + The downloaded patch only works on version: %1 + 下載的補丁僅適用於版本: %1 + + + You may need to update your game. + 您可能需要更新遊戲。 + + + Incompatibility Notice + 不相容通知 + + + Failed to open file: + 無法打開檔案: + + + XML ERROR: + XML 錯誤: + + + Failed to open files.json for writing + 無法打開 files.json 進行寫入 + + + Author: + 作者: + + + Directory does not exist: + 目錄不存在: + + + Failed to open files.json for reading. + 無法打開 files.json 進行讀取。 + + + Name: + 名稱: + + + Can't apply cheats before the game is started + 在遊戲開始之前無法應用作弊。 + + GameListFrame - Icon 圖示 - Name 名稱 - Serial 序號 - Compatibility Compatibility - Region 區域 - Firmware 固件 - Size 大小 - Version 版本 - Path 路徑 - Play Time 遊玩時間 - Never Played Never Played - h h - m m - s s - Compatibility is untested Compatibility is untested - Game does not initialize properly / crashes the emulator Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen Game boots, but only displays a blank screen - Game displays an image but does not go past the menu Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches @@ -1508,127 +1210,102 @@ CheckUpdate - Auto Updater 自動更新程式 - Error 錯誤 - Network error: 網路錯誤: - Failed to parse update information. 無法解析更新資訊。 - No pre-releases found. 未找到預發布版本。 - Invalid release data. 無效的發行數據。 - No download URL found for the specified asset. 未找到指定資產的下載 URL。 - Your version is already up to date! 您的版本已經是最新的! - Update Available 可用更新 - Update Channel 更新頻道 - Current Version 當前版本 - Latest Version 最新版本 - Do you want to update? 您想要更新嗎? - Show Changelog 顯示變更日誌 - Check for Updates at Startup 啟動時檢查更新 - Update 更新 - No - Hide Changelog 隱藏變更日誌 - Changes 變更 - Network error occurred while trying to access the URL 嘗試訪問 URL 時發生網路錯誤 - Download Complete 下載完成 - The update has been downloaded, press OK to install. 更新已下載,按 OK 安裝。 - Failed to save the update file at 無法將更新文件保存到 - Starting Update... 正在開始更新... - Failed to create the update script file 無法創建更新腳本文件 @@ -1636,29 +1313,24 @@ GameListUtils - B B - KB KB - MB MB - GB GB - TB TB - + \ No newline at end of file From c08fc85b72786ad7cc2c688eefe75e50ab84b4ec Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 6 Jan 2025 21:00:07 -0800 Subject: [PATCH 025/455] renderer_vulkan: Fix null buffer views with wrong format. (#2079) --- src/video_core/buffer_cache/buffer_cache.cpp | 13 +--------- src/video_core/buffer_cache/buffer_cache.h | 5 ---- .../renderer_vulkan/vk_rasterizer.cpp | 24 ++++++++++++------- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index d5ebd85fc..3a210957e 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -34,21 +34,10 @@ BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& s // Ensure the first slot is used for the null buffer const auto null_id = - slot_buffers.insert(instance, scheduler, MemoryUsage::DeviceLocal, 0, ReadFlags, 1); + slot_buffers.insert(instance, scheduler, MemoryUsage::DeviceLocal, 0, ReadFlags, 16); ASSERT(null_id.index == 0); const vk::Buffer& null_buffer = slot_buffers[null_id].buffer; Vulkan::SetObjectName(instance.GetDevice(), null_buffer, "Null Buffer"); - - const vk::BufferViewCreateInfo null_view_ci = { - .buffer = null_buffer, - .format = vk::Format::eR8Unorm, - .offset = 0, - .range = VK_WHOLE_SIZE, - }; - const auto [null_view_result, null_view] = instance.GetDevice().createBufferView(null_view_ci); - ASSERT_MSG(null_view_result == vk::Result::eSuccess, "Failed to create null buffer view."); - null_buffer_view = null_view; - Vulkan::SetObjectName(instance.GetDevice(), null_buffer_view, "Null Buffer View"); } BufferCache::~BufferCache() = default; diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index c367795f1..f29a37b63 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -71,10 +71,6 @@ public: return slot_buffers[id]; } - [[nodiscard]] vk::BufferView& NullBufferView() { - return null_buffer_view; - } - /// Invalidates any buffer in the logical page range. void InvalidateMemory(VAddr device_addr, u64 size); @@ -160,7 +156,6 @@ private: std::shared_mutex mutex; Common::SlotVector slot_buffers; RangeSet gpu_modified_ranges; - vk::BufferView null_buffer_view; MemoryTracker memory_tracker; PageTable page_table; }; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 6e628239b..e8616550b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -537,6 +537,7 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } // Second pass to re-bind buffers that were updated after binding + auto& null_buffer = buffer_cache.GetBuffer(VideoCore::NULL_BUFFER_ID); for (u32 i = 0; i < buffer_bindings.size(); i++) { const auto& [buffer_id, vsharp] = buffer_bindings[i]; const auto& desc = stage.buffers[i]; @@ -548,7 +549,6 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } else if (instance.IsNullDescriptorSupported()) { buffer_infos.emplace_back(VK_NULL_HANDLE, 0, VK_WHOLE_SIZE); } else { - auto& null_buffer = buffer_cache.GetBuffer(VideoCore::NULL_BUFFER_ID); buffer_infos.emplace_back(null_buffer.Handle(), 0, VK_WHOLE_SIZE); } } else { @@ -582,17 +582,19 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding ++binding.buffer; } - const auto null_buffer_view = - instance.IsNullDescriptorSupported() ? VK_NULL_HANDLE : buffer_cache.NullBufferView(); for (u32 i = 0; i < texbuffer_bindings.size(); i++) { const auto& [buffer_id, vsharp] = texbuffer_bindings[i]; const auto& desc = stage.texture_buffers[i]; - vk::BufferView& buffer_view = buffer_views.emplace_back(null_buffer_view); + // Fallback format for null buffer view; never used in valid buffer case. + const auto data_fmt = vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid + ? vsharp.GetDataFmt() + : AmdGpu::DataFormat::Format8; + const u32 fmt_stride = AmdGpu::NumBits(data_fmt) >> 3; + vk::BufferView buffer_view; if (buffer_id) { const u32 alignment = instance.TexelBufferMinAlignment(); const auto [vk_buffer, offset] = buffer_cache.ObtainBuffer( vsharp.base_address, vsharp.GetSize(), desc.is_written, true, buffer_id); - const u32 fmt_stride = AmdGpu::NumBits(vsharp.GetDataFmt()) >> 3; const u32 buf_stride = vsharp.GetStride(); ASSERT_MSG(buf_stride % fmt_stride == 0, "Texel buffer stride must match format stride"); @@ -600,9 +602,8 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding const u32 adjust = offset - offset_aligned; ASSERT(adjust % fmt_stride == 0); push_data.AddTexelOffset(binding.buffer, buf_stride / fmt_stride, adjust / fmt_stride); - buffer_view = - vk_buffer->View(offset_aligned, vsharp.GetSize() + adjust, desc.is_written, - vsharp.GetDataFmt(), vsharp.GetNumberFmt()); + buffer_view = vk_buffer->View(offset_aligned, vsharp.GetSize() + adjust, + desc.is_written, data_fmt, vsharp.GetNumberFmt()); if (auto barrier = vk_buffer->GetBarrier(desc.is_written ? vk::AccessFlagBits2::eShaderWrite : vk::AccessFlagBits2::eShaderRead, @@ -612,6 +613,11 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding if (desc.is_written) { texture_cache.InvalidateMemoryFromGPU(vsharp.base_address, vsharp.GetSize()); } + } else if (instance.IsNullDescriptorSupported()) { + buffer_view = VK_NULL_HANDLE; + } else { + buffer_view = + null_buffer.View(0, fmt_stride, desc.is_written, data_fmt, vsharp.GetNumberFmt()); } set_writes.push_back({ @@ -621,7 +627,7 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding .descriptorCount = 1, .descriptorType = desc.is_written ? vk::DescriptorType::eStorageTexelBuffer : vk::DescriptorType::eUniformTexelBuffer, - .pTexelBufferView = &buffer_view, + .pTexelBufferView = &buffer_views.emplace_back(buffer_view), }); ++binding.buffer; } From 869bf85e9a99eadd5e4f2d9fefa4f2d8164db3ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Tue, 7 Jan 2025 08:07:41 +0100 Subject: [PATCH 026/455] CI: Switch to Windows 2025 & Reduce Warnings (#2052) --- .github/workflows/build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3b5690438..5c4a34469 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,14 +14,14 @@ env: jobs: reuse: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 continue-on-error: true steps: - uses: actions/checkout@v4 - uses: fsfe/reuse-action@v5 clang-format: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 continue-on-error: true steps: - uses: actions/checkout@v4 @@ -39,7 +39,7 @@ jobs: run: ./.ci/clang-format.sh get-info: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 outputs: date: ${{ steps.vars.outputs.date }} shorthash: ${{ steps.vars.outputs.shorthash }} @@ -57,7 +57,7 @@ jobs: echo "fullhash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT windows-sdl: - runs-on: windows-latest + runs-on: windows-2025 needs: get-info steps: - uses: actions/checkout@v4 @@ -101,7 +101,7 @@ jobs: path: ${{github.workspace}}/build/shadPS4.exe windows-qt: - runs-on: windows-latest + runs-on: windows-2025 needs: get-info steps: - uses: actions/checkout@v4 From 7bf467c65304fb66bf96ee3e660032bfee8b4725 Mon Sep 17 00:00:00 2001 From: Daniel Nylander Date: Tue, 7 Jan 2025 08:55:53 +0100 Subject: [PATCH 027/455] Updated Swedish translation with additional strings (#2081) * Adding Swedish translation * Updated Swedish translation with additional strings Updated the Swedish translations using lupdate to found additional strings cd src/qt_gui/treanslations lupdate ../../../../shadPS4/ -tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS -no-obsolete -locations none -source-language en -ts sv.ts * Update sv.ts --- src/qt_gui/translations/sv.ts | 2739 +++++++++++++++++---------------- 1 file changed, 1409 insertions(+), 1330 deletions(-) diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 756119ba4..c1c1204f8 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -4,1333 +4,1412 @@ - AboutDialog - - About shadPS4 - Om shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 är en experimentell emulator för PlayStation 4 baserad på öppen källkod. - - - This software should not be used to play games you have not legally obtained. - Denna programvara bör inte användas för att spela spel som du inte legalt äger. - - - - ElfViewer - - Open Folder - Öppna mapp - - - - GameInfoClass - - Loading game list, please wait :3 - Läser in spellistan, vänta :3 - - - Cancel - Avbryt - - - Loading... - Läser in... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Välj katalog - - - Select which directory you want to install to. - Välj vilken katalog som du vill installera till. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Välj katalog - - - Directory to install games - Katalog att installera spel till - - - Browse - Bläddra - - - Error - Fel - - - The value for location to install games is not valid. - Värdet för platsen att installera spel till är inte giltig. - - - - GuiContextMenus - - Create Shortcut - Skapa genväg - - - Cheats / Patches - Fusk / Patchar - - - SFO Viewer - SFO-visare - - - Trophy Viewer - Trofé-visare - - - Open Folder... - Öppna mapp... - - - Open Game Folder - Öppna spelmapp - - - Open Save Data Folder - Öppna mapp för sparat data - - - Open Log Folder - Öppna loggmapp - - - Copy info... - Kopiera till... - - - Copy Name - Kopiera namn - - - Copy Serial - Kopiera serienummer - - - Copy All - Kopiera alla - - - Delete... - Ta bort... - - - Delete Game - Ta bort spel - - - Delete Update - Ta bort uppdatering - - - Delete DLC - Ta bort DLC - - - Compatibility... - Kompatibilitet... - - - Update database - Uppdatera databasen - - - View report - Visa rapport - - - Submit a report - Skicka en rapport - - - Shortcut creation - Skapa genväg - - - Shortcut created successfully! - Genvägen skapades! - - - Error - Fel - - - Error creating shortcut! - Fel vid skapandet av genväg! - - - Install PKG - Installera PKG - - - Game - Spel - - - requiresEnableSeparateUpdateFolder_MSG - Denna funktion kräver konfigurationsalternativet 'Aktivera separat uppdateringsmapp' för att fungera. Om du vill använda denna funktion, aktivera den - - - This game has no update to delete! - Detta spel har ingen uppdatering att ta bort! - - - Update - Uppdatera - - - This game has no DLC to delete! - Detta spel har inga DLC att ta bort! - - - DLC - DLC - - - Delete %1 - Ta bort %1 - - - Are you sure you want to delete %1's %2 directory? - Är du säker på att du vill ta bort %1s %2-katalog? - - - - MainWindow - - Open/Add Elf Folder - Öppna/Lägg till Elf-mapp - - - Install Packages (PKG) - Installera paket (PKG) - - - Boot Game - Starta spel - - - Check for Updates - Leta efter uppdateringar - - - About shadPS4 - Om shadPS4 - - - Configure... - Konfigurera... - - - Install application from a .pkg file - Installera program från en .pkg-fil - - - Recent Games - Senaste spel - - - Exit - Avsluta - - - Exit shadPS4 - Avsluta shadPS4 - - - Exit the application. - Avsluta programmet. - - - Show Game List - Visa spellista - - - Game List Refresh - Uppdatera spellista - - - Tiny - Mycket små - - - Small - Små - - - Medium - Medel - - - Large - Stora - - - List View - Listvy - - - Grid View - Rutnätsvy - - - Elf Viewer - Elf-visare - - - Game Install Directory - Installationskatalog för spel - - - Download Cheats/Patches - Hämta fusk/patchar - - - Dump Game List - Dumpa spellista - - - PKG Viewer - PKG-visare - - - Search... - Sök... - - - File - Arkiv - - - View - Visa - - - Game List Icons - Ikoner för spellista - - - Game List Mode - Läge för spellista - - - Settings - Inställningar - - - Utils - Verktyg - - - Themes - Teman - - - Help - Hjälp - - - Dark - Mörk - - - Light - Ljus - - - Green - Grön - - - Blue - Blå - - - Violet - Lila - - - toolBar - toolBar - - - Game List - Spellista - - - * Unsupported Vulkan Version - * Vulkan-versionen stöds inte - - - Download Cheats For All Installed Games - Hämta fusk för alla installerade spel - - - Download Patches For All Games - Hämta patchar för alla spel - - - Download Complete - Hämtning färdig - - - You have downloaded cheats for all the games you have installed. - Du har hämtat fusk till alla spelen som du har installerade. - - - Patches Downloaded Successfully! - Patchar hämtades ner! - - - All Patches available for all games have been downloaded. - Alla patchar tillgängliga för alla spel har hämtats ner. - - - Games: - Spel: - - - PKG File (*.PKG) - PKG-fil (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - Game Boot - Starta spel - - - Only one file can be selected! - Endast en fil kan väljas! - - - PKG Extraction - PKG-extrahering - - - Patch detected! - Patch upptäcktes! - - - PKG and Game versions match: - PKG och spelversioner matchar: - - - Would you like to overwrite? - Vill du skriva över? - - - PKG Version %1 is older than installed version: - PKG-versionen %1 är äldre än installerad version: - - - Game is installed: - Spelet är installerat: - - - Would you like to install Patch: - Vill du installera patch: - - - DLC Installation - DLC-installation - - - Would you like to install DLC: %1? - Vill du installera DLC: %1? - - - DLC already installed: - DLC redan installerat: - - - Game already installed - Spelet redan installerat - - - PKG is a patch, please install the game first! - PKH är en patch. Installera spelet först! - - - PKG ERROR - PKG-FEL - - - Extracting PKG %1/%2 - Extraherar PKG %1/%2 - - - Extraction Finished - Extrahering färdig - - - Game successfully installed at %1 - Spelet installerades i %1 - - - File doesn't appear to be a valid PKG file - Filen verkar inte vara en giltig PKG-fil - - - - PKGViewer - - Open Folder - Öppna mapp - - - - TrophyViewer - - Trophy Viewer - Trofé-visare - - - - SettingsDialog - - Settings - Inställningar - - - General - Allmänt - - - System - System - - - Console Language - Konsollspråk - - - Emulator Language - Emulatorspråk - - - Emulator - Emulator - - - Enable Fullscreen - Aktivera helskärm - - - Enable Separate Update Folder - Aktivera separat uppdateringsmapp - - - Show Splash - Visa startskärm - - - Is PS4 Pro - Är PS4 Pro - - - Enable Discord Rich Presence - Aktivera Discord Rich Presence - - - Username - Användarnamn - - - Trophy Key - Trofényckel - - - Trophy - Trofé - - - Logger - Loggning - - - Log Type - Loggtyp - - - Log Filter - Loggfilter - - - Input - Inmatning - - - Cursor - Pekare - - - Hide Cursor - Dölj pekare - - - Hide Cursor Idle Timeout - Dölj pekare vid overksam - - - s - s - - - Controller - Handkontroller - - - Back Button Behavior - Beteende för bakåtknapp - - - Graphics - Grafik - - - Graphics Device - Grafikenhet - - - Width - Bredd - - - Height - Höjd - - - Vblank Divider - Vblank Divider - - - Advanced - Avancerat - - - Enable Shaders Dumping - Aktivera Shaders Dumping - - - Enable NULL GPU - Aktivera NULL GPU - - - Paths - Sökvägar - - - Game Folders - Spelmappar - - - Add... - Lägg till... - - - Remove - Ta bort - - - Debug - Felsök - - - Enable Debug Dumping - Aktivera felsökningsdumpning - - - Enable Vulkan Validation Layers - Aktivera Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Aktivera Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Aktivera RenderDoc-felsökning - - - Update - Uppdatera - - - Check for Updates at Startup - Leta efter uppdateringar vid uppstart - - - Update Channel - Uppdateringskanal - - - Check for Updates - Leta efter uppdateringar - - - GUI Settings - Gränssnittsinställningar - - - Disable Trophy Pop-ups - Inaktivera popup för troféer - - - Play title music - Spela titelmusik - - - Update Compatibility Database On Startup - Uppdatera databas vid uppstart - - - Game Compatibility - Spelkompatibilitet - - - Display Compatibility Data - Visa kompatibilitetsdata - - - Update Compatibility Database - Uppdatera kompatibilitetsdatabasen - - - Volume - Volym - - - Audio Backend - Ljudbakände - - - Save - Spara - - - Apply - Verkställ - - - Restore Defaults - Återställ till standard - - - Close - Stäng - - - Point your mouse at an option to display its description. - Peka din mus på ett alternativ för att visa dess beskrivning. - - - consoleLanguageGroupBox - Konsollspråk:\nStäller in språket som PS4-spelet använder.\nDet rekommenderas att ställa in detta till ett språk som spelet har stöd för, vilket kan skilja sig mellan regioner - - - emulatorLanguageGroupBox - Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt - - - fullscreenCheckBox - Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka på F11-tangenten - - - separateUpdatesCheckBox - Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id - - - showSplashCheckBox - Visa startskärm:\nVisar spelets startskärm (en speciell bild) när spelet startas - - - ps4proCheckBox - Är PS4 Pro:\nGör att emulatorn fungerar som en PS4 PRO, som kan aktivera speciella funktioner i spel som har stöds för det - - - discordRPCCheckbox - Aktivera Discord Rich Presence:\nVisar emulatorikonen och relevant information på din Discord-profil - - - userName - Användarnamn:\nStäller in PS4ans användarkonto, som kan visas av vissa spel - - - TrophyKey - Trofényckel:\nNyckel som används för att avkryptera troféer. Måste hämtas från din konsoll (jailbroken).\nMåste innehålla endast hex-tecken - - - logTypeGroupBox - Loggtyp:\nStäller in huruvida synkronisering av utdata för loggfönstret för prestanda. Kan ha inverkan på emulationen - - - logFilter - Loggfilter:\nFiltrera loggen till att endast skriva ut specifik information.\nExempel: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNivåer: Trace, Debug, Info, Warning, Error, Critical - i den ordningen, en specifik nivå som tystar alla nivåer före den i listan och loggar allting efter den - - - updaterGroupBox - updaterGroupBox - - - GUIgroupBox - Spela upp titelmusik:\nOm ett spel har stöd för det kan speciell musik spelas upp från spelet i gränssnittet - - - disableTrophycheckBox - Inaktivera popup för troféer:\nInaktivera troféeaviseringar i spel. Troféförlopp kan fortfarande följas med Troféevisaren (högerklicka på spelet i huvudfönstret) - - - hideCursorGroupBox - Dölj pekare:\nVälj när muspekaren ska försvinna:\nAldrig: Du kommer alltid se muspekaren.\nOverksam: Ställ in en tid för när den ska försvinna efter den inte använts.\nAlltid: du kommer aldrig se muspekaren - - - idleTimeoutGroupBox - Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv - - - backButtonBehaviorGroupBox - Beteende för bakåtknapp:\nStäller in handkontrollerns bakåtknapp för att emulera ett tryck på angivna positionen på PS4ns touchpad - - - enableCompatibilityCheckBox - Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera "Uppdatera kompatibilitet vid uppstart" för att få uppdaterad information - - - checkCompatibilityOnStartupCheckBox - Uppdatera kompatibilitet vid uppstart:\nUppdatera automatiskt kompatibilitetsdatabasen när shadPS4 startar - - - updateCompatibilityButton - Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt - - - Never - Aldrig - - - Idle - Overksam - - - Always - Alltid - - - Touchpad Left - Touchpad vänster - - - Touchpad Right - Touchpad höger - - - Touchpad Center - Touchpad mitten - - - None - Ingen - - - graphicsAdapterGroupBox - Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja "Auto Select" för att automatiskt bestämma det - - - resolutionLayout - Bredd/Höjd:\nStäller in storleken för emulatorfönstret vid uppstart, som kan storleksändras under spelning.\nDetta är inte det samma som spelupplösningen - - - heightDivider - Vblank Divider:\nBildfrekvensen som emulatorn uppdaterar vid multipliceras med detta tal. Ändra detta kan ha inverkan på saker, såsom ökad spelhastighet eller göra sönder kritisk spelfunktionalitet, som inte förväntar sig denna ändring - - - dumpShadersCheckBox - Aktivera Shaders Dumping:\nFör teknisk felsökning, sparar spelets shaders till en mapp när de renderas - - - nullGpuCheckBox - Aktivera Null GPU:\nFör teknisk felsökning, inaktiverar spelrenderingen som om det inte fanns något grafikkort - - - gameFoldersBox - Spelmappar:\nListan över mappar att leta i efter installerade spel - - - addFolderButton - Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar till en separat mapp för enkel hantering.\nDetta kan manuellt skapas genom att lägga till den uppackade uppdateringen till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id - - - removeFolderButton - Ta bort:\nTa bort en mapp från listan - - - debugDump - Aktivera felsökningsdumpning:\nSparar import och export av symboler och fil-header-information för aktuellt körande PS4-program till en katalog - - - vkValidationCheckBox - Aktivera Vulkan Validation Layers:\nAktiverar ett system som validerar tillståndet för Vulkan renderer och loggar information om dess interna tillstånd.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen - - - vkSyncValidationCheckBox - Aktivera Vulkan Synchronization Validation:\nAktiverar ett system som validerar timing för Vulkan rendering tasks.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen - - - rdocCheckBox - Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta - - - - CheatsPatches - - Cheats / Patches for - Fusk / Patchar för - - - defaultTextEdit_MSG - Fusk/Patchar är experimentella.\nAnvänd med försiktighet.\n\nHämta fusk individuellt genom att välja förrådet och klicka på hämtningsknappen.\nUnder Patchar-fliken kan du hämta alla patchar på en gång, välj vilken du vill använda och spara ditt val.\n\nEftersom vi inte utvecklar fusk eller patchar,\nrapportera gärna problem till fuskets upphovsperson.\n\nSkapat ett nytt fusk? Besök:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Ingen bild tillgänglig - - - Serial: - Serienummer: - - - Version: - Version: - - - Size: - Storlek: - - - Select Cheat File: - Välj fuskfil: - - - Repository: - Förråd: - - - Download Cheats - Hämta fusk - - - Delete File - Ta bort fil - - - No files selected. - Inga filer valda. - - - You can delete the cheats you don't want after downloading them. - Du kan ta bort fusk som du inte vill ha efter de hämtats ner. - - - Do you want to delete the selected file?\n%1 - Vill du ta bort markerade filen?\n%1 - - - Select Patch File: - Välj patchfil: - - - Download Patches - Hämta patchar - - - Save - Spara - - - Cheats - Fusk - - - Patches - Patchar - - - Error - Fel - - - No patch selected. - Ingen patch vald. - - - Unable to open files.json for reading. - Kunde inte öppna files.json för läsning. - - - No patch file found for the current serial. - Ingen patchfil hittades för aktuella serienumret. - - - Unable to open the file for reading. - Kunde inte öppna filen för läsning. - - - Unable to open the file for writing. - Kunde inte öppna filen för skrivning. - - - Failed to parse XML: - Misslyckades med att tolka XML: - - - Success - Lyckades - - - Options saved successfully. - Inställningarna sparades. - - - Invalid Source - Ogiltig källa - - - The selected source is invalid. - Vald källa är ogiltig. - - - File Exists - Filen finns - - - File already exists. Do you want to replace it? - Filen finns redan. Vill du ersätta den? - - - Failed to save file: - Misslyckades med att spara fil: - - - Failed to download file: - Misslyckades med att hämta filen: - - - Cheats Not Found - Fusk hittades inte - - - CheatsNotFound_MSG - Inga fusk hittades för detta spel i denna version av det valda förrådet. Prova ett annat förråd eller en annan version av spelet - - - Cheats Downloaded Successfully - Fusk hämtades ner - - - CheatsDownloadedSuccessfully_MSG - Du har hämtat ner fusken för denna version av spelet från valt förråd. Du kan försöka att hämta från andra förråd, om de är tillgängliga så kan det vara möjligt att använda det genom att välja det genom att välja filen från listan - - - Failed to save: - Misslyckades med att spara: - - - Failed to download: - Misslyckades med att hämta: - - - Download Complete - Hämtning färdig - - - DownloadComplete_MSG - Patchhämtningen är färdig! Alla patchar tillgängliga för alla spel har hämtats och de behövs inte hämtas individuellt för varje spel som med fusk. Om patchen inte dyker upp kan det bero på att den inte finns för det specifika serienumret och versionen av spelet - - - Failed to parse JSON data from HTML. - Misslyckades med att tolka JSON-data från HTML. - - - Failed to retrieve HTML page. - Misslyckades med att hämta HTML-sida. - - - The game is in version: %1 - Spelet är i version: %1 - - - The downloaded patch only works on version: %1 - Hämtad patch fungerar endast på version: %1 - - - You may need to update your game. - Du kan behöva uppdatera ditt spel. - - - Incompatibility Notice - Inkompatibilitetsmeddelande - - - Failed to open file: - Misslyckades med att öppna filen: - - - XML ERROR: - XML-FEL: - - - Failed to open files.json for writing - Misslyckades med att öppna files.json för skrivning - - - Author: - Upphovsperson: - - - Directory does not exist: - Katalogen finns inte: - - - Failed to open files.json for reading. - Misslyckades med att öppna files.json för läsning. - - - Name: - Namn: - - - Can't apply cheats before the game is started - Kan inte tillämpa fusk innan spelet är startat - - - - GameListFrame - - Icon - Ikon - - - Name - Namn - - - Serial - Serienummer - - - Compatibility - Kompatibilitet - - - Region - Region - - - Firmware - Firmware - - - Size - Storlek - - - Version - Version - - - Path - Sökväg - - - Play Time - Speltid - - - Never Played - Aldrig spelat - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Kompatibilitet är otestat - - - Game does not initialize properly / crashes the emulator - Spelet initierar inte korrekt / kraschar emulatorn - - - Game boots, but only displays a blank screen - Spelet startar men visar endast en blank skärm - - - Game displays an image but does not go past the menu - Spelet visar en bild men kommer inte förbi menyn - - - Game has game-breaking glitches or unplayable performance - Spelet har allvarliga problem eller ospelbar prestanda - - - Game can be completed with playable performance and no major glitches - Spelet kan spelas klart med spelbar prestanda och utan större problem - - - - CheckUpdate - - Auto Updater - Automatisk uppdatering - - - Error - Fel - - - Network error: - Nätverksfel: - - - Failed to parse update information. - Misslyckades med att tolka uppdateringsinformationen. - - - No pre-releases found. - Inga förutgåva hittades. - - - Invalid release data. - Ogiltig release-data. - - - No download URL found for the specified asset. - Ingen hämtnings-URL hittades för angiven tillgång. - - - Your version is already up to date! - Din version är redan den senaste! - - - Update Available - Uppdatering tillgänglig - - - Update Channel - Uppdateringskanal - - - Current Version - Aktuell version - - - Latest Version - Senaste version - - - Do you want to update? - Vill du uppdatera? - - - Show Changelog - Visa ändringslogg - - - Check for Updates at Startup - Leta efter uppdateringar vid uppstart - - - Update - Uppdatera - - - No - Nej - - - Hide Changelog - Dölj ändringslogg - - - Changes - Ändringar - - - Network error occurred while trying to access the URL - Nätverksfel inträffade vid försök att komma åt URL:en - - - Download Complete - Hämtning färdig - - - The update has been downloaded, press OK to install. - Uppdateringen har hämtats. Tryck på Ok för att installera. - - - Failed to save the update file at - Misslyckades med att spara uppdateringsfilen i - - - Starting Update... - Startar uppdatering... - - - Failed to create the update script file - Misslyckades med att skapa uppdateringsskriptfil - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - \ No newline at end of file + AboutDialog + + About shadPS4 + Om shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 är en experimentell emulator för PlayStation 4 baserad på öppen källkod. + + + This software should not be used to play games you have not legally obtained. + Denna programvara bör inte användas för att spela spel som du inte legalt äger. + + + + CheatsPatches + + Cheats / Patches for + Fusk / Patchar för + + + defaultTextEdit_MSG + Fusk/Patchar är experimentella.\nAnvänd med försiktighet.\n\nHämta fusk individuellt genom att välja förrådet och klicka på hämtningsknappen.\nUnder Patchar-fliken kan du hämta alla patchar på en gång, välj vilken du vill använda och spara ditt val.\n\nEftersom vi inte utvecklar fusk eller patchar,\nrapportera gärna problem till fuskets upphovsperson.\n\nSkapat ett nytt fusk? Besök:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Ingen bild tillgänglig + + + Serial: + Serienummer: + + + Version: + Version: + + + Size: + Storlek: + + + Select Cheat File: + Välj fuskfil: + + + Repository: + Förråd: + + + Download Cheats + Hämta fusk + + + Delete File + Ta bort fil + + + No files selected. + Inga filer valda. + + + You can delete the cheats you don't want after downloading them. + Du kan ta bort fusk som du inte vill ha efter de hämtats ner. + + + Do you want to delete the selected file?\n%1 + Vill du ta bort markerade filen?\n%1 + + + Select Patch File: + Välj patchfil: + + + Download Patches + Hämta patchar + + + Save + Spara + + + Cheats + Fusk + + + Patches + Patchar + + + Error + Fel + + + No patch selected. + Ingen patch vald. + + + Unable to open files.json for reading. + Kunde inte öppna files.json för läsning. + + + No patch file found for the current serial. + Ingen patchfil hittades för aktuella serienumret. + + + Unable to open the file for reading. + Kunde inte öppna filen för läsning. + + + Unable to open the file for writing. + Kunde inte öppna filen för skrivning. + + + Failed to parse XML: + Misslyckades med att tolka XML: + + + Success + Lyckades + + + Options saved successfully. + Inställningarna sparades. + + + Invalid Source + Ogiltig källa + + + The selected source is invalid. + Vald källa är ogiltig. + + + File Exists + Filen finns + + + File already exists. Do you want to replace it? + Filen finns redan. Vill du ersätta den? + + + Failed to save file: + Misslyckades med att spara fil: + + + Failed to download file: + Misslyckades med att hämta filen: + + + Cheats Not Found + Fusk hittades inte + + + CheatsNotFound_MSG + Inga fusk hittades för detta spel i denna version av det valda förrådet. Prova ett annat förråd eller en annan version av spelet + + + Cheats Downloaded Successfully + Fusk hämtades ner + + + CheatsDownloadedSuccessfully_MSG + Du har hämtat ner fusken för denna version av spelet från valt förråd. Du kan försöka att hämta från andra förråd, om de är tillgängliga så kan det vara möjligt att använda det genom att välja det genom att välja filen från listan + + + Failed to save: + Misslyckades med att spara: + + + Failed to download: + Misslyckades med att hämta: + + + Download Complete + Hämtning färdig + + + DownloadComplete_MSG + Patchhämtningen är färdig! Alla patchar tillgängliga för alla spel har hämtats och de behövs inte hämtas individuellt för varje spel som med fusk. Om patchen inte dyker upp kan det bero på att den inte finns för det specifika serienumret och versionen av spelet + + + Failed to parse JSON data from HTML. + Misslyckades med att tolka JSON-data från HTML. + + + Failed to retrieve HTML page. + Misslyckades med att hämta HTML-sida. + + + The game is in version: %1 + Spelet är i version: %1 + + + The downloaded patch only works on version: %1 + Hämtad patch fungerar endast på version: %1 + + + You may need to update your game. + Du kan behöva uppdatera ditt spel. + + + Incompatibility Notice + Inkompatibilitetsmeddelande + + + Failed to open file: + Misslyckades med att öppna filen: + + + XML ERROR: + XML-FEL: + + + Failed to open files.json for writing + Misslyckades med att öppna files.json för skrivning + + + Author: + Upphovsperson: + + + Directory does not exist: + Katalogen finns inte: + + + Failed to open files.json for reading. + Misslyckades med att öppna files.json för läsning. + + + Name: + Namn: + + + Can't apply cheats before the game is started + Kan inte tillämpa fusk innan spelet är startat + + + Error: + Fel: + + + ERROR + FEL + + + + CheckUpdate + + Auto Updater + Automatisk uppdatering + + + Error + Fel + + + Network error: + Nätverksfel: + + + Failed to parse update information. + Misslyckades med att tolka uppdateringsinformationen. + + + No pre-releases found. + Inga förutgåva hittades. + + + Invalid release data. + Ogiltig release-data. + + + No download URL found for the specified asset. + Ingen hämtnings-URL hittades för angiven tillgång. + + + Your version is already up to date! + Din version är redan den senaste! + + + Update Available + Uppdatering tillgänglig + + + Update Channel + Uppdateringskanal + + + Current Version + Aktuell version + + + Latest Version + Senaste version + + + Do you want to update? + Vill du uppdatera? + + + Show Changelog + Visa ändringslogg + + + Check for Updates at Startup + Leta efter uppdateringar vid uppstart + + + Update + Uppdatera + + + No + Nej + + + Hide Changelog + Dölj ändringslogg + + + Changes + Ändringar + + + Network error occurred while trying to access the URL + Nätverksfel inträffade vid försök att komma åt URL:en + + + Download Complete + Hämtning färdig + + + The update has been downloaded, press OK to install. + Uppdateringen har hämtats. Tryck på Ok för att installera. + + + Failed to save the update file at + Misslyckades med att spara uppdateringsfilen i + + + Starting Update... + Startar uppdatering... + + + Failed to create the update script file + Misslyckades med att skapa uppdateringsskriptfil + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Hämtar kompatibilitetsdata, vänta + + + Cancel + Avbryt + + + Loading... + Läser in... + + + Error + Fel + + + Unable to update compatibility data! Try again later. + Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. + + + Unable to open compatibility.json for writing. + Kunde inte öppna compatibility.json för skrivning. + + + + ElfViewer + + Open Folder + Öppna mapp + + + + GameInfoClass + + Loading game list, please wait :3 + Läser in spellistan, vänta :3 + + + Cancel + Avbryt + + + Loading... + Läser in... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Välj katalog + + + Directory to install games + Katalog att installera spel till + + + Browse + Bläddra + + + Error + Fel + + + Directory to install DLC + Katalog för att installera DLC + + + + GameListFrame + + Icon + Ikon + + + Name + Namn + + + Serial + Serienummer + + + Compatibility + Kompatibilitet + + + Region + Region + + + Firmware + Firmware + + + Size + Storlek + + + Version + Version + + + Path + Sökväg + + + Play Time + Speltid + + + Never Played + Aldrig spelat + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Kompatibilitet är otestat + + + Game does not initialize properly / crashes the emulator + Spelet initierar inte korrekt / kraschar emulatorn + + + Game boots, but only displays a blank screen + Spelet startar men visar endast en blank skärm + + + Game displays an image but does not go past the menu + Spelet visar en bild men kommer inte förbi menyn + + + Game has game-breaking glitches or unplayable performance + Spelet har allvarliga problem eller ospelbar prestanda + + + Game can be completed with playable performance and no major glitches + Spelet kan spelas klart med spelbar prestanda och utan större problem + + + Click to go to issue + Klicka för att gå till problem + + + Last updated + Senast uppdaterad + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Skapa genväg + + + Cheats / Patches + Fusk / Patchar + + + SFO Viewer + SFO-visare + + + Trophy Viewer + Trofé-visare + + + Open Folder... + Öppna mapp... + + + Open Game Folder + Öppna spelmapp + + + Open Save Data Folder + Öppna mapp för sparat data + + + Open Log Folder + Öppna loggmapp + + + Copy info... + Kopiera till... + + + Copy Name + Kopiera namn + + + Copy Serial + Kopiera serienummer + + + Copy All + Kopiera alla + + + Delete... + Ta bort... + + + Delete Game + Ta bort spel + + + Delete Update + Ta bort uppdatering + + + Delete DLC + Ta bort DLC + + + Compatibility... + Kompatibilitet... + + + Update database + Uppdatera databasen + + + View report + Visa rapport + + + Submit a report + Skicka en rapport + + + Shortcut creation + Skapa genväg + + + Shortcut created successfully! + Genvägen skapades! + + + Error + Fel + + + Error creating shortcut! + Fel vid skapandet av genväg! + + + Install PKG + Installera PKG + + + Game + Spel + + + This game has no update to delete! + Detta spel har ingen uppdatering att ta bort! + + + Update + Uppdatera + + + This game has no DLC to delete! + Detta spel har inga DLC att ta bort! + + + DLC + DLC + + + Delete %1 + Ta bort %1 + + + Are you sure you want to delete %1's %2 directory? + Är du säker på att du vill ta bort %1s %2-katalog? + + + Failed to convert icon. + Misslyckades med att konvertera ikon. + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Välj katalog + + + Select which directory you want to install to. + Välj vilken katalog som du vill installera till. + + + + MainWindow + + Open/Add Elf Folder + Öppna/Lägg till Elf-mapp + + + Install Packages (PKG) + Installera paket (PKG) + + + Boot Game + Starta spel + + + Check for Updates + Leta efter uppdateringar + + + About shadPS4 + Om shadPS4 + + + Configure... + Konfigurera... + + + Install application from a .pkg file + Installera program från en .pkg-fil + + + Recent Games + Senaste spel + + + Exit + Avsluta + + + Exit shadPS4 + Avsluta shadPS4 + + + Exit the application. + Avsluta programmet. + + + Show Game List + Visa spellista + + + Game List Refresh + Uppdatera spellista + + + Tiny + Mycket små + + + Small + Små + + + Medium + Medel + + + Large + Stora + + + List View + Listvy + + + Grid View + Rutnätsvy + + + Elf Viewer + Elf-visare + + + Game Install Directory + Installationskatalog för spel + + + Download Cheats/Patches + Hämta fusk/patchar + + + Dump Game List + Dumpa spellista + + + PKG Viewer + PKG-visare + + + Search... + Sök... + + + File + Arkiv + + + View + Visa + + + Game List Icons + Ikoner för spellista + + + Game List Mode + Läge för spellista + + + Settings + Inställningar + + + Utils + Verktyg + + + Themes + Teman + + + Help + Hjälp + + + Dark + Mörk + + + Light + Ljus + + + Green + Grön + + + Blue + Blå + + + Violet + Lila + + + toolBar + toolBar + + + Game List + Spellista + + + * Unsupported Vulkan Version + * Vulkan-versionen stöds inte + + + Download Cheats For All Installed Games + Hämta fusk för alla installerade spel + + + Download Patches For All Games + Hämta patchar för alla spel + + + Download Complete + Hämtning färdig + + + You have downloaded cheats for all the games you have installed. + Du har hämtat fusk till alla spelen som du har installerade. + + + Patches Downloaded Successfully! + Patchar hämtades ner! + + + All Patches available for all games have been downloaded. + Alla patchar tillgängliga för alla spel har hämtats ner. + + + Games: + Spel: + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + Game Boot + Starta spel + + + Only one file can be selected! + Endast en fil kan väljas! + + + PKG Extraction + PKG-extrahering + + + Patch detected! + Patch upptäcktes! + + + PKG and Game versions match: + PKG och spelversioner matchar: + + + Would you like to overwrite? + Vill du skriva över? + + + PKG Version %1 is older than installed version: + PKG-versionen %1 är äldre än installerad version: + + + Game is installed: + Spelet är installerat: + + + Would you like to install Patch: + Vill du installera patch: + + + DLC Installation + DLC-installation + + + Would you like to install DLC: %1? + Vill du installera DLC: %1? + + + DLC already installed: + DLC redan installerat: + + + Game already installed + Spelet redan installerat + + + PKG ERROR + PKG-FEL + + + Extracting PKG %1/%2 + Extraherar PKG %1/%2 + + + Extraction Finished + Extrahering färdig + + + Game successfully installed at %1 + Spelet installerades i %1 + + + File doesn't appear to be a valid PKG file + Filen verkar inte vara en giltig PKG-fil + + + Run Game + Kör spel + + + Eboot.bin file not found + Filen eboot.bin hittades inte + + + PKG File (*.PKG *.pkg) + PKG-fil (*.PKG *.pkg) + + + PKG is a patch or DLC, please install the game first! + PKG är en patch eller DLC. Installera spelet först! + + + Game is already running! + Spelet är redan igång! + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Öppna mapp + + + &File + &Arkiv + + + PKG ERROR + PKG-FEL + + + + SettingsDialog + + Settings + Inställningar + + + General + Allmänt + + + System + System + + + Console Language + Konsollspråk + + + Emulator Language + Emulatorspråk + + + Emulator + Emulator + + + Enable Fullscreen + Aktivera helskärm + + + Enable Separate Update Folder + Aktivera separat uppdateringsmapp + + + Show Splash + Visa startskärm + + + Enable Discord Rich Presence + Aktivera Discord Rich Presence + + + Username + Användarnamn + + + Trophy Key + Trofényckel + + + Trophy + Trofé + + + Logger + Loggning + + + Log Type + Loggtyp + + + Log Filter + Loggfilter + + + Input + Inmatning + + + Cursor + Pekare + + + Hide Cursor + Dölj pekare + + + Hide Cursor Idle Timeout + Dölj pekare vid overksam + + + s + s + + + Controller + Handkontroller + + + Back Button Behavior + Beteende för bakåtknapp + + + Graphics + Grafik + + + Graphics Device + Grafikenhet + + + Width + Bredd + + + Height + Höjd + + + Vblank Divider + Vblank Divider + + + Advanced + Avancerat + + + Enable Shaders Dumping + Aktivera Shaders Dumping + + + Enable NULL GPU + Aktivera NULL GPU + + + Paths + Sökvägar + + + Game Folders + Spelmappar + + + Add... + Lägg till... + + + Remove + Ta bort + + + Debug + Felsök + + + Enable Debug Dumping + Aktivera felsökningsdumpning + + + Enable Vulkan Validation Layers + Aktivera Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Aktivera Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Aktivera RenderDoc-felsökning + + + Update + Uppdatera + + + Check for Updates at Startup + Leta efter uppdateringar vid uppstart + + + Update Channel + Uppdateringskanal + + + Check for Updates + Leta efter uppdateringar + + + GUI Settings + Gränssnittsinställningar + + + Disable Trophy Pop-ups + Inaktivera popup för troféer + + + Play title music + Spela titelmusik + + + Update Compatibility Database On Startup + Uppdatera databas vid uppstart + + + Game Compatibility + Spelkompatibilitet + + + Display Compatibility Data + Visa kompatibilitetsdata + + + Update Compatibility Database + Uppdatera kompatibilitetsdatabasen + + + Volume + Volym + + + Save + Spara + + + Apply + Verkställ + + + Restore Defaults + Återställ till standard + + + Close + Stäng + + + Point your mouse at an option to display its description. + Peka din mus på ett alternativ för att visa dess beskrivning. + + + consoleLanguageGroupBox + Konsollspråk:\nStäller in språket som PS4-spelet använder.\nDet rekommenderas att ställa in detta till ett språk som spelet har stöd för, vilket kan skilja sig mellan regioner + + + emulatorLanguageGroupBox + Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt + + + fullscreenCheckBox + Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka på F11-tangenten + + + separateUpdatesCheckBox + Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id + + + showSplashCheckBox + Visa startskärm:\nVisar spelets startskärm (en speciell bild) när spelet startas + + + discordRPCCheckbox + Aktivera Discord Rich Presence:\nVisar emulatorikonen och relevant information på din Discord-profil + + + userName + Användarnamn:\nStäller in PS4ans användarkonto, som kan visas av vissa spel + + + TrophyKey + Trofényckel:\nNyckel som används för att avkryptera troféer. Måste hämtas från din konsoll (jailbroken).\nMåste innehålla endast hex-tecken + + + logTypeGroupBox + Loggtyp:\nStäller in huruvida synkronisering av utdata för loggfönstret för prestanda. Kan ha inverkan på emulationen + + + logFilter + Loggfilter:\nFiltrera loggen till att endast skriva ut specifik information.\nExempel: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNivåer: Trace, Debug, Info, Warning, Error, Critical - i den ordningen, en specifik nivå som tystar alla nivåer före den i listan och loggar allting efter den + + + updaterGroupBox + updaterGroupBox + + + GUIgroupBox + Spela upp titelmusik:\nOm ett spel har stöd för det kan speciell musik spelas upp från spelet i gränssnittet + + + disableTrophycheckBox + Inaktivera popup för troféer:\nInaktivera troféeaviseringar i spel. Troféförlopp kan fortfarande följas med Troféevisaren (högerklicka på spelet i huvudfönstret) + + + hideCursorGroupBox + Dölj pekare:\nVälj när muspekaren ska försvinna:\nAldrig: Du kommer alltid se muspekaren.\nOverksam: Ställ in en tid för när den ska försvinna efter den inte använts.\nAlltid: du kommer aldrig se muspekaren + + + idleTimeoutGroupBox + Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv + + + backButtonBehaviorGroupBox + Beteende för bakåtknapp:\nStäller in handkontrollerns bakåtknapp för att emulera ett tryck på angivna positionen på PS4ns touchpad + + + enableCompatibilityCheckBox + Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera "Uppdatera kompatibilitet vid uppstart" för att få uppdaterad information + + + checkCompatibilityOnStartupCheckBox + Uppdatera kompatibilitet vid uppstart:\nUppdatera automatiskt kompatibilitetsdatabasen när shadPS4 startar + + + updateCompatibilityButton + Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt + + + Never + Aldrig + + + Idle + Overksam + + + Always + Alltid + + + Touchpad Left + Touchpad vänster + + + Touchpad Right + Touchpad höger + + + Touchpad Center + Touchpad mitten + + + None + Ingen + + + graphicsAdapterGroupBox + Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja "Auto Select" för att automatiskt bestämma det + + + resolutionLayout + Bredd/Höjd:\nStäller in storleken för emulatorfönstret vid uppstart, som kan storleksändras under spelning.\nDetta är inte det samma som spelupplösningen + + + heightDivider + Vblank Divider:\nBildfrekvensen som emulatorn uppdaterar vid multipliceras med detta tal. Ändra detta kan ha inverkan på saker, såsom ökad spelhastighet eller göra sönder kritisk spelfunktionalitet, som inte förväntar sig denna ändring + + + dumpShadersCheckBox + Aktivera Shaders Dumping:\nFör teknisk felsökning, sparar spelets shaders till en mapp när de renderas + + + nullGpuCheckBox + Aktivera Null GPU:\nFör teknisk felsökning, inaktiverar spelrenderingen som om det inte fanns något grafikkort + + + gameFoldersBox + Spelmappar:\nListan över mappar att leta i efter installerade spel + + + addFolderButton + Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar till en separat mapp för enkel hantering.\nDetta kan manuellt skapas genom att lägga till den uppackade uppdateringen till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id + + + removeFolderButton + Ta bort:\nTa bort en mapp från listan + + + debugDump + Aktivera felsökningsdumpning:\nSparar import och export av symboler och fil-header-information för aktuellt körande PS4-program till en katalog + + + vkValidationCheckBox + Aktivera Vulkan Validation Layers:\nAktiverar ett system som validerar tillståndet för Vulkan renderer och loggar information om dess interna tillstånd.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen + + + vkSyncValidationCheckBox + Aktivera Vulkan Synchronization Validation:\nAktiverar ett system som validerar timing för Vulkan rendering tasks.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen + + + rdocCheckBox + Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta + + + Release + Release + + + Nightly + Nightly + + + Set the volume of the background music. + Ställ in volymen för bakgrundsmusiken. + + + async + asynk + + + sync + synk + + + Directory to install games + Katalog att installera spel till + + + + TrophyViewer + + Trophy Viewer + Trofé-visare + + + From 86038e6a71258e9a2f34c61911a1c48b4c627950 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 7 Jan 2025 01:36:14 -0800 Subject: [PATCH 028/455] shader_recompiler: Fix V_CMP_U_F32 (#2082) --- src/shader_recompiler/frontend/translate/vector_alu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 2b32ca2ce..7fa83eebb 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -904,7 +904,7 @@ void Translator::V_CMP_F32(ConditionOp op, bool set_exec, const GcnInst& inst) { case ConditionOp::GE: return ir.FPGreaterThanEqual(src0, src1); case ConditionOp::U: - return ir.LogicalNot(ir.LogicalAnd(ir.FPIsNan(src0), ir.FPIsNan(src1))); + return ir.LogicalOr(ir.FPIsNan(src0), ir.FPIsNan(src1)); default: UNREACHABLE(); } From c3ecf599ad779361a44d2dd6b6823a8c1a6f93da Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Tue, 7 Jan 2025 10:50:54 +0100 Subject: [PATCH 029/455] Add motion controls toggle (#2029) * Add motion controls toggle * clang --- src/common/config.cpp | 11 +++++++++++ src/common/config.h | 4 +++- src/input/controller.cpp | 31 +++++++++++++++---------------- src/qt_gui/settings_dialog.cpp | 3 +++ src/qt_gui/settings_dialog.ui | 7 +++++++ 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 9e2cc0020..1838f35fc 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -47,6 +47,7 @@ static std::string updateChannel; static std::string backButtonBehavior = "left"; static bool useSpecialPad = false; static int specialPadClass = 1; +static bool isMotionControlsEnabled = true; static bool isDebugDump = false; static bool isShaderDebug = false; static bool isShowSplash = false; @@ -172,6 +173,10 @@ int getSpecialPadClass() { return specialPadClass; } +bool getIsMotionControlsEnabled() { + return isMotionControlsEnabled; +} + bool debugDump() { return isDebugDump; } @@ -368,6 +373,10 @@ void setSpecialPadClass(int type) { specialPadClass = type; } +void setIsMotionControlsEnabled(bool use) { + isMotionControlsEnabled = use; +} + void setSeparateUpdateEnabled(bool use) { separateupdatefolder = use; } @@ -594,6 +603,7 @@ void load(const std::filesystem::path& path) { backButtonBehavior = toml::find_or(input, "backButtonBehavior", "left"); useSpecialPad = toml::find_or(input, "useSpecialPad", false); specialPadClass = toml::find_or(input, "specialPadClass", 1); + isMotionControlsEnabled = toml::find_or(input, "isMotionControlsEnabled", true); } if (data.contains("GPU")) { @@ -709,6 +719,7 @@ void save(const std::filesystem::path& path) { data["Input"]["backButtonBehavior"] = backButtonBehavior; data["Input"]["useSpecialPad"] = useSpecialPad; data["Input"]["specialPadClass"] = specialPadClass; + data["Input"]["isMotionControlsEnabled"] = isMotionControlsEnabled; data["GPU"]["screenWidth"] = screenWidth; data["GPU"]["screenHeight"] = screenHeight; data["GPU"]["nullGpu"] = isNullGpu; diff --git a/src/common/config.h b/src/common/config.h index 2b9a35449..d2860bec5 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -38,6 +38,7 @@ int getCursorHideTimeout(); std::string getBackButtonBehavior(); bool getUseSpecialPad(); int getSpecialPadClass(); +bool getIsMotionControlsEnabled(); u32 getScreenWidth(); u32 getScreenHeight(); @@ -84,6 +85,7 @@ void setCursorHideTimeout(int newcursorHideTimeout); void setBackButtonBehavior(const std::string& type); void setUseSpecialPad(bool use); void setSpecialPadClass(int type); +void setIsMotionControlsEnabled(bool use); void setLogType(const std::string& type); void setLogFilter(const std::string& type); @@ -139,4 +141,4 @@ void setDefaultValues(); // settings u32 GetLanguage(); -}; // namespace Config \ No newline at end of file +}; // namespace Config diff --git a/src/input/controller.cpp b/src/input/controller.cpp index 366d80f8f..eb43e6adf 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include "common/config.h" #include "common/logging/log.h" #include "core/libraries/kernel/time.h" #include "core/libraries/pad/pad.h" @@ -189,11 +190,6 @@ void GameController::CalculateOrientation(Libraries::Pad::OrbisFVector3& acceler gz += Kp * ez + Ki * eInt[2]; //// Integrate rate of change of quaternion - // float pa = q2, pb = q3, pc = q4; - // q1 += (-q2 * gx - q3 * gy - q4 * gz) * (0.5f * deltaTime); - // q2 += (pa * gx + pb * gz - pc * gy) * (0.5f * deltaTime); - // q3 += (pb * gy - pa * gz + pc * gx) * (0.5f * deltaTime); - // q4 += (pc * gz + pa * gy - pb * gx) * (0.5f * deltaTime); q1 += (-q2 * gx - q3 * gy - q4 * gz) * (0.5f * deltaTime); q2 += (q1 * gx + q3 * gz - q4 * gy) * (0.5f * deltaTime); q3 += (q1 * gy - q2 * gz + q4 * gx) * (0.5f * deltaTime); @@ -247,18 +243,21 @@ void GameController::TryOpenSDLController() { int gamepad_count; SDL_JoystickID* gamepads = SDL_GetGamepads(&gamepad_count); m_sdl_gamepad = gamepad_count > 0 ? SDL_OpenGamepad(gamepads[0]) : nullptr; - if (SDL_SetGamepadSensorEnabled(m_sdl_gamepad, SDL_SENSOR_GYRO, true)) { - gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_sdl_gamepad, SDL_SENSOR_GYRO); - LOG_INFO(Input, "Gyro initialized, poll rate: {}", gyro_poll_rate); - } else { - LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad"); - } - if (SDL_SetGamepadSensorEnabled(m_sdl_gamepad, SDL_SENSOR_ACCEL, true)) { - accel_poll_rate = SDL_GetGamepadSensorDataRate(m_sdl_gamepad, SDL_SENSOR_ACCEL); - LOG_INFO(Input, "Accel initialized, poll rate: {}", accel_poll_rate); - } else { - LOG_ERROR(Input, "Failed to initialize accel controls for gamepad"); + if (Config::getIsMotionControlsEnabled()) { + if (SDL_SetGamepadSensorEnabled(m_sdl_gamepad, SDL_SENSOR_GYRO, true)) { + gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_sdl_gamepad, SDL_SENSOR_GYRO); + LOG_INFO(Input, "Gyro initialized, poll rate: {}", gyro_poll_rate); + } else { + LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad"); + } + if (SDL_SetGamepadSensorEnabled(m_sdl_gamepad, SDL_SENSOR_ACCEL, true)) { + accel_poll_rate = SDL_GetGamepadSensorDataRate(m_sdl_gamepad, SDL_SENSOR_ACCEL); + LOG_INFO(Input, "Accel initialized, poll rate: {}", accel_poll_rate); + } else { + LOG_ERROR(Input, "Failed to initialize accel controls for gamepad"); + } } + SDL_free(gamepads); SetLightBarRGB(0, 0, 255); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 6d76a5318..1a03345e4 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -339,6 +339,8 @@ void SettingsDialog::LoadValuesFromConfig() { toml::find_or(data, "Input", "backButtonBehavior", "left")); int index = ui->backButtonBehaviorComboBox->findData(backButtonBehavior); ui->backButtonBehaviorComboBox->setCurrentIndex(index != -1 ? index : 0); + ui->motionControlsCheckBox->setChecked( + toml::find_or(data, "Input", "isMotionControlsEnabled", true)); ui->removeFolderButton->setEnabled(!ui->gameFoldersListWidget->selectedItems().isEmpty()); ResetInstallFolders(); @@ -532,6 +534,7 @@ void SettingsDialog::UpdateSettings() { const QVector TouchPadIndex = {"left", "center", "right", "none"}; Config::setBackButtonBehavior(TouchPadIndex[ui->backButtonBehaviorComboBox->currentIndex()]); + Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); Config::setFullscreenMode(ui->fullscreenCheckBox->isChecked()); Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 2e7e3db37..cefe1f7c7 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -815,6 +815,13 @@ + + + + Enable Motion Controls + + + From b0d7feb2929a03b7bccd2adb799009487b4fd59b Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 7 Jan 2025 02:21:49 -0800 Subject: [PATCH 030/455] video_core: Implement conversion for uncommon/unsupported number formats. (#2047) * video_core: Implement conversion for uncommon/unsupported number formats. * shader_recompiler: Reinterpret image sample output as well. * liverpool_to_vk: Remove mappings for remapped number formats. These were poorly supported by drivers anyway. * resource_tracking_pass: Fix image write swizzle mistake. * amdgpu: Add missing specialization and move format mapping data to types * reinterpret: Fix U/SToF input type. --- .../frontend/translate/export.cpp | 9 +- .../ir/passes/resource_tracking_pass.cpp | 522 +++++++++--------- src/shader_recompiler/ir/reinterpret.h | 64 ++- src/shader_recompiler/runtime_info.h | 1 + src/shader_recompiler/specialization.h | 4 + src/video_core/amdgpu/liverpool.h | 8 +- src/video_core/amdgpu/pixel_format.cpp | 2 +- src/video_core/amdgpu/resource.h | 102 +--- src/video_core/amdgpu/types.h | 122 +++- .../renderer_vulkan/liverpool_to_vk.cpp | 33 +- .../renderer_vulkan/vk_graphics_pipeline.h | 1 + .../renderer_vulkan/vk_pipeline_cache.cpp | 3 + 12 files changed, 486 insertions(+), 385 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/export.cpp b/src/shader_recompiler/frontend/translate/export.cpp index 83240e17f..38ff9ae14 100644 --- a/src/shader_recompiler/frontend/translate/export.cpp +++ b/src/shader_recompiler/frontend/translate/export.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "shader_recompiler/frontend/translate/translate.h" +#include "shader_recompiler/ir/reinterpret.h" #include "shader_recompiler/runtime_info.h" namespace Shader::Gcn { @@ -31,14 +32,16 @@ void Translator::EmitExport(const GcnInst& inst) { return; } const u32 index = u32(attrib) - u32(IR::Attribute::RenderTarget0); - const auto [r, g, b, a] = runtime_info.fs_info.color_buffers[index].swizzle; + const auto col_buf = runtime_info.fs_info.color_buffers[index]; + const auto converted = IR::ApplyWriteNumberConversion(ir, value, col_buf.num_conversion); + const auto [r, g, b, a] = col_buf.swizzle; const std::array swizzle_array = {r, g, b, a}; const auto swizzled_comp = swizzle_array[comp]; if (u32(swizzled_comp) < u32(AmdGpu::CompSwizzle::Red)) { - ir.SetAttribute(attrib, value, comp); + ir.SetAttribute(attrib, converted, comp); return; } - ir.SetAttribute(attrib, value, u32(swizzled_comp) - u32(AmdGpu::CompSwizzle::Red)); + ir.SetAttribute(attrib, converted, u32(swizzled_comp) - u32(AmdGpu::CompSwizzle::Red)); }; const auto unpack = [&](u32 idx) { diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index 636752912..f7040ad75 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -301,8 +301,7 @@ s32 TryHandleInlineCbuf(IR::Inst& inst, Info& info, Descriptors& descriptors, }); } -void PatchBufferInstruction(IR::Block& block, IR::Inst& inst, Info& info, - Descriptors& descriptors) { +void PatchBufferSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& descriptors) { s32 binding{}; AmdGpu::Buffer buffer; if (binding = TryHandleInlineCbuf(inst, info, descriptors, buffer); binding == -1) { @@ -317,19 +316,191 @@ void PatchBufferInstruction(IR::Block& block, IR::Inst& inst, Info& info, }); } - // Update buffer descriptor format. - const auto inst_info = inst.Flags(); - // Replace handle with binding index in buffer resource list. IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; inst.SetArg(0, ir.Imm32(binding)); +} + +void PatchTextureBufferSharp(IR::Block& block, IR::Inst& inst, Info& info, + Descriptors& descriptors) { + const IR::Inst* handle = inst.Arg(0).InstRecursive(); + const IR::Inst* producer = handle->Arg(0).InstRecursive(); + const auto sharp = TrackSharp(producer, info); + const s32 binding = descriptors.Add(TextureBufferResource{ + .sharp_idx = sharp, + .is_written = inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32, + }); + + // Replace handle with binding index in texture buffer resource list. + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + inst.SetArg(0, ir.Imm32(binding)); +} + +void PatchImageSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& descriptors) { + const auto pred = [](const IR::Inst* inst) -> std::optional { + const auto opcode = inst->GetOpcode(); + if (opcode == IR::Opcode::CompositeConstructU32x2 || // IMAGE_SAMPLE (image+sampler) + opcode == IR::Opcode::ReadConst || // IMAGE_LOAD (image only) + opcode == IR::Opcode::GetUserData) { + return inst; + } + return std::nullopt; + }; + const auto result = IR::BreadthFirstSearch(&inst, pred); + ASSERT_MSG(result, "Unable to find image sharp source"); + const IR::Inst* producer = result.value(); + const bool has_sampler = producer->GetOpcode() == IR::Opcode::CompositeConstructU32x2; + const auto tsharp_handle = has_sampler ? producer->Arg(0).InstRecursive() : producer; + + // Read image sharp. + const auto tsharp = TrackSharp(tsharp_handle, info); + const auto inst_info = inst.Flags(); + auto image = info.ReadUdSharp(tsharp); + if (!image.Valid()) { + LOG_ERROR(Render_Vulkan, "Shader compiled with unbound image!"); + image = AmdGpu::Image::Null(); + } + ASSERT(image.GetType() != AmdGpu::ImageType::Invalid); + const bool is_read = inst.GetOpcode() == IR::Opcode::ImageRead; + const bool is_written = inst.GetOpcode() == IR::Opcode::ImageWrite; + + // Patch image instruction if image is FMask. + if (image.IsFmask()) { + ASSERT_MSG(!is_written, "FMask storage instructions are not supported"); + + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + switch (inst.GetOpcode()) { + case IR::Opcode::ImageRead: + case IR::Opcode::ImageSampleRaw: { + IR::F32 fmaskx = ir.BitCast(ir.Imm32(0x76543210)); + IR::F32 fmasky = ir.BitCast(ir.Imm32(0xfedcba98)); + inst.ReplaceUsesWith(ir.CompositeConstruct(fmaskx, fmasky)); + return; + } + case IR::Opcode::ImageQueryLod: + inst.ReplaceUsesWith(ir.Imm32(1)); + return; + case IR::Opcode::ImageQueryDimensions: { + IR::Value dims = ir.CompositeConstruct(ir.Imm32(static_cast(image.width)), // x + ir.Imm32(static_cast(image.width)), // y + ir.Imm32(1), ir.Imm32(1)); // depth, mip + inst.ReplaceUsesWith(dims); + + // Track FMask resource to do specialization. + descriptors.Add(FMaskResource{ + .sharp_idx = tsharp, + }); + return; + } + default: + UNREACHABLE_MSG("Can't patch fmask instruction {}", inst.GetOpcode()); + } + } + + u32 image_binding = descriptors.Add(ImageResource{ + .sharp_idx = tsharp, + .is_depth = bool(inst_info.is_depth), + .is_atomic = IsImageAtomicInstruction(inst), + .is_array = bool(inst_info.is_array), + .is_read = is_read, + .is_written = is_written, + }); + + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + + if (inst.GetOpcode() == IR::Opcode::ImageSampleRaw) { + // Read sampler sharp. + const auto [sampler_binding, sampler] = [&] -> std::pair { + ASSERT(producer->GetOpcode() == IR::Opcode::CompositeConstructU32x2); + const IR::Value& handle = producer->Arg(1); + // Inline sampler resource. + if (handle.IsImmediate()) { + LOG_WARNING(Render_Vulkan, "Inline sampler detected"); + const auto inline_sampler = AmdGpu::Sampler{.raw0 = handle.U32()}; + const auto binding = descriptors.Add(SamplerResource{ + .sharp_idx = std::numeric_limits::max(), + .inline_sampler = inline_sampler, + }); + return {binding, inline_sampler}; + } + // Normal sampler resource. + const auto ssharp_handle = handle.InstRecursive(); + const auto& [ssharp_ud, disable_aniso] = TryDisableAnisoLod0(ssharp_handle); + const auto ssharp = TrackSharp(ssharp_ud, info); + const auto binding = descriptors.Add(SamplerResource{ + .sharp_idx = ssharp, + .associated_image = image_binding, + .disable_aniso = disable_aniso, + }); + return {binding, info.ReadUdSharp(ssharp)}; + }(); + // Patch image and sampler handle. + inst.SetArg(0, ir.Imm32(image_binding | sampler_binding << 16)); + } else { + // Patch image handle. + inst.SetArg(0, ir.Imm32(image_binding)); + } +} + +void PatchDataRingAccess(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& descriptors) { + // Insert gds binding in the shader if it doesn't exist already. + // The buffer is used for append/consume counters. + constexpr static AmdGpu::Buffer GdsSharp{.base_address = 1}; + const u32 binding = descriptors.Add(BufferResource{ + .used_types = IR::Type::U32, + .inline_cbuf = GdsSharp, + .is_gds_buffer = true, + .is_written = true, + }); + + const auto pred = [](const IR::Inst* inst) -> std::optional { + if (inst->GetOpcode() == IR::Opcode::GetUserData) { + return inst; + } + return std::nullopt; + }; + + // Attempt to deduce the GDS address of counter at compile time. + const u32 gds_addr = [&] { + const IR::Value& gds_offset = inst.Arg(0); + if (gds_offset.IsImmediate()) { + // Nothing to do, offset is known. + return gds_offset.U32() & 0xFFFF; + } + const auto result = IR::BreadthFirstSearch(&inst, pred); + ASSERT_MSG(result, "Unable to track M0 source"); + + // M0 must be set by some user data register. + const IR::Inst* prod = gds_offset.InstRecursive(); + const u32 ud_reg = u32(result.value()->Arg(0).ScalarReg()); + u32 m0_val = info.user_data[ud_reg] >> 16; + if (prod->GetOpcode() == IR::Opcode::IAdd32) { + m0_val += prod->Arg(1).U32(); + } + return m0_val & 0xFFFF; + }(); + + // Patch instruction. + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + inst.SetArg(0, ir.Imm32(gds_addr >> 2)); + inst.SetArg(1, ir.Imm32(binding)); +} + +void PatchBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { + const auto handle = inst.Arg(0); + const auto buffer_res = info.buffers[handle.U32()]; + const auto buffer = buffer_res.GetSharp(info); + ASSERT(!buffer.add_tid_enable); - // Address of constant buffer reads can be calculated at IR emittion time. + // Address of constant buffer reads can be calculated at IR emission time. if (inst.GetOpcode() == IR::Opcode::ReadConstBuffer) { return; } + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + const auto inst_info = inst.Flags(); + const IR::U32 index_stride = ir.Imm32(buffer.index_stride); const IR::U32 element_size = ir.Imm32(buffer.element_size); @@ -366,21 +537,27 @@ void PatchBufferInstruction(IR::Block& block, IR::Inst& inst, Info& info, inst.SetArg(1, address); } -void PatchTextureBufferInstruction(IR::Block& block, IR::Inst& inst, Info& info, - Descriptors& descriptors) { - const IR::Inst* handle = inst.Arg(0).InstRecursive(); - const IR::Inst* producer = handle->Arg(0).InstRecursive(); - const auto sharp = TrackSharp(producer, info); - const auto buffer = info.ReadUdSharp(sharp); - const s32 binding = descriptors.Add(TextureBufferResource{ - .sharp_idx = sharp, - .is_written = inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32, - }); +void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { + const auto handle = inst.Arg(0); + const auto buffer_res = info.texture_buffers[handle.U32()]; + const auto buffer = buffer_res.GetSharp(info); - // Replace handle with binding index in texture buffer resource list. - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - inst.SetArg(0, ir.Imm32(binding)); ASSERT(!buffer.swizzle_enable && !buffer.add_tid_enable); + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + + if (inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32) { + const auto swizzled = ApplySwizzle(ir, inst.Arg(2), buffer.DstSelect()); + const auto converted = + ApplyWriteNumberConversionVec4(ir, swizzled, buffer.GetNumberConversion()); + inst.SetArg(2, converted); + } else if (inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32) { + const auto inst_info = inst.Flags(); + const auto texel = ir.LoadBufferFormat(inst.Arg(0), inst.Arg(1), inst_info); + const auto swizzled = ApplySwizzle(ir, texel, buffer.DstSelect()); + const auto converted = + ApplyReadNumberConversionVec4(ir, swizzled, buffer.GetNumberConversion()); + inst.ReplaceUsesWith(converted); + } } IR::Value PatchCubeCoord(IR::IREmitter& ir, const IR::Value& s, const IR::Value& t, @@ -409,39 +586,14 @@ IR::Value PatchCubeCoord(IR::IREmitter& ir, const IR::Value& s, const IR::Value& } } -void PatchImageSampleInstruction(IR::Block& block, IR::Inst& inst, Info& info, - Descriptors& descriptors, const IR::Inst* producer, - const u32 image_binding, const AmdGpu::Image& image) { - // Read sampler sharp. This doesn't exist for IMAGE_LOAD/IMAGE_STORE instructions - const auto [sampler_binding, sampler] = [&] -> std::pair { - ASSERT(producer->GetOpcode() == IR::Opcode::CompositeConstructU32x2); - const IR::Value& handle = producer->Arg(1); - // Inline sampler resource. - if (handle.IsImmediate()) { - LOG_WARNING(Render_Vulkan, "Inline sampler detected"); - const auto inline_sampler = AmdGpu::Sampler{.raw0 = handle.U32()}; - const auto binding = descriptors.Add(SamplerResource{ - .sharp_idx = std::numeric_limits::max(), - .inline_sampler = inline_sampler, - }); - return {binding, inline_sampler}; - } - // Normal sampler resource. - const auto ssharp_handle = handle.InstRecursive(); - const auto& [ssharp_ud, disable_aniso] = TryDisableAnisoLod0(ssharp_handle); - const auto ssharp = TrackSharp(ssharp_ud, info); - const auto binding = descriptors.Add(SamplerResource{ - .sharp_idx = ssharp, - .associated_image = image_binding, - .disable_aniso = disable_aniso, - }); - return {binding, info.ReadUdSharp(ssharp)}; - }(); +void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, + const AmdGpu::Image& image) { + const auto handle = inst.Arg(0); + const auto sampler_res = info.samplers[(handle.U32() >> 16) & 0xFFFF]; + auto sampler = sampler_res.GetSharp(info); IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - const auto inst_info = inst.Flags(); - const IR::U32 handle = ir.Imm32(image_binding | sampler_binding << 16); IR::Inst* body1 = inst.Arg(1).InstRecursive(); IR::Inst* body2 = inst.Arg(2).InstRecursive(); @@ -539,8 +691,7 @@ void PatchImageSampleInstruction(IR::Block& block, IR::Inst& inst, Info& info, // Query dimensions of image if needed for normalization. // We can't use the image sharp because it could be bound to a different image later. const auto dimensions = - unnormalized ? ir.ImageQueryDimension(ir.Imm32(image_binding), ir.Imm32(0u), ir.Imm1(false)) - : IR::Value{}; + unnormalized ? ir.ImageQueryDimension(handle, ir.Imm32(0u), ir.Imm1(false)) : IR::Value{}; const auto get_coord = [&](u32 coord_idx, u32 dim_idx) -> IR::Value { const auto coord = get_addr_reg(coord_idx); if (unnormalized) { @@ -589,7 +740,7 @@ void PatchImageSampleInstruction(IR::Block& block, IR::Inst& inst, Info& info, : IR::F32{}; const IR::F32 lod_clamp = inst_info.has_lod_clamp ? get_addr_reg(addr_reg++) : IR::F32{}; - auto new_inst = [&] -> IR::Value { + auto texel = [&] -> IR::Value { if (inst_info.is_gather) { if (inst_info.is_depth) { return ir.ImageGatherDref(handle, coords, offset, dref, inst_info); @@ -611,94 +762,30 @@ void PatchImageSampleInstruction(IR::Block& block, IR::Inst& inst, Info& info, } return ir.ImageSampleImplicitLod(handle, coords, bias, offset, inst_info); }(); - inst.ReplaceUsesWithAndRemove(new_inst); + + const auto converted = ApplyReadNumberConversionVec4(ir, texel, image.GetNumberConversion()); + inst.ReplaceUsesWith(converted); } -void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& descriptors) { - const auto pred = [](const IR::Inst* inst) -> std::optional { - const auto opcode = inst->GetOpcode(); - if (opcode == IR::Opcode::CompositeConstructU32x2 || // IMAGE_SAMPLE (image+sampler) - opcode == IR::Opcode::ReadConst || // IMAGE_LOAD (image only) - opcode == IR::Opcode::GetUserData) { - return inst; - } - return std::nullopt; - }; - const auto result = IR::BreadthFirstSearch(&inst, pred); - ASSERT_MSG(result, "Unable to find image sharp source"); - const IR::Inst* producer = result.value(); - const bool has_sampler = producer->GetOpcode() == IR::Opcode::CompositeConstructU32x2; - const auto tsharp_handle = has_sampler ? producer->Arg(0).InstRecursive() : producer; - - // Read image sharp. - const auto tsharp = TrackSharp(tsharp_handle, info); - const auto inst_info = inst.Flags(); - auto image = info.ReadUdSharp(tsharp); - if (!image.Valid()) { - LOG_ERROR(Render_Vulkan, "Shader compiled with unbound image!"); - image = AmdGpu::Image::Null(); - } - ASSERT(image.GetType() != AmdGpu::ImageType::Invalid); - const bool is_read = inst.GetOpcode() == IR::Opcode::ImageRead; - const bool is_written = inst.GetOpcode() == IR::Opcode::ImageWrite; - - // Patch image instruction if image is FMask. - if (image.IsFmask()) { - ASSERT_MSG(!is_written, "FMask storage instructions are not supported"); - - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - switch (inst.GetOpcode()) { - case IR::Opcode::ImageRead: - case IR::Opcode::ImageSampleRaw: { - IR::F32 fmaskx = ir.BitCast(ir.Imm32(0x76543210)); - IR::F32 fmasky = ir.BitCast(ir.Imm32(0xfedcba98)); - inst.ReplaceUsesWith(ir.CompositeConstruct(fmaskx, fmasky)); - return; - } - case IR::Opcode::ImageQueryLod: - inst.ReplaceUsesWith(ir.Imm32(1)); - return; - case IR::Opcode::ImageQueryDimensions: { - IR::Value dims = ir.CompositeConstruct(ir.Imm32(static_cast(image.width)), // x - ir.Imm32(static_cast(image.width)), // y - ir.Imm32(1), ir.Imm32(1)); // depth, mip - inst.ReplaceUsesWith(dims); - - // Track FMask resource to do specialization. - descriptors.Add(FMaskResource{ - .sharp_idx = tsharp, - }); - return; - } - default: - UNREACHABLE_MSG("Can't patch fmask instruction {}", inst.GetOpcode()); - } - } - - u32 image_binding = descriptors.Add(ImageResource{ - .sharp_idx = tsharp, - .is_depth = bool(inst_info.is_depth), - .is_atomic = IsImageAtomicInstruction(inst), - .is_array = bool(inst_info.is_array), - .is_read = is_read, - .is_written = is_written, - }); - - // Sample instructions must be resolved into a new instruction using address register data. - if (inst.GetOpcode() == IR::Opcode::ImageSampleRaw) { - PatchImageSampleInstruction(block, inst, info, descriptors, producer, image_binding, image); - return; - } - - // Patch image handle - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - inst.SetArg(0, ir.Imm32(image_binding)); - - // No need to patch coordinates if we are just querying. +void PatchImageArgs(IR::Block& block, IR::Inst& inst, Info& info) { + // Nothing to patch for dimension query. if (inst.GetOpcode() == IR::Opcode::ImageQueryDimensions) { return; } + const auto handle = inst.Arg(0); + const auto image_res = info.images[handle.U32() & 0xFFFF]; + auto image = image_res.GetSharp(info); + + // Sample instructions must be handled separately using address register data. + if (inst.GetOpcode() == IR::Opcode::ImageSampleRaw) { + PatchImageSampleArgs(block, inst, info, image); + return; + } + + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + const auto inst_info = inst.Flags(); + // Now that we know the image type, adjust texture coordinate vector. IR::Inst* body = inst.Arg(1).InstRecursive(); const auto [coords, arg] = [&] -> std::pair { @@ -719,152 +806,77 @@ void PatchImageInstruction(IR::Block& block, IR::Inst& inst, Info& info, Descrip case AmdGpu::ImageType::Color3D: // x, y, z, [lod] return {ir.CompositeConstruct(body->Arg(0), body->Arg(1), body->Arg(2)), body->Arg(3)}; case AmdGpu::ImageType::Cube: // x, y, face, [lod] - return {PatchCubeCoord(ir, body->Arg(0), body->Arg(1), body->Arg(2), is_written, - inst_info.is_array), + return {PatchCubeCoord(ir, body->Arg(0), body->Arg(1), body->Arg(2), + inst.GetOpcode() == IR::Opcode::ImageWrite, inst_info.is_array), body->Arg(3)}; default: UNREACHABLE_MSG("Unknown image type {}", image.GetType()); } }(); - inst.SetArg(1, coords); - if (inst_info.has_lod) { - ASSERT(inst.GetOpcode() == IR::Opcode::ImageRead || - inst.GetOpcode() == IR::Opcode::ImageWrite); - ASSERT(image.GetType() != AmdGpu::ImageType::Color2DMsaa && - image.GetType() != AmdGpu::ImageType::Color2DMsaaArray); - inst.SetArg(2, arg); - } else if ((image.GetType() == AmdGpu::ImageType::Color2DMsaa || - image.GetType() == AmdGpu::ImageType::Color2DMsaaArray) && - (inst.GetOpcode() == IR::Opcode::ImageRead || - inst.GetOpcode() == IR::Opcode::ImageWrite)) { - inst.SetArg(3, arg); - } -} + const auto has_ms = image.GetType() == AmdGpu::ImageType::Color2DMsaa || + image.GetType() == AmdGpu::ImageType::Color2DMsaaArray; + ASSERT(!inst_info.has_lod || !has_ms); + const auto lod = inst_info.has_lod ? IR::U32{arg} : IR::U32{}; + const auto ms = has_ms ? IR::U32{arg} : IR::U32{}; -void PatchTextureBufferInterpretation(IR::Block& block, IR::Inst& inst, Info& info) { - const auto binding = inst.Arg(0).U32(); - const auto buffer_res = info.texture_buffers[binding]; - const auto buffer = buffer_res.GetSharp(info); - if (!buffer.Valid()) { - // Don't need to swizzle invalid buffer. - return; - } - - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - if (inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32) { - inst.SetArg(2, ApplySwizzle(ir, inst.Arg(2), buffer.DstSelect())); - } else if (inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32) { - const auto inst_info = inst.Flags(); - const auto texel = ir.LoadBufferFormat(inst.Arg(0), inst.Arg(1), inst_info); - const auto swizzled = ApplySwizzle(ir, texel, buffer.DstSelect()); - inst.ReplaceUsesWith(swizzled); - } -} - -void PatchImageInterpretation(IR::Block& block, IR::Inst& inst, Info& info) { - const auto binding = inst.Arg(0).U32(); - const auto image_res = info.images[binding & 0xFFFF]; - const auto image = image_res.GetSharp(info); - if (!image.Valid() || !image_res.IsStorage(image)) { - // Don't need to swizzle invalid or non-storage image. - return; - } - - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - if (inst.GetOpcode() == IR::Opcode::ImageWrite) { - inst.SetArg(4, ApplySwizzle(ir, inst.Arg(4), image.DstSelect())); - } else if (inst.GetOpcode() == IR::Opcode::ImageRead) { - const auto inst_info = inst.Flags(); - const auto lod = inst.Arg(2); - const auto ms = inst.Arg(3); - const auto texel = - ir.ImageRead(inst.Arg(0), inst.Arg(1), lod.IsEmpty() ? IR::U32{} : IR::U32{lod}, - ms.IsEmpty() ? IR::U32{} : IR::U32{ms}, inst_info); - const auto swizzled = ApplySwizzle(ir, texel, image.DstSelect()); - inst.ReplaceUsesWith(swizzled); - } -} - -void PatchDataRingInstruction(IR::Block& block, IR::Inst& inst, Info& info, - Descriptors& descriptors) { - // Insert gds binding in the shader if it doesn't exist already. - // The buffer is used for append/consume counters. - constexpr static AmdGpu::Buffer GdsSharp{.base_address = 1}; - const u32 binding = descriptors.Add(BufferResource{ - .used_types = IR::Type::U32, - .inline_cbuf = GdsSharp, - .is_gds_buffer = true, - .is_written = true, - }); - - const auto pred = [](const IR::Inst* inst) -> std::optional { - if (inst->GetOpcode() == IR::Opcode::GetUserData) { - return inst; + const auto is_storage = image_res.IsStorage(image); + if (inst.GetOpcode() == IR::Opcode::ImageRead) { + auto texel = ir.ImageRead(handle, coords, lod, ms, inst_info); + if (is_storage) { + // Storage image requires shader swizzle. + texel = ApplySwizzle(ir, texel, image.DstSelect()); } - return std::nullopt; - }; + const auto converted = + ApplyReadNumberConversionVec4(ir, texel, image.GetNumberConversion()); + inst.ReplaceUsesWith(converted); + } else { + inst.SetArg(1, coords); + if (inst.GetOpcode() == IR::Opcode::ImageWrite) { + inst.SetArg(2, lod); + inst.SetArg(3, ms); - // Attempt to deduce the GDS address of counter at compile time. - const u32 gds_addr = [&] { - const IR::Value& gds_offset = inst.Arg(0); - if (gds_offset.IsImmediate()) { - // Nothing to do, offset is known. - return gds_offset.U32() & 0xFFFF; + auto texel = inst.Arg(4); + if (is_storage) { + // Storage image requires shader swizzle. + texel = ApplySwizzle(ir, texel, image.DstSelect()); + } + const auto converted = + ApplyWriteNumberConversionVec4(ir, texel, image.GetNumberConversion()); + inst.SetArg(4, converted); } - const auto result = IR::BreadthFirstSearch(&inst, pred); - ASSERT_MSG(result, "Unable to track M0 source"); - - // M0 must be set by some user data register. - const IR::Inst* prod = gds_offset.InstRecursive(); - const u32 ud_reg = u32(result.value()->Arg(0).ScalarReg()); - u32 m0_val = info.user_data[ud_reg] >> 16; - if (prod->GetOpcode() == IR::Opcode::IAdd32) { - m0_val += prod->Arg(1).U32(); - } - return m0_val & 0xFFFF; - }(); - - // Patch instruction. - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - inst.SetArg(0, ir.Imm32(gds_addr >> 2)); - inst.SetArg(1, ir.Imm32(binding)); + } } void ResourceTrackingPass(IR::Program& program) { // Iterate resource instructions and patch them after finding the sharp. auto& info = program.info; + // Pass 1: Track resource sharps Descriptors descriptors{info}; for (IR::Block* const block : program.blocks) { for (IR::Inst& inst : block->Instructions()) { if (IsBufferInstruction(inst)) { - PatchBufferInstruction(*block, inst, info, descriptors); - continue; - } - if (IsTextureBufferInstruction(inst)) { - PatchTextureBufferInstruction(*block, inst, info, descriptors); - continue; - } - if (IsImageInstruction(inst)) { - PatchImageInstruction(*block, inst, info, descriptors); - continue; - } - if (IsDataRingInstruction(inst)) { - PatchDataRingInstruction(*block, inst, info, descriptors); + PatchBufferSharp(*block, inst, info, descriptors); + } else if (IsTextureBufferInstruction(inst)) { + PatchTextureBufferSharp(*block, inst, info, descriptors); + } else if (IsImageInstruction(inst)) { + PatchImageSharp(*block, inst, info, descriptors); + } else if (IsDataRingInstruction(inst)) { + PatchDataRingAccess(*block, inst, info, descriptors); } } } - // Second pass to reinterpret format read/write where needed, since we now know - // the bindings and their properties. + + // Pass 2: Patch instruction args for (IR::Block* const block : program.blocks) { for (IR::Inst& inst : block->Instructions()) { - if (IsTextureBufferInstruction(inst)) { - PatchTextureBufferInterpretation(*block, inst, info); - continue; - } - if (IsImageInstruction(inst)) { - PatchImageInterpretation(*block, inst, info); + if (IsBufferInstruction(inst)) { + PatchBufferArgs(*block, inst, info); + } else if (IsTextureBufferInstruction(inst)) { + PatchTextureBufferArgs(*block, inst, info); + } else if (IsImageInstruction(inst)) { + PatchImageArgs(*block, inst, info); } } } diff --git a/src/shader_recompiler/ir/reinterpret.h b/src/shader_recompiler/ir/reinterpret.h index 73d587a56..b65b19928 100644 --- a/src/shader_recompiler/ir/reinterpret.h +++ b/src/shader_recompiler/ir/reinterpret.h @@ -4,7 +4,7 @@ #pragma once #include "shader_recompiler/ir/ir_emitter.h" -#include "video_core/amdgpu/resource.h" +#include "video_core/amdgpu/types.h" namespace Shader::IR { @@ -21,4 +21,66 @@ inline Value ApplySwizzle(IREmitter& ir, const Value& vector, const AmdGpu::Comp return swizzled; } +/// Applies a number conversion in the read direction. +inline F32 ApplyReadNumberConversion(IREmitter& ir, const F32& value, + const AmdGpu::NumberConversion& conversion) { + switch (conversion) { + case AmdGpu::NumberConversion::None: + return value; + case AmdGpu::NumberConversion::UintToUscaled: + return ir.ConvertUToF(32, 32, ir.BitCast(value)); + case AmdGpu::NumberConversion::SintToSscaled: + return ir.ConvertSToF(32, 32, ir.BitCast(value)); + case AmdGpu::NumberConversion::UnormToUbnorm: + // Convert 0...1 to -1...1 + return ir.FPSub(ir.FPMul(value, ir.Imm32(2.f)), ir.Imm32(1.f)); + default: + UNREACHABLE(); + } +} + +inline Value ApplyReadNumberConversionVec4(IREmitter& ir, const Value& value, + const AmdGpu::NumberConversion& conversion) { + if (conversion == AmdGpu::NumberConversion::None) { + return value; + } + const auto x = ApplyReadNumberConversion(ir, F32{ir.CompositeExtract(value, 0)}, conversion); + const auto y = ApplyReadNumberConversion(ir, F32{ir.CompositeExtract(value, 1)}, conversion); + const auto z = ApplyReadNumberConversion(ir, F32{ir.CompositeExtract(value, 2)}, conversion); + const auto w = ApplyReadNumberConversion(ir, F32{ir.CompositeExtract(value, 3)}, conversion); + return ir.CompositeConstruct(x, y, z, w); +} + +/// Applies a number conversion in the write direction. +inline F32 ApplyWriteNumberConversion(IREmitter& ir, const F32& value, + const AmdGpu::NumberConversion& conversion) { + switch (conversion) { + case AmdGpu::NumberConversion::None: + return value; + case AmdGpu::NumberConversion::UintToUscaled: + // Need to return float type to maintain IR semantics. + return ir.BitCast(U32{ir.ConvertFToU(32, value)}); + case AmdGpu::NumberConversion::SintToSscaled: + // Need to return float type to maintain IR semantics. + return ir.BitCast(U32{ir.ConvertFToS(32, value)}); + case AmdGpu::NumberConversion::UnormToUbnorm: + // Convert -1...1 to 0...1 + return ir.FPDiv(ir.FPAdd(value, ir.Imm32(1.f)), ir.Imm32(2.f)); + default: + UNREACHABLE(); + } +} + +inline Value ApplyWriteNumberConversionVec4(IREmitter& ir, const Value& value, + const AmdGpu::NumberConversion& conversion) { + if (conversion == AmdGpu::NumberConversion::None) { + return value; + } + const auto x = ApplyWriteNumberConversion(ir, F32{ir.CompositeExtract(value, 0)}, conversion); + const auto y = ApplyWriteNumberConversion(ir, F32{ir.CompositeExtract(value, 1)}, conversion); + const auto z = ApplyWriteNumberConversion(ir, F32{ir.CompositeExtract(value, 2)}, conversion); + const auto w = ApplyWriteNumberConversion(ir, F32{ir.CompositeExtract(value, 3)}, conversion); + return ir.CompositeConstruct(x, y, z, w); +} + } // namespace Shader::IR diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 781a0b14a..cf49b0879 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -180,6 +180,7 @@ struct FragmentRuntimeInfo { std::array inputs; struct PsColorBuffer { AmdGpu::NumberFormat num_format; + AmdGpu::NumberConversion num_conversion; AmdGpu::CompMapping swizzle; auto operator<=>(const PsColorBuffer&) const noexcept = default; diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index f8a86c63b..f58d2e2d3 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -32,6 +32,7 @@ struct BufferSpecialization { struct TextureBufferSpecialization { bool is_integer = false; AmdGpu::CompMapping dst_select{}; + AmdGpu::NumberConversion num_conversion{}; auto operator<=>(const TextureBufferSpecialization&) const = default; }; @@ -41,6 +42,7 @@ struct ImageSpecialization { bool is_integer = false; bool is_storage = false; AmdGpu::CompMapping dst_select{}; + AmdGpu::NumberConversion num_conversion{}; auto operator<=>(const ImageSpecialization&) const = default; }; @@ -107,6 +109,7 @@ struct StageSpecialization { [](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { spec.is_integer = AmdGpu::IsInteger(sharp.GetNumberFmt()); spec.dst_select = sharp.DstSelect(); + spec.num_conversion = sharp.GetNumberConversion(); }); ForEachSharp(binding, images, info->images, [](auto& spec, const auto& desc, AmdGpu::Image sharp) { @@ -116,6 +119,7 @@ struct StageSpecialization { if (spec.is_storage) { spec.dst_select = sharp.DstSelect(); } + spec.num_conversion = sharp.GetNumberConversion(); }); ForEachSharp(binding, fmasks, info->fmasks, [](auto& spec, const auto& desc, AmdGpu::Image sharp) { diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 0f1783057..837b73d89 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -20,9 +20,9 @@ #include "common/types.h" #include "common/unique_function.h" #include "shader_recompiler/params.h" -#include "types.h" #include "video_core/amdgpu/pixel_format.h" #include "video_core/amdgpu/resource.h" +#include "video_core/amdgpu/types.h" namespace Vulkan { class Rasterizer; @@ -902,6 +902,10 @@ struct Liverpool { : info.number_type.Value()); } + [[nodiscard]] NumberConversion GetNumberConversion() const { + return MapNumberConversion(info.number_type); + } + [[nodiscard]] CompMapping Swizzle() const { // clang-format off static constexpr std::array, 4> mrt_swizzles{{ @@ -938,7 +942,7 @@ struct Liverpool { const auto swap_idx = static_cast(info.comp_swap.Value()); const auto components_idx = NumComponents(info.format) - 1; const auto mrt_swizzle = mrt_swizzles[swap_idx][components_idx]; - return RemapComponents(info.format, mrt_swizzle); + return RemapSwizzle(info.format, mrt_swizzle); } }; diff --git a/src/video_core/amdgpu/pixel_format.cpp b/src/video_core/amdgpu/pixel_format.cpp index b13fc2d11..881c33e44 100644 --- a/src/video_core/amdgpu/pixel_format.cpp +++ b/src/video_core/amdgpu/pixel_format.cpp @@ -100,7 +100,7 @@ std::string_view NameOf(NumberFormat fmt) { return "Srgb"; case NumberFormat::Ubnorm: return "Ubnorm"; - case NumberFormat::UbnromNz: + case NumberFormat::UbnormNz: return "UbnormNz"; case NumberFormat::Ubint: return "Ubint"; diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 1d9673850..ffee7964a 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -11,96 +11,6 @@ namespace AmdGpu { -enum class CompSwizzle : u32 { - Zero = 0, - One = 1, - Red = 4, - Green = 5, - Blue = 6, - Alpha = 7, -}; - -struct CompMapping { - CompSwizzle r : 3; - CompSwizzle g : 3; - CompSwizzle b : 3; - CompSwizzle a : 3; - - auto operator<=>(const CompMapping& other) const = default; - - template - [[nodiscard]] std::array Apply(const std::array& data) const { - return { - ApplySingle(data, r), - ApplySingle(data, g), - ApplySingle(data, b), - ApplySingle(data, a), - }; - } - -private: - template - T ApplySingle(const std::array& data, const CompSwizzle swizzle) const { - switch (swizzle) { - case CompSwizzle::Zero: - return T(0); - case CompSwizzle::One: - return T(1); - case CompSwizzle::Red: - return data[0]; - case CompSwizzle::Green: - return data[1]; - case CompSwizzle::Blue: - return data[2]; - case CompSwizzle::Alpha: - return data[3]; - default: - UNREACHABLE(); - } - } -}; - -inline DataFormat RemapDataFormat(const DataFormat format) { - switch (format) { - case DataFormat::Format11_11_10: - return DataFormat::Format10_11_11; - case DataFormat::Format10_10_10_2: - return DataFormat::Format2_10_10_10; - case DataFormat::Format5_5_5_1: - return DataFormat::Format1_5_5_5; - default: - return format; - } -} - -inline NumberFormat RemapNumberFormat(const NumberFormat format) { - return format; -} - -inline CompMapping RemapComponents(const DataFormat format, const CompMapping components) { - switch (format) { - case DataFormat::Format11_11_10: { - CompMapping result; - result.r = components.b; - result.g = components.g; - result.b = components.r; - result.a = components.a; - return result; - } - case DataFormat::Format10_10_10_2: - case DataFormat::Format5_5_5_1: { - CompMapping result; - result.r = components.a; - result.g = components.b; - result.b = components.g; - result.a = components.r; - return result; - } - default: - return components; - } -} - // Table 8.5 Buffer Resource Descriptor [Sea Islands Series Instruction Set Architecture] struct Buffer { u64 base_address : 44; @@ -140,7 +50,7 @@ struct Buffer { .b = CompSwizzle(dst_sel_z), .a = CompSwizzle(dst_sel_w), }; - return RemapComponents(DataFormat(data_format), dst_sel); + return RemapSwizzle(DataFormat(data_format), dst_sel); } NumberFormat GetNumberFmt() const noexcept { @@ -151,6 +61,10 @@ struct Buffer { return RemapDataFormat(DataFormat(data_format)); } + NumberConversion GetNumberConversion() const noexcept { + return MapNumberConversion(NumberFormat(num_format)); + } + u32 GetStride() const noexcept { return stride; } @@ -305,7 +219,7 @@ struct Image { .b = CompSwizzle(dst_sel_z), .a = CompSwizzle(dst_sel_w), }; - return RemapComponents(DataFormat(data_format), dst_sel); + return RemapSwizzle(DataFormat(data_format), dst_sel); } u32 Pitch() const { @@ -354,6 +268,10 @@ struct Image { return RemapNumberFormat(NumberFormat(num_format)); } + NumberConversion GetNumberConversion() const noexcept { + return MapNumberConversion(NumberFormat(num_format)); + } + TilingMode GetTilingMode() const { if (tiling_index >= 0 && tiling_index <= 7) { return tiling_index == 5 ? TilingMode::Texture_MicroTiled diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index fa8491665..a19e53256 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -5,6 +5,7 @@ #include #include +#include "common/assert.h" #include "common/types.h" namespace AmdGpu { @@ -177,11 +178,130 @@ enum class NumberFormat : u32 { Float = 7, Srgb = 9, Ubnorm = 10, - UbnromNz = 11, + UbnormNz = 11, Ubint = 12, Ubscaled = 13, }; +enum class CompSwizzle : u32 { + Zero = 0, + One = 1, + Red = 4, + Green = 5, + Blue = 6, + Alpha = 7, +}; + +enum class NumberConversion : u32 { + None, + UintToUscaled, + SintToSscaled, + UnormToUbnorm, +}; + +struct CompMapping { + CompSwizzle r : 3; + CompSwizzle g : 3; + CompSwizzle b : 3; + CompSwizzle a : 3; + + auto operator<=>(const CompMapping& other) const = default; + + template + [[nodiscard]] std::array Apply(const std::array& data) const { + return { + ApplySingle(data, r), + ApplySingle(data, g), + ApplySingle(data, b), + ApplySingle(data, a), + }; + } + +private: + template + T ApplySingle(const std::array& data, const CompSwizzle swizzle) const { + switch (swizzle) { + case CompSwizzle::Zero: + return T(0); + case CompSwizzle::One: + return T(1); + case CompSwizzle::Red: + return data[0]; + case CompSwizzle::Green: + return data[1]; + case CompSwizzle::Blue: + return data[2]; + case CompSwizzle::Alpha: + return data[3]; + default: + UNREACHABLE(); + } + } +}; + +inline DataFormat RemapDataFormat(const DataFormat format) { + switch (format) { + case DataFormat::Format11_11_10: + return DataFormat::Format10_11_11; + case DataFormat::Format10_10_10_2: + return DataFormat::Format2_10_10_10; + case DataFormat::Format5_5_5_1: + return DataFormat::Format1_5_5_5; + default: + return format; + } +} + +inline NumberFormat RemapNumberFormat(const NumberFormat format) { + switch (format) { + case NumberFormat::Uscaled: + return NumberFormat::Uint; + case NumberFormat::Sscaled: + return NumberFormat::Sint; + case NumberFormat::Ubnorm: + return NumberFormat::Unorm; + default: + return format; + } +} + +inline CompMapping RemapSwizzle(const DataFormat format, const CompMapping swizzle) { + switch (format) { + case DataFormat::Format11_11_10: { + CompMapping result; + result.r = swizzle.b; + result.g = swizzle.g; + result.b = swizzle.r; + result.a = swizzle.a; + return result; + } + case DataFormat::Format10_10_10_2: + case DataFormat::Format5_5_5_1: { + CompMapping result; + result.r = swizzle.a; + result.g = swizzle.b; + result.b = swizzle.g; + result.a = swizzle.r; + return result; + } + default: + return swizzle; + } +} + +inline NumberConversion MapNumberConversion(const NumberFormat format) { + switch (format) { + case NumberFormat::Uscaled: + return NumberConversion::UintToUscaled; + case NumberFormat::Sscaled: + return NumberConversion::SintToSscaled; + case NumberFormat::Ubnorm: + return NumberConversion::UnormToUbnorm; + default: + return NumberConversion::None; + } +} + } // namespace AmdGpu template <> diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 690d26cfc..9695e127f 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -447,7 +447,7 @@ static constexpr vk::FormatFeatureFlags2 GetNumberFormatFeatureFlags( case AmdGpu::NumberFormat::Srgb: return ImageRead | Mrt; case AmdGpu::NumberFormat::Ubnorm: - case AmdGpu::NumberFormat::UbnromNz: + case AmdGpu::NumberFormat::UbnormNz: case AmdGpu::NumberFormat::Ubint: case AmdGpu::NumberFormat::Ubscaled: return ImageRead; @@ -468,6 +468,7 @@ static constexpr SurfaceFormatInfo CreateSurfaceFormatInfo(const AmdGpu::DataFor } std::span SurfaceFormats() { + // Uscaled, Sscaled, and Ubnorm formats are automatically remapped and handled in shader. static constexpr std::array formats{ // Invalid CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Unorm, @@ -490,7 +491,7 @@ std::span SurfaceFormats() { vk::Format::eUndefined), CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubnorm, vk::Format::eUndefined), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::UbnromNz, + CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::UbnormNz, vk::Format::eUndefined), CreateSurfaceFormatInfo(AmdGpu::DataFormat::FormatInvalid, AmdGpu::NumberFormat::Ubint, vk::Format::eUndefined), @@ -501,10 +502,6 @@ std::span SurfaceFormats() { vk::Format::eR8Unorm), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Snorm, vk::Format::eR8Snorm), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Uscaled, - vk::Format::eR8Uscaled), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Sscaled, - vk::Format::eR8Sscaled), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Uint, vk::Format::eR8Uint), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8, AmdGpu::NumberFormat::Sint, @@ -516,10 +513,6 @@ std::span SurfaceFormats() { vk::Format::eR16Unorm), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Snorm, vk::Format::eR16Snorm), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Uscaled, - vk::Format::eR16Uscaled), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Sscaled, - vk::Format::eR16Sscaled), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Uint, vk::Format::eR16Uint), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16, AmdGpu::NumberFormat::Sint, @@ -531,10 +524,6 @@ std::span SurfaceFormats() { vk::Format::eR8G8Unorm), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Snorm, vk::Format::eR8G8Snorm), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Uscaled, - vk::Format::eR8G8Uscaled), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Sscaled, - vk::Format::eR8G8Sscaled), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Uint, vk::Format::eR8G8Uint), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8, AmdGpu::NumberFormat::Sint, @@ -553,10 +542,6 @@ std::span SurfaceFormats() { vk::Format::eR16G16Unorm), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Snorm, vk::Format::eR16G16Snorm), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Uscaled, - vk::Format::eR16G16Uscaled), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Sscaled, - vk::Format::eR16G16Sscaled), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Uint, vk::Format::eR16G16Uint), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16, AmdGpu::NumberFormat::Sint, @@ -573,10 +558,6 @@ std::span SurfaceFormats() { vk::Format::eA2B10G10R10UnormPack32), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Snorm, vk::Format::eA2B10G10R10SnormPack32), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Uscaled, - vk::Format::eA2B10G10R10UscaledPack32), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Sscaled, - vk::Format::eA2B10G10R10SscaledPack32), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Uint, vk::Format::eA2B10G10R10UintPack32), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format2_10_10_10, AmdGpu::NumberFormat::Sint, @@ -586,10 +567,6 @@ std::span SurfaceFormats() { vk::Format::eR8G8B8A8Unorm), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Snorm, vk::Format::eR8G8B8A8Snorm), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Uscaled, - vk::Format::eR8G8B8A8Uscaled), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Sscaled, - vk::Format::eR8G8B8A8Sscaled), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Uint, vk::Format::eR8G8B8A8Uint), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format8_8_8_8, AmdGpu::NumberFormat::Sint, @@ -608,10 +585,6 @@ std::span SurfaceFormats() { vk::Format::eR16G16B16A16Unorm), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Snorm, vk::Format::eR16G16B16A16Snorm), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, - AmdGpu::NumberFormat::Uscaled, vk::Format::eR16G16B16A16Uscaled), - CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, - AmdGpu::NumberFormat::Sscaled, vk::Format::eR16G16B16A16Sscaled), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Uint, vk::Format::eR16G16B16A16Uint), CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format16_16_16_16, AmdGpu::NumberFormat::Sint, diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index c8f4999b1..fa10831a0 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -32,6 +32,7 @@ struct GraphicsPipelineKey { u32 num_color_attachments; std::array color_formats; std::array color_num_formats; + std::array color_num_conversions; std::array color_swizzles; vk::Format depth_format; vk::Format stencil_format; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index ba069dae1..9cfc7c277 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -168,6 +168,7 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS for (u32 i = 0; i < Shader::MaxColorBuffers; i++) { info.fs_info.color_buffers[i] = { .num_format = graphics_key.color_num_formats[i], + .num_conversion = graphics_key.color_num_conversions[i], .swizzle = graphics_key.color_swizzles[i], }; } @@ -302,6 +303,7 @@ bool PipelineCache::RefreshGraphicsKey() { key.num_color_attachments = 0; key.color_formats.fill(vk::Format::eUndefined); key.color_num_formats.fill(AmdGpu::NumberFormat::Unorm); + key.color_num_conversions.fill(AmdGpu::NumberConversion::None); key.blend_controls.fill({}); key.write_masks.fill({}); key.color_swizzles.fill({}); @@ -330,6 +332,7 @@ bool PipelineCache::RefreshGraphicsKey() { key.color_formats[remapped_cb] = LiverpoolToVK::SurfaceFormat(col_buf.GetDataFmt(), col_buf.GetNumberFmt()); key.color_num_formats[remapped_cb] = col_buf.GetNumberFmt(); + key.color_num_conversions[remapped_cb] = col_buf.GetNumberConversion(); key.color_swizzles[remapped_cb] = col_buf.Swizzle(); } From 32fc983ef86b7c0b1bbff973a0130f4582a79b04 Mon Sep 17 00:00:00 2001 From: F1219R <109141852+F1219R@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:58:33 +0100 Subject: [PATCH 031/455] Update sq translation (#2084) * Update sq translation * Update sq translation --- src/qt_gui/translations/sq.ts | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 80f3876d4..d4936170b 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -146,19 +146,19 @@ Compatibility... - Compatibility... + Përputhshmëria... Update database - Update database + Përditëso bazën e të dhënave View report - View report + Shiko raportin Submit a report - Submit a report + Paraqit një raport Shortcut creation @@ -285,15 +285,15 @@ List View - Pamja e Listës + Pamja me List Grid View - Pamja e Rrjetës + Pamja me Rrjetë Elf Viewer - Shikuesi i Elf + Shikuesi i ELF Game Install Directory @@ -381,15 +381,15 @@ Download Cheats For All Installed Games - Shkarko Mashtrime Për Të Gjitha Lojërat e Instaluara + Shkarko mashtrime për të gjitha lojërat e instaluara Download Patches For All Games - Shkarko Arna Për Të Gjitha Lojërat e Instaluara + Shkarko arna për të gjitha lojërat e instaluara Download Complete - Shkarkimi Përfundoi + Shkarkimi përfundoi You have downloaded cheats for all the games you have installed. @@ -558,11 +558,11 @@ Trophy Key - Trophy Key + Çelësi i Trofeve Trophy - Trophy + Trofeu Logger @@ -690,7 +690,7 @@ GUI Settings - Cilësimet e GUI + Cilësimet e GUI-së Disable Trophy Pop-ups @@ -778,7 +778,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Çelësi i Trofeve:\nÇelësi përdoret për të deshifruar trofetë. Duhet të merret nga konsola jote me jailbreak.\nDuhet të përmbajë vetëm karaktere hex. logTypeGroupBox @@ -802,7 +802,7 @@ hideCursorGroupBox - Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nInaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. + Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nJoaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. idleTimeoutGroupBox @@ -1172,7 +1172,7 @@ h - h + o m @@ -1333,4 +1333,4 @@ TB - \ No newline at end of file + From 4df0d9c035f957e91f4615bbc3cff7e4a554e4e0 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:30:05 +0100 Subject: [PATCH 032/455] Add support for true fullscreen (#2016) * Support for true fullscreen * clang * Re-add mistakenly deleted line * Size I adjusted the size of the entire screen. trophies font size and added a margin so it wouldn't be so spaced out. --------- Co-authored-by: DanielSvoboda --- src/common/config.cpp | 15 +++++++++++-- src/common/config.h | 7 +++--- src/main.cpp | 2 +- src/qt_gui/main.cpp | 4 ++-- src/qt_gui/settings_dialog.cpp | 5 ++++- src/qt_gui/settings_dialog.ui | 40 +++++++++++++++++++++++++++++++++- src/sdl_window.cpp | 18 ++++++++++++++- 7 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 1838f35fc..b46ab8d6e 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -33,6 +33,7 @@ namespace Config { static bool isNeo = false; static bool isFullscreen = false; +static std::string fullscreenMode = "borderless"; static bool playBGM = false; static bool isTrophyPopupDisabled = false; static int BGMvolume = 50; @@ -105,10 +106,14 @@ bool isNeoModeConsole() { return isNeo; } -bool isFullscreenMode() { +bool getIsFullscreen() { return isFullscreen; } +std::string getFullscreenMode() { + return fullscreenMode; +} + bool getisTrophyPopupDisabled() { return isTrophyPopupDisabled; } @@ -309,10 +314,14 @@ void setVblankDiv(u32 value) { vblankDivider = value; } -void setFullscreenMode(bool enable) { +void setIsFullscreen(bool enable) { isFullscreen = enable; } +void setFullscreenMode(std::string mode) { + fullscreenMode = mode; +} + void setisTrophyPopupDisabled(bool disable) { isTrophyPopupDisabled = disable; } @@ -575,6 +584,7 @@ void load(const std::filesystem::path& path) { isNeo = toml::find_or(general, "isPS4Pro", false); isFullscreen = toml::find_or(general, "Fullscreen", false); + fullscreenMode = toml::find_or(general, "FullscreenMode", "borderless"); playBGM = toml::find_or(general, "playBGM", false); isTrophyPopupDisabled = toml::find_or(general, "isTrophyPopupDisabled", false); BGMvolume = toml::find_or(general, "BGMvolume", 50); @@ -701,6 +711,7 @@ void save(const std::filesystem::path& path) { data["General"]["isPS4Pro"] = isNeo; data["General"]["Fullscreen"] = isFullscreen; + data["General"]["FullscreenMode"] = fullscreenMode; data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled; data["General"]["playBGM"] = playBGM; data["General"]["BGMvolume"] = BGMvolume; diff --git a/src/common/config.h b/src/common/config.h index d2860bec5..6e6a5d960 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -17,9 +17,9 @@ void saveMainWindow(const std::filesystem::path& path); std::string getTrophyKey(); void setTrophyKey(std::string key); - +bool getIsFullscreen(); +std::string getFullscreenMode(); bool isNeoModeConsole(); -bool isFullscreenMode(); bool getPlayBGM(); int getBGMvolume(); bool getisTrophyPopupDisabled(); @@ -66,7 +66,8 @@ void setVblankDiv(u32 value); void setGpuId(s32 selectedGpuId); void setScreenWidth(u32 width); void setScreenHeight(u32 height); -void setFullscreenMode(bool enable); +void setIsFullscreen(bool enable); +void setFullscreenMode(std::string mode); void setisTrophyPopupDisabled(bool disable); void setPlayBGM(bool enable); void setBGMvolume(int volume); diff --git a/src/main.cpp b/src/main.cpp index bdbab89c9..54772870c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -86,7 +86,7 @@ int main(int argc, char* argv[]) { exit(1); } // Set fullscreen mode without saving it to config file - Config::setFullscreenMode(is_fullscreen); + Config::setIsFullscreen(is_fullscreen); }}, {"--fullscreen", [&](int& i) { arg_map["-f"](i); }}, {"--add-game-folder", diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index ac731fdce..2d524e199 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -97,7 +97,7 @@ int main(int argc, char* argv[]) { exit(1); } // Set fullscreen mode without saving it to config file - Config::setFullscreenMode(is_fullscreen); + Config::setIsFullscreen(is_fullscreen); }}, {"--fullscreen", [&](int& i) { arg_map["-f"](i); }}, {"--add-game-folder", @@ -190,4 +190,4 @@ int main(int argc, char* argv[]) { // Show the main window and run the Qt application m_main_window->show(); return a.exec(); -} \ No newline at end of file +} diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 1a03345e4..193ce5cd8 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -300,6 +300,8 @@ void SettingsDialog::LoadValuesFromConfig() { ui->discordRPCCheckbox->setChecked( toml::find_or(data, "General", "enableDiscordRPC", true)); ui->fullscreenCheckBox->setChecked(toml::find_or(data, "General", "Fullscreen", false)); + ui->fullscreenModeComboBox->setCurrentText(QString::fromStdString( + toml::find_or(data, "General", "FullscreenMode", "Borderless"))); ui->separateUpdatesCheckBox->setChecked( toml::find_or(data, "General", "separateUpdateEnabled", false)); ui->showSplashCheckBox->setChecked(toml::find_or(data, "General", "showSplash", false)); @@ -534,8 +536,9 @@ void SettingsDialog::UpdateSettings() { const QVector TouchPadIndex = {"left", "center", "right", "none"}; Config::setBackButtonBehavior(TouchPadIndex[ui->backButtonBehaviorComboBox->currentIndex()]); + Config::setIsFullscreen(ui->fullscreenCheckBox->isChecked()); + Config::setFullscreenMode(ui->fullscreenModeComboBox->currentText().toStdString()); Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); - Config::setFullscreenMode(ui->fullscreenCheckBox->isChecked()); Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); Config::setLogType(ui->logTypeComboBox->currentText().toStdString()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index cefe1f7c7..fbfee5a99 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -12,7 +12,7 @@ 0 0 970 - 670 + 750 @@ -133,6 +133,35 @@ Enable Fullscreen + + + + + Fullscreen Mode + + + + + + + 0 + 0 + + + + + Borderless + + + + + True + + + + + + @@ -536,6 +565,9 @@ 0 + + 80 + @@ -566,6 +598,12 @@ 0 + + + 10 + false + + diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index d694b0939..318b3349b 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -93,7 +93,23 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_ } SDL_SetWindowMinimumSize(window, 640, 360); - SDL_SetWindowFullscreen(window, Config::isFullscreenMode()); + + bool error = false; + const SDL_DisplayID displayIndex = SDL_GetDisplayForWindow(window); + if (displayIndex < 0) { + LOG_ERROR(Frontend, "Error getting display index: {}", SDL_GetError()); + error = true; + } + const SDL_DisplayMode* displayMode; + if ((displayMode = SDL_GetCurrentDisplayMode(displayIndex)) == 0) { + LOG_ERROR(Frontend, "Error getting display mode: {}", SDL_GetError()); + error = true; + } + if (!error) { + SDL_SetWindowFullscreenMode(window, + Config::getFullscreenMode() == "True" ? displayMode : NULL); + } + SDL_SetWindowFullscreen(window, Config::getIsFullscreen()); SDL_InitSubSystem(SDL_INIT_GAMEPAD); controller->TryOpenSDLController(); From a4c18b14344d678334471410f2aadeea29184a47 Mon Sep 17 00:00:00 2001 From: Florian Piesche Date: Tue, 7 Jan 2025 14:05:15 +0000 Subject: [PATCH 033/455] Move release info into metainfo.xml (#2085) --- dist/net.shadps4.shadPS4.metainfo.xml | 28 ++++++++++++++++++++++++--- dist/net.shadps4.shadPS4.releases.xml | 23 ---------------------- 2 files changed, 25 insertions(+), 26 deletions(-) delete mode 100644 dist/net.shadps4.shadPS4.releases.xml diff --git a/dist/net.shadps4.shadPS4.metainfo.xml b/dist/net.shadps4.shadPS4.metainfo.xml index bef0bec4c..d5ad992e3 100644 --- a/dist/net.shadps4.shadPS4.metainfo.xml +++ b/dist/net.shadps4.shadPS4.metainfo.xml @@ -36,10 +36,32 @@ Game - - - + + + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.5.0 + + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.4.0 + + + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.3.0 + + + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.2.0 + + + https://github.com/shadps4-emu/shadPS4/releases/tag/0.1.0 + + + https://github.com/shadps4-emu/shadPS4/releases/tag/v0.0.3 + + + https://github.com/shadps4-emu/shadPS4/releases/tag/v0.0.2 + + + https://github.com/shadps4-emu/shadPS4/releases/tag/v0.0.1 + + diff --git a/dist/net.shadps4.shadPS4.releases.xml b/dist/net.shadps4.shadPS4.releases.xml deleted file mode 100644 index 8da203fe4..000000000 --- a/dist/net.shadps4.shadPS4.releases.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.4.0 - - - https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.3.0 - - - https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.2.0 - - - https://github.com/shadps4-emu/shadPS4/releases/tag/0.1.0 - - - https://github.com/shadps4-emu/shadPS4/releases/tag/v0.0.3 - - - https://github.com/shadps4-emu/shadPS4/releases/tag/v0.0.2 - - - https://github.com/shadps4-emu/shadPS4/releases/tag/v0.0.1 - - From c055c80c6fb23cb29042cd38f3f1ae4c82fe3a55 Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:11:01 -0600 Subject: [PATCH 034/455] Remove releases.xml references (#2087) --- CMakeLists.txt | 1 - REUSE.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 886824934..8ec04dad5 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1042,7 +1042,6 @@ install(TARGETS shadps4 BUNDLE DESTINATION .) if (ENABLE_QT_GUI AND CMAKE_SYSTEM_NAME STREQUAL "Linux") install(FILES "dist/net.shadps4.shadPS4.desktop" DESTINATION "share/applications") - install(FILES "dist/net.shadps4.shadPS4.releases.xml" DESTINATION "share/metainfo/releases") install(FILES "dist/net.shadps4.shadPS4.metainfo.xml" DESTINATION "share/metainfo") install(FILES ".github/shadps4.png" DESTINATION "share/icons/hicolor/512x512/apps" RENAME "net.shadps4.shadPS4.png") install(FILES "src/images/net.shadps4.shadPS4.svg" DESTINATION "share/icons/hicolor/scalable/apps") diff --git a/REUSE.toml b/REUSE.toml index cba63adf1..55d76673d 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -11,7 +11,6 @@ path = [ "dist/net.shadps4.shadPS4.desktop", "dist/net.shadps4.shadPS4_metadata.pot", "dist/net.shadps4.shadPS4.metainfo.xml", - "dist/net.shadps4.shadPS4.releases.xml", "documents/changelog.md", "documents/Quickstart/2.png", "documents/Screenshots/*", From 3e5d4bb69c84486e9e2cd57c56b3b1a2e743b3fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Tue, 7 Jan 2025 22:36:56 +0700 Subject: [PATCH 035/455] Fix double closing tag in metainfo.xml (#2090) --- dist/net.shadps4.shadPS4.metainfo.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/dist/net.shadps4.shadPS4.metainfo.xml b/dist/net.shadps4.shadPS4.metainfo.xml index d5ad992e3..384cf75e8 100644 --- a/dist/net.shadps4.shadPS4.metainfo.xml +++ b/dist/net.shadps4.shadPS4.metainfo.xml @@ -62,7 +62,6 @@ https://github.com/shadps4-emu/shadPS4/releases/tag/v0.0.1 - keyboard From af8c748e9cb3edc78a3f0e189fbba41bfdba0786 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 7 Jan 2025 07:37:08 -0800 Subject: [PATCH 036/455] elf_info: Fix GCC build. (#2089) --- src/common/elf_info.h | 2 +- src/core/libraries/kernel/process.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/elf_info.h b/src/common/elf_info.h index 02eefbb7a..cb32679bb 100644 --- a/src/common/elf_info.h +++ b/src/common/elf_info.h @@ -111,7 +111,7 @@ public: return raw_firmware_ver; } - [[nodiscard]] const PSFAttributes& PSFAttributes() const { + [[nodiscard]] const PSFAttributes& GetPSFAttributes() const { ASSERT(initialized); return psf_attributes; } diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index 791a98a36..c21257c50 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -15,7 +15,7 @@ namespace Libraries::Kernel { int PS4_SYSV_ABI sceKernelIsNeoMode() { LOG_DEBUG(Kernel_Sce, "called"); return Config::isNeoModeConsole() && - Common::ElfInfo::Instance().PSFAttributes().support_neo_mode; + Common::ElfInfo::Instance().GetPSFAttributes().support_neo_mode; } int PS4_SYSV_ABI sceKernelGetCompiledSdkVersion(int* ver) { From 8f5bcb0f1c3008f969f7a3a72a987edb2b1ba2a9 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 8 Jan 2025 03:23:40 -0800 Subject: [PATCH 037/455] file_sys: Consolidate separate update directory handling. (#2041) --- src/core/file_sys/fs.cpp | 44 +++++++++++-- src/core/file_sys/fs.h | 6 +- src/core/libraries/kernel/file_system.cpp | 76 +++-------------------- src/emulator.cpp | 40 +++--------- src/emulator.h | 2 +- 5 files changed, 61 insertions(+), 107 deletions(-) diff --git a/src/core/file_sys/fs.cpp b/src/core/file_sys/fs.cpp index bf340e9e3..7d456780b 100644 --- a/src/core/file_sys/fs.cpp +++ b/src/core/file_sys/fs.cpp @@ -40,7 +40,8 @@ void MntPoints::UnmountAll() { m_mnt_pairs.clear(); } -std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_read_only) { +std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_read_only, + bool force_base_path) { // Evil games like Turok2 pass double slashes e.g /app0//game.kpf std::string corrected_path(path); size_t pos = corrected_path.find("//"); @@ -72,7 +73,7 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_rea patch_path /= rel_path; if ((corrected_path.starts_with("/app0") || corrected_path.starts_with("/hostapp")) && - std::filesystem::exists(patch_path)) { + !force_base_path && std::filesystem::exists(patch_path)) { return patch_path; } @@ -132,8 +133,10 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_rea return std::optional(current_path); }; - if (const auto path = search(patch_path)) { - return *path; + if (!force_base_path) { + if (const auto path = search(patch_path)) { + return *path; + } } if (const auto path = search(host_path)) { return *path; @@ -144,6 +147,39 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_rea return host_path; } +// TODO: Does not handle mount points inside mount points. +void MntPoints::IterateDirectory(std::string_view guest_directory, + const IterateDirectoryCallback& callback) { + const auto base_path = GetHostPath(guest_directory, nullptr, true); + const auto patch_path = GetHostPath(guest_directory, nullptr, false); + // Only need to consider patch path if it exists and does not resolve to the same as base. + const auto apply_patch = base_path != patch_path && std::filesystem::exists(patch_path); + + // Pass 1: Any files that existed in the base directory, using patch directory if needed. + if (std::filesystem::exists(base_path)) { + for (const auto& entry : std::filesystem::directory_iterator(base_path)) { + if (apply_patch) { + const auto patch_entry_path = patch_path / entry.path().filename(); + if (std::filesystem::exists(patch_entry_path)) { + callback(patch_entry_path, !std::filesystem::is_directory(patch_entry_path)); + continue; + } + } + callback(entry.path(), !entry.is_directory()); + } + } + + // Pass 2: Any files that exist only in the patch directory. + if (apply_patch) { + for (const auto& entry : std::filesystem::directory_iterator(patch_path)) { + const auto base_entry_path = base_path / entry.path().filename(); + if (!std::filesystem::exists(base_entry_path)) { + callback(entry.path(), !entry.is_directory()); + } + } + } +} + int HandleTable::CreateHandle() { std::scoped_lock lock{m_mutex}; diff --git a/src/core/file_sys/fs.h b/src/core/file_sys/fs.h index 56df32ad0..6638b48e8 100644 --- a/src/core/file_sys/fs.h +++ b/src/core/file_sys/fs.h @@ -36,7 +36,11 @@ public: void UnmountAll(); std::filesystem::path GetHostPath(std::string_view guest_directory, - bool* is_read_only = nullptr); + bool* is_read_only = nullptr, bool force_base_path = false); + using IterateDirectoryCallback = + std::function; + void IterateDirectory(std::string_view guest_directory, + const IterateDirectoryCallback& callback); const MntPair* GetMountFromHostPath(const std::string& host_path) { std::scoped_lock lock{m_mutex}; diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 57efbb631..2eb5d1621 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -46,17 +46,6 @@ static std::map available_device = { namespace Libraries::Kernel { -auto GetDirectoryEntries(const std::filesystem::path& path) { - std::vector files; - for (const auto& entry : std::filesystem::directory_iterator(path)) { - auto& dir_entry = files.emplace_back(); - dir_entry.name = entry.path().filename().string(); - dir_entry.isFile = !std::filesystem::is_directory(entry.path().string()); - } - - return files; -} - int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { LOG_INFO(Kernel_Fs, "path = {} flags = {:#x} mode = {}", raw_path, flags, mode); auto* h = Common::Singleton::Instance(); @@ -115,7 +104,12 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { if (create) { return handle; // dir already exists } else { - file->dirents = GetDirectoryEntries(file->m_host_name); + mnt->IterateDirectory(file->m_guest_name, + [&file](const auto& ent_path, const auto ent_is_file) { + auto& dir_entry = file->dirents.emplace_back(); + dir_entry.name = ent_path.filename().string(); + dir_entry.isFile = ent_is_file; + }); file->dirents_index = 0; } } @@ -695,66 +689,12 @@ static int GetDents(int fd, char* buf, int nbytes, s64* basep) { return sizeof(OrbisKernelDirent); } -static int HandleSeparateUpdateDents(int fd, char* buf, int nbytes, s64* basep) { - int dir_entries = 0; - - auto* h = Common::Singleton::Instance(); - auto* mnt = Common::Singleton::Instance(); - auto* file = h->GetFile(fd); - auto update_dir_name = std::string{fmt::UTF(file->m_host_name.u8string()).data}; - auto mount = mnt->GetMountFromHostPath(update_dir_name); - auto suffix = std::string{fmt::UTF(mount->host_path.u8string()).data}; - - size_t pos = update_dir_name.find("-UPDATE"); - if (pos != std::string::npos) { - update_dir_name.erase(pos, 7); - auto guest_name = mount->mount + "/" + update_dir_name.substr(suffix.size() + 1); - int descriptor; - - auto existent_folder = h->GetFile(update_dir_name); - if (!existent_folder) { - u32 handle = h->CreateHandle(); - auto* new_file = h->GetFile(handle); - new_file->type = Core::FileSys::FileType::Directory; - new_file->m_guest_name = guest_name; - new_file->m_host_name = update_dir_name; - if (!std::filesystem::is_directory(new_file->m_host_name)) { - h->DeleteHandle(handle); - return dir_entries; - } else { - new_file->dirents = GetDirectoryEntries(new_file->m_host_name); - new_file->dirents_index = 0; - } - new_file->is_opened = true; - descriptor = h->GetFileDescriptor(new_file); - } else { - descriptor = h->GetFileDescriptor(existent_folder); - } - - dir_entries = GetDents(descriptor, buf, nbytes, basep); - if (dir_entries == ORBIS_OK && existent_folder) { - existent_folder->dirents_index = 0; - file->dirents_index = 0; - } - } - - return dir_entries; -} - int PS4_SYSV_ABI sceKernelGetdents(int fd, char* buf, int nbytes) { - int a = GetDents(fd, buf, nbytes, nullptr); - if (a == ORBIS_OK) { - return HandleSeparateUpdateDents(fd, buf, nbytes, nullptr); - } - return a; + return GetDents(fd, buf, nbytes, nullptr); } int PS4_SYSV_ABI sceKernelGetdirentries(int fd, char* buf, int nbytes, s64* basep) { - int a = GetDents(fd, buf, nbytes, basep); - if (a == ORBIS_OK) { - return HandleSeparateUpdateDents(fd, buf, nbytes, basep); - } - return a; + return GetDents(fd, buf, nbytes, basep); } s64 PS4_SYSV_ABI sceKernelPwrite(int d, void* buf, size_t nbytes, s64 offset) { diff --git a/src/emulator.cpp b/src/emulator.cpp index 5d037e26c..dbe693340 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -217,41 +217,15 @@ void Emulator::Run(const std::filesystem::path& file) { linker->LoadModule(eboot_path); // check if we have system modules to load - LoadSystemModules(eboot_path, game_info.game_serial); + LoadSystemModules(game_info.game_serial); // Load all prx from game's sce_module folder - std::vector modules_to_load; - std::filesystem::path game_module_folder = file.parent_path() / "sce_module"; - if (std::filesystem::is_directory(game_module_folder)) { - for (const auto& entry : std::filesystem::directory_iterator(game_module_folder)) { - if (entry.is_regular_file()) { - modules_to_load.push_back(entry.path()); - } + mnt->IterateDirectory("/app0/sce_module", [this](const auto& path, const auto is_file) { + if (is_file) { + LOG_INFO(Loader, "Loading {}", fmt::UTF(path.u8string())); + linker->LoadModule(path); } - } - - // Load all prx from separate update's sce_module folder - std::filesystem::path game_patch_folder = game_folder; - game_patch_folder += "-UPDATE"; - std::filesystem::path update_module_folder = game_patch_folder / "sce_module"; - if (std::filesystem::is_directory(update_module_folder)) { - for (const auto& entry : std::filesystem::directory_iterator(update_module_folder)) { - auto it = std::find_if(modules_to_load.begin(), modules_to_load.end(), - [&entry](const std::filesystem::path& p) { - return p.filename() == entry.path().filename(); - }); - if (it != modules_to_load.end()) { - *it = entry.path(); - } else { - modules_to_load.push_back(entry.path()); - } - } - } - - for (const auto& module_path : modules_to_load) { - LOG_INFO(Loader, "Loading {}", fmt::UTF(module_path.u8string())); - linker->LoadModule(module_path); - } + }); #ifdef ENABLE_DISCORD_RPC // Discord RPC @@ -278,7 +252,7 @@ void Emulator::Run(const std::filesystem::path& file) { std::exit(0); } -void Emulator::LoadSystemModules(const std::filesystem::path& file, std::string game_serial) { +void Emulator::LoadSystemModules(const std::string& game_serial) { constexpr std::array ModulesToLoad{ {{"libSceNgs2.sprx", &Libraries::Ngs2::RegisterlibSceNgs2}, {"libSceUlt.sprx", nullptr}, diff --git a/src/emulator.h b/src/emulator.h index e973e9022..a08ab43c3 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -29,7 +29,7 @@ public: void UpdatePlayTime(const std::string& serial); private: - void LoadSystemModules(const std::filesystem::path& file, std::string game_serial); + void LoadSystemModules(const std::string& game_serial); Core::MemoryManager* memory; Input::GameController* controller; From e791ff4c5c6f467d0fc718545fa517fe4a0b37c1 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 8 Jan 2025 03:50:39 -0800 Subject: [PATCH 038/455] externals: Update discord-rpc. (#2094) --- externals/CMakeLists.txt | 2 -- externals/discord-rpc | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 4350948b7..4ce5636d8 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -213,9 +213,7 @@ endif() # Discord RPC if (ENABLE_DISCORD_RPC) - set(BUILD_EXAMPLES OFF) add_subdirectory(discord-rpc) - target_include_directories(discord-rpc INTERFACE discord-rpc/include) endif() # GCN Headers diff --git a/externals/discord-rpc b/externals/discord-rpc index 4ec218155..51b09d426 160000 --- a/externals/discord-rpc +++ b/externals/discord-rpc @@ -1 +1 @@ -Subproject commit 4ec218155d73bcb8022f8f7ca72305d801f84beb +Subproject commit 51b09d426a4a1bcfa6ee6d4894e57d669f4a2e65 From fc50567fc2e5be7f061f22981e6f98082bc9fe27 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 8 Jan 2025 06:08:54 -0600 Subject: [PATCH 039/455] Unmap Fixes (#2080) * Fix unmapping reserved memory * Fix bug with unmapping before reserve * Clang * Ignore free memory pages * Handle pooled memory --- src/core/memory.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 1327ede5f..619941000 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -171,10 +171,11 @@ int MemoryManager::PoolReserve(void** out_addr, VAddr virtual_addr, size_t size, // Fixed mapping means the virtual address must exactly match the provided one. if (True(flags & MemoryMapFlags::Fixed)) { - const auto& vma = FindVMA(mapped_addr)->second; + auto& vma = FindVMA(mapped_addr)->second; // If the VMA is mapped, unmap the region first. if (vma.IsMapped()) { UnmapMemoryImpl(mapped_addr, size); + vma = FindVMA(mapped_addr)->second; } const size_t remaining_size = vma.base + vma.size - mapped_addr; ASSERT_MSG(vma.type == VMAType::Free && remaining_size >= size); @@ -208,10 +209,11 @@ int MemoryManager::Reserve(void** out_addr, VAddr virtual_addr, size_t size, Mem // Fixed mapping means the virtual address must exactly match the provided one. if (True(flags & MemoryMapFlags::Fixed)) { - const auto& vma = FindVMA(mapped_addr)->second; + auto& vma = FindVMA(mapped_addr)->second; // If the VMA is mapped, unmap the region first. if (vma.IsMapped()) { UnmapMemoryImpl(mapped_addr, size); + vma = FindVMA(mapped_addr)->second; } const size_t remaining_size = vma.base + vma.size - mapped_addr; ASSERT_MSG(vma.type == VMAType::Free && remaining_size >= size); @@ -393,14 +395,18 @@ s32 MemoryManager::UnmapMemoryImpl(VAddr virtual_addr, size_t size) { ASSERT_MSG(vma_base.Contains(virtual_addr, size), "Existing mapping does not contain requested unmap range"); + const auto type = vma_base.type; + if (type == VMAType::Free) { + return ORBIS_OK; + } + const auto vma_base_addr = vma_base.base; const auto vma_base_size = vma_base.size; const auto phys_base = vma_base.phys_base; const bool is_exec = vma_base.is_exec; const auto start_in_vma = virtual_addr - vma_base_addr; - const auto type = vma_base.type; const bool has_backing = type == VMAType::Direct || type == VMAType::File; - if (type == VMAType::Direct) { + if (type == VMAType::Direct || type == VMAType::Pooled) { rasterizer->UnmapMemory(virtual_addr, size); } if (type == VMAType::Flexible) { @@ -418,10 +424,12 @@ s32 MemoryManager::UnmapMemoryImpl(VAddr virtual_addr, size_t size) { MergeAdjacent(vma_map, new_it); bool readonly_file = vma.prot == MemoryProt::CpuRead && type == VMAType::File; - // Unmap the memory region. - impl.Unmap(vma_base_addr, vma_base_size, start_in_vma, start_in_vma + size, phys_base, is_exec, - has_backing, readonly_file); - TRACK_FREE(virtual_addr, "VMEM"); + if (type != VMAType::Reserved && type != VMAType::PoolReserved) { + // Unmap the memory region. + impl.Unmap(vma_base_addr, vma_base_size, start_in_vma, start_in_vma + size, phys_base, + is_exec, has_backing, readonly_file); + TRACK_FREE(virtual_addr, "VMEM"); + } return ORBIS_OK; } From 0eee36cbc7b6e6e7b605f532925845ec30630c7c Mon Sep 17 00:00:00 2001 From: tomboylover93 <95257311+tomboylover93@users.noreply.github.com> Date: Wed, 8 Jan 2025 04:41:01 -0800 Subject: [PATCH 040/455] ci: Add GCC build job for Linux (#2027) * Add GCC CI build job * gcc-ci: Change Clang CI job naming to avoid confusion * gcc-ci: Remove GCC CI job from pre-release This also removes the packaging step for linux-sdl-gcc and linux-qt-gcc so that the only available artifacts for download are compiled with Clang * gcc-ci: Remove -clang prefix from Clang build jobs * hot-fix * specify gcc-14 * hot-fix: use system rapidjson * use rapidjson-dev * revert "use system rapidjson" --- .github/workflows/build.yml | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c4a34469..c36c026fc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -376,6 +376,78 @@ jobs: name: shadps4-linux-qt-${{ needs.get-info.outputs.date }}-${{ needs.get-info.outputs.shorthash }} path: Shadps4-qt.AppImage + linux-sdl-gcc: + runs-on: ubuntu-24.04 + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 gcc-14 build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-sdl-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{ runner.os }}-sdl-cache-cmake-build + with: + append-timestamp: false + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + + - name: Configure CMake + run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(nproc) + + linux-qt-gcc: + runs-on: ubuntu-24.04 + needs: get-info + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 gcc-14 build-essential qt6-base-dev qt6-tools-dev qt6-multimedia-dev libasound2-dev libpulse-dev libopenal-dev libudev-dev + + - name: Cache CMake Configuration + uses: actions/cache@v4 + env: + cache-name: ${{ runner.os }}-qt-cache-cmake-configuration + with: + path: | + ${{github.workspace}}/build + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + restore-keys: | + ${{ env.cache-name }}- + + - name: Cache CMake Build + uses: hendrikmuhs/ccache-action@v1.2.14 + env: + cache-name: ${{ runner.os }}-qt-cache-cmake-build + with: + append-timestamp: false + key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} + + - name: Configure CMake + run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DENABLE_QT_GUI=ON -DENABLE_UPDATER=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + + - name: Build + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(nproc) + pre-release: if: github.ref == 'refs/heads/main' && github.repository == 'shadps4-emu/shadPS4' && github.event_name == 'push' needs: [get-info, windows-sdl, windows-qt, macos-sdl, macos-qt, linux-sdl, linux-qt] From 65f9bbbfed83cc6504332012681bcda0874e7268 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 8 Jan 2025 09:14:06 -0800 Subject: [PATCH 041/455] shader_recompiler: Ignore exec mask for scalar instructions. (#2097) --- .../frontend/control_flow_graph.cpp | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/shader_recompiler/frontend/control_flow_graph.cpp b/src/shader_recompiler/frontend/control_flow_graph.cpp index 0816ec088..ec5c117f7 100644 --- a/src/shader_recompiler/frontend/control_flow_graph.cpp +++ b/src/shader_recompiler/frontend/control_flow_graph.cpp @@ -47,13 +47,26 @@ static IR::Condition MakeCondition(const GcnInst& inst) { } } -static bool IgnoresExecMask(Opcode opcode) { - switch (opcode) { - case Opcode::V_WRITELANE_B32: +static bool IgnoresExecMask(const GcnInst& inst) { + // EXEC mask does not affect scalar instructions or branches. + switch (inst.category) { + case InstCategory::ScalarALU: + case InstCategory::ScalarMemory: + case InstCategory::FlowControl: return true; default: - return false; + break; } + // Read/Write Lane instructions are not affected either. + switch (inst.opcode) { + case Opcode::V_READLANE_B32: + case Opcode::V_WRITELANE_B32: + case Opcode::V_READFIRSTLANE_B32: + return true; + default: + break; + } + return false; } static constexpr size_t LabelReserveSize = 32; @@ -147,8 +160,7 @@ void CFG::EmitDivergenceLabels() { // If all instructions in the scope ignore exec masking, we shouldn't insert a // scope. const auto start = inst_list.begin() + curr_begin + 1; - if (!std::ranges::all_of(start, inst_list.begin() + index, IgnoresExecMask, - &GcnInst::opcode)) { + if (!std::ranges::all_of(start, inst_list.begin() + index, IgnoresExecMask)) { // Add a label to the instruction right after the open scope call. // It is the start of a new basic block. const auto& save_inst = inst_list[curr_begin]; From 93402620de7897a273f4ed980daec660d1b83a1c Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Thu, 9 Jan 2025 03:42:07 -0300 Subject: [PATCH 042/455] GUI: Open Log Location - Button (#2102) --- src/qt_gui/settings_dialog.cpp | 11 +++++++++++ src/qt_gui/settings_dialog.ui | 7 +++++++ src/qt_gui/translations/ar.ts | 4 ++++ src/qt_gui/translations/da_DK.ts | 4 ++++ src/qt_gui/translations/de.ts | 4 ++++ src/qt_gui/translations/el.ts | 4 ++++ src/qt_gui/translations/en.ts | 4 ++++ src/qt_gui/translations/es_ES.ts | 4 ++++ src/qt_gui/translations/fa_IR.ts | 4 ++++ src/qt_gui/translations/fi.ts | 4 ++++ src/qt_gui/translations/fr.ts | 4 ++++ src/qt_gui/translations/hu_HU.ts | 4 ++++ src/qt_gui/translations/id.ts | 4 ++++ src/qt_gui/translations/it.ts | 4 ++++ src/qt_gui/translations/ja_JP.ts | 4 ++++ src/qt_gui/translations/ko_KR.ts | 4 ++++ src/qt_gui/translations/lt_LT.ts | 4 ++++ src/qt_gui/translations/nb.ts | 4 ++++ src/qt_gui/translations/nl.ts | 4 ++++ src/qt_gui/translations/pl_PL.ts | 4 ++++ src/qt_gui/translations/pt_BR.ts | 4 ++++ src/qt_gui/translations/ro_RO.ts | 4 ++++ src/qt_gui/translations/ru_RU.ts | 4 ++++ src/qt_gui/translations/sq.ts | 4 ++++ src/qt_gui/translations/sv.ts | 4 ++++ src/qt_gui/translations/tr_TR.ts | 4 ++++ src/qt_gui/translations/uk_UA.ts | 4 ++++ src/qt_gui/translations/vi_VN.ts | 4 ++++ src/qt_gui/translations/zh_CN.ts | 4 ++++ src/qt_gui/translations/zh_TW.ts | 4 ++++ 30 files changed, 130 insertions(+) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 193ce5cd8..3f4970dad 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -17,6 +17,7 @@ #ifdef ENABLE_UPDATER #include "check_update.h" #endif +#include #include #include "background_music_player.h" #include "common/logging/backend.h" @@ -203,6 +204,16 @@ SettingsDialog::SettingsDialog(std::span physical_devices, }); } + // DEBUG TAB + { + connect(ui->OpenLogLocationButton, &QPushButton::clicked, this, []() { + QString userPath; + Common::FS::PathToQString(userPath, + Common::FS::GetUserPath(Common::FS::PathType::UserDir)); + QDesktopServices::openUrl(QUrl::fromLocalFile(userPath + "/log")); + }); + } + // Descriptions { // General diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index fbfee5a99..089158fd3 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -1394,6 +1394,13 @@ + + + + Open Log Location + + + diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index c1964356a..4fc9c2de1 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -576,6 +576,10 @@ Log Filter مرشح السجل + + Open Log Location + افتح موقع السجل + Input إدخال diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 51fa2ca5f..ef1ae27a3 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Åbn logplacering + Input Indtastning diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 1653298cf..2fc6a29fe 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -576,6 +576,10 @@ Log Filter Log-Filter + + Open Log Location + Protokollspeicherort öffnen + Input Eingabe diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 6226e1292..8d3885808 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Άνοιγμα τοποθεσίας αρχείου καταγραφής + Input Είσοδος diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 1f932ea97..0262ee149 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Open Log Location + Input Input diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 021b39ed8..a25ff639e 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -576,6 +576,10 @@ Log Filter Filtro de registro + + Open Log Location + Abrir ubicación del registro + Input Entrada diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index ee37cd22a..52aa4b17c 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -576,6 +576,10 @@ Log Filter Log فیلتر + + Open Log Location + باز کردن مکان گزارش + Input ورودی diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 47c38fc46..97fee5dfa 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -576,6 +576,10 @@ Log Filter Lokisuodatin + + Open Log Location + Avaa lokin sijainti + Input Syöttö diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index c2a2a64d7..d25ad30f4 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -576,6 +576,10 @@ Log Filter Filtre + + Open Log Location + Ouvrir l'emplacement du journal + Input Entrée diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 677302e01..6ecc3fc90 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -576,6 +576,10 @@ Log Filter Naplózási Filter + + Open Log Location + Napló helyének megnyitása + Input Bemenet diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index 7a1391c0e..fc5ad4a99 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Buka Lokasi Log + Input Masukan diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 8bdb7a8fd..f7ba3661b 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -576,6 +576,10 @@ Log Filter Filtro Log + + Open Log Location + Apri posizione del registro + Input Input diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index f34747549..21c8145ed 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -576,6 +576,10 @@ Log Filter ログフィルター + + Open Log Location + ログの場所を開く + Input 入力 diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 410f9bead..fea8d55bc 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + 로그 위치 열기 + Input Input diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 770a9b09e..eaf51a975 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Atidaryti žurnalo vietą + Input Įvestis diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index 711542773..83dbf7dd8 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -576,6 +576,10 @@ Log Filter Logg filter + + Open Log Location + Åpne loggplassering + Input Inndata diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 2aa996413..3142a17e5 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Loglocatie openen + Input Invoer diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 20c9861c3..378673a30 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -576,6 +576,10 @@ Log Filter Filtrowanie dziennika + + Open Log Location + Otwórz lokalizację dziennika + Input Wejście diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 2d623dfbf..5d9c84769 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -576,6 +576,10 @@ Log Filter Filtro do Registro + + Open Log Location + Abrir local do log + Input Entradas diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index fbbabfac0..71354fb06 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Deschide locația jurnalului + Input Introducere diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index e914e4d49..0e803ea42 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -576,6 +576,10 @@ Log Filter Фильтр логов + + Open Log Location + Открыть местоположение журнала + Input Ввод diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index d4936170b..7354b4bd9 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -576,6 +576,10 @@ Log Filter Filtri i Ditarit + + Open Log Location + Hap vendndodhjen e regjistrit + Input Hyrja diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index c1c1204f8..3a6f060cb 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1064,6 +1064,10 @@ Log Filter Loggfilter + + Open Log Location + Öppna loggplats + Input Inmatning diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 48f291e99..4596000f2 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -576,6 +576,10 @@ Log Filter Kayıt Filtresi + + Open Log Location + Günlük Konumunu Aç + Input Girdi diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 03aca7cd9..5b260050e 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -576,6 +576,10 @@ Log Filter Фільтр логів + + Open Log Location + Відкрити місце розташування журналу + Input Введення diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 3f92c1836..7fcac6d7e 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + Mở vị trí nhật ký + Input Đầu vào diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 60e50a2bc..e71180729 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -576,6 +576,10 @@ Log Filter 日志过滤 + + Open Log Location + 打开日志位置 + Input 输入 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index d1e822b5c..49d419d8b 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -576,6 +576,10 @@ Log Filter Log Filter + + Open Log Location + 開啟日誌位置 + Input 輸入 From 725814ce012f5246e03a4df23b8f24a9426cb100 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 10 Jan 2025 00:48:12 -0800 Subject: [PATCH 043/455] shader_recompiler: Improvements to array and cube handling. (#2083) * shader_recompiler: Account for instruction array flag in image type. * shader_recompiler: Check da flag for all mimg instructions. * shader_recompiler: Convert cube images into 2D arrays. * shader_recompiler: Move image resource functions into sharp type. * shader_recompiler: Use native AMD cube instructions when possible. * specialization: Fix buffer storage mistake. --- externals/sirit | 2 +- .../backend/spirv/emit_spirv_image.cpp | 23 +++++- .../backend/spirv/emit_spirv_instructions.h | 2 + .../backend/spirv/spirv_emit_context.cpp | 10 +-- .../backend/spirv/spirv_emit_context.h | 1 + .../frontend/translate/translate.h | 3 + .../frontend/translate/vector_alu.cpp | 81 ++++++++++++++++++- .../frontend/translate/vector_memory.cpp | 37 ++++++--- src/shader_recompiler/info.h | 6 -- src/shader_recompiler/ir/ir_emitter.cpp | 13 +-- src/shader_recompiler/ir/ir_emitter.h | 5 +- src/shader_recompiler/ir/opcodes.inc | 4 + .../ir/passes/resource_tracking_pass.cpp | 46 +---------- .../ir/passes/shader_info_collection_pass.cpp | 2 +- src/shader_recompiler/profile.h | 1 + src/shader_recompiler/specialization.h | 4 +- src/video_core/amdgpu/resource.h | 56 +++++++++---- .../renderer_vulkan/vk_compute_pipeline.cpp | 5 +- .../renderer_vulkan/vk_graphics_pipeline.cpp | 5 +- .../renderer_vulkan/vk_instance.cpp | 1 + src/video_core/renderer_vulkan/vk_instance.h | 6 ++ .../renderer_vulkan/vk_pipeline_cache.cpp | 1 + .../renderer_vulkan/vk_rasterizer.cpp | 2 +- src/video_core/texture_cache/image.cpp | 8 +- src/video_core/texture_cache/image_info.cpp | 4 +- src/video_core/texture_cache/image_info.h | 1 - src/video_core/texture_cache/image_view.cpp | 30 ++----- src/video_core/texture_cache/texture_cache.h | 2 +- 28 files changed, 217 insertions(+), 144 deletions(-) diff --git a/externals/sirit b/externals/sirit index 1e74f4ef8..26ad5a9d0 160000 --- a/externals/sirit +++ b/externals/sirit @@ -1 +1 @@ -Subproject commit 1e74f4ef8d2a0e3221a4de51977663f342b53c35 +Subproject commit 26ad5a9d0fe13260b0d7d6c64419d01a196b2e32 diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index c3d937fe7..182437b63 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -172,20 +172,19 @@ Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod const auto& texture = ctx.images[handle & 0xFFFF]; const Id image = ctx.OpLoad(texture.image_type, texture.id); const auto sharp = ctx.info.images[handle & 0xFFFF].GetSharp(ctx.info); - const auto type = sharp.GetBoundType(); const Id zero = ctx.u32_zero_value; const auto mips{[&] { return has_mips ? ctx.OpImageQueryLevels(ctx.U32[1], image) : zero; }}; - const bool uses_lod{type != AmdGpu::ImageType::Color2DMsaa && !texture.is_storage}; + const bool uses_lod{texture.bound_type != AmdGpu::ImageType::Color2DMsaa && + !texture.is_storage}; const auto query{[&](Id type) { return uses_lod ? ctx.OpImageQuerySizeLod(type, image, lod) : ctx.OpImageQuerySize(type, image); }}; - switch (type) { + switch (texture.bound_type) { case AmdGpu::ImageType::Color1D: return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[1]), zero, zero, mips()); case AmdGpu::ImageType::Color1DArray: case AmdGpu::ImageType::Color2D: - case AmdGpu::ImageType::Cube: case AmdGpu::ImageType::Color2DMsaa: return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[2]), zero, mips()); case AmdGpu::ImageType::Color2DArray: @@ -257,4 +256,20 @@ void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id ctx.OpImageWrite(image, coords, texel, operands.mask, operands.operands); } +Id EmitCubeFaceCoord(EmitContext& ctx, IR::Inst* inst, Id cube_coords) { + if (ctx.profile.supports_native_cube_calc) { + return ctx.OpCubeFaceCoordAMD(ctx.F32[2], cube_coords); + } else { + UNREACHABLE_MSG("SPIR-V Instruction"); + } +} + +Id EmitCubeFaceIndex(EmitContext& ctx, IR::Inst* inst, Id cube_coords) { + if (ctx.profile.supports_native_cube_calc) { + return ctx.OpCubeFaceIndexAMD(ctx.F32[1], cube_coords); + } else { + UNREACHABLE_MSG("SPIR-V Instruction"); + } +} + } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 0d9fcff46..37b6f7786 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -439,6 +439,8 @@ Id EmitImageAtomicAnd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id EmitImageAtomicOr32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value); Id EmitImageAtomicXor32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value); Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value); +Id EmitCubeFaceCoord(EmitContext& ctx, IR::Inst* inst, Id cube_coords); +Id EmitCubeFaceIndex(EmitContext& ctx, IR::Inst* inst, Id cube_coords); Id EmitLaneId(EmitContext& ctx); Id EmitWarpId(EmitContext& ctx); Id EmitQuadShuffle(EmitContext& ctx, Id value, Id index); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 575bf91f7..6151c5c65 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -773,8 +773,8 @@ spv::ImageFormat GetFormat(const AmdGpu::Image& image) { Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) { const auto image = desc.GetSharp(ctx.info); const auto format = desc.is_atomic ? GetFormat(image) : spv::ImageFormat::Unknown; - const auto type = image.GetBoundType(); - const u32 sampled = desc.IsStorage(image) ? 2 : 1; + const auto type = image.GetBoundType(desc.is_array); + const u32 sampled = desc.is_written ? 2 : 1; switch (type) { case AmdGpu::ImageType::Color1D: return ctx.TypeImage(sampled_type, spv::Dim::Dim1D, false, false, false, sampled, format); @@ -788,9 +788,6 @@ Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) { return ctx.TypeImage(sampled_type, spv::Dim::Dim2D, false, false, true, sampled, format); case AmdGpu::ImageType::Color3D: return ctx.TypeImage(sampled_type, spv::Dim::Dim3D, false, false, false, sampled, format); - case AmdGpu::ImageType::Cube: - return ctx.TypeImage(sampled_type, spv::Dim::Cube, false, desc.is_array, false, sampled, - format); default: break; } @@ -802,7 +799,7 @@ void EmitContext::DefineImagesAndSamplers() { const auto sharp = image_desc.GetSharp(info); const auto nfmt = sharp.GetNumberFmt(); const bool is_integer = AmdGpu::IsInteger(nfmt); - const bool is_storage = image_desc.IsStorage(sharp); + const bool is_storage = image_desc.is_written; const VectorIds& data_types = GetAttributeType(*this, nfmt); const Id sampled_type = data_types[1]; const Id image_type{ImageType(*this, image_desc, sampled_type)}; @@ -817,6 +814,7 @@ void EmitContext::DefineImagesAndSamplers() { .sampled_type = is_storage ? sampled_type : TypeSampledImage(image_type), .pointer_type = pointer_type, .image_type = image_type, + .bound_type = sharp.GetBoundType(image_desc.is_array), .is_integer = is_integer, .is_storage = is_storage, }); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 583d96b99..80d0d4d9f 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -222,6 +222,7 @@ public: Id sampled_type; Id pointer_type; Id image_type; + AmdGpu::ImageType bound_type; bool is_integer = false; bool is_storage = false; }; diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 7a0b736d4..bef61f997 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -301,6 +301,9 @@ private: IR::U32 VMovRelSHelper(u32 src_vgprno, const IR::U32 m0); void VMovRelDHelper(u32 dst_vgprno, const IR::U32 src_val, const IR::U32 m0); + IR::F32 SelectCubeResult(const IR::F32& x, const IR::F32& y, const IR::F32& z, + const IR::F32& x_res, const IR::F32& y_res, const IR::F32& z_res); + void LogMissingOpcode(const GcnInst& inst); private: diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 7fa83eebb..375c5f078 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -3,6 +3,7 @@ #include "shader_recompiler/frontend/opcodes.h" #include "shader_recompiler/frontend/translate/translate.h" +#include "shader_recompiler/profile.h" namespace Shader::Gcn { @@ -1042,20 +1043,92 @@ void Translator::V_MAD_U32_U24(const GcnInst& inst) { V_MAD_I32_I24(inst, false); } +IR::F32 Translator::SelectCubeResult(const IR::F32& x, const IR::F32& y, const IR::F32& z, + const IR::F32& x_res, const IR::F32& y_res, + const IR::F32& z_res) { + const auto abs_x = ir.FPAbs(x); + const auto abs_y = ir.FPAbs(y); + const auto abs_z = ir.FPAbs(z); + + const auto z_face_cond{ + ir.LogicalAnd(ir.FPGreaterThanEqual(abs_z, abs_x), ir.FPGreaterThanEqual(abs_z, abs_y))}; + const auto y_face_cond{ir.FPGreaterThanEqual(abs_y, abs_x)}; + + return IR::F32{ir.Select(z_face_cond, z_res, ir.Select(y_face_cond, y_res, x_res))}; +} + void Translator::V_CUBEID_F32(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[2])); + const auto x = GetSrc(inst.src[0]); + const auto y = GetSrc(inst.src[1]); + const auto z = GetSrc(inst.src[2]); + + IR::F32 result; + if (profile.supports_native_cube_calc) { + result = ir.CubeFaceIndex(ir.CompositeConstruct(x, y, z)); + } else { + const auto x_neg_cond{ir.FPLessThan(x, ir.Imm32(0.f))}; + const auto y_neg_cond{ir.FPLessThan(y, ir.Imm32(0.f))}; + const auto z_neg_cond{ir.FPLessThan(z, ir.Imm32(0.f))}; + const IR::F32 x_face{ir.Select(x_neg_cond, ir.Imm32(5.f), ir.Imm32(4.f))}; + const IR::F32 y_face{ir.Select(y_neg_cond, ir.Imm32(3.f), ir.Imm32(2.f))}; + const IR::F32 z_face{ir.Select(z_neg_cond, ir.Imm32(1.f), ir.Imm32(0.f))}; + + result = SelectCubeResult(x, y, z, x_face, y_face, z_face); + } + SetDst(inst.dst[0], result); } void Translator::V_CUBESC_F32(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[0])); + const auto x = GetSrc(inst.src[0]); + const auto y = GetSrc(inst.src[1]); + const auto z = GetSrc(inst.src[2]); + + IR::F32 result; + if (profile.supports_native_cube_calc) { + const auto coords{ir.CubeFaceCoord(ir.CompositeConstruct(x, y, z))}; + result = IR::F32{ir.CompositeExtract(coords, 0)}; + } else { + const auto x_neg_cond{ir.FPLessThan(x, ir.Imm32(0.f))}; + const auto z_neg_cond{ir.FPLessThan(z, ir.Imm32(0.f))}; + const IR::F32 x_sc{ir.Select(x_neg_cond, ir.FPNeg(x), x)}; + const IR::F32 z_sc{ir.Select(z_neg_cond, z, ir.FPNeg(z))}; + + result = SelectCubeResult(x, y, z, x_sc, x, z_sc); + } + SetDst(inst.dst[0], result); } void Translator::V_CUBETC_F32(const GcnInst& inst) { - SetDst(inst.dst[0], GetSrc(inst.src[1])); + const auto x = GetSrc(inst.src[0]); + const auto y = GetSrc(inst.src[1]); + const auto z = GetSrc(inst.src[2]); + + IR::F32 result; + if (profile.supports_native_cube_calc) { + const auto coords{ir.CubeFaceCoord(ir.CompositeConstruct(x, y, z))}; + result = IR::F32{ir.CompositeExtract(coords, 1)}; + } else { + const auto y_neg_cond{ir.FPLessThan(y, ir.Imm32(0.f))}; + const IR::F32 x_z_sc{ir.FPNeg(y)}; + const IR::F32 y_sc{ir.Select(y_neg_cond, ir.FPNeg(z), z)}; + + result = SelectCubeResult(x, y, z, x_z_sc, y_sc, x_z_sc); + } + SetDst(inst.dst[0], result); } void Translator::V_CUBEMA_F32(const GcnInst& inst) { - SetDst(inst.dst[0], ir.Imm32(1.f)); + const auto x = GetSrc(inst.src[0]); + const auto y = GetSrc(inst.src[1]); + const auto z = GetSrc(inst.src[2]); + + const auto two{ir.Imm32(4.f)}; + const IR::F32 x_major_axis{ir.FPMul(x, two)}; + const IR::F32 y_major_axis{ir.FPMul(y, two)}; + const IR::F32 z_major_axis{ir.FPMul(z, two)}; + + const auto result{SelectCubeResult(x, y, z, x_major_axis, y_major_axis, z_major_axis)}; + SetDst(inst.dst[0], result); } void Translator::V_BFE_U32(bool is_signed, const GcnInst& inst) { diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index c5be08b7d..a5b54dff7 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -418,6 +418,7 @@ void Translator::IMAGE_LOAD(bool has_mip, const GcnInst& inst) { IR::TextureInstInfo info{}; info.has_lod.Assign(has_mip); + info.is_array.Assign(mimg.da); const IR::Value texel = ir.ImageRead(handle, body, {}, {}, info); for (u32 i = 0; i < 4; i++) { @@ -442,6 +443,7 @@ void Translator::IMAGE_STORE(bool has_mip, const GcnInst& inst) { IR::TextureInstInfo info{}; info.has_lod.Assign(has_mip); + info.is_array.Assign(mimg.da); boost::container::static_vector comps; for (u32 i = 0; i < 4; i++) { @@ -456,13 +458,18 @@ void Translator::IMAGE_STORE(bool has_mip, const GcnInst& inst) { } void Translator::IMAGE_GET_RESINFO(const GcnInst& inst) { + const auto& mimg = inst.control.mimg; IR::VectorReg dst_reg{inst.dst[0].code}; const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; const auto flags = ImageResFlags(inst.control.mimg.dmask); const bool has_mips = flags.test(ImageResComponent::MipCount); const IR::U32 lod = ir.GetVectorReg(IR::VectorReg(inst.src[0].code)); const IR::Value tsharp = ir.GetScalarReg(tsharp_reg); - const IR::Value size = ir.ImageQueryDimension(tsharp, lod, ir.Imm1(has_mips)); + + IR::TextureInstInfo info{}; + info.is_array.Assign(mimg.da); + + const IR::Value size = ir.ImageQueryDimension(tsharp, lod, ir.Imm1(has_mips), info); if (flags.test(ImageResComponent::Width)) { ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(size, 0)}); @@ -484,6 +491,9 @@ void Translator::IMAGE_ATOMIC(AtomicOp op, const GcnInst& inst) { IR::VectorReg addr_reg{inst.src[0].code}; const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; + IR::TextureInstInfo info{}; + info.is_array.Assign(mimg.da); + const IR::Value value = ir.GetVectorReg(val_reg); const IR::Value handle = ir.GetScalarReg(tsharp_reg); const IR::Value body = @@ -494,25 +504,25 @@ void Translator::IMAGE_ATOMIC(AtomicOp op, const GcnInst& inst) { case AtomicOp::Swap: return ir.ImageAtomicExchange(handle, body, value, {}); case AtomicOp::Add: - return ir.ImageAtomicIAdd(handle, body, value, {}); + return ir.ImageAtomicIAdd(handle, body, value, info); case AtomicOp::Smin: - return ir.ImageAtomicIMin(handle, body, value, true, {}); + return ir.ImageAtomicIMin(handle, body, value, true, info); case AtomicOp::Umin: - return ir.ImageAtomicUMin(handle, body, value, {}); + return ir.ImageAtomicUMin(handle, body, value, info); case AtomicOp::Smax: - return ir.ImageAtomicIMax(handle, body, value, true, {}); + return ir.ImageAtomicIMax(handle, body, value, true, info); case AtomicOp::Umax: - return ir.ImageAtomicUMax(handle, body, value, {}); + return ir.ImageAtomicUMax(handle, body, value, info); case AtomicOp::And: - return ir.ImageAtomicAnd(handle, body, value, {}); + return ir.ImageAtomicAnd(handle, body, value, info); case AtomicOp::Or: - return ir.ImageAtomicOr(handle, body, value, {}); + return ir.ImageAtomicOr(handle, body, value, info); case AtomicOp::Xor: - return ir.ImageAtomicXor(handle, body, value, {}); + return ir.ImageAtomicXor(handle, body, value, info); case AtomicOp::Inc: - return ir.ImageAtomicInc(handle, body, value, {}); + return ir.ImageAtomicInc(handle, body, value, info); case AtomicOp::Dec: - return ir.ImageAtomicDec(handle, body, value, {}); + return ir.ImageAtomicDec(handle, body, value, info); default: UNREACHABLE(); } @@ -643,11 +653,14 @@ void Translator::IMAGE_GET_LOD(const GcnInst& inst) { IR::VectorReg addr_reg{inst.src[0].code}; const IR::ScalarReg tsharp_reg{inst.src[2].code * 4}; + IR::TextureInstInfo info{}; + info.is_array.Assign(mimg.da); + const IR::Value handle = ir.GetScalarReg(tsharp_reg); const IR::Value body = ir.CompositeConstruct( ir.GetVectorReg(addr_reg), ir.GetVectorReg(addr_reg + 1), ir.GetVectorReg(addr_reg + 2), ir.GetVectorReg(addr_reg + 3)); - const IR::Value lod = ir.ImageQueryLod(handle, body, {}); + const IR::Value lod = ir.ImageQueryLod(handle, body, info); ir.SetVectorReg(dst_reg++, IR::F32{ir.CompositeExtract(lod, 0)}); ir.SetVectorReg(dst_reg++, IR::F32{ir.CompositeExtract(lod, 1)}); } diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index b6ac12785..aeff346fa 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -70,14 +70,8 @@ struct ImageResource { bool is_depth{}; bool is_atomic{}; bool is_array{}; - bool is_read{}; bool is_written{}; - [[nodiscard]] bool IsStorage(const AmdGpu::Image& image) const noexcept { - // Need cube as storage when used with ImageRead. - return is_written || (is_read && image.GetBoundType() == AmdGpu::ImageType::Cube); - } - [[nodiscard]] constexpr AmdGpu::Image GetSharp(const Info& info) const noexcept; }; using ImageResourceList = boost::container::small_vector; diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index 823f9bdcd..8626bdfd1 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -1732,11 +1732,6 @@ Value IREmitter::ImageGatherDref(const Value& handle, const Value& coords, const return Inst(Opcode::ImageGatherDref, Flags{info}, handle, coords, offset, dref); } -Value IREmitter::ImageQueryDimension(const Value& handle, const IR::U32& lod, - const IR::U1& skip_mips) { - return Inst(Opcode::ImageQueryDimensions, handle, lod, skip_mips); -} - Value IREmitter::ImageQueryDimension(const Value& handle, const IR::U32& lod, const IR::U1& skip_mips, TextureInstInfo info) { return Inst(Opcode::ImageQueryDimensions, Flags{info}, handle, lod, skip_mips); @@ -1763,6 +1758,14 @@ void IREmitter::ImageWrite(const Value& handle, const Value& coords, const U32& Inst(Opcode::ImageWrite, Flags{info}, handle, coords, lod, multisampling, color); } +[[nodiscard]] Value IREmitter::CubeFaceCoord(const Value& cube_coords) { + return Inst(Opcode::CubeFaceCoord, cube_coords); +} + +[[nodiscard]] F32 IREmitter::CubeFaceIndex(const Value& cube_coords) { + return Inst(Opcode::CubeFaceIndex, cube_coords); +} + // Debug print maps to SPIRV's NonSemantic DebugPrintf instruction // Renderdoc will hook in its own implementation of the SPIRV instruction // Renderdoc accepts format specifiers, e.g. %u, listed here: diff --git a/src/shader_recompiler/ir/ir_emitter.h b/src/shader_recompiler/ir/ir_emitter.h index 9aab9459b..783709775 100644 --- a/src/shader_recompiler/ir/ir_emitter.h +++ b/src/shader_recompiler/ir/ir_emitter.h @@ -324,8 +324,6 @@ public: const F32& dref, const F32& lod, const Value& offset, TextureInstInfo info); - [[nodiscard]] Value ImageQueryDimension(const Value& handle, const U32& lod, - const U1& skip_mips); [[nodiscard]] Value ImageQueryDimension(const Value& handle, const U32& lod, const U1& skip_mips, TextureInstInfo info); @@ -344,6 +342,9 @@ public: void ImageWrite(const Value& handle, const Value& coords, const U32& lod, const U32& multisampling, const Value& color, TextureInstInfo info); + [[nodiscard]] Value CubeFaceCoord(const Value& cube_coords); + [[nodiscard]] F32 CubeFaceIndex(const Value& cube_coords); + void EmitVertex(); void EmitPrimitive(); diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index 6242a230e..19f45418f 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -374,6 +374,10 @@ OPCODE(ImageAtomicOr32, U32, Opaq OPCODE(ImageAtomicXor32, U32, Opaque, Opaque, U32, ) OPCODE(ImageAtomicExchange32, U32, Opaque, Opaque, U32, ) +// Cube operations - optional, usable if profile.supports_native_cube_calc +OPCODE(CubeFaceCoord, F32x2, F32x3, ) +OPCODE(CubeFaceIndex, F32, F32x3, ) + // Warp operations OPCODE(LaneId, U32, ) OPCODE(WarpId, U32, ) diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index f7040ad75..c00b8e6bb 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -161,10 +161,9 @@ public: u32 Add(const ImageResource& desc) { const u32 index{Add(image_resources, desc, [&desc](const auto& existing) { - return desc.sharp_idx == existing.sharp_idx; + return desc.sharp_idx == existing.sharp_idx && desc.is_array == existing.is_array; })}; auto& image = image_resources[index]; - image.is_read |= desc.is_read; image.is_written |= desc.is_written; return index; } @@ -361,7 +360,6 @@ void PatchImageSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& image = AmdGpu::Image::Null(); } ASSERT(image.GetType() != AmdGpu::ImageType::Invalid); - const bool is_read = inst.GetOpcode() == IR::Opcode::ImageRead; const bool is_written = inst.GetOpcode() == IR::Opcode::ImageWrite; // Patch image instruction if image is FMask. @@ -402,7 +400,6 @@ void PatchImageSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& .is_depth = bool(inst_info.is_depth), .is_atomic = IsImageAtomicInstruction(inst), .is_array = bool(inst_info.is_array), - .is_read = is_read, .is_written = is_written, }); @@ -560,32 +557,6 @@ void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { } } -IR::Value PatchCubeCoord(IR::IREmitter& ir, const IR::Value& s, const IR::Value& t, - const IR::Value& z, bool is_written, bool is_array) { - // When cubemap is written with imageStore it is treated like 2DArray. - if (is_written) { - return ir.CompositeConstruct(s, t, z); - } - - ASSERT(s.Type() == IR::Type::F32); // in case of fetched image need to adjust the code below - - // We need to fix x and y coordinate, - // because the s and t coordinate will be scaled and plus 1.5 by v_madak_f32. - // We already force the scale value to be 1.0 when handling v_cubema_f32, - // here we subtract 1.5 to recover the original value. - const IR::Value x = ir.FPSub(IR::F32{s}, ir.Imm32(1.5f)); - const IR::Value y = ir.FPSub(IR::F32{t}, ir.Imm32(1.5f)); - if (is_array) { - const IR::U32 array_index = ir.ConvertFToU(32, IR::F32{z}); - const IR::U32 face_id = ir.BitwiseAnd(array_index, ir.Imm32(7u)); - const IR::U32 slice_id = ir.ShiftRightLogical(array_index, ir.Imm32(3u)); - return ir.CompositeConstruct(x, y, ir.ConvertIToF(32, 32, false, face_id), - ir.ConvertIToF(32, 32, false, slice_id)); - } else { - return ir.CompositeConstruct(x, y, z); - } -} - void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, const AmdGpu::Image& image) { const auto handle = inst.Arg(0); @@ -649,7 +620,6 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, case AmdGpu::ImageType::Color2DMsaa: return ir.CompositeConstruct(read(0), read(8)); case AmdGpu::ImageType::Color3D: - case AmdGpu::ImageType::Cube: return ir.CompositeConstruct(read(0), read(8), read(16)); default: UNREACHABLE(); @@ -675,7 +645,6 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, return {ir.CompositeConstruct(get_addr_reg(addr_reg - 4), get_addr_reg(addr_reg - 3)), ir.CompositeConstruct(get_addr_reg(addr_reg - 2), get_addr_reg(addr_reg - 1))}; case AmdGpu::ImageType::Color3D: - case AmdGpu::ImageType::Cube: // (du/dx, dv/dx, dw/dx), (du/dy, dv/dy, dw/dy) addr_reg = addr_reg + 6; return {ir.CompositeConstruct(get_addr_reg(addr_reg - 6), get_addr_reg(addr_reg - 5), @@ -691,7 +660,8 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, // Query dimensions of image if needed for normalization. // We can't use the image sharp because it could be bound to a different image later. const auto dimensions = - unnormalized ? ir.ImageQueryDimension(handle, ir.Imm32(0u), ir.Imm1(false)) : IR::Value{}; + unnormalized ? ir.ImageQueryDimension(handle, ir.Imm32(0u), ir.Imm1(false), inst_info) + : IR::Value{}; const auto get_coord = [&](u32 coord_idx, u32 dim_idx) -> IR::Value { const auto coord = get_addr_reg(coord_idx); if (unnormalized) { @@ -724,10 +694,6 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, addr_reg = addr_reg + 3; return ir.CompositeConstruct(get_coord(addr_reg - 3, 0), get_coord(addr_reg - 2, 1), get_coord(addr_reg - 1, 2)); - case AmdGpu::ImageType::Cube: // x, y, face - addr_reg = addr_reg + 3; - return PatchCubeCoord(ir, get_coord(addr_reg - 3, 0), get_coord(addr_reg - 2, 1), - get_addr_reg(addr_reg - 1), false, inst_info.is_array); default: UNREACHABLE(); } @@ -805,10 +771,6 @@ void PatchImageArgs(IR::Block& block, IR::Inst& inst, Info& info) { [[fallthrough]]; case AmdGpu::ImageType::Color3D: // x, y, z, [lod] return {ir.CompositeConstruct(body->Arg(0), body->Arg(1), body->Arg(2)), body->Arg(3)}; - case AmdGpu::ImageType::Cube: // x, y, face, [lod] - return {PatchCubeCoord(ir, body->Arg(0), body->Arg(1), body->Arg(2), - inst.GetOpcode() == IR::Opcode::ImageWrite, inst_info.is_array), - body->Arg(3)}; default: UNREACHABLE_MSG("Unknown image type {}", image.GetType()); } @@ -820,7 +782,7 @@ void PatchImageArgs(IR::Block& block, IR::Inst& inst, Info& info) { const auto lod = inst_info.has_lod ? IR::U32{arg} : IR::U32{}; const auto ms = has_ms ? IR::U32{arg} : IR::U32{}; - const auto is_storage = image_res.IsStorage(image); + const auto is_storage = image_res.is_written; if (inst.GetOpcode() == IR::Opcode::ImageRead) { auto texel = ir.ImageRead(handle, coords, lod, ms, inst_info); if (is_storage) { diff --git a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp index c34b59b88..7fd5b75ff 100644 --- a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp +++ b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp @@ -5,7 +5,7 @@ namespace Shader::Optimization { -void Visit(Info& info, IR::Inst& inst) { +void Visit(Info& info, const IR::Inst& inst) { switch (inst.GetOpcode()) { case IR::Opcode::GetAttribute: case IR::Opcode::GetAttributeU32: diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index fc8c5956e..f8878d442 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -24,6 +24,7 @@ struct Profile { bool support_explicit_workgroup_layout{}; bool support_legacy_vertex_attributes{}; bool supports_image_load_store_lod{}; + bool supports_native_cube_calc{}; bool has_broken_spirv_clamp{}; bool lower_left_origin_mode{}; bool needs_manual_interpolation{}; diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index f58d2e2d3..c03621c50 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -113,9 +113,9 @@ struct StageSpecialization { }); ForEachSharp(binding, images, info->images, [](auto& spec, const auto& desc, AmdGpu::Image sharp) { - spec.type = sharp.GetBoundType(); + spec.type = sharp.GetBoundType(desc.is_array); spec.is_integer = AmdGpu::IsInteger(sharp.GetNumberFmt()); - spec.is_storage = desc.IsStorage(sharp); + spec.is_storage = desc.is_written; if (spec.is_storage) { spec.dst_select = sharp.DstSelect(); } diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index ffee7964a..3dc1eadde 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -226,15 +226,13 @@ struct Image { return pitch + 1; } - u32 NumLayers(bool is_array) const { - u32 slices = GetType() == ImageType::Color3D ? 1 : depth + 1; - if (GetType() == ImageType::Cube) { - if (is_array) { - slices = last_array + 1; - ASSERT(slices % 6 == 0); - } else { - slices = 6; - } + [[nodiscard]] u32 NumLayers() const noexcept { + u32 slices = depth + 1; + const auto img_type = static_cast(type); + if (img_type == ImageType::Color3D) { + slices = 1; + } else if (img_type == ImageType::Cube) { + slices *= 6; } if (pow2pad) { slices = std::bit_ceil(slices); @@ -257,7 +255,8 @@ struct Image { } ImageType GetType() const noexcept { - return static_cast(type); + const auto img_type = static_cast(type); + return img_type == ImageType::Cube ? ImageType::Color2DArray : img_type; } DataFormat GetDataFmt() const noexcept { @@ -289,13 +288,40 @@ struct Image { GetDataFmt() <= DataFormat::FormatFmask64_8; } - bool IsPartialCubemap() const { - const auto viewed_slice = last_array - base_array + 1; - return GetType() == ImageType::Cube && viewed_slice < 6; + [[nodiscard]] ImageType GetBoundType(const bool is_array) const noexcept { + const auto base_type = GetType(); + if (base_type == ImageType::Color1DArray && !is_array) { + return ImageType::Color1D; + } + if (base_type == ImageType::Color2DArray && !is_array) { + return ImageType::Color2D; + } + if (base_type == ImageType::Color2DMsaaArray && !is_array) { + return ImageType::Color2DMsaa; + } + return base_type; } - ImageType GetBoundType() const noexcept { - return IsPartialCubemap() ? ImageType::Color2DArray : GetType(); + [[nodiscard]] u32 NumViewLevels(const bool is_array) const noexcept { + switch (GetBoundType(is_array)) { + case ImageType::Color2DMsaa: + case ImageType::Color2DMsaaArray: + return 1; + default: + return last_level - base_level + 1; + } + } + + [[nodiscard]] u32 NumViewLayers(const bool is_array) const noexcept { + switch (GetBoundType(is_array)) { + case ImageType::Color1D: + case ImageType::Color2D: + case ImageType::Color2DMsaa: + case ImageType::Color3D: + return 1; + default: + return last_array - base_array + 1; + } } }; static_assert(sizeof(Image) == 32); // 256bits diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index b24767e8a..23faacfc2 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -59,9 +59,8 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler for (const auto& image : info->images) { bindings.push_back({ .binding = binding++, - .descriptorType = image.IsStorage(image.GetSharp(*info)) - ? vk::DescriptorType::eStorageImage - : vk::DescriptorType::eSampledImage, + .descriptorType = image.is_written ? vk::DescriptorType::eStorageImage + : vk::DescriptorType::eSampledImage, .descriptorCount = 1, .stageFlags = vk::ShaderStageFlagBits::eCompute, }); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 0ca1bed8b..0154172d9 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -367,9 +367,8 @@ void GraphicsPipeline::BuildDescSetLayout() { for (const auto& image : stage->images) { bindings.push_back({ .binding = binding++, - .descriptorType = image.IsStorage(image.GetSharp(*stage)) - ? vk::DescriptorType::eStorageImage - : vk::DescriptorType::eSampledImage, + .descriptorType = image.is_written ? vk::DescriptorType::eStorageImage + : vk::DescriptorType::eSampledImage, .descriptorCount = 1, .stageFlags = gp_stage_flags, }); diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 9bc627830..6c3e066c6 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -271,6 +271,7 @@ bool Instance::CreateDevice() { maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME); legacy_vertex_attributes = add_extension(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME); image_load_store_lod = add_extension(VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME); + amd_gcn_shader = add_extension(VK_AMD_GCN_SHADER_EXTENSION_NAME); // These extensions are promoted by Vulkan 1.3, but for greater compatibility we use Vulkan 1.2 // with extensions. diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 4e091824d..8928b4267 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -159,6 +159,11 @@ public: return image_load_store_lod; } + /// Returns true when VK_AMD_gcn_shader is supported. + bool IsAmdGcnShaderSupported() const { + return amd_gcn_shader; + } + /// Returns true when geometry shaders are supported by the device bool IsGeometryStageSupported() const { return features.geometryShader; @@ -334,6 +339,7 @@ private: bool list_restart{}; bool legacy_vertex_attributes{}; bool image_load_store_lod{}; + bool amd_gcn_shader{}; u64 min_imported_host_pointer_alignment{}; u32 subgroup_size{}; bool tooling_info{}; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 9cfc7c277..37137bd07 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -204,6 +204,7 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, .support_explicit_workgroup_layout = true, .support_legacy_vertex_attributes = instance_.IsLegacyVertexAttributesSupported(), .supports_image_load_store_lod = instance_.IsImageLoadStoreLodSupported(), + .supports_native_cube_calc = instance_.IsAmdGcnShaderSupported(), .needs_manual_interpolation = instance.IsFragmentShaderBarycentricSupported() && instance.GetDriverID() == vk::DriverId::eNvidiaProprietary, .needs_lds_barriers = instance.GetDriverID() == vk::DriverId::eNvidiaProprietary || diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index e8616550b..ceb1d094d 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -661,7 +661,7 @@ void Rasterizer::BindTextures(const Shader::Info& stage, Shader::Backend::Bindin if (image->binding.is_bound) { // The image is already bound. In case if it is about to be used as storage we need // to force general layout on it. - image->binding.force_general |= image_desc.IsStorage(tsharp); + image->binding.force_general |= image_desc.is_written; } if (image->binding.is_target) { // The image is already bound as target. Since we read and output to it need to force diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp index 23249bf21..96881c564 100644 --- a/src/video_core/texture_cache/image.cpp +++ b/src/video_core/texture_cache/image.cpp @@ -153,13 +153,7 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, // the texture cache should re-create the resource with the usage requested vk::ImageCreateFlags flags{vk::ImageCreateFlagBits::eMutableFormat | vk::ImageCreateFlagBits::eExtendedUsage}; - const bool can_be_cube = - (info.type == vk::ImageType::e2D) && - ((info.props.is_pow2 ? (info.resources.layers % 8) : (info.resources.layers % 6)) == 0) && - (info.size.width == info.size.height); - if (info.props.is_cube || can_be_cube) { - flags |= vk::ImageCreateFlagBits::eCubeCompatible; - } else if (info.props.is_volume) { + if (info.props.is_volume) { flags |= vk::ImageCreateFlagBits::e2DArrayCompatible; } diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index bdbaecda6..58c2a8e23 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -37,7 +37,6 @@ static vk::ImageType ConvertImageType(AmdGpu::ImageType type) noexcept { return vk::ImageType::e1D; case AmdGpu::ImageType::Color2D: case AmdGpu::ImageType::Color2DMsaa: - case AmdGpu::ImageType::Cube: case AmdGpu::ImageType::Color2DArray: return vk::ImageType::e2D; case AmdGpu::ImageType::Color3D: @@ -130,7 +129,6 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& de } type = ConvertImageType(image.GetType()); props.is_tiled = image.IsTiled(); - props.is_cube = image.GetType() == AmdGpu::ImageType::Cube; props.is_volume = image.GetType() == AmdGpu::ImageType::Color3D; props.is_pow2 = image.pow2pad; props.is_block = IsBlockCoded(); @@ -139,7 +137,7 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& de size.depth = props.is_volume ? image.depth + 1 : 1; pitch = image.Pitch(); resources.levels = image.NumLevels(); - resources.layers = image.NumLayers(desc.is_array); + resources.layers = image.NumLayers(); num_samples = image.NumSamples(); num_bits = NumBits(image.GetDataFmt()); diff --git a/src/video_core/texture_cache/image_info.h b/src/video_core/texture_cache/image_info.h index 6faca49c5..123540c1e 100644 --- a/src/video_core/texture_cache/image_info.h +++ b/src/video_core/texture_cache/image_info.h @@ -61,7 +61,6 @@ struct ImageInfo { } meta_info{}; struct { - u32 is_cube : 1; u32 is_volume : 1; u32 is_tiled : 1; u32 is_pow2 : 1; diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index 68b116558..569238168 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -20,8 +20,6 @@ vk::ImageViewType ConvertImageViewType(AmdGpu::ImageType type) { case AmdGpu::ImageType::Color2D: case AmdGpu::ImageType::Color2DMsaa: return vk::ImageViewType::e2D; - case AmdGpu::ImageType::Cube: - return vk::ImageViewType::eCube; case AmdGpu::ImageType::Color2DArray: return vk::ImageViewType::e2DArray; case AmdGpu::ImageType::Color3D: @@ -32,7 +30,7 @@ vk::ImageViewType ConvertImageViewType(AmdGpu::ImageType type) { } ImageViewInfo::ImageViewInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept - : is_storage{desc.IsStorage(image)} { + : is_storage{desc.is_written} { const auto dfmt = image.GetDataFmt(); auto nfmt = image.GetNumberFmt(); if (is_storage && nfmt == AmdGpu::NumberFormat::Srgb) { @@ -42,30 +40,12 @@ ImageViewInfo::ImageViewInfo(const AmdGpu::Image& image, const Shader::ImageReso if (desc.is_depth) { format = Vulkan::LiverpoolToVK::PromoteFormatToDepth(format); } + range.base.level = image.base_level; range.base.layer = image.base_array; - if (image.GetType() == AmdGpu::ImageType::Color2DMsaa || - image.GetType() == AmdGpu::ImageType::Color2DMsaaArray) { - range.extent.levels = 1; - } else { - range.extent.levels = image.last_level - image.base_level + 1; - } - range.extent.layers = image.last_array - image.base_array + 1; - type = ConvertImageViewType(image.GetBoundType()); - - // Adjust view type for arrays - if (type == vk::ImageViewType::eCube) { - if (desc.is_array) { - type = vk::ImageViewType::eCubeArray; - } else { - // Some games try to bind an array of cubemaps while shader reads only single one. - range.extent.layers = std::min(range.extent.layers, 6u); - } - } - if (type == vk::ImageViewType::e3D && range.extent.layers > 1) { - // Some games pass incorrect layer count for 3D textures so we need to fixup it. - range.extent.layers = 1; - } + range.extent.levels = image.NumViewLevels(desc.is_array); + range.extent.layers = image.NumViewLayers(desc.is_array); + type = ConvertImageViewType(image.GetBoundType(desc.is_array)); if (!is_storage) { mapping = Vulkan::LiverpoolToVK::ComponentMapping(image.DstSelect()); diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 944f021df..69907f000 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -65,7 +65,7 @@ public: struct TextureDesc : public BaseDesc { TextureDesc() = default; TextureDesc(const AmdGpu::Image& image, const Shader::ImageResource& desc) - : BaseDesc{desc.IsStorage(image) ? BindingType::Storage : BindingType::Texture, + : BaseDesc{desc.is_written ? BindingType::Storage : BindingType::Texture, ImageInfo{image, desc}, ImageViewInfo{image, desc}} {} }; From 4563b6379d9927b9f5469250ef0db58440a72c69 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 10 Jan 2025 00:49:08 -0800 Subject: [PATCH 044/455] amdgpu: Handle 8-bit float format case for stencil. (#2092) --- src/video_core/amdgpu/liverpool.h | 3 ++- src/video_core/amdgpu/resource.h | 4 ++-- src/video_core/amdgpu/types.h | 10 +++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 837b73d89..070253ca9 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -899,7 +899,8 @@ struct Liverpool { // There is a small difference between T# and CB number types, account for it. return RemapNumberFormat(info.number_type == NumberFormat::SnormNz ? NumberFormat::Srgb - : info.number_type.Value()); + : info.number_type.Value(), + info.format); } [[nodiscard]] NumberConversion GetNumberConversion() const { diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 3dc1eadde..467cecf10 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -54,7 +54,7 @@ struct Buffer { } NumberFormat GetNumberFmt() const noexcept { - return RemapNumberFormat(NumberFormat(num_format)); + return RemapNumberFormat(NumberFormat(num_format), DataFormat(data_format)); } DataFormat GetDataFmt() const noexcept { @@ -264,7 +264,7 @@ struct Image { } NumberFormat GetNumberFmt() const noexcept { - return RemapNumberFormat(NumberFormat(num_format)); + return RemapNumberFormat(NumberFormat(num_format), DataFormat(data_format)); } NumberConversion GetNumberConversion() const noexcept { diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index a19e53256..57f97418a 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -252,7 +252,7 @@ inline DataFormat RemapDataFormat(const DataFormat format) { } } -inline NumberFormat RemapNumberFormat(const NumberFormat format) { +inline NumberFormat RemapNumberFormat(const NumberFormat format, const DataFormat data_format) { switch (format) { case NumberFormat::Uscaled: return NumberFormat::Uint; @@ -260,6 +260,14 @@ inline NumberFormat RemapNumberFormat(const NumberFormat format) { return NumberFormat::Sint; case NumberFormat::Ubnorm: return NumberFormat::Unorm; + case NumberFormat::Float: + if (data_format == DataFormat::Format8) { + // Games may ask for 8-bit float when they want to access the stencil component + // of a depth-stencil image. Change to unsigned int to match the stencil format. + // This is also the closest approximation to pass the bits through unconverted. + return NumberFormat::Uint; + } + [[fallthrough]]; default: return format; } From 562ed2a025d76d2578fc43763bbcf6646730ca0d Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 10 Jan 2025 00:52:12 -0800 Subject: [PATCH 045/455] renderer_vulkan: Simplify vertex binding logic and properly handle null buffers. (#2104) * renderer_vulkan: Simplify vertex binding logic and properly handle null buffers. * renderer_vulkan: Remove need for empty bindVertexBuffers2EXT. --- src/video_core/buffer_cache/buffer_cache.cpp | 158 +++++++----------- src/video_core/buffer_cache/buffer_cache.h | 9 +- .../renderer_vulkan/vk_graphics_pipeline.cpp | 81 +++++---- .../renderer_vulkan/vk_graphics_pipeline.h | 9 + .../renderer_vulkan/vk_pipeline_cache.cpp | 8 +- .../renderer_vulkan/vk_rasterizer.cpp | 10 +- 6 files changed, 137 insertions(+), 138 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 3a210957e..487544a21 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -10,13 +10,13 @@ #include "video_core/amdgpu/liverpool.h" #include "video_core/buffer_cache/buffer_cache.h" #include "video_core/renderer_vulkan/liverpool_to_vk.h" +#include "video_core/renderer_vulkan/vk_graphics_pipeline.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/texture_cache/texture_cache.h" namespace VideoCore { -static constexpr size_t NumVertexBuffers = 32; static constexpr size_t GdsBufferSize = 64_KB; static constexpr size_t StagingBufferSize = 1_GB; static constexpr size_t UboStreamBufferSize = 64_MB; @@ -89,35 +89,22 @@ void BufferCache::DownloadBufferMemory(Buffer& buffer, VAddr device_addr, u64 si } } -bool BufferCache::BindVertexBuffers( - const Shader::Info& vs_info, const std::optional& fetch_shader) { - boost::container::small_vector attributes; - boost::container::small_vector bindings; - SCOPE_EXIT { - if (instance.IsVertexInputDynamicState()) { - const auto cmdbuf = scheduler.CommandBuffer(); - cmdbuf.setVertexInputEXT(bindings, attributes); - } else if (bindings.empty()) { - // Required to call bindVertexBuffers2EXT at least once in the current command buffer - // with non-null strides without a non-dynamic stride pipeline in between. Thus even - // when nothing is bound we still need to make a dummy call. Non-null strides in turn - // requires a count greater than 0. - const auto cmdbuf = scheduler.CommandBuffer(); - const std::array null_buffers = {GetBuffer(NULL_BUFFER_ID).buffer.buffer}; - constexpr std::array null_offsets = {static_cast(0)}; - cmdbuf.bindVertexBuffers2EXT(0, null_buffers, null_offsets, null_offsets, null_offsets); - } - }; +void BufferCache::BindVertexBuffers(const Vulkan::GraphicsPipeline& pipeline) { + Vulkan::VertexInputs attributes; + Vulkan::VertexInputs bindings; + Vulkan::VertexInputs guest_buffers; + pipeline.GetVertexInputs(attributes, bindings, guest_buffers); - if (!fetch_shader || fetch_shader->attributes.empty()) { - return false; + if (instance.IsVertexInputDynamicState()) { + // Update current vertex inputs. + const auto cmdbuf = scheduler.CommandBuffer(); + cmdbuf.setVertexInputEXT(bindings, attributes); } - std::array host_buffers; - std::array host_offsets; - std::array host_sizes; - std::array host_strides; - boost::container::static_vector guest_buffers; + if (bindings.empty()) { + // If there are no bindings, there is nothing further to do. + return; + } struct BufferRange { VAddr base_address; @@ -125,61 +112,37 @@ bool BufferCache::BindVertexBuffers( vk::Buffer vk_buffer; u64 offset; - size_t GetSize() const { + [[nodiscard]] size_t GetSize() const { return end_address - base_address; } }; - // Calculate buffers memory overlaps - bool has_step_rate = false; - boost::container::static_vector ranges{}; - for (const auto& attrib : fetch_shader->attributes) { - if (attrib.UsesStepRates()) { - has_step_rate = true; - continue; + // Build list of ranges covering the requested buffers + Vulkan::VertexInputs ranges{}; + for (const auto& buffer : guest_buffers) { + if (buffer.GetSize() > 0) { + ranges.emplace_back(buffer.base_address, buffer.base_address + buffer.GetSize()); } + } - const auto& buffer = attrib.GetSharp(vs_info); - if (buffer.GetSize() == 0) { - continue; - } - guest_buffers.emplace_back(buffer); - ranges.emplace_back(buffer.base_address, buffer.base_address + buffer.GetSize()); - attributes.push_back({ - .location = attrib.semantic, - .binding = attrib.semantic, - .format = - Vulkan::LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()), - .offset = 0, + // Merge connecting ranges together + Vulkan::VertexInputs ranges_merged{}; + if (!ranges.empty()) { + std::ranges::sort(ranges, [](const BufferRange& lhv, const BufferRange& rhv) { + return lhv.base_address < rhv.base_address; }); - bindings.push_back({ - .binding = attrib.semantic, - .stride = buffer.GetStride(), - .inputRate = attrib.GetStepRate() == Shader::Gcn::VertexAttribute::InstanceIdType::None - ? vk::VertexInputRate::eVertex - : vk::VertexInputRate::eInstance, - .divisor = 1, - }); - } - if (ranges.empty()) { - return false; - } - - std::ranges::sort(ranges, [](const BufferRange& lhv, const BufferRange& rhv) { - return lhv.base_address < rhv.base_address; - }); - - boost::container::static_vector ranges_merged{ranges[0]}; - for (auto range : ranges) { - auto& prev_range = ranges_merged.back(); - if (prev_range.end_address < range.base_address) { - ranges_merged.emplace_back(range); - } else { - prev_range.end_address = std::max(prev_range.end_address, range.end_address); + ranges_merged.emplace_back(ranges[0]); + for (auto range : ranges) { + auto& prev_range = ranges_merged.back(); + if (prev_range.end_address < range.base_address) { + ranges_merged.emplace_back(range); + } else { + prev_range.end_address = std::max(prev_range.end_address, range.end_address); + } } } - // Map buffers + // Map buffers for merged ranges for (auto& range : ranges_merged) { const auto [buffer, offset] = ObtainBuffer(range.base_address, range.GetSize(), false); range.vk_buffer = buffer->buffer; @@ -187,32 +150,39 @@ bool BufferCache::BindVertexBuffers( } // Bind vertex buffers - const size_t num_buffers = guest_buffers.size(); - for (u32 i = 0; i < num_buffers; ++i) { - const auto& buffer = guest_buffers[i]; - const auto host_buffer = std::ranges::find_if(ranges_merged, [&](const BufferRange& range) { - return (buffer.base_address >= range.base_address && - buffer.base_address < range.end_address); - }); - ASSERT(host_buffer != ranges_merged.cend()); - - host_buffers[i] = host_buffer->vk_buffer; - host_offsets[i] = host_buffer->offset + buffer.base_address - host_buffer->base_address; - host_sizes[i] = buffer.GetSize(); - host_strides[i] = buffer.GetStride(); - } - - if (num_buffers > 0) { - const auto cmdbuf = scheduler.CommandBuffer(); - if (instance.IsVertexInputDynamicState()) { - cmdbuf.bindVertexBuffers(0, num_buffers, host_buffers.data(), host_offsets.data()); + Vulkan::VertexInputs host_buffers; + Vulkan::VertexInputs host_offsets; + Vulkan::VertexInputs host_sizes; + Vulkan::VertexInputs host_strides; + const auto null_buffer = + instance.IsNullDescriptorSupported() ? VK_NULL_HANDLE : GetBuffer(NULL_BUFFER_ID).Handle(); + for (const auto& buffer : guest_buffers) { + if (buffer.GetSize() > 0) { + const auto host_buffer_info = + std::ranges::find_if(ranges_merged, [&](const BufferRange& range) { + return buffer.base_address >= range.base_address && + buffer.base_address < range.end_address; + }); + ASSERT(host_buffer_info != ranges_merged.cend()); + host_buffers.emplace_back(host_buffer_info->vk_buffer); + host_offsets.push_back(host_buffer_info->offset + buffer.base_address - + host_buffer_info->base_address); } else { - cmdbuf.bindVertexBuffers2EXT(0, num_buffers, host_buffers.data(), host_offsets.data(), - host_sizes.data(), host_strides.data()); + host_buffers.emplace_back(null_buffer); + host_offsets.push_back(0); } + host_sizes.push_back(buffer.GetSize()); + host_strides.push_back(buffer.GetStride()); } - return has_step_rate; + const auto cmdbuf = scheduler.CommandBuffer(); + const auto num_buffers = guest_buffers.size(); + if (instance.IsVertexInputDynamicState()) { + cmdbuf.bindVertexBuffers(0, num_buffers, host_buffers.data(), host_offsets.data()); + } else { + cmdbuf.bindVertexBuffers2EXT(0, num_buffers, host_buffers.data(), host_offsets.data(), + host_sizes.data(), host_strides.data()); + } } void BufferCache::BindIndexBuffer(u32 index_offset) { diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index f29a37b63..575ee2c60 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -5,8 +5,6 @@ #include #include -#include -#include #include "common/div_ceil.h" #include "common/slot_vector.h" #include "common/types.h" @@ -26,6 +24,10 @@ struct FetchShaderData; struct Info; } // namespace Shader +namespace Vulkan { +class GraphicsPipeline; +} + namespace VideoCore { using BufferId = Common::SlotId; @@ -75,8 +77,7 @@ public: void InvalidateMemory(VAddr device_addr, u64 size); /// Binds host vertex buffers for the current draw. - bool BindVertexBuffers(const Shader::Info& vs_info, - const std::optional& fetch_shader); + void BindVertexBuffers(const Vulkan::GraphicsPipeline& pipeline); /// Bind host index buffer for the current draw. void BindIndexBuffer(u32 index_offset); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 0154172d9..2d0b19bbe 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -57,35 +57,11 @@ GraphicsPipeline::GraphicsPipeline( pipeline_layout = std::move(layout); SetObjectName(device, *pipeline_layout, "Graphics PipelineLayout {}", debug_str); - boost::container::static_vector vertex_bindings; - boost::container::static_vector vertex_attributes; - if (fetch_shader && !instance.IsVertexInputDynamicState()) { - const auto& vs_info = GetStage(Shader::LogicalStage::Vertex); - for (const auto& attrib : fetch_shader->attributes) { - if (attrib.UsesStepRates()) { - // Skip attribute binding as the data will be pulled by shader - continue; - } - - const auto buffer = attrib.GetSharp(vs_info); - if (buffer.GetSize() == 0) { - continue; - } - vertex_attributes.push_back({ - .location = attrib.semantic, - .binding = attrib.semantic, - .format = LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()), - .offset = 0, - }); - vertex_bindings.push_back({ - .binding = attrib.semantic, - .stride = buffer.GetStride(), - .inputRate = - attrib.GetStepRate() == Shader::Gcn::VertexAttribute::InstanceIdType::None - ? vk::VertexInputRate::eVertex - : vk::VertexInputRate::eInstance, - }); - } + VertexInputs vertex_attributes; + VertexInputs vertex_bindings; + VertexInputs guest_buffers; + if (!instance.IsVertexInputDynamicState()) { + GetVertexInputs(vertex_attributes, vertex_bindings, guest_buffers); } const vk::PipelineVertexInputStateCreateInfo vertex_input_info = { @@ -161,7 +137,7 @@ GraphicsPipeline::GraphicsPipeline( } if (instance.IsVertexInputDynamicState()) { dynamic_states.push_back(vk::DynamicState::eVertexInputEXT); - } else { + } else if (!vertex_bindings.empty()) { dynamic_states.push_back(vk::DynamicState::eVertexInputBindingStrideEXT); } @@ -329,6 +305,51 @@ GraphicsPipeline::GraphicsPipeline( GraphicsPipeline::~GraphicsPipeline() = default; +template +void GraphicsPipeline::GetVertexInputs(VertexInputs& attributes, + VertexInputs& bindings, + VertexInputs& guest_buffers) const { + if (!fetch_shader || fetch_shader->attributes.empty()) { + return; + } + const auto& vs_info = GetStage(Shader::LogicalStage::Vertex); + for (const auto& attrib : fetch_shader->attributes) { + if (attrib.UsesStepRates()) { + // Skip attribute binding as the data will be pulled by shader. + continue; + } + + const auto& buffer = attrib.GetSharp(vs_info); + attributes.push_back(Attribute{ + .location = attrib.semantic, + .binding = attrib.semantic, + .format = LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()), + .offset = 0, + }); + bindings.push_back(Binding{ + .binding = attrib.semantic, + .stride = buffer.GetStride(), + .inputRate = attrib.GetStepRate() == Shader::Gcn::VertexAttribute::InstanceIdType::None + ? vk::VertexInputRate::eVertex + : vk::VertexInputRate::eInstance, + }); + if constexpr (std::is_same_v) { + bindings.back().divisor = 1; + } + guest_buffers.emplace_back(buffer); + } +} + +// Declare templated GetVertexInputs for necessary types. +template void GraphicsPipeline::GetVertexInputs( + VertexInputs& attributes, + VertexInputs& bindings, + VertexInputs& guest_buffers) const; +template void GraphicsPipeline::GetVertexInputs( + VertexInputs& attributes, + VertexInputs& bindings, + VertexInputs& guest_buffers) const; + void GraphicsPipeline::BuildDescSetLayout() { boost::container::small_vector bindings; u32 binding{}; diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index fa10831a0..f696c1f72 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include "common/types.h" @@ -27,6 +28,9 @@ class DescriptorHeap; using Liverpool = AmdGpu::Liverpool; +template +using VertexInputs = boost::container::static_vector; + struct GraphicsPipelineKey { std::array stage_hashes; u32 num_color_attachments; @@ -100,6 +104,11 @@ public: key.prim_type == AmdGpu::PrimitiveType::QuadList; } + /// Gets the attributes and bindings for vertex inputs. + template + void GetVertexInputs(VertexInputs& attributes, VertexInputs& bindings, + VertexInputs& guest_buffers) const; + private: void BuildDescSetLayout(); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 37137bd07..f93494389 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -420,17 +420,17 @@ bool PipelineCache::RefreshGraphicsKey() { } } - const auto vs_info = infos[static_cast(Shader::LogicalStage::Vertex)]; + const auto* vs_info = infos[static_cast(Shader::LogicalStage::Vertex)]; if (vs_info && fetch_shader && !instance.IsVertexInputDynamicState()) { + // Without vertex input dynamic state, the pipeline needs to specialize on format. + // Stride will still be handled outside the pipeline using dynamic state. u32 vertex_binding = 0; for (const auto& attrib : fetch_shader->attributes) { if (attrib.UsesStepRates()) { + // Skip attribute binding as the data will be pulled by shader. continue; } const auto& buffer = attrib.GetSharp(*vs_info); - if (buffer.GetSize() == 0) { - continue; - } ASSERT(vertex_binding < MaxVertexBufferCount); key.vertex_buffer_formats[vertex_binding++] = Vulkan::LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index ceb1d094d..920e09131 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -248,9 +248,7 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) { return; } - const auto& vs_info = pipeline->GetStage(Shader::LogicalStage::Vertex); - const auto& fetch_shader = pipeline->GetFetchShader(); - buffer_cache.BindVertexBuffers(vs_info, fetch_shader); + buffer_cache.BindVertexBuffers(*pipeline); if (is_indexed) { buffer_cache.BindIndexBuffer(index_offset); } @@ -258,6 +256,8 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) { BeginRendering(*pipeline, state); UpdateDynamicState(*pipeline); + const auto& vs_info = pipeline->GetStage(Shader::LogicalStage::Vertex); + const auto& fetch_shader = pipeline->GetFetchShader(); const auto [vertex_offset, instance_offset] = GetDrawOffsets(regs, vs_info, fetch_shader); const auto cmdbuf = scheduler.CommandBuffer(); @@ -292,9 +292,7 @@ void Rasterizer::DrawIndirect(bool is_indexed, VAddr arg_address, u32 offset, u3 return; } - const auto& vs_info = pipeline->GetStage(Shader::LogicalStage::Vertex); - const auto& fetch_shader = pipeline->GetFetchShader(); - buffer_cache.BindVertexBuffers(vs_info, fetch_shader); + buffer_cache.BindVertexBuffers(*pipeline); if (is_indexed) { buffer_cache.BindIndexBuffer(0); } From e656093d8538f584967d3070020759b6e24d4151 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 10 Jan 2025 12:35:03 -0800 Subject: [PATCH 046/455] shader_recompiler: Fix some image view type issues. (#2118) --- .../backend/spirv/emit_spirv_image.cpp | 5 ++--- .../backend/spirv/spirv_emit_context.cpp | 4 ++-- .../backend/spirv/spirv_emit_context.h | 2 +- .../ir/passes/resource_tracking_pass.cpp | 20 ++++++++++--------- src/shader_recompiler/specialization.h | 2 +- src/video_core/amdgpu/resource.h | 17 +++++++++++----- src/video_core/texture_cache/image_view.cpp | 2 +- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index 182437b63..b5ae507a0 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -174,13 +174,12 @@ Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod const auto sharp = ctx.info.images[handle & 0xFFFF].GetSharp(ctx.info); const Id zero = ctx.u32_zero_value; const auto mips{[&] { return has_mips ? ctx.OpImageQueryLevels(ctx.U32[1], image) : zero; }}; - const bool uses_lod{texture.bound_type != AmdGpu::ImageType::Color2DMsaa && - !texture.is_storage}; + const bool uses_lod{texture.view_type != AmdGpu::ImageType::Color2DMsaa && !texture.is_storage}; const auto query{[&](Id type) { return uses_lod ? ctx.OpImageQuerySizeLod(type, image, lod) : ctx.OpImageQuerySize(type, image); }}; - switch (texture.bound_type) { + switch (texture.view_type) { case AmdGpu::ImageType::Color1D: return ctx.OpCompositeConstruct(ctx.U32[4], query(ctx.U32[1]), zero, zero, mips()); case AmdGpu::ImageType::Color1DArray: diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 6151c5c65..7e86dfb4b 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -773,7 +773,7 @@ spv::ImageFormat GetFormat(const AmdGpu::Image& image) { Id ImageType(EmitContext& ctx, const ImageResource& desc, Id sampled_type) { const auto image = desc.GetSharp(ctx.info); const auto format = desc.is_atomic ? GetFormat(image) : spv::ImageFormat::Unknown; - const auto type = image.GetBoundType(desc.is_array); + const auto type = image.GetViewType(desc.is_array); const u32 sampled = desc.is_written ? 2 : 1; switch (type) { case AmdGpu::ImageType::Color1D: @@ -814,7 +814,7 @@ void EmitContext::DefineImagesAndSamplers() { .sampled_type = is_storage ? sampled_type : TypeSampledImage(image_type), .pointer_type = pointer_type, .image_type = image_type, - .bound_type = sharp.GetBoundType(image_desc.is_array), + .view_type = sharp.GetViewType(image_desc.is_array), .is_integer = is_integer, .is_storage = is_storage, }); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 80d0d4d9f..f552055c0 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -222,7 +222,7 @@ public: Id sampled_type; Id pointer_type; Id image_type; - AmdGpu::ImageType bound_type; + AmdGpu::ImageType view_type; bool is_integer = false; bool is_storage = false; }; diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index c00b8e6bb..10d685ed1 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -558,13 +558,14 @@ void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { } void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, - const AmdGpu::Image& image) { + const ImageResource& image_res, const AmdGpu::Image& image) { const auto handle = inst.Arg(0); const auto sampler_res = info.samplers[(handle.U32() >> 16) & 0xFFFF]; auto sampler = sampler_res.GetSharp(info); IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; const auto inst_info = inst.Flags(); + const auto view_type = image.GetViewType(image_res.is_array); IR::Inst* body1 = inst.Arg(1).InstRecursive(); IR::Inst* body2 = inst.Arg(2).InstRecursive(); @@ -611,7 +612,7 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, return ir.BitFieldExtract(IR::U32{arg}, ir.Imm32(off), ir.Imm32(6), true); }; - switch (image.GetType()) { + switch (view_type) { case AmdGpu::ImageType::Color1D: case AmdGpu::ImageType::Color1DArray: return read(0); @@ -631,7 +632,7 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, if (!inst_info.has_derivatives) { return {}; } - switch (image.GetType()) { + switch (view_type) { case AmdGpu::ImageType::Color1D: case AmdGpu::ImageType::Color1DArray: // du/dx, du/dy @@ -675,7 +676,7 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, // Now we can load body components as noted in Table 8.9 Image Opcodes with Sampler const IR::Value coords = [&] -> IR::Value { - switch (image.GetType()) { + switch (view_type) { case AmdGpu::ImageType::Color1D: // x addr_reg = addr_reg + 1; return get_coord(addr_reg - 1, 0); @@ -745,17 +746,18 @@ void PatchImageArgs(IR::Block& block, IR::Inst& inst, Info& info) { // Sample instructions must be handled separately using address register data. if (inst.GetOpcode() == IR::Opcode::ImageSampleRaw) { - PatchImageSampleArgs(block, inst, info, image); + PatchImageSampleArgs(block, inst, info, image_res, image); return; } IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; const auto inst_info = inst.Flags(); + const auto view_type = image.GetViewType(image_res.is_array); // Now that we know the image type, adjust texture coordinate vector. IR::Inst* body = inst.Arg(1).InstRecursive(); const auto [coords, arg] = [&] -> std::pair { - switch (image.GetType()) { + switch (view_type) { case AmdGpu::ImageType::Color1D: // x, [lod] return {body->Arg(0), body->Arg(1)}; case AmdGpu::ImageType::Color1DArray: // x, slice, [lod] @@ -772,12 +774,12 @@ void PatchImageArgs(IR::Block& block, IR::Inst& inst, Info& info) { case AmdGpu::ImageType::Color3D: // x, y, z, [lod] return {ir.CompositeConstruct(body->Arg(0), body->Arg(1), body->Arg(2)), body->Arg(3)}; default: - UNREACHABLE_MSG("Unknown image type {}", image.GetType()); + UNREACHABLE_MSG("Unknown image type {}", view_type); } }(); - const auto has_ms = image.GetType() == AmdGpu::ImageType::Color2DMsaa || - image.GetType() == AmdGpu::ImageType::Color2DMsaaArray; + const auto has_ms = view_type == AmdGpu::ImageType::Color2DMsaa || + view_type == AmdGpu::ImageType::Color2DMsaaArray; ASSERT(!inst_info.has_lod || !has_ms); const auto lod = inst_info.has_lod ? IR::U32{arg} : IR::U32{}; const auto ms = has_ms ? IR::U32{arg} : IR::U32{}; diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index c03621c50..18b1df1f9 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -113,7 +113,7 @@ struct StageSpecialization { }); ForEachSharp(binding, images, info->images, [](auto& spec, const auto& desc, AmdGpu::Image sharp) { - spec.type = sharp.GetBoundType(desc.is_array); + spec.type = sharp.GetViewType(desc.is_array); spec.is_integer = AmdGpu::IsInteger(sharp.GetNumberFmt()); spec.is_storage = desc.is_written; if (spec.is_storage) { diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 467cecf10..60fb42ca0 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -254,9 +254,12 @@ struct Image { return 1; } + bool IsCube() const noexcept { + return static_cast(type) == ImageType::Cube; + } + ImageType GetType() const noexcept { - const auto img_type = static_cast(type); - return img_type == ImageType::Cube ? ImageType::Color2DArray : img_type; + return IsCube() ? ImageType::Color2DArray : static_cast(type); } DataFormat GetDataFmt() const noexcept { @@ -288,8 +291,12 @@ struct Image { GetDataFmt() <= DataFormat::FormatFmask64_8; } - [[nodiscard]] ImageType GetBoundType(const bool is_array) const noexcept { + [[nodiscard]] ImageType GetViewType(const bool is_array) const noexcept { const auto base_type = GetType(); + if (IsCube()) { + // Cube needs to remain array type regardless of instruction array specifier. + return base_type; + } if (base_type == ImageType::Color1DArray && !is_array) { return ImageType::Color1D; } @@ -303,7 +310,7 @@ struct Image { } [[nodiscard]] u32 NumViewLevels(const bool is_array) const noexcept { - switch (GetBoundType(is_array)) { + switch (GetViewType(is_array)) { case ImageType::Color2DMsaa: case ImageType::Color2DMsaaArray: return 1; @@ -313,7 +320,7 @@ struct Image { } [[nodiscard]] u32 NumViewLayers(const bool is_array) const noexcept { - switch (GetBoundType(is_array)) { + switch (GetViewType(is_array)) { case ImageType::Color1D: case ImageType::Color2D: case ImageType::Color2DMsaa: diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index 569238168..d90b78c67 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -45,7 +45,7 @@ ImageViewInfo::ImageViewInfo(const AmdGpu::Image& image, const Shader::ImageReso range.base.layer = image.base_array; range.extent.levels = image.NumViewLevels(desc.is_array); range.extent.layers = image.NumViewLayers(desc.is_array); - type = ConvertImageViewType(image.GetBoundType(desc.is_array)); + type = ConvertImageViewType(image.GetViewType(desc.is_array)); if (!is_storage) { mapping = Vulkan::LiverpoolToVK::ComponentMapping(image.DstSelect()); From 4a21d9487132c92a58db45c5dd8ef02d2849468b Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 10 Jan 2025 17:58:41 -0300 Subject: [PATCH 047/455] Fix -PKG Viewer -Button install (#2113) https://github.com/shadps4-emu/shadPS4/issues/2112 --- src/qt_gui/pkg_viewer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt_gui/pkg_viewer.cpp b/src/qt_gui/pkg_viewer.cpp index 0ffb9b579..b4dd3afdf 100644 --- a/src/qt_gui/pkg_viewer.cpp +++ b/src/qt_gui/pkg_viewer.cpp @@ -47,6 +47,9 @@ PKGViewer::PKGViewer(std::shared_ptr game_info_get, QWidget* pare connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) { + if (treeWidget->selectedItems().isEmpty()) { + return; + } m_gui_context_menus.RequestGameMenuPKGViewer(pos, m_full_pkg_list, treeWidget, InstallDragDropPkg); }); From cfaea1ea6d5d59eac1d376a31c6f75fd8868b9a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sat, 11 Jan 2025 03:59:19 +0700 Subject: [PATCH 048/455] qt_gui: Fix shortcut's name got cut off in some cases (#2116) Example: P.T. -> P --- src/qt_gui/gui_context_menus.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index bbc84c4fc..0e8675c0c 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -283,7 +283,7 @@ public: #ifdef Q_OS_WIN if (createShortcutWin(linkPath, ebootPath, icoPath, exePath)) { #else - if (createShortcutLinux(linkPath, ebootPath, iconPath)) { + if (createShortcutLinux(linkPath, m_games[itemID].name, ebootPath, iconPath)) { #endif QMessageBox::information( nullptr, tr("Shortcut creation"), @@ -301,7 +301,7 @@ public: #ifdef Q_OS_WIN if (createShortcutWin(linkPath, ebootPath, iconPath, exePath)) { #else - if (createShortcutLinux(linkPath, ebootPath, iconPath)) { + if (createShortcutLinux(linkPath, m_games[itemID].name, ebootPath, iconPath)) { #endif QMessageBox::information( nullptr, tr("Shortcut creation"), @@ -510,8 +510,8 @@ private: return SUCCEEDED(hres); } #else - bool createShortcutLinux(const QString& linkPath, const QString& targetPath, - const QString& iconPath) { + bool createShortcutLinux(const QString& linkPath, const std::string& name, + const QString& targetPath, const QString& iconPath) { QFile shortcutFile(linkPath); if (!shortcutFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::critical(nullptr, "Error", @@ -522,7 +522,7 @@ private: QTextStream out(&shortcutFile); out << "[Desktop Entry]\n"; out << "Version=1.0\n"; - out << "Name=" << QFileInfo(linkPath).baseName() << "\n"; + out << "Name=" << QString::fromStdString(name) << "\n"; out << "Exec=" << QCoreApplication::applicationFilePath() << " \"" << targetPath << "\"\n"; out << "Icon=" << iconPath << "\n"; out << "Terminal=false\n"; From 6ec68f66a9d3c5c9f3124373fffcf5cfe6a65910 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 10 Jan 2025 15:59:20 -0800 Subject: [PATCH 049/455] hotfix: Check correct template for setting binding divisor. --- src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 2d0b19bbe..4ca3a7f27 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -333,7 +333,7 @@ void GraphicsPipeline::GetVertexInputs(VertexInputs& attributes, ? vk::VertexInputRate::eVertex : vk::VertexInputRate::eInstance, }); - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { bindings.back().divisor = 1; } guest_buffers.emplace_back(buffer); From 5c845d4ecc3350302f0cc1899b355a055d444d6e Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:30:28 -0800 Subject: [PATCH 050/455] hotfix: Constrain view layers to actual layers. --- src/video_core/amdgpu/resource.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 60fb42ca0..744aacdc5 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -227,11 +227,13 @@ struct Image { } [[nodiscard]] u32 NumLayers() const noexcept { + // Depth is the number of layers for Array images. u32 slices = depth + 1; - const auto img_type = static_cast(type); - if (img_type == ImageType::Color3D) { + if (GetType() == ImageType::Color3D) { + // Depth is the actual texture depth for 3D images. slices = 1; - } else if (img_type == ImageType::Cube) { + } else if (IsCube()) { + // Depth is the number of full cubes for Cube images. slices *= 6; } if (pow2pad) { @@ -315,7 +317,9 @@ struct Image { case ImageType::Color2DMsaaArray: return 1; default: - return last_level - base_level + 1; + // Constrain to actual number of available levels. + const auto max_level = std::min(last_level + 1, NumLevels()); + return max_level > base_level ? max_level - base_level : 1; } } @@ -327,7 +331,9 @@ struct Image { case ImageType::Color3D: return 1; default: - return last_array - base_array + 1; + // Constrain to actual number of available layers. + const auto max_array = std::min(last_array + 1, NumLayers()); + return max_array > base_array ? max_array - base_array : 1; } } }; From 5ac7e70e4be66385881655d84e5f46c04ec7a626 Mon Sep 17 00:00:00 2001 From: DemoJameson Date: Sun, 12 Jan 2025 00:55:10 +0800 Subject: [PATCH 051/455] Update zh_CN.ts (#2122) --- src/qt_gui/translations/zh_CN.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index e71180729..bb4476b9e 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -558,11 +558,11 @@ Trophy Key - Trophy Key + 奖杯密钥 Trophy - Trophy + 奖杯 Logger @@ -782,7 +782,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + 奖杯密钥:\n用于解密奖杯的密钥。必须从您的越狱主机中获得。\n仅包含十六进制字符。 logTypeGroupBox @@ -1337,4 +1337,4 @@ TB - \ No newline at end of file + From 62bbad62fc9bf23c176b8dd69e16cfef47c5e1f8 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sat, 11 Jan 2025 10:58:07 -0600 Subject: [PATCH 052/455] Implement sceNpCmp functions (#2114) --- CMakeLists.txt | 4 +- src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/libs.cpp | 2 + src/core/libraries/np_common/np_common.cpp | 7915 +++++++++++++++++ src/core/libraries/np_common/np_common.h | 1245 +++ .../libraries/np_common/np_common_error.h | 9 + src/core/libraries/np_manager/np_manager.cpp | 1 - 8 files changed, 9176 insertions(+), 2 deletions(-) create mode 100644 src/core/libraries/np_common/np_common.cpp create mode 100644 src/core/libraries/np_common/np_common.h create mode 100644 src/core/libraries/np_common/np_common_error.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ec04dad5..aee01a3a5 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -415,7 +415,9 @@ set(VDEC_LIB src/core/libraries/videodec/videodec2_impl.cpp src/core/libraries/videodec/videodec_impl.h ) -set(NP_LIBS src/core/libraries/np_manager/np_manager.cpp +set(NP_LIBS src/core/libraries/np_common/np_common.cpp + src/core/libraries/np_common/np_common.h + src/core/libraries/np_manager/np_manager.cpp src/core/libraries/np_manager/np_manager.h src/core/libraries/np_score/np_score.cpp src/core/libraries/np_score/np_score.h diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 5ee2dce73..b15fb07be 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -98,6 +98,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, Ssl) \ SUB(Lib, SysModule) \ SUB(Lib, Move) \ + SUB(Lib, NpCommon) \ SUB(Lib, NpManager) \ SUB(Lib, NpScore) \ SUB(Lib, NpTrophy) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 6829e2d1b..da4cf65e7 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -65,6 +65,7 @@ enum class Class : u8 { Lib_Ssl, ///< The LibSceSsl implementation. Lib_Http, ///< The LibSceHttp implementation. Lib_SysModule, ///< The LibSceSysModule implementation + Lib_NpCommon, ///< The LibSceNpCommon implementation Lib_NpManager, ///< The LibSceNpManager implementation Lib_NpScore, ///< The LibSceNpScore implementation Lib_NpTrophy, ///< The LibSceNpTrophy implementation diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 69728e523..d03edf28e 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -24,6 +24,7 @@ #include "core/libraries/network/net.h" #include "core/libraries/network/netctl.h" #include "core/libraries/network/ssl.h" +#include "core/libraries/np_common/np_common.h" #include "core/libraries/np_manager/np_manager.h" #include "core/libraries/np_score/np_score.h" #include "core/libraries/np_trophy/np_trophy.h" @@ -72,6 +73,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::SysModule::RegisterlibSceSysmodule(sym); Libraries::Posix::Registerlibsceposix(sym); Libraries::AudioIn::RegisterlibSceAudioIn(sym); + Libraries::NpCommon::RegisterlibSceNpCommon(sym); Libraries::NpManager::RegisterlibSceNpManager(sym); Libraries::NpScore::RegisterlibSceNpScore(sym); Libraries::NpTrophy::RegisterlibSceNpTrophy(sym); diff --git a/src/core/libraries/np_common/np_common.cpp b/src/core/libraries/np_common/np_common.cpp new file mode 100644 index 000000000..1234705cc --- /dev/null +++ b/src/core/libraries/np_common/np_common.cpp @@ -0,0 +1,7915 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "core/libraries/np_common/np_common.h" +#include "core/libraries/np_common/np_common_error.h" + +namespace Libraries::NpCommon { + +int PS4_SYSV_ABI sceNpCmpNpId(OrbisNpId* np_id1, OrbisNpId* np_id2) { + if (np_id1 == nullptr || np_id2 == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } + + // Compare data + if (std::strncmp(np_id1->handle.data, np_id2->handle.data, ORBIS_NP_ONLINEID_MAX_LENGTH) != 0) { + return ORBIS_NP_UTIL_ERROR_NOT_MATCH; + } + + // Compare opt + for (u32 i = 0; i < 8; i++) { + if (np_id1->opt[i] != np_id2->opt[i]) { + return ORBIS_NP_UTIL_ERROR_NOT_MATCH; + } + } + + // Compare reserved + for (u32 i = 0; i < 8; i++) { + if (np_id1->reserved[i] != np_id2->reserved[i]) { + return ORBIS_NP_UTIL_ERROR_NOT_MATCH; + } + } + + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCmpNpIdInOrder(OrbisNpId* np_id1, OrbisNpId* np_id2, u32* out_result) { + if (np_id1 == nullptr || np_id2 == nullptr || out_result == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } + + // Compare data + u32 compare = + std::strncmp(np_id1->handle.data, np_id2->handle.data, ORBIS_NP_ONLINEID_MAX_LENGTH); + if (compare < 0) { + *out_result = -1; + return ORBIS_OK; + } else if (compare > 0) { + *out_result = 1; + return ORBIS_OK; + } + + // Compare opt + for (u32 i = 0; i < 8; i++) { + if (np_id1->opt[i] < np_id2->opt[i]) { + *out_result = -1; + return ORBIS_OK; + } else if (np_id1->opt[i] > np_id2->opt[i]) { + *out_result = 1; + return ORBIS_OK; + } + } + + // Compare reserved + for (u32 i = 0; i < 8; i++) { + if (np_id1->reserved[i] < np_id2->reserved[i]) { + *out_result = -1; + return ORBIS_OK; + } else if (np_id1->reserved[i] > np_id2->reserved[i]) { + *out_result = 1; + return ORBIS_OK; + } + } + + *out_result = 0; + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCmpOnlineId(OrbisNpOnlineId* online_id1, OrbisNpOnlineId* online_id2) { + if (online_id1 == nullptr || online_id2 == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } + + if (std::strncmp(online_id1->data, online_id2->data, ORBIS_NP_ONLINEID_MAX_LENGTH) != 0) { + return ORBIS_NP_UTIL_ERROR_NOT_MATCH; + } + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorExConvertAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorExFree() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorExMalloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorExRealloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorExStrdup() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorExStrndup() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorFree() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorMalloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorRealloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorStrdup() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpAllocatorStrndup() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpFree() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpHeapFree() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpHeapMalloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpHeapRealloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpHeapStrdup() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpHeapStrndup() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpMalloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _sceNpRealloc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable10IsCanceledEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable10LockCancelEPKciS3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable11CheckCancelEPKciS3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable12UnlockCancelEPKciS3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable13SetCancelableEb() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable14SetupSubCancelEPS1_PKciS4_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable16CleanupSubCancelEPS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable4InitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable6CancelEij() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10Cancelable7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelableC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelableD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelableD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelableD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelLock3EndEPKciS3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelLock5BeginEPNS0_6HandleEPKciS5_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelLockC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelLockC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelLockD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10CancelLockD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue10ClearAbortEt() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue10TryDequeueEPvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue4InitEPKcmm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue5AbortEt() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue7DequeueEPvmj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueue7EnqueueEPKvmj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueueC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueueD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueueD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10EventQueueD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonObject16DeleteFieldValueEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonObject5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonParser4InitEPK7JsonDefPNS1_12EventHandlerE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonParser5ParseEPKcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonParserC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonParserD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonParserD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonParserD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonString5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10JsonString6SetStrEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile4SyncEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile5CloseEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile5WriteEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile8TruncateEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI +_ZN3sce2np12HttpTemplate19SetAuthInfoCallbackEPFii15SceHttpAuthTypePKcPcS5_iPPhPmPiPvESA_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplate4InitEiPKcib() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplate7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamBufferixEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPNS0_9StreamCtxEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPNS0_9StreamCtxEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleEPNS0_9StreamCtxElPl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEcl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEPNS0_9StreamCtxEcl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter5WriteEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12WorkerThread10ThreadMainEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadC1EPNS0_9WorkQueueE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadC2EPNS0_9WorkQueueE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParser5ParseEPKcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParser9GetResultEPPNS0_10JsonObjectE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParser9GetResultEPPNS0_9JsonValueE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserC2EP16SceNpAllocatorExPK7JsonDef() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecret5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1EPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1ERK16SceNpTitleSecret() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1ERKS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2EPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2ERK16SceNpTitleSecret() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2ERKS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory4InitEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory6ExpandEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContext4InitEPKcimm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContext4InitEPKNS1_5ParamE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContext7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder12BuildBufSizeEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder16EscapeJsonStringEPKcPcmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder23EscapeJsonStringBufSizeEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder5BuildEPcmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderC1ERKNS0_9JsonValueE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderC2ERKNS0_9JsonValueE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np15CancelableScope3EndEiPKciS3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np15CancelableScope5BeginEPNS0_6HandleEPKciS5_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np16StreamReadBufferC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np16StreamReadBufferD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np16StreamReadBufferD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPool13InvalidateAllEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPool4InitEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPool7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolC1EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderC1EPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderC2EPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterC1EPvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterC2EPvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReader4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReader5CloseEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient10DisconnectEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient11IsConnectedEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient16invokeSyncMethodEjPKvmPvPmm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient4InitEPKNS2_6ConfigE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient7ConnectEPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI +_ZN3sce2np3ipc13ServiceClientC1EPNS1_17ServiceIpmiClientEPKNS1_17ServiceClientInfoE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI +_ZN3sce2np3ipc13ServiceClientC2EPNS1_17ServiceIpmiClientEPKNS1_17ServiceClientInfoE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient10DisconnectEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient10EndRequestEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11findServiceEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11InitServiceEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11TermServiceEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11WaitRequestEiij() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient12AbortRequestEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient12BeginRequestEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13CreateRequestEPiiPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13DeleteRequestEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13PollEventFlagEijmjPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13WaitEventFlagEijmjPmj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient14PollEventQueueEiPvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient15CancelEventFlagEijm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient15RegisterServiceEPKNS1_17ServiceClientInfoE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient16RegisterServicesEPKNS1_17ServiceClientInfoE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient17invokeInitServiceEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient17invokeTermServiceEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient17UnregisterServiceEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient18EndRequestForAsyncEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient19WaitRequestForAsyncEiij() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient20AbortRequestForAsyncEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI +_ZN3sce2np3ipc17ServiceIpmiClient20BeginRequestForAsyncEiiPN4IPMI6Client12EventNotifeeE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient21CreateRequestForAsyncEPiiPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient21DeleteRequestForAsyncEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient4InitEPNS2_6ConfigE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient7ConnectEPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Cond4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Cond4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Cond4InitEPKcPNS0_5MutexE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Cond4WaitEj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Cond6SignalEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Cond7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Cond9SignalAllEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4CondC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4CondC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4CondD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4CondD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4CondD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Path11BuildAppendEPcmcPKcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Path12AddDelimiterEPcmc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Path5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Path6SetStrEPKcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4PathD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4PathD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4PathD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time10AddMinutesEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time10AddSecondsEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time12GetUserClockEPS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time15AddMicroSecondsEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time15GetNetworkClockEPS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time20GetDebugNetworkClockEPS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time7AddDaysEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4Time8AddHoursEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4TimeplERK10SceRtcTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np4TimeplERKS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5Mutex4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5Mutex4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5Mutex4InitEPKcj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5Mutex4LockEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5Mutex6UnlockEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5Mutex7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5Mutex7TryLockEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5MutexC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5MutexC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5MutexD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5MutexD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5MutexD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np5NpEnv8GetNpEnvEPS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Handle10CancelImplEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Handle4InitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Handle7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6HandleC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6HandleC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6HandleD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6HandleD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6HandleD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectdaEPv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectdaEPvR14SceNpAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectdaEPvR16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectdlEPv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectdlEPvR14SceNpAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectnaEmR14SceNpAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectnwEmR14SceNpAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread12DoThreadMainEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread4InitEPKcimm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread4InitEPKNS1_5ParamE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread4JoinEPi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread5StartEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread9EntryFuncEPv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread9GetResultEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6Thread9IsRunningEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ThreadC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ThreadD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ThreadD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np6ThreadD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7Callout10IsTimedoutEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7Callout11CalloutFuncEPv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7Callout4StopEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7Callout5StartEjPNS1_7HandlerE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7Callout5StartEmPNS1_7HandlerE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7Callout9IsStartedEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7CalloutC1EPNS0_14CalloutContextE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7CalloutC2EPNS0_14CalloutContextE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7CalloutD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7CalloutD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7CalloutD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7HttpUri5BuildEPKS1_PcmPmj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7HttpUri5ParseEPS1_PKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7HttpUriC1EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7HttpUriC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7HttpUriD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7HttpUriD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7HttpUriD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf14CheckinForReadEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf15CheckinForWriteEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf15CheckoutForReadEPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf16CheckoutForWriteEPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4InitEPvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4PeekEmPvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4ReadEPvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf5WriteEPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBuf7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBufC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBufC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBufD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBufD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np7RingBufD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8HttpFile4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8HttpFile5CloseEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8HttpFileC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8HttpFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8HttpFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8HttpFileD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8JsonBool5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8JsonBool7SetBoolEb() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8JsonFile5CloseEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8JsonFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8JsonFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8JsonFileD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8JsonNull5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5BuildERKS1_Pcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5ParseEPS1_PKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5ParseEPS1_PKcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC1ERK20SceNpCommunicationId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC1ERKS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC2ERKS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8Selector4InitEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8SelectorD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8SelectorD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8SelectorD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItem10SetPendingEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItem10SetRunningEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItem11SetFinishedEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItem14FinishCallbackEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItem15RemoveFromQueueEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItem6CancelEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItem9BindQueueEPNS0_9WorkQueueEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItemC2EPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItemD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItemD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np8WorkItemD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag3SetEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4OpenEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4PollEmjPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4WaitEmjPmj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag5ClearEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag6CancelEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag6CreateEPKcj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlag7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlagC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlagC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlagD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlagD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9EventFlagD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans10SetTimeoutEPKNS1_12TimeoutParamE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans11SendRequestEPNS0_6HandleEPKvm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans12RecvResponseEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans12SkipResponseEPNS0_6HandleE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans16AddRequestHeaderEPKcS3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans16SetRequestHeaderEPKcS3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans21GetResponseStatusCodeEPNS0_6HandleEPi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans21SetRequestContentTypeEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans23SetRequestContentLengthEm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans24GetResponseContentLengthEPNS0_6HandleEPbPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans4InitERKNS0_12HttpTemplateEPNS0_18HttpConnectionPoolEiPKcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI +_ZN3sce2np9HttpTrans4InitERKNS0_12HttpTemplateEPNS0_18HttpConnectionPoolEiPKcS8_tS8_m() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTransC1EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTransC2EP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTransD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTransD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9HttpTransD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonArray12AddItemArrayEPPS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonArray5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonValue12GetItemValueEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonValue13GetFieldValueEiPPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonValue13GetFieldValueEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonValueD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonValueD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9JsonValueD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFile4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFile4SeekEliPl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFile4SyncEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFile5CloseEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFile5WriteEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFile6RemoveEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFile8TruncateEl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFileC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFileC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9LocalFileD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5BuildERKS1_Pcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5ClearEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5ParseEPS1_PKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5ParseEPS1_PKcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC1ERK12SceNpTitleId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC1ERKS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC2ERKS1_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9RefObject6AddRefEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9RefObject7ReleaseEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9RefObjectC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9RefObjectC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9RefObjectD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9RefObjectD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9RefObjectD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9Semaphore4OpenEPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9Semaphore4WaitEj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9Semaphore6CreateEiiPKc() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9Semaphore6SignalEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9Semaphore7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue11GetItemByIdEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue15GetFinishedItemENS0_14WorkItemStatusE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue16WorkItemFinishedEPNS0_8WorkItemEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue17ProcFinishedItemsENS0_14WorkItemStatusE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue18RemoveFinishedItemEPNS0_8WorkItemE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue18WaitForPendingItemEPPNS0_8WorkItemEPb() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4ctorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4dtorEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4InitEPKcimm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4InitEPKNS0_6Thread5ParamE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4StopEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue5StartEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue6CancelEii() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue7DestroyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue7EnqueueEiPNS0_8WorkItemE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue9CancelAllEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue9IsRunningEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueC1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueC2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueD2Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERK10SceRtcTickRKNS0_4TimeE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERK12SceNpTitleIdRKNS0_9NpTitleIdE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERK16SceNpTitleSecretRKNS0_13NpTitleSecretE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERK20SceNpCommunicationIdRKNS0_8NpCommIdE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_13NpTitleSecretERK16SceNpTitleSecret() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_13NpTitleSecretES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_4TimeERK10SceRtcTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_4TimeES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_8NpCommIdERK20SceNpCommunicationId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_8NpCommIdES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_9NpTitleIdERK12SceNpTitleId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_9NpTitleIdES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npgeERK10SceRtcTickRKNS0_4TimeE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npgeERKNS0_4TimeERK10SceRtcTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npgeERKNS0_4TimeES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npgtERK10SceRtcTickRKNS0_4TimeE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npgtERKNS0_4TimeERK10SceRtcTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npgtERKNS0_4TimeES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npleERK10SceRtcTickRKNS0_4TimeE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npleERKNS0_4TimeERK10SceRtcTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npleERKNS0_4TimeES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npltERK10SceRtcTickRKNS0_4TimeE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npltERKNS0_4TimeERK10SceRtcTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npltERKNS0_4TimeES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERK10SceRtcTickRKNS0_4TimeE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERK12SceNpTitleIdRKNS0_9NpTitleIdE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERK16SceNpTitleSecretRKNS0_13NpTitleSecretE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERK20SceNpCommunicationIdRKNS0_8NpCommIdE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_13NpTitleSecretERK16SceNpTitleSecret() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_13NpTitleSecretES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_4TimeERK10SceRtcTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_4TimeES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_8NpCommIdERK20SceNpCommunicationId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_8NpCommIdES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_9NpTitleIdERK12SceNpTitleId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_9NpTitleIdES3_() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10Cancelable6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10EventQueue6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10EventQueue7IsEmptyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber5CloneEP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPj() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber9GetNumStrEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonObject5CloneEP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonString5CloneEP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonString6GetStrEPcm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonString6GetStrEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np10JsonString9GetLengthEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np12HttpTemplate6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np18HttpConnectionPool6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np3ipc10IpmiClient6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np3ipc17ServiceIpmiClient6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np4Cond6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np4Time18ConvertToPosixTimeEPl() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np5Mutex6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np6Handle6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np6Thread6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf11GetDataSizeEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf11GetFreeSizeEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf6IsFullEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf7IsEmptyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np8JsonBool5CloneEP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np8JsonBool7GetBoolEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np8JsonNull5CloneEP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np8NpCommId7IsEmptyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np9EventFlag6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np9HttpTrans6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np9JsonArray5CloneEP16SceNpAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np9JsonValue12GetItemValueEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np9NpTitleId7IsEmptyEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZNK3sce2np9Semaphore6IsInitEv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np10MemoryFile5WriteEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np10MemoryFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np10MemoryFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np9HttpTransD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np9HttpTransD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np9LocalFile5WriteEPNS0_6HandleEPKvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np9LocalFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn16_N3sce2np9LocalFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np10MemoryFile4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np10MemoryFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np10MemoryFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np6Handle10CancelImplEi() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np6HandleD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np6HandleD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np9HttpTrans4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np9HttpTransD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np9HttpTransD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np9LocalFile4ReadEPNS0_6HandleEPvmPm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np9LocalFileD0Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZThn8_N3sce2np9LocalFileD1Ev() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np10JsonNumberE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np10JsonObjectE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np10JsonStringE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np8JsonBoolE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np8JsonNullE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np8SelectorE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np9JsonArrayE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI _ZTVN3sce2np9JsonValueE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpAllocateKernelMemoryNoAlignment() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpAllocateKernelMemoryWithAlignment() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpArchInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpArchTerm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpAtomicCas32() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpAtomicDec32() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpAtomicInc32() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpBase64Decoder() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpBase64Encoder() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpBase64GetDecodeSize() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpBase64UrlDecoder() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpBase64UrlEncoder() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpBase64UrlGetDecodeSize() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCalloutInitCtx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCalloutStartOnCtx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCalloutStartOnCtx64() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCalloutStopOnCtx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCalloutTermCtx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCancelEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpClearEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCloseEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCloseSema() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCondDestroy() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCondInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCondSignal() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCondSignalAll() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCondSignalTo() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCondTimedwait() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCondWait() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCreateEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCreateSema() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpCreateThread() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpDbgAssignDebugId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpDbgDumpBinary() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpDbgDumpText() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpDeleteEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpDeleteSema() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpEventGetCurrentNetworkTick() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpFreeKernelMemory() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGetNavSdkVersion() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGetPlatformType() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGetProcessId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGetRandom() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGetSdkVersion() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGetSdkVersionUInt() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGetSystemClockUsec() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocatorExPtr() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocatorPtr() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpHeapDestroy() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpHeapGetAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpHeapGetStat() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpHeapInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpHeapShowStat() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpHexToInt() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpInt32ToStr() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpInt64ToStr() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpIntGetPlatformType() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpIntIsOnlineIdString() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpIntIsValidOnlineId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpIntSetPlatformType() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpIntToHex() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpIpc2ClientInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpIpc2ClientTerm() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpJoinThread() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpJsonParse() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpJsonParseBuf() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpJsonParseBufInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpJsonParseEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpJsonParseExInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpJsonParseInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwCondDestroy() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwCondInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwCondSignal() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwCondSignalAll() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwCondSignalTo() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwCondWait() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwMutexDestroy() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwMutexInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwMutexLock() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwMutexTryLock() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpLwMutexUnlock() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMemoryHeapDestroy() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMemoryHeapGetAllocator() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMemoryHeapGetAllocatorEx() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMemoryHeapInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMutexDestroy() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMutexInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMutexLock() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMutexTryLock() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpMutexUnlock() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpOpenEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpOpenSema() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpPanic() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpPollEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpPollSema() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpRtcConvertToPosixTime() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpRtcFormatRFC3339() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpRtcParseRFC3339() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpServerErrorJsonGetErrorCode() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpServerErrorJsonMultiGetErrorCode() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpServerErrorJsonParse() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpServerErrorJsonParseInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpServerErrorJsonParseMultiInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpSetEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpSetPlatformType() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpSignalSema() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrBuildHex() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrcpyToBuf() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrncpyToBuf() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrnParseHex() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrParseHex() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrToInt32() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrToInt64() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrToUInt32() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpStrToUInt64() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpThreadGetId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUInt32ToStr() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUInt64ToStr() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUserGetUserIdList() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilBuildTitleId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilCanonicalizeNpIdForPs4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilCanonicalizeNpIdForPsp2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilCmpAccountId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetDateSetAuto() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetDbgCommerce() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetEnv() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetFakeDisplayNameMode() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetFakeRateLimit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetIgnoreNpTitleId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetNpDebug() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCode() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCode2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCode2Str() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCodeStr() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetNpTestPatch() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetNthChar() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetShareTitleCheck() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetSystemLanguage() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetTrcNotify() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetWebApi2FakeRateLimit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetWebApi2FakeRateLimitTarget() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilGetWebTraceSetting() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilHttpUrlEncode() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilJidToNpId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilJsonEscape() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilJsonGetOneChar() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilJsonUnescape() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilNpIdToJid() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilNumChars() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilParseJid() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilParseTitleId() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilSerializeJid() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilXmlEscape() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilXmlGetOneChar() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpUtilXmlUnescape() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpWaitEventFlag() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpWaitSema() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpXmlParse() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceNpXmlParseInit() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_00FD578C2DD966DF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0131A2EA80689F4C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_01443C54863BDD20() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_01BC55BDC5C0ADAD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_01D1ECF5750F40E8() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_020A479A74F5FBAC() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_024AF5E1D9472AB5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_027C5D488713A6B3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_02FE9D94C6858355() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_041F34F1C70D15C1() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0530B1D276114248() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_065DAA14E9C73AD9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_06AFF4E5D042BC3E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_06EE369299F73997() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_07C92D9F8D76B617() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_07E9117498F1E4BF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_08F3E0AF3664F275() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0A9937C01EF21375() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0ACBE6ACCBA3876D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0AE07D3354510CE6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0AEC3C342AE67B7C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0B318420C11E7C23() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0BB6C37B03F35D89() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0BBE8A9ACDD90FDF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0C7B62905E224E9C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0D35913117241AF9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0D5EE95CEED879A7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0D6FB24B27AB1DA2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0DE8032D534AC41C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0DF4CCA9DCA9E742() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0E7449B1D3D98C01() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0E77094B7750CB37() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0ECAB397B6D50603() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0F1DE1D1EADA2948() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_0F8AFEFA1D26BF1A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_11881710562A6BAD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_11AFD88BBD0C70DB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_11E704A30A4B8877() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_125014842452F94B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_126F0071E11CAC46() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_12926DCF35994B01() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_12CC7ABFBF31618F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_13C4E51F44592AA2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_15330E7C56338254() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1566B358CABF2612() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1625818F268F45EF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_16D32B40D28A9AC2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_183F4483BDBD25CD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1887E9E95AF62F3D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_18A3CE95FD893D3A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_18B3665E4854E7E9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1923B003948AF47E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_19B533DA4C59A532() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1BB399772DB68E08() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1C0AC612D3A2971B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1C5599B779990A43() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1CCBB296B04317BE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1CD045542FB93002() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1DECECA673AB77B7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1E03E024E26C1A7F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1F101732BB0D7E21() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1F4D153EC3DD47BB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1F7C47F63FAF0CBE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_1FBE2EE68C0F31B6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2038C1628914B9C9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_203FCB56FDB86A74() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_20569C107C6CB08C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_20AB2D734EDE55F0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_22B1281180FB0A5E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_22F1AADA66A449AE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_238B215EFFDF3D30() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_24E8EC51D149FA15() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_25728E78A3962C02() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_25E649A1C6891C05() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_264B8A38B577705D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_266ED08DC1C82A0E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_27BB4DE62AB58BAD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_283AA96A196EA2EA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_285315A390A85A94() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_29049DBB1EF3194E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_29F7BA9C3732CB47() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2A732DF331ACCB37() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2AA01660EC75B6FB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2B37CBCE941C1681() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2CAA3B64D0544E55() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2CCD79617EC10A75() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2CD8B69716AC0667() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2D74F7C0FF9B5E9C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2DCA5A8080544E95() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2E69F2743CE7CE57() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_2EAF1F3BAFF0527D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_31493E55BB4E8F66() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_317EDCAD00FB5F5E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_31E01CFA8A18CDA2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_32AFD782A061B526() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_32B5CDEB093B8189() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_34155152513C93AE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_34E4EFFF8EF6C9FE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3572FA0D5C54563B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_367C479B264E0DB9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_36884FBC964B29CC() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3860081BB7559949() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_39314F7E674AB132() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3A02E780FCC556A5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3A17B885BA4849B6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3A38EACAEA5E23A4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3B34A5E07F0DBC1F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3B4E8FFC00FC7EA4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3BAB18FDA235107A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3BDF9996A0A33F11() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3C1952F1A45CC37A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3CA37906CDB05F3B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3CDB2908ACEE3A6F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3D3ED165F2BDCD33() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3DA4D7D1575FCDCE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3DDFB612CD0BC769() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3E0415E167DEADC7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3E7E9F0F1581C1E6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3ED389DB8280ED65() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3F0C7F6C0C35487D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3FDA7200389EF0D2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_3FF3C258BA516E58() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4029453F628A3C5D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_405826DDB4AE538E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_405A926759F25865() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_406608FDEE7AE88A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_40DDA5558C17DDCF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_419D12E52FF60664() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4296E539474BE77F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_42F41FC563CC3654() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_43CCC86F4C93026A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4409F60BDABC65E1() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4563C70AEC675382() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_45E66370219BD05E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_466A54F072785696() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_46CD2536976F209A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4863717BD2FDD157() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4902EBD19A263149() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4904F7FE8D83F40C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4A5E13F784ABFCE7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4B65EEB135C12781() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4C19D49978DA85E2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4DE5D620FF66F136() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4E170C12B57A8F9E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4E2F3FA405C3260C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4EA9350577513B4D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_4F78EB6FC4B5F21F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_50348BE4331117B7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_508C7E8CDD281CAA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_521C1D2C028F5A7E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_522FF24A35E67291() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5470FE90C25CDD4C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_557F260F9A4ACD18() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5586F97209F391EB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_55B2C9B7ADA95C3C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_55B488A3A540B936() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5642DFE82AF43143() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_574E046F294AE187() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_578926EBF8AA6CBF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_585DA5FC650896BC() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_58D6EB27349EC276() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5906B7317949872D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5910B5614335BE70() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_593D7DA8911F08C9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_59757FE6A93B0D53() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_598E60F862B1141E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5A45351666680DAF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5AABE9EA702E6A7F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5AEA4AE472355B80() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5B20E53CDE598741() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5B480B59FAE947E0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5B5EEC23690AB9BD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5C0AC5B0AF3EDAE0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5D2E999BEA0762D4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5D55BBFD45110E16() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_5DEE15403D2BB5FD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6020C708CA74B130() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_606E1415503C34D2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_612140E8EE9A693E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_61F13F551DAF61DF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6206D39131752328() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_621D4543EF0344DE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6259A9A8E56D0273() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_625F9C7016346F4E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_62EF8DF746CD8C4A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_636D2A99FD1E6B2B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_68013EDF66FE7425() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6971F7067DD639D1() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_69896ADB3AB410B2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6A1389AA6E561387() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6A5560D89F12B2E7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6ABF99CF854ABCF1() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6B4FDDC6500D8DCB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6CA11D5B49D1928A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6D6C0FB61E6D0715() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6D750745FE1348F5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6E1AF3F9D09914BE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6E53ED4C08B2A521() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6EF43ACA1ED6B968() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_6F6FA09F3E1B6A60() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7035C340C7195901() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7038E21CB5CF641B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_706345DCDA5BA44D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7120714EBF10BF1F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_713D28A91BC803DD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7153BD76A53AA012() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_715C625CC7041B6B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_71E467BDB18711D0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_720D17965C1F4E3F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_734380C9BCF65B9A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_73F4C08CCD4BBCCF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_74403101B7B29D46() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7525B081ACD66FF4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_75BF4477C13A05CA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7609793F5987C6F7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7616ED01B04769AA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_764F873D91A124D8() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7706F1E123059565() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_77F2D07EB6D806E6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_79C3704CDCD59E57() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_79DA0BBA21351545() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_79FA2447B5F3F0C4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7A4D6F65FF6195A5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7B3195CD114DECE7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7B3238F2301AD36D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7C77FC70750A3266() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7D23A9DC459D6D18() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7D5988C748D0A05F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7D9597147A99F4F4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7E2953F407DD8346() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_7EE34E5099709B32() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_80470E5511D5CA00() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_807179701C08F069() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8096E81FFAF24E46() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_80B764F4F1B87042() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_80BF691438AD008B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_80CF6CFC96012442() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_80EA772F8C0519FD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_81D0AFD0084D327A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_821EB8A72176FD67() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_82D2FAB54127273F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_836AE669C42A59E9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8559A25BFEC3518C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_85C1F66C767A49D2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8689ED1383F87BA7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8796CD9E5355D3A6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_87D37EB6DDC19D99() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_880AA48F70F84FDD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_897B07562093665B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8ACAF55F16368087() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8AE8A5589B30D4E0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8AE997909831B331() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8B2D640BE0D0FB99() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8B3D9AB4668DAECB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8B5EFAAAACE0B46C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8C27943F40A988DB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8C54096C75F5F2D0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8D7663A0A5168814() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8E618F509994FAD7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8F19E6CC064E2B98() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_8F6A8AEAEE922FF5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_9010E1AD8EBBFBCA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_90A955A0E7001AE9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_90F9D6067FEECC05() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_9348F3D19546A1DA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_93D3C011DB19388A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_956E7A4FD9F89103() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_95F699E042C3E40F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_96877B39AA0E8735() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_96CE07C49ED234EA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_976BB178235B5681() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_978C0B25E588C4D6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_98BA2612BEF238D6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_995BDD4931AF9137() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_9966E39A926B7250() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_99C2306F18963464() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_99C92C613B776BA7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_9A4E4B938CC8AD39() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_9B23F7B4B7F72081() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_9C0EAEEAE705A8DB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_9D47AC59545DE9E8() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A13052D8B1B2ACFA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A1AA43E3A78F6F62() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A1E48CDF54649DC9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A2E7DEE5B0AF5D14() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A2F5C7FD9FF113F5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A36296E2269D46BC() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A3EE2A7B9F0D88AF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A4471F9F7E0BFA82() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A449BBA521EA34E1() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A48E666C334E726C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A49B7449B4DDE69C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A5748451125C9EA4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A690A28D648CC176() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A6A86DE1B1CBB1D9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A8F2BB7B815740A1() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_A93F64C06A6F7397() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AB35925FC97D6AA3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AC014AA2C991FA29() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AC06E10901404AEB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AC75C68813523505() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AD441BC497082C3E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AD4F25F021D354C3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_ADFA04A85541A4FE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AE9610A6B5217A23() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AF201923826F0A58() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_AFC021B4389CA3FA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B015E999A3373D8F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B0384B86107FC652() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B0C630653B316563() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B100DCCD88D5C73D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B11A3FEA5E4D9EA4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B2E7F8DC199C0B93() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B3AB61A296F6DDC8() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B3F32F6AE619EC82() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B4227AB213BF8CF5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B4652BF42B604360() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B536C1F13BFE97CB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B645CC264184BC89() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B67E17B1582C6FBD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B6D047C5D7695A4D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B75ED8E1EA62EFC7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B7A9A944DBD7E100() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B7C4E75BE94F31F3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B888B1F92C464121() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B8DEC22564AA057B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_B9BADD1CBBBAE4F8() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_BAA9F7169C85E59F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_BAEE5C38908D62DB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_BCC855EB25183F84() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_BD01F637029C7364() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_BDD29F5AC7077E53() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_BED83DD33ECAD50D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_BEE7D5D098ABF728() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C0DB15CCF59AE62C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C1C229FEE0FD60FA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C228B9AD68298E98() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C298525CEF6FB283() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C350F09351F6D6B5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C3742E80FA580319() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C3C9853D5D4D45D4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C3F5DAD4FB9FC340() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C45FB0E4CCE9AED6() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C4979CB948B7E3C7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C49B25BA16CF0B8C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C551345D9631201E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C57A294421368298() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C5DC91CAD721D628() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C6DECEE589135357() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C81F8B20D67AC78D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C820FA56FAC87BEA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C878EA9114C5E490() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C8A813EBFF477509() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C966A663D5A35482() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C97C4C67FD3674D3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_C990550F15848B07() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CA59737A8EC1BBBE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CAC5FDE8F80D7B65() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CB135B30D0639B83() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CB8A1AAA61F64C3A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CB9E674672580757() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CC2B9D25EAEAAB1D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CD1B252BBEDF5B53() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CF003BE90CBE1A27() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_CF008E34884AC1E2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D0B8F4B3A3687AB2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D0EE19B8E91F60F5() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D12B9294BD0E0F56() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D1CC8626D8FA328B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D2FA2BB9EB8B63AC() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D32197880CF93CEB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D326F5C26CC81B8E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D4FA06B95A321B7A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D52A37A901E04B21() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D5504DFC399AB400() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D56105CB27F8F5DC() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D568AB19235ECB19() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D6DF7BF6639FE611() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D8608A903119D746() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D9E8FC707D59914D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_D9F079E62DEE5B29() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DA17CE4F29748536() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DA40B9EFD7F61185() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DA6B274FEBC2666A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DAD01535C87A51FC() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DB4511D448510EC4() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DB8EF1FFFC66269C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DBB508FA1B9DA8F7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DC59C9B870B729A2() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DC669ED6CBF6751C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DCB8A2849A41C991() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DD8F9916D7F03AF7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DDC33F2F4E480C2A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_DE0B420BDE8B22D7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E0C0BC29898FE370() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E0CD893E46FB55BA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E25530164B7F659F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E3682F43FDF76C58() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E38177E1C78A80FA() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E3CA74CFF965DF0A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E45BB191B49B2ED9() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E465B9D6B60E6D7D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E4D82876C296C38A() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E4DDB5350FA5B538() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E54BFF6FB72BC7BE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E592A93203020BBB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E5A44AF6D7D48AFD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E639A97CF9FF1430() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E6AC0179E48A8927() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E751596682775D83() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E788B1E52EF82702() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E94F17613F5C9D31() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E9590113128D55E0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_E9E0B0DD12560B16() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_EAF5C8ECE64C7B05() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_EB98BF5C42D4A7EB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_EBABC4AAC43A468C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_EBF00085F082CC8B() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_ECB659EE058D06AF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_ECF096AB751487AE() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_EE5A271701DB33C0() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_EF64CB6A1625248E() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_EF6C8A357C7ED863() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F00FE94F7E699994() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F1A51DBA30329038() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F216E766A90FDC12() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F2A10584ABE5D82C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F2D99D395E5421A3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F38001E528BA1371() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F39EC9C8FA7687B3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F3AFFFDCD632775C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F3B8DFF33748BFD3() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F5E47F9550F7A147() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F6E93714D1A939CF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F6FD19AD48E4EF09() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F744EBFC620F7CBF() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F76E4525ACBACC7F() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F7957A48882F42CB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F7A80B07809BA838() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F8571C6CC5B6B59D() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_F9787CFA873836FB() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FA789F6D34D383F8() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FABA574083AC1E6C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FC04FDBBAE368FB7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FD2DAFBF2E40EEE7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FD55EE6D35F950AD() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FE55EE32098D0D58() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FE79841022E1DA1C() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_FFF4A3E279FB44A7() { + LOG_ERROR(Lib_NpCommon, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceNpCommon(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("i8UmXTSq7N4", "libSceNpCommonCompat", 1, "libSceNpCommon", 1, 1, sceNpCmpNpId); + LIB_FUNCTION("TcwEFnakiSc", "libSceNpCommonCompat", 1, "libSceNpCommon", 1, 1, + sceNpCmpNpIdInOrder); + LIB_FUNCTION("dj+O5aD2a0Q", "libSceNpCommonCompat", 1, "libSceNpCommon", 1, 1, + sceNpCmpOnlineId); + LIB_FUNCTION("0gdlCVNNHCI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _sceNpAllocatorExConvertAllocator); + LIB_FUNCTION("Zh23aSLeeZo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpAllocatorExFree); + LIB_FUNCTION("a2qdVU8RWb4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _sceNpAllocatorExMalloc); + LIB_FUNCTION("kKF3w-XkCWA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _sceNpAllocatorExRealloc); + LIB_FUNCTION("Cmd4+m7V00c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _sceNpAllocatorExStrdup); + LIB_FUNCTION("EziLjfyTnKI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _sceNpAllocatorExStrndup); + LIB_FUNCTION("BztTl7QeYqE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpAllocatorFree); + LIB_FUNCTION("mzlILsFx0cU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpAllocatorMalloc); + LIB_FUNCTION("VWcTu8wKwlQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _sceNpAllocatorRealloc); + LIB_FUNCTION("c8-4aC9opYE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpAllocatorStrdup); + LIB_FUNCTION("vqA9bl6WsF0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _sceNpAllocatorStrndup); + LIB_FUNCTION("z5kwfM5InpI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpFree); + LIB_FUNCTION("p1vvpKGRXe4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpHeapFree); + LIB_FUNCTION("kwW5qddf+Lo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpHeapMalloc); + LIB_FUNCTION("wsfyvM+VbUk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpHeapRealloc); + LIB_FUNCTION("atWcfgasESY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpHeapStrdup); + LIB_FUNCTION("RzLv+HR5E2A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpHeapStrndup); + LIB_FUNCTION("w2+qV1RJgcI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpMalloc); + LIB_FUNCTION("UmzxltBpiiY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _sceNpRealloc); + LIB_FUNCTION("LJvHO3uCNm4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable10IsCanceledEv); + LIB_FUNCTION("fd+grYAEph0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable10LockCancelEPKciS3_); + LIB_FUNCTION("IwDQAbQxvD0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable11CheckCancelEPKciS3_); + LIB_FUNCTION("-zbpF68OGDs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable12UnlockCancelEPKciS3_); + LIB_FUNCTION("bBLapYYwyr0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable13SetCancelableEb); + LIB_FUNCTION("j4gLOIpHgNk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable14SetupSubCancelEPS1_PKciS4_); + LIB_FUNCTION("vmt3ZOlQu3o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable16CleanupSubCancelEPS1_); + LIB_FUNCTION("Y7f+qBjKxdo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable4InitEv); + LIB_FUNCTION("Jhbrpz0YhHU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable6CancelEij); + LIB_FUNCTION("v2yJZLY0w1U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10Cancelable7DestroyEv); + LIB_FUNCTION("vqekW3s-eFg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelableC2Ev); + LIB_FUNCTION("kdOC-2AE06w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelableD0Ev); + LIB_FUNCTION("upzdrzOYkS0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelableD1Ev); + LIB_FUNCTION("vZXDqs2x7t0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelableD2Ev); + LIB_FUNCTION("nleHqndSeQ0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelLock3EndEPKciS3_); + LIB_FUNCTION("lJ2Efd9PUKI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelLock5BeginEPNS0_6HandleEPKciS5_); + LIB_FUNCTION("Vq9LKkPXkIQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelLockC1Ev); + LIB_FUNCTION("MecB8wAHCfE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelLockC2Ev); + LIB_FUNCTION("K7FjXiy2z+A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelLockD1Ev); + LIB_FUNCTION("1iHBAKrdE90", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10CancelLockD2Ev); + LIB_FUNCTION("aoas3bJANfY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue10ClearAbortEt); + LIB_FUNCTION("QlP4t2SGZ4I", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue10TryDequeueEPvm); + LIB_FUNCTION("xu9qWN0YYC4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue4ctorEv); + LIB_FUNCTION("N1gnYosdK7Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue4dtorEv); + LIB_FUNCTION("b20e017Ei94", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue4InitEPKcmm); + LIB_FUNCTION("slmKkuIoC28", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue5AbortEt); + LIB_FUNCTION("suxln7PooIo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue7DequeueEPvmj); + LIB_FUNCTION("qvpEuKumIGM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue7DestroyEv); + LIB_FUNCTION("AV5jHo8O3+E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueue7EnqueueEPKvmj); + LIB_FUNCTION("esiO4He2WTU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueueC2EP16SceNpAllocatorEx); + LIB_FUNCTION("E4uoqSdo8ek", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueueD0Ev); + LIB_FUNCTION("lQXgvDXBGtA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueueD1Ev); + LIB_FUNCTION("8kUkQPQP7bA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10EventQueueD2Ev); + LIB_FUNCTION("YHNEgBCSL2o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonNumber5ClearEv); + LIB_FUNCTION("UgmqDr1BCLw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonNumber6SetNumEi); + LIB_FUNCTION("PccynQ5NdVQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonNumber6SetNumEj); + LIB_FUNCTION("MY0CSk24EcY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonNumber6SetNumEl); + LIB_FUNCTION("qbW7qOvVafI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonNumber6SetNumEm); + LIB_FUNCTION("VyCn9EVJGlU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonNumber6SetNumEPKc); + LIB_FUNCTION("-WgnISXjJ7A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonObject16DeleteFieldValueEPKc); + LIB_FUNCTION("DiHxx2k5zfM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonObject5ClearEv); + LIB_FUNCTION("AGadQiCfKDY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonParser4InitEPK7JsonDefPNS1_12EventHandlerE); + LIB_FUNCTION("CDzSgHA6hWg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonParser5ParseEPKcm); + LIB_FUNCTION("ZJbPQt+FTnY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonParserC2EP16SceNpAllocatorEx); + LIB_FUNCTION("u+A16O-TAHk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonParserD0Ev); + LIB_FUNCTION("qJb7IXDg9xk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonParserD1Ev); + LIB_FUNCTION("AvvE5A5A6ZA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonParserD2Ev); + LIB_FUNCTION("kXE1imLw7yo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonString5ClearEv); + LIB_FUNCTION("SN4IgvT26To", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10JsonString6SetStrEPKc); + LIB_FUNCTION("EyhtbPFMWNA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFile4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("AZTMWob-mog", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFile4SyncEv); + LIB_FUNCTION("dl6+SFHLke0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFile5CloseEv); + LIB_FUNCTION("r2O0f9X-mqs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFile5WriteEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("1DtavqenQjg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFile8TruncateEl); + LIB_FUNCTION("ev77AviWYu8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFileC2EP16SceNpAllocatorEx); + LIB_FUNCTION("6Vst7HqJMXU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFileD0Ev); + LIB_FUNCTION("ZUf92uPkRuA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFileD1Ev); + LIB_FUNCTION("lGjyfcI++PY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np10MemoryFileD2Ev); + LIB_FUNCTION( + "ezJnmv7hkAg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplate19SetAuthInfoCallbackEPFii15SceHttpAuthTypePKcPcS5_iPPhPmPiPvESA_); + LIB_FUNCTION("iOTsJTR6Y9U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplate4InitEiPKcib); + LIB_FUNCTION("73qbxKjBH0o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplate7DestroyEv); + LIB_FUNCTION("Vj7HiXK-tTg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplateC1Ev); + LIB_FUNCTION("hw-UPUK9T+w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplateC2Ev); + LIB_FUNCTION("cXYOwTVAuMs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplateD0Ev); + LIB_FUNCTION("Bm74HLvoNY4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplateD1Ev); + LIB_FUNCTION("h6XPsGpHAtc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12HttpTemplateD2Ev); + LIB_FUNCTION("jr0OcEeQJ8o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamBufferixEi); + LIB_FUNCTION("rCRh3V03bPs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm); + LIB_FUNCTION("2SKuIvr9sYU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPNS0_9StreamCtxEPvmPm); + LIB_FUNCTION("f1ncwa-JXlA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm); + LIB_FUNCTION("z8qO7hql4Fs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPNS0_9StreamCtxEPvmPm); + LIB_FUNCTION("oNqSobbGC80", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPvmPm); + LIB_FUNCTION("MSMPXUL5AuM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl); + LIB_FUNCTION("fJB07vDf7no", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleEPNS0_9StreamCtxElPl); + LIB_FUNCTION("etMUeqIhN+w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEcl); + LIB_FUNCTION("SP2010+gtqw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEPNS0_9StreamCtxEcl); + LIB_FUNCTION("Z1MRG-L+V0o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamWriter5WriteEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm); + LIB_FUNCTION("vHaV+tsSVu4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("u9s1aUWSZB0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm); + LIB_FUNCTION("gimH2zdBANg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12WorkerThread10ThreadMainEv); + LIB_FUNCTION("YKz2oBW3ZkM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12WorkerThreadC1EPNS0_9WorkQueueE); + LIB_FUNCTION("L9Ty-fG1IM4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12WorkerThreadC2EPNS0_9WorkQueueE); + LIB_FUNCTION("f5L6ax7EWHk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12WorkerThreadD0Ev); + LIB_FUNCTION("PvGTq9AGFfk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12WorkerThreadD1Ev); + LIB_FUNCTION("+qB+WcQlMio", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np12WorkerThreadD2Ev); + LIB_FUNCTION("4nCyBD9jBus", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13JsonDocParser5ParseEPKcm); + LIB_FUNCTION("sgh9D+MBBKA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13JsonDocParser9GetResultEPPNS0_10JsonObjectE); + LIB_FUNCTION("lZWmdDoBDmI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13JsonDocParser9GetResultEPPNS0_9JsonValueE); + LIB_FUNCTION("yPmQcnrgR2Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13JsonDocParserC2EP16SceNpAllocatorExPK7JsonDef); + LIB_FUNCTION("p5hRe1k4Wlg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13JsonDocParserD0Ev); + LIB_FUNCTION("iFOXfoXRHFQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13JsonDocParserD1Ev); + LIB_FUNCTION("xS-Hjw1psYs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13JsonDocParserD2Ev); + LIB_FUNCTION("X0vEo7cZamA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecret5ClearEv); + LIB_FUNCTION("IjOpzNzl57o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC1EPKvm); + LIB_FUNCTION("bC4+qi0mqJE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC1ERK16SceNpTitleSecret); + LIB_FUNCTION("fYr7Ahl-vNA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC1ERKS1_); + LIB_FUNCTION("08AQ2wYpzpk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC1Ev); + LIB_FUNCTION("Ft-VezxSErk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC2EPKvm); + LIB_FUNCTION("9QN7g5mQgCU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC2ERK16SceNpTitleSecret); + LIB_FUNCTION("JHG9CTmkdQw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC2ERKS1_); + LIB_FUNCTION("K1+uzxxReX0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretC2Ev); + LIB_FUNCTION("dJRIc7d5iqU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretD0Ev); + LIB_FUNCTION("XBzzdzT3qyg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretD1Ev); + LIB_FUNCTION("QDlnJL6stA0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13NpTitleSecretD2Ev); + LIB_FUNCTION("RPv5L-o5qRQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemory4ctorEv); + LIB_FUNCTION("NfhXX6LFmj8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemory4dtorEv); + LIB_FUNCTION("BkuxOAPlMMw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemory4InitEm); + LIB_FUNCTION("do0t--lEKMM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemory6ExpandEm); + LIB_FUNCTION("zdRXyt-65kA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemory6IsInitEv); + LIB_FUNCTION("Za00SEoNA2A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemory7DestroyEv); + LIB_FUNCTION("lGIw3qfqI60", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemoryC2EP16SceNpAllocatorEx); + LIB_FUNCTION("70qFzq4z3UI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemoryD0Ev); + LIB_FUNCTION("C1TJsMv9wb8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemoryD1Ev); + LIB_FUNCTION("EaxLv8TfsrM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np13RingBufMemoryD2Ev); + LIB_FUNCTION("j6CorpmdjRk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContext4InitEPKcimm); + LIB_FUNCTION("oLpLfV2Ov9A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContext4InitEPKNS1_5ParamE); + LIB_FUNCTION("C282U0P6Nwg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContext7DestroyEv); + LIB_FUNCTION("dV+zK-Ce-2E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContextC1Ev); + LIB_FUNCTION("j4IAvbKKTzw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContextC2Ev); + LIB_FUNCTION("WR4mjQeqz6s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContextD0Ev); + LIB_FUNCTION("S+a+rgnGX8A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContextD1Ev); + LIB_FUNCTION("wY9g+hVxLTM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14CalloutContextD2Ev); + LIB_FUNCTION("PYBehFWVd60", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilder12BuildBufSizeEv); + LIB_FUNCTION("cLdoHqi5Ezg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilder16EscapeJsonStringEPKcPcmPm); + LIB_FUNCTION("V5xX2eroaWY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilder23EscapeJsonStringBufSizeEPKc); + LIB_FUNCTION("irex3q-O6po", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilder5BuildEPcmPm); + LIB_FUNCTION("ikFI73f3hP4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilderC1ERKNS0_9JsonValueE); + LIB_FUNCTION("dhJGQPKLmn0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilderC2ERKNS0_9JsonValueE); + LIB_FUNCTION("wDLaq7IgfIc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilderD0Ev); + LIB_FUNCTION("Kfv9jPxf7qA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilderD1Ev); + LIB_FUNCTION("MH0LyghLJEE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np14JsonDocBuilderD2Ev); + LIB_FUNCTION("pCIB7QX5e1g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np15CancelableScope3EndEiPKciS3_); + LIB_FUNCTION("Etvu03IpTEc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np15CancelableScope5BeginEPNS0_6HandleEPKciS5_); + LIB_FUNCTION("pp88xnRgJrM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np15CancelableScopeC2Ev); + LIB_FUNCTION("E8yuDNYbzl0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np15CancelableScopeD0Ev); + LIB_FUNCTION("km5-rjNjSFk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np15CancelableScopeD1Ev); + LIB_FUNCTION("xpLjHhJBhpo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np15CancelableScopeD2Ev); + LIB_FUNCTION("LCk8T5b1h+4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np16StreamReadBufferC2EP16SceNpAllocatorEx); + LIB_FUNCTION("ZufKqNXItD0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np16StreamReadBufferD1Ev); + LIB_FUNCTION("bH7ljyLOsBw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np16StreamReadBufferD2Ev); + LIB_FUNCTION("et05S+nkWG8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPool13InvalidateAllEv); + LIB_FUNCTION("Vzob5RCgfnY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPool4InitEi); + LIB_FUNCTION("iBdEFRdfpgg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPool7DestroyEv); + LIB_FUNCTION("PznfSvchYJ8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPoolC1EP16SceNpAllocatorEx); + LIB_FUNCTION("-2TYwZ4ERbM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPoolC2EP16SceNpAllocatorEx); + LIB_FUNCTION("5HWP63cOH+w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPoolD0Ev); + LIB_FUNCTION("kTfkKhcdW5Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPoolD1Ev); + LIB_FUNCTION("3MVW8+eWnjs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18HttpConnectionPoolD2Ev); + LIB_FUNCTION("ELa6nMcCO9w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("UHj0GDTA2CU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamReaderC1EPKvm); + LIB_FUNCTION("WXRruhGp9dI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamReaderC2EPKvm); + LIB_FUNCTION("gA0CaCjJpg0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamReaderD0Ev); + LIB_FUNCTION("oULMh4JVC4o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamReaderD1Ev); + LIB_FUNCTION("rNJ1+3KoZP4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamReaderD2Ev); + LIB_FUNCTION("VxKQGrudnzk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("Lkdm2yqZN1c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamWriterC1EPvm); + LIB_FUNCTION("abQ7xd3yVXM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamWriterC2EPvm); + LIB_FUNCTION("TXJnPiKuTf8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamWriterD0Ev); + LIB_FUNCTION("3VdCUl+DkNw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamWriterD1Ev); + LIB_FUNCTION("YmOVGwSJmzk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np18MemoryStreamWriterD2Ev); + LIB_FUNCTION("INZSjlRcuyQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np20BufferedStreamReader4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("3Ku9r8b6gCg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np20BufferedStreamReader5CloseEv); + LIB_FUNCTION("l6s7aomzWGA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np20BufferedStreamReaderC2EP16SceNpAllocatorEx); + LIB_FUNCTION("i28bR54-QFQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np20BufferedStreamReaderD0Ev); + LIB_FUNCTION("Tgr66MThOxA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np20BufferedStreamReaderD1Ev); + LIB_FUNCTION("PHWvRXbOnYs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np20BufferedStreamReaderD2Ev); + LIB_FUNCTION("7dyKpPHU+Yk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient10DisconnectEv); + LIB_FUNCTION("prj9aMR74bA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient11IsConnectedEv); + LIB_FUNCTION("r7UpNm1Po9s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient16invokeSyncMethodEjPKvmPvPmm); + LIB_FUNCTION("+EQNga+wsPc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient4ctorEv); + LIB_FUNCTION("2h59YqPcrdM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient4dtorEv); + LIB_FUNCTION("iRH-NE2evR4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient4InitEPKNS2_6ConfigE); + LIB_FUNCTION("CGKtxL26XqI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient7ConnectEPKvm); + LIB_FUNCTION("+xvhXA8Ci4E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClient7DestroyEv); + LIB_FUNCTION("6aKYLBS8Di8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClientC1Ev); + LIB_FUNCTION("dqjlsaUX0sc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClientC2Ev); + LIB_FUNCTION("3LuoWoXJ1WI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClientD0Ev); + LIB_FUNCTION("DRbjyNom-BE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClientD1Ev); + LIB_FUNCTION("J1lpiTKAEuk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc10IpmiClientD2Ev); + LIB_FUNCTION( + "aQzxfON3l2Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc13ServiceClientC1EPNS1_17ServiceIpmiClientEPKNS1_17ServiceClientInfoE); + LIB_FUNCTION( + "Mx6wrcdGC2w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc13ServiceClientC2EPNS1_17ServiceIpmiClientEPKNS1_17ServiceClientInfoE); + LIB_FUNCTION("uvYTUK5xYG8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient10DisconnectEv); + LIB_FUNCTION("fFGPlE0oNhw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient10EndRequestEii); + LIB_FUNCTION("F2xYmg5DiR4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient11findServiceEi); + LIB_FUNCTION("G4FYQtsjOX0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient11InitServiceEi); + LIB_FUNCTION("0rqwC4+sgzU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient11TermServiceEi); + LIB_FUNCTION("oCx3mVNvqzU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient11WaitRequestEiij); + LIB_FUNCTION("tQOrMf4KtIo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient12AbortRequestEii); + LIB_FUNCTION("9aiQo-uRPJY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient12BeginRequestEii); + LIB_FUNCTION("H35UsHYlhB4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient13CreateRequestEPiiPKvm); + LIB_FUNCTION("cMj7li0eXgw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient13DeleteRequestEii); + LIB_FUNCTION("+ZC8QYB-BA8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient13PollEventFlagEijmjPm); + LIB_FUNCTION("4GZ9O-OrfzE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient13WaitEventFlagEijmjPmj); + LIB_FUNCTION("q+uCQLffwQE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient14PollEventQueueEiPvm); + LIB_FUNCTION("bH08FzR5rFU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient15CancelEventFlagEijm); + LIB_FUNCTION("stUzNgtFmtY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient15RegisterServiceEPKNS1_17ServiceClientInfoE); + LIB_FUNCTION("fqAS9GQTmOU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient16RegisterServicesEPKNS1_17ServiceClientInfoE); + LIB_FUNCTION("BJCXJJCi0Zc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient17invokeInitServiceEi); + LIB_FUNCTION("GuruEy9Q-Zk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient17invokeTermServiceEi); + LIB_FUNCTION("k9jCtANC+QM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient17UnregisterServiceEi); + LIB_FUNCTION("8TpAxZoLLRw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient18EndRequestForAsyncEii); + LIB_FUNCTION("1ONFW86TETY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient19WaitRequestForAsyncEiij); + LIB_FUNCTION("nQm4o5iOye0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient20AbortRequestForAsyncEii); + LIB_FUNCTION( + "ktb6iOBLnd4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient20BeginRequestForAsyncEiiPN4IPMI6Client12EventNotifeeE); + LIB_FUNCTION("v5Z2LAKua28", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient21CreateRequestForAsyncEPiiPKvm); + LIB_FUNCTION("7oJpAd+vJQA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient21DeleteRequestForAsyncEii); + LIB_FUNCTION("KxlKRHLf9AY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient4ctorEv); + LIB_FUNCTION("s+dG6iqG7j0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient4dtorEv); + LIB_FUNCTION("qFdG8Ucfeqg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient4InitEPNS2_6ConfigE); + LIB_FUNCTION("NTPZ5GZIA6U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient7ConnectEPKvm); + LIB_FUNCTION("IGngArGbzHo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClient7DestroyEv); + LIB_FUNCTION("FubuBXanVWk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClientC1Ev); + LIB_FUNCTION("zARyDXgocuk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClientC2Ev); + LIB_FUNCTION("PmsH4f3z8Yk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClientD0Ev); + LIB_FUNCTION("90XdvAqFFn8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClientD1Ev); + LIB_FUNCTION("agYDXAyL-K8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np3ipc17ServiceIpmiClientD2Ev); + LIB_FUNCTION("n9pzAHeCCVU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Cond4ctorEv); + LIB_FUNCTION("BtXPJQEg41Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Cond4dtorEv); + LIB_FUNCTION("wWTqVcTnep8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Cond4InitEPKcPNS0_5MutexE); + LIB_FUNCTION("SLPuaDLbeD4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Cond4WaitEj); + LIB_FUNCTION("OQiPXR6gfj0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Cond6SignalEv); + LIB_FUNCTION("I5uzTXxbziU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Cond7DestroyEv); + LIB_FUNCTION("-hchsElmzXY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Cond9SignalAllEv); + LIB_FUNCTION("3z5EPY-ph14", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4CondC1Ev); + LIB_FUNCTION("6nW8WXQYRgM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4CondC2Ev); + LIB_FUNCTION("AKiHGWhC2KU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4CondD0Ev); + LIB_FUNCTION("yX9ISVXv+0M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4CondD1Ev); + LIB_FUNCTION("6RQRpTn+-cc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4CondD2Ev); + LIB_FUNCTION("6r6ssbPbKc4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Path11BuildAppendEPcmcPKcm); + LIB_FUNCTION("vfBKsg+lKWc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Path12AddDelimiterEPcmc); + LIB_FUNCTION("BqFx1VLEMPk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Path5ClearEv); + LIB_FUNCTION("AcG6blobOQE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Path6SetStrEPKcm); + LIB_FUNCTION("0fwoTW7gqfM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4PathD0Ev); + LIB_FUNCTION("-3UvpBs-26g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4PathD1Ev); + LIB_FUNCTION("1nF0eXrBZYM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np4PathD2Ev); + LIB_FUNCTION("KhoD7EapiYI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time10AddMinutesEl); + LIB_FUNCTION("PgiCaoqRKKc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time10AddSecondsEl); + LIB_FUNCTION("vINvzJOaqws", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time12GetUserClockEPS1_); + LIB_FUNCTION("dLNhHwYyt4c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time15AddMicroSecondsEl); + LIB_FUNCTION("WZqwoPoMzFA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time15GetNetworkClockEPS1_); + LIB_FUNCTION("fimORKx4RDg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time20GetDebugNetworkClockEPS1_); + LIB_FUNCTION("++qSDotsHuE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time7AddDaysEl); + LIB_FUNCTION("Zc+a6k6i7gY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4Time8AddHoursEl); + LIB_FUNCTION("Fgm7cz6AX4k", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4TimeplERK10SceRtcTick); + LIB_FUNCTION("F9khEfgTmsE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np4TimeplERKS1_); + LIB_FUNCTION("I1kBZV6keO4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5Mutex4ctorEv); + LIB_FUNCTION("mo+gaebiE+M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5Mutex4dtorEv); + LIB_FUNCTION("aTNOl9EB4V4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5Mutex4InitEPKcj); + LIB_FUNCTION("VM+CXTW4F-s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5Mutex4LockEv); + LIB_FUNCTION("eYgHIWx0Hco", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5Mutex6UnlockEv); + LIB_FUNCTION("RgGW4f0ox1g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5Mutex7DestroyEv); + LIB_FUNCTION("TJNrs69haak", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5Mutex7TryLockEv); + LIB_FUNCTION("O1AvlQU33pI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np5MutexC1Ev); + LIB_FUNCTION("2beu2bHw6qo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np5MutexC2Ev); + LIB_FUNCTION("omf1GoUEJCA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np5MutexD0Ev); + LIB_FUNCTION("9zi9FTPol74", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np5MutexD1Ev); + LIB_FUNCTION("CI7ciM21NXs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np5MutexD2Ev); + LIB_FUNCTION("uuyEiBHghY4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np5NpEnv8GetNpEnvEPS1_); + LIB_FUNCTION("-c9QK+CpQLg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Handle10CancelImplEi); + LIB_FUNCTION("ifqJb-V1QZw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Handle4InitEv); + LIB_FUNCTION("1atFu71dFAU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Handle7DestroyEv); + LIB_FUNCTION("KUJtztDMJYY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6HandleC1Ev); + LIB_FUNCTION("OhpofCxYOJc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6HandleC2Ev); + LIB_FUNCTION("ZOHgNNSZq4Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6HandleD0Ev); + LIB_FUNCTION("YWt5S4-cg9c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6HandleD1Ev); + LIB_FUNCTION("dt0A2cWjwLs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6HandleD2Ev); + LIB_FUNCTION("1x0jThSUr4w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectdaEPv); + LIB_FUNCTION("4il4PZAZOnQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectdaEPvR14SceNpAllocator); + LIB_FUNCTION("q2USyzLF4kI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectdaEPvR16SceNpAllocatorEx); + LIB_FUNCTION("CnDHI7sU+l0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectdlEPv); + LIB_FUNCTION("05KEwpDf4Ls", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectdlEPvR14SceNpAllocator); + LIB_FUNCTION("iwDNdnEGyhI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx); + LIB_FUNCTION("V75N47uYdQc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectnaEmR14SceNpAllocator); + LIB_FUNCTION("bKMVqRcCQ1U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx); + LIB_FUNCTION("0syNkhJANVw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectnwEmR14SceNpAllocator); + LIB_FUNCTION("orRb69nSo64", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx); + LIB_FUNCTION("Ehkz-BkTPwI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread12DoThreadMainEv); + LIB_FUNCTION("3CJl5ewd7-0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread4ctorEv); + LIB_FUNCTION("-3gV5N2u-sc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread4dtorEv); + LIB_FUNCTION("EqX45DhWUpo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread4InitEPKcimm); + LIB_FUNCTION("OoK0Ah0l1ko", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread4InitEPKNS1_5ParamE); + LIB_FUNCTION("ne77q1GOlF8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread4JoinEPi); + LIB_FUNCTION("VNKdE2Dgp0Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread5StartEv); + LIB_FUNCTION("sPti0OkVM8c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread7DestroyEv); + LIB_FUNCTION("uphWwLZAuXA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread9EntryFuncEPv); + LIB_FUNCTION("gnwCmkY-V70", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread9GetResultEv); + LIB_FUNCTION("qy4V8O+snLU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np6Thread9IsRunningEv); + LIB_FUNCTION("0f3ylOQJwqE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6ThreadC2Ev); + LIB_FUNCTION("MEYMyfJxWXg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6ThreadD0Ev); + LIB_FUNCTION("0Q5aKjYErBA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6ThreadD1Ev); + LIB_FUNCTION("6750DaF5Pas", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, _ZN3sce2np6ThreadD2Ev); + LIB_FUNCTION("xxOTJpEyoj4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7Callout10IsTimedoutEv); + LIB_FUNCTION("Zw3QlKu49eM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7Callout11CalloutFuncEPv); + LIB_FUNCTION("14PDhhMEBKY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7Callout4StopEv); + LIB_FUNCTION("TDuC6To9HJ8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7Callout5StartEjPNS1_7HandlerE); + LIB_FUNCTION("r0PYNWZLZS8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7Callout5StartEmPNS1_7HandlerE); + LIB_FUNCTION("3ErXia+y89M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7Callout9IsStartedEv); + LIB_FUNCTION("XEXFdmQj5oI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7CalloutC1EPNS0_14CalloutContextE); + LIB_FUNCTION("Bpay3NjseSU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7CalloutC2EPNS0_14CalloutContextE); + LIB_FUNCTION("Fx2UwoQVVmo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7CalloutD0Ev); + LIB_FUNCTION("kUitiIVR43g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7CalloutD1Ev); + LIB_FUNCTION("ebomQLbpptw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7CalloutD2Ev); + LIB_FUNCTION("YtzL-Rso9bk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7HttpUri5BuildEPKS1_PcmPmj); + LIB_FUNCTION("Xp92SsA5atA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7HttpUri5ParseEPS1_PKc); + LIB_FUNCTION("LL9z5QvmwaA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7HttpUriC1EP16SceNpAllocatorEx); + LIB_FUNCTION("q4G7qxTJWps", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7HttpUriC2EP16SceNpAllocatorEx); + LIB_FUNCTION("w+C8QXqZKSw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7HttpUriD0Ev); + LIB_FUNCTION("wSCKvDDBPy4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7HttpUriD1Ev); + LIB_FUNCTION("D-dT+vERWmU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7HttpUriD2Ev); + LIB_FUNCTION("oaSKGgwTWG0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf14CheckinForReadEm); + LIB_FUNCTION("78yvwepeL7U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf15CheckinForWriteEm); + LIB_FUNCTION("d8NGGmSEFfU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf15CheckoutForReadEPm); + LIB_FUNCTION("E2QFpAcDPq4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf16CheckoutForWriteEPm); + LIB_FUNCTION("1P-MUvbtyTM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf4ctorEv); + LIB_FUNCTION("rvz8xYxhMW0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf4dtorEv); + LIB_FUNCTION("IL3Wk7QuRhA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf4InitEPvm); + LIB_FUNCTION("kDaQLJv89bs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf4PeekEmPvm); + LIB_FUNCTION("Mg-IhL6SWfg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf4ReadEPvm); + LIB_FUNCTION("IZOGdJ+LFFU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf5ClearEv); + LIB_FUNCTION("8Y5OOBb0B5Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf5WriteEPKvm); + LIB_FUNCTION("u-TlLaJUJEA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBuf7DestroyEv); + LIB_FUNCTION("L5BnZpuQImk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBufC1Ev); + LIB_FUNCTION("e2a1ZA+lJC4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBufC2Ev); + LIB_FUNCTION("hfJ1gGLgvq8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBufD0Ev); + LIB_FUNCTION("7w+LeZ5ymys", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBufD1Ev); + LIB_FUNCTION("9+NmoosRoBA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np7RingBufD2Ev); + LIB_FUNCTION("d+xJZ63-wrc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8HttpFile4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("jcPO4bt5i3o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8HttpFile5CloseEv); + LIB_FUNCTION("RXdPqxVnrvo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8HttpFileC2EP16SceNpAllocatorEx); + LIB_FUNCTION("T2w3ndcG-+Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8HttpFileD0Ev); + LIB_FUNCTION("6fomUWNk6Xc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8HttpFileD1Ev); + LIB_FUNCTION("WAat5MtCKpc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8HttpFileD2Ev); + LIB_FUNCTION("uDyILPgHF9Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8JsonBool5ClearEv); + LIB_FUNCTION("FdpYFbq5C3Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8JsonBool7SetBoolEb); + LIB_FUNCTION("mFZezLIogNI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8JsonFile5CloseEv); + LIB_FUNCTION("hqPavTyQlNg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8JsonFileD0Ev); + LIB_FUNCTION("wzqAM7IYGzU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8JsonFileD1Ev); + LIB_FUNCTION("QFYVZvAJNC8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8JsonFileD2Ev); + LIB_FUNCTION("88GKkivBFhI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8JsonNull5ClearEv); + LIB_FUNCTION("WcLP8wPB9X4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommId5BuildERKS1_Pcm); + LIB_FUNCTION("LnjjzlJ+L5c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommId5ClearEv); + LIB_FUNCTION("1TjLUwirok0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommId5ParseEPS1_PKc); + LIB_FUNCTION("UrJocI5M8GY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommId5ParseEPS1_PKcm); + LIB_FUNCTION("To1XvNOzjo0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdC1ERK20SceNpCommunicationId); + LIB_FUNCTION("N6SkkX1GkFU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdC1ERKS1_); + LIB_FUNCTION("AQyiYChNI0c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdC1Ev); + LIB_FUNCTION("WywlusFissg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId); + LIB_FUNCTION("rB0oqLSjH6g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdC2ERKS1_); + LIB_FUNCTION("BBtBjx9-bMI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdC2Ev); + LIB_FUNCTION("XeCZTzqIk2k", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdD0Ev); + LIB_FUNCTION("EPJbX73AVeU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdD1Ev); + LIB_FUNCTION("hP18CDS6eBU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8NpCommIdD2Ev); + LIB_FUNCTION("5WuiSZkU3mg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8Selector4InitEPKc); + LIB_FUNCTION("2HkOOhiWK3M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8SelectorD0Ev); + LIB_FUNCTION("asZdig1mPlA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8SelectorD1Ev); + LIB_FUNCTION("PA9VYFAVKIE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8SelectorD2Ev); + LIB_FUNCTION("2YbS+GhInZQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItem10SetPendingEv); + LIB_FUNCTION("XUCjhejJvPc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItem10SetRunningEv); + LIB_FUNCTION("-91vFSqiuKw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItem11SetFinishedEi); + LIB_FUNCTION("zepqHjfGe0M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItem14FinishCallbackEv); + LIB_FUNCTION("3rGzxcMK-Mg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItem15RemoveFromQueueEv); + LIB_FUNCTION("Oq5aepLkEWg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItem6CancelEi); + LIB_FUNCTION("gnh2cpEgSS8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItem9BindQueueEPNS0_9WorkQueueEi); + LIB_FUNCTION("HldN461O2Dw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItemC2EPKc); + LIB_FUNCTION("Y-I66cSNp+A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItemD0Ev); + LIB_FUNCTION("dnwItoXLoy4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItemD1Ev); + LIB_FUNCTION("ga4OW9MGahU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np8WorkItemD2Ev); + LIB_FUNCTION("8i-vOVRVt5w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag3SetEm); + LIB_FUNCTION("vhbvgH7wWiE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag4ctorEv); + LIB_FUNCTION("5nM4Yy92Qwg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag4dtorEv); + LIB_FUNCTION("5Wy+JxpCBxg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag4OpenEPKc); + LIB_FUNCTION("37Rd2JS+FCM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag4PollEmjPm); + LIB_FUNCTION("1s+c3SG0WYc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag4WaitEmjPmj); + LIB_FUNCTION("03UlDLFsTfw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag5ClearEm); + LIB_FUNCTION("wJ-k9+UShJg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag6CancelEm); + LIB_FUNCTION("amFi-Av19hU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag6CreateEPKcj); + LIB_FUNCTION("QlaBcxSFPZI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlag7DestroyEv); + LIB_FUNCTION("cMOgkE2M2e8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlagC1Ev); + LIB_FUNCTION("Uv1IQpTWecw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlagC2Ev); + LIB_FUNCTION("uHOOEbuzjEQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlagD0Ev); + LIB_FUNCTION("WWW4bvT-rSw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlagD1Ev); + LIB_FUNCTION("RpWWfCEs9xA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9EventFlagD2Ev); + LIB_FUNCTION("jDDvll2aQpQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans10SetTimeoutEPKNS1_12TimeoutParamE); + LIB_FUNCTION("+hKyaJJCE+0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans11SendRequestEPNS0_6HandleEPKvm); + LIB_FUNCTION("EhLaOnhdcXo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans12RecvResponseEPNS0_6HandleEPvmPm); + LIB_FUNCTION("fV+Q5a6p+zQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans12SkipResponseEPNS0_6HandleE); + LIB_FUNCTION("Qfsmqs-bHeY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans16AddRequestHeaderEPKcS3_); + LIB_FUNCTION("6bYsRATI3tQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans16SetRequestHeaderEPKcS3_); + LIB_FUNCTION("WoFp77mNyw0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans21GetResponseStatusCodeEPNS0_6HandleEPi); + LIB_FUNCTION("RJOlguLEy-E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans21SetRequestContentTypeEPKc); + LIB_FUNCTION("ws3x3yjUyeE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans23SetRequestContentLengthEm); + LIB_FUNCTION("YW09CP0Vrtw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans24GetResponseContentLengthEPNS0_6HandleEPbPm); + LIB_FUNCTION("JEYp0T1VC58", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans4InitERKNS0_12HttpTemplateEPNS0_18HttpConnectionPoolEiPKcm); + LIB_FUNCTION( + "O+FeLkOM7w0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans4InitERKNS0_12HttpTemplateEPNS0_18HttpConnectionPoolEiPKcS8_tS8_m); + LIB_FUNCTION("aWo+7jvpllY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("cocNRQpq+NA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("2e9GLlHTKA4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTrans7DestroyEv); + LIB_FUNCTION("sqNxD6H5ZOQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTransC1EP16SceNpAllocatorEx); + LIB_FUNCTION("HEeXBdgvJI4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTransC2EP16SceNpAllocatorEx); + LIB_FUNCTION("Pe9fHKX7krE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTransD0Ev); + LIB_FUNCTION("ls8yIODZmzc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTransD1Ev); + LIB_FUNCTION("GSVe-aaTiEg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9HttpTransD2Ev); + LIB_FUNCTION("4cIJxNKQK5g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonArray12AddItemArrayEPPS1_); + LIB_FUNCTION("cWsZswBMjqg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonArray5ClearEv); + LIB_FUNCTION("aCZjveAsynw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonValue12GetItemValueEi); + LIB_FUNCTION("aIV+HI6llz4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonValue13GetFieldValueEiPPKc); + LIB_FUNCTION("BDie4qEtKuA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonValue13GetFieldValueEPKc); + LIB_FUNCTION("LotC9rVP3Lo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonValueD0Ev); + LIB_FUNCTION("hBuLbn3mGBw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonValueD1Ev); + LIB_FUNCTION("FfSNfBmn+K8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9JsonValueD2Ev); + LIB_FUNCTION("PsP6LYRZ7Dc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFile4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("Flyyg6hzUOM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFile4SeekEliPl); + LIB_FUNCTION("YtvLEI7uZRI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFile4SyncEv); + LIB_FUNCTION("9q+h2q5YprU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFile5CloseEv); + LIB_FUNCTION("0xL7AwgxphE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFile5WriteEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("haDbtVOmaao", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFile6RemoveEPKc); + LIB_FUNCTION("Sgo7wy9okFI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFile8TruncateEl); + LIB_FUNCTION("QWlZu1JZOww", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFileC1Ev); + LIB_FUNCTION("HP4jsVYqBKg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFileC2Ev); + LIB_FUNCTION("-n0CR0QxhnY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFileD0Ev); + LIB_FUNCTION("3eoh4hjcYag", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFileD1Ev); + LIB_FUNCTION("s-C88O6Y8iU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9LocalFileD2Ev); + LIB_FUNCTION("euE6Yo5hkrY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleId5BuildERKS1_Pcm); + LIB_FUNCTION("a76a3D9Adts", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleId5ClearEv); + LIB_FUNCTION("4O8lYvForpk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleId5ParseEPS1_PKc); + LIB_FUNCTION("-swgMjedLUQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleId5ParseEPS1_PKcm); + LIB_FUNCTION("Fcvdbqpwpnw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdC1ERK12SceNpTitleId); + LIB_FUNCTION("wd+YWDKMTQE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdC1ERKS1_); + LIB_FUNCTION("-Ja2aT6A3fg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdC1Ev); + LIB_FUNCTION("9n60S+t4Cxs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId); + LIB_FUNCTION("IefAhNUAivM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdC2ERKS1_); + LIB_FUNCTION("OL7DU1kkm+4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdC2Ev); + LIB_FUNCTION("rFcQRK+GMcQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdD0Ev); + LIB_FUNCTION("TGJ5bE+Fb1s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdD1Ev); + LIB_FUNCTION("XKVRBLdw+7I", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9NpTitleIdD2Ev); + LIB_FUNCTION("zurkNUps5o8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9RefObject6AddRefEv); + LIB_FUNCTION("5tYi1l9CXD0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9RefObject7ReleaseEv); + LIB_FUNCTION("brUrttJp6MM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9RefObjectC1Ev); + LIB_FUNCTION("JRtw5pROOiM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9RefObjectC2Ev); + LIB_FUNCTION("8DrClRz7Z2U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9RefObjectD0Ev); + LIB_FUNCTION("lPQzOhwPjuw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9RefObjectD1Ev); + LIB_FUNCTION("417JucZaE3g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9RefObjectD2Ev); + LIB_FUNCTION("EFffsPLsOio", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9Semaphore4OpenEPKc); + LIB_FUNCTION("hQLw6eE4O44", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9Semaphore4WaitEj); + LIB_FUNCTION("wcOCedFKan4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9Semaphore6CreateEiiPKc); + LIB_FUNCTION("b7qnGORh+H4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9Semaphore6SignalEv); + LIB_FUNCTION("Es-CwSVnalY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9Semaphore7DestroyEv); + LIB_FUNCTION("Tuth2BRl4x0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9SemaphoreC1Ev); + LIB_FUNCTION("8k1rNqvczTc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9SemaphoreC2Ev); + LIB_FUNCTION("S6luQz76AQ4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9SemaphoreD0Ev); + LIB_FUNCTION("nW9XeX3eokI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9SemaphoreD1Ev); + LIB_FUNCTION("OukNoRur97E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9SemaphoreD2Ev); + LIB_FUNCTION("F2umEBpQFHc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue11GetItemByIdEi); + LIB_FUNCTION("wM4q1JMisvA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue15GetFinishedItemENS0_14WorkItemStatusE); + LIB_FUNCTION("UYAD7sUQcYU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue16WorkItemFinishedEPNS0_8WorkItemEi); + LIB_FUNCTION("-9cU3y6rXVM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue17ProcFinishedItemsENS0_14WorkItemStatusE); + LIB_FUNCTION("ovc4ZvD0YjY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue18RemoveFinishedItemEPNS0_8WorkItemE); + LIB_FUNCTION("vPju3W13byw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue18WaitForPendingItemEPPNS0_8WorkItemEPb); + LIB_FUNCTION("XMIv42L5bEA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue4ctorEv); + LIB_FUNCTION("wESN-qrVhOU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue4dtorEv); + LIB_FUNCTION("+dGO+GS2ZXQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue4InitEPKcimm); + LIB_FUNCTION("U0YoWwgg8aI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue4InitEPKNS0_6Thread5ParamE); + LIB_FUNCTION("4DE+nnCVRPA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue4StopEv); + LIB_FUNCTION("VnQolo6vTr4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue5StartEv); + LIB_FUNCTION("laqZEULcfgw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue6CancelEii); + LIB_FUNCTION("CznMfhTIvVY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue6IsInitEv); + LIB_FUNCTION("NeopmYshD0U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue7DestroyEv); + LIB_FUNCTION("KQSxXJBepQ4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue7EnqueueEiPNS0_8WorkItemE); + LIB_FUNCTION("zmOmSLnqlBQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue9CancelAllEi); + LIB_FUNCTION("eTy3L1azX4E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueue9IsRunningEv); + LIB_FUNCTION("X6NVkdpRnog", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueueC1Ev); + LIB_FUNCTION("p+bd65J177I", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueueC2Ev); + LIB_FUNCTION("uyNO0GnFhPw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueueD0Ev); + LIB_FUNCTION("1QFKnDJxk3A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueueD1Ev); + LIB_FUNCTION("AIDhc3KCK7w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2np9WorkQueueD2Ev); + LIB_FUNCTION("XLpPRMl5jro", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERK10SceRtcTickRKNS0_4TimeE); + LIB_FUNCTION("6jHOZ6fItFU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERK12SceNpTitleIdRKNS0_9NpTitleIdE); + LIB_FUNCTION("i+xzwYeeEtk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERK16SceNpTitleSecretRKNS0_13NpTitleSecretE); + LIB_FUNCTION("ZWZ9KqoIvQY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERK20SceNpCommunicationIdRKNS0_8NpCommIdE); + LIB_FUNCTION("Vsj50ZwNUFM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_13NpTitleSecretERK16SceNpTitleSecret); + LIB_FUNCTION("WM5DPO-LryU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_13NpTitleSecretES3_); + LIB_FUNCTION("ps246w9eXI8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_4TimeERK10SceRtcTick); + LIB_FUNCTION("UVLmT9lzRYA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_4TimeES3_); + LIB_FUNCTION("WaNQzws1ATU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_8NpCommIdERK20SceNpCommunicationId); + LIB_FUNCTION("E-mYAG-aa1A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_8NpCommIdES3_); + LIB_FUNCTION("FmDmhB16wwE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_9NpTitleIdERK12SceNpTitleId); + LIB_FUNCTION("niXN2N4o3yY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npeqERKNS0_9NpTitleIdES3_); + LIB_FUNCTION("gKruhA35EXQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npgeERK10SceRtcTickRKNS0_4TimeE); + LIB_FUNCTION("1mnghWFX0wQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npgeERKNS0_4TimeERK10SceRtcTick); + LIB_FUNCTION("svAQxJ3yow4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npgeERKNS0_4TimeES3_); + LIB_FUNCTION("oVZ6spoeeN0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npgtERK10SceRtcTickRKNS0_4TimeE); + LIB_FUNCTION("snloJp6qQCc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npgtERKNS0_4TimeERK10SceRtcTick); + LIB_FUNCTION("EFES6UR65oU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npgtERKNS0_4TimeES3_); + LIB_FUNCTION("UIrMxV07mL0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npleERK10SceRtcTickRKNS0_4TimeE); + LIB_FUNCTION("cAeFZE72SXU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npleERKNS0_4TimeERK10SceRtcTick); + LIB_FUNCTION("ttA9TcO06uA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npleERKNS0_4TimeES3_); + LIB_FUNCTION("rVtImV4rxSA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npltERK10SceRtcTickRKNS0_4TimeE); + LIB_FUNCTION("nVB1Nsjwpj0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npltERKNS0_4TimeERK10SceRtcTick); + LIB_FUNCTION("d0zSLZMER34", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npltERKNS0_4TimeES3_); + LIB_FUNCTION("MVY+jtY-WiQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERK10SceRtcTickRKNS0_4TimeE); + LIB_FUNCTION("tDs31ASQGV8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERK12SceNpTitleIdRKNS0_9NpTitleIdE); + LIB_FUNCTION("OwsjgCQyZUI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERK16SceNpTitleSecretRKNS0_13NpTitleSecretE); + LIB_FUNCTION("O5QkjyiPM4c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERK20SceNpCommunicationIdRKNS0_8NpCommIdE); + LIB_FUNCTION("7b5y1XSa+KQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_13NpTitleSecretERK16SceNpTitleSecret); + LIB_FUNCTION("zbliTwZKRyU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_13NpTitleSecretES3_); + LIB_FUNCTION("yXMjXN--3rY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_4TimeERK10SceRtcTick); + LIB_FUNCTION("cnoM7EjlLe4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_4TimeES3_); + LIB_FUNCTION("SM7OEf11LCA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_8NpCommIdERK20SceNpCommunicationId); + LIB_FUNCTION("QQCqBHk79sI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_8NpCommIdES3_); + LIB_FUNCTION("ONgEITYl9mA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_9NpTitleIdERK12SceNpTitleId); + LIB_FUNCTION("9pp9-dwqIHM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZN3sce2npneERKNS0_9NpTitleIdES3_); + LIB_FUNCTION("KyDWNwpREH4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10Cancelable6IsInitEv); + LIB_FUNCTION("VI8AHrfLdqY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10EventQueue6IsInitEv); + LIB_FUNCTION("jxPY-0x8e-M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10EventQueue7IsEmptyEv); + LIB_FUNCTION("COxqqhvLSyM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10JsonNumber5CloneEP16SceNpAllocatorEx); + LIB_FUNCTION("m+dAaZ5pyO4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10JsonNumber6GetNumEPcm); + LIB_FUNCTION("Sk8AdNQUDm8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10JsonNumber6GetNumEPi); + LIB_FUNCTION("nHgo2VpnCB8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10JsonNumber6GetNumEPj); + LIB_FUNCTION("Agsyrf4L8uA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10JsonNumber6GetNumEPl); + LIB_FUNCTION("P2cGbJ5nD1w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np10JsonNumber6GetNumEPm); + LIB_FUNCTION("EcboqmwkrMY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np9JsonArray5CloneEP16SceNpAllocatorEx); + LIB_FUNCTION("JcAsZlyr3Mo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np9JsonValue12GetItemValueEi); + LIB_FUNCTION("XZTZqqSVGlY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np9NpTitleId7IsEmptyEv); + LIB_FUNCTION("sreH33xjV0A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZNK3sce2np9Semaphore6IsInitEv); + LIB_FUNCTION("QwO4sr6XzSY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np10MemoryFile5WriteEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("ojBk-UJxzWw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np10MemoryFileD0Ev); + LIB_FUNCTION("8S1mWU-N9kM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np10MemoryFileD1Ev); + LIB_FUNCTION("eRlqlofFKYg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("zWIFe+d77PU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np9HttpTransD0Ev); + LIB_FUNCTION("GG1Y+vBUkdU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np9HttpTransD1Ev); + LIB_FUNCTION("+3ySpB1buMs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np9LocalFile5WriteEPNS0_6HandleEPKvmPm); + LIB_FUNCTION("hSnLhjGefsU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np9LocalFileD0Ev); + LIB_FUNCTION("q3s6++iIzjE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn16_N3sce2np9LocalFileD1Ev); + LIB_FUNCTION("E6GYo9uzjds", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np10MemoryFile4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("7bzUdBtIQhE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np10MemoryFileD0Ev); + LIB_FUNCTION("lNs-oTKpG9s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np10MemoryFileD1Ev); + LIB_FUNCTION("xDrWJARfCbk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np6Handle10CancelImplEi); + LIB_FUNCTION("YqMS-iAjFY8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np6HandleD0Ev); + LIB_FUNCTION("lUsG1QfgVN4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np6HandleD1Ev); + LIB_FUNCTION("G+v692ul7MA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np9HttpTrans4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("sGhCzaJf+jQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np9HttpTransD0Ev); + LIB_FUNCTION("PUqCtFwnNvA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np9HttpTransD1Ev); + LIB_FUNCTION("NtsHoOq2ao4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np9LocalFile4ReadEPNS0_6HandleEPvmPm); + LIB_FUNCTION("Gh35wbyg4U8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np9LocalFileD0Ev); + LIB_FUNCTION("kD3l0P19Wzg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZThn8_N3sce2np9LocalFileD1Ev); + LIB_FUNCTION("IvTsS4VJq1w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np10JsonNumberE); + LIB_FUNCTION("aLGD1kOLQXE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np10JsonObjectE); + LIB_FUNCTION("1At86OClqtY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np10JsonStringE); + LIB_FUNCTION("jsHe99x6l0w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np8JsonBoolE); + LIB_FUNCTION("A742Lh-FnVE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np8JsonNullE); + LIB_FUNCTION("FfXZGW1TMvo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np8SelectorE); + LIB_FUNCTION("0qrLVqNUn2Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np9JsonArrayE); + LIB_FUNCTION("S8TLtKfZCfc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + _ZTVN3sce2np9JsonValueE); + LIB_FUNCTION("MWPOkqzYss0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpAllocateKernelMemoryNoAlignment); + LIB_FUNCTION("gMlY6eewr-c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpAllocateKernelMemoryWithAlignment); + LIB_FUNCTION("jGF+MaB4b-M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpArchInit); + LIB_FUNCTION("UskWpVWxSvg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpArchTerm); + LIB_FUNCTION("+9+kKMY9YIw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpAtomicCas32); + LIB_FUNCTION("Yohe0MMDfj0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpAtomicDec32); + LIB_FUNCTION("pfJgSA4jO3M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpAtomicInc32); + LIB_FUNCTION("l67qBmMmKP4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpBase64Decoder); + LIB_FUNCTION("pu39pU8UgCo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpBase64Encoder); + LIB_FUNCTION("a5IfPlpchXI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpBase64GetDecodeSize); + LIB_FUNCTION("moGcgMNTHvQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpBase64UrlDecoder); + LIB_FUNCTION("IeNj+OcWgU8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpBase64UrlEncoder); + LIB_FUNCTION("7BjZKcN+oZ4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpBase64UrlGetDecodeSize); + LIB_FUNCTION("9+m5nRdJ-wQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCalloutInitCtx); + LIB_FUNCTION("fClnlkZmA6k", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpCalloutStartOnCtx); + LIB_FUNCTION("lpr66Gby8dQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpCalloutStartOnCtx64); + LIB_FUNCTION("in19gH7G040", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCalloutStopOnCtx); + LIB_FUNCTION("AqJ4xkWsV+I", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCalloutTermCtx); + LIB_FUNCTION("kb2thTuS8t8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCancelEventFlag); + LIB_FUNCTION("9pLoHoPMxeg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpClearEventFlag); + LIB_FUNCTION("+nmn+Z0nWDo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCloseEventFlag); + LIB_FUNCTION("8hPzfjZzV88", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCloseSema); + LIB_FUNCTION("i8UmXTSq7N4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCmpNpId); + LIB_FUNCTION("TcwEFnakiSc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCmpNpIdInOrder); + LIB_FUNCTION("dj+O5aD2a0Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCmpOnlineId); + LIB_FUNCTION("1a+iY5YUJcI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCondDestroy); + LIB_FUNCTION("q2tsVO3lM4A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCondInit); + LIB_FUNCTION("uMJFOA62mVU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCondSignal); + LIB_FUNCTION("bsjWg59A7aE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCondSignalAll); + LIB_FUNCTION("bAHIOyNnx5Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCondSignalTo); + LIB_FUNCTION("ss2xO9IJxKQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCondTimedwait); + LIB_FUNCTION("fZShld2PQ7w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCondWait); + LIB_FUNCTION("6jFWpAfqAcc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCreateEventFlag); + LIB_FUNCTION("LHZtCT2W1Pw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCreateSema); + LIB_FUNCTION("fhJ5uKzcn0w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpCreateThread); + LIB_FUNCTION("90pmGqDK4BI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpDbgAssignDebugId); + LIB_FUNCTION("Etq15-l9yko", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpDbgDumpBinary); + LIB_FUNCTION("ZaKa5x61hGA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpDbgDumpText); + LIB_FUNCTION("sjnIeFCuTD0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpDeleteEventFlag); + LIB_FUNCTION("xPrF2nGPBXQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpDeleteSema); + LIB_FUNCTION("OQTweRLgFr8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpEventGetCurrentNetworkTick); + LIB_FUNCTION("vjwlDmsGtME", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpFreeKernelMemory); + LIB_FUNCTION("QmDEFikd3VA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpGetNavSdkVersion); + LIB_FUNCTION("sXVQUIGmk2U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpGetPlatformType); + LIB_FUNCTION("Z3mnqcGmf8E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpGetProcessId); + LIB_FUNCTION("pJlGhXEt5CU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpGetRandom); + LIB_FUNCTION("Pglk7zFj0DI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpGetSdkVersion); + LIB_FUNCTION("ljqnF0hmLjo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpGetSdkVersionUInt); + LIB_FUNCTION("PVVsRmMkO1g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpGetSystemClockUsec); + LIB_FUNCTION("-gN6uE+zWng", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpGlobalHeapGetAllocator); + LIB_FUNCTION("VUHUasztbUY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpGlobalHeapGetAllocatorEx); + LIB_FUNCTION("P4YpPziLBd4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpGlobalHeapGetAllocatorExPtr); + LIB_FUNCTION("DI5n4aOdxmk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpGlobalHeapGetAllocatorPtr); + LIB_FUNCTION("wVdn78HKc30", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpHeapDestroy); + LIB_FUNCTION("lvek8w7yqyE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpHeapGetAllocator); + LIB_FUNCTION("2jdHoPpS+W0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpHeapGetStat); + LIB_FUNCTION("B+yGIX1+BTI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpHeapInit); + LIB_FUNCTION("evz0-93ucJc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpHeapShowStat); + LIB_FUNCTION("Hvpr+otU4bo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpHexToInt); + LIB_FUNCTION("5y0wMPQkaeU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpInt32ToStr); + LIB_FUNCTION("HoPC33siDD4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpInt64ToStr); + LIB_FUNCTION("G6qytFoBJ-w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpIntGetPlatformType); + LIB_FUNCTION("fY4XQoA20i8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpIntIsOnlineIdString); + LIB_FUNCTION("hkeX9iuCwlI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpIntIsValidOnlineId); + LIB_FUNCTION("X6emt+LbSEI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpIntSetPlatformType); + LIB_FUNCTION("TWPY1x1Atys", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpIntToHex); + LIB_FUNCTION("kgDwlmy78k0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpIpc2ClientInit); + LIB_FUNCTION("CI2p6Viee9w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpIpc2ClientTerm); + LIB_FUNCTION("EjMsfO3GCIA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpJoinThread); + LIB_FUNCTION("vJGDnNh4I0g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpJsonParse); + LIB_FUNCTION("RgfCYkjW7As", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpJsonParseBuf); + LIB_FUNCTION("SnAdybtBK3o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpJsonParseBufInit); + LIB_FUNCTION("p5ZkSMRR7AU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpJsonParseEx); + LIB_FUNCTION("nhgjiwPUIzI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpJsonParseExInit); + LIB_FUNCTION("teVnFAL6GNY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpJsonParseInit); + LIB_FUNCTION("zNb6IxegrCE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwCondDestroy); + LIB_FUNCTION("++eqYdzB8Go", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwCondInit); + LIB_FUNCTION("Xkn6VoN-wuQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwCondSignal); + LIB_FUNCTION("FJ4DCt8VzVE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwCondSignalAll); + LIB_FUNCTION("Bwi+EP8VQ+g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwCondSignalTo); + LIB_FUNCTION("ExeLuE3EQCQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwCondWait); + LIB_FUNCTION("4zxevggtYrQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwMutexDestroy); + LIB_FUNCTION("1CiXI-MyEKs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwMutexInit); + LIB_FUNCTION("18j+qk6dRwk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwMutexLock); + LIB_FUNCTION("hp0kVgu5Fxw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwMutexTryLock); + LIB_FUNCTION("CQG2oyx1-nM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpLwMutexUnlock); + LIB_FUNCTION("dfXSH2Tsjkw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpMemoryHeapDestroy); + LIB_FUNCTION("FaMNvjMA6to", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpMemoryHeapGetAllocator); + LIB_FUNCTION("xHAiSVEEjSI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpMemoryHeapGetAllocatorEx); + LIB_FUNCTION("kZizwrFvWZY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpMemoryHeapInit); + LIB_FUNCTION("lQ11BpMM4LU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpMutexDestroy); + LIB_FUNCTION("uEwag-0YZPc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpMutexInit); + LIB_FUNCTION("r9Bet+s6fKc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpMutexLock); + LIB_FUNCTION("DuslmoqQ+nk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpMutexTryLock); + LIB_FUNCTION("oZyb9ktuCpA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpMutexUnlock); + LIB_FUNCTION("5DkyduAF2rs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpOpenEventFlag); + LIB_FUNCTION("-blITIdtUd0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpOpenSema); + LIB_FUNCTION("ZoXUrTiwKNw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpPanic); + LIB_FUNCTION("9YmBJ8KF9eI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpPollEventFlag); + LIB_FUNCTION("xmF0yIF4iXc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpPollSema); + LIB_FUNCTION("VMjIo2Z-aW0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpRtcConvertToPosixTime); + LIB_FUNCTION("W0YWLVDndx0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpRtcFormatRFC3339); + LIB_FUNCTION("LtkeQwMIEWY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpRtcParseRFC3339); + LIB_FUNCTION("0lZHbA-HRD0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpServerErrorJsonGetErrorCode); + LIB_FUNCTION("cRabutqUG7c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpServerErrorJsonMultiGetErrorCode); + LIB_FUNCTION("WSQxnAVLKgw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpServerErrorJsonParse); + LIB_FUNCTION("UbStlMKTBeU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpServerErrorJsonParseInit); + LIB_FUNCTION("hbe+DdooIi4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpServerErrorJsonParseMultiInit); + LIB_FUNCTION("29ftOGIrUCo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpSetEventFlag); + LIB_FUNCTION("m9JzZSoDVFY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpSetPlatformType); + LIB_FUNCTION("-W28+9p1CKI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpSignalSema); + LIB_FUNCTION("i5TP5NLmkoQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrBuildHex); + LIB_FUNCTION("ivnnssCwjGI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrcpyToBuf); + LIB_FUNCTION("PHrpHMSU8Cs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrncpyToBuf); + LIB_FUNCTION("h1SWCcBdImo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrnParseHex); + LIB_FUNCTION("DUHzVPNlugg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrParseHex); + LIB_FUNCTION("fElyBSn-l24", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrToInt32); + LIB_FUNCTION("CwqYdG4TrjA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrToInt64); + LIB_FUNCTION("uj86YxCYid0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrToUInt32); + LIB_FUNCTION("Ted2YU9lv94", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpStrToUInt64); + LIB_FUNCTION("yvaNTRiKXmo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpThreadGetId); + LIB_FUNCTION("rRN89jBArEM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUInt32ToStr); + LIB_FUNCTION("QjNUYQbGoHA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUInt64ToStr); + LIB_FUNCTION("Gh74vNl06sg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUserGetUserIdList); + LIB_FUNCTION("N3tAHlBnowE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilBuildTitleId); + LIB_FUNCTION("4mEAk-UKVNw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilCanonicalizeNpIdForPs4); + LIB_FUNCTION("N3FB4r8JoRE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilCanonicalizeNpIdForPsp2); + LIB_FUNCTION("xPRHNaD3kTc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilCmpAccountId); + LIB_FUNCTION("owm52JoZ8uc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetDateSetAuto); + LIB_FUNCTION("1Gfhi+tZ9IE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetDbgCommerce); + LIB_FUNCTION("kBON3bAtfGs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilGetEnv); + LIB_FUNCTION("MUj0IV6XFGs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetFakeDisplayNameMode); + LIB_FUNCTION("O86rgZ2azfg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetFakeRateLimit); + LIB_FUNCTION("FrxliFYAO8Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetIgnoreNpTitleId); + LIB_FUNCTION("GRvK1ZE+FEQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilGetNpDebug); + LIB_FUNCTION("OFiFmfsADas", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetNpLanguageCode); + LIB_FUNCTION("X9CqyP164Hc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetNpLanguageCode2); + LIB_FUNCTION("Fxux7Ob+Ynk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetNpLanguageCode2Str); + LIB_FUNCTION("RfiA17kV+xs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetNpLanguageCodeStr); + LIB_FUNCTION("OA8f3KF9JsM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetNpTestPatch); + LIB_FUNCTION("KCk4OGu8+sc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilGetNthChar); + LIB_FUNCTION("fB5hE65pzbU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetShareTitleCheck); + LIB_FUNCTION("SXUNKr9Zkv0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetSystemLanguage); + LIB_FUNCTION("AjzLvR0g5Zs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilGetTrcNotify); + LIB_FUNCTION("pmHBFJyju9E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetWebApi2FakeRateLimit); + LIB_FUNCTION("ZRxKp9vjcNc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetWebApi2FakeRateLimitTarget); + LIB_FUNCTION("4CqfNm3pisU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilGetWebTraceSetting); + LIB_FUNCTION("ajoqGz0D9Dw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilHttpUrlEncode); + LIB_FUNCTION("458yjI+OECI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilJidToNpId); + LIB_FUNCTION("EftEB4kmkSg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilJsonEscape); + LIB_FUNCTION("vj04qzp7uKY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilJsonGetOneChar); + LIB_FUNCTION("4YJ5gYtRAAE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilJsonUnescape); + LIB_FUNCTION("KyB1IAY2BiU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilNpIdToJid); + LIB_FUNCTION("c+ssxRf1Si0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilNumChars); + LIB_FUNCTION("oz2SlXNAnuI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilParseJid); + LIB_FUNCTION("EfnfZtjjyR0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilParseTitleId); + LIB_FUNCTION("okX7IjW0QsI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilSerializeJid); + LIB_FUNCTION("5bBPLZV49kY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilXmlEscape); + LIB_FUNCTION("Ls4eWDrbNmg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, + sceNpUtilXmlGetOneChar); + LIB_FUNCTION("+0rj9KhmYb0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpUtilXmlUnescape); + LIB_FUNCTION("ZbdPHUm7jOY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpWaitEventFlag); + LIB_FUNCTION("6adrFGe2cpU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpWaitSema); + LIB_FUNCTION("fEcrs9UPPyo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpXmlParse); + LIB_FUNCTION("MCLGkfBmw4c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, sceNpXmlParseInit); + LIB_FUNCTION("AP1XjC3ZZt8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_00FD578C2DD966DF); + LIB_FUNCTION("ATGi6oBon0w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0131A2EA80689F4C); + LIB_FUNCTION("AUQ8VIY73SA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_01443C54863BDD20); + LIB_FUNCTION("AbxVvcXAra0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_01BC55BDC5C0ADAD); + LIB_FUNCTION("AdHs9XUPQOg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_01D1ECF5750F40E8); + LIB_FUNCTION("AgpHmnT1+6w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_020A479A74F5FBAC); + LIB_FUNCTION("Akr14dlHKrU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_024AF5E1D9472AB5); + LIB_FUNCTION("AnxdSIcTprM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_027C5D488713A6B3); + LIB_FUNCTION("Av6dlMaFg1U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_02FE9D94C6858355); + LIB_FUNCTION("BB808ccNFcE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_041F34F1C70D15C1); + LIB_FUNCTION("BTCx0nYRQkg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0530B1D276114248); + LIB_FUNCTION("Bl2qFOnHOtk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_065DAA14E9C73AD9); + LIB_FUNCTION("Bq-05dBCvD4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_06AFF4E5D042BC3E); + LIB_FUNCTION("Bu42kpn3OZc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_06EE369299F73997); + LIB_FUNCTION("B8ktn412thc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_07C92D9F8D76B617); + LIB_FUNCTION("B+kRdJjx5L8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_07E9117498F1E4BF); + LIB_FUNCTION("CPPgrzZk8nU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_08F3E0AF3664F275); + LIB_FUNCTION("Cpk3wB7yE3U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0A9937C01EF21375); + LIB_FUNCTION("CsvmrMujh20", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0ACBE6ACCBA3876D); + LIB_FUNCTION("CuB9M1RRDOY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0AE07D3354510CE6); + LIB_FUNCTION("Cuw8NCrme3w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0AEC3C342AE67B7C); + LIB_FUNCTION("CzGEIMEefCM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0B318420C11E7C23); + LIB_FUNCTION("C7bDewPzXYk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0BB6C37B03F35D89); + LIB_FUNCTION("C76Kms3ZD98", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0BBE8A9ACDD90FDF); + LIB_FUNCTION("DHtikF4iTpw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0C7B62905E224E9C); + LIB_FUNCTION("DTWRMRckGvk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0D35913117241AF9); + LIB_FUNCTION("DV7pXO7Yeac", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0D5EE95CEED879A7); + LIB_FUNCTION("DW+ySyerHaI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0D6FB24B27AB1DA2); + LIB_FUNCTION("DegDLVNKxBw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0DE8032D534AC41C); + LIB_FUNCTION("DfTMqdyp50I", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0DF4CCA9DCA9E742); + LIB_FUNCTION("DnRJsdPZjAE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0E7449B1D3D98C01); + LIB_FUNCTION("DncJS3dQyzc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0E77094B7750CB37); + LIB_FUNCTION("Dsqzl7bVBgM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0ECAB397B6D50603); + LIB_FUNCTION("Dx3h0eraKUg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0F1DE1D1EADA2948); + LIB_FUNCTION("D4r++h0mvxo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_0F8AFEFA1D26BF1A); + LIB_FUNCTION("EYgXEFYqa60", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_11881710562A6BAD); + LIB_FUNCTION("Ea-Yi70McNs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_11AFD88BBD0C70DB); + LIB_FUNCTION("EecEowpLiHc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_11E704A30A4B8877); + LIB_FUNCTION("ElAUhCRS+Us", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_125014842452F94B); + LIB_FUNCTION("Em8AceEcrEY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_126F0071E11CAC46); + LIB_FUNCTION("EpJtzzWZSwE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_12926DCF35994B01); + LIB_FUNCTION("Esx6v78xYY8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_12CC7ABFBF31618F); + LIB_FUNCTION("E8TlH0RZKqI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_13C4E51F44592AA2); + LIB_FUNCTION("FTMOfFYzglQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_15330E7C56338254); + LIB_FUNCTION("FWazWMq-JhI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1566B358CABF2612); + LIB_FUNCTION("FiWBjyaPRe8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1625818F268F45EF); + LIB_FUNCTION("FtMrQNKKmsI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_16D32B40D28A9AC2); + LIB_FUNCTION("GD9Eg729Jc0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_183F4483BDBD25CD); + LIB_FUNCTION("GIfp6Vr2Lz0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1887E9E95AF62F3D); + LIB_FUNCTION("GKPOlf2JPTo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_18A3CE95FD893D3A); + LIB_FUNCTION("GLNmXkhU5+k", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_18B3665E4854E7E9); + LIB_FUNCTION("GSOwA5SK9H4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1923B003948AF47E); + LIB_FUNCTION("GbUz2kxZpTI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_19B533DA4C59A532); + LIB_FUNCTION("G7OZdy22jgg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1BB399772DB68E08); + LIB_FUNCTION("HArGEtOilxs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1C0AC612D3A2971B); + LIB_FUNCTION("HFWZt3mZCkM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1C5599B779990A43); + LIB_FUNCTION("HMuylrBDF74", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1CCBB296B04317BE); + LIB_FUNCTION("HNBFVC+5MAI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1CD045542FB93002); + LIB_FUNCTION("HezspnOrd7c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1DECECA673AB77B7); + LIB_FUNCTION("HgPgJOJsGn8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1E03E024E26C1A7F); + LIB_FUNCTION("HxAXMrsNfiE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1F101732BB0D7E21); + LIB_FUNCTION("H00VPsPdR7s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1F4D153EC3DD47BB); + LIB_FUNCTION("H3xH9j+vDL4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1F7C47F63FAF0CBE); + LIB_FUNCTION("H74u5owPMbY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_1FBE2EE68C0F31B6); + LIB_FUNCTION("IDjBYokUuck", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2038C1628914B9C9); + LIB_FUNCTION("ID-LVv24anQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_203FCB56FDB86A74); + LIB_FUNCTION("IFacEHxssIw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_20569C107C6CB08C); + LIB_FUNCTION("IKstc07eVfA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_20AB2D734EDE55F0); + LIB_FUNCTION("IrEoEYD7Cl4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_22B1281180FB0A5E); + LIB_FUNCTION("IvGq2makSa4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_22F1AADA66A449AE); + LIB_FUNCTION("I4shXv-fPTA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_238B215EFFDF3D30); + LIB_FUNCTION("JOjsUdFJ+hU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_24E8EC51D149FA15); + LIB_FUNCTION("JXKOeKOWLAI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_25728E78A3962C02); + LIB_FUNCTION("JeZJocaJHAU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_25E649A1C6891C05); + LIB_FUNCTION("JkuKOLV3cF0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_264B8A38B577705D); + LIB_FUNCTION("Jm7QjcHIKg4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_266ED08DC1C82A0E); + LIB_FUNCTION("J7tN5iq1i60", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_27BB4DE62AB58BAD); + LIB_FUNCTION("KDqpahluouo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_283AA96A196EA2EA); + LIB_FUNCTION("KFMVo5CoWpQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_285315A390A85A94); + LIB_FUNCTION("KQSdux7zGU4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_29049DBB1EF3194E); + LIB_FUNCTION("Kfe6nDcyy0c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_29F7BA9C3732CB47); + LIB_FUNCTION("KnMt8zGsyzc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2A732DF331ACCB37); + LIB_FUNCTION("KqAWYOx1tvs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2AA01660EC75B6FB); + LIB_FUNCTION("KzfLzpQcFoE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2B37CBCE941C1681); + LIB_FUNCTION("LKo7ZNBUTlU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2CAA3B64D0544E55); + LIB_FUNCTION("LM15YX7BCnU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2CCD79617EC10A75); + LIB_FUNCTION("LNi2lxasBmc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2CD8B69716AC0667); + LIB_FUNCTION("LXT3wP+bXpw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2D74F7C0FF9B5E9C); + LIB_FUNCTION("LcpagIBUTpU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2DCA5A8080544E95); + LIB_FUNCTION("LmnydDznzlc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2E69F2743CE7CE57); + LIB_FUNCTION("Lq8fO6-wUn0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_2EAF1F3BAFF0527D); + LIB_FUNCTION("MUk+VbtOj2Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_31493E55BB4E8F66); + LIB_FUNCTION("MX7crQD7X14", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_317EDCAD00FB5F5E); + LIB_FUNCTION("MeAc+ooYzaI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_31E01CFA8A18CDA2); + LIB_FUNCTION("Mq-XgqBhtSY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_32AFD782A061B526); + LIB_FUNCTION("MrXN6wk7gYk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_32B5CDEB093B8189); + LIB_FUNCTION("NBVRUlE8k64", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_34155152513C93AE); + LIB_FUNCTION("NOTv-472yf4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_34E4EFFF8EF6C9FE); + LIB_FUNCTION("NXL6DVxUVjs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3572FA0D5C54563B); + LIB_FUNCTION("NnxHmyZODbk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_367C479B264E0DB9); + LIB_FUNCTION("NohPvJZLKcw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_36884FBC964B29CC); + LIB_FUNCTION("OGAIG7dVmUk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3860081BB7559949); + LIB_FUNCTION("OTFPfmdKsTI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_39314F7E674AB132); + LIB_FUNCTION("OgLngPzFVqU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3A02E780FCC556A5); + LIB_FUNCTION("Ohe4hbpISbY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3A17B885BA4849B6); + LIB_FUNCTION("OjjqyupeI6Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3A38EACAEA5E23A4); + LIB_FUNCTION("OzSl4H8NvB8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3B34A5E07F0DBC1F); + LIB_FUNCTION("O06P-AD8fqQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3B4E8FFC00FC7EA4); + LIB_FUNCTION("O6sY-aI1EHo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3BAB18FDA235107A); + LIB_FUNCTION("O9+ZlqCjPxE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3BDF9996A0A33F11); + LIB_FUNCTION("PBlS8aRcw3o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3C1952F1A45CC37A); + LIB_FUNCTION("PKN5Bs2wXzs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3CA37906CDB05F3B); + LIB_FUNCTION("PNspCKzuOm8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3CDB2908ACEE3A6F); + LIB_FUNCTION("PT7RZfK9zTM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3D3ED165F2BDCD33); + LIB_FUNCTION("PaTX0Vdfzc4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3DA4D7D1575FCDCE); + LIB_FUNCTION("Pd+2Es0Lx2k", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3DDFB612CD0BC769); + LIB_FUNCTION("PgQV4Wfercc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3E0415E167DEADC7); + LIB_FUNCTION("Pn6fDxWBweY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3E7E9F0F1581C1E6); + LIB_FUNCTION("PtOJ24KA7WU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3ED389DB8280ED65); + LIB_FUNCTION("Pwx-bAw1SH0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3F0C7F6C0C35487D); + LIB_FUNCTION("P9pyADie8NI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3FDA7200389EF0D2); + LIB_FUNCTION("P-PCWLpRblg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_3FF3C258BA516E58); + LIB_FUNCTION("QClFP2KKPF0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4029453F628A3C5D); + LIB_FUNCTION("QFgm3bSuU44", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_405826DDB4AE538E); + LIB_FUNCTION("QFqSZ1nyWGU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_405A926759F25865); + LIB_FUNCTION("QGYI-e566Io", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_406608FDEE7AE88A); + LIB_FUNCTION("QN2lVYwX3c8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_40DDA5558C17DDCF); + LIB_FUNCTION("QZ0S5S-2BmQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_419D12E52FF60664); + LIB_FUNCTION("QpblOUdL538", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4296E539474BE77F); + LIB_FUNCTION("QvQfxWPMNlQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_42F41FC563CC3654); + LIB_FUNCTION("Q8zIb0yTAmo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_43CCC86F4C93026A); + LIB_FUNCTION("RAn2C9q8ZeE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4409F60BDABC65E1); + LIB_FUNCTION("RWPHCuxnU4I", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4563C70AEC675382); + LIB_FUNCTION("ReZjcCGb0F4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_45E66370219BD05E); + LIB_FUNCTION("RmpU8HJ4VpY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_466A54F072785696); + LIB_FUNCTION("Rs0lNpdvIJo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_46CD2536976F209A); + LIB_FUNCTION("SGNxe9L90Vc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4863717BD2FDD157); + LIB_FUNCTION("SQLr0ZomMUk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4902EBD19A263149); + LIB_FUNCTION("SQT3-o2D9Aw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4904F7FE8D83F40C); + LIB_FUNCTION("Sl4T94Sr-Oc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4A5E13F784ABFCE7); + LIB_FUNCTION("S2XusTXBJ4E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4B65EEB135C12781); + LIB_FUNCTION("TBnUmXjaheI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4C19D49978DA85E2); + LIB_FUNCTION("TeXWIP9m8TY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4DE5D620FF66F136); + LIB_FUNCTION("ThcMErV6j54", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4E170C12B57A8F9E); + LIB_FUNCTION("Ti8-pAXDJgw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4E2F3FA405C3260C); + LIB_FUNCTION("Tqk1BXdRO00", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4EA9350577513B4D); + LIB_FUNCTION("T3jrb8S18h8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_4F78EB6FC4B5F21F); + LIB_FUNCTION("UDSL5DMRF7c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_50348BE4331117B7); + LIB_FUNCTION("UIx+jN0oHKo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_508C7E8CDD281CAA); + LIB_FUNCTION("UhwdLAKPWn4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_521C1D2C028F5A7E); + LIB_FUNCTION("Ui-ySjXmcpE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_522FF24A35E67291); + LIB_FUNCTION("VHD+kMJc3Uw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5470FE90C25CDD4C); + LIB_FUNCTION("VX8mD5pKzRg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_557F260F9A4ACD18); + LIB_FUNCTION("VYb5cgnzkes", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5586F97209F391EB); + LIB_FUNCTION("VbLJt62pXDw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_55B2C9B7ADA95C3C); + LIB_FUNCTION("VbSIo6VAuTY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_55B488A3A540B936); + LIB_FUNCTION("VkLf6Cr0MUM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5642DFE82AF43143); + LIB_FUNCTION("V04EbylK4Yc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_574E046F294AE187); + LIB_FUNCTION("V4km6-iqbL8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_578926EBF8AA6CBF); + LIB_FUNCTION("WF2l-GUIlrw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_585DA5FC650896BC); + LIB_FUNCTION("WNbrJzSewnY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_58D6EB27349EC276); + LIB_FUNCTION("WQa3MXlJhy0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5906B7317949872D); + LIB_FUNCTION("WRC1YUM1vnA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5910B5614335BE70); + LIB_FUNCTION("WT19qJEfCMk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_593D7DA8911F08C9); + LIB_FUNCTION("WXV-5qk7DVM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_59757FE6A93B0D53); + LIB_FUNCTION("WY5g+GKxFB4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_598E60F862B1141E); + LIB_FUNCTION("WkU1FmZoDa8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5A45351666680DAF); + LIB_FUNCTION("Wqvp6nAuan8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5AABE9EA702E6A7F); + LIB_FUNCTION("WupK5HI1W4A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5AEA4AE472355B80); + LIB_FUNCTION("WyDlPN5Zh0E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5B20E53CDE598741); + LIB_FUNCTION("W0gLWfrpR+A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5B480B59FAE947E0); + LIB_FUNCTION("W17sI2kKub0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5B5EEC23690AB9BD); + LIB_FUNCTION("XArFsK8+2uA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5C0AC5B0AF3EDAE0); + LIB_FUNCTION("XS6Zm+oHYtQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5D2E999BEA0762D4); + LIB_FUNCTION("XVW7-UURDhY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5D55BBFD45110E16); + LIB_FUNCTION("Xe4VQD0rtf0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_5DEE15403D2BB5FD); + LIB_FUNCTION("YCDHCMp0sTA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6020C708CA74B130); + LIB_FUNCTION("YG4UFVA8NNI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_606E1415503C34D2); + LIB_FUNCTION("YSFA6O6aaT4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_612140E8EE9A693E); + LIB_FUNCTION("YfE-VR2vYd8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_61F13F551DAF61DF); + LIB_FUNCTION("YgbTkTF1Iyg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6206D39131752328); + LIB_FUNCTION("Yh1FQ+8DRN4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_621D4543EF0344DE); + LIB_FUNCTION("YlmpqOVtAnM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6259A9A8E56D0273); + LIB_FUNCTION("Yl+ccBY0b04", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_625F9C7016346F4E); + LIB_FUNCTION("Yu+N90bNjEo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_62EF8DF746CD8C4A); + LIB_FUNCTION("Y20qmf0eays", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_636D2A99FD1E6B2B); + LIB_FUNCTION("aAE+32b+dCU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_68013EDF66FE7425); + LIB_FUNCTION("aXH3Bn3WOdE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6971F7067DD639D1); + LIB_FUNCTION("aYlq2zq0ELI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_69896ADB3AB410B2); + LIB_FUNCTION("ahOJqm5WE4c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6A1389AA6E561387); + LIB_FUNCTION("alVg2J8Ssuc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6A5560D89F12B2E7); + LIB_FUNCTION("ar+Zz4VKvPE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6ABF99CF854ABCF1); + LIB_FUNCTION("a0-dxlANjcs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6B4FDDC6500D8DCB); + LIB_FUNCTION("bKEdW0nRkoo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6CA11D5B49D1928A); + LIB_FUNCTION("bWwPth5tBxU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6D6C0FB61E6D0715); + LIB_FUNCTION("bXUHRf4TSPU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6D750745FE1348F5); + LIB_FUNCTION("bhrz+dCZFL4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6E1AF3F9D09914BE); + LIB_FUNCTION("blPtTAiypSE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6E53ED4C08B2A521); + LIB_FUNCTION("bvQ6yh7WuWg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6EF43ACA1ED6B968); + LIB_FUNCTION("b2+gnz4bamA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_6F6FA09F3E1B6A60); + LIB_FUNCTION("cDXDQMcZWQE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7035C340C7195901); + LIB_FUNCTION("cDjiHLXPZBs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7038E21CB5CF641B); + LIB_FUNCTION("cGNF3NpbpE0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_706345DCDA5BA44D); + LIB_FUNCTION("cSBxTr8Qvx8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7120714EBF10BF1F); + LIB_FUNCTION("cT0oqRvIA90", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_713D28A91BC803DD); + LIB_FUNCTION("cVO9dqU6oBI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7153BD76A53AA012); + LIB_FUNCTION("cVxiXMcEG2s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_715C625CC7041B6B); + LIB_FUNCTION("ceRnvbGHEdA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_71E467BDB18711D0); + LIB_FUNCTION("cg0XllwfTj8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_720D17965C1F4E3F); + LIB_FUNCTION("c0OAybz2W5o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_734380C9BCF65B9A); + LIB_FUNCTION("c-TAjM1LvM8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_73F4C08CCD4BBCCF); + LIB_FUNCTION("dEAxAbeynUY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_74403101B7B29D46); + LIB_FUNCTION("dSWwgazWb-Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7525B081ACD66FF4); + LIB_FUNCTION("db9Ed8E6Bco", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_75BF4477C13A05CA); + LIB_FUNCTION("dgl5P1mHxvc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7609793F5987C6F7); + LIB_FUNCTION("dhbtAbBHaao", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7616ED01B04769AA); + LIB_FUNCTION("dk+HPZGhJNg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_764F873D91A124D8); + LIB_FUNCTION("dwbx4SMFlWU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7706F1E123059565); + LIB_FUNCTION("d-LQfrbYBuY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_77F2D07EB6D806E6); + LIB_FUNCTION("ecNwTNzVnlc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_79C3704CDCD59E57); + LIB_FUNCTION("edoLuiE1FUU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_79DA0BBA21351545); + LIB_FUNCTION("efokR7Xz8MQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_79FA2447B5F3F0C4); + LIB_FUNCTION("ek1vZf9hlaU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7A4D6F65FF6195A5); + LIB_FUNCTION("ezGVzRFN7Oc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7B3195CD114DECE7); + LIB_FUNCTION("ezI48jAa020", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7B3238F2301AD36D); + LIB_FUNCTION("fHf8cHUKMmY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7C77FC70750A3266); + LIB_FUNCTION("fSOp3EWdbRg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7D23A9DC459D6D18); + LIB_FUNCTION("fVmIx0jQoF8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7D5988C748D0A05F); + LIB_FUNCTION("fZWXFHqZ9PQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7D9597147A99F4F4); + LIB_FUNCTION("filT9Afdg0Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7E2953F407DD8346); + LIB_FUNCTION("fuNOUJlwmzI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_7EE34E5099709B32); + LIB_FUNCTION("gEcOVRHVygA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_80470E5511D5CA00); + LIB_FUNCTION("gHF5cBwI8Gk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_807179701C08F069); + LIB_FUNCTION("gJboH-ryTkY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8096E81FFAF24E46); + LIB_FUNCTION("gLdk9PG4cEI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_80B764F4F1B87042); + LIB_FUNCTION("gL9pFDitAIs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_80BF691438AD008B); + LIB_FUNCTION("gM9s-JYBJEI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_80CF6CFC96012442); + LIB_FUNCTION("gOp3L4wFGf0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_80EA772F8C0519FD); + LIB_FUNCTION("gdCv0AhNMno", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_81D0AFD0084D327A); + LIB_FUNCTION("gh64pyF2-Wc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_821EB8A72176FD67); + LIB_FUNCTION("gtL6tUEnJz8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_82D2FAB54127273F); + LIB_FUNCTION("g2rmacQqWek", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_836AE669C42A59E9); + LIB_FUNCTION("hVmiW-7DUYw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8559A25BFEC3518C); + LIB_FUNCTION("hcH2bHZ6SdI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_85C1F66C767A49D2); + LIB_FUNCTION("hontE4P4e6c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8689ED1383F87BA7); + LIB_FUNCTION("h5bNnlNV06Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8796CD9E5355D3A6); + LIB_FUNCTION("h9N+tt3BnZk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_87D37EB6DDC19D99); + LIB_FUNCTION("iAqkj3D4T90", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_880AA48F70F84FDD); + LIB_FUNCTION("iXsHViCTZls", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_897B07562093665B); + LIB_FUNCTION("isr1XxY2gIc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8ACAF55F16368087); + LIB_FUNCTION("iuilWJsw1OA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8AE8A5589B30D4E0); + LIB_FUNCTION("iumXkJgxszE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8AE997909831B331); + LIB_FUNCTION("iy1kC+DQ+5k", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8B2D640BE0D0FB99); + LIB_FUNCTION("iz2atGaNrss", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8B3D9AB4668DAECB); + LIB_FUNCTION("i176qqzgtGw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8B5EFAAAACE0B46C); + LIB_FUNCTION("jCeUP0CpiNs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8C27943F40A988DB); + LIB_FUNCTION("jFQJbHX18tA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8C54096C75F5F2D0); + LIB_FUNCTION("jXZjoKUWiBQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8D7663A0A5168814); + LIB_FUNCTION("jmGPUJmU+tc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8E618F509994FAD7); + LIB_FUNCTION("jxnmzAZOK5g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8F19E6CC064E2B98); + LIB_FUNCTION("j2qK6u6SL-U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_8F6A8AEAEE922FF5); + LIB_FUNCTION("kBDhrY67+8o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_9010E1AD8EBBFBCA); + LIB_FUNCTION("kKlVoOcAGuk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_90A955A0E7001AE9); + LIB_FUNCTION("kPnWBn-uzAU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_90F9D6067FEECC05); + LIB_FUNCTION("k0jz0ZVGodo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_9348F3D19546A1DA); + LIB_FUNCTION("k9PAEdsZOIo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_93D3C011DB19388A); + LIB_FUNCTION("lW56T9n4kQM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_956E7A4FD9F89103); + LIB_FUNCTION("lfaZ4ELD5A8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_95F699E042C3E40F); + LIB_FUNCTION("lod7OaoOhzU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_96877B39AA0E8735); + LIB_FUNCTION("ls4HxJ7SNOo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_96CE07C49ED234EA); + LIB_FUNCTION("l2uxeCNbVoE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_976BB178235B5681); + LIB_FUNCTION("l4wLJeWIxNY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_978C0B25E588C4D6); + LIB_FUNCTION("mLomEr7yONY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_98BA2612BEF238D6); + LIB_FUNCTION("mVvdSTGvkTc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_995BDD4931AF9137); + LIB_FUNCTION("mWbjmpJrclA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_9966E39A926B7250); + LIB_FUNCTION("mcIwbxiWNGQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_99C2306F18963464); + LIB_FUNCTION("mcksYTt3a6c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_99C92C613B776BA7); + LIB_FUNCTION("mk5Lk4zIrTk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_9A4E4B938CC8AD39); + LIB_FUNCTION("myP3tLf3IIE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_9B23F7B4B7F72081); + LIB_FUNCTION("nA6u6ucFqNs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_9C0EAEEAE705A8DB); + LIB_FUNCTION("nUesWVRd6eg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_9D47AC59545DE9E8); + LIB_FUNCTION("oTBS2LGyrPo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A13052D8B1B2ACFA); + LIB_FUNCTION("oapD46ePb2I", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A1AA43E3A78F6F62); + LIB_FUNCTION("oeSM31Rknck", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A1E48CDF54649DC9); + LIB_FUNCTION("oufe5bCvXRQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A2E7DEE5B0AF5D14); + LIB_FUNCTION("ovXH-Z-xE-U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A2F5C7FD9FF113F5); + LIB_FUNCTION("o2KW4iadRrw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A36296E2269D46BC); + LIB_FUNCTION("o+4qe58NiK8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A3EE2A7B9F0D88AF); + LIB_FUNCTION("pEcfn34L+oI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A4471F9F7E0BFA82); + LIB_FUNCTION("pEm7pSHqNOE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A449BBA521EA34E1); + LIB_FUNCTION("pI5mbDNOcmw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A48E666C334E726C); + LIB_FUNCTION("pJt0SbTd5pw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A49B7449B4DDE69C); + LIB_FUNCTION("pXSEURJcnqQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A5748451125C9EA4); + LIB_FUNCTION("ppCijWSMwXY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A690A28D648CC176); + LIB_FUNCTION("pqht4bHLsdk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A6A86DE1B1CBB1D9); + LIB_FUNCTION("qPK7e4FXQKE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A8F2BB7B815740A1); + LIB_FUNCTION("qT9kwGpvc5c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_A93F64C06A6F7397); + LIB_FUNCTION("qzWSX8l9aqM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AB35925FC97D6AA3); + LIB_FUNCTION("rAFKosmR+ik", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AC014AA2C991FA29); + LIB_FUNCTION("rAbhCQFASus", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AC06E10901404AEB); + LIB_FUNCTION("rHXGiBNSNQU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AC75C68813523505); + LIB_FUNCTION("rUQbxJcILD4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AD441BC497082C3E); + LIB_FUNCTION("rU8l8CHTVMM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AD4F25F021D354C3); + LIB_FUNCTION("rfoEqFVBpP4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_ADFA04A85541A4FE); + LIB_FUNCTION("rpYQprUheiM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AE9610A6B5217A23); + LIB_FUNCTION("ryAZI4JvClg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AF201923826F0A58); + LIB_FUNCTION("r8AhtDico-o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_AFC021B4389CA3FA); + LIB_FUNCTION("sBXpmaM3PY8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B015E999A3373D8F); + LIB_FUNCTION("sDhLhhB-xlI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B0384B86107FC652); + LIB_FUNCTION("sMYwZTsxZWM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B0C630653B316563); + LIB_FUNCTION("sQDczYjVxz0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B100DCCD88D5C73D); + LIB_FUNCTION("sRo-6l5NnqQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B11A3FEA5E4D9EA4); + LIB_FUNCTION("suf43BmcC5M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B2E7F8DC199C0B93); + LIB_FUNCTION("s6thopb23cg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B3AB61A296F6DDC8); + LIB_FUNCTION("s-MvauYZ7II", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B3F32F6AE619EC82); + LIB_FUNCTION("tCJ6shO-jPU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B4227AB213BF8CF5); + LIB_FUNCTION("tGUr9CtgQ2A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B4652BF42B604360); + LIB_FUNCTION("tTbB8Tv+l8s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B536C1F13BFE97CB); + LIB_FUNCTION("tkXMJkGEvIk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B645CC264184BC89); + LIB_FUNCTION("tn4XsVgsb70", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B67E17B1582C6FBD); + LIB_FUNCTION("ttBHxddpWk0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B6D047C5D7695A4D); + LIB_FUNCTION("t17Y4epi78c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B75ED8E1EA62EFC7); + LIB_FUNCTION("t6mpRNvX4QA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B7A9A944DBD7E100); + LIB_FUNCTION("t8TnW+lPMfM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B7C4E75BE94F31F3); + LIB_FUNCTION("uIix+SxGQSE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B888B1F92C464121); + LIB_FUNCTION("uN7CJWSqBXs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B8DEC22564AA057B); + LIB_FUNCTION("ubrdHLu65Pg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_B9BADD1CBBBAE4F8); + LIB_FUNCTION("uqn3FpyF5Z8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_BAA9F7169C85E59F); + LIB_FUNCTION("uu5cOJCNYts", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_BAEE5C38908D62DB); + LIB_FUNCTION("vMhV6yUYP4Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_BCC855EB25183F84); + LIB_FUNCTION("vQH2NwKcc2Q", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_BD01F637029C7364); + LIB_FUNCTION("vdKfWscHflM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_BDD29F5AC7077E53); + LIB_FUNCTION("vtg90z7K1Q0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_BED83DD33ECAD50D); + LIB_FUNCTION("vufV0Jir9yg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_BEE7D5D098ABF728); + LIB_FUNCTION("wNsVzPWa5iw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C0DB15CCF59AE62C); + LIB_FUNCTION("wcIp-uD9YPo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C1C229FEE0FD60FA); + LIB_FUNCTION("wii5rWgpjpg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C228B9AD68298E98); + LIB_FUNCTION("wphSXO9vsoM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C298525CEF6FB283); + LIB_FUNCTION("w1Dwk1H21rU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C350F09351F6D6B5); + LIB_FUNCTION("w3QugPpYAxk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C3742E80FA580319); + LIB_FUNCTION("w8mFPV1NRdQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C3C9853D5D4D45D4); + LIB_FUNCTION("w-Xa1Pufw0A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C3F5DAD4FB9FC340); + LIB_FUNCTION("xF+w5MzprtY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C45FB0E4CCE9AED6); + LIB_FUNCTION("xJecuUi348c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C4979CB948B7E3C7); + LIB_FUNCTION("xJsluhbPC4w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C49B25BA16CF0B8C); + LIB_FUNCTION("xVE0XZYxIB4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C551345D9631201E); + LIB_FUNCTION("xXopRCE2gpg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C57A294421368298); + LIB_FUNCTION("xdyRytch1ig", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C5DC91CAD721D628); + LIB_FUNCTION("xt7O5YkTU1c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C6DECEE589135357); + LIB_FUNCTION("yB+LINZ6x40", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C81F8B20D67AC78D); + LIB_FUNCTION("yCD6VvrIe+o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C820FA56FAC87BEA); + LIB_FUNCTION("yHjqkRTF5JA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C878EA9114C5E490); + LIB_FUNCTION("yKgT6-9HdQk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C8A813EBFF477509); + LIB_FUNCTION("yWamY9WjVII", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C966A663D5A35482); + LIB_FUNCTION("yXxMZ-02dNM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C97C4C67FD3674D3); + LIB_FUNCTION("yZBVDxWEiwc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_C990550F15848B07); + LIB_FUNCTION("yllzeo7Bu74", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CA59737A8EC1BBBE); + LIB_FUNCTION("ysX96PgNe2U", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CAC5FDE8F80D7B65); + LIB_FUNCTION("yxNbMNBjm4M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CB135B30D0639B83); + LIB_FUNCTION("y4oaqmH2TDo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CB8A1AAA61F64C3A); + LIB_FUNCTION("y55nRnJYB1c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CB9E674672580757); + LIB_FUNCTION("zCudJerqqx0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CC2B9D25EAEAAB1D); + LIB_FUNCTION("zRslK77fW1M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CD1B252BBEDF5B53); + LIB_FUNCTION("zwA76Qy+Gic", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CF003BE90CBE1A27); + LIB_FUNCTION("zwCONIhKweI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_CF008E34884AC1E2); + LIB_FUNCTION("0Lj0s6NoerI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D0B8F4B3A3687AB2); + LIB_FUNCTION("0O4ZuOkfYPU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D0EE19B8E91F60F5); + LIB_FUNCTION("0SuSlL0OD1Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D12B9294BD0E0F56); + LIB_FUNCTION("0cyGJtj6Mos", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D1CC8626D8FA328B); + LIB_FUNCTION("0vorueuLY6w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D2FA2BB9EB8B63AC); + LIB_FUNCTION("0yGXiAz5POs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D32197880CF93CEB); + LIB_FUNCTION("0yb1wmzIG44", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D326F5C26CC81B8E); + LIB_FUNCTION("1PoGuVoyG3o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D4FA06B95A321B7A); + LIB_FUNCTION("1So3qQHgSyE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D52A37A901E04B21); + LIB_FUNCTION("1VBN-DmatAA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D5504DFC399AB400); + LIB_FUNCTION("1WEFyyf49dw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D56105CB27F8F5DC); + LIB_FUNCTION("1WirGSNeyxk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D568AB19235ECB19); + LIB_FUNCTION("1t979mOf5hE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D6DF7BF6639FE611); + LIB_FUNCTION("2GCKkDEZ10Y", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D8608A903119D746); + LIB_FUNCTION("2ej8cH1ZkU0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D9E8FC707D59914D); + LIB_FUNCTION("2fB55i3uWyk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_D9F079E62DEE5B29); + LIB_FUNCTION("2hfOTyl0hTY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DA17CE4F29748536); + LIB_FUNCTION("2kC579f2EYU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DA40B9EFD7F61185); + LIB_FUNCTION("2msnT+vCZmo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DA6B274FEBC2666A); + LIB_FUNCTION("2tAVNch6Ufw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DAD01535C87A51FC); + LIB_FUNCTION("20UR1EhRDsQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DB4511D448510EC4); + LIB_FUNCTION("247x--xmJpw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DB8EF1FFFC66269C); + LIB_FUNCTION("27UI+hudqPc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DBB508FA1B9DA8F7); + LIB_FUNCTION("3FnJuHC3KaI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DC59C9B870B729A2); + LIB_FUNCTION("3Gae1sv2dRw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DC669ED6CBF6751C); + LIB_FUNCTION("3LiihJpByZE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DCB8A2849A41C991); + LIB_FUNCTION("3Y+ZFtfwOvc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DD8F9916D7F03AF7); + LIB_FUNCTION("3cM-L05IDCo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DDC33F2F4E480C2A); + LIB_FUNCTION("3gtCC96LItc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_DE0B420BDE8B22D7); + LIB_FUNCTION("4MC8KYmP43A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E0C0BC29898FE370); + LIB_FUNCTION("4M2JPkb7Vbo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E0CD893E46FB55BA); + LIB_FUNCTION("4lUwFkt-ZZ8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E25530164B7F659F); + LIB_FUNCTION("42gvQ-33bFg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E3682F43FDF76C58); + LIB_FUNCTION("44F34ceKgPo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E38177E1C78A80FA); + LIB_FUNCTION("48p0z-ll3wo", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E3CA74CFF965DF0A); + LIB_FUNCTION("5FuxkbSbLtk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E45BB191B49B2ED9); + LIB_FUNCTION("5GW51rYObX0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E465B9D6B60E6D7D); + LIB_FUNCTION("5NgodsKWw4o", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E4D82876C296C38A); + LIB_FUNCTION("5N21NQ+ltTg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E4DDB5350FA5B538); + LIB_FUNCTION("5Uv-b7crx74", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E54BFF6FB72BC7BE); + LIB_FUNCTION("5ZKpMgMCC7s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E592A93203020BBB); + LIB_FUNCTION("5aRK9tfUiv0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E5A44AF6D7D48AFD); + LIB_FUNCTION("5jmpfPn-FDA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E639A97CF9FF1430); + LIB_FUNCTION("5qwBeeSKiSc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E6AC0179E48A8927); + LIB_FUNCTION("51FZZoJ3XYM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E751596682775D83); + LIB_FUNCTION("54ix5S74JwI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E788B1E52EF82702); + LIB_FUNCTION("6U8XYT9cnTE", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E94F17613F5C9D31); + LIB_FUNCTION("6VkBExKNVeA", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E9590113128D55E0); + LIB_FUNCTION("6eCw3RJWCxY", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_E9E0B0DD12560B16); + LIB_FUNCTION("6vXI7OZMewU", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_EAF5C8ECE64C7B05); + LIB_FUNCTION("65i-XELUp+s", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_EB98BF5C42D4A7EB); + LIB_FUNCTION("66vEqsQ6Row", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_EBABC4AAC43A468C); + LIB_FUNCTION("6-AAhfCCzIs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_EBF00085F082CC8B); + LIB_FUNCTION("7LZZ7gWNBq8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_ECB659EE058D06AF); + LIB_FUNCTION("7PCWq3UUh64", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_ECF096AB751487AE); + LIB_FUNCTION("7lonFwHbM8A", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_EE5A271701DB33C0); + LIB_FUNCTION("72TLahYlJI4", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_EF64CB6A1625248E); + LIB_FUNCTION("72yKNXx+2GM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_EF6C8A357C7ED863); + LIB_FUNCTION("8A-pT35pmZQ", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F00FE94F7E699994); + LIB_FUNCTION("8aUdujAykDg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F1A51DBA30329038); + LIB_FUNCTION("8hbnZqkP3BI", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F216E766A90FDC12); + LIB_FUNCTION("8qEFhKvl2Cw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F2A10584ABE5D82C); + LIB_FUNCTION("8tmdOV5UIaM", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F2D99D395E5421A3); + LIB_FUNCTION("84AB5Si6E3E", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F38001E528BA1371); + LIB_FUNCTION("857JyPp2h7M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F39EC9C8FA7687B3); + LIB_FUNCTION("86--3NYyd1w", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F3AFFFDCD632775C); + LIB_FUNCTION("87jf8zdIv9M", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F3B8DFF33748BFD3); + LIB_FUNCTION("9eR-lVD3oUc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F5E47F9550F7A147); + LIB_FUNCTION("9uk3FNGpOc8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F6E93714D1A939CF); + LIB_FUNCTION("9v0ZrUjk7wk", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F6FD19AD48E4EF09); + LIB_FUNCTION("90Tr-GIPfL8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F744EBFC620F7CBF); + LIB_FUNCTION("925FJay6zH8", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F76E4525ACBACC7F); + LIB_FUNCTION("95V6SIgvQss", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F7957A48882F42CB); + LIB_FUNCTION("96gLB4CbqDg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F7A80B07809BA838); + LIB_FUNCTION("+FccbMW2tZ0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F8571C6CC5B6B59D); + LIB_FUNCTION("+Xh8+oc4Nvs", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_F9787CFA873836FB); + LIB_FUNCTION("+nifbTTTg-g", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FA789F6D34D383F8); + LIB_FUNCTION("+rpXQIOsHmw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FABA574083AC1E6C); + LIB_FUNCTION("-AT9u642j7c", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FC04FDBBAE368FB7); + LIB_FUNCTION("-S2vvy5A7uc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FD2DAFBF2E40EEE7); + LIB_FUNCTION("-VXubTX5UK0", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FD55EE6D35F950AD); + LIB_FUNCTION("-lXuMgmNDVg", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FE55EE32098D0D58); + LIB_FUNCTION("-nmEECLh2hw", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FE79841022E1DA1C); + LIB_FUNCTION("--Sj4nn7RKc", "libSceNpCommon", 1, "libSceNpCommon", 1, 1, Func_FFF4A3E279FB44A7); +}; + +} // namespace Libraries::NpCommon \ No newline at end of file diff --git a/src/core/libraries/np_common/np_common.h b/src/core/libraries/np_common/np_common.h new file mode 100644 index 000000000..886610ccc --- /dev/null +++ b/src/core/libraries/np_common/np_common.h @@ -0,0 +1,1245 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::NpCommon { + +constexpr int ORBIS_NP_ONLINEID_MAX_LENGTH = 16; + +struct OrbisNpOnlineId { + char data[ORBIS_NP_ONLINEID_MAX_LENGTH]; + s8 term; + s8 dummy[3]; +}; + +struct OrbisNpId { + OrbisNpOnlineId handle; + u8 opt[8]; + u8 reserved[8]; +}; + +int PS4_SYSV_ABI sceNpCmpNpId(OrbisNpId* np_id1, OrbisNpId* np_id2); +int PS4_SYSV_ABI sceNpCmpNpIdInOrder(OrbisNpId* np_id1, OrbisNpId* np_id2, u32* out_result); +int PS4_SYSV_ABI sceNpCmpOnlineId(OrbisNpOnlineId* online_id1, OrbisNpOnlineId* online_id2); +int PS4_SYSV_ABI _sceNpAllocatorExConvertAllocator(); +int PS4_SYSV_ABI _sceNpAllocatorExFree(); +int PS4_SYSV_ABI _sceNpAllocatorExMalloc(); +int PS4_SYSV_ABI _sceNpAllocatorExRealloc(); +int PS4_SYSV_ABI _sceNpAllocatorExStrdup(); +int PS4_SYSV_ABI _sceNpAllocatorExStrndup(); +int PS4_SYSV_ABI _sceNpAllocatorFree(); +int PS4_SYSV_ABI _sceNpAllocatorMalloc(); +int PS4_SYSV_ABI _sceNpAllocatorRealloc(); +int PS4_SYSV_ABI _sceNpAllocatorStrdup(); +int PS4_SYSV_ABI _sceNpAllocatorStrndup(); +int PS4_SYSV_ABI _sceNpFree(); +int PS4_SYSV_ABI _sceNpHeapFree(); +int PS4_SYSV_ABI _sceNpHeapMalloc(); +int PS4_SYSV_ABI _sceNpHeapRealloc(); +int PS4_SYSV_ABI _sceNpHeapStrdup(); +int PS4_SYSV_ABI _sceNpHeapStrndup(); +int PS4_SYSV_ABI _sceNpMalloc(); +int PS4_SYSV_ABI _sceNpRealloc(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable10IsCanceledEv(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable10LockCancelEPKciS3_(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable11CheckCancelEPKciS3_(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable12UnlockCancelEPKciS3_(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable13SetCancelableEb(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable14SetupSubCancelEPS1_PKciS4_(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable16CleanupSubCancelEPS1_(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable4InitEv(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable6CancelEij(); +int PS4_SYSV_ABI _ZN3sce2np10Cancelable7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np10CancelableC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np10CancelableD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np10CancelableD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np10CancelableD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np10CancelLock3EndEPKciS3_(); +int PS4_SYSV_ABI _ZN3sce2np10CancelLock5BeginEPNS0_6HandleEPKciS5_(); +int PS4_SYSV_ABI _ZN3sce2np10CancelLockC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np10CancelLockC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np10CancelLockD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np10CancelLockD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue10ClearAbortEt(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue10TryDequeueEPvm(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue4InitEPKcmm(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue5AbortEt(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue7DequeueEPvmj(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueue7EnqueueEPKvmj(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueueC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueueD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueueD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np10EventQueueD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEi(); +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEj(); +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEl(); +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEm(); +int PS4_SYSV_ABI _ZN3sce2np10JsonNumber6SetNumEPKc(); +int PS4_SYSV_ABI _ZN3sce2np10JsonObject16DeleteFieldValueEPKc(); +int PS4_SYSV_ABI _ZN3sce2np10JsonObject5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np10JsonParser4InitEPK7JsonDefPNS1_12EventHandlerE(); +int PS4_SYSV_ABI _ZN3sce2np10JsonParser5ParseEPKcm(); +int PS4_SYSV_ABI _ZN3sce2np10JsonParserC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np10JsonParserD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np10JsonParserD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np10JsonParserD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np10JsonString5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np10JsonString6SetStrEPKc(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile4SyncEv(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile5CloseEv(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile5WriteEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFile8TruncateEl(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np10MemoryFileD2Ev(); +int PS4_SYSV_ABI +_ZN3sce2np12HttpTemplate19SetAuthInfoCallbackEPFii15SceHttpAuthTypePKcPcS5_iPPhPmPiPvESA_(); +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplate4InitEiPKcib(); +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplate7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np12HttpTemplateD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np12StreamBufferixEi(); +int PS4_SYSV_ABI _ZN3sce2np12StreamReader4ReadEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12StreamReader7ReadAllEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPNS0_9StreamCtxEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8ReadDataEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleElPl(); +int PS4_SYSV_ABI _ZN3sce2np12StreamReader8SkipDataEPNS0_6HandleEPNS0_9StreamCtxElPl(); +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEcl(); +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter15WriteFilledDataEPNS0_6HandleEPNS0_9StreamCtxEcl(); +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter5WriteEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12StreamWriter9WriteDataEPNS0_6HandleEPNS0_9StreamCtxEPKvmPm(); +int PS4_SYSV_ABI _ZN3sce2np12WorkerThread10ThreadMainEv(); +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadC1EPNS0_9WorkQueueE(); +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadC2EPNS0_9WorkQueueE(); +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np12WorkerThreadD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParser5ParseEPKcm(); +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParser9GetResultEPPNS0_10JsonObjectE(); +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParser9GetResultEPPNS0_9JsonValueE(); +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserC2EP16SceNpAllocatorExPK7JsonDef(); +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np13JsonDocParserD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecret5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1EPKvm(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1ERK16SceNpTitleSecret(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1ERKS1_(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2EPKvm(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2ERK16SceNpTitleSecret(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2ERKS1_(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np13NpTitleSecretD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory4InitEm(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory6ExpandEm(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory6IsInitEv(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemory7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np13RingBufMemoryD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContext4InitEPKcimm(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContext4InitEPKNS1_5ParamE(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContext7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np14CalloutContextD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder12BuildBufSizeEv(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder16EscapeJsonStringEPKcPcmPm(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder23EscapeJsonStringBufSizeEPKc(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilder5BuildEPcmPm(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderC1ERKNS0_9JsonValueE(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderC2ERKNS0_9JsonValueE(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np14JsonDocBuilderD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np15CancelableScope3EndEiPKciS3_(); +int PS4_SYSV_ABI _ZN3sce2np15CancelableScope5BeginEPNS0_6HandleEPKciS5_(); +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np15CancelableScopeD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np16StreamReadBufferC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np16StreamReadBufferD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np16StreamReadBufferD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPool13InvalidateAllEv(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPool4InitEi(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPool7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolC1EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np18HttpConnectionPoolD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReader4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderC1EPKvm(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderC2EPKvm(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamReaderD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriter5WriteEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterC1EPvm(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterC2EPvm(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np18MemoryStreamWriterD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReader4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReader5CloseEv(); +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np20BufferedStreamReaderD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient10DisconnectEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient11IsConnectedEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient16invokeSyncMethodEjPKvmPvPmm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient4InitEPKNS2_6ConfigE(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient7ConnectEPKvm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClient7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc10IpmiClientD2Ev(); +int PS4_SYSV_ABI +_ZN3sce2np3ipc13ServiceClientC1EPNS1_17ServiceIpmiClientEPKNS1_17ServiceClientInfoE(); +int PS4_SYSV_ABI +_ZN3sce2np3ipc13ServiceClientC2EPNS1_17ServiceIpmiClientEPKNS1_17ServiceClientInfoE(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient10DisconnectEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient10EndRequestEii(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11findServiceEi(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11InitServiceEi(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11TermServiceEi(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient11WaitRequestEiij(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient12AbortRequestEii(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient12BeginRequestEii(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13CreateRequestEPiiPKvm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13DeleteRequestEii(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13PollEventFlagEijmjPm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient13WaitEventFlagEijmjPmj(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient14PollEventQueueEiPvm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient15CancelEventFlagEijm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient15RegisterServiceEPKNS1_17ServiceClientInfoE(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient16RegisterServicesEPKNS1_17ServiceClientInfoE(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient17invokeInitServiceEi(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient17invokeTermServiceEi(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient17UnregisterServiceEi(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient18EndRequestForAsyncEii(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient19WaitRequestForAsyncEiij(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient20AbortRequestForAsyncEii(); +int PS4_SYSV_ABI +_ZN3sce2np3ipc17ServiceIpmiClient20BeginRequestForAsyncEiiPN4IPMI6Client12EventNotifeeE(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient21CreateRequestForAsyncEPiiPKvm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient21DeleteRequestForAsyncEii(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient4InitEPNS2_6ConfigE(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient7ConnectEPKvm(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClient7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np3ipc17ServiceIpmiClientD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np4Cond4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np4Cond4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np4Cond4InitEPKcPNS0_5MutexE(); +int PS4_SYSV_ABI _ZN3sce2np4Cond4WaitEj(); +int PS4_SYSV_ABI _ZN3sce2np4Cond6SignalEv(); +int PS4_SYSV_ABI _ZN3sce2np4Cond7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np4Cond9SignalAllEv(); +int PS4_SYSV_ABI _ZN3sce2np4CondC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np4CondC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np4CondD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np4CondD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np4CondD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np4Path11BuildAppendEPcmcPKcm(); +int PS4_SYSV_ABI _ZN3sce2np4Path12AddDelimiterEPcmc(); +int PS4_SYSV_ABI _ZN3sce2np4Path5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np4Path6SetStrEPKcm(); +int PS4_SYSV_ABI _ZN3sce2np4PathD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np4PathD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np4PathD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np4Time10AddMinutesEl(); +int PS4_SYSV_ABI _ZN3sce2np4Time10AddSecondsEl(); +int PS4_SYSV_ABI _ZN3sce2np4Time12GetUserClockEPS1_(); +int PS4_SYSV_ABI _ZN3sce2np4Time15AddMicroSecondsEl(); +int PS4_SYSV_ABI _ZN3sce2np4Time15GetNetworkClockEPS1_(); +int PS4_SYSV_ABI _ZN3sce2np4Time20GetDebugNetworkClockEPS1_(); +int PS4_SYSV_ABI _ZN3sce2np4Time7AddDaysEl(); +int PS4_SYSV_ABI _ZN3sce2np4Time8AddHoursEl(); +int PS4_SYSV_ABI _ZN3sce2np4TimeplERK10SceRtcTick(); +int PS4_SYSV_ABI _ZN3sce2np4TimeplERKS1_(); +int PS4_SYSV_ABI _ZN3sce2np5Mutex4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np5Mutex4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np5Mutex4InitEPKcj(); +int PS4_SYSV_ABI _ZN3sce2np5Mutex4LockEv(); +int PS4_SYSV_ABI _ZN3sce2np5Mutex6UnlockEv(); +int PS4_SYSV_ABI _ZN3sce2np5Mutex7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np5Mutex7TryLockEv(); +int PS4_SYSV_ABI _ZN3sce2np5MutexC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np5MutexC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np5MutexD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np5MutexD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np5MutexD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np5NpEnv8GetNpEnvEPS1_(); +int PS4_SYSV_ABI _ZN3sce2np6Handle10CancelImplEi(); +int PS4_SYSV_ABI _ZN3sce2np6Handle4InitEv(); +int PS4_SYSV_ABI _ZN3sce2np6Handle7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np6HandleC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np6HandleC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np6HandleD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np6HandleD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np6HandleD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectdaEPv(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectdaEPvR14SceNpAllocator(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectdaEPvR16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectdlEPv(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectdlEPvR14SceNpAllocator(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectdlEPvR16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectnaEmR14SceNpAllocator(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectnaEmR16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectnwEmR14SceNpAllocator(); +int PS4_SYSV_ABI _ZN3sce2np6ObjectnwEmR16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np6Thread12DoThreadMainEv(); +int PS4_SYSV_ABI _ZN3sce2np6Thread4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np6Thread4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np6Thread4InitEPKcimm(); +int PS4_SYSV_ABI _ZN3sce2np6Thread4InitEPKNS1_5ParamE(); +int PS4_SYSV_ABI _ZN3sce2np6Thread4JoinEPi(); +int PS4_SYSV_ABI _ZN3sce2np6Thread5StartEv(); +int PS4_SYSV_ABI _ZN3sce2np6Thread7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np6Thread9EntryFuncEPv(); +int PS4_SYSV_ABI _ZN3sce2np6Thread9GetResultEv(); +int PS4_SYSV_ABI _ZN3sce2np6Thread9IsRunningEv(); +int PS4_SYSV_ABI _ZN3sce2np6ThreadC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np6ThreadD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np6ThreadD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np6ThreadD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np7Callout10IsTimedoutEv(); +int PS4_SYSV_ABI _ZN3sce2np7Callout11CalloutFuncEPv(); +int PS4_SYSV_ABI _ZN3sce2np7Callout4StopEv(); +int PS4_SYSV_ABI _ZN3sce2np7Callout5StartEjPNS1_7HandlerE(); +int PS4_SYSV_ABI _ZN3sce2np7Callout5StartEmPNS1_7HandlerE(); +int PS4_SYSV_ABI _ZN3sce2np7Callout9IsStartedEv(); +int PS4_SYSV_ABI _ZN3sce2np7CalloutC1EPNS0_14CalloutContextE(); +int PS4_SYSV_ABI _ZN3sce2np7CalloutC2EPNS0_14CalloutContextE(); +int PS4_SYSV_ABI _ZN3sce2np7CalloutD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np7CalloutD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np7CalloutD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np7HttpUri5BuildEPKS1_PcmPmj(); +int PS4_SYSV_ABI _ZN3sce2np7HttpUri5ParseEPS1_PKc(); +int PS4_SYSV_ABI _ZN3sce2np7HttpUriC1EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np7HttpUriC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np7HttpUriD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np7HttpUriD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np7HttpUriD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf14CheckinForReadEm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf15CheckinForWriteEm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf15CheckoutForReadEPm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf16CheckoutForWriteEPm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4InitEPvm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4PeekEmPvm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf4ReadEPvm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf5WriteEPKvm(); +int PS4_SYSV_ABI _ZN3sce2np7RingBuf7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np7RingBufC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np7RingBufC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np7RingBufD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np7RingBufD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np7RingBufD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np8HttpFile4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np8HttpFile5CloseEv(); +int PS4_SYSV_ABI _ZN3sce2np8HttpFileC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np8HttpFileD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np8HttpFileD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np8HttpFileD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np8JsonBool5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np8JsonBool7SetBoolEb(); +int PS4_SYSV_ABI _ZN3sce2np8JsonFile5CloseEv(); +int PS4_SYSV_ABI _ZN3sce2np8JsonFileD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np8JsonFileD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np8JsonFileD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np8JsonNull5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5BuildERKS1_Pcm(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5ParseEPS1_PKc(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommId5ParseEPS1_PKcm(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC1ERK20SceNpCommunicationId(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC1ERKS1_(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC2ERK20SceNpCommunicationId(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC2ERKS1_(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np8NpCommIdD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np8Selector4InitEPKc(); +int PS4_SYSV_ABI _ZN3sce2np8SelectorD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np8SelectorD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np8SelectorD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItem10SetPendingEv(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItem10SetRunningEv(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItem11SetFinishedEi(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItem14FinishCallbackEv(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItem15RemoveFromQueueEv(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItem6CancelEi(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItem9BindQueueEPNS0_9WorkQueueEi(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItemC2EPKc(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItemD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItemD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np8WorkItemD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag3SetEm(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4OpenEPKc(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4PollEmjPm(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag4WaitEmjPmj(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag5ClearEm(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag6CancelEm(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag6CreateEPKcj(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlag7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlagC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlagC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlagD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlagD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9EventFlagD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans10SetTimeoutEPKNS1_12TimeoutParamE(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans11SendRequestEPNS0_6HandleEPKvm(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans12RecvResponseEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans12SkipResponseEPNS0_6HandleE(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans16AddRequestHeaderEPKcS3_(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans16SetRequestHeaderEPKcS3_(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans21GetResponseStatusCodeEPNS0_6HandleEPi(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans21SetRequestContentTypeEPKc(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans23SetRequestContentLengthEm(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans24GetResponseContentLengthEPNS0_6HandleEPbPm(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans4InitERKNS0_12HttpTemplateEPNS0_18HttpConnectionPoolEiPKcm(); +int PS4_SYSV_ABI +_ZN3sce2np9HttpTrans4InitERKNS0_12HttpTemplateEPNS0_18HttpConnectionPoolEiPKcS8_tS8_m(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTrans7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTransC1EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTransC2EP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTransD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTransD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9HttpTransD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9JsonArray12AddItemArrayEPPS1_(); +int PS4_SYSV_ABI _ZN3sce2np9JsonArray5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np9JsonValue12GetItemValueEi(); +int PS4_SYSV_ABI _ZN3sce2np9JsonValue13GetFieldValueEiPPKc(); +int PS4_SYSV_ABI _ZN3sce2np9JsonValue13GetFieldValueEPKc(); +int PS4_SYSV_ABI _ZN3sce2np9JsonValueD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9JsonValueD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9JsonValueD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFile4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFile4SeekEliPl(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFile4SyncEv(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFile5CloseEv(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFile5WriteEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFile6RemoveEPKc(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFile8TruncateEl(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFileC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFileC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFileD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFileD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9LocalFileD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5BuildERKS1_Pcm(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5ClearEv(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5ParseEPS1_PKc(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleId5ParseEPS1_PKcm(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC1ERK12SceNpTitleId(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC1ERKS1_(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC2ERK12SceNpTitleId(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC2ERKS1_(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9NpTitleIdD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9RefObject6AddRefEv(); +int PS4_SYSV_ABI _ZN3sce2np9RefObject7ReleaseEv(); +int PS4_SYSV_ABI _ZN3sce2np9RefObjectC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9RefObjectC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9RefObjectD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9RefObjectD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9RefObjectD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9Semaphore4OpenEPKc(); +int PS4_SYSV_ABI _ZN3sce2np9Semaphore4WaitEj(); +int PS4_SYSV_ABI _ZN3sce2np9Semaphore6CreateEiiPKc(); +int PS4_SYSV_ABI _ZN3sce2np9Semaphore6SignalEv(); +int PS4_SYSV_ABI _ZN3sce2np9Semaphore7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9SemaphoreD2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue11GetItemByIdEi(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue15GetFinishedItemENS0_14WorkItemStatusE(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue16WorkItemFinishedEPNS0_8WorkItemEi(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue17ProcFinishedItemsENS0_14WorkItemStatusE(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue18RemoveFinishedItemEPNS0_8WorkItemE(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue18WaitForPendingItemEPPNS0_8WorkItemEPb(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4ctorEv(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4dtorEv(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4InitEPKcimm(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4InitEPKNS0_6Thread5ParamE(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue4StopEv(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue5StartEv(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue6CancelEii(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue6IsInitEv(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue7DestroyEv(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue7EnqueueEiPNS0_8WorkItemE(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue9CancelAllEi(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueue9IsRunningEv(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueC1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueC2Ev(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueD0Ev(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueD1Ev(); +int PS4_SYSV_ABI _ZN3sce2np9WorkQueueD2Ev(); +int PS4_SYSV_ABI _ZN3sce2npeqERK10SceRtcTickRKNS0_4TimeE(); +int PS4_SYSV_ABI _ZN3sce2npeqERK12SceNpTitleIdRKNS0_9NpTitleIdE(); +int PS4_SYSV_ABI _ZN3sce2npeqERK16SceNpTitleSecretRKNS0_13NpTitleSecretE(); +int PS4_SYSV_ABI _ZN3sce2npeqERK20SceNpCommunicationIdRKNS0_8NpCommIdE(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_13NpTitleSecretERK16SceNpTitleSecret(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_13NpTitleSecretES3_(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_4TimeERK10SceRtcTick(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_4TimeES3_(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_8NpCommIdERK20SceNpCommunicationId(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_8NpCommIdES3_(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_9NpTitleIdERK12SceNpTitleId(); +int PS4_SYSV_ABI _ZN3sce2npeqERKNS0_9NpTitleIdES3_(); +int PS4_SYSV_ABI _ZN3sce2npgeERK10SceRtcTickRKNS0_4TimeE(); +int PS4_SYSV_ABI _ZN3sce2npgeERKNS0_4TimeERK10SceRtcTick(); +int PS4_SYSV_ABI _ZN3sce2npgeERKNS0_4TimeES3_(); +int PS4_SYSV_ABI _ZN3sce2npgtERK10SceRtcTickRKNS0_4TimeE(); +int PS4_SYSV_ABI _ZN3sce2npgtERKNS0_4TimeERK10SceRtcTick(); +int PS4_SYSV_ABI _ZN3sce2npgtERKNS0_4TimeES3_(); +int PS4_SYSV_ABI _ZN3sce2npleERK10SceRtcTickRKNS0_4TimeE(); +int PS4_SYSV_ABI _ZN3sce2npleERKNS0_4TimeERK10SceRtcTick(); +int PS4_SYSV_ABI _ZN3sce2npleERKNS0_4TimeES3_(); +int PS4_SYSV_ABI _ZN3sce2npltERK10SceRtcTickRKNS0_4TimeE(); +int PS4_SYSV_ABI _ZN3sce2npltERKNS0_4TimeERK10SceRtcTick(); +int PS4_SYSV_ABI _ZN3sce2npltERKNS0_4TimeES3_(); +int PS4_SYSV_ABI _ZN3sce2npneERK10SceRtcTickRKNS0_4TimeE(); +int PS4_SYSV_ABI _ZN3sce2npneERK12SceNpTitleIdRKNS0_9NpTitleIdE(); +int PS4_SYSV_ABI _ZN3sce2npneERK16SceNpTitleSecretRKNS0_13NpTitleSecretE(); +int PS4_SYSV_ABI _ZN3sce2npneERK20SceNpCommunicationIdRKNS0_8NpCommIdE(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_13NpTitleSecretERK16SceNpTitleSecret(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_13NpTitleSecretES3_(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_4TimeERK10SceRtcTick(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_4TimeES3_(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_8NpCommIdERK20SceNpCommunicationId(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_8NpCommIdES3_(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_9NpTitleIdERK12SceNpTitleId(); +int PS4_SYSV_ABI _ZN3sce2npneERKNS0_9NpTitleIdES3_(); +int PS4_SYSV_ABI _ZNK3sce2np10Cancelable6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np10EventQueue6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np10EventQueue7IsEmptyEv(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber5CloneEP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPcm(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPi(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPj(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPl(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber6GetNumEPm(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonNumber9GetNumStrEv(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonObject5CloneEP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonString5CloneEP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonString6GetStrEPcm(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonString6GetStrEv(); +int PS4_SYSV_ABI _ZNK3sce2np10JsonString9GetLengthEv(); +int PS4_SYSV_ABI _ZNK3sce2np12HttpTemplate6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np18HttpConnectionPool6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np3ipc10IpmiClient6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np3ipc17ServiceIpmiClient6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np4Cond6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np4Time18ConvertToPosixTimeEPl(); +int PS4_SYSV_ABI _ZNK3sce2np5Mutex6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np6Handle6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np6Thread6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf11GetDataSizeEv(); +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf11GetFreeSizeEv(); +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf6IsFullEv(); +int PS4_SYSV_ABI _ZNK3sce2np7RingBuf7IsEmptyEv(); +int PS4_SYSV_ABI _ZNK3sce2np8JsonBool5CloneEP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZNK3sce2np8JsonBool7GetBoolEv(); +int PS4_SYSV_ABI _ZNK3sce2np8JsonNull5CloneEP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZNK3sce2np8NpCommId7IsEmptyEv(); +int PS4_SYSV_ABI _ZNK3sce2np9EventFlag6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np9HttpTrans6IsInitEv(); +int PS4_SYSV_ABI _ZNK3sce2np9JsonArray5CloneEP16SceNpAllocatorEx(); +int PS4_SYSV_ABI _ZNK3sce2np9JsonValue12GetItemValueEi(); +int PS4_SYSV_ABI _ZNK3sce2np9NpTitleId7IsEmptyEv(); +int PS4_SYSV_ABI _ZNK3sce2np9Semaphore6IsInitEv(); +int PS4_SYSV_ABI _ZThn16_N3sce2np10MemoryFile5WriteEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZThn16_N3sce2np10MemoryFileD0Ev(); +int PS4_SYSV_ABI _ZThn16_N3sce2np10MemoryFileD1Ev(); +int PS4_SYSV_ABI _ZThn16_N3sce2np9HttpTrans5WriteEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZThn16_N3sce2np9HttpTransD0Ev(); +int PS4_SYSV_ABI _ZThn16_N3sce2np9HttpTransD1Ev(); +int PS4_SYSV_ABI _ZThn16_N3sce2np9LocalFile5WriteEPNS0_6HandleEPKvmPm(); +int PS4_SYSV_ABI _ZThn16_N3sce2np9LocalFileD0Ev(); +int PS4_SYSV_ABI _ZThn16_N3sce2np9LocalFileD1Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np10MemoryFile4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZThn8_N3sce2np10MemoryFileD0Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np10MemoryFileD1Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np6Handle10CancelImplEi(); +int PS4_SYSV_ABI _ZThn8_N3sce2np6HandleD0Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np6HandleD1Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np9HttpTrans4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZThn8_N3sce2np9HttpTransD0Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np9HttpTransD1Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np9LocalFile4ReadEPNS0_6HandleEPvmPm(); +int PS4_SYSV_ABI _ZThn8_N3sce2np9LocalFileD0Ev(); +int PS4_SYSV_ABI _ZThn8_N3sce2np9LocalFileD1Ev(); +int PS4_SYSV_ABI _ZTVN3sce2np10JsonNumberE(); +int PS4_SYSV_ABI _ZTVN3sce2np10JsonObjectE(); +int PS4_SYSV_ABI _ZTVN3sce2np10JsonStringE(); +int PS4_SYSV_ABI _ZTVN3sce2np8JsonBoolE(); +int PS4_SYSV_ABI _ZTVN3sce2np8JsonNullE(); +int PS4_SYSV_ABI _ZTVN3sce2np8SelectorE(); +int PS4_SYSV_ABI _ZTVN3sce2np9JsonArrayE(); +int PS4_SYSV_ABI _ZTVN3sce2np9JsonValueE(); +int PS4_SYSV_ABI sceNpAllocateKernelMemoryNoAlignment(); +int PS4_SYSV_ABI sceNpAllocateKernelMemoryWithAlignment(); +int PS4_SYSV_ABI sceNpArchInit(); +int PS4_SYSV_ABI sceNpArchTerm(); +int PS4_SYSV_ABI sceNpAtomicCas32(); +int PS4_SYSV_ABI sceNpAtomicDec32(); +int PS4_SYSV_ABI sceNpAtomicInc32(); +int PS4_SYSV_ABI sceNpBase64Decoder(); +int PS4_SYSV_ABI sceNpBase64Encoder(); +int PS4_SYSV_ABI sceNpBase64GetDecodeSize(); +int PS4_SYSV_ABI sceNpBase64UrlDecoder(); +int PS4_SYSV_ABI sceNpBase64UrlEncoder(); +int PS4_SYSV_ABI sceNpBase64UrlGetDecodeSize(); +int PS4_SYSV_ABI sceNpCalloutInitCtx(); +int PS4_SYSV_ABI sceNpCalloutStartOnCtx(); +int PS4_SYSV_ABI sceNpCalloutStartOnCtx64(); +int PS4_SYSV_ABI sceNpCalloutStopOnCtx(); +int PS4_SYSV_ABI sceNpCalloutTermCtx(); +int PS4_SYSV_ABI sceNpCancelEventFlag(); +int PS4_SYSV_ABI sceNpClearEventFlag(); +int PS4_SYSV_ABI sceNpCloseEventFlag(); +int PS4_SYSV_ABI sceNpCloseSema(); +int PS4_SYSV_ABI sceNpCondDestroy(); +int PS4_SYSV_ABI sceNpCondInit(); +int PS4_SYSV_ABI sceNpCondSignal(); +int PS4_SYSV_ABI sceNpCondSignalAll(); +int PS4_SYSV_ABI sceNpCondSignalTo(); +int PS4_SYSV_ABI sceNpCondTimedwait(); +int PS4_SYSV_ABI sceNpCondWait(); +int PS4_SYSV_ABI sceNpCreateEventFlag(); +int PS4_SYSV_ABI sceNpCreateSema(); +int PS4_SYSV_ABI sceNpCreateThread(); +int PS4_SYSV_ABI sceNpDbgAssignDebugId(); +int PS4_SYSV_ABI sceNpDbgDumpBinary(); +int PS4_SYSV_ABI sceNpDbgDumpText(); +int PS4_SYSV_ABI sceNpDeleteEventFlag(); +int PS4_SYSV_ABI sceNpDeleteSema(); +int PS4_SYSV_ABI sceNpEventGetCurrentNetworkTick(); +int PS4_SYSV_ABI sceNpFreeKernelMemory(); +int PS4_SYSV_ABI sceNpGetNavSdkVersion(); +int PS4_SYSV_ABI sceNpGetPlatformType(); +int PS4_SYSV_ABI sceNpGetProcessId(); +int PS4_SYSV_ABI sceNpGetRandom(); +int PS4_SYSV_ABI sceNpGetSdkVersion(); +int PS4_SYSV_ABI sceNpGetSdkVersionUInt(); +int PS4_SYSV_ABI sceNpGetSystemClockUsec(); +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocator(); +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocatorEx(); +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocatorExPtr(); +int PS4_SYSV_ABI sceNpGlobalHeapGetAllocatorPtr(); +int PS4_SYSV_ABI sceNpHeapDestroy(); +int PS4_SYSV_ABI sceNpHeapGetAllocator(); +int PS4_SYSV_ABI sceNpHeapGetStat(); +int PS4_SYSV_ABI sceNpHeapInit(); +int PS4_SYSV_ABI sceNpHeapShowStat(); +int PS4_SYSV_ABI sceNpHexToInt(); +int PS4_SYSV_ABI sceNpInt32ToStr(); +int PS4_SYSV_ABI sceNpInt64ToStr(); +int PS4_SYSV_ABI sceNpIntGetPlatformType(); +int PS4_SYSV_ABI sceNpIntIsOnlineIdString(); +int PS4_SYSV_ABI sceNpIntIsValidOnlineId(); +int PS4_SYSV_ABI sceNpIntSetPlatformType(); +int PS4_SYSV_ABI sceNpIntToHex(); +int PS4_SYSV_ABI sceNpIpc2ClientInit(); +int PS4_SYSV_ABI sceNpIpc2ClientTerm(); +int PS4_SYSV_ABI sceNpJoinThread(); +int PS4_SYSV_ABI sceNpJsonParse(); +int PS4_SYSV_ABI sceNpJsonParseBuf(); +int PS4_SYSV_ABI sceNpJsonParseBufInit(); +int PS4_SYSV_ABI sceNpJsonParseEx(); +int PS4_SYSV_ABI sceNpJsonParseExInit(); +int PS4_SYSV_ABI sceNpJsonParseInit(); +int PS4_SYSV_ABI sceNpLwCondDestroy(); +int PS4_SYSV_ABI sceNpLwCondInit(); +int PS4_SYSV_ABI sceNpLwCondSignal(); +int PS4_SYSV_ABI sceNpLwCondSignalAll(); +int PS4_SYSV_ABI sceNpLwCondSignalTo(); +int PS4_SYSV_ABI sceNpLwCondWait(); +int PS4_SYSV_ABI sceNpLwMutexDestroy(); +int PS4_SYSV_ABI sceNpLwMutexInit(); +int PS4_SYSV_ABI sceNpLwMutexLock(); +int PS4_SYSV_ABI sceNpLwMutexTryLock(); +int PS4_SYSV_ABI sceNpLwMutexUnlock(); +int PS4_SYSV_ABI sceNpMemoryHeapDestroy(); +int PS4_SYSV_ABI sceNpMemoryHeapGetAllocator(); +int PS4_SYSV_ABI sceNpMemoryHeapGetAllocatorEx(); +int PS4_SYSV_ABI sceNpMemoryHeapInit(); +int PS4_SYSV_ABI sceNpMutexDestroy(); +int PS4_SYSV_ABI sceNpMutexInit(); +int PS4_SYSV_ABI sceNpMutexLock(); +int PS4_SYSV_ABI sceNpMutexTryLock(); +int PS4_SYSV_ABI sceNpMutexUnlock(); +int PS4_SYSV_ABI sceNpOpenEventFlag(); +int PS4_SYSV_ABI sceNpOpenSema(); +int PS4_SYSV_ABI sceNpPanic(); +int PS4_SYSV_ABI sceNpPollEventFlag(); +int PS4_SYSV_ABI sceNpPollSema(); +int PS4_SYSV_ABI sceNpRtcConvertToPosixTime(); +int PS4_SYSV_ABI sceNpRtcFormatRFC3339(); +int PS4_SYSV_ABI sceNpRtcParseRFC3339(); +int PS4_SYSV_ABI sceNpServerErrorJsonGetErrorCode(); +int PS4_SYSV_ABI sceNpServerErrorJsonMultiGetErrorCode(); +int PS4_SYSV_ABI sceNpServerErrorJsonParse(); +int PS4_SYSV_ABI sceNpServerErrorJsonParseInit(); +int PS4_SYSV_ABI sceNpServerErrorJsonParseMultiInit(); +int PS4_SYSV_ABI sceNpSetEventFlag(); +int PS4_SYSV_ABI sceNpSetPlatformType(); +int PS4_SYSV_ABI sceNpSignalSema(); +int PS4_SYSV_ABI sceNpStrBuildHex(); +int PS4_SYSV_ABI sceNpStrcpyToBuf(); +int PS4_SYSV_ABI sceNpStrncpyToBuf(); +int PS4_SYSV_ABI sceNpStrnParseHex(); +int PS4_SYSV_ABI sceNpStrParseHex(); +int PS4_SYSV_ABI sceNpStrToInt32(); +int PS4_SYSV_ABI sceNpStrToInt64(); +int PS4_SYSV_ABI sceNpStrToUInt32(); +int PS4_SYSV_ABI sceNpStrToUInt64(); +int PS4_SYSV_ABI sceNpThreadGetId(); +int PS4_SYSV_ABI sceNpUInt32ToStr(); +int PS4_SYSV_ABI sceNpUInt64ToStr(); +int PS4_SYSV_ABI sceNpUserGetUserIdList(); +int PS4_SYSV_ABI sceNpUtilBuildTitleId(); +int PS4_SYSV_ABI sceNpUtilCanonicalizeNpIdForPs4(); +int PS4_SYSV_ABI sceNpUtilCanonicalizeNpIdForPsp2(); +int PS4_SYSV_ABI sceNpUtilCmpAccountId(); +int PS4_SYSV_ABI sceNpUtilGetDateSetAuto(); +int PS4_SYSV_ABI sceNpUtilGetDbgCommerce(); +int PS4_SYSV_ABI sceNpUtilGetEnv(); +int PS4_SYSV_ABI sceNpUtilGetFakeDisplayNameMode(); +int PS4_SYSV_ABI sceNpUtilGetFakeRateLimit(); +int PS4_SYSV_ABI sceNpUtilGetIgnoreNpTitleId(); +int PS4_SYSV_ABI sceNpUtilGetNpDebug(); +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCode(); +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCode2(); +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCode2Str(); +int PS4_SYSV_ABI sceNpUtilGetNpLanguageCodeStr(); +int PS4_SYSV_ABI sceNpUtilGetNpTestPatch(); +int PS4_SYSV_ABI sceNpUtilGetNthChar(); +int PS4_SYSV_ABI sceNpUtilGetShareTitleCheck(); +int PS4_SYSV_ABI sceNpUtilGetSystemLanguage(); +int PS4_SYSV_ABI sceNpUtilGetTrcNotify(); +int PS4_SYSV_ABI sceNpUtilGetWebApi2FakeRateLimit(); +int PS4_SYSV_ABI sceNpUtilGetWebApi2FakeRateLimitTarget(); +int PS4_SYSV_ABI sceNpUtilGetWebTraceSetting(); +int PS4_SYSV_ABI sceNpUtilHttpUrlEncode(); +int PS4_SYSV_ABI sceNpUtilJidToNpId(); +int PS4_SYSV_ABI sceNpUtilJsonEscape(); +int PS4_SYSV_ABI sceNpUtilJsonGetOneChar(); +int PS4_SYSV_ABI sceNpUtilJsonUnescape(); +int PS4_SYSV_ABI sceNpUtilNpIdToJid(); +int PS4_SYSV_ABI sceNpUtilNumChars(); +int PS4_SYSV_ABI sceNpUtilParseJid(); +int PS4_SYSV_ABI sceNpUtilParseTitleId(); +int PS4_SYSV_ABI sceNpUtilSerializeJid(); +int PS4_SYSV_ABI sceNpUtilXmlEscape(); +int PS4_SYSV_ABI sceNpUtilXmlGetOneChar(); +int PS4_SYSV_ABI sceNpUtilXmlUnescape(); +int PS4_SYSV_ABI sceNpWaitEventFlag(); +int PS4_SYSV_ABI sceNpWaitSema(); +int PS4_SYSV_ABI sceNpXmlParse(); +int PS4_SYSV_ABI sceNpXmlParseInit(); +int PS4_SYSV_ABI Func_00FD578C2DD966DF(); +int PS4_SYSV_ABI Func_0131A2EA80689F4C(); +int PS4_SYSV_ABI Func_01443C54863BDD20(); +int PS4_SYSV_ABI Func_01BC55BDC5C0ADAD(); +int PS4_SYSV_ABI Func_01D1ECF5750F40E8(); +int PS4_SYSV_ABI Func_020A479A74F5FBAC(); +int PS4_SYSV_ABI Func_024AF5E1D9472AB5(); +int PS4_SYSV_ABI Func_027C5D488713A6B3(); +int PS4_SYSV_ABI Func_02FE9D94C6858355(); +int PS4_SYSV_ABI Func_041F34F1C70D15C1(); +int PS4_SYSV_ABI Func_0530B1D276114248(); +int PS4_SYSV_ABI Func_065DAA14E9C73AD9(); +int PS4_SYSV_ABI Func_06AFF4E5D042BC3E(); +int PS4_SYSV_ABI Func_06EE369299F73997(); +int PS4_SYSV_ABI Func_07C92D9F8D76B617(); +int PS4_SYSV_ABI Func_07E9117498F1E4BF(); +int PS4_SYSV_ABI Func_08F3E0AF3664F275(); +int PS4_SYSV_ABI Func_0A9937C01EF21375(); +int PS4_SYSV_ABI Func_0ACBE6ACCBA3876D(); +int PS4_SYSV_ABI Func_0AE07D3354510CE6(); +int PS4_SYSV_ABI Func_0AEC3C342AE67B7C(); +int PS4_SYSV_ABI Func_0B318420C11E7C23(); +int PS4_SYSV_ABI Func_0BB6C37B03F35D89(); +int PS4_SYSV_ABI Func_0BBE8A9ACDD90FDF(); +int PS4_SYSV_ABI Func_0C7B62905E224E9C(); +int PS4_SYSV_ABI Func_0D35913117241AF9(); +int PS4_SYSV_ABI Func_0D5EE95CEED879A7(); +int PS4_SYSV_ABI Func_0D6FB24B27AB1DA2(); +int PS4_SYSV_ABI Func_0DE8032D534AC41C(); +int PS4_SYSV_ABI Func_0DF4CCA9DCA9E742(); +int PS4_SYSV_ABI Func_0E7449B1D3D98C01(); +int PS4_SYSV_ABI Func_0E77094B7750CB37(); +int PS4_SYSV_ABI Func_0ECAB397B6D50603(); +int PS4_SYSV_ABI Func_0F1DE1D1EADA2948(); +int PS4_SYSV_ABI Func_0F8AFEFA1D26BF1A(); +int PS4_SYSV_ABI Func_11881710562A6BAD(); +int PS4_SYSV_ABI Func_11AFD88BBD0C70DB(); +int PS4_SYSV_ABI Func_11E704A30A4B8877(); +int PS4_SYSV_ABI Func_125014842452F94B(); +int PS4_SYSV_ABI Func_126F0071E11CAC46(); +int PS4_SYSV_ABI Func_12926DCF35994B01(); +int PS4_SYSV_ABI Func_12CC7ABFBF31618F(); +int PS4_SYSV_ABI Func_13C4E51F44592AA2(); +int PS4_SYSV_ABI Func_15330E7C56338254(); +int PS4_SYSV_ABI Func_1566B358CABF2612(); +int PS4_SYSV_ABI Func_1625818F268F45EF(); +int PS4_SYSV_ABI Func_16D32B40D28A9AC2(); +int PS4_SYSV_ABI Func_183F4483BDBD25CD(); +int PS4_SYSV_ABI Func_1887E9E95AF62F3D(); +int PS4_SYSV_ABI Func_18A3CE95FD893D3A(); +int PS4_SYSV_ABI Func_18B3665E4854E7E9(); +int PS4_SYSV_ABI Func_1923B003948AF47E(); +int PS4_SYSV_ABI Func_19B533DA4C59A532(); +int PS4_SYSV_ABI Func_1BB399772DB68E08(); +int PS4_SYSV_ABI Func_1C0AC612D3A2971B(); +int PS4_SYSV_ABI Func_1C5599B779990A43(); +int PS4_SYSV_ABI Func_1CCBB296B04317BE(); +int PS4_SYSV_ABI Func_1CD045542FB93002(); +int PS4_SYSV_ABI Func_1DECECA673AB77B7(); +int PS4_SYSV_ABI Func_1E03E024E26C1A7F(); +int PS4_SYSV_ABI Func_1F101732BB0D7E21(); +int PS4_SYSV_ABI Func_1F4D153EC3DD47BB(); +int PS4_SYSV_ABI Func_1F7C47F63FAF0CBE(); +int PS4_SYSV_ABI Func_1FBE2EE68C0F31B6(); +int PS4_SYSV_ABI Func_2038C1628914B9C9(); +int PS4_SYSV_ABI Func_203FCB56FDB86A74(); +int PS4_SYSV_ABI Func_20569C107C6CB08C(); +int PS4_SYSV_ABI Func_20AB2D734EDE55F0(); +int PS4_SYSV_ABI Func_22B1281180FB0A5E(); +int PS4_SYSV_ABI Func_22F1AADA66A449AE(); +int PS4_SYSV_ABI Func_238B215EFFDF3D30(); +int PS4_SYSV_ABI Func_24E8EC51D149FA15(); +int PS4_SYSV_ABI Func_25728E78A3962C02(); +int PS4_SYSV_ABI Func_25E649A1C6891C05(); +int PS4_SYSV_ABI Func_264B8A38B577705D(); +int PS4_SYSV_ABI Func_266ED08DC1C82A0E(); +int PS4_SYSV_ABI Func_27BB4DE62AB58BAD(); +int PS4_SYSV_ABI Func_283AA96A196EA2EA(); +int PS4_SYSV_ABI Func_285315A390A85A94(); +int PS4_SYSV_ABI Func_29049DBB1EF3194E(); +int PS4_SYSV_ABI Func_29F7BA9C3732CB47(); +int PS4_SYSV_ABI Func_2A732DF331ACCB37(); +int PS4_SYSV_ABI Func_2AA01660EC75B6FB(); +int PS4_SYSV_ABI Func_2B37CBCE941C1681(); +int PS4_SYSV_ABI Func_2CAA3B64D0544E55(); +int PS4_SYSV_ABI Func_2CCD79617EC10A75(); +int PS4_SYSV_ABI Func_2CD8B69716AC0667(); +int PS4_SYSV_ABI Func_2D74F7C0FF9B5E9C(); +int PS4_SYSV_ABI Func_2DCA5A8080544E95(); +int PS4_SYSV_ABI Func_2E69F2743CE7CE57(); +int PS4_SYSV_ABI Func_2EAF1F3BAFF0527D(); +int PS4_SYSV_ABI Func_31493E55BB4E8F66(); +int PS4_SYSV_ABI Func_317EDCAD00FB5F5E(); +int PS4_SYSV_ABI Func_31E01CFA8A18CDA2(); +int PS4_SYSV_ABI Func_32AFD782A061B526(); +int PS4_SYSV_ABI Func_32B5CDEB093B8189(); +int PS4_SYSV_ABI Func_34155152513C93AE(); +int PS4_SYSV_ABI Func_34E4EFFF8EF6C9FE(); +int PS4_SYSV_ABI Func_3572FA0D5C54563B(); +int PS4_SYSV_ABI Func_367C479B264E0DB9(); +int PS4_SYSV_ABI Func_36884FBC964B29CC(); +int PS4_SYSV_ABI Func_3860081BB7559949(); +int PS4_SYSV_ABI Func_39314F7E674AB132(); +int PS4_SYSV_ABI Func_3A02E780FCC556A5(); +int PS4_SYSV_ABI Func_3A17B885BA4849B6(); +int PS4_SYSV_ABI Func_3A38EACAEA5E23A4(); +int PS4_SYSV_ABI Func_3B34A5E07F0DBC1F(); +int PS4_SYSV_ABI Func_3B4E8FFC00FC7EA4(); +int PS4_SYSV_ABI Func_3BAB18FDA235107A(); +int PS4_SYSV_ABI Func_3BDF9996A0A33F11(); +int PS4_SYSV_ABI Func_3C1952F1A45CC37A(); +int PS4_SYSV_ABI Func_3CA37906CDB05F3B(); +int PS4_SYSV_ABI Func_3CDB2908ACEE3A6F(); +int PS4_SYSV_ABI Func_3D3ED165F2BDCD33(); +int PS4_SYSV_ABI Func_3DA4D7D1575FCDCE(); +int PS4_SYSV_ABI Func_3DDFB612CD0BC769(); +int PS4_SYSV_ABI Func_3E0415E167DEADC7(); +int PS4_SYSV_ABI Func_3E7E9F0F1581C1E6(); +int PS4_SYSV_ABI Func_3ED389DB8280ED65(); +int PS4_SYSV_ABI Func_3F0C7F6C0C35487D(); +int PS4_SYSV_ABI Func_3FDA7200389EF0D2(); +int PS4_SYSV_ABI Func_3FF3C258BA516E58(); +int PS4_SYSV_ABI Func_4029453F628A3C5D(); +int PS4_SYSV_ABI Func_405826DDB4AE538E(); +int PS4_SYSV_ABI Func_405A926759F25865(); +int PS4_SYSV_ABI Func_406608FDEE7AE88A(); +int PS4_SYSV_ABI Func_40DDA5558C17DDCF(); +int PS4_SYSV_ABI Func_419D12E52FF60664(); +int PS4_SYSV_ABI Func_4296E539474BE77F(); +int PS4_SYSV_ABI Func_42F41FC563CC3654(); +int PS4_SYSV_ABI Func_43CCC86F4C93026A(); +int PS4_SYSV_ABI Func_4409F60BDABC65E1(); +int PS4_SYSV_ABI Func_4563C70AEC675382(); +int PS4_SYSV_ABI Func_45E66370219BD05E(); +int PS4_SYSV_ABI Func_466A54F072785696(); +int PS4_SYSV_ABI Func_46CD2536976F209A(); +int PS4_SYSV_ABI Func_4863717BD2FDD157(); +int PS4_SYSV_ABI Func_4902EBD19A263149(); +int PS4_SYSV_ABI Func_4904F7FE8D83F40C(); +int PS4_SYSV_ABI Func_4A5E13F784ABFCE7(); +int PS4_SYSV_ABI Func_4B65EEB135C12781(); +int PS4_SYSV_ABI Func_4C19D49978DA85E2(); +int PS4_SYSV_ABI Func_4DE5D620FF66F136(); +int PS4_SYSV_ABI Func_4E170C12B57A8F9E(); +int PS4_SYSV_ABI Func_4E2F3FA405C3260C(); +int PS4_SYSV_ABI Func_4EA9350577513B4D(); +int PS4_SYSV_ABI Func_4F78EB6FC4B5F21F(); +int PS4_SYSV_ABI Func_50348BE4331117B7(); +int PS4_SYSV_ABI Func_508C7E8CDD281CAA(); +int PS4_SYSV_ABI Func_521C1D2C028F5A7E(); +int PS4_SYSV_ABI Func_522FF24A35E67291(); +int PS4_SYSV_ABI Func_5470FE90C25CDD4C(); +int PS4_SYSV_ABI Func_557F260F9A4ACD18(); +int PS4_SYSV_ABI Func_5586F97209F391EB(); +int PS4_SYSV_ABI Func_55B2C9B7ADA95C3C(); +int PS4_SYSV_ABI Func_55B488A3A540B936(); +int PS4_SYSV_ABI Func_5642DFE82AF43143(); +int PS4_SYSV_ABI Func_574E046F294AE187(); +int PS4_SYSV_ABI Func_578926EBF8AA6CBF(); +int PS4_SYSV_ABI Func_585DA5FC650896BC(); +int PS4_SYSV_ABI Func_58D6EB27349EC276(); +int PS4_SYSV_ABI Func_5906B7317949872D(); +int PS4_SYSV_ABI Func_5910B5614335BE70(); +int PS4_SYSV_ABI Func_593D7DA8911F08C9(); +int PS4_SYSV_ABI Func_59757FE6A93B0D53(); +int PS4_SYSV_ABI Func_598E60F862B1141E(); +int PS4_SYSV_ABI Func_5A45351666680DAF(); +int PS4_SYSV_ABI Func_5AABE9EA702E6A7F(); +int PS4_SYSV_ABI Func_5AEA4AE472355B80(); +int PS4_SYSV_ABI Func_5B20E53CDE598741(); +int PS4_SYSV_ABI Func_5B480B59FAE947E0(); +int PS4_SYSV_ABI Func_5B5EEC23690AB9BD(); +int PS4_SYSV_ABI Func_5C0AC5B0AF3EDAE0(); +int PS4_SYSV_ABI Func_5D2E999BEA0762D4(); +int PS4_SYSV_ABI Func_5D55BBFD45110E16(); +int PS4_SYSV_ABI Func_5DEE15403D2BB5FD(); +int PS4_SYSV_ABI Func_6020C708CA74B130(); +int PS4_SYSV_ABI Func_606E1415503C34D2(); +int PS4_SYSV_ABI Func_612140E8EE9A693E(); +int PS4_SYSV_ABI Func_61F13F551DAF61DF(); +int PS4_SYSV_ABI Func_6206D39131752328(); +int PS4_SYSV_ABI Func_621D4543EF0344DE(); +int PS4_SYSV_ABI Func_6259A9A8E56D0273(); +int PS4_SYSV_ABI Func_625F9C7016346F4E(); +int PS4_SYSV_ABI Func_62EF8DF746CD8C4A(); +int PS4_SYSV_ABI Func_636D2A99FD1E6B2B(); +int PS4_SYSV_ABI Func_68013EDF66FE7425(); +int PS4_SYSV_ABI Func_6971F7067DD639D1(); +int PS4_SYSV_ABI Func_69896ADB3AB410B2(); +int PS4_SYSV_ABI Func_6A1389AA6E561387(); +int PS4_SYSV_ABI Func_6A5560D89F12B2E7(); +int PS4_SYSV_ABI Func_6ABF99CF854ABCF1(); +int PS4_SYSV_ABI Func_6B4FDDC6500D8DCB(); +int PS4_SYSV_ABI Func_6CA11D5B49D1928A(); +int PS4_SYSV_ABI Func_6D6C0FB61E6D0715(); +int PS4_SYSV_ABI Func_6D750745FE1348F5(); +int PS4_SYSV_ABI Func_6E1AF3F9D09914BE(); +int PS4_SYSV_ABI Func_6E53ED4C08B2A521(); +int PS4_SYSV_ABI Func_6EF43ACA1ED6B968(); +int PS4_SYSV_ABI Func_6F6FA09F3E1B6A60(); +int PS4_SYSV_ABI Func_7035C340C7195901(); +int PS4_SYSV_ABI Func_7038E21CB5CF641B(); +int PS4_SYSV_ABI Func_706345DCDA5BA44D(); +int PS4_SYSV_ABI Func_7120714EBF10BF1F(); +int PS4_SYSV_ABI Func_713D28A91BC803DD(); +int PS4_SYSV_ABI Func_7153BD76A53AA012(); +int PS4_SYSV_ABI Func_715C625CC7041B6B(); +int PS4_SYSV_ABI Func_71E467BDB18711D0(); +int PS4_SYSV_ABI Func_720D17965C1F4E3F(); +int PS4_SYSV_ABI Func_734380C9BCF65B9A(); +int PS4_SYSV_ABI Func_73F4C08CCD4BBCCF(); +int PS4_SYSV_ABI Func_74403101B7B29D46(); +int PS4_SYSV_ABI Func_7525B081ACD66FF4(); +int PS4_SYSV_ABI Func_75BF4477C13A05CA(); +int PS4_SYSV_ABI Func_7609793F5987C6F7(); +int PS4_SYSV_ABI Func_7616ED01B04769AA(); +int PS4_SYSV_ABI Func_764F873D91A124D8(); +int PS4_SYSV_ABI Func_7706F1E123059565(); +int PS4_SYSV_ABI Func_77F2D07EB6D806E6(); +int PS4_SYSV_ABI Func_79C3704CDCD59E57(); +int PS4_SYSV_ABI Func_79DA0BBA21351545(); +int PS4_SYSV_ABI Func_79FA2447B5F3F0C4(); +int PS4_SYSV_ABI Func_7A4D6F65FF6195A5(); +int PS4_SYSV_ABI Func_7B3195CD114DECE7(); +int PS4_SYSV_ABI Func_7B3238F2301AD36D(); +int PS4_SYSV_ABI Func_7C77FC70750A3266(); +int PS4_SYSV_ABI Func_7D23A9DC459D6D18(); +int PS4_SYSV_ABI Func_7D5988C748D0A05F(); +int PS4_SYSV_ABI Func_7D9597147A99F4F4(); +int PS4_SYSV_ABI Func_7E2953F407DD8346(); +int PS4_SYSV_ABI Func_7EE34E5099709B32(); +int PS4_SYSV_ABI Func_80470E5511D5CA00(); +int PS4_SYSV_ABI Func_807179701C08F069(); +int PS4_SYSV_ABI Func_8096E81FFAF24E46(); +int PS4_SYSV_ABI Func_80B764F4F1B87042(); +int PS4_SYSV_ABI Func_80BF691438AD008B(); +int PS4_SYSV_ABI Func_80CF6CFC96012442(); +int PS4_SYSV_ABI Func_80EA772F8C0519FD(); +int PS4_SYSV_ABI Func_81D0AFD0084D327A(); +int PS4_SYSV_ABI Func_821EB8A72176FD67(); +int PS4_SYSV_ABI Func_82D2FAB54127273F(); +int PS4_SYSV_ABI Func_836AE669C42A59E9(); +int PS4_SYSV_ABI Func_8559A25BFEC3518C(); +int PS4_SYSV_ABI Func_85C1F66C767A49D2(); +int PS4_SYSV_ABI Func_8689ED1383F87BA7(); +int PS4_SYSV_ABI Func_8796CD9E5355D3A6(); +int PS4_SYSV_ABI Func_87D37EB6DDC19D99(); +int PS4_SYSV_ABI Func_880AA48F70F84FDD(); +int PS4_SYSV_ABI Func_897B07562093665B(); +int PS4_SYSV_ABI Func_8ACAF55F16368087(); +int PS4_SYSV_ABI Func_8AE8A5589B30D4E0(); +int PS4_SYSV_ABI Func_8AE997909831B331(); +int PS4_SYSV_ABI Func_8B2D640BE0D0FB99(); +int PS4_SYSV_ABI Func_8B3D9AB4668DAECB(); +int PS4_SYSV_ABI Func_8B5EFAAAACE0B46C(); +int PS4_SYSV_ABI Func_8C27943F40A988DB(); +int PS4_SYSV_ABI Func_8C54096C75F5F2D0(); +int PS4_SYSV_ABI Func_8D7663A0A5168814(); +int PS4_SYSV_ABI Func_8E618F509994FAD7(); +int PS4_SYSV_ABI Func_8F19E6CC064E2B98(); +int PS4_SYSV_ABI Func_8F6A8AEAEE922FF5(); +int PS4_SYSV_ABI Func_9010E1AD8EBBFBCA(); +int PS4_SYSV_ABI Func_90A955A0E7001AE9(); +int PS4_SYSV_ABI Func_90F9D6067FEECC05(); +int PS4_SYSV_ABI Func_9348F3D19546A1DA(); +int PS4_SYSV_ABI Func_93D3C011DB19388A(); +int PS4_SYSV_ABI Func_956E7A4FD9F89103(); +int PS4_SYSV_ABI Func_95F699E042C3E40F(); +int PS4_SYSV_ABI Func_96877B39AA0E8735(); +int PS4_SYSV_ABI Func_96CE07C49ED234EA(); +int PS4_SYSV_ABI Func_976BB178235B5681(); +int PS4_SYSV_ABI Func_978C0B25E588C4D6(); +int PS4_SYSV_ABI Func_98BA2612BEF238D6(); +int PS4_SYSV_ABI Func_995BDD4931AF9137(); +int PS4_SYSV_ABI Func_9966E39A926B7250(); +int PS4_SYSV_ABI Func_99C2306F18963464(); +int PS4_SYSV_ABI Func_99C92C613B776BA7(); +int PS4_SYSV_ABI Func_9A4E4B938CC8AD39(); +int PS4_SYSV_ABI Func_9B23F7B4B7F72081(); +int PS4_SYSV_ABI Func_9C0EAEEAE705A8DB(); +int PS4_SYSV_ABI Func_9D47AC59545DE9E8(); +int PS4_SYSV_ABI Func_A13052D8B1B2ACFA(); +int PS4_SYSV_ABI Func_A1AA43E3A78F6F62(); +int PS4_SYSV_ABI Func_A1E48CDF54649DC9(); +int PS4_SYSV_ABI Func_A2E7DEE5B0AF5D14(); +int PS4_SYSV_ABI Func_A2F5C7FD9FF113F5(); +int PS4_SYSV_ABI Func_A36296E2269D46BC(); +int PS4_SYSV_ABI Func_A3EE2A7B9F0D88AF(); +int PS4_SYSV_ABI Func_A4471F9F7E0BFA82(); +int PS4_SYSV_ABI Func_A449BBA521EA34E1(); +int PS4_SYSV_ABI Func_A48E666C334E726C(); +int PS4_SYSV_ABI Func_A49B7449B4DDE69C(); +int PS4_SYSV_ABI Func_A5748451125C9EA4(); +int PS4_SYSV_ABI Func_A690A28D648CC176(); +int PS4_SYSV_ABI Func_A6A86DE1B1CBB1D9(); +int PS4_SYSV_ABI Func_A8F2BB7B815740A1(); +int PS4_SYSV_ABI Func_A93F64C06A6F7397(); +int PS4_SYSV_ABI Func_AB35925FC97D6AA3(); +int PS4_SYSV_ABI Func_AC014AA2C991FA29(); +int PS4_SYSV_ABI Func_AC06E10901404AEB(); +int PS4_SYSV_ABI Func_AC75C68813523505(); +int PS4_SYSV_ABI Func_AD441BC497082C3E(); +int PS4_SYSV_ABI Func_AD4F25F021D354C3(); +int PS4_SYSV_ABI Func_ADFA04A85541A4FE(); +int PS4_SYSV_ABI Func_AE9610A6B5217A23(); +int PS4_SYSV_ABI Func_AF201923826F0A58(); +int PS4_SYSV_ABI Func_AFC021B4389CA3FA(); +int PS4_SYSV_ABI Func_B015E999A3373D8F(); +int PS4_SYSV_ABI Func_B0384B86107FC652(); +int PS4_SYSV_ABI Func_B0C630653B316563(); +int PS4_SYSV_ABI Func_B100DCCD88D5C73D(); +int PS4_SYSV_ABI Func_B11A3FEA5E4D9EA4(); +int PS4_SYSV_ABI Func_B2E7F8DC199C0B93(); +int PS4_SYSV_ABI Func_B3AB61A296F6DDC8(); +int PS4_SYSV_ABI Func_B3F32F6AE619EC82(); +int PS4_SYSV_ABI Func_B4227AB213BF8CF5(); +int PS4_SYSV_ABI Func_B4652BF42B604360(); +int PS4_SYSV_ABI Func_B536C1F13BFE97CB(); +int PS4_SYSV_ABI Func_B645CC264184BC89(); +int PS4_SYSV_ABI Func_B67E17B1582C6FBD(); +int PS4_SYSV_ABI Func_B6D047C5D7695A4D(); +int PS4_SYSV_ABI Func_B75ED8E1EA62EFC7(); +int PS4_SYSV_ABI Func_B7A9A944DBD7E100(); +int PS4_SYSV_ABI Func_B7C4E75BE94F31F3(); +int PS4_SYSV_ABI Func_B888B1F92C464121(); +int PS4_SYSV_ABI Func_B8DEC22564AA057B(); +int PS4_SYSV_ABI Func_B9BADD1CBBBAE4F8(); +int PS4_SYSV_ABI Func_BAA9F7169C85E59F(); +int PS4_SYSV_ABI Func_BAEE5C38908D62DB(); +int PS4_SYSV_ABI Func_BCC855EB25183F84(); +int PS4_SYSV_ABI Func_BD01F637029C7364(); +int PS4_SYSV_ABI Func_BDD29F5AC7077E53(); +int PS4_SYSV_ABI Func_BED83DD33ECAD50D(); +int PS4_SYSV_ABI Func_BEE7D5D098ABF728(); +int PS4_SYSV_ABI Func_C0DB15CCF59AE62C(); +int PS4_SYSV_ABI Func_C1C229FEE0FD60FA(); +int PS4_SYSV_ABI Func_C228B9AD68298E98(); +int PS4_SYSV_ABI Func_C298525CEF6FB283(); +int PS4_SYSV_ABI Func_C350F09351F6D6B5(); +int PS4_SYSV_ABI Func_C3742E80FA580319(); +int PS4_SYSV_ABI Func_C3C9853D5D4D45D4(); +int PS4_SYSV_ABI Func_C3F5DAD4FB9FC340(); +int PS4_SYSV_ABI Func_C45FB0E4CCE9AED6(); +int PS4_SYSV_ABI Func_C4979CB948B7E3C7(); +int PS4_SYSV_ABI Func_C49B25BA16CF0B8C(); +int PS4_SYSV_ABI Func_C551345D9631201E(); +int PS4_SYSV_ABI Func_C57A294421368298(); +int PS4_SYSV_ABI Func_C5DC91CAD721D628(); +int PS4_SYSV_ABI Func_C6DECEE589135357(); +int PS4_SYSV_ABI Func_C81F8B20D67AC78D(); +int PS4_SYSV_ABI Func_C820FA56FAC87BEA(); +int PS4_SYSV_ABI Func_C878EA9114C5E490(); +int PS4_SYSV_ABI Func_C8A813EBFF477509(); +int PS4_SYSV_ABI Func_C966A663D5A35482(); +int PS4_SYSV_ABI Func_C97C4C67FD3674D3(); +int PS4_SYSV_ABI Func_C990550F15848B07(); +int PS4_SYSV_ABI Func_CA59737A8EC1BBBE(); +int PS4_SYSV_ABI Func_CAC5FDE8F80D7B65(); +int PS4_SYSV_ABI Func_CB135B30D0639B83(); +int PS4_SYSV_ABI Func_CB8A1AAA61F64C3A(); +int PS4_SYSV_ABI Func_CB9E674672580757(); +int PS4_SYSV_ABI Func_CC2B9D25EAEAAB1D(); +int PS4_SYSV_ABI Func_CD1B252BBEDF5B53(); +int PS4_SYSV_ABI Func_CF003BE90CBE1A27(); +int PS4_SYSV_ABI Func_CF008E34884AC1E2(); +int PS4_SYSV_ABI Func_D0B8F4B3A3687AB2(); +int PS4_SYSV_ABI Func_D0EE19B8E91F60F5(); +int PS4_SYSV_ABI Func_D12B9294BD0E0F56(); +int PS4_SYSV_ABI Func_D1CC8626D8FA328B(); +int PS4_SYSV_ABI Func_D2FA2BB9EB8B63AC(); +int PS4_SYSV_ABI Func_D32197880CF93CEB(); +int PS4_SYSV_ABI Func_D326F5C26CC81B8E(); +int PS4_SYSV_ABI Func_D4FA06B95A321B7A(); +int PS4_SYSV_ABI Func_D52A37A901E04B21(); +int PS4_SYSV_ABI Func_D5504DFC399AB400(); +int PS4_SYSV_ABI Func_D56105CB27F8F5DC(); +int PS4_SYSV_ABI Func_D568AB19235ECB19(); +int PS4_SYSV_ABI Func_D6DF7BF6639FE611(); +int PS4_SYSV_ABI Func_D8608A903119D746(); +int PS4_SYSV_ABI Func_D9E8FC707D59914D(); +int PS4_SYSV_ABI Func_D9F079E62DEE5B29(); +int PS4_SYSV_ABI Func_DA17CE4F29748536(); +int PS4_SYSV_ABI Func_DA40B9EFD7F61185(); +int PS4_SYSV_ABI Func_DA6B274FEBC2666A(); +int PS4_SYSV_ABI Func_DAD01535C87A51FC(); +int PS4_SYSV_ABI Func_DB4511D448510EC4(); +int PS4_SYSV_ABI Func_DB8EF1FFFC66269C(); +int PS4_SYSV_ABI Func_DBB508FA1B9DA8F7(); +int PS4_SYSV_ABI Func_DC59C9B870B729A2(); +int PS4_SYSV_ABI Func_DC669ED6CBF6751C(); +int PS4_SYSV_ABI Func_DCB8A2849A41C991(); +int PS4_SYSV_ABI Func_DD8F9916D7F03AF7(); +int PS4_SYSV_ABI Func_DDC33F2F4E480C2A(); +int PS4_SYSV_ABI Func_DE0B420BDE8B22D7(); +int PS4_SYSV_ABI Func_E0C0BC29898FE370(); +int PS4_SYSV_ABI Func_E0CD893E46FB55BA(); +int PS4_SYSV_ABI Func_E25530164B7F659F(); +int PS4_SYSV_ABI Func_E3682F43FDF76C58(); +int PS4_SYSV_ABI Func_E38177E1C78A80FA(); +int PS4_SYSV_ABI Func_E3CA74CFF965DF0A(); +int PS4_SYSV_ABI Func_E45BB191B49B2ED9(); +int PS4_SYSV_ABI Func_E465B9D6B60E6D7D(); +int PS4_SYSV_ABI Func_E4D82876C296C38A(); +int PS4_SYSV_ABI Func_E4DDB5350FA5B538(); +int PS4_SYSV_ABI Func_E54BFF6FB72BC7BE(); +int PS4_SYSV_ABI Func_E592A93203020BBB(); +int PS4_SYSV_ABI Func_E5A44AF6D7D48AFD(); +int PS4_SYSV_ABI Func_E639A97CF9FF1430(); +int PS4_SYSV_ABI Func_E6AC0179E48A8927(); +int PS4_SYSV_ABI Func_E751596682775D83(); +int PS4_SYSV_ABI Func_E788B1E52EF82702(); +int PS4_SYSV_ABI Func_E94F17613F5C9D31(); +int PS4_SYSV_ABI Func_E9590113128D55E0(); +int PS4_SYSV_ABI Func_E9E0B0DD12560B16(); +int PS4_SYSV_ABI Func_EAF5C8ECE64C7B05(); +int PS4_SYSV_ABI Func_EB98BF5C42D4A7EB(); +int PS4_SYSV_ABI Func_EBABC4AAC43A468C(); +int PS4_SYSV_ABI Func_EBF00085F082CC8B(); +int PS4_SYSV_ABI Func_ECB659EE058D06AF(); +int PS4_SYSV_ABI Func_ECF096AB751487AE(); +int PS4_SYSV_ABI Func_EE5A271701DB33C0(); +int PS4_SYSV_ABI Func_EF64CB6A1625248E(); +int PS4_SYSV_ABI Func_EF6C8A357C7ED863(); +int PS4_SYSV_ABI Func_F00FE94F7E699994(); +int PS4_SYSV_ABI Func_F1A51DBA30329038(); +int PS4_SYSV_ABI Func_F216E766A90FDC12(); +int PS4_SYSV_ABI Func_F2A10584ABE5D82C(); +int PS4_SYSV_ABI Func_F2D99D395E5421A3(); +int PS4_SYSV_ABI Func_F38001E528BA1371(); +int PS4_SYSV_ABI Func_F39EC9C8FA7687B3(); +int PS4_SYSV_ABI Func_F3AFFFDCD632775C(); +int PS4_SYSV_ABI Func_F3B8DFF33748BFD3(); +int PS4_SYSV_ABI Func_F5E47F9550F7A147(); +int PS4_SYSV_ABI Func_F6E93714D1A939CF(); +int PS4_SYSV_ABI Func_F6FD19AD48E4EF09(); +int PS4_SYSV_ABI Func_F744EBFC620F7CBF(); +int PS4_SYSV_ABI Func_F76E4525ACBACC7F(); +int PS4_SYSV_ABI Func_F7957A48882F42CB(); +int PS4_SYSV_ABI Func_F7A80B07809BA838(); +int PS4_SYSV_ABI Func_F8571C6CC5B6B59D(); +int PS4_SYSV_ABI Func_F9787CFA873836FB(); +int PS4_SYSV_ABI Func_FA789F6D34D383F8(); +int PS4_SYSV_ABI Func_FABA574083AC1E6C(); +int PS4_SYSV_ABI Func_FC04FDBBAE368FB7(); +int PS4_SYSV_ABI Func_FD2DAFBF2E40EEE7(); +int PS4_SYSV_ABI Func_FD55EE6D35F950AD(); +int PS4_SYSV_ABI Func_FE55EE32098D0D58(); +int PS4_SYSV_ABI Func_FE79841022E1DA1C(); +int PS4_SYSV_ABI Func_FFF4A3E279FB44A7(); + +void RegisterlibSceNpCommon(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::NpCommon \ No newline at end of file diff --git a/src/core/libraries/np_common/np_common_error.h b/src/core/libraries/np_common/np_common_error.h new file mode 100644 index 000000000..5da6e6a90 --- /dev/null +++ b/src/core/libraries/np_common/np_common_error.h @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/libraries/error_codes.h" + +constexpr int ORBIS_NP_ERROR_INVALID_ARGUMENT = 0x80550003; +constexpr int ORBIS_NP_UTIL_ERROR_NOT_MATCH = 0x80550609; \ No newline at end of file diff --git a/src/core/libraries/np_manager/np_manager.cpp b/src/core/libraries/np_manager/np_manager.cpp index 87d752c69..3489e3e41 100644 --- a/src/core/libraries/np_manager/np_manager.cpp +++ b/src/core/libraries/np_manager/np_manager.cpp @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/config.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" From 5810c88c00390026ecc33a4244190843afe19b94 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 11 Jan 2025 12:04:46 -0800 Subject: [PATCH 053/455] hotfix: Fix cube instructions. --- .../frontend/translate/vector_alu.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 375c5f078..9d0cd8b4d 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -1069,9 +1069,9 @@ void Translator::V_CUBEID_F32(const GcnInst& inst) { const auto x_neg_cond{ir.FPLessThan(x, ir.Imm32(0.f))}; const auto y_neg_cond{ir.FPLessThan(y, ir.Imm32(0.f))}; const auto z_neg_cond{ir.FPLessThan(z, ir.Imm32(0.f))}; - const IR::F32 x_face{ir.Select(x_neg_cond, ir.Imm32(5.f), ir.Imm32(4.f))}; + const IR::F32 x_face{ir.Select(x_neg_cond, ir.Imm32(1.f), ir.Imm32(0.f))}; const IR::F32 y_face{ir.Select(y_neg_cond, ir.Imm32(3.f), ir.Imm32(2.f))}; - const IR::F32 z_face{ir.Select(z_neg_cond, ir.Imm32(1.f), ir.Imm32(0.f))}; + const IR::F32 z_face{ir.Select(z_neg_cond, ir.Imm32(5.f), ir.Imm32(4.f))}; result = SelectCubeResult(x, y, z, x_face, y_face, z_face); } @@ -1090,10 +1090,11 @@ void Translator::V_CUBESC_F32(const GcnInst& inst) { } else { const auto x_neg_cond{ir.FPLessThan(x, ir.Imm32(0.f))}; const auto z_neg_cond{ir.FPLessThan(z, ir.Imm32(0.f))}; - const IR::F32 x_sc{ir.Select(x_neg_cond, ir.FPNeg(x), x)}; - const IR::F32 z_sc{ir.Select(z_neg_cond, z, ir.FPNeg(z))}; + const IR::F32 x_sc{ir.Select(x_neg_cond, z, ir.FPNeg(z))}; + const IR::F32 y_sc{x}; + const IR::F32 z_sc{ir.Select(z_neg_cond, ir.FPNeg(x), x)}; - result = SelectCubeResult(x, y, z, x_sc, x, z_sc); + result = SelectCubeResult(x, y, z, x_sc, y_sc, z_sc); } SetDst(inst.dst[0], result); } @@ -1109,10 +1110,10 @@ void Translator::V_CUBETC_F32(const GcnInst& inst) { result = IR::F32{ir.CompositeExtract(coords, 1)}; } else { const auto y_neg_cond{ir.FPLessThan(y, ir.Imm32(0.f))}; - const IR::F32 x_z_sc{ir.FPNeg(y)}; - const IR::F32 y_sc{ir.Select(y_neg_cond, ir.FPNeg(z), z)}; + const IR::F32 x_z_tc{ir.FPNeg(y)}; + const IR::F32 y_tc{ir.Select(y_neg_cond, ir.FPNeg(z), z)}; - result = SelectCubeResult(x, y, z, x_z_sc, y_sc, x_z_sc); + result = SelectCubeResult(x, y, z, x_z_tc, y_tc, x_z_tc); } SetDst(inst.dst[0], result); } @@ -1122,7 +1123,7 @@ void Translator::V_CUBEMA_F32(const GcnInst& inst) { const auto y = GetSrc(inst.src[1]); const auto z = GetSrc(inst.src[2]); - const auto two{ir.Imm32(4.f)}; + const auto two{ir.Imm32(2.f)}; const IR::F32 x_major_axis{ir.FPMul(x, two)}; const IR::F32 y_major_axis{ir.FPMul(y, two)}; const IR::F32 z_major_axis{ir.FPMul(z, two)}; From 82cb298c5c666958598a1673aed63b95f66f2963 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 11 Jan 2025 13:57:49 -0800 Subject: [PATCH 054/455] shader_recompiler: Remove AMD native CubeFaceCoord. (#2129) --- .../backend/spirv/emit_spirv_image.cpp | 8 ----- .../backend/spirv/emit_spirv_instructions.h | 1 - .../frontend/translate/vector_alu.cpp | 32 ++++++------------- src/shader_recompiler/ir/ir_emitter.cpp | 4 --- src/shader_recompiler/ir/ir_emitter.h | 1 - src/shader_recompiler/ir/opcodes.inc | 1 - 6 files changed, 10 insertions(+), 37 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index b5ae507a0..e2a969b61 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -255,14 +255,6 @@ void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id ctx.OpImageWrite(image, coords, texel, operands.mask, operands.operands); } -Id EmitCubeFaceCoord(EmitContext& ctx, IR::Inst* inst, Id cube_coords) { - if (ctx.profile.supports_native_cube_calc) { - return ctx.OpCubeFaceCoordAMD(ctx.F32[2], cube_coords); - } else { - UNREACHABLE_MSG("SPIR-V Instruction"); - } -} - Id EmitCubeFaceIndex(EmitContext& ctx, IR::Inst* inst, Id cube_coords) { if (ctx.profile.supports_native_cube_calc) { return ctx.OpCubeFaceIndexAMD(ctx.F32[1], cube_coords); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 37b6f7786..f0bb9fd7e 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -439,7 +439,6 @@ Id EmitImageAtomicAnd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id EmitImageAtomicOr32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value); Id EmitImageAtomicXor32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value); Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value); -Id EmitCubeFaceCoord(EmitContext& ctx, IR::Inst* inst, Id cube_coords); Id EmitCubeFaceIndex(EmitContext& ctx, IR::Inst* inst, Id cube_coords); Id EmitLaneId(EmitContext& ctx); Id EmitWarpId(EmitContext& ctx); diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 9d0cd8b4d..fd5877c57 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -1083,19 +1083,13 @@ void Translator::V_CUBESC_F32(const GcnInst& inst) { const auto y = GetSrc(inst.src[1]); const auto z = GetSrc(inst.src[2]); - IR::F32 result; - if (profile.supports_native_cube_calc) { - const auto coords{ir.CubeFaceCoord(ir.CompositeConstruct(x, y, z))}; - result = IR::F32{ir.CompositeExtract(coords, 0)}; - } else { - const auto x_neg_cond{ir.FPLessThan(x, ir.Imm32(0.f))}; - const auto z_neg_cond{ir.FPLessThan(z, ir.Imm32(0.f))}; - const IR::F32 x_sc{ir.Select(x_neg_cond, z, ir.FPNeg(z))}; - const IR::F32 y_sc{x}; - const IR::F32 z_sc{ir.Select(z_neg_cond, ir.FPNeg(x), x)}; + const auto x_neg_cond{ir.FPLessThan(x, ir.Imm32(0.f))}; + const auto z_neg_cond{ir.FPLessThan(z, ir.Imm32(0.f))}; + const IR::F32 x_sc{ir.Select(x_neg_cond, z, ir.FPNeg(z))}; + const IR::F32 y_sc{x}; + const IR::F32 z_sc{ir.Select(z_neg_cond, ir.FPNeg(x), x)}; - result = SelectCubeResult(x, y, z, x_sc, y_sc, z_sc); - } + const auto result{SelectCubeResult(x, y, z, x_sc, y_sc, z_sc)}; SetDst(inst.dst[0], result); } @@ -1104,17 +1098,11 @@ void Translator::V_CUBETC_F32(const GcnInst& inst) { const auto y = GetSrc(inst.src[1]); const auto z = GetSrc(inst.src[2]); - IR::F32 result; - if (profile.supports_native_cube_calc) { - const auto coords{ir.CubeFaceCoord(ir.CompositeConstruct(x, y, z))}; - result = IR::F32{ir.CompositeExtract(coords, 1)}; - } else { - const auto y_neg_cond{ir.FPLessThan(y, ir.Imm32(0.f))}; - const IR::F32 x_z_tc{ir.FPNeg(y)}; - const IR::F32 y_tc{ir.Select(y_neg_cond, ir.FPNeg(z), z)}; + const auto y_neg_cond{ir.FPLessThan(y, ir.Imm32(0.f))}; + const IR::F32 x_z_tc{ir.FPNeg(y)}; + const IR::F32 y_tc{ir.Select(y_neg_cond, ir.FPNeg(z), z)}; - result = SelectCubeResult(x, y, z, x_z_tc, y_tc, x_z_tc); - } + const auto result{SelectCubeResult(x, y, z, x_z_tc, y_tc, x_z_tc)}; SetDst(inst.dst[0], result); } diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index 8626bdfd1..5ac08e7dc 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -1758,10 +1758,6 @@ void IREmitter::ImageWrite(const Value& handle, const Value& coords, const U32& Inst(Opcode::ImageWrite, Flags{info}, handle, coords, lod, multisampling, color); } -[[nodiscard]] Value IREmitter::CubeFaceCoord(const Value& cube_coords) { - return Inst(Opcode::CubeFaceCoord, cube_coords); -} - [[nodiscard]] F32 IREmitter::CubeFaceIndex(const Value& cube_coords) { return Inst(Opcode::CubeFaceIndex, cube_coords); } diff --git a/src/shader_recompiler/ir/ir_emitter.h b/src/shader_recompiler/ir/ir_emitter.h index 783709775..d1dc44d74 100644 --- a/src/shader_recompiler/ir/ir_emitter.h +++ b/src/shader_recompiler/ir/ir_emitter.h @@ -342,7 +342,6 @@ public: void ImageWrite(const Value& handle, const Value& coords, const U32& lod, const U32& multisampling, const Value& color, TextureInstInfo info); - [[nodiscard]] Value CubeFaceCoord(const Value& cube_coords); [[nodiscard]] F32 CubeFaceIndex(const Value& cube_coords); void EmitVertex(); diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index 19f45418f..b45151dba 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -375,7 +375,6 @@ OPCODE(ImageAtomicXor32, U32, Opaq OPCODE(ImageAtomicExchange32, U32, Opaque, Opaque, U32, ) // Cube operations - optional, usable if profile.supports_native_cube_calc -OPCODE(CubeFaceCoord, F32x2, F32x3, ) OPCODE(CubeFaceIndex, F32, F32x3, ) // Warp operations From 466e071c97af6ab734bbeb55d73f04e27135fd38 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 12 Jan 2025 03:24:12 -0600 Subject: [PATCH 055/455] Add libSceSsl2 stubs (#2132) * Auto-generate libSceSsl2 stubs * Copy over sceSslInit stub * Update CMakeLists.txt * Swap to Lib_Ssl2 log category * Fix compile Since libSceSsl has many functions of the same name, these functions get treated as overloaded functions and break compiling. * Clang --- CMakeLists.txt | 2 + src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/libs.cpp | 2 + src/core/libraries/network/ssl2.cpp | 353 ++++++++++++++++++++++++++++ src/core/libraries/network/ssl2.h | 14 ++ 6 files changed, 373 insertions(+) create mode 100644 src/core/libraries/network/ssl2.cpp create mode 100644 src/core/libraries/network/ssl2.h diff --git a/CMakeLists.txt b/CMakeLists.txt index aee01a3a5..84eaefbbb 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -263,6 +263,8 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/net.h src/core/libraries/network/ssl.cpp src/core/libraries/network/ssl.h + src/core/libraries/network/ssl2.cpp + src/core/libraries/network/ssl2.h ) set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index b15fb07be..6fe2ec4e4 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -96,6 +96,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, SaveDataDialog) \ SUB(Lib, Http) \ SUB(Lib, Ssl) \ + SUB(Lib, Ssl2) \ SUB(Lib, SysModule) \ SUB(Lib, Move) \ SUB(Lib, NpCommon) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index da4cf65e7..c42cf5665 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -63,6 +63,7 @@ enum class Class : u8 { Lib_SaveData, ///< The LibSceSaveData implementation. Lib_SaveDataDialog, ///< The LibSceSaveDataDialog implementation. Lib_Ssl, ///< The LibSceSsl implementation. + Lib_Ssl2, ///< The LibSceSsl2 implementation. Lib_Http, ///< The LibSceHttp implementation. Lib_SysModule, ///< The LibSceSysModule implementation Lib_NpCommon, ///< The LibSceNpCommon implementation diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index d03edf28e..b651bab44 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -24,6 +24,7 @@ #include "core/libraries/network/net.h" #include "core/libraries/network/netctl.h" #include "core/libraries/network/ssl.h" +#include "core/libraries/network/ssl2.h" #include "core/libraries/np_common/np_common.h" #include "core/libraries/np_manager/np_manager.h" #include "core/libraries/np_score/np_score.h" @@ -70,6 +71,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::SaveData::RegisterlibSceSaveData(sym); Libraries::SaveData::Dialog::RegisterlibSceSaveDataDialog(sym); Libraries::Ssl::RegisterlibSceSsl(sym); + Libraries::Ssl2::RegisterlibSceSsl2(sym); Libraries::SysModule::RegisterlibSceSysmodule(sym); Libraries::Posix::Registerlibsceposix(sym); Libraries::AudioIn::RegisterlibSceAudioIn(sym); diff --git a/src/core/libraries/network/ssl2.cpp b/src/core/libraries/network/ssl2.cpp new file mode 100644 index 000000000..8ca29526e --- /dev/null +++ b/src/core/libraries/network/ssl2.cpp @@ -0,0 +1,353 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "core/libraries/network/ssl2.h" + +namespace Libraries::Ssl2 { + +int PS4_SYSV_ABI CA_MGMT_extractKeyBlobEx() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI CA_MGMT_extractPublicKeyInfo() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI CA_MGMT_freeKeyBlob() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI CRYPTO_initAsymmetricKey() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI CRYPTO_uninitAsymmetricKey() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI RSA_verifySignature() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslCheckRecvPending() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslClose() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslConnect() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslCreateConnection() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslCreateSslConnection() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslDeleteConnection() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslDeleteSslConnection() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslDisableOption() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslDisableOptionInternal() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslDisableOptionInternalInsecure() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslDisableVerifyOption() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslEnableOption() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslEnableOptionInternal() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslEnableVerifyOption() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslFreeCaCerts() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslFreeCaList() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslFreeSslCertName() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetAlpnSelected() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetCaCerts() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetCaList() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetFingerprint() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetIssuerName() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetMemoryPoolStats() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetNameEntryCount() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetNameEntryInfo() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetNanoSSLModuleId() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetNotAfter() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetNotBefore() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetPeerCert() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetPem() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetSerialNumber() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetSslError() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslGetSubjectName() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslInit(std::size_t poolSize) { + LOG_ERROR(Lib_Ssl2, "(DUMMY) called poolSize = {}", poolSize); + // return a value >1 + static int id = 0; + return ++id; +} + +int PS4_SYSV_ABI sceSslLoadCert() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslLoadRootCACert() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslRead() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslRecv() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslReuseConnection() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslSend() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslSetAlpn() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslSetMinSslVersion() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslSetSslVersion() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslSetVerifyCallback() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslTerm() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslUnloadCert() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceSslWrite() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI VLONG_freeVlongQueue() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_22E76E60BC0587D7() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI Func_28F8791A771D39C7() { + LOG_ERROR(Lib_Ssl2, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceSsl2(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("Md+HYkCBZB4", "libSceSsl", 1, "libSceSsl", 2, 1, CA_MGMT_extractKeyBlobEx); + LIB_FUNCTION("9bKYzKP6kYU", "libSceSsl", 1, "libSceSsl", 2, 1, CA_MGMT_extractPublicKeyInfo); + LIB_FUNCTION("ipLIammTj2Q", "libSceSsl", 1, "libSceSsl", 2, 1, CA_MGMT_freeKeyBlob); + LIB_FUNCTION("PRWr3-ytpdg", "libSceSsl", 1, "libSceSsl", 2, 1, CRYPTO_initAsymmetricKey); + LIB_FUNCTION("cW7VCIMCh9A", "libSceSsl", 1, "libSceSsl", 2, 1, CRYPTO_uninitAsymmetricKey); + LIB_FUNCTION("pBwtarKd7eg", "libSceSsl", 1, "libSceSsl", 2, 1, RSA_verifySignature); + LIB_FUNCTION("1VM0h1JrUfA", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslCheckRecvPending); + LIB_FUNCTION("viRXSHZYd0c", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslClose); + LIB_FUNCTION("zXvd6iNyfgc", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslConnect); + LIB_FUNCTION("tuscfitnhEo", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslCreateConnection); + LIB_FUNCTION("P14ATpXc4J8", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslCreateSslConnection); + LIB_FUNCTION("HJ1n138CQ2g", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslDeleteConnection); + LIB_FUNCTION("hwrHV6Pprk4", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslDeleteSslConnection); + LIB_FUNCTION("iLKz4+ukLqk", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslDisableOption); + LIB_FUNCTION("-WqxBRAUVM4", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslDisableOptionInternal); + LIB_FUNCTION("w1+L-27nYas", "libSceSsl", 1, "libSceSsl", 2, 1, + sceSslDisableOptionInternalInsecure); + LIB_FUNCTION("PwsHbErG+e8", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslDisableVerifyOption); + LIB_FUNCTION("m-zPyAsIpco", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslEnableOption); + LIB_FUNCTION("g-zCwUKstEQ", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslEnableOptionInternal); + LIB_FUNCTION("po1X86mgHDU", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslEnableVerifyOption); + LIB_FUNCTION("qIvLs0gYxi0", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslFreeCaCerts); + LIB_FUNCTION("+DzXseDVkeI", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslFreeCaList); + LIB_FUNCTION("RwXD8grHZHM", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslFreeSslCertName); + LIB_FUNCTION("4O7+bRkRUe8", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetAlpnSelected); + LIB_FUNCTION("TDfQqO-gMbY", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetCaCerts); + LIB_FUNCTION("qOn+wm28wmA", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetCaList); + LIB_FUNCTION("brRtwGBu4A8", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetFingerprint); + LIB_FUNCTION("7whYpYfHP74", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetIssuerName); + LIB_FUNCTION("-PoIzr3PEk0", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetMemoryPoolStats); + LIB_FUNCTION("R1ePzopYPYM", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetNameEntryCount); + LIB_FUNCTION("7RBSTKGrmDA", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetNameEntryInfo); + LIB_FUNCTION("AzUipl-DpIw", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetNanoSSLModuleId); + LIB_FUNCTION("xHpt6+2pGYk", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetNotAfter); + LIB_FUNCTION("Eo0S65Jy28Q", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetNotBefore); + LIB_FUNCTION("-TbZc8pwPNc", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetPeerCert); + LIB_FUNCTION("kLB5aGoUJXg", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetPem); + LIB_FUNCTION("DOwXL+FQMEY", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetSerialNumber); + LIB_FUNCTION("0XcZknp7-Wc", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetSslError); + LIB_FUNCTION("dQReuBX9sD8", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslGetSubjectName); + LIB_FUNCTION("hdpVEUDFW3s", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslInit); + LIB_FUNCTION("Ab7+DH+gYyM", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslLoadCert); + LIB_FUNCTION("3-643mGVFJo", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslLoadRootCACert); + LIB_FUNCTION("jltWpVKtetg", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslRead); + LIB_FUNCTION("hi0veU3L2pU", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslRecv); + LIB_FUNCTION("50R2xYaYZwE", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslReuseConnection); + LIB_FUNCTION("p5bM5PPufFY", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslSend); + LIB_FUNCTION("TL86glUrmUw", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslSetAlpn); + LIB_FUNCTION("QWSxBzf6lAg", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslSetMinSslVersion); + LIB_FUNCTION("bKaEtQnoUuQ", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslSetSslVersion); + LIB_FUNCTION("E4a-ahM57QQ", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslSetVerifyCallback); + LIB_FUNCTION("0K1yQ6Lv-Yc", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslTerm); + LIB_FUNCTION("UQ+3Qu7v3cA", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslUnloadCert); + LIB_FUNCTION("iNjkt9Poblw", "libSceSsl", 1, "libSceSsl", 2, 1, sceSslWrite); + LIB_FUNCTION("wcVuyTUr5ys", "libSceSsl", 1, "libSceSsl", 2, 1, VLONG_freeVlongQueue); + LIB_FUNCTION("IuduYLwFh9c", "libSceSsl", 1, "libSceSsl", 2, 1, Func_22E76E60BC0587D7); + LIB_FUNCTION("KPh5GncdOcc", "libSceSsl", 1, "libSceSsl", 2, 1, Func_28F8791A771D39C7); +}; + +} // namespace Libraries::Ssl2 \ No newline at end of file diff --git a/src/core/libraries/network/ssl2.h b/src/core/libraries/network/ssl2.h new file mode 100644 index 000000000..03ee3b86e --- /dev/null +++ b/src/core/libraries/network/ssl2.h @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Ssl2 { +void RegisterlibSceSsl2(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Ssl2 \ No newline at end of file From 8a309c30a9fa893ff968c0db2b958d9e11847607 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 12 Jan 2025 03:24:49 -0600 Subject: [PATCH 056/455] Check thread param on posix_pthread_rename_np (#2133) --- src/core/libraries/kernel/threads/pthread.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/libraries/kernel/threads/pthread.cpp b/src/core/libraries/kernel/threads/pthread.cpp index e81207a0d..639ed1611 100644 --- a/src/core/libraries/kernel/threads/pthread.cpp +++ b/src/core/libraries/kernel/threads/pthread.cpp @@ -386,6 +386,9 @@ int PS4_SYSV_ABI posix_sched_get_priority_min() { } int PS4_SYSV_ABI posix_pthread_rename_np(PthreadT thread, const char* name) { + if (thread == nullptr) { + return POSIX_EINVAL; + } LOG_INFO(Kernel_Pthread, "name = {}", name); Common::SetThreadName(reinterpret_cast(thread->native_thr.GetHandle()), name); thread->name = name; From 394331f2066f25114d057e8bfc240dd63ebac2cb Mon Sep 17 00:00:00 2001 From: psucien <168137814+psucien@users.noreply.github.com> Date: Sun, 12 Jan 2025 19:25:25 +0100 Subject: [PATCH 057/455] video_core: detiler: display micro 64bpp (#2137) --- src/video_core/amdgpu/resource.h | 3 + src/video_core/host_shaders/CMakeLists.txt | 1 + .../detilers/display_micro_64bpp.comp | 60 +++++++++++++++++++ src/video_core/texture_cache/image_info.cpp | 1 + .../texture_cache/texture_cache.cpp | 6 +- src/video_core/texture_cache/tile_manager.cpp | 21 +++++-- src/video_core/texture_cache/tile_manager.h | 2 + 7 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 src/video_core/host_shaders/detilers/display_micro_64bpp.comp diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 744aacdc5..75b8b2acf 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -119,6 +119,7 @@ constexpr std::string_view NameOf(ImageType type) { enum class TilingMode : u32 { Depth_MacroTiled = 0u, Display_Linear = 0x8u, + Display_MicroTiled = 0x9u, Display_MacroTiled = 0xAu, Texture_MicroTiled = 0xDu, Texture_MacroTiled = 0xEu, @@ -131,6 +132,8 @@ constexpr std::string_view NameOf(TilingMode type) { return "Depth_MacroTiled"; case TilingMode::Display_Linear: return "Display_Linear"; + case TilingMode::Display_MicroTiled: + return "Display_MicroTiled"; case TilingMode::Display_MacroTiled: return "Display_MacroTiled"; case TilingMode::Texture_MicroTiled: diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index a9c2964ad..e60cca122 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later set(SHADER_FILES + detilers/display_micro_64bpp.comp detilers/macro_32bpp.comp detilers/macro_64bpp.comp detilers/macro_8bpp.comp diff --git a/src/video_core/host_shaders/detilers/display_micro_64bpp.comp b/src/video_core/host_shaders/detilers/display_micro_64bpp.comp new file mode 100644 index 000000000..3e0485682 --- /dev/null +++ b/src/video_core/host_shaders/detilers/display_micro_64bpp.comp @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#version 450 + +layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in; + +layout(std430, binding = 0) buffer input_buf { + uint in_data[]; +}; +layout(std430, binding = 1) buffer output_buf { + uint out_data[]; +}; + +layout(push_constant) uniform image_info { + uint num_levels; + uint pitch; + uint height; + uint c0; + uint c1; +} info; + +const uint lut_64bpp[16] = { + 0x05040100, 0x0d0c0908, + 0x07060302, 0x0f0e0b0a, + 0x15141110, 0x1d1c1918, + 0x17161312, 0x1f1e1b1a, + 0x25242120, 0x2d2c2928, + 0x27262322, 0x2f2e2b2a, + 0x35343130, 0x3d3c3938, + 0x37363332, 0x3f3e3b3a, +}; + +#define MICRO_TILE_DIM (8) +#define MICRO_TILE_SZ (512) +#define TEXELS_PER_ELEMENT (1) +#define BPP (64) + +void main() { + uint x = gl_GlobalInvocationID.x % info.pitch; + uint y = (gl_GlobalInvocationID.x / info.pitch) % info.height; + uint z = gl_GlobalInvocationID.x / (info.pitch * info.height); + + uint col = bitfieldExtract(x, 0, 3); + uint row = bitfieldExtract(y, 0, 3); + uint idx_dw = lut_64bpp[(col + row * MICRO_TILE_DIM) >> 2u]; + uint byte_ofs = gl_LocalInvocationID.x & 3u; + uint idx = bitfieldExtract(idx_dw >> (8 * byte_ofs), 0, 8); + + uint slice_offs = z * info.c1 * MICRO_TILE_SZ; + uint tile_row = y / MICRO_TILE_DIM; + uint tile_column = x / MICRO_TILE_DIM; + uint tile_offs = ((tile_row * info.c0) + tile_column) * MICRO_TILE_SZ; + uint offs = slice_offs + tile_offs + ((idx * BPP) / 8u); + + uint p0 = in_data[(offs >> 2) + 0]; + uint p1 = in_data[(offs >> 2) + 1]; + out_data[2 * gl_GlobalInvocationID.x + 0] = p0; + out_data[2 * gl_GlobalInvocationID.x + 1] = p1; +} diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 58c2a8e23..1992f1fb7 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -182,6 +182,7 @@ void ImageInfo::UpdateSize() { case AmdGpu::TilingMode::Texture_Volume: mip_d += (-mip_d) & 3u; [[fallthrough]]; + case AmdGpu::TilingMode::Display_MicroTiled: case AmdGpu::TilingMode::Texture_MicroTiled: { std::tie(mip_info.pitch, mip_info.size) = ImageSizeMicroTiled(mip_w, mip_h, bpp, num_samples); diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index bef083d1a..a281b89c9 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -469,9 +469,6 @@ ImageView& TextureCache::FindDepthTarget(BaseDesc& desc) { } void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_scheduler /*= nullptr*/) { - RENDERER_TRACE; - TRACE_HINT(fmt::format("{:x}:{:x}", image.info.guest_address, image.info.guest_size)); - if (False(image.flags & ImageFlagBits::Dirty)) { return; } @@ -480,6 +477,9 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule return; } + RENDERER_TRACE; + TRACE_HINT(fmt::format("{:x}:{:x}", image.info.guest_address, image.info.guest_size)); + if (True(image.flags & ImageFlagBits::MaybeCpuDirty) && False(image.flags & ImageFlagBits::CpuDirty)) { // The image size should be less than page size to be considered MaybeCpuDirty diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp index aba255ce5..ede91d128 100644 --- a/src/video_core/texture_cache/tile_manager.cpp +++ b/src/video_core/texture_cache/tile_manager.cpp @@ -8,6 +8,7 @@ #include "video_core/texture_cache/image_view.h" #include "video_core/texture_cache/tile_manager.h" +#include "video_core/host_shaders/detilers/display_micro_64bpp_comp.h" #include "video_core/host_shaders/detilers/macro_32bpp_comp.h" #include "video_core/host_shaders/detilers/macro_64bpp_comp.h" #include "video_core/host_shaders/detilers/macro_8bpp_comp.h" @@ -53,6 +54,14 @@ const DetilerContext* TileManager::GetDetiler(const ImageInfo& info) const { return nullptr; } break; + case AmdGpu::TilingMode::Display_MicroTiled: + switch (bpp) { + case 64: + return &detilers[DetilerType::Display_Micro64]; + default: + return nullptr; + } + break; default: return nullptr; } @@ -68,10 +77,11 @@ struct DetilerParams { TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& scheduler) : instance{instance}, scheduler{scheduler} { static const std::array detiler_shaders{ - HostShaders::MICRO_8BPP_COMP, HostShaders::MICRO_16BPP_COMP, - HostShaders::MICRO_32BPP_COMP, HostShaders::MICRO_64BPP_COMP, - HostShaders::MICRO_128BPP_COMP, HostShaders::MACRO_8BPP_COMP, - HostShaders::MACRO_32BPP_COMP, HostShaders::MACRO_64BPP_COMP, + HostShaders::MICRO_8BPP_COMP, HostShaders::MICRO_16BPP_COMP, + HostShaders::MICRO_32BPP_COMP, HostShaders::MICRO_64BPP_COMP, + HostShaders::MICRO_128BPP_COMP, HostShaders::MACRO_8BPP_COMP, + HostShaders::MACRO_32BPP_COMP, HostShaders::MACRO_64BPP_COMP, + HostShaders::DISPLAY_MICRO_64BPP_COMP, }; boost::container::static_vector bindings{ @@ -258,7 +268,8 @@ std::pair TileManager::TryDetile(vk::Buffer in_buffer, u32 in_o params.num_levels = info.resources.levels; params.pitch0 = info.pitch >> (info.props.is_block ? 2u : 0u); params.height = info.size.height; - if (info.tiling_mode == AmdGpu::TilingMode::Texture_Volume) { + if (info.tiling_mode == AmdGpu::TilingMode::Texture_Volume || + info.tiling_mode == AmdGpu::TilingMode::Display_MicroTiled) { ASSERT(info.resources.levels == 1); const auto tiles_per_row = info.pitch / 8u; const auto tiles_per_slice = tiles_per_row * ((info.size.height + 7u) / 8u); diff --git a/src/video_core/texture_cache/tile_manager.h b/src/video_core/texture_cache/tile_manager.h index 4eae7be9e..adda16b3d 100644 --- a/src/video_core/texture_cache/tile_manager.h +++ b/src/video_core/texture_cache/tile_manager.h @@ -22,6 +22,8 @@ enum DetilerType : u32 { Macro32, Macro64, + Display_Micro64, + Max }; From c6ab149c56f9a528da945d49302b67a50340cb79 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 12 Jan 2025 14:27:54 -0600 Subject: [PATCH 058/455] libSceHttp2 Stubs (#2139) * Auto-generate libSceHttp2 * Improved stub for sceHttp2Init Needed for updated versions of Cyberpunk 2077. Parameters are based on fpPS4, while the stub itself is based on similar stubs in our other networking libraries. * Clang I guess the line length calculations in the moduleGenerator are still not perfect? --- CMakeLists.txt | 2 + src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/libs.cpp | 2 + src/core/libraries/network/http2.cpp | 360 +++++++++++++++++++++++++++ src/core/libraries/network/http2.h | 72 ++++++ 6 files changed, 438 insertions(+) create mode 100644 src/core/libraries/network/http2.cpp create mode 100644 src/core/libraries/network/http2.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 84eaefbbb..30e6c58c0 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -254,6 +254,8 @@ set(KERNEL_LIB src/core/libraries/kernel/sync/mutex.cpp set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/http.h + src/core/libraries/network/http2.cpp + src/core/libraries/network/http2.h src/core/libraries/network/net.cpp src/core/libraries/network/netctl.cpp src/core/libraries/network/netctl.h diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 6fe2ec4e4..376c55ba7 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -95,6 +95,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, SaveData) \ SUB(Lib, SaveDataDialog) \ SUB(Lib, Http) \ + SUB(Lib, Http2) \ SUB(Lib, Ssl) \ SUB(Lib, Ssl2) \ SUB(Lib, SysModule) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index c42cf5665..535a88a6d 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -65,6 +65,7 @@ enum class Class : u8 { Lib_Ssl, ///< The LibSceSsl implementation. Lib_Ssl2, ///< The LibSceSsl2 implementation. Lib_Http, ///< The LibSceHttp implementation. + Lib_Http2, ///< The LibSceHttp2 implementation. Lib_SysModule, ///< The LibSceSysModule implementation Lib_NpCommon, ///< The LibSceNpCommon implementation Lib_NpManager, ///< The LibSceNpManager implementation diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index b651bab44..7427640b6 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -21,6 +21,7 @@ #include "core/libraries/mouse/mouse.h" #include "core/libraries/move/move.h" #include "core/libraries/network/http.h" +#include "core/libraries/network/http2.h" #include "core/libraries/network/net.h" #include "core/libraries/network/netctl.h" #include "core/libraries/network/ssl.h" @@ -66,6 +67,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::MsgDialog::RegisterlibSceMsgDialog(sym); Libraries::AudioOut::RegisterlibSceAudioOut(sym); Libraries::Http::RegisterlibSceHttp(sym); + Libraries::Http2::RegisterlibSceHttp2(sym); Libraries::Net::RegisterlibSceNet(sym); Libraries::NetCtl::RegisterlibSceNetCtl(sym); Libraries::SaveData::RegisterlibSceSaveData(sym); diff --git a/src/core/libraries/network/http2.cpp b/src/core/libraries/network/http2.cpp new file mode 100644 index 000000000..52f73edc6 --- /dev/null +++ b/src/core/libraries/network/http2.cpp @@ -0,0 +1,360 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "core/libraries/network/http2.h" + +namespace Libraries::Http2 { + +int PS4_SYSV_ABI _Z5dummyv() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2AbortRequest() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2AddCookie() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2AddRequestHeader() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2AuthCacheFlush() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2CookieExport() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2CookieFlush() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2CookieImport() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2CreateCookieBox() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2CreateRequestWithURL() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2CreateTemplate() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2DeleteCookieBox() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2DeleteRequest() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2DeleteTemplate() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetAllResponseHeaders() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetAuthEnabled() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetAutoRedirect() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetCookie() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetCookieBox() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetCookieStats() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetMemoryPoolStats() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetResponseContentLength() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2GetStatusCode() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2Init(int net_id, int ssl_id, size_t pool_size, int max_requests) { + LOG_ERROR(Lib_Http2, "(DUMMY) called"); + static int id = 0; + return ++id; +} + +int PS4_SYSV_ABI sceHttp2ReadData() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2ReadDataAsync() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2RedirectCacheFlush() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2RemoveRequestHeader() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SendRequest() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SendRequestAsync() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetAuthEnabled() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetAuthInfoCallback() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetAutoRedirect() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetConnectionWaitTimeOut() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetConnectTimeOut() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetCookieBox() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetCookieMaxNum() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetCookieMaxNumPerDomain() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetCookieMaxSize() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetCookieRecvCallback() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetCookieSendCallback() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetInflateGZIPEnabled() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetMinSslVersion() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetPreSendCallback() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetRecvTimeOut() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetRedirectCallback() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetRequestContentLength() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetResolveRetry() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetResolveTimeOut() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetSendTimeOut() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetSslCallback() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SetTimeOut() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SslDisableOption() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2SslEnableOption() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2Term() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttp2WaitAsync() { + LOG_ERROR(Lib_Http2, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceHttp2(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("AS45QoYHjc4", "libSceHttp2", 1, "libSceHttp2", 1, 1, _Z5dummyv); + LIB_FUNCTION("IZ-qjhRqvjk", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2AbortRequest); + LIB_FUNCTION("flPxnowtvWY", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2AddCookie); + LIB_FUNCTION("nrPfOE8TQu0", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2AddRequestHeader); + LIB_FUNCTION("WeuDjj5m4YU", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2AuthCacheFlush); + LIB_FUNCTION("JlFGR4v50Kw", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2CookieExport); + LIB_FUNCTION("5VlQSzXW-SQ", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2CookieFlush); + LIB_FUNCTION("B5ibZI5UlzU", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2CookieImport); + LIB_FUNCTION("N4UfjvWJsMw", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2CreateCookieBox); + LIB_FUNCTION("mmyOCxQMVYQ", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2CreateRequestWithURL); + LIB_FUNCTION("+wCt7fCijgk", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2CreateTemplate); + LIB_FUNCTION("O9ync3F-JVI", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2DeleteCookieBox); + LIB_FUNCTION("c8D9qIjo8EY", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2DeleteRequest); + LIB_FUNCTION("pDom5-078DA", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2DeleteTemplate); + LIB_FUNCTION("-rdXUi2XW90", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2GetAllResponseHeaders); + LIB_FUNCTION("m-OL13q8AI8", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2GetAuthEnabled); + LIB_FUNCTION("od5QCZhZSfw", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2GetAutoRedirect); + LIB_FUNCTION("GQFGj0rYX+A", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2GetCookie); + LIB_FUNCTION("IX23slKvtQI", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2GetCookieBox); + LIB_FUNCTION("eij7UzkUqK8", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2GetCookieStats); + LIB_FUNCTION("otUQuZa-mv0", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2GetMemoryPoolStats); + LIB_FUNCTION("o0DBQpFE13o", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2GetResponseContentLength); + LIB_FUNCTION("9XYJwCf3lEA", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2GetStatusCode); + LIB_FUNCTION("3JCe3lCbQ8A", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2Init); + LIB_FUNCTION("QygCNNmbGss", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2ReadData); + LIB_FUNCTION("bGN-6zbo7ms", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2ReadDataAsync); + LIB_FUNCTION("klwUy2Wg+q8", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2RedirectCacheFlush); + LIB_FUNCTION("jHdP0CS4ZlA", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2RemoveRequestHeader); + LIB_FUNCTION("rbqZig38AT8", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SendRequest); + LIB_FUNCTION("A+NVAFu4eCg", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SendRequestAsync); + LIB_FUNCTION("jjFahkBPCYs", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetAuthEnabled); + LIB_FUNCTION("Wwj6HbB2mOo", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetAuthInfoCallback); + LIB_FUNCTION("b9AvoIaOuHI", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetAutoRedirect); + LIB_FUNCTION("n8hMLe31OPA", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2SetConnectionWaitTimeOut); + LIB_FUNCTION("-HIO4VT87v8", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetConnectTimeOut); + LIB_FUNCTION("jrVHsKCXA0g", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetCookieBox); + LIB_FUNCTION("mPKVhQqh2Es", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetCookieMaxNum); + LIB_FUNCTION("o7+WXe4WadE", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2SetCookieMaxNumPerDomain); + LIB_FUNCTION("6a0N6GPD7RM", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetCookieMaxSize); + LIB_FUNCTION("zdtXKn9X7no", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2SetCookieRecvCallback); + LIB_FUNCTION("McYmUpQ3-DY", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2SetCookieSendCallback); + LIB_FUNCTION("uRosf8GQbHQ", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2SetInflateGZIPEnabled); + LIB_FUNCTION("09tk+kIA1Ns", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetMinSslVersion); + LIB_FUNCTION("UL4Fviw+IAM", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetPreSendCallback); + LIB_FUNCTION("izvHhqgDt44", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetRecvTimeOut); + LIB_FUNCTION("BJgi0CH7al4", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetRedirectCallback); + LIB_FUNCTION("FSAFOzi0FpM", "libSceHttp2", 1, "libSceHttp2", 1, 1, + sceHttp2SetRequestContentLength); + LIB_FUNCTION("Gcjh+CisAZM", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetResolveRetry); + LIB_FUNCTION("ACjtE27aErY", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetResolveTimeOut); + LIB_FUNCTION("XPtW45xiLHk", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetSendTimeOut); + LIB_FUNCTION("YrWX+DhPHQY", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetSslCallback); + LIB_FUNCTION("VYMxTcBqSE0", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SetTimeOut); + LIB_FUNCTION("B37SruheQ5Y", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SslDisableOption); + LIB_FUNCTION("EWcwMpbr5F8", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2SslEnableOption); + LIB_FUNCTION("YiBUtz-pGkc", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2Term); + LIB_FUNCTION("MOp-AUhdfi8", "libSceHttp2", 1, "libSceHttp2", 1, 1, sceHttp2WaitAsync); +}; + +} // namespace Libraries::Http2 \ No newline at end of file diff --git a/src/core/libraries/network/http2.h b/src/core/libraries/network/http2.h new file mode 100644 index 000000000..aa1d0c5b4 --- /dev/null +++ b/src/core/libraries/network/http2.h @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Http2 { + +int PS4_SYSV_ABI _Z5dummyv(); +int PS4_SYSV_ABI sceHttp2AbortRequest(); +int PS4_SYSV_ABI sceHttp2AddCookie(); +int PS4_SYSV_ABI sceHttp2AddRequestHeader(); +int PS4_SYSV_ABI sceHttp2AuthCacheFlush(); +int PS4_SYSV_ABI sceHttp2CookieExport(); +int PS4_SYSV_ABI sceHttp2CookieFlush(); +int PS4_SYSV_ABI sceHttp2CookieImport(); +int PS4_SYSV_ABI sceHttp2CreateCookieBox(); +int PS4_SYSV_ABI sceHttp2CreateRequestWithURL(); +int PS4_SYSV_ABI sceHttp2CreateTemplate(); +int PS4_SYSV_ABI sceHttp2DeleteCookieBox(); +int PS4_SYSV_ABI sceHttp2DeleteRequest(); +int PS4_SYSV_ABI sceHttp2DeleteTemplate(); +int PS4_SYSV_ABI sceHttp2GetAllResponseHeaders(); +int PS4_SYSV_ABI sceHttp2GetAuthEnabled(); +int PS4_SYSV_ABI sceHttp2GetAutoRedirect(); +int PS4_SYSV_ABI sceHttp2GetCookie(); +int PS4_SYSV_ABI sceHttp2GetCookieBox(); +int PS4_SYSV_ABI sceHttp2GetCookieStats(); +int PS4_SYSV_ABI sceHttp2GetMemoryPoolStats(); +int PS4_SYSV_ABI sceHttp2GetResponseContentLength(); +int PS4_SYSV_ABI sceHttp2GetStatusCode(); +int PS4_SYSV_ABI sceHttp2Init(int net_id, int ssl_id, size_t pool_size, int max_requests); +int PS4_SYSV_ABI sceHttp2ReadData(); +int PS4_SYSV_ABI sceHttp2ReadDataAsync(); +int PS4_SYSV_ABI sceHttp2RedirectCacheFlush(); +int PS4_SYSV_ABI sceHttp2RemoveRequestHeader(); +int PS4_SYSV_ABI sceHttp2SendRequest(); +int PS4_SYSV_ABI sceHttp2SendRequestAsync(); +int PS4_SYSV_ABI sceHttp2SetAuthEnabled(); +int PS4_SYSV_ABI sceHttp2SetAuthInfoCallback(); +int PS4_SYSV_ABI sceHttp2SetAutoRedirect(); +int PS4_SYSV_ABI sceHttp2SetConnectionWaitTimeOut(); +int PS4_SYSV_ABI sceHttp2SetConnectTimeOut(); +int PS4_SYSV_ABI sceHttp2SetCookieBox(); +int PS4_SYSV_ABI sceHttp2SetCookieMaxNum(); +int PS4_SYSV_ABI sceHttp2SetCookieMaxNumPerDomain(); +int PS4_SYSV_ABI sceHttp2SetCookieMaxSize(); +int PS4_SYSV_ABI sceHttp2SetCookieRecvCallback(); +int PS4_SYSV_ABI sceHttp2SetCookieSendCallback(); +int PS4_SYSV_ABI sceHttp2SetInflateGZIPEnabled(); +int PS4_SYSV_ABI sceHttp2SetMinSslVersion(); +int PS4_SYSV_ABI sceHttp2SetPreSendCallback(); +int PS4_SYSV_ABI sceHttp2SetRecvTimeOut(); +int PS4_SYSV_ABI sceHttp2SetRedirectCallback(); +int PS4_SYSV_ABI sceHttp2SetRequestContentLength(); +int PS4_SYSV_ABI sceHttp2SetResolveRetry(); +int PS4_SYSV_ABI sceHttp2SetResolveTimeOut(); +int PS4_SYSV_ABI sceHttp2SetSendTimeOut(); +int PS4_SYSV_ABI sceHttp2SetSslCallback(); +int PS4_SYSV_ABI sceHttp2SetTimeOut(); +int PS4_SYSV_ABI sceHttp2SslDisableOption(); +int PS4_SYSV_ABI sceHttp2SslEnableOption(); +int PS4_SYSV_ABI sceHttp2Term(); +int PS4_SYSV_ABI sceHttp2WaitAsync(); + +void RegisterlibSceHttp2(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Http2 \ No newline at end of file From 4f2f9494b02305a1b5d39e94eda63933972e15d9 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Sun, 12 Jan 2025 21:31:05 +0100 Subject: [PATCH 059/455] GUI: Speed up GUI loading by caching game sizes (#2130) * Add show game size toggle * Fix (#7) * Fix I removed the gameSizeCheckBox from the 'Emulator' group and put it in 'GUI settings' hLayoutTrophy which contains the Trophy information was inside the GUIMusicLayout, so I fixed that too. * TR * Use cached sizes if the feature is enabled --------- Co-authored-by: DanielSvoboda --- src/common/config.cpp | 11 +++ src/common/config.h | 2 + src/qt_gui/game_list_frame.cpp | 2 + src/qt_gui/game_list_utils.h | 35 ++++++++ src/qt_gui/settings_dialog.cpp | 2 + src/qt_gui/settings_dialog.ui | 143 ++++++++++++++++--------------- src/qt_gui/translations/ar.ts | 4 + src/qt_gui/translations/da_DK.ts | 4 + src/qt_gui/translations/de.ts | 4 + src/qt_gui/translations/el.ts | 4 + src/qt_gui/translations/en.ts | 4 + src/qt_gui/translations/es_ES.ts | 4 + src/qt_gui/translations/fa_IR.ts | 4 + src/qt_gui/translations/fi.ts | 4 + src/qt_gui/translations/fr.ts | 4 + src/qt_gui/translations/hu_HU.ts | 4 + src/qt_gui/translations/id.ts | 4 + src/qt_gui/translations/it.ts | 4 + src/qt_gui/translations/ja_JP.ts | 4 + src/qt_gui/translations/ko_KR.ts | 4 + src/qt_gui/translations/lt_LT.ts | 4 + src/qt_gui/translations/nb.ts | 4 + src/qt_gui/translations/nl.ts | 4 + src/qt_gui/translations/pl_PL.ts | 4 + src/qt_gui/translations/pt_BR.ts | 4 + src/qt_gui/translations/ro_RO.ts | 4 + src/qt_gui/translations/ru_RU.ts | 4 + src/qt_gui/translations/sq.ts | 4 + src/qt_gui/translations/sv.ts | 4 + src/qt_gui/translations/tr_TR.ts | 4 + src/qt_gui/translations/uk_UA.ts | 4 + src/qt_gui/translations/vi_VN.ts | 4 + src/qt_gui/translations/zh_CN.ts | 4 + src/qt_gui/translations/zh_TW.ts | 4 + 34 files changed, 239 insertions(+), 68 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index b46ab8d6e..158bfeddf 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -72,6 +72,7 @@ static bool checkCompatibilityOnStartup = false; static std::string trophyKey; // Gui +static bool load_game_size = true; std::vector settings_install_dirs = {}; std::filesystem::path settings_addon_install_dir = {}; u32 main_window_geometry_x = 400; @@ -102,6 +103,14 @@ void setTrophyKey(std::string key) { trophyKey = key; } +bool GetLoadGameSizeEnabled() { + return load_game_size; +} + +void setLoadGameSizeEnabled(bool enable) { + load_game_size = enable; +} + bool isNeoModeConsole() { return isNeo; } @@ -650,6 +659,7 @@ void load(const std::filesystem::path& path) { if (data.contains("GUI")) { const toml::value& gui = data.at("GUI"); + load_game_size = toml::find_or(gui, "loadGameSizeEnabled", true); m_icon_size = toml::find_or(gui, "iconSize", 0); m_icon_size_grid = toml::find_or(gui, "iconSizeGrid", 0); m_slider_pos = toml::find_or(gui, "sliderPos", 0); @@ -755,6 +765,7 @@ void save(const std::filesystem::path& path) { install_dirs.emplace_back(std::string{fmt::UTF(dirString.u8string()).data}); } data["GUI"]["installDirs"] = install_dirs; + data["GUI"]["loadGameSizeEnabled"] = load_game_size; data["GUI"]["addonInstallDir"] = std::string{fmt::UTF(settings_addon_install_dir.u8string()).data}; diff --git a/src/common/config.h b/src/common/config.h index 6e6a5d960..c86e35ebc 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -17,6 +17,8 @@ void saveMainWindow(const std::filesystem::path& path); std::string getTrophyKey(); void setTrophyKey(std::string key); +bool GetLoadGameSizeEnabled(); +void setLoadGameSizeEnabled(bool enable); bool getIsFullscreen(); std::string getFullscreenMode(); bool isNeoModeConsole(); diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index b1cd07216..9753f511b 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -106,6 +106,8 @@ void GameListFrame::PlayBackgroundMusic(QTableWidgetItem* item) { void GameListFrame::PopulateGameList() { // Do not show status column if it is not enabled this->setColumnHidden(2, !Config::getCompatibilityEnabled()); + this->setColumnHidden(6, !Config::GetLoadGameSizeEnabled()); + this->setRowCount(m_game_info->m_games.size()); ResizeIcons(icon_size); diff --git a/src/qt_gui/game_list_utils.h b/src/qt_gui/game_list_utils.h index ab9233886..581a8a55f 100644 --- a/src/qt_gui/game_list_utils.h +++ b/src/qt_gui/game_list_utils.h @@ -62,11 +62,46 @@ public: QDir dir(dirPath); QDirIterator it(dir.absolutePath(), QDirIterator::Subdirectories); qint64 total = 0; + + if (!Config::GetLoadGameSizeEnabled()) { + game.size = FormatSize(0).toStdString(); + return; + } + + // Cache path + QFile size_cache_file(Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / + game.serial / "size_cache.txt"); + QFileInfo cacheInfo(size_cache_file); + QFileInfo dirInfo(dirPath); + + // Check if cache file exists and is valid + if (size_cache_file.exists() && cacheInfo.lastModified() >= dirInfo.lastModified()) { + if (size_cache_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&size_cache_file); + QString cachedSize = in.readLine(); + size_cache_file.close(); + + if (!cachedSize.isEmpty()) { + game.size = cachedSize.toStdString(); + return; + } + } + } + + // Cache is invalid or does not exist; calculate size while (it.hasNext()) { it.next(); total += it.fileInfo().size(); } + game.size = FormatSize(total).toStdString(); + + // Save new cache + if (size_cache_file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&size_cache_file); + out << QString::fromStdString(game.size) << "\n"; + size_cache_file.close(); + } } static QString GetRegion(char region) { diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 3f4970dad..a4b584294 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -315,6 +315,7 @@ void SettingsDialog::LoadValuesFromConfig() { toml::find_or(data, "General", "FullscreenMode", "Borderless"))); ui->separateUpdatesCheckBox->setChecked( toml::find_or(data, "General", "separateUpdateEnabled", false)); + ui->gameSizeCheckBox->setChecked(toml::find_or(data, "GUI", "loadGameSizeEnabled", true)); ui->showSplashCheckBox->setChecked(toml::find_or(data, "General", "showSplash", false)); ui->logTypeComboBox->setCurrentText( QString::fromStdString(toml::find_or(data, "General", "logType", "async"))); @@ -568,6 +569,7 @@ void SettingsDialog::UpdateSettings() { Config::setDumpShaders(ui->dumpShadersCheckBox->isChecked()); Config::setNullGpu(ui->nullGpuCheckBox->isChecked()); Config::setSeparateUpdateEnabled(ui->separateUpdatesCheckBox->isChecked()); + Config::setLoadGameSizeEnabled(ui->gameSizeCheckBox->isChecked()); Config::setShowSplash(ui->showSplashCheckBox->isChecked()); Config::setDebugDump(ui->debugDump->isChecked()); Config::setVkValidation(ui->vkValidationCheckBox->isChecked()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 089158fd3..8d68d1c90 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -68,7 +68,7 @@ 0 0 946 - 536 + 586 @@ -134,7 +134,7 @@ - + Fullscreen Mode @@ -483,6 +483,13 @@ 11 + + + + Show Game Size In List + + + @@ -557,59 +564,59 @@ + + + + + + 6 + + + 0 + + + 50 + - - - 6 - - - 0 - - - 80 - + - - - - - Trophy - - - - - - Disable Trophy Pop-ups - - - - - - - Trophy Key - - - - - - - - 0 - 0 - - - - - 10 - false - - - - - - - - + + + Trophy + + + + + + Disable Trophy Pop-ups + + + + + + + Trophy Key + + + + + + + + 0 + 0 + + + + + 10 + false + + + + + + @@ -637,8 +644,8 @@ 0 0 - 926 - 536 + 946 + 586 @@ -853,13 +860,13 @@ - - - - Enable Motion Controls - - - + + + + Enable Motion Controls + + + @@ -935,8 +942,8 @@ 0 0 - 926 - 536 + 946 + 586 @@ -1186,8 +1193,8 @@ 0 0 - 926 - 536 + 946 + 586 @@ -1259,8 +1266,8 @@ 0 0 - 926 - 536 + 946 + 586 diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index 4fc9c2de1..a4dadcb1a 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + عرض حجم اللعبة في القائمة + Show Splash إظهار شاشة البداية diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index ef1ae27a3..70b7d3ecc 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Vis vis spilstørrelse i listen + Show Splash Show Splash diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 2fc6a29fe..7f1de3afd 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Zeigen Sie die Spielgröße in der Liste + Show Splash Startbildschirm anzeigen diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 8d3885808..84165536e 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Εμφάνιση Μεγέθους Παιχνιδιού στη Λίστα + Show Splash Show Splash diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 0262ee149..fad185d41 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Show Game Size In List + Show Splash Show Splash diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index a25ff639e..a97d3d3c8 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Mostrar Tamaño del Juego en la Lista + Show Splash Mostrar splash diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 52aa4b17c..697e615fb 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder فعال‌سازی پوشه جداگانه برای به‌روزرسانی + + Show Game Size In List + نمایش اندازه بازی در لیست + Show Splash Splash نمایش diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 97fee5dfa..51e85dfbb 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Ota Käyttöön Erillinen Päivityshakemisto + + Show Game Size In List + Näytä pelin koko luettelossa + Show Splash Näytä Aloitusnäyttö diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index d25ad30f4..35f3eb55f 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Dossier séparé pour les mises à jours + + Show Game Size In List + Afficher la taille du jeu dans la liste + Show Splash Afficher l'image du jeu diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 6ecc3fc90..a2bd9c1da 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Külön Frissítési Mappa Engedélyezése + + Show Game Size In List + Játékméret megjelenítése a listában + Show Splash Indítóképernyő Mutatása diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index fc5ad4a99..b97914ca2 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Tampilkan Ukuran Game di Daftar + Show Splash Show Splash diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index f7ba3661b..d4ea1c7e6 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Abilita Cartella Aggiornamenti Separata + + Show Game Size In List + Mostra la dimensione del gioco nell'elenco + Show Splash Mostra Schermata Iniziale diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 21c8145ed..359955765 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + ゲームサイズをリストに表示 + Show Splash スプラッシュを表示する diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index fea8d55bc..9cca0b656 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + 게임 크기를 목록에 표시 + Show Splash Show Splash diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index eaf51a975..0594bcbd2 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Rodyti žaidimo dydį sąraše + Show Splash Show Splash diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index 83dbf7dd8..8ca8246ba 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Aktiver seperat oppdateringsmappe + + Show Game Size In List + Vis spillstørrelse i listen + Show Splash Vis velkomstbilde diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 3142a17e5..12d644458 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Toon grootte van het spel in de lijst + Show Splash Show Splash diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 378673a30..782db12e2 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Pokaż rozmiar gry na liście + Show Splash Pokaż ekran powitania diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 5d9c84769..94bbf028a 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Habilitar pasta de atualização separada + + Show Game Size In List + Mostrar Tamanho do Jogo na Lista + Show Splash Mostrar Splash Inicial diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 71354fb06..3bd8e38b5 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Afișează dimensiunea jocului în listă + Show Splash Show Splash diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 0e803ea42..a38e2fd98 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Отдельная папка обновлений + + Show Game Size In List + Показать размер игры в списке + Show Splash Показывать заставку diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 7354b4bd9..a83dc9829 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Aktivizo dosjen e ndarë të përditësimit + + Show Game Size In List + Shfaq madhësinë e lojës në listë + Show Splash Shfaq Pamjen e nisjes diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 3a6f060cb..9a244a9df 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1032,6 +1032,10 @@ Enable Separate Update Folder Aktivera separat uppdateringsmapp + + Show Game Size In List + Visa spelstorlek i listan + Show Splash Visa startskärm diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 4596000f2..be50f935a 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Göster oyun boyutunu listede + Show Splash Başlangıç Ekranını Göster diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 5b260050e..ff4e48e80 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Увімкнути окрему папку оновлень + + Show Game Size In List + Показати розмір гри в списку + Show Splash Показувати заставку diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 7fcac6d7e..e546d955c 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + Hiển thị Kích thước Game trong Danh sách + Show Splash Show Splash diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index bb4476b9e..ece5f9490 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder 启用单独的更新目录 + + Show Game Size In List + 显示游戏大小在列表中 + Show Splash 显示启动画面 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 49d419d8b..11642d52b 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -540,6 +540,10 @@ Enable Separate Update Folder Enable Separate Update Folder + + Show Game Size In List + 顯示遊戲大小在列表中 + Show Splash Show Splash From 4719d32295095e6a084045629f6456c2a1f8b635 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 12 Jan 2025 12:44:42 -0800 Subject: [PATCH 060/455] sdl: Respect text input main thread requirements. (#2138) --- externals/sdl3 | 2 +- src/imgui/renderer/imgui_impl_sdl3.cpp | 41 ++++++++++---------------- src/sdl_window.cpp | 8 +++-- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/externals/sdl3 b/externals/sdl3 index 3a1d76d29..22422f774 160000 --- a/externals/sdl3 +++ b/externals/sdl3 @@ -1 +1 @@ -Subproject commit 3a1d76d298db023f6cf37fb08ee766f20a4e12ab +Subproject commit 22422f7748d5128135995ed34c8f8012861c7332 diff --git a/src/imgui/renderer/imgui_impl_sdl3.cpp b/src/imgui/renderer/imgui_impl_sdl3.cpp index 60b440c24..e67bdc775 100644 --- a/src/imgui/renderer/imgui_impl_sdl3.cpp +++ b/src/imgui/renderer/imgui_impl_sdl3.cpp @@ -11,7 +11,6 @@ #include #if defined(__APPLE__) #include -#include #endif #ifdef _WIN32 #ifndef WIN32_LEAN_AND_MEAN @@ -72,33 +71,25 @@ static void PlatformSetImeData(ImGuiContext*, ImGuiViewport* viewport, ImGuiPlat auto window_id = (SDL_WindowID)(intptr_t)viewport->PlatformHandle; SDL_Window* window = SDL_GetWindowFromID(window_id); if ((!data->WantVisible || bd->ime_window != window) && bd->ime_window != nullptr) { - auto stop_input = [&bd] { SDL_StopTextInput(bd->ime_window); }; -#ifdef __APPLE__ - dispatch_sync(dispatch_get_main_queue(), ^{ - stop_input(); - }); -#else - stop_input(); -#endif + SDL_RunOnMainThread( + [](void* userdata) { SDL_StopTextInput(static_cast(userdata)); }, + bd->ime_window, true); bd->ime_window = nullptr; } if (data->WantVisible) { - SDL_Rect r; - r.x = (int)data->InputPos.x; - r.y = (int)data->InputPos.y; - r.w = 1; - r.h = (int)data->InputLineHeight; - const auto start_input = [&window, &r] { - SDL_SetTextInputArea(window, &r, 0); - SDL_StartTextInput(window); - }; -#ifdef __APPLE__ - dispatch_sync(dispatch_get_main_queue(), ^{ - start_input(); - }); -#else - start_input(); -#endif + std::pair usr_data; + usr_data.first = window; + usr_data.second.x = (int)data->InputPos.x; + usr_data.second.y = (int)data->InputPos.y; + usr_data.second.w = 1; + usr_data.second.h = (int)data->InputLineHeight; + SDL_RunOnMainThread( + [](void* userdata) { + auto* params = static_cast*>(userdata); + SDL_SetTextInputArea(params->first, ¶ms->second, 0); + SDL_StartTextInput(params->first); + }, + &usr_data, true); bd->ime_window = window; } } diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index 318b3349b..b0126def2 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -205,7 +205,9 @@ void WindowSDL::InitTimers() { void WindowSDL::RequestKeyboard() { if (keyboard_grab == 0) { - SDL_StartTextInput(window); + SDL_RunOnMainThread( + [](void* userdata) { SDL_StartTextInput(static_cast(userdata)); }, window, + true); } keyboard_grab++; } @@ -214,7 +216,9 @@ void WindowSDL::ReleaseKeyboard() { ASSERT(keyboard_grab > 0); keyboard_grab--; if (keyboard_grab == 0) { - SDL_StopTextInput(window); + SDL_RunOnMainThread( + [](void* userdata) { SDL_StopTextInput(static_cast(userdata)); }, window, + true); } } From d94abffd9a6bba013fe2524a7e085ccfa253ced9 Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Mon, 13 Jan 2025 04:54:20 -0600 Subject: [PATCH 061/455] Fix: rename yakuza screenshot to correct game (#2141) --- dist/net.shadps4.shadPS4.metainfo.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/net.shadps4.shadPS4.metainfo.xml b/dist/net.shadps4.shadPS4.metainfo.xml index 384cf75e8..d8f51baac 100644 --- a/dist/net.shadps4.shadPS4.metainfo.xml +++ b/dist/net.shadps4.shadPS4.metainfo.xml @@ -26,7 +26,7 @@ https://cdn.jsdelivr.net/gh/shadps4-emu/shadps4@main/documents/Screenshots/3.png - Yakuza Kiwami + Yakuza 0 https://cdn.jsdelivr.net/gh/shadps4-emu/shadps4@main/documents/Screenshots/4.png From 5040be164090a10f79a505d2c709ca426fec69a4 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 14 Jan 2025 21:48:40 -0800 Subject: [PATCH 062/455] renderer_vulkan: Handle depth-stencil copies through depth render overrides. (#2134) --- src/core/devtools/widget/reg_popup.cpp | 3 +- src/core/devtools/widget/reg_view.cpp | 4 +- src/video_core/amdgpu/liverpool.h | 65 ++++++++++++++++- .../renderer_vulkan/vk_rasterizer.cpp | 73 +++++++++++++++++++ .../renderer_vulkan/vk_rasterizer.h | 1 + src/video_core/texture_cache/image_info.cpp | 7 +- src/video_core/texture_cache/image_info.h | 2 +- src/video_core/texture_cache/texture_cache.h | 4 +- 8 files changed, 146 insertions(+), 13 deletions(-) diff --git a/src/core/devtools/widget/reg_popup.cpp b/src/core/devtools/widget/reg_popup.cpp index fae620901..7bb38df24 100644 --- a/src/core/devtools/widget/reg_popup.cpp +++ b/src/core/devtools/widget/reg_popup.cpp @@ -105,7 +105,8 @@ void RegPopup::DrawDepthBuffer(const DepthBuffer& depth_data) { "DEPTH_SLICE.TILE_MAX", depth_buffer.depth_slice.tile_max, "Pitch()", depth_buffer.Pitch(), "Height()", depth_buffer.Height(), - "Address()", depth_buffer.Address(), + "DepthAddress()", depth_buffer.DepthAddress(), + "StencilAddress()", depth_buffer.StencilAddress(), "NumSamples()", depth_buffer.NumSamples(), "NumBits()", depth_buffer.NumBits(), "GetDepthSliceSize()", depth_buffer.GetDepthSliceSize() diff --git a/src/core/devtools/widget/reg_view.cpp b/src/core/devtools/widget/reg_view.cpp index a1b7937df..fa3c5e3e6 100644 --- a/src/core/devtools/widget/reg_view.cpp +++ b/src/core/devtools/widget/reg_view.cpp @@ -155,7 +155,7 @@ void RegView::DrawGraphicsRegs() { TableNextColumn(); TextUnformatted("Depth buffer"); TableNextColumn(); - if (regs.depth_buffer.Address() == 0 || !regs.depth_control.depth_enable) { + if (regs.depth_buffer.DepthAddress() == 0 || !regs.depth_control.depth_enable) { TextUnformatted("N/A"); } else { const char* text = last_selected_cb == depth_id && default_reg_popup.open ? "x" : "->"; @@ -241,7 +241,7 @@ void RegView::SetData(DebugStateType::RegDump _data, const std::string& base_tit default_reg_popup.open = false; if (last_selected_cb == depth_id) { const auto& has_depth = - regs.depth_buffer.Address() != 0 && regs.depth_control.depth_enable; + regs.depth_buffer.DepthAddress() != 0 && regs.depth_control.depth_enable; if (has_depth) { default_reg_popup.SetData(title, regs.depth_buffer, regs.depth_control); default_reg_popup.open = true; diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 070253ca9..a29bde4ce 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -429,11 +429,19 @@ struct Liverpool { } depth_slice; bool DepthValid() const { - return Address() != 0 && z_info.format != ZFormat::Invalid; + return DepthAddress() != 0 && z_info.format != ZFormat::Invalid; } bool StencilValid() const { - return Address() != 0 && stencil_info.format != StencilFormat::Invalid; + return StencilAddress() != 0 && stencil_info.format != StencilFormat::Invalid; + } + + bool DepthWriteValid() const { + return DepthWriteAddress() != 0 && z_info.format != ZFormat::Invalid; + } + + bool StencilWriteValid() const { + return StencilWriteAddress() != 0 && stencil_info.format != StencilFormat::Invalid; } u32 Pitch() const { @@ -444,7 +452,7 @@ struct Liverpool { return (depth_size.height_tile_max + 1) << 3; } - u64 Address() const { + u64 DepthAddress() const { return u64(z_read_base) << 8; } @@ -452,6 +460,14 @@ struct Liverpool { return u64(stencil_read_base) << 8; } + u64 DepthWriteAddress() const { + return u64(z_write_base) << 8; + } + + u64 StencilWriteAddress() const { + return u64(stencil_write_base) << 8; + } + u32 NumSamples() const { return 1u << z_info.num_samples; // spec doesn't say it is a log2 } @@ -1008,6 +1024,46 @@ struct Liverpool { } }; + enum class ForceEnable : u32 { + Off = 0, + Enable = 1, + Disable = 2, + }; + + enum class ForceSumm : u32 { + Off = 0, + MinZ = 1, + MaxZ = 2, + Both = 3, + }; + + union DepthRenderOverride { + u32 raw; + BitField<0, 2, ForceEnable> force_hiz_enable; + BitField<2, 2, ForceEnable> force_his_enable0; + BitField<4, 2, ForceEnable> force_his_enable1; + BitField<6, 1, u32> force_shader_z_order; + BitField<7, 1, u32> fast_z_disable; + BitField<8, 1, u32> fast_stencil_disable; + BitField<9, 1, u32> noop_cull_disable; + BitField<10, 1, u32> force_color_kill; + BitField<11, 1, u32> force_z_read; + BitField<12, 1, u32> force_stencil_read; + BitField<13, 2, ForceEnable> force_full_z_range; + BitField<15, 1, u32> force_qc_smask_conflict; + BitField<16, 1, u32> disable_viewport_clamp; + BitField<17, 1, u32> ignore_sc_zrange; + BitField<18, 1, u32> disable_fully_covered; + BitField<19, 2, ForceSumm> force_z_limit_summ; + BitField<21, 5, u32> max_tiles_in_dtt; + BitField<26, 1, u32> disable_tile_rate_tiles; + BitField<27, 1, u32> force_z_dirty; + BitField<28, 1, u32> force_stencil_dirty; + BitField<29, 1, u32> force_z_valid; + BitField<30, 1, u32> force_stencil_valid; + BitField<31, 1, u32> preserve_compression; + }; + union AaConfig { BitField<0, 3, u32> msaa_num_samples; BitField<4, 1, u32> aa_mask_centroid_dtmn; @@ -1209,7 +1265,8 @@ struct Liverpool { DepthRenderControl depth_render_control; INSERT_PADDING_WORDS(1); DepthView depth_view; - INSERT_PADDING_WORDS(2); + DepthRenderOverride depth_render_override; + INSERT_PADDING_WORDS(1); Address depth_htile_data_base; INSERT_PADDING_WORDS(2); float depth_bounds_min; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 920e09131..06cfbedac 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -70,6 +70,26 @@ bool Rasterizer::FilterDraw() { return false; } + const bool cb_disabled = + regs.color_control.mode == AmdGpu::Liverpool::ColorControl::OperationMode::Disable; + const auto depth_copy = + regs.depth_render_override.force_z_dirty && regs.depth_render_override.force_z_valid && + regs.depth_buffer.DepthValid() && regs.depth_buffer.DepthWriteValid() && + regs.depth_buffer.DepthAddress() != regs.depth_buffer.DepthWriteAddress(); + const auto stencil_copy = + regs.depth_render_override.force_stencil_dirty && + regs.depth_render_override.force_stencil_valid && regs.depth_buffer.StencilValid() && + regs.depth_buffer.StencilWriteValid() && + regs.depth_buffer.StencilAddress() != regs.depth_buffer.StencilWriteAddress(); + if (cb_disabled && (depth_copy || stencil_copy)) { + // Games may disable color buffer and enable force depth/stencil dirty and valid to + // do a copy from one depth-stencil surface to another, without a pixel shader. + // We need to detect this case and perform the copy, otherwise it will have no effect. + LOG_TRACE(Render_Vulkan, "Performing depth-stencil override copy"); + DepthStencilCopy(depth_copy, stencil_copy); + return false; + } + return true; } @@ -899,6 +919,59 @@ void Rasterizer::Resolve() { } } +void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) { + auto& regs = liverpool->regs; + + auto read_desc = VideoCore::TextureCache::DepthTargetDesc( + regs.depth_buffer, regs.depth_view, regs.depth_control, + regs.depth_htile_data_base.GetAddress(), liverpool->last_db_extent, false); + auto write_desc = VideoCore::TextureCache::DepthTargetDesc( + regs.depth_buffer, regs.depth_view, regs.depth_control, + regs.depth_htile_data_base.GetAddress(), liverpool->last_db_extent, true); + + auto& read_image = texture_cache.GetImage(texture_cache.FindImage(read_desc)); + auto& write_image = texture_cache.GetImage(texture_cache.FindImage(write_desc)); + + VideoCore::SubresourceRange sub_range; + sub_range.base.layer = liverpool->regs.depth_view.slice_start; + sub_range.extent.layers = liverpool->regs.depth_view.NumSlices() - sub_range.base.layer; + + read_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, + sub_range); + write_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, + sub_range); + + auto aspect_mask = vk::ImageAspectFlags(0); + if (is_depth) { + aspect_mask |= vk::ImageAspectFlagBits::eDepth; + } + if (is_stencil) { + aspect_mask |= vk::ImageAspectFlagBits::eStencil; + } + vk::ImageCopy region = { + .srcSubresource = + { + .aspectMask = aspect_mask, + .mipLevel = 0, + .baseArrayLayer = sub_range.base.layer, + .layerCount = sub_range.extent.layers, + }, + .srcOffset = {0, 0, 0}, + .dstSubresource = + { + .aspectMask = aspect_mask, + .mipLevel = 0, + .baseArrayLayer = sub_range.base.layer, + .layerCount = sub_range.extent.layers, + }, + .dstOffset = {0, 0, 0}, + .extent = {write_image.info.size.width, write_image.info.size.height, 1}, + }; + const auto cmdbuf = scheduler.CommandBuffer(); + cmdbuf.copyImage(read_image.image, vk::ImageLayout::eTransferSrcOptimal, write_image.image, + vk::ImageLayout::eTransferDstOptimal, region); +} + void Rasterizer::InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds) { buffer_cache.InlineData(address, value, num_bytes, is_gds); } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 2905c5ddb..1e4a210bb 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -71,6 +71,7 @@ private: RenderState PrepareRenderState(u32 mrt_mask); void BeginRendering(const GraphicsPipeline& pipeline, RenderState& state); void Resolve(); + void DepthStencilCopy(bool is_depth, bool is_stencil); void EliminateFastClear(); void UpdateDynamicState(const GraphicsPipeline& pipeline); diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 1992f1fb7..07a0488f3 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -98,7 +98,8 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer, } ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slices, - VAddr htile_address, const AmdGpu::Liverpool::CbDbExtent& hint) noexcept { + VAddr htile_address, const AmdGpu::Liverpool::CbDbExtent& hint, + bool write_buffer) noexcept { props.is_tiled = false; pixel_format = LiverpoolToVK::DepthFormat(buffer.z_info.format, buffer.stencil_info.format); type = vk::ImageType::e2D; @@ -111,10 +112,10 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slice resources.layers = num_slices; meta_info.htile_addr = buffer.z_info.tile_surface_en ? htile_address : 0; - stencil_addr = buffer.StencilAddress(); + stencil_addr = write_buffer ? buffer.StencilWriteAddress() : buffer.StencilAddress(); stencil_size = pitch * size.height * sizeof(u8); - guest_address = buffer.Address(); + guest_address = write_buffer ? buffer.DepthWriteAddress() : buffer.DepthAddress(); const auto depth_slice_sz = buffer.GetDepthSliceSize(); guest_size = depth_slice_sz * num_slices; mips_layout.emplace_back(depth_slice_sz, pitch, 0); diff --git a/src/video_core/texture_cache/image_info.h b/src/video_core/texture_cache/image_info.h index 123540c1e..dad0e751e 100644 --- a/src/video_core/texture_cache/image_info.h +++ b/src/video_core/texture_cache/image_info.h @@ -19,7 +19,7 @@ struct ImageInfo { ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer, const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept; ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slices, VAddr htile_address, - const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept; + const AmdGpu::Liverpool::CbDbExtent& hint = {}, bool write_buffer = false) noexcept; ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept; bool IsTiled() const { diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 69907f000..343a510e6 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -79,9 +79,9 @@ public: DepthTargetDesc(const AmdGpu::Liverpool::DepthBuffer& buffer, const AmdGpu::Liverpool::DepthView& view, const AmdGpu::Liverpool::DepthControl& ctl, VAddr htile_address, - const AmdGpu::Liverpool::CbDbExtent& hint = {}) + const AmdGpu::Liverpool::CbDbExtent& hint = {}, bool write_buffer = false) : BaseDesc{BindingType::DepthTarget, - ImageInfo{buffer, view.NumSlices(), htile_address, hint}, + ImageInfo{buffer, view.NumSlices(), htile_address, hint, write_buffer}, ImageViewInfo{buffer, view, ctl}} {} }; From c10f9b8269761c2c19ac8dfabafc384a77a63dc1 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 15 Jan 2025 05:19:41 -0600 Subject: [PATCH 063/455] Add libSceNpWebApi (#2150) Includes a dummy return for sceNpWebApiInitialize, to make it return a positive value. --- CMakeLists.txt | 2 + src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/libs.cpp | 2 + src/core/libraries/np_web_api/np_web_api.cpp | 692 +++++++++++++++++++ src/core/libraries/np_web_api/np_web_api.h | 116 ++++ 6 files changed, 814 insertions(+) create mode 100644 src/core/libraries/np_web_api/np_web_api.cpp create mode 100644 src/core/libraries/np_web_api/np_web_api.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 30e6c58c0..be87de119 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -430,6 +430,8 @@ set(NP_LIBS src/core/libraries/np_common/np_common.cpp src/core/libraries/np_trophy/trophy_ui.cpp src/core/libraries/np_trophy/trophy_ui.h src/core/libraries/np_trophy/np_trophy_error.h + src/core/libraries/np_web_api/np_web_api.cpp + src/core/libraries/np_web_api/np_web_api.h ) set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 376c55ba7..168d03948 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -104,6 +104,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, NpManager) \ SUB(Lib, NpScore) \ SUB(Lib, NpTrophy) \ + SUB(Lib, NpWebApi) \ SUB(Lib, Screenshot) \ SUB(Lib, LibCInternal) \ SUB(Lib, AppContent) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 535a88a6d..4ca88e1be 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -71,6 +71,7 @@ enum class Class : u8 { Lib_NpManager, ///< The LibSceNpManager implementation Lib_NpScore, ///< The LibSceNpScore implementation Lib_NpTrophy, ///< The LibSceNpTrophy implementation + Lib_NpWebApi, ///< The LibSceWebApi implementation Lib_Screenshot, ///< The LibSceScreenshot implementation Lib_LibCInternal, ///< The LibCInternal implementation. Lib_AppContent, ///< The LibSceAppContent implementation. diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 7427640b6..6dc455028 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -30,6 +30,7 @@ #include "core/libraries/np_manager/np_manager.h" #include "core/libraries/np_score/np_score.h" #include "core/libraries/np_trophy/np_trophy.h" +#include "core/libraries/np_web_api/np_web_api.h" #include "core/libraries/pad/pad.h" #include "core/libraries/playgo/playgo.h" #include "core/libraries/playgo/playgo_dialog.h" @@ -81,6 +82,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::NpManager::RegisterlibSceNpManager(sym); Libraries::NpScore::RegisterlibSceNpScore(sym); Libraries::NpTrophy::RegisterlibSceNpTrophy(sym); + Libraries::NpWebApi::RegisterlibSceNpWebApi(sym); Libraries::ScreenShot::RegisterlibSceScreenShot(sym); Libraries::AppContent::RegisterlibSceAppContent(sym); Libraries::PngDec::RegisterlibScePngDec(sym); diff --git a/src/core/libraries/np_web_api/np_web_api.cpp b/src/core/libraries/np_web_api/np_web_api.cpp new file mode 100644 index 000000000..8a7979978 --- /dev/null +++ b/src/core/libraries/np_web_api/np_web_api.cpp @@ -0,0 +1,692 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "core/libraries/np_web_api/np_web_api.h" + +namespace Libraries::NpWebApi { + +s32 PS4_SYSV_ABI sceNpWebApiCreateContext() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCreatePushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCreateServicePushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiDeletePushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiDeleteServicePushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiRegisterExtdPushEventCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiRegisterNotificationCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiRegisterPushEventCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiRegisterServicePushEventCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiUnregisterNotificationCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiUnregisterPushEventCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiUnregisterServicePushEventCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiAbortHandle() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiAbortRequest() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiAddHttpRequestHeader() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiAddMultipartPart() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCheckTimeout() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiClearAllUnusedConnection() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiClearUnusedConnection() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCreateContextA() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCreateExtdPushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCreateHandle() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCreateMultipartRequest() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiCreateRequest() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiDeleteContext() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiDeleteExtdPushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiDeleteHandle() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiDeleteRequest() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiGetConnectionStats() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiGetErrorCode() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiGetHttpResponseHeaderValue() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiGetHttpResponseHeaderValueLength() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiGetHttpStatusCode() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiGetMemoryPoolStats() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiInitialize() { + LOG_ERROR(Lib_NpWebApi, "(DUMMY) called"); + static s32 id = 0; + return ++id; +} + +s32 PS4_SYSV_ABI sceNpWebApiInitializeForPresence() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiIntCreateCtxIndExtdPushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiIntCreateRequest() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiIntCreateServicePushEventFilter() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiIntInitialize() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiIntRegisterServicePushEventCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiIntRegisterServicePushEventCallbackA() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiReadData() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiRegisterExtdPushEventCallbackA() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSendMultipartRequest() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSendMultipartRequest2() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSendRequest() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSendRequest2() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSetHandleTimeout() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSetMaxConnection() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSetMultipartContentType() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiSetRequestTimeout() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiTerminate() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiUnregisterExtdPushEventCallback() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiUtilityParseNpId() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpWebApiVshInitialize() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_064C4ED1EDBEB9E8() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_0783955D4E9563DA() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_1A6D77F3FD8323A8() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_1E0693A26FE0F954() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_24A9B5F1D77000CF() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_24AAA6F50E4C2361() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_24D8853D6B47FC79() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_279B3E9C7C4A9DC5() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_28461E29E9F8D697() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_3C29624704FAB9E0() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_3F027804ED2EC11E() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_4066C94E782997CD() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_47C85356815DBE90() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_4FCE8065437E3B87() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_536280BE3DABB521() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_57A0E1BC724219F3() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_5819749C040B6637() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_6198D0C825E86319() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_61F2B9E8AB093743() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_6BC388E6113F0D44() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_7500F0C4F8DC2D16() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_75A03814C7E9039F() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_789D6026C521416E() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_7DED63D06399EFFF() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_7E55A2DCC03D395A() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_7E6C8F9FB86967F4() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_7F04B7D4A7D41E80() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_8E167252DFA5C957() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_95D0046E504E3B09() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_97284BFDA4F18FDF() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_99E32C1F4737EAB4() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_9CFF661EA0BCBF83() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_9EB0E1F467AC3B29() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_A2318FE6FBABFAA3() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_BA07A2E1BF7B3971() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_BD0803EEE0CC29A0() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_BE6F4E5524BB135F() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_C0D490EB481EA4D0() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_C175D392CA6D084A() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_CD0136AF165D2F2F() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_D1C0ADB7B52FEAB5() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_E324765D18EE4D12() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_E789F980D907B653() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_F9A32E8685627436() { + LOG_ERROR(Lib_NpWebApi, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceNpWebApi(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("x1Y7yiYSk7c", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateContext); + LIB_FUNCTION("y5Ta5JCzQHY", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreatePushEventFilter); + LIB_FUNCTION("sIFx734+xys", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateServicePushEventFilter); + LIB_FUNCTION("zE+R6Rcx3W0", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeletePushEventFilter); + LIB_FUNCTION("PfQ+f6ws764", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeleteServicePushEventFilter); + LIB_FUNCTION("vrM02A5Gy1M", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterExtdPushEventCallback); + LIB_FUNCTION("HVgWmGIOKdk", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterNotificationCallback); + LIB_FUNCTION("PfSTDCgNMgc", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterPushEventCallback); + LIB_FUNCTION("kJQJE0uKm5w", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterServicePushEventCallback); + LIB_FUNCTION("wjYEvo4xbcA", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUnregisterNotificationCallback); + LIB_FUNCTION("qK4o2656W4w", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUnregisterPushEventCallback); + LIB_FUNCTION("2edrkr0c-wg", "libSceNpWebApiCompat", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUnregisterServicePushEventCallback); + LIB_FUNCTION("WKcm4PeyJww", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiAbortHandle); + LIB_FUNCTION("JzhYTP2fG18", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiAbortRequest); + LIB_FUNCTION("joRjtRXTFoc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiAddHttpRequestHeader); + LIB_FUNCTION("19KgfJXgM+U", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiAddMultipartPart); + LIB_FUNCTION("gVNNyxf-1Sg", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCheckTimeout); + LIB_FUNCTION("KQIkDGf80PQ", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiClearAllUnusedConnection); + LIB_FUNCTION("f-pgaNSd1zc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiClearUnusedConnection); + LIB_FUNCTION("x1Y7yiYSk7c", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateContext); + LIB_FUNCTION("zk6c65xoyO0", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateContextA); + LIB_FUNCTION("M2BUB+DNEGE", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateExtdPushEventFilter); + LIB_FUNCTION("79M-JqvvGo0", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateHandle); + LIB_FUNCTION("KBxgeNpoRIQ", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateMultipartRequest); + LIB_FUNCTION("y5Ta5JCzQHY", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreatePushEventFilter); + LIB_FUNCTION("rdgs5Z1MyFw", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateRequest); + LIB_FUNCTION("sIFx734+xys", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiCreateServicePushEventFilter); + LIB_FUNCTION("XUjdsSTTZ3U", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeleteContext); + LIB_FUNCTION("pfaJtb7SQ80", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeleteExtdPushEventFilter); + LIB_FUNCTION("5Mn7TYwpl30", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeleteHandle); + LIB_FUNCTION("zE+R6Rcx3W0", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeletePushEventFilter); + LIB_FUNCTION("noQgleu+KLE", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeleteRequest); + LIB_FUNCTION("PfQ+f6ws764", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiDeleteServicePushEventFilter); + LIB_FUNCTION("UJ8H+7kVQUE", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiGetConnectionStats); + LIB_FUNCTION("2qSZ0DgwTsc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiGetErrorCode); + LIB_FUNCTION("VwJ5L0Higg0", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiGetHttpResponseHeaderValue); + LIB_FUNCTION("743ZzEBzlV8", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiGetHttpResponseHeaderValueLength); + LIB_FUNCTION("k210oKgP80Y", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiGetHttpStatusCode); + LIB_FUNCTION("3OnubUs02UM", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiGetMemoryPoolStats); + LIB_FUNCTION("G3AnLNdRBjE", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, sceNpWebApiInitialize); + LIB_FUNCTION("FkuwsD64zoQ", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiInitializeForPresence); + LIB_FUNCTION("c1pKoztonB8", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiIntCreateCtxIndExtdPushEventFilter); + LIB_FUNCTION("N2Jbx4tIaQ4", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiIntCreateRequest); + LIB_FUNCTION("TZSep4xB4EY", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiIntCreateServicePushEventFilter); + LIB_FUNCTION("8Vjplhyyc44", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiIntInitialize); + LIB_FUNCTION("VjVukb2EWPc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiIntRegisterServicePushEventCallback); + LIB_FUNCTION("sfq23ZVHVEw", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiIntRegisterServicePushEventCallbackA); + LIB_FUNCTION("CQtPRSF6Ds8", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, sceNpWebApiReadData); + LIB_FUNCTION("vrM02A5Gy1M", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterExtdPushEventCallback); + LIB_FUNCTION("jhXKGQJ4egI", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterExtdPushEventCallbackA); + LIB_FUNCTION("HVgWmGIOKdk", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterNotificationCallback); + LIB_FUNCTION("PfSTDCgNMgc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterPushEventCallback); + LIB_FUNCTION("kJQJE0uKm5w", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiRegisterServicePushEventCallback); + LIB_FUNCTION("KCItz6QkeGs", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSendMultipartRequest); + LIB_FUNCTION("DsPOTEvSe7M", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSendMultipartRequest2); + LIB_FUNCTION("kVbL4hL3K7w", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSendRequest); + LIB_FUNCTION("KjNeZ-29ysQ", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSendRequest2); + LIB_FUNCTION("6g6q-g1i4XU", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSetHandleTimeout); + LIB_FUNCTION("gRiilVCvfAI", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSetMaxConnection); + LIB_FUNCTION("i0dr6grIZyc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSetMultipartContentType); + LIB_FUNCTION("qWcbJkBj1Lg", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiSetRequestTimeout); + LIB_FUNCTION("asz3TtIqGF8", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, sceNpWebApiTerminate); + LIB_FUNCTION("PqCY25FMzPs", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUnregisterExtdPushEventCallback); + LIB_FUNCTION("wjYEvo4xbcA", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUnregisterNotificationCallback); + LIB_FUNCTION("qK4o2656W4w", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUnregisterPushEventCallback); + LIB_FUNCTION("2edrkr0c-wg", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUnregisterServicePushEventCallback); + LIB_FUNCTION("or0e885BlXo", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiUtilityParseNpId); + LIB_FUNCTION("uRsskUhAfnM", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, + sceNpWebApiVshInitialize); + LIB_FUNCTION("BkxO0e2+ueg", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_064C4ED1EDBEB9E8); + LIB_FUNCTION("B4OVXU6VY9o", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_0783955D4E9563DA); + LIB_FUNCTION("Gm138-2DI6g", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_1A6D77F3FD8323A8); + LIB_FUNCTION("HgaTom-g+VQ", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_1E0693A26FE0F954); + LIB_FUNCTION("JKm18ddwAM8", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_24A9B5F1D77000CF); + LIB_FUNCTION("JKqm9Q5MI2E", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_24AAA6F50E4C2361); + LIB_FUNCTION("JNiFPWtH-Hk", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_24D8853D6B47FC79); + LIB_FUNCTION("J5s+nHxKncU", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_279B3E9C7C4A9DC5); + LIB_FUNCTION("KEYeKen41pc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_28461E29E9F8D697); + LIB_FUNCTION("PCliRwT6ueA", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_3C29624704FAB9E0); + LIB_FUNCTION("PwJ4BO0uwR4", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_3F027804ED2EC11E); + LIB_FUNCTION("QGbJTngpl80", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_4066C94E782997CD); + LIB_FUNCTION("R8hTVoFdvpA", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_47C85356815DBE90); + LIB_FUNCTION("T86AZUN+O4c", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_4FCE8065437E3B87); + LIB_FUNCTION("U2KAvj2rtSE", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_536280BE3DABB521); + LIB_FUNCTION("V6DhvHJCGfM", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_57A0E1BC724219F3); + LIB_FUNCTION("WBl0nAQLZjc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_5819749C040B6637); + LIB_FUNCTION("YZjQyCXoYxk", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_6198D0C825E86319); + LIB_FUNCTION("YfK56KsJN0M", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_61F2B9E8AB093743); + LIB_FUNCTION("a8OI5hE-DUQ", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_6BC388E6113F0D44); + LIB_FUNCTION("dQDwxPjcLRY", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_7500F0C4F8DC2D16); + LIB_FUNCTION("daA4FMfpA58", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_75A03814C7E9039F); + LIB_FUNCTION("eJ1gJsUhQW4", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_789D6026C521416E); + LIB_FUNCTION("fe1j0GOZ7-8", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_7DED63D06399EFFF); + LIB_FUNCTION("flWi3MA9OVo", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_7E55A2DCC03D395A); + LIB_FUNCTION("fmyPn7hpZ-Q", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_7E6C8F9FB86967F4); + LIB_FUNCTION("fwS31KfUHoA", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_7F04B7D4A7D41E80); + LIB_FUNCTION("jhZyUt+lyVc", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_8E167252DFA5C957); + LIB_FUNCTION("ldAEblBOOwk", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_95D0046E504E3B09); + LIB_FUNCTION("lyhL-aTxj98", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_97284BFDA4F18FDF); + LIB_FUNCTION("meMsH0c36rQ", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_99E32C1F4737EAB4); + LIB_FUNCTION("nP9mHqC8v4M", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_9CFF661EA0BCBF83); + LIB_FUNCTION("nrDh9GesOyk", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_9EB0E1F467AC3B29); + LIB_FUNCTION("ojGP5vur+qM", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_A2318FE6FBABFAA3); + LIB_FUNCTION("ugei4b97OXE", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_BA07A2E1BF7B3971); + LIB_FUNCTION("vQgD7uDMKaA", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_BD0803EEE0CC29A0); + LIB_FUNCTION("vm9OVSS7E18", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_BE6F4E5524BB135F); + LIB_FUNCTION("wNSQ60gepNA", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_C0D490EB481EA4D0); + LIB_FUNCTION("wXXTksptCEo", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_C175D392CA6D084A); + LIB_FUNCTION("zQE2rxZdLy8", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_CD0136AF165D2F2F); + LIB_FUNCTION("0cCtt7Uv6rU", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_D1C0ADB7B52FEAB5); + LIB_FUNCTION("4yR2XRjuTRI", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_E324765D18EE4D12); + LIB_FUNCTION("54n5gNkHtlM", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_E789F980D907B653); + LIB_FUNCTION("+aMuhoVidDY", "libSceNpWebApi", 1, "libSceNpWebApi", 1, 1, Func_F9A32E8685627436); +}; + +} // namespace Libraries::NpWebApi \ No newline at end of file diff --git a/src/core/libraries/np_web_api/np_web_api.h b/src/core/libraries/np_web_api/np_web_api.h new file mode 100644 index 000000000..cc007394f --- /dev/null +++ b/src/core/libraries/np_web_api/np_web_api.h @@ -0,0 +1,116 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::NpWebApi { + +s32 PS4_SYSV_ABI sceNpWebApiCreateContext(); +s32 PS4_SYSV_ABI sceNpWebApiCreatePushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiCreateServicePushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiDeletePushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiDeleteServicePushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiRegisterExtdPushEventCallback(); +s32 PS4_SYSV_ABI sceNpWebApiRegisterNotificationCallback(); +s32 PS4_SYSV_ABI sceNpWebApiRegisterPushEventCallback(); +s32 PS4_SYSV_ABI sceNpWebApiRegisterServicePushEventCallback(); +s32 PS4_SYSV_ABI sceNpWebApiUnregisterNotificationCallback(); +s32 PS4_SYSV_ABI sceNpWebApiUnregisterPushEventCallback(); +s32 PS4_SYSV_ABI sceNpWebApiUnregisterServicePushEventCallback(); +s32 PS4_SYSV_ABI sceNpWebApiAbortHandle(); +s32 PS4_SYSV_ABI sceNpWebApiAbortRequest(); +s32 PS4_SYSV_ABI sceNpWebApiAddHttpRequestHeader(); +s32 PS4_SYSV_ABI sceNpWebApiAddMultipartPart(); +s32 PS4_SYSV_ABI sceNpWebApiCheckTimeout(); +s32 PS4_SYSV_ABI sceNpWebApiClearAllUnusedConnection(); +s32 PS4_SYSV_ABI sceNpWebApiClearUnusedConnection(); +s32 PS4_SYSV_ABI sceNpWebApiCreateContextA(); +s32 PS4_SYSV_ABI sceNpWebApiCreateExtdPushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiCreateHandle(); +s32 PS4_SYSV_ABI sceNpWebApiCreateMultipartRequest(); +s32 PS4_SYSV_ABI sceNpWebApiCreateRequest(); +s32 PS4_SYSV_ABI sceNpWebApiDeleteContext(); +s32 PS4_SYSV_ABI sceNpWebApiDeleteExtdPushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiDeleteHandle(); +s32 PS4_SYSV_ABI sceNpWebApiDeleteRequest(); +s32 PS4_SYSV_ABI sceNpWebApiGetConnectionStats(); +s32 PS4_SYSV_ABI sceNpWebApiGetErrorCode(); +s32 PS4_SYSV_ABI sceNpWebApiGetHttpResponseHeaderValue(); +s32 PS4_SYSV_ABI sceNpWebApiGetHttpResponseHeaderValueLength(); +s32 PS4_SYSV_ABI sceNpWebApiGetHttpStatusCode(); +s32 PS4_SYSV_ABI sceNpWebApiGetMemoryPoolStats(); +s32 PS4_SYSV_ABI sceNpWebApiInitialize(); +s32 PS4_SYSV_ABI sceNpWebApiInitializeForPresence(); +s32 PS4_SYSV_ABI sceNpWebApiIntCreateCtxIndExtdPushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiIntCreateRequest(); +s32 PS4_SYSV_ABI sceNpWebApiIntCreateServicePushEventFilter(); +s32 PS4_SYSV_ABI sceNpWebApiIntInitialize(); +s32 PS4_SYSV_ABI sceNpWebApiIntRegisterServicePushEventCallback(); +s32 PS4_SYSV_ABI sceNpWebApiIntRegisterServicePushEventCallbackA(); +s32 PS4_SYSV_ABI sceNpWebApiReadData(); +s32 PS4_SYSV_ABI sceNpWebApiRegisterExtdPushEventCallbackA(); +s32 PS4_SYSV_ABI sceNpWebApiSendMultipartRequest(); +s32 PS4_SYSV_ABI sceNpWebApiSendMultipartRequest2(); +s32 PS4_SYSV_ABI sceNpWebApiSendRequest(); +s32 PS4_SYSV_ABI sceNpWebApiSendRequest2(); +s32 PS4_SYSV_ABI sceNpWebApiSetHandleTimeout(); +s32 PS4_SYSV_ABI sceNpWebApiSetMaxConnection(); +s32 PS4_SYSV_ABI sceNpWebApiSetMultipartContentType(); +s32 PS4_SYSV_ABI sceNpWebApiSetRequestTimeout(); +s32 PS4_SYSV_ABI sceNpWebApiTerminate(); +s32 PS4_SYSV_ABI sceNpWebApiUnregisterExtdPushEventCallback(); +s32 PS4_SYSV_ABI sceNpWebApiUtilityParseNpId(); +s32 PS4_SYSV_ABI sceNpWebApiVshInitialize(); +s32 PS4_SYSV_ABI Func_064C4ED1EDBEB9E8(); +s32 PS4_SYSV_ABI Func_0783955D4E9563DA(); +s32 PS4_SYSV_ABI Func_1A6D77F3FD8323A8(); +s32 PS4_SYSV_ABI Func_1E0693A26FE0F954(); +s32 PS4_SYSV_ABI Func_24A9B5F1D77000CF(); +s32 PS4_SYSV_ABI Func_24AAA6F50E4C2361(); +s32 PS4_SYSV_ABI Func_24D8853D6B47FC79(); +s32 PS4_SYSV_ABI Func_279B3E9C7C4A9DC5(); +s32 PS4_SYSV_ABI Func_28461E29E9F8D697(); +s32 PS4_SYSV_ABI Func_3C29624704FAB9E0(); +s32 PS4_SYSV_ABI Func_3F027804ED2EC11E(); +s32 PS4_SYSV_ABI Func_4066C94E782997CD(); +s32 PS4_SYSV_ABI Func_47C85356815DBE90(); +s32 PS4_SYSV_ABI Func_4FCE8065437E3B87(); +s32 PS4_SYSV_ABI Func_536280BE3DABB521(); +s32 PS4_SYSV_ABI Func_57A0E1BC724219F3(); +s32 PS4_SYSV_ABI Func_5819749C040B6637(); +s32 PS4_SYSV_ABI Func_6198D0C825E86319(); +s32 PS4_SYSV_ABI Func_61F2B9E8AB093743(); +s32 PS4_SYSV_ABI Func_6BC388E6113F0D44(); +s32 PS4_SYSV_ABI Func_7500F0C4F8DC2D16(); +s32 PS4_SYSV_ABI Func_75A03814C7E9039F(); +s32 PS4_SYSV_ABI Func_789D6026C521416E(); +s32 PS4_SYSV_ABI Func_7DED63D06399EFFF(); +s32 PS4_SYSV_ABI Func_7E55A2DCC03D395A(); +s32 PS4_SYSV_ABI Func_7E6C8F9FB86967F4(); +s32 PS4_SYSV_ABI Func_7F04B7D4A7D41E80(); +s32 PS4_SYSV_ABI Func_8E167252DFA5C957(); +s32 PS4_SYSV_ABI Func_95D0046E504E3B09(); +s32 PS4_SYSV_ABI Func_97284BFDA4F18FDF(); +s32 PS4_SYSV_ABI Func_99E32C1F4737EAB4(); +s32 PS4_SYSV_ABI Func_9CFF661EA0BCBF83(); +s32 PS4_SYSV_ABI Func_9EB0E1F467AC3B29(); +s32 PS4_SYSV_ABI Func_A2318FE6FBABFAA3(); +s32 PS4_SYSV_ABI Func_BA07A2E1BF7B3971(); +s32 PS4_SYSV_ABI Func_BD0803EEE0CC29A0(); +s32 PS4_SYSV_ABI Func_BE6F4E5524BB135F(); +s32 PS4_SYSV_ABI Func_C0D490EB481EA4D0(); +s32 PS4_SYSV_ABI Func_C175D392CA6D084A(); +s32 PS4_SYSV_ABI Func_CD0136AF165D2F2F(); +s32 PS4_SYSV_ABI Func_D1C0ADB7B52FEAB5(); +s32 PS4_SYSV_ABI Func_E324765D18EE4D12(); +s32 PS4_SYSV_ABI Func_E789F980D907B653(); +s32 PS4_SYSV_ABI Func_F9A32E8685627436(); + +void RegisterlibSceNpWebApi(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::NpWebApi \ No newline at end of file From 53d0a309ccd5d63dfacbdf6cf81d408f89ee5753 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 15 Jan 2025 07:33:15 -0800 Subject: [PATCH 064/455] liverpool_to_vk: Add R32Uint depth promote. (#2145) --- .../renderer_vulkan/liverpool_to_vk.h | 29 ++++++++++++++++++- src/video_core/texture_cache/image_view.cpp | 5 ++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.h b/src/video_core/renderer_vulkan/liverpool_to_vk.h index a68280e7d..a9fcd03a9 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.h +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.h @@ -71,8 +71,35 @@ vk::ClearValue ColorBufferClearValue(const AmdGpu::Liverpool::ColorBuffer& color vk::SampleCountFlagBits NumSamples(u32 num_samples, vk::SampleCountFlags supported_flags); +static inline bool IsFormatDepthCompatible(vk::Format fmt) { + switch (fmt) { + // 32-bit float compatible + case vk::Format::eD32Sfloat: + case vk::Format::eR32Sfloat: + case vk::Format::eR32Uint: + // 16-bit unorm compatible + case vk::Format::eD16Unorm: + case vk::Format::eR16Unorm: + return true; + default: + return false; + } +} + +static inline bool IsFormatStencilCompatible(vk::Format fmt) { + switch (fmt) { + // 8-bit uint compatible + case vk::Format::eS8Uint: + case vk::Format::eR8Uint: + case vk::Format::eR8Unorm: + return true; + default: + return false; + } +} + static inline vk::Format PromoteFormatToDepth(vk::Format fmt) { - if (fmt == vk::Format::eR32Sfloat) { + if (fmt == vk::Format::eR32Sfloat || fmt == vk::Format::eR32Uint) { return vk::Format::eD32Sfloat; } else if (fmt == vk::Format::eR16Unorm) { return vk::Format::eD16Unorm; diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index d90b78c67..e935c7d2e 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -82,13 +82,12 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info vk::Format format = info.format; vk::ImageAspectFlags aspect = image.aspect_mask; if (image.aspect_mask & vk::ImageAspectFlagBits::eDepth && - (format == vk::Format::eR32Sfloat || format == vk::Format::eD32Sfloat || - format == vk::Format::eR16Unorm || format == vk::Format::eD16Unorm)) { + Vulkan::LiverpoolToVK::IsFormatDepthCompatible(format)) { format = image.info.pixel_format; aspect = vk::ImageAspectFlagBits::eDepth; } if (image.aspect_mask & vk::ImageAspectFlagBits::eStencil && - (format == vk::Format::eR8Uint || format == vk::Format::eR8Unorm)) { + Vulkan::LiverpoolToVK::IsFormatStencilCompatible(format)) { format = image.info.pixel_format; aspect = vk::ImageAspectFlagBits::eStencil; } From 5a7d45fdfa774e9eb4bc066c44736ad33a54d13f Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:37:20 -0600 Subject: [PATCH 065/455] Missing pthread exports (#2144) --- src/core/libraries/kernel/threads/condvar.cpp | 5 +++++ src/core/libraries/kernel/threads/mutex.cpp | 3 +++ src/core/libraries/kernel/threads/pthread.cpp | 1 + 3 files changed, 9 insertions(+) diff --git a/src/core/libraries/kernel/threads/condvar.cpp b/src/core/libraries/kernel/threads/condvar.cpp index 853526559..0b0545ace 100644 --- a/src/core/libraries/kernel/threads/condvar.cpp +++ b/src/core/libraries/kernel/threads/condvar.cpp @@ -339,6 +339,8 @@ int PS4_SYSV_ABI posix_pthread_condattr_setpshared(PthreadCondAttrT* attr, int p void RegisterCond(Core::Loader::SymbolsResolver* sym) { // Posix LIB_FUNCTION("mKoTx03HRWA", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_condattr_init); + LIB_FUNCTION("dJcuQVn6-Iw", "libScePosix", 1, "libkernel", 1, 1, + posix_pthread_condattr_destroy); LIB_FUNCTION("0TyVk4MSLt0", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_cond_init); LIB_FUNCTION("2MOy+rUfuhQ", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_cond_signal); LIB_FUNCTION("RXXqi4CtF8w", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_cond_destroy); @@ -347,8 +349,11 @@ void RegisterCond(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("mkx2fVhNMsg", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_cond_broadcast); // Posix-Kernel + LIB_FUNCTION("0TyVk4MSLt0", "libkernel", 1, "libkernel", 1, 1, posix_pthread_cond_init); LIB_FUNCTION("Op8TBGY5KHg", "libkernel", 1, "libkernel", 1, 1, posix_pthread_cond_wait); LIB_FUNCTION("mkx2fVhNMsg", "libkernel", 1, "libkernel", 1, 1, posix_pthread_cond_broadcast); + LIB_FUNCTION("mKoTx03HRWA", "libkernel", 1, "libkernel", 1, 1, posix_pthread_condattr_init); + LIB_FUNCTION("dJcuQVn6-Iw", "libkernel", 1, "libkernel", 1, 1, posix_pthread_condattr_destroy); // Orbis LIB_FUNCTION("2Tb92quprl0", "libkernel", 1, "libkernel", 1, 1, ORBIS(scePthreadCondInit)); diff --git a/src/core/libraries/kernel/threads/mutex.cpp b/src/core/libraries/kernel/threads/mutex.cpp index 4f11e32da..956e5ef65 100644 --- a/src/core/libraries/kernel/threads/mutex.cpp +++ b/src/core/libraries/kernel/threads/mutex.cpp @@ -438,8 +438,11 @@ void RegisterMutex(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("K-jXhbt2gn4", "libScePosix", 1, "libkernel", 1, 1, posix_pthread_mutex_trylock); // Posix-Kernel + LIB_FUNCTION("ttHNfU+qDBU", "libkernel", 1, "libkernel", 1, 1, posix_pthread_mutex_init); LIB_FUNCTION("7H0iTOciTLo", "libkernel", 1, "libkernel", 1, 1, posix_pthread_mutex_lock); LIB_FUNCTION("2Z+PpY6CaJg", "libkernel", 1, "libkernel", 1, 1, posix_pthread_mutex_unlock); + LIB_FUNCTION("dQHWEsJtoE4", "libkernel", 1, "libkernel", 1, 1, posix_pthread_mutexattr_init); + LIB_FUNCTION("mDmgMOGVUqg", "libkernel", 1, "libkernel", 1, 1, posix_pthread_mutexattr_settype); // Orbis LIB_FUNCTION("cmo1RIYva9o", "libkernel", 1, "libkernel", 1, 1, ORBIS(scePthreadMutexInit)); diff --git a/src/core/libraries/kernel/threads/pthread.cpp b/src/core/libraries/kernel/threads/pthread.cpp index 639ed1611..641fbe10d 100644 --- a/src/core/libraries/kernel/threads/pthread.cpp +++ b/src/core/libraries/kernel/threads/pthread.cpp @@ -538,6 +538,7 @@ void RegisterThread(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("6XG4B33N09g", "libScePosix", 1, "libkernel", 1, 1, sched_yield); // Posix-Kernel + LIB_FUNCTION("Z4QosVuAsA0", "libkernel", 1, "libkernel", 1, 1, posix_pthread_once); LIB_FUNCTION("EotR8a3ASf4", "libkernel", 1, "libkernel", 1, 1, posix_pthread_self); LIB_FUNCTION("OxhIB8LB-PQ", "libkernel", 1, "libkernel", 1, 1, posix_pthread_create); From 1c3048ccc20e2f50901bffd13296e2c2cf66512b Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Wed, 15 Jan 2025 12:45:02 -0300 Subject: [PATCH 066/455] Fix V_FRACT_F64 (#2156) --- src/shader_recompiler/frontend/translate/vector_alu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index fd5877c57..b2863f6a8 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -844,7 +844,7 @@ void Translator::V_FREXP_MANT_F64(const GcnInst& inst) { } void Translator::V_FRACT_F64(const GcnInst& inst) { - const IR::F32 src0{GetSrc64(inst.src[0])}; + const IR::F64 src0{GetSrc64(inst.src[0])}; SetDst64(inst.dst[0], ir.FPFract(src0)); } From b3739bea92d9028419b295742c15203b150d5b4d Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 16 Jan 2025 02:14:34 -0800 Subject: [PATCH 067/455] renderer_vulkan: Simplify debug marker settings. (#2159) * renderer_vulkan: Simplify debug marker settings. * liverpool: Add scope markers for graphics/compute queues. * liverpool: Remove unneeded extra label from command buffer markers. * vk_rasterizer: Add scopes around filtered draw passes. --- src/common/config.cpp | 38 +++++++----- src/common/config.h | 3 +- src/emulator.cpp | 5 +- src/imgui/renderer/imgui_core.cpp | 4 +- src/video_core/amdgpu/liverpool.cpp | 46 +++++++++----- src/video_core/buffer_cache/buffer.cpp | 2 + .../renderer_vulkan/vk_instance.cpp | 11 +--- src/video_core/renderer_vulkan/vk_instance.h | 11 +--- src/video_core/renderer_vulkan/vk_platform.h | 7 +++ .../renderer_vulkan/vk_rasterizer.cpp | 62 ++++++++++++------- .../renderer_vulkan/vk_rasterizer.h | 9 +-- .../renderer_vulkan/vk_resource_pool.cpp | 10 +-- .../renderer_vulkan/vk_swapchain.cpp | 15 ++--- src/video_core/texture_cache/image_view.cpp | 7 +++ 14 files changed, 132 insertions(+), 98 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 158bfeddf..9c842f8b7 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -61,9 +61,10 @@ static u32 vblankDivider = 1; static bool vkValidation = false; static bool vkValidationSync = false; static bool vkValidationGpu = false; -static bool rdocEnable = false; -static bool vkMarkers = false; static bool vkCrashDiagnostic = false; +static bool vkHostMarkers = false; +static bool vkGuestMarkers = false; +static bool rdocEnable = false; static s16 cursorState = HideCursorState::Idle; static int cursorHideTimeout = 5; // 5 seconds (default) static bool separateupdatefolder = false; @@ -227,10 +228,6 @@ bool isRdocEnabled() { return rdocEnable; } -bool isMarkersEnabled() { - return vkMarkers; -} - u32 vblankDiv() { return vblankDivider; } @@ -247,14 +244,20 @@ bool vkValidationGpuEnabled() { return vkValidationGpu; } -bool vkMarkersEnabled() { - return vkMarkers || vkCrashDiagnostic; // Crash diagnostic forces markers on -} - bool vkCrashDiagnosticEnabled() { return vkCrashDiagnostic; } +bool vkHostMarkersEnabled() { + // Forced on when crash diagnostic enabled. + return vkHostMarkers || vkCrashDiagnostic; +} + +bool vkGuestMarkersEnabled() { + // Forced on when crash diagnostic enabled. + return vkGuestMarkers || vkCrashDiagnostic; +} + bool getSeparateUpdateEnabled() { return separateupdatefolder; } @@ -644,9 +647,10 @@ void load(const std::filesystem::path& path) { vkValidation = toml::find_or(vk, "validation", false); vkValidationSync = toml::find_or(vk, "validation_sync", false); vkValidationGpu = toml::find_or(vk, "validation_gpu", true); - rdocEnable = toml::find_or(vk, "rdocEnable", false); - vkMarkers = toml::find_or(vk, "rdocMarkersEnable", false); vkCrashDiagnostic = toml::find_or(vk, "crashDiagnostic", false); + vkHostMarkers = toml::find_or(vk, "hostMarkers", false); + vkGuestMarkers = toml::find_or(vk, "guestMarkers", false); + rdocEnable = toml::find_or(vk, "rdocEnable", false); } if (data.contains("Debug")) { @@ -752,9 +756,10 @@ void save(const std::filesystem::path& path) { data["Vulkan"]["validation"] = vkValidation; data["Vulkan"]["validation_sync"] = vkValidationSync; data["Vulkan"]["validation_gpu"] = vkValidationGpu; - data["Vulkan"]["rdocEnable"] = rdocEnable; - data["Vulkan"]["rdocMarkersEnable"] = vkMarkers; data["Vulkan"]["crashDiagnostic"] = vkCrashDiagnostic; + data["Vulkan"]["hostMarkers"] = vkHostMarkers; + data["Vulkan"]["guestMarkers"] = vkGuestMarkers; + data["Vulkan"]["rdocEnable"] = rdocEnable; data["Debug"]["DebugDump"] = isDebugDump; data["Debug"]["CollectShader"] = isShaderDebug; @@ -852,9 +857,10 @@ void setDefaultValues() { vkValidation = false; vkValidationSync = false; vkValidationGpu = false; - rdocEnable = false; - vkMarkers = false; vkCrashDiagnostic = false; + vkHostMarkers = false; + vkGuestMarkers = false; + rdocEnable = false; emulator_language = "en"; m_language = 1; gpuId = -1; diff --git a/src/common/config.h b/src/common/config.h index c86e35ebc..f9e4c2815 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -100,8 +100,9 @@ void setRdocEnabled(bool enable); bool vkValidationEnabled(); bool vkValidationSyncEnabled(); bool vkValidationGpuEnabled(); -bool vkMarkersEnabled(); bool vkCrashDiagnosticEnabled(); +bool vkHostMarkersEnabled(); +bool vkGuestMarkersEnabled(); // Gui void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h); diff --git a/src/emulator.cpp b/src/emulator.cpp index dbe693340..61d6d3862 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -66,9 +66,10 @@ Emulator::Emulator() { LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled()); LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled()); LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled()); - LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled()); - LOG_INFO(Config, "Vulkan rdocMarkersEnable: {}", Config::vkMarkersEnabled()); LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::vkCrashDiagnosticEnabled()); + LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::vkHostMarkersEnabled()); + LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::vkGuestMarkersEnabled()); + LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled()); // Create stdin/stdout/stderr Common::Singleton::Instance()->CreateStdHandles(); diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index 46391faef..335185473 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -199,7 +199,7 @@ void Render(const vk::CommandBuffer& cmdbuf, ::Vulkan::Frame* frame) { return; } - if (Config::vkMarkersEnabled()) { + if (Config::vkHostMarkersEnabled()) { cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = "ImGui Render", }); @@ -224,7 +224,7 @@ void Render(const vk::CommandBuffer& cmdbuf, ::Vulkan::Frame* frame) { cmdbuf.beginRendering(render_info); Vulkan::RenderDrawData(*draw_data, cmdbuf); cmdbuf.endRendering(); - if (Config::vkMarkersEnabled()) { + if (Config::vkHostMarkersEnabled()) { cmdbuf.endDebugUtilsLabelEXT(); } } diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 16ed84f74..036a031a7 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -224,6 +224,10 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::spanScopeMarkerBegin("gfx"); + } + const auto base_addr = reinterpret_cast(dcb.data()); while (!dcb.empty()) { const auto* header = reinterpret_cast(dcb.data()); @@ -260,7 +264,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(&nop->data_block[1]), marker_sz}; if (rasterizer) { - rasterizer->ScopeMarkerBegin(label); + rasterizer->ScopeMarkerBegin(label, true); } break; } @@ -271,13 +275,13 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span( reinterpret_cast(&nop->data_block[1]) + marker_sz); if (rasterizer) { - rasterizer->ScopedMarkerInsertColor(label, color); + rasterizer->ScopedMarkerInsertColor(label, color, true); } break; } case PM4CmdNop::PayloadType::DebugMarkerPop: { if (rasterizer) { - rasterizer->ScopeMarkerEnd(); + rasterizer->ScopeMarkerEnd(true); } break; } @@ -412,7 +416,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndex2", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndex2", cmd_address)); rasterizer->Draw(true); rasterizer->ScopeMarkerEnd(); } @@ -429,8 +433,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin( - fmt::format("dcb:{}:DrawIndexOffset2", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndexOffset2", cmd_address)); rasterizer->Draw(true, draw_index_off->index_offset); rasterizer->ScopeMarkerEnd(); } @@ -445,7 +448,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndexAuto", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndexAuto", cmd_address)); rasterizer->Draw(false); rasterizer->ScopeMarkerEnd(); } @@ -460,7 +463,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:DrawIndirect", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndirect", cmd_address)); rasterizer->DrawIndirect(false, indirect_args_addr, offset, size, 1, 0); rasterizer->ScopeMarkerEnd(); } @@ -476,8 +479,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin( - fmt::format("dcb:{}:DrawIndexIndirect", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndexIndirect", cmd_address)); rasterizer->DrawIndirect(true, indirect_args_addr, offset, size, 1, 0); rasterizer->ScopeMarkerEnd(); } @@ -493,7 +495,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); rasterizer->ScopeMarkerBegin( - fmt::format("dcb:{}:DrawIndexIndirectCountMulti", cmd_address)); + fmt::format("{}:DrawIndexIndirectCountMulti", cmd_address)); rasterizer->DrawIndirect( true, indirect_args_addr, offset, draw_index_indirect->stride, draw_index_indirect->count, draw_index_indirect->countAddr); @@ -514,7 +516,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("dcb:{}:Dispatch", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchDirect", cmd_address)); rasterizer->DispatchDirect(); rasterizer->ScopeMarkerEnd(); } @@ -532,8 +534,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin( - fmt::format("dcb:{}:DispatchIndirect", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchIndirect", cmd_address)); rasterizer->DispatchIndirect(indirect_args_addr, offset, size); rasterizer->ScopeMarkerEnd(); } @@ -701,6 +702,10 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::spanScopeMarkerEnd(); + } + if (ce_task.handle) { ASSERT_MSG(ce_task.handle.done(), "Partially processed CCB"); ce_task.handle.destroy(); @@ -714,6 +719,10 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { FIBER_ENTER(acb_task_name[vqid]); const auto& queue = asc_queues[{vqid}]; + if (rasterizer) { + rasterizer->ScopeMarkerBegin(fmt::format("asc[{}]", vqid)); + } + auto base_addr = reinterpret_cast(acb.data()); while (!acb.empty()) { const auto* header = reinterpret_cast(acb.data()); @@ -811,8 +820,7 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } if (rasterizer && (cs_program.dispatch_initiator & 1)) { const auto cmd_address = reinterpret_cast(header); - rasterizer->ScopeMarkerBegin( - fmt::format("acb[{}]:{}:DispatchIndirect", vqid, cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchDirect", cmd_address)); rasterizer->DispatchDirect(); rasterizer->ScopeMarkerEnd(); } @@ -830,7 +838,7 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } if (rasterizer && (cs_program.dispatch_initiator & 1)) { const auto cmd_address = reinterpret_cast(header); - rasterizer->ScopeMarkerBegin(fmt::format("acb[{}]:{}:Dispatch", vqid, cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchIndirect", cmd_address)); rasterizer->DispatchIndirect(ib_address, 0, size); rasterizer->ScopeMarkerEnd(); } @@ -878,6 +886,10 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } } + if (rasterizer) { + rasterizer->ScopeMarkerEnd(); + } + FIBER_EXIT; } diff --git a/src/video_core/buffer_cache/buffer.cpp b/src/video_core/buffer_cache/buffer.cpp index 5a049c185..a8d1271c6 100644 --- a/src/video_core/buffer_cache/buffer.cpp +++ b/src/video_core/buffer_cache/buffer.cpp @@ -131,6 +131,8 @@ vk::BufferView Buffer::View(u32 offset, u32 size, bool is_written, AmdGpu::DataF vk::to_string(view_result)); scheduler->DeferOperation( [view, device = instance->GetDevice()] { device.destroyBufferView(view); }); + Vulkan::SetObjectName(instance->GetDevice(), view, "BufferView {:#x}:{:#x}", cpu_addr + offset, + size); return view; } diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 6c3e066c6..f5bcb54b6 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -92,15 +92,13 @@ std::string GetReadableVersion(u32 version) { Instance::Instance(bool enable_validation, bool enable_crash_diagnostic) : instance{CreateInstance(Frontend::WindowSystemType::Headless, enable_validation, enable_crash_diagnostic)}, - physical_devices{EnumeratePhysicalDevices(instance)}, - crash_diagnostic{enable_crash_diagnostic} {} + physical_devices{EnumeratePhysicalDevices(instance)} {} Instance::Instance(Frontend::WindowSDL& window, s32 physical_device_index, bool enable_validation /*= false*/, bool enable_crash_diagnostic /*= false*/) : instance{CreateInstance(window.GetWindowInfo().type, enable_validation, enable_crash_diagnostic)}, - physical_devices{EnumeratePhysicalDevices(instance)}, - crash_diagnostic{enable_crash_diagnostic} { + physical_devices{EnumeratePhysicalDevices(instance)} { if (enable_validation) { debug_callback = CreateDebugCallback(*instance); } @@ -562,10 +560,7 @@ void Instance::CollectToolingInfo() { return; } for (const vk::PhysicalDeviceToolProperties& tool : tools) { - const std::string_view name = tool.name; - LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", name); - has_renderdoc = has_renderdoc || name == "RenderDoc"; - has_nsight_graphics = has_nsight_graphics || name == "NVIDIA Nsight Graphics"; + LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", tool.name); } } diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 8928b4267..e0d4d0b4d 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -79,11 +79,6 @@ public: return profiler_context; } - /// Returns true when a known debugging tool is attached. - bool HasDebuggingToolAttached() const { - return crash_diagnostic || has_renderdoc || has_nsight_graphics; - } - /// Returns true if anisotropic filtering is supported bool IsAnisotropicFilteringSupported() const { return features.samplerAnisotropy; @@ -340,13 +335,9 @@ private: bool legacy_vertex_attributes{}; bool image_load_store_lod{}; bool amd_gcn_shader{}; + bool tooling_info{}; u64 min_imported_host_pointer_alignment{}; u32 subgroup_size{}; - bool tooling_info{}; - bool debug_utils_supported{}; - bool crash_diagnostic{}; - bool has_nsight_graphics{}; - bool has_renderdoc{}; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_platform.h b/src/video_core/renderer_vulkan/vk_platform.h index 6b425b6d8..d05d12997 100644 --- a/src/video_core/renderer_vulkan/vk_platform.h +++ b/src/video_core/renderer_vulkan/vk_platform.h @@ -7,6 +7,7 @@ #include #include +#include "common/config.h" #include "common/logging/log.h" #include "common/types.h" #include "video_core/renderer_vulkan/vk_common.h" @@ -32,6 +33,9 @@ concept VulkanHandleType = vk::isVulkanHandleType::value; template void SetObjectName(vk::Device device, const HandleType& handle, std::string_view debug_name) { + if (!Config::vkHostMarkersEnabled()) { + return; + } const vk::DebugUtilsObjectNameInfoEXT name_info = { .objectType = HandleType::objectType, .objectHandle = reinterpret_cast(static_cast(handle)), @@ -46,6 +50,9 @@ void SetObjectName(vk::Device device, const HandleType& handle, std::string_view template void SetObjectName(vk::Device device, const HandleType& handle, const char* format, const Args&... args) { + if (!Config::vkHostMarkersEnabled()) { + return; + } const std::string debug_name = fmt::vformat(format, fmt::make_format_args(args...)); SetObjectName(device, handle, debug_name); } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 06cfbedac..bac647125 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -58,6 +58,7 @@ bool Rasterizer::FilterDraw() { if (regs.color_control.mode == Liverpool::ColorControl::OperationMode::FmaskDecompress) { // TODO: check for a valid MRT1 to promote the draw to the resolve pass. LOG_TRACE(Render_Vulkan, "FMask decompression pass skipped"); + ScopedMarkerInsert("FmaskDecompress"); return false; } if (regs.color_control.mode == Liverpool::ColorControl::OperationMode::Resolve) { @@ -67,6 +68,7 @@ bool Rasterizer::FilterDraw() { } if (regs.primitive_type == AmdGpu::PrimitiveType::None) { LOG_TRACE(Render_Vulkan, "Primitive type 'None' skipped"); + ScopedMarkerInsert("PrimitiveTypeNone"); return false; } @@ -244,10 +246,13 @@ void Rasterizer::EliminateFastClear() { .layerCount = col_buf.view.slice_max - col_buf.view.slice_start + 1, }; scheduler.EndRendering(); + ScopeMarkerBegin(fmt::format("EliminateFastClear:MRT={:#x}:M={:#x}", col_buf.Address(), + col_buf.CmaskAddress())); image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}); scheduler.CommandBuffer().clearColorImage(image.image, image.last_state.layout, LiverpoolToVK::ColorBufferClearValue(col_buf).color, range); + ScopeMarkerEnd(); } void Rasterizer::Draw(bool is_indexed, u32 index_offset) { @@ -842,8 +847,6 @@ void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline, RenderState& s } void Rasterizer::Resolve() { - const auto cmdbuf = scheduler.CommandBuffer(); - // Read from MRT0, average all samples, and write to MRT1, which is one-sample const auto& mrt0_hint = liverpool->last_cb_extent[0]; const auto& mrt1_hint = liverpool->last_cb_extent[1]; @@ -863,9 +866,12 @@ void Rasterizer::Resolve() { mrt1_range.base.layer = liverpool->regs.color_buffers[1].view.slice_start; mrt1_range.extent.layers = liverpool->regs.color_buffers[1].NumSlices() - mrt1_range.base.layer; + ScopeMarkerBegin(fmt::format("Resolve:MRT0={:#x}:MRT1={:#x}", + liverpool->regs.color_buffers[0].Address(), + liverpool->regs.color_buffers[1].Address())); + mrt0_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, mrt0_range); - mrt1_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, mrt1_range); @@ -892,8 +898,9 @@ void Rasterizer::Resolve() { .dstOffset = {0, 0, 0}, .extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1}, }; - cmdbuf.copyImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, mrt1_image.image, - vk::ImageLayout::eTransferDstOptimal, region); + scheduler.CommandBuffer().copyImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, + mrt1_image.image, vk::ImageLayout::eTransferDstOptimal, + region); } else { vk::ImageResolve region = { .srcSubresource = @@ -914,9 +921,12 @@ void Rasterizer::Resolve() { .dstOffset = {0, 0, 0}, .extent = {mrt1_image.info.size.width, mrt1_image.info.size.height, 1}, }; - cmdbuf.resolveImage(mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, - mrt1_image.image, vk::ImageLayout::eTransferDstOptimal, region); + scheduler.CommandBuffer().resolveImage( + mrt0_image.image, vk::ImageLayout::eTransferSrcOptimal, mrt1_image.image, + vk::ImageLayout::eTransferDstOptimal, region); } + + ScopeMarkerEnd(); } void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) { @@ -936,6 +946,11 @@ void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) { sub_range.base.layer = liverpool->regs.depth_view.slice_start; sub_range.extent.layers = liverpool->regs.depth_view.NumSlices() - sub_range.base.layer; + ScopeMarkerBegin(fmt::format( + "DepthStencilCopy:DR={:#x}:SR={:#x}:DW={:#x}:SW={:#x}", regs.depth_buffer.DepthAddress(), + regs.depth_buffer.StencilAddress(), regs.depth_buffer.DepthWriteAddress(), + regs.depth_buffer.StencilWriteAddress())); + read_image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, sub_range); write_image.Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, @@ -967,9 +982,11 @@ void Rasterizer::DepthStencilCopy(bool is_depth, bool is_stencil) { .dstOffset = {0, 0, 0}, .extent = {write_image.info.size.width, write_image.info.size.height, 1}, }; - const auto cmdbuf = scheduler.CommandBuffer(); - cmdbuf.copyImage(read_image.image, vk::ImageLayout::eTransferSrcOptimal, write_image.image, - vk::ImageLayout::eTransferDstOptimal, region); + scheduler.CommandBuffer().copyImage(read_image.image, vk::ImageLayout::eTransferSrcOptimal, + write_image.image, vk::ImageLayout::eTransferDstOptimal, + region); + + ScopeMarkerEnd(); } void Rasterizer::InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds) { @@ -1195,42 +1212,43 @@ void Rasterizer::UpdateViewportScissorState() { cmdbuf.setScissorWithCountEXT(scissors); } -void Rasterizer::ScopeMarkerBegin(const std::string_view& str) { - if (Config::nullGpu() || !Config::vkMarkersEnabled()) { +void Rasterizer::ScopeMarkerBegin(const std::string_view& str, bool from_guest) { + if ((from_guest && !Config::vkGuestMarkersEnabled()) || + (!from_guest && !Config::vkHostMarkersEnabled())) { return; } - const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = str.data(), }); } -void Rasterizer::ScopeMarkerEnd() { - if (Config::nullGpu() || !Config::vkMarkersEnabled()) { +void Rasterizer::ScopeMarkerEnd(bool from_guest) { + if ((from_guest && !Config::vkGuestMarkersEnabled()) || + (!from_guest && !Config::vkHostMarkersEnabled())) { return; } - const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.endDebugUtilsLabelEXT(); } -void Rasterizer::ScopedMarkerInsert(const std::string_view& str) { - if (Config::nullGpu() || !Config::vkMarkersEnabled()) { +void Rasterizer::ScopedMarkerInsert(const std::string_view& str, bool from_guest) { + if ((from_guest && !Config::vkGuestMarkersEnabled()) || + (!from_guest && !Config::vkHostMarkersEnabled())) { return; } - const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.insertDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = str.data(), }); } -void Rasterizer::ScopedMarkerInsertColor(const std::string_view& str, const u32 color) { - if (Config::nullGpu() || !Config::vkMarkersEnabled()) { +void Rasterizer::ScopedMarkerInsertColor(const std::string_view& str, const u32 color, + bool from_guest) { + if ((from_guest && !Config::vkGuestMarkersEnabled()) || + (!from_guest && !Config::vkHostMarkersEnabled())) { return; } - const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.insertDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = str.data(), diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 1e4a210bb..abf58e522 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -47,10 +47,11 @@ public: void DispatchDirect(); void DispatchIndirect(VAddr address, u32 offset, u32 size); - void ScopeMarkerBegin(const std::string_view& str); - void ScopeMarkerEnd(); - void ScopedMarkerInsert(const std::string_view& str); - void ScopedMarkerInsertColor(const std::string_view& str, const u32 color); + void ScopeMarkerBegin(const std::string_view& str, bool from_guest = false); + void ScopeMarkerEnd(bool from_guest = false); + void ScopedMarkerInsert(const std::string_view& str, bool from_guest = false); + void ScopedMarkerInsertColor(const std::string_view& str, const u32 color, + bool from_guest = false); void InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds); u32 ReadDataFromGds(u32 gsd_offset); diff --git a/src/video_core/renderer_vulkan/vk_resource_pool.cpp b/src/video_core/renderer_vulkan/vk_resource_pool.cpp index dba603e71..5eae32e70 100644 --- a/src/video_core/renderer_vulkan/vk_resource_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_resource_pool.cpp @@ -73,9 +73,7 @@ CommandPool::CommandPool(const Instance& instance, MasterSemaphore* master_semap ASSERT_MSG(pool_result == vk::Result::eSuccess, "Failed to create command pool: {}", vk::to_string(pool_result)); cmd_pool = std::move(pool); - if (instance.HasDebuggingToolAttached()) { - SetObjectName(device, *cmd_pool, "CommandPool"); - } + SetObjectName(device, *cmd_pool, "CommandPool"); } CommandPool::~CommandPool() = default; @@ -94,10 +92,8 @@ void CommandPool::Allocate(std::size_t begin, std::size_t end) { device.allocateCommandBuffers(&buffer_alloc_info, cmd_buffers.data() + begin); ASSERT(result == vk::Result::eSuccess); - if (instance.HasDebuggingToolAttached()) { - for (std::size_t i = begin; i < end; ++i) { - SetObjectName(device, cmd_buffers[i], "CommandPool: Command Buffer {}", i); - } + for (std::size_t i = begin; i < end; ++i) { + SetObjectName(device, cmd_buffers[i], "CommandPool: Command Buffer {}", i); } } diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 44f4be6dd..8278252ad 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -4,6 +4,7 @@ #include #include #include "common/assert.h" +#include "common/config.h" #include "common/logging/log.h" #include "sdl_window.h" #include "video_core/renderer_vulkan/vk_instance.h" @@ -235,11 +236,9 @@ void Swapchain::RefreshSemaphores() { semaphore = sem; } - if (instance.HasDebuggingToolAttached()) { - for (u32 i = 0; i < image_count; ++i) { - SetObjectName(device, image_acquired[i], "Swapchain Semaphore: image_acquired {}", i); - SetObjectName(device, present_ready[i], "Swapchain Semaphore: present_ready {}", i); - } + for (u32 i = 0; i < image_count; ++i) { + SetObjectName(device, image_acquired[i], "Swapchain Semaphore: image_acquired {}", i); + SetObjectName(device, present_ready[i], "Swapchain Semaphore: present_ready {}", i); } } @@ -251,10 +250,8 @@ void Swapchain::SetupImages() { images = std::move(imgs); image_count = static_cast(images.size()); - if (instance.HasDebuggingToolAttached()) { - for (u32 i = 0; i < image_count; ++i) { - SetObjectName(device, images[i], "Swapchain Image {}", i); - } + for (u32 i = 0; i < image_count; ++i) { + SetObjectName(device, images[i], "Swapchain Image {}", i); } } diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index e935c7d2e..6b1349386 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -110,6 +110,13 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create image view: {}", vk::to_string(view_result)); image_view = std::move(view); + + const auto view_aspect = aspect & vk::ImageAspectFlagBits::eDepth ? "Depth" + : aspect & vk::ImageAspectFlagBits::eStencil ? "Stencil" + : "Color"; + Vulkan::SetObjectName(instance.GetDevice(), *image_view, "ImageView {}x{}x{} {:#x}:{:#x} ({})", + image.info.size.width, image.info.size.height, image.info.size.depth, + image.info.guest_address, image.info.guest_size, view_aspect); } ImageView::~ImageView() = default; From da2b58f66edd38b4e3cc851f6b26cc61f34736a9 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 16 Jan 2025 02:36:41 -0800 Subject: [PATCH 068/455] resource_tracking_pass: Persist image resource atomic designation. (#2158) --- src/shader_recompiler/ir/passes/resource_tracking_pass.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index 10d685ed1..a132cac2c 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -164,6 +164,7 @@ public: return desc.sharp_idx == existing.sharp_idx && desc.is_array == existing.is_array; })}; auto& image = image_resources[index]; + image.is_atomic |= desc.is_atomic; image.is_written |= desc.is_written; return index; } From 34a5f2319cb7e3e201239e25b3562ea0781760c9 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 16 Jan 2025 03:17:07 -0800 Subject: [PATCH 069/455] network: Remove firing Np callbacks from check stubs. (#2161) --- src/core/libraries/network/netctl.cpp | 4 ++-- src/core/libraries/np_manager/np_manager.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/network/netctl.cpp b/src/core/libraries/network/netctl.cpp index b167d2789..00d980663 100644 --- a/src/core/libraries/network/netctl.cpp +++ b/src/core/libraries/network/netctl.cpp @@ -93,7 +93,7 @@ int PS4_SYSV_ABI sceNetCtlUnregisterCallbackV6() { } int PS4_SYSV_ABI sceNetCtlCheckCallback() { - netctl.CheckCallback(); + LOG_DEBUG(Lib_NetCtl, "(STUBBED) called"); return ORBIS_OK; } @@ -373,7 +373,7 @@ int PS4_SYSV_ABI Func_D8DCB6973537A3DC() { } int PS4_SYSV_ABI sceNetCtlCheckCallbackForNpToolkit() { - netctl.CheckNpToolkitCallback(); + LOG_DEBUG(Lib_NetCtl, "(STUBBED) called"); return ORBIS_OK; } diff --git a/src/core/libraries/np_manager/np_manager.cpp b/src/core/libraries/np_manager/np_manager.cpp index 3489e3e41..e26c5a830 100644 --- a/src/core/libraries/np_manager/np_manager.cpp +++ b/src/core/libraries/np_manager/np_manager.cpp @@ -2509,7 +2509,7 @@ struct NpStateCallbackForNpToolkit { NpStateCallbackForNpToolkit NpStateCbForNp; int PS4_SYSV_ABI sceNpCheckCallbackForLib() { - Core::ExecuteGuest(NpStateCbForNp.func, 1, OrbisNpState::SignedOut, NpStateCbForNp.userdata); + LOG_DEBUG(Lib_NpManager, "(STUBBED) called"); return ORBIS_OK; } From 4695aaa8306158e94df8292106bdc3889976dd1e Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 16 Jan 2025 18:27:52 +0200 Subject: [PATCH 070/455] sceKernelAio* implementation (#2160) * draft Aio from https://github.com/GoldHEN/GoldHEN_Plugins_Repository * cleanup and fixes to Aio --- CMakeLists.txt | 2 + src/core/libraries/kernel/aio.cpp | 339 ++++++++++++++++++++++++ src/core/libraries/kernel/aio.h | 43 +++ src/core/libraries/kernel/file_system.h | 3 +- src/core/libraries/kernel/kernel.cpp | 2 + src/core/libraries/kernel/time.h | 1 + 6 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 src/core/libraries/kernel/aio.cpp create mode 100644 src/core/libraries/kernel/aio.h diff --git a/CMakeLists.txt b/CMakeLists.txt index be87de119..30cb033ed 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -250,6 +250,8 @@ set(KERNEL_LIB src/core/libraries/kernel/sync/mutex.cpp src/core/libraries/kernel/time.h src/core/libraries/kernel/orbis_error.h src/core/libraries/kernel/posix_error.h + src/core/libraries/kernel/aio.cpp + src/core/libraries/kernel/aio.h ) set(NETWORK_LIBS src/core/libraries/network/http.cpp diff --git a/src/core/libraries/kernel/aio.cpp b/src/core/libraries/kernel/aio.cpp new file mode 100644 index 000000000..e017010cb --- /dev/null +++ b/src/core/libraries/kernel/aio.cpp @@ -0,0 +1,339 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include "aio.h" +#include "common/assert.h" +#include "common/debug.h" +#include "common/logging/log.h" +#include "core/libraries/kernel/equeue.h" +#include "core/libraries/kernel/orbis_error.h" +#include "core/libraries/libs.h" +#include "file_system.h" + +namespace Libraries::Kernel { + +#define MAX_QUEUE 512 + +static s32* id_state; +static s32 id_index; + +s32 sceKernelAioInitializeImpl(void* p, s32 size) { + + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioDeleteRequest(OrbisKernelAioSubmitId id, s32* ret) { + if (ret == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + id_state[id] = ORBIS_KERNEL_AIO_STATE_ABORTED; + *ret = 0; + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioDeleteRequests(OrbisKernelAioSubmitId id[], s32 num, s32 ret[]) { + if (ret == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + for (s32 i = 0; i < num; i++) { + id_state[id[i]] = ORBIS_KERNEL_AIO_STATE_ABORTED; + ret[i] = 0; + } + + return 0; +} +s32 PS4_SYSV_ABI sceKernelAioPollRequest(OrbisKernelAioSubmitId id, s32* state) { + if (state == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + *state = id_state[id]; + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioPollRequests(OrbisKernelAioSubmitId id[], s32 num, s32 state[]) { + if (state == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + for (s32 i = 0; i < num; i++) { + state[i] = id_state[id[i]]; + } + + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioCancelRequest(OrbisKernelAioSubmitId id, s32* state) { + if (state == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + if (id) { + id_state[id] = ORBIS_KERNEL_AIO_STATE_ABORTED; + *state = ORBIS_KERNEL_AIO_STATE_ABORTED; + } else { + *state = ORBIS_KERNEL_AIO_STATE_PROCESSING; + } + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioCancelRequests(OrbisKernelAioSubmitId id[], s32 num, s32 state[]) { + if (state == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + for (s32 i = 0; i < num; i++) { + if (id[i]) { + id_state[id[i]] = ORBIS_KERNEL_AIO_STATE_ABORTED; + state[i] = ORBIS_KERNEL_AIO_STATE_ABORTED; + } else { + state[i] = ORBIS_KERNEL_AIO_STATE_PROCESSING; + } + } + + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioWaitRequest(OrbisKernelAioSubmitId id, s32* state, u32* usec) { + if (state == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + u32 timer = 0; + + s32 timeout = 0; + + while (id_state[id] == ORBIS_KERNEL_AIO_STATE_PROCESSING) { + sceKernelUsleep(10); + + timer += 10; + if (*usec) { + if (timer > *usec) { + timeout = 1; + break; + } + } + } + + *state = id_state[id]; + + if (timeout) + return ORBIS_KERNEL_ERROR_ETIMEDOUT; + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioWaitRequests(OrbisKernelAioSubmitId id[], s32 num, s32 state[], + u32 mode, u32* usec) { + if (state == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + u32 timer = 0; + s32 timeout = 0; + s32 completion = 0; + + for (s32 i = 0; i < num; i++) { + if (!completion && !timeout) { + while (id_state[id[i]] == ORBIS_KERNEL_AIO_STATE_PROCESSING) { + sceKernelUsleep(10); + timer += 10; + + if (*usec) { + if (timer > *usec) { + timeout = 1; + break; + } + } + } + } + + if (mode == 0x02) { + if (id_state[id[i]] == ORBIS_KERNEL_AIO_STATE_COMPLETED) + completion = 1; + } + + state[i] = id_state[id[i]]; + } + + if (timeout) + return ORBIS_KERNEL_ERROR_ETIMEDOUT; + + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioSubmitReadCommands(OrbisKernelAioRWRequest req[], s32 size, s32 prio, + OrbisKernelAioSubmitId* id) { + if (req == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + if (id == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_PROCESSING; + + for (s32 i = 0; i < size; i++) { + + s64 ret = sceKernelPread(req[i].fd, req[i].buf, req[i].nbyte, req[i].offset); + + if (ret < 0) { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_ABORTED; + req[i].result->returnValue = ret; + + } else { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_COMPLETED; + req[i].result->returnValue = ret; + } + } + + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_COMPLETED; + + *id = id_index; + + id_index = (id_index + 1) % MAX_QUEUE; + + if (!id_index) + id_index++; + + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioSubmitReadCommandsMultiple(OrbisKernelAioRWRequest req[], s32 size, + s32 prio, OrbisKernelAioSubmitId id[]) { + if (req == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + if (id == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + for (s32 i = 0; i < size; i++) { + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_PROCESSING; + + s64 ret = sceKernelPread(req[i].fd, req[i].buf, req[i].nbyte, req[i].offset); + + if (ret < 0) { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_ABORTED; + req[i].result->returnValue = ret; + + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_ABORTED; + + } else { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_COMPLETED; + req[i].result->returnValue = ret; + + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_COMPLETED; + } + + id[i] = id_index; + + id_index = (id_index + 1) % MAX_QUEUE; + + if (!id_index) + id_index++; + } + + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioSubmitWriteCommands(OrbisKernelAioRWRequest req[], s32 size, s32 prio, + OrbisKernelAioSubmitId* id) { + if (req == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + if (id == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + for (s32 i = 0; i < size; i++) { + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_PROCESSING; + + s64 ret = sceKernelPwrite(req[i].fd, req[i].buf, req[i].nbyte, req[i].offset); + + if (ret < 0) { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_ABORTED; + req[i].result->returnValue = ret; + + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_ABORTED; + + } else { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_COMPLETED; + req[i].result->returnValue = ret; + + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_COMPLETED; + } + } + + *id = id_index; + + id_index = (id_index + 1) % MAX_QUEUE; + + // skip id_index equals 0 , because sceKernelAioCancelRequest will submit id + // equal to 0 + if (!id_index) + id_index++; + + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioSubmitWriteCommandsMultiple(OrbisKernelAioRWRequest req[], s32 size, + s32 prio, OrbisKernelAioSubmitId id[]) { + if (req == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + if (id == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + for (s32 i = 0; i < size; i++) { + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_PROCESSING; + s64 ret = sceKernelPwrite(req[i].fd, req[i].buf, req[i].nbyte, req[i].offset); + + if (ret < 0) { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_ABORTED; + req[i].result->returnValue = ret; + + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_ABORTED; + + } else { + req[i].result->state = ORBIS_KERNEL_AIO_STATE_COMPLETED; + req[i].result->returnValue = ret; + id_state[id_index] = ORBIS_KERNEL_AIO_STATE_COMPLETED; + } + + id[i] = id_index; + id_index = (id_index + 1) % MAX_QUEUE; + + if (!id_index) + id_index++; + } + return 0; +} + +s32 PS4_SYSV_ABI sceKernelAioSetParam() { + LOG_ERROR(Kernel, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceKernelAioInitializeParam() { + LOG_ERROR(Kernel, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterAio(Core::Loader::SymbolsResolver* sym) { + id_index = 1; + id_state = (int*)malloc(sizeof(int) * MAX_QUEUE); + memset(id_state, 0, sizeof(sizeof(int) * MAX_QUEUE)); + + LIB_FUNCTION("fR521KIGgb8", "libkernel", 1, "libkernel", 1, 1, sceKernelAioCancelRequest); + LIB_FUNCTION("3Lca1XBrQdY", "libkernel", 1, "libkernel", 1, 1, sceKernelAioCancelRequests); + LIB_FUNCTION("5TgME6AYty4", "libkernel", 1, "libkernel", 1, 1, sceKernelAioDeleteRequest); + LIB_FUNCTION("Ft3EtsZzAoY", "libkernel", 1, "libkernel", 1, 1, sceKernelAioDeleteRequests); + LIB_FUNCTION("vYU8P9Td2Zo", "libkernel", 1, "libkernel", 1, 1, sceKernelAioInitializeImpl); + LIB_FUNCTION("nu4a0-arQis", "libkernel", 1, "libkernel", 1, 1, sceKernelAioInitializeParam); + LIB_FUNCTION("2pOuoWoCxdk", "libkernel", 1, "libkernel", 1, 1, sceKernelAioPollRequest); + LIB_FUNCTION("o7O4z3jwKzo", "libkernel", 1, "libkernel", 1, 1, sceKernelAioPollRequests); + LIB_FUNCTION("9WK-vhNXimw", "libkernel", 1, "libkernel", 1, 1, sceKernelAioSetParam); + LIB_FUNCTION("HgX7+AORI58", "libkernel", 1, "libkernel", 1, 1, sceKernelAioSubmitReadCommands); + LIB_FUNCTION("lXT0m3P-vs4", "libkernel", 1, "libkernel", 1, 1, + sceKernelAioSubmitReadCommandsMultiple); + LIB_FUNCTION("XQ8C8y+de+E", "libkernel", 1, "libkernel", 1, 1, sceKernelAioSubmitWriteCommands); + LIB_FUNCTION("xT3Cpz0yh6Y", "libkernel", 1, "libkernel", 1, 1, + sceKernelAioSubmitWriteCommandsMultiple); + LIB_FUNCTION("KOF-oJbQVvc", "libkernel", 1, "libkernel", 1, 1, sceKernelAioWaitRequest); + LIB_FUNCTION("lgK+oIWkJyA", "libkernel", 1, "libkernel", 1, 1, sceKernelAioWaitRequests); +} + +} // namespace Libraries::Kernel \ No newline at end of file diff --git a/src/core/libraries/kernel/aio.h b/src/core/libraries/kernel/aio.h new file mode 100644 index 000000000..0ad21e938 --- /dev/null +++ b/src/core/libraries/kernel/aio.h @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include +#include + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Kernel { + +enum AioState { + ORBIS_KERNEL_AIO_STATE_SUBMITTED = 1, + ORBIS_KERNEL_AIO_STATE_PROCESSING = 2, + ORBIS_KERNEL_AIO_STATE_COMPLETED = 3, + ORBIS_KERNEL_AIO_STATE_ABORTED = 4 +}; + +struct OrbisKernelAioResult { + s64 returnValue; + u32 state; +}; + +typedef s32 OrbisKernelAioSubmitId; + +struct OrbisKernelAioRWRequest { + s64 offset; + s64 nbyte; + void* buf; + OrbisKernelAioResult* result; + s32 fd; +}; + +void RegisterAio(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Kernel \ No newline at end of file diff --git a/src/core/libraries/kernel/file_system.h b/src/core/libraries/kernel/file_system.h index 6443962ff..1838df2fe 100644 --- a/src/core/libraries/kernel/file_system.h +++ b/src/core/libraries/kernel/file_system.h @@ -67,7 +67,8 @@ constexpr int ORBIS_KERNEL_O_DIRECTORY = 0x00020000; s64 PS4_SYSV_ABI sceKernelWrite(int d, const void* buf, size_t nbytes); s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes); - +s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset); +s64 PS4_SYSV_ABI sceKernelPwrite(int d, void* buf, size_t nbytes, s64 offset); void RegisterFileSystem(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/kernel.cpp b/src/core/libraries/kernel/kernel.cpp index b05c96fad..a9d04ca38 100644 --- a/src/core/libraries/kernel/kernel.cpp +++ b/src/core/libraries/kernel/kernel.cpp @@ -28,6 +28,7 @@ #include #endif #include +#include "aio.h" namespace Libraries::Kernel { @@ -218,6 +219,7 @@ void RegisterKernel(Core::Loader::SymbolsResolver* sym) { Libraries::Kernel::RegisterEventQueue(sym); Libraries::Kernel::RegisterProcess(sym); Libraries::Kernel::RegisterException(sym); + Libraries::Kernel::RegisterAio(sym); LIB_OBJ("f7uOxY9mM1U", "libkernel", 1, "libkernel", 1, 1, &g_stack_chk_guard); LIB_FUNCTION("PfccT7qURYE", "libkernel", 1, "libkernel", 1, 1, kernel_ioctl); diff --git a/src/core/libraries/kernel/time.h b/src/core/libraries/kernel/time.h index 6aa281aaf..407b6f9ed 100644 --- a/src/core/libraries/kernel/time.h +++ b/src/core/libraries/kernel/time.h @@ -82,6 +82,7 @@ int PS4_SYSV_ABI sceKernelConvertLocaltimeToUtc(time_t param_1, int64_t param_2, int PS4_SYSV_ABI sceKernelConvertUtcToLocaltime(time_t time, time_t* local_time, OrbisTimesec* st, u64* dst_sec); +int PS4_SYSV_ABI sceKernelUsleep(u32 microseconds); void RegisterTime(Core::Loader::SymbolsResolver* sym); From 440a693fae49468ea1b46d4afb548e5697f946de Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Thu, 16 Jan 2025 11:22:39 -0600 Subject: [PATCH 071/455] Crash on sceKernelDebugRaiseExceptionOnReleaseMode (#2163) --- src/core/libraries/kernel/threads/exception.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/core/libraries/kernel/threads/exception.cpp b/src/core/libraries/kernel/threads/exception.cpp index cc391e928..5e2f35d69 100644 --- a/src/core/libraries/kernel/threads/exception.cpp +++ b/src/core/libraries/kernel/threads/exception.cpp @@ -153,6 +153,11 @@ int PS4_SYSV_ABI sceKernelDebugRaiseException() { return 0; } +int PS4_SYSV_ABI sceKernelDebugRaiseExceptionOnReleaseMode() { + UNREACHABLE(); + return 0; +} + void RegisterException(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("il03nluKfMk", "libkernel_unity", 1, "libkernel", 1, 1, sceKernelRaiseException); LIB_FUNCTION("WkwEd3N7w0Y", "libkernel_unity", 1, "libkernel", 1, 1, @@ -160,6 +165,8 @@ void RegisterException(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("Qhv5ARAoOEc", "libkernel_unity", 1, "libkernel", 1, 1, sceKernelRemoveExceptionHandler) LIB_FUNCTION("OMDRKKAZ8I4", "libkernel", 1, "libkernel", 1, 1, sceKernelDebugRaiseException); + LIB_FUNCTION("zE-wXIZjLoM", "libkernel", 1, "libkernel", 1, 1, + sceKernelDebugRaiseExceptionOnReleaseMode); } } // namespace Libraries::Kernel From 56a6c95730a89aec7056a12603ae63a01a8b4a8f Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Thu, 16 Jan 2025 16:27:23 -0300 Subject: [PATCH 072/455] Render without rendering (#2152) * presenter: render the game inside a ImGui window * presenter: render the previous frame to keep the render rendering * swapchain: fix swapchain image view format not being converted to unorm * devtools: fix frame graph timing --- src/core/debug_state.h | 9 + src/core/devtools/layer.cpp | 15 +- src/core/devtools/widget/frame_graph.cpp | 6 +- src/core/devtools/widget/frame_graph.h | 3 + src/core/libraries/videoout/driver.cpp | 20 ++- src/core/libraries/videoout/driver.h | 3 +- src/imgui/imgui_config.h | 6 + src/imgui/renderer/imgui_core.cpp | 22 ++- src/imgui/renderer/imgui_core.h | 7 +- src/imgui/renderer/imgui_impl_sdl3.cpp | 23 ++- src/imgui/renderer/imgui_impl_sdl3.h | 2 +- src/imgui/renderer/imgui_impl_vulkan.cpp | 48 +++--- src/imgui/renderer/imgui_impl_vulkan.h | 18 +- src/imgui/renderer/texture_manager.cpp | 5 +- .../renderer_vulkan/vk_instance.cpp | 1 + .../renderer_vulkan/vk_presenter.cpp | 161 +++++++++++++----- src/video_core/renderer_vulkan/vk_presenter.h | 7 +- .../renderer_vulkan/vk_swapchain.cpp | 42 ++++- src/video_core/renderer_vulkan/vk_swapchain.h | 18 +- 19 files changed, 306 insertions(+), 110 deletions(-) diff --git a/src/core/debug_state.h b/src/core/debug_state.h index 6a8e15baa..aab741fd0 100644 --- a/src/core/debug_state.h +++ b/src/core/debug_state.h @@ -131,6 +131,8 @@ class DebugStateImpl { friend class Core::Devtools::Widget::FrameGraph; friend class Core::Devtools::Widget::ShaderList; + bool showing_debug_menu_bar = false; + std::queue debug_message_popup; std::mutex guest_threads_mutex{}; @@ -153,6 +155,9 @@ class DebugStateImpl { std::vector shader_dump_list{}; public: + float Framerate = 1.0f / 60.0f; + float FrameDeltaTime; + void ShowDebugMessage(std::string message) { if (message.empty()) { return; @@ -160,6 +165,10 @@ public: debug_message_popup.push(std::move(message)); } + bool& ShowingDebugMenuBar() { + return showing_debug_menu_bar; + } + void AddCurrentThreadToGuestList(); void RemoveCurrentThreadFromGuestList(); diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index 776f3377d..11990a56f 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -28,7 +28,6 @@ static bool show_simple_fps = false; static bool visibility_toggled = false; static float fps_scale = 1.0f; -static bool show_advanced_debug = false; static int dump_frame_count = 1; static Widget::FrameGraph frame_graph; @@ -253,8 +252,8 @@ void L::DrawAdvanced() { } void L::DrawSimple() { - const auto io = GetIO(); - Text("%.1f FPS (%.2f ms)", io.Framerate, 1000.0f / io.Framerate); + const float frameRate = DebugState.Framerate; + Text("%d FPS (%.1f ms)", static_cast(std::round(1.0f / frameRate)), frameRate * 1000.0f); } static void LoadSettings(const char* line) { @@ -265,7 +264,7 @@ static void LoadSettings(const char* line) { return; } if (sscanf(line, "show_advanced_debug=%d", &i) == 1) { - show_advanced_debug = i != 0; + DebugState.ShowingDebugMenuBar() = i != 0; return; } if (sscanf(line, "show_frame_graph=%d", &i) == 1) { @@ -310,7 +309,7 @@ void L::SetupSettings() { handler.WriteAllFn = [](ImGuiContext*, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) { buf->appendf("[%s][Data]\n", handler->TypeName); buf->appendf("fps_scale=%f\n", fps_scale); - buf->appendf("show_advanced_debug=%d\n", show_advanced_debug); + buf->appendf("show_advanced_debug=%d\n", DebugState.ShowingDebugMenuBar()); buf->appendf("show_frame_graph=%d\n", frame_graph.is_open); buf->appendf("dump_frame_count=%d\n", dump_frame_count); buf->append("\n"); @@ -336,12 +335,12 @@ void L::Draw() { if (!DebugState.IsGuestThreadsPaused()) { const auto fn = DebugState.flip_frame_count.load(); - frame_graph.AddFrame(fn, io.DeltaTime); + frame_graph.AddFrame(fn, DebugState.FrameDeltaTime); } if (IsKeyPressed(ImGuiKey_F10, false)) { if (io.KeyCtrl) { - show_advanced_debug = !show_advanced_debug; + DebugState.ShowingDebugMenuBar() ^= true; } else { show_simple_fps = !show_simple_fps; } @@ -376,7 +375,7 @@ void L::Draw() { End(); } - if (show_advanced_debug) { + if (DebugState.ShowingDebugMenuBar()) { PushFont(io.Fonts->Fonts[IMGUI_FONT_MONO]); PushID("DevtoolsLayer"); DrawAdvanced(); diff --git a/src/core/devtools/widget/frame_graph.cpp b/src/core/devtools/widget/frame_graph.cpp index 0e170db38..d93de571a 100644 --- a/src/core/devtools/widget/frame_graph.cpp +++ b/src/core/devtools/widget/frame_graph.cpp @@ -83,15 +83,13 @@ void FrameGraph::Draw() { auto isSystemPaused = DebugState.IsGuestThreadsPaused(); - static float deltaTime; - static float frameRate; - if (!isSystemPaused) { - deltaTime = io.DeltaTime * 1000.0f; + deltaTime = DebugState.FrameDeltaTime * 1000.0f; frameRate = 1000.0f / deltaTime; } Text("Frame time: %.3f ms (%.1f FPS)", deltaTime, frameRate); + Text("Presenter time: %.3f ms (%.1f FPS)", io.DeltaTime * 1000.0f, 1.0f / io.DeltaTime); Text("Flip frame: %d Gnm submit frame: %d", DebugState.flip_frame_count.load(), DebugState.gnm_frame_count.load()); diff --git a/src/core/devtools/widget/frame_graph.h b/src/core/devtools/widget/frame_graph.h index 40a68ffa7..aef3c0747 100644 --- a/src/core/devtools/widget/frame_graph.h +++ b/src/core/devtools/widget/frame_graph.h @@ -16,6 +16,9 @@ class FrameGraph { std::array frame_list{}; + float deltaTime{}; + float frameRate{}; + void DrawFrameGraph(); public: diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index f6c25afe3..29948f242 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -1,8 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include - #include "common/assert.h" #include "common/config.h" #include "common/debug.h" @@ -207,6 +205,13 @@ void VideoOutDriver::DrawBlankFrame() { presenter->Present(empty_frame); } +void VideoOutDriver::DrawLastFrame() { + const auto frame = presenter->PrepareLastFrame(); + if (frame != nullptr) { + presenter->Present(frame, true); + } +} + bool VideoOutDriver::SubmitFlip(VideoOutPort* port, s32 index, s64 flip_arg, bool is_eop /*= false*/) { { @@ -278,17 +283,24 @@ void VideoOutDriver::PresentThread(std::stop_token token) { return {}; }; - auto delay = std::chrono::microseconds{0}; while (!token.stop_requested()) { timer.Start(); + if (DebugState.IsGuestThreadsPaused()) { + DrawLastFrame(); + timer.End(); + continue; + } + // Check if it's time to take a request. auto& vblank_status = main_port.vblank_status; if (vblank_status.count % (main_port.flip_rate + 1) == 0) { const auto request = receive_request(); if (!request) { - if (!main_port.is_open || DebugState.IsGuestThreadsPaused()) { + if (!main_port.is_open) { DrawBlankFrame(); + } else { + DrawLastFrame(); } } else { Flip(request); diff --git a/src/core/libraries/videoout/driver.h b/src/core/libraries/videoout/driver.h index ec01b621f..ad7c7bec2 100644 --- a/src/core/libraries/videoout/driver.h +++ b/src/core/libraries/videoout/driver.h @@ -102,7 +102,8 @@ private: }; void Flip(const Request& req); - void DrawBlankFrame(); // Used when there is no flip request to keep ImGui up to date + void DrawBlankFrame(); // Video port out not open + void DrawLastFrame(); // Used when there is no flip request void SubmitFlipInternal(VideoOutPort* port, s32 index, s64 flip_arg, bool is_eop = false); void PresentThread(std::stop_token token); diff --git a/src/imgui/imgui_config.h b/src/imgui/imgui_config.h index ccb084d94..7b03a4bab 100644 --- a/src/imgui/imgui_config.h +++ b/src/imgui/imgui_config.h @@ -30,6 +30,12 @@ extern void assert_fail_debug_msg(const char* msg); #define IM_VEC4_CLASS_EXTRA \ constexpr ImVec4(float _v) : x(_v), y(_v), z(_v), w(_v) {} +namespace ImGui { +struct Texture; +} +#define ImTextureID ImTextureID +using ImTextureID = ::ImGui::Texture*; + #ifdef IMGUI_USE_WCHAR32 #error "This project uses 16 bits wchar standard like Orbis" #endif \ No newline at end of file diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index 335185473..b63f50340 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -6,6 +6,7 @@ #include "common/config.h" #include "common/path_util.h" +#include "core/debug_state.h" #include "core/devtools/layer.h" #include "imgui/imgui_layer.h" #include "imgui_core.h" @@ -167,7 +168,7 @@ bool ProcessEvent(SDL_Event* event) { } } -void NewFrame() { +ImGuiID NewFrame(bool is_reusing_frame) { { std::scoped_lock lock{change_layers_mutex}; while (!change_layers.empty()) { @@ -182,17 +183,24 @@ void NewFrame() { } } - Sdl::NewFrame(); + Sdl::NewFrame(is_reusing_frame); ImGui::NewFrame(); - DockSpaceOverViewport(0, GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode); + ImGuiWindowFlags flags = ImGuiDockNodeFlags_PassthruCentralNode; + if (!DebugState.ShowingDebugMenuBar()) { + flags |= ImGuiDockNodeFlags_NoTabBar; + } + ImGuiID dockId = DockSpaceOverViewport(0, GetMainViewport(), flags); for (auto* layer : layers) { layer->Draw(); } + + return dockId; } -void Render(const vk::CommandBuffer& cmdbuf, ::Vulkan::Frame* frame) { +void Render(const vk::CommandBuffer& cmdbuf, const vk::ImageView& image_view, + const vk::Extent2D& extent) { ImGui::Render(); ImDrawData* draw_data = GetDrawData(); if (draw_data->CmdListsCount == 0) { @@ -207,16 +215,16 @@ void Render(const vk::CommandBuffer& cmdbuf, ::Vulkan::Frame* frame) { vk::RenderingAttachmentInfo color_attachments[1]{ { - .imageView = frame->image_view, + .imageView = image_view, .imageLayout = vk::ImageLayout::eColorAttachmentOptimal, - .loadOp = vk::AttachmentLoadOp::eLoad, + .loadOp = vk::AttachmentLoadOp::eClear, .storeOp = vk::AttachmentStoreOp::eStore, }, }; vk::RenderingInfo render_info{}; render_info.renderArea = vk::Rect2D{ .offset = {0, 0}, - .extent = {frame->width, frame->height}, + .extent = extent, }; render_info.layerCount = 1; render_info.colorAttachmentCount = 1; diff --git a/src/imgui/renderer/imgui_core.h b/src/imgui/renderer/imgui_core.h index 9ad708f81..7d5279bd6 100644 --- a/src/imgui/renderer/imgui_core.h +++ b/src/imgui/renderer/imgui_core.h @@ -3,6 +3,8 @@ #pragma once +#include + #include "video_core/renderer_vulkan/vk_instance.h" #include "vulkan/vulkan_handles.hpp" @@ -24,8 +26,9 @@ void Shutdown(const vk::Device& device); bool ProcessEvent(SDL_Event* event); -void NewFrame(); +ImGuiID NewFrame(bool is_reusing_frame = false); -void Render(const vk::CommandBuffer& cmdbuf, Vulkan::Frame* frame); +void Render(const vk::CommandBuffer& cmdbuf, const vk::ImageView& image_view, + const vk::Extent2D& extent); } // namespace ImGui::Core diff --git a/src/imgui/renderer/imgui_impl_sdl3.cpp b/src/imgui/renderer/imgui_impl_sdl3.cpp index e67bdc775..ddd532cd0 100644 --- a/src/imgui/renderer/imgui_impl_sdl3.cpp +++ b/src/imgui/renderer/imgui_impl_sdl3.cpp @@ -5,6 +5,7 @@ #include #include "common/config.h" +#include "core/debug_state.h" #include "imgui_impl_sdl3.h" // SDL @@ -26,6 +27,7 @@ struct SdlData { SDL_Window* window{}; SDL_WindowID window_id{}; Uint64 time{}; + Uint64 nonReusedtime{}; const char* clipboard_text_data{}; // IME handling @@ -785,7 +787,7 @@ static void UpdateGamepads() { +thumb_dead_zone, +32767); } -void NewFrame() { +void NewFrame(bool is_reusing_frame) { SdlData* bd = GetBackendData(); IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?"); ImGuiIO& io = ImGui::GetIO(); @@ -798,9 +800,26 @@ void NewFrame() { if (current_time <= bd->time) current_time = bd->time + 1; io.DeltaTime = bd->time > 0 ? (float)((double)(current_time - bd->time) / (double)frequency) - : (float)(1.0f / 60.0f); + : 1.0f / 60.0f; bd->time = current_time; + if (!is_reusing_frame) { + if (current_time <= bd->nonReusedtime) + current_time = bd->nonReusedtime + 1; + float deltaTime = + bd->nonReusedtime > 0 + ? (float)((double)(current_time - bd->nonReusedtime) / (double)frequency) + : 1.0f / 60.0f; + bd->nonReusedtime = current_time; + DebugState.FrameDeltaTime = deltaTime; + float distribution = 0.016f / deltaTime / 10.0f; + if (distribution > 1.0f) { + distribution = 1.0f; + } + DebugState.Framerate = + deltaTime * distribution + DebugState.Framerate * (1.0f - distribution); + } + if (bd->mouse_pending_leave_frame && bd->mouse_pending_leave_frame >= ImGui::GetFrameCount() && bd->mouse_buttons_down == 0) { bd->mouse_window_id = 0; diff --git a/src/imgui/renderer/imgui_impl_sdl3.h b/src/imgui/renderer/imgui_impl_sdl3.h index 59b1a6856..fe626a962 100644 --- a/src/imgui/renderer/imgui_impl_sdl3.h +++ b/src/imgui/renderer/imgui_impl_sdl3.h @@ -14,7 +14,7 @@ namespace ImGui::Sdl { bool Init(SDL_Window* window); void Shutdown(); -void NewFrame(); +void NewFrame(bool is_reusing); bool ProcessEvent(const SDL_Event* event); void OnResize(); diff --git a/src/imgui/renderer/imgui_impl_vulkan.cpp b/src/imgui/renderer/imgui_impl_vulkan.cpp index 7f7ade2a5..bd98fa004 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.cpp +++ b/src/imgui/renderer/imgui_impl_vulkan.cpp @@ -57,11 +57,12 @@ struct VkData { vk::DeviceMemory font_memory{}; vk::Image font_image{}; vk::ImageView font_view{}; - vk::DescriptorSet font_descriptor_set{}; + ImTextureID font_texture{}; vk::CommandBuffer font_command_buffer{}; // Render buffers WindowRenderBuffers render_buffers{}; + bool enabled_blending{true}; VkData(const InitInfo init_info) : init_info(init_info) { render_buffers.count = init_info.image_count; @@ -252,8 +253,8 @@ void UploadTextureData::Destroy() { const InitInfo& v = bd->init_info; CheckVkErr(v.device.waitIdle()); - RemoveTexture(descriptor_set); - descriptor_set = VK_NULL_HANDLE; + RemoveTexture(im_texture); + im_texture = nullptr; v.device.destroyImageView(image_view, v.allocator); image_view = VK_NULL_HANDLE; @@ -264,8 +265,8 @@ void UploadTextureData::Destroy() { } // Register a texture -vk::DescriptorSet AddTexture(vk::ImageView image_view, vk::ImageLayout image_layout, - vk::Sampler sampler) { +ImTextureID AddTexture(vk::ImageView image_view, vk::ImageLayout image_layout, + vk::Sampler sampler) { VkData* bd = GetBackendData(); const InitInfo& v = bd->init_info; @@ -303,7 +304,9 @@ vk::DescriptorSet AddTexture(vk::ImageView image_view, vk::ImageLayout image_lay }; v.device.updateDescriptorSets({write_desc}, {}); } - return descriptor_set; + return new Texture{ + .descriptor_set = descriptor_set, + }; } UploadTextureData UploadTexture(const void* data, vk::Format format, u32 width, u32 height, size_t size) { @@ -370,7 +373,7 @@ UploadTextureData UploadTexture(const void* data, vk::Format format, u32 width, } // Create descriptor set (ImTextureID) - info.descriptor_set = AddTexture(info.image_view, vk::ImageLayout::eShaderReadOnlyOptimal); + info.im_texture = AddTexture(info.image_view, vk::ImageLayout::eShaderReadOnlyOptimal); // Create Upload Buffer { @@ -464,10 +467,12 @@ UploadTextureData UploadTexture(const void* data, vk::Format format, u32 width, return info; } -void RemoveTexture(vk::DescriptorSet descriptor_set) { +void RemoveTexture(ImTextureID texture) { + IM_ASSERT(texture != nullptr); VkData* bd = GetBackendData(); const InitInfo& v = bd->init_info; - v.device.freeDescriptorSets(bd->descriptor_pool, {descriptor_set}); + v.device.freeDescriptorSets(bd->descriptor_pool, {texture->descriptor_set}); + delete texture; } static void CreateOrResizeBuffer(RenderBuffer& rb, size_t new_size, vk::BufferUsageFlagBits usage) { @@ -679,15 +684,11 @@ void RenderDrawData(ImDrawData& draw_data, vk::CommandBuffer command_buffer, command_buffer.setScissor(0, 1, &scissor); // Bind DescriptorSet with font or user texture - vk::DescriptorSet desc_set[1]{(VkDescriptorSet)pcmd->TextureId}; - if (sizeof(ImTextureID) < sizeof(ImU64)) { - // We don't support texture switches if ImTextureID hasn't been redefined to be - // 64-bit. Do a flaky check that other textures haven't been used. - IM_ASSERT(pcmd->TextureId == (ImTextureID)bd->font_descriptor_set); - desc_set[0] = bd->font_descriptor_set; - } + vk::DescriptorSet desc_set[1]{pcmd->TextureId->descriptor_set}; command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, bd->pipeline_layout, 0, {desc_set}, {}); + command_buffer.setColorBlendEnableEXT( + 0, {pcmd->TextureId->disable_blend ? vk::False : vk::True}); // Draw command_buffer.drawIndexed(pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, @@ -709,7 +710,7 @@ static bool CreateFontsTexture() { const InitInfo& v = bd->init_info; // Destroy existing texture (if any) - if (bd->font_view || bd->font_image || bd->font_memory || bd->font_descriptor_set) { + if (bd->font_view || bd->font_image || bd->font_memory || bd->font_texture) { CheckVkErr(v.queue.waitIdle()); DestroyFontsTexture(); } @@ -782,7 +783,7 @@ static bool CreateFontsTexture() { } // Create the Descriptor Set: - bd->font_descriptor_set = AddTexture(bd->font_view, vk::ImageLayout::eShaderReadOnlyOptimal); + bd->font_texture = AddTexture(bd->font_view, vk::ImageLayout::eShaderReadOnlyOptimal); // Create the Upload Buffer: vk::DeviceMemory upload_buffer_memory{}; @@ -874,7 +875,7 @@ static bool CreateFontsTexture() { } // Store our identifier - io.Fonts->SetTexID(bd->font_descriptor_set); + io.Fonts->SetTexID(bd->font_texture); // End command buffer vk::SubmitInfo end_info = {}; @@ -898,9 +899,9 @@ static void DestroyFontsTexture() { VkData* bd = GetBackendData(); const InitInfo& v = bd->init_info; - if (bd->font_descriptor_set) { - RemoveTexture(bd->font_descriptor_set); - bd->font_descriptor_set = VK_NULL_HANDLE; + if (bd->font_texture) { + RemoveTexture(bd->font_texture); + bd->font_texture = nullptr; io.Fonts->SetTexID(nullptr); } @@ -1057,9 +1058,10 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all .pAttachments = color_attachment, }; - vk::DynamicState dynamic_states[2]{ + vk::DynamicState dynamic_states[3]{ vk::DynamicState::eViewport, vk::DynamicState::eScissor, + vk::DynamicState::eColorBlendEnableEXT, }; vk::PipelineDynamicStateCreateInfo dynamic_state{ .dynamicStateCount = (uint32_t)IM_ARRAYSIZE(dynamic_states), diff --git a/src/imgui/renderer/imgui_impl_vulkan.h b/src/imgui/renderer/imgui_impl_vulkan.h index e325e2a8d..05f4489da 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.h +++ b/src/imgui/renderer/imgui_impl_vulkan.h @@ -10,6 +10,13 @@ struct ImDrawData; +namespace ImGui { +struct Texture { + vk::DescriptorSet descriptor_set{nullptr}; + bool disable_blend{false}; +}; +} // namespace ImGui + namespace ImGui::Vulkan { struct InitInfo { @@ -34,29 +41,32 @@ struct InitInfo { struct UploadTextureData { vk::Image image; vk::ImageView image_view; - vk::DescriptorSet descriptor_set; vk::DeviceMemory image_memory; vk::CommandBuffer command_buffer; // Submit to the queue vk::Buffer upload_buffer; vk::DeviceMemory upload_buffer_memory; + ImTextureID im_texture; + void Upload(); void Destroy(); }; -vk::DescriptorSet AddTexture(vk::ImageView image_view, vk::ImageLayout image_layout, - vk::Sampler sampler = VK_NULL_HANDLE); +ImTextureID AddTexture(vk::ImageView image_view, vk::ImageLayout image_layout, + vk::Sampler sampler = VK_NULL_HANDLE); UploadTextureData UploadTexture(const void* data, vk::Format format, u32 width, u32 height, size_t size); -void RemoveTexture(vk::DescriptorSet descriptor_set); +void RemoveTexture(ImTextureID descriptor_set); bool Init(InitInfo info); void Shutdown(); void RenderDrawData(ImDrawData& draw_data, vk::CommandBuffer command_buffer, vk::Pipeline pipeline = VK_NULL_HANDLE); +void SetBlendEnabled(bool enabled); + } // namespace ImGui::Vulkan \ No newline at end of file diff --git a/src/imgui/renderer/texture_manager.cpp b/src/imgui/renderer/texture_manager.cpp index f13c995be..d7516a3a5 100644 --- a/src/imgui/renderer/texture_manager.cpp +++ b/src/imgui/renderer/texture_manager.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "common/assert.h" #include "common/config.h" #include "common/io_file.h" @@ -123,7 +124,7 @@ static std::deque g_upload_list; namespace Core::TextureManager { Inner::~Inner() { - if (upload_data.descriptor_set != nullptr) { + if (upload_data.im_texture != nullptr) { std::unique_lock lk{g_upload_mtx}; g_upload_list.emplace_back(UploadJob{ .data = this->upload_data, @@ -239,7 +240,7 @@ void Submit() { } if (upload.core != nullptr) { upload.core->upload_data.Upload(); - upload.core->texture_id = upload.core->upload_data.descriptor_set; + upload.core->texture_id = upload.core->upload_data.im_texture; if (upload.core->count.fetch_sub(1) == 1) { delete upload.core; } diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index f5bcb54b6..323b30816 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -383,6 +383,7 @@ bool Instance::CreateDevice() { .extendedDynamicState = true, }, vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT{ + .extendedDynamicState3ColorBlendEnable = true, .extendedDynamicState3ColorWriteMask = true, }, vk::PhysicalDeviceDepthClipControlFeaturesEXT{ diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 1679aa691..4d76eb8db 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -20,6 +20,9 @@ #include +#include +#include "imgui/renderer/imgui_impl_vulkan.h" + namespace Vulkan { bool CanBlitToSwapchain(const vk::PhysicalDevice physical_device, vk::Format format) { @@ -103,17 +106,6 @@ static vk::Rect2D FitImage(s32 frame_width, s32 frame_height, s32 swapchain_widt dst_rect.offset.x, dst_rect.offset.y); } -static vk::Format FormatToUnorm(vk::Format fmt) { - switch (fmt) { - case vk::Format::eR8G8B8A8Srgb: - return vk::Format::eR8G8B8A8Unorm; - case vk::Format::eB8G8R8A8Srgb: - return vk::Format::eB8G8R8A8Unorm; - default: - UNREACHABLE(); - } -} - void Presenter::CreatePostProcessPipeline() { static const std::array pp_shaders{ HostShaders::FS_TRI_VERT, @@ -324,9 +316,6 @@ Presenter::Presenter(Frontend::WindowSDL& window_, AmdGpu::Liverpool* liverpool_ CreatePostProcessPipeline(); - // Setup ImGui - ImGui::Core::Initialize(instance, window, num_images, - FormatToUnorm(swapchain.GetSurfaceFormat().format)); ImGui::Layer::AddLayer(Common::Singleton::Instance()); } @@ -344,6 +333,9 @@ Presenter::~Presenter() { void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { const vk::Device device = instance.GetDevice(); + if (frame->imgui_texture) { + ImGui::Vulkan::RemoveTexture(frame->imgui_texture); + } if (frame->image_view) { device.destroyImageView(frame->image_view); } @@ -361,7 +353,7 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { .arrayLayers = 1, .samples = vk::SampleCountFlagBits::e1, .usage = vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferDst | - vk::ImageUsageFlagBits::eTransferSrc, + vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eSampled, }; const VmaAllocationCreateInfo alloc_info = { @@ -403,6 +395,64 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { frame->image_view = view; frame->width = width; frame->height = height; + + frame->imgui_texture = ImGui::Vulkan::AddTexture(view, vk::ImageLayout::eShaderReadOnlyOptimal); + frame->imgui_texture->disable_blend = true; +} + +Frame* Presenter::PrepareLastFrame() { + if (last_submit_frame == nullptr) { + return nullptr; + } + + Frame* frame = last_submit_frame; + + while (true) { + vk::Result result = instance.GetDevice().waitForFences(frame->present_done, false, + std::numeric_limits::max()); + if (result == vk::Result::eSuccess) { + break; + } + if (result == vk::Result::eTimeout) { + continue; + } + ASSERT_MSG(result != vk::Result::eErrorDeviceLost, + "Device lost during waiting for a frame"); + } + + auto& scheduler = flip_scheduler; + scheduler.EndRendering(); + const auto cmdbuf = scheduler.CommandBuffer(); + + const auto frame_subresources = vk::ImageSubresourceRange{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = VK_REMAINING_ARRAY_LAYERS, + }; + + const auto pre_barrier = + vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, + .srcAccessMask = vk::AccessFlagBits2::eColorAttachmentRead, + .dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, + .dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, + .oldLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + .newLayout = vk::ImageLayout::eGeneral, + .image = frame->image, + .subresourceRange{frame_subresources}}; + + cmdbuf.pipelineBarrier2(vk::DependencyInfo{ + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &pre_barrier, + }); + + // Flush frame creation commands. + frame->ready_semaphore = scheduler.GetMasterSemaphore()->Handle(); + frame->ready_tick = scheduler.CurrentTick(); + SubmitInfo info{}; + scheduler.Flush(info); + return frame; } bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { @@ -499,6 +549,14 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) // Request a free presentation frame. Frame* frame = GetRenderFrame(); + if (image_id != VideoCore::NULL_IMAGE_ID) { + const auto& image = texture_cache.GetImage(image_id); + const auto extent = image.info.size; + if (frame->width != extent.width || frame->height != extent.height) { + RecreateFrame(frame, extent.width, extent.height); + } + } + // EOP flips are triggered from GPU thread so use the drawing scheduler to record // commands. Otherwise we are dealing with a CPU flip which could have arrived // from any guest thread. Use a separate scheduler for that. @@ -515,8 +573,8 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) }; const auto pre_barrier = - vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eTransfer, - .srcAccessMask = vk::AccessFlagBits2::eTransferRead, + vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, + .srcAccessMask = vk::AccessFlagBits2::eColorAttachmentRead, .dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, .dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, .oldLayout = vk::ImageLayout::eUndefined, @@ -627,17 +685,19 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) return frame; } -void Presenter::Present(Frame* frame) { +void Presenter::Present(Frame* frame, bool is_reusing_frame) { // Free the frame for reuse const auto free_frame = [&] { - std::scoped_lock fl{free_mutex}; - free_queue.push(frame); - free_cv.notify_one(); + if (!is_reusing_frame) { + last_submit_frame = frame; + std::scoped_lock fl{free_mutex}; + free_queue.push(frame); + free_cv.notify_one(); + } }; // Recreate the swapchain if the window was resized. - if (window.GetWidth() != swapchain.GetExtent().width || - window.GetHeight() != swapchain.GetExtent().height) { + if (window.GetWidth() != swapchain.GetWidth() || window.GetHeight() != swapchain.GetHeight()) { swapchain.Recreate(window.GetWidth(), window.GetHeight()); } @@ -656,15 +716,14 @@ void Presenter::Present(Frame* frame) { // the frame's present fence and future GetRenderFrame() call will hang waiting for this frame. instance.GetDevice().resetFences(frame->present_done); - ImGui::Core::NewFrame(); + ImGuiID dockId = ImGui::Core::NewFrame(is_reusing_frame); const vk::Image swapchain_image = swapchain.Image(); + const vk::ImageView swapchain_image_view = swapchain.ImageView(); auto& scheduler = present_scheduler; const auto cmdbuf = scheduler.CommandBuffer(); - ImGui::Core::Render(cmdbuf, frame); - { auto* profiler_ctx = instance.GetProfilerContext(); TracyVkNamedZoneC(profiler_ctx, renderer_gpu_zone, cmdbuf, "Host frame", @@ -674,9 +733,9 @@ void Presenter::Present(Frame* frame) { const std::array pre_barriers{ vk::ImageMemoryBarrier{ .srcAccessMask = vk::AccessFlagBits::eNone, - .dstAccessMask = vk::AccessFlagBits::eTransferWrite, + .dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite, .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eTransferDstOptimal, + .newLayout = vk::ImageLayout::eColorAttachmentOptimal, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .image = swapchain_image, @@ -690,9 +749,9 @@ void Presenter::Present(Frame* frame) { }, vk::ImageMemoryBarrier{ .srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite, - .dstAccessMask = vk::AccessFlagBits::eTransferRead, + .dstAccessMask = vk::AccessFlagBits::eColorAttachmentRead, .oldLayout = vk::ImageLayout::eGeneral, - .newLayout = vk::ImageLayout::eTransferSrcOptimal, + .newLayout = vk::ImageLayout::eShaderReadOnlyOptimal, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .image = frame->image, @@ -705,10 +764,11 @@ void Presenter::Present(Frame* frame) { }, }, }; + const vk::ImageMemoryBarrier post_barrier{ - .srcAccessMask = vk::AccessFlagBits::eTransferWrite, + .srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite, .dstAccessMask = vk::AccessFlagBits::eMemoryRead, - .oldLayout = vk::ImageLayout::eTransferDstOptimal, + .oldLayout = vk::ImageLayout::eColorAttachmentOptimal, .newLayout = vk::ImageLayout::ePresentSrcKHR, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, @@ -723,14 +783,29 @@ void Presenter::Present(Frame* frame) { }; cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eColorAttachmentOutput, - vk::PipelineStageFlagBits::eTransfer, + vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::DependencyFlagBits::eByRegion, {}, {}, pre_barriers); - cmdbuf.blitImage( - frame->image, vk::ImageLayout::eTransferSrcOptimal, swapchain_image, - vk::ImageLayout::eTransferDstOptimal, - MakeImageBlitStretch(frame->width, frame->height, extent.width, extent.height), - vk::Filter::eLinear); + { // Draw the game + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{0.0f}); + ImGui::SetNextWindowDockID(dockId, ImGuiCond_Once); + ImGui::Begin("Display##game_display", nullptr, ImGuiWindowFlags_NoNav); + + ImVec2 contentArea = ImGui::GetContentRegionAvail(); + const vk::Rect2D imgRect = + FitImage(frame->width, frame->height, (s32)contentArea.x, (s32)contentArea.y); + ImGui::SetCursorPos(ImGui::GetCursorStartPos() + ImVec2{ + (float)imgRect.offset.x, + (float)imgRect.offset.y, + }); + ImGui::Image(frame->imgui_texture, { + static_cast(imgRect.extent.width), + static_cast(imgRect.extent.height), + }); + ImGui::End(); + ImGui::PopStyleVar(); + } + ImGui::Core::Render(cmdbuf, swapchain_image_view, swapchain.GetExtent()); cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eAllCommands, @@ -756,7 +831,9 @@ void Presenter::Present(Frame* frame) { } free_frame(); - DebugState.IncFlipFrameNum(); + if (!is_reusing_frame) { + DebugState.IncFlipFrameNum(); + } } Frame* Presenter::GetRenderFrame() { @@ -790,9 +867,9 @@ Frame* Presenter::GetRenderFrame() { } } - // If the window dimensions changed, recreate this frame - if (frame->width != window.GetWidth() || frame->height != window.GetHeight()) { - RecreateFrame(frame, window.GetWidth(), window.GetHeight()); + // Initialize default frame image + if (frame->width == 0 || frame->height == 0) { + RecreateFrame(frame, 1920, 1080); } return frame; diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 4c29af0f0..63cb30834 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -5,6 +5,7 @@ #include +#include "imgui/imgui_config.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" @@ -30,6 +31,8 @@ struct Frame { vk::Fence present_done; vk::Semaphore ready_semaphore; u64 ready_tick; + + ImTextureID imgui_texture; }; enum SchedulerType { @@ -86,8 +89,9 @@ public: } bool ShowSplash(Frame* frame = nullptr); - void Present(Frame* frame); + void Present(Frame* frame, bool is_reusing_frame = false); void RecreateFrame(Frame* frame, u32 width, u32 height); + Frame* PrepareLastFrame(); void FlushDraw() { SubmitInfo info{}; @@ -121,6 +125,7 @@ private: vk::UniqueCommandPool command_pool; std::vector present_frames; std::queue free_queue; + Frame* last_submit_frame; std::mutex free_mutex; std::condition_variable free_cv; std::condition_variable_any frame_cv; diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 8278252ad..556cccd32 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -4,8 +4,8 @@ #include #include #include "common/assert.h" -#include "common/config.h" #include "common/logging/log.h" +#include "imgui/renderer/imgui_core.h" #include "sdl_window.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_swapchain.h" @@ -15,7 +15,9 @@ namespace Vulkan { Swapchain::Swapchain(const Instance& instance_, const Frontend::WindowSDL& window) : instance{instance_}, surface{CreateSurface(instance.GetInstance(), window)} { FindPresentFormat(); - Create(window.GetWidth(), window.GetHeight(), surface); + + Create(window.GetWidth(), window.GetHeight()); + ImGui::Core::Initialize(instance, window, image_count, surface_format.format); } Swapchain::~Swapchain() { @@ -23,10 +25,9 @@ Swapchain::~Swapchain() { instance.GetInstance().destroySurfaceKHR(surface); } -void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) { +void Swapchain::Create(u32 width_, u32 height_) { width = width_; height = height_; - surface = surface_; needs_recreation = false; Destroy(); @@ -86,7 +87,7 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) { void Swapchain::Recreate(u32 width_, u32 height_) { LOG_DEBUG(Render_Vulkan, "Recreate the swapchain: width={} height={}", width_, height_); - Create(width_, height_, surface); + Create(width_, height_); } bool Swapchain::AcquireNextImage() { @@ -209,10 +210,14 @@ void Swapchain::Destroy() { if (swapchain) { device.destroySwapchainKHR(swapchain); } - for (u32 i = 0; i < image_count; i++) { - device.destroySemaphore(image_acquired[i]); - device.destroySemaphore(present_ready[i]); + + for (const auto& sem : image_acquired) { + device.destroySemaphore(sem); } + for (const auto& sem : present_ready) { + device.destroySemaphore(sem); + } + image_acquired.clear(); present_ready.clear(); } @@ -249,9 +254,30 @@ void Swapchain::SetupImages() { vk::to_string(images_result)); images = std::move(imgs); image_count = static_cast(images.size()); + images_view.resize(image_count); + for (u32 i = 0; i < image_count; ++i) { + if (images_view[i]) { + device.destroyImageView(images_view[i]); + } + auto [im_view_result, im_view] = device.createImageView(vk::ImageViewCreateInfo{ + .image = images[i], + .viewType = vk::ImageViewType::e2D, + .format = FormatToUnorm(surface_format.format), + .subresourceRange = + { + .aspectMask = vk::ImageAspectFlagBits::eColor, + .levelCount = 1, + .layerCount = 1, + }, + }); + ASSERT_MSG(im_view_result == vk::Result::eSuccess, "Failed to create image view: {}", + vk::to_string(im_view_result)); + images_view[i] = im_view; + } for (u32 i = 0; i < image_count; ++i) { SetObjectName(device, images[i], "Swapchain Image {}", i); + SetObjectName(device, images_view[i], "Swapchain ImageView {}", i); } } diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index 19ae9b2d2..192271f32 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -17,13 +17,24 @@ namespace Vulkan { class Instance; class Scheduler; +inline vk::Format FormatToUnorm(vk::Format fmt) { + switch (fmt) { + case vk::Format::eR8G8B8A8Srgb: + return vk::Format::eR8G8B8A8Unorm; + case vk::Format::eB8G8R8A8Srgb: + return vk::Format::eB8G8R8A8Unorm; + default: + UNREACHABLE(); + } +} + class Swapchain { public: explicit Swapchain(const Instance& instance, const Frontend::WindowSDL& window); ~Swapchain(); /// Creates (or recreates) the swapchain with a given size. - void Create(u32 width, u32 height, vk::SurfaceKHR surface); + void Create(u32 width, u32 height); /// Recreates the swapchain with a given size and current surface. void Recreate(u32 width, u32 height); @@ -42,6 +53,10 @@ public: return images[image_index]; } + vk::ImageView ImageView() const { + return images_view[image_index]; + } + vk::SurfaceFormatKHR GetSurfaceFormat() const { return surface_format; } @@ -103,6 +118,7 @@ private: vk::SurfaceTransformFlagBitsKHR transform; vk::CompositeAlphaFlagBitsKHR composite_alpha; std::vector images; + std::vector images_view; std::vector image_acquired; std::vector present_ready; u32 width = 0; From 8695383d3597d5b625c9ac4d0ad7c5feebf02cac Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Thu, 16 Jan 2025 21:10:17 -0300 Subject: [PATCH 073/455] keep framerate stable even without vsync (#2165) --- src/common/thread.h | 4 ++++ src/core/debug_state.h | 2 +- src/core/devtools/layer.cpp | 10 +++++----- src/core/libraries/videoout/driver.cpp | 11 +++++++---- src/imgui/renderer/imgui_core.cpp | 6 +++++- src/imgui/renderer/imgui_core.h | 2 ++ src/imgui/renderer/imgui_impl_sdl3.cpp | 20 ++++++++++++++------ 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/common/thread.h b/src/common/thread.h index 175ba9445..92cc0c59d 100644 --- a/src/common/thread.h +++ b/src/common/thread.h @@ -37,6 +37,10 @@ public: void Start(); void End(); + + std::chrono::nanoseconds GetTotalWait() const { + return total_wait; + } }; } // namespace Common diff --git a/src/core/debug_state.h b/src/core/debug_state.h index aab741fd0..a9e6f48b7 100644 --- a/src/core/debug_state.h +++ b/src/core/debug_state.h @@ -165,7 +165,7 @@ public: debug_message_popup.push(std::move(message)); } - bool& ShowingDebugMenuBar() { + bool& IsShowingDebugMenuBar() { return showing_debug_menu_bar; } diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index 11990a56f..c652849e7 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -253,7 +253,7 @@ void L::DrawAdvanced() { void L::DrawSimple() { const float frameRate = DebugState.Framerate; - Text("%d FPS (%.1f ms)", static_cast(std::round(1.0f / frameRate)), frameRate * 1000.0f); + Text("%d FPS (%.1f ms)", static_cast(std::round(frameRate)), 1000.0f / frameRate); } static void LoadSettings(const char* line) { @@ -264,7 +264,7 @@ static void LoadSettings(const char* line) { return; } if (sscanf(line, "show_advanced_debug=%d", &i) == 1) { - DebugState.ShowingDebugMenuBar() = i != 0; + DebugState.IsShowingDebugMenuBar() = i != 0; return; } if (sscanf(line, "show_frame_graph=%d", &i) == 1) { @@ -309,7 +309,7 @@ void L::SetupSettings() { handler.WriteAllFn = [](ImGuiContext*, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) { buf->appendf("[%s][Data]\n", handler->TypeName); buf->appendf("fps_scale=%f\n", fps_scale); - buf->appendf("show_advanced_debug=%d\n", DebugState.ShowingDebugMenuBar()); + buf->appendf("show_advanced_debug=%d\n", DebugState.IsShowingDebugMenuBar()); buf->appendf("show_frame_graph=%d\n", frame_graph.is_open); buf->appendf("dump_frame_count=%d\n", dump_frame_count); buf->append("\n"); @@ -340,7 +340,7 @@ void L::Draw() { if (IsKeyPressed(ImGuiKey_F10, false)) { if (io.KeyCtrl) { - DebugState.ShowingDebugMenuBar() ^= true; + DebugState.IsShowingDebugMenuBar() ^= true; } else { show_simple_fps = !show_simple_fps; } @@ -375,7 +375,7 @@ void L::Draw() { End(); } - if (DebugState.ShowingDebugMenuBar()) { + if (DebugState.IsShowingDebugMenuBar()) { PushFont(io.Fonts->Fonts[IMGUI_FONT_MONO]); PushID("DevtoolsLayer"); DrawAdvanced(); diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index 29948f242..de5421fd7 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -9,6 +9,7 @@ #include "core/libraries/kernel/time.h" #include "core/libraries/videoout/driver.h" #include "core/libraries/videoout/videoout_error.h" +#include "imgui/renderer/imgui_core.h" #include "video_core/renderer_vulkan/vk_presenter.h" extern std::unique_ptr presenter; @@ -297,10 +298,12 @@ void VideoOutDriver::PresentThread(std::stop_token token) { if (vblank_status.count % (main_port.flip_rate + 1) == 0) { const auto request = receive_request(); if (!request) { - if (!main_port.is_open) { - DrawBlankFrame(); - } else { - DrawLastFrame(); + if (timer.GetTotalWait().count() < 0) { // Dont draw too fast + if (!main_port.is_open) { + DrawBlankFrame(); + } else if (ImGui::Core::MustKeepDrawing()) { + DrawLastFrame(); + } } } else { Flip(request); diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index b63f50340..f3e4609ba 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -187,7 +187,7 @@ ImGuiID NewFrame(bool is_reusing_frame) { ImGui::NewFrame(); ImGuiWindowFlags flags = ImGuiDockNodeFlags_PassthruCentralNode; - if (!DebugState.ShowingDebugMenuBar()) { + if (!DebugState.IsShowingDebugMenuBar()) { flags |= ImGuiDockNodeFlags_NoTabBar; } ImGuiID dockId = DockSpaceOverViewport(0, GetMainViewport(), flags); @@ -237,6 +237,10 @@ void Render(const vk::CommandBuffer& cmdbuf, const vk::ImageView& image_view, } } +bool MustKeepDrawing() { + return layers.size() > 1 || DebugState.IsShowingDebugMenuBar(); +} + } // namespace Core void Layer::AddLayer(Layer* layer) { diff --git a/src/imgui/renderer/imgui_core.h b/src/imgui/renderer/imgui_core.h index 7d5279bd6..ffee62cf8 100644 --- a/src/imgui/renderer/imgui_core.h +++ b/src/imgui/renderer/imgui_core.h @@ -31,4 +31,6 @@ ImGuiID NewFrame(bool is_reusing_frame = false); void Render(const vk::CommandBuffer& cmdbuf, const vk::ImageView& image_view, const vk::Extent2D& extent); +bool MustKeepDrawing(); // Force the emulator redraw + } // namespace ImGui::Core diff --git a/src/imgui/renderer/imgui_impl_sdl3.cpp b/src/imgui/renderer/imgui_impl_sdl3.cpp index ddd532cd0..ccd31d03a 100644 --- a/src/imgui/renderer/imgui_impl_sdl3.cpp +++ b/src/imgui/renderer/imgui_impl_sdl3.cpp @@ -46,6 +46,11 @@ struct SdlData { ImVector gamepads{}; GamepadMode gamepad_mode{}; bool want_update_gamepads_list{}; + + // Framerate counting (based on ImGui impl) + std::array framerateSecPerFrame; + int framerateSecPerFrameIdx{}; + float framerateSecPerFrameAcc{}; }; // Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui @@ -812,12 +817,15 @@ void NewFrame(bool is_reusing_frame) { : 1.0f / 60.0f; bd->nonReusedtime = current_time; DebugState.FrameDeltaTime = deltaTime; - float distribution = 0.016f / deltaTime / 10.0f; - if (distribution > 1.0f) { - distribution = 1.0f; - } - DebugState.Framerate = - deltaTime * distribution + DebugState.Framerate * (1.0f - distribution); + + int& frameIdx = bd->framerateSecPerFrameIdx; + float& framerateSec = bd->framerateSecPerFrame[frameIdx]; + float& acc = bd->framerateSecPerFrameAcc; + int count = bd->framerateSecPerFrame.size(); + acc += deltaTime - framerateSec; + framerateSec = deltaTime; + frameIdx = (frameIdx + 1) % count; + DebugState.Framerate = acc > 0.0f ? 1.0f / (acc / (float)count) : FLT_MAX; } if (bd->mouse_pending_leave_frame && bd->mouse_pending_leave_frame >= ImGui::GetFrameCount() && From eb49193309f2b40ffe06e74060939761142d8f24 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 16 Jan 2025 18:24:29 -0800 Subject: [PATCH 074/455] liverpool: Revert queue scope markers. (#2166) --- src/video_core/amdgpu/liverpool.cpp | 41 +++++++++++------------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 036a031a7..8355dd1e6 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -224,10 +224,6 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::spanScopeMarkerBegin("gfx"); - } - const auto base_addr = reinterpret_cast(dcb.data()); while (!dcb.empty()) { const auto* header = reinterpret_cast(dcb.data()); @@ -416,7 +412,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndex2", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("gfx:{}:DrawIndex2", cmd_address)); rasterizer->Draw(true); rasterizer->ScopeMarkerEnd(); } @@ -433,7 +429,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndexOffset2", cmd_address)); + rasterizer->ScopeMarkerBegin( + fmt::format("gfx:{}:DrawIndexOffset2", cmd_address)); rasterizer->Draw(true, draw_index_off->index_offset); rasterizer->ScopeMarkerEnd(); } @@ -448,7 +445,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndexAuto", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("gfx:{}:DrawIndexAuto", cmd_address)); rasterizer->Draw(false); rasterizer->ScopeMarkerEnd(); } @@ -463,7 +460,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndirect", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("gfx:{}:DrawIndirect", cmd_address)); rasterizer->DrawIndirect(false, indirect_args_addr, offset, size, 1, 0); rasterizer->ScopeMarkerEnd(); } @@ -479,7 +476,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DrawIndexIndirect", cmd_address)); + rasterizer->ScopeMarkerBegin( + fmt::format("gfx:{}:DrawIndexIndirect", cmd_address)); rasterizer->DrawIndirect(true, indirect_args_addr, offset, size, 1, 0); rasterizer->ScopeMarkerEnd(); } @@ -495,7 +493,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); rasterizer->ScopeMarkerBegin( - fmt::format("{}:DrawIndexIndirectCountMulti", cmd_address)); + fmt::format("gfx:{}:DrawIndexIndirectCountMulti", cmd_address)); rasterizer->DrawIndirect( true, indirect_args_addr, offset, draw_index_indirect->stride, draw_index_indirect->count, draw_index_indirect->countAddr); @@ -516,7 +514,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchDirect", cmd_address)); + rasterizer->ScopeMarkerBegin(fmt::format("gfx:{}:DispatchDirect", cmd_address)); rasterizer->DispatchDirect(); rasterizer->ScopeMarkerEnd(); } @@ -534,7 +532,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchIndirect", cmd_address)); + rasterizer->ScopeMarkerBegin( + fmt::format("gfx:{}:DispatchIndirect", cmd_address)); rasterizer->DispatchIndirect(indirect_args_addr, offset, size); rasterizer->ScopeMarkerEnd(); } @@ -702,10 +701,6 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::spanScopeMarkerEnd(); - } - if (ce_task.handle) { ASSERT_MSG(ce_task.handle.done(), "Partially processed CCB"); ce_task.handle.destroy(); @@ -719,10 +714,6 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { FIBER_ENTER(acb_task_name[vqid]); const auto& queue = asc_queues[{vqid}]; - if (rasterizer) { - rasterizer->ScopeMarkerBegin(fmt::format("asc[{}]", vqid)); - } - auto base_addr = reinterpret_cast(acb.data()); while (!acb.empty()) { const auto* header = reinterpret_cast(acb.data()); @@ -820,7 +811,8 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } if (rasterizer && (cs_program.dispatch_initiator & 1)) { const auto cmd_address = reinterpret_cast(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchDirect", cmd_address)); + rasterizer->ScopeMarkerBegin( + fmt::format("asc[{}]:{}:DispatchDirect", vqid, cmd_address)); rasterizer->DispatchDirect(); rasterizer->ScopeMarkerEnd(); } @@ -838,7 +830,8 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } if (rasterizer && (cs_program.dispatch_initiator & 1)) { const auto cmd_address = reinterpret_cast(header); - rasterizer->ScopeMarkerBegin(fmt::format("{}:DispatchIndirect", cmd_address)); + rasterizer->ScopeMarkerBegin( + fmt::format("asc[{}]:{}:DispatchIndirect", vqid, cmd_address)); rasterizer->DispatchIndirect(ib_address, 0, size); rasterizer->ScopeMarkerEnd(); } @@ -886,10 +879,6 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } } - if (rasterizer) { - rasterizer->ScopeMarkerEnd(); - } - FIBER_EXIT; } From 3b474a12f99571a70ef526dfe5aa5c633ef2c6bf Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 16 Jan 2025 18:40:03 -0800 Subject: [PATCH 075/455] shader_recompiler: Improvements to buffer addressing implementation. (#2123) --- .../frontend/translate/vector_memory.cpp | 96 +++++++++------- .../ir/passes/constant_propagation_pass.cpp | 12 +- .../ir/passes/resource_tracking_pass.cpp | 103 +++++++++++------- src/shader_recompiler/specialization.h | 11 ++ src/video_core/amdgpu/resource.h | 10 ++ 5 files changed, 149 insertions(+), 83 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index a5b54dff7..8fa0f3f87 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -164,8 +164,8 @@ void Translator::EmitVectorMemory(const GcnInst& inst) { } void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) { - const auto& mtbuf = inst.control.mtbuf; - const bool is_ring = mtbuf.glc && mtbuf.slc; + const auto& mubuf = inst.control.mubuf; + const bool is_ring = mubuf.glc && mubuf.slc; const IR::VectorReg vaddr{inst.src[0].code}; const IR::ScalarReg sharp{inst.src[2].code * 4}; const IR::Value soffset{GetSrc(inst.src[3])}; @@ -178,22 +178,23 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) if (is_ring) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), soffset); } - if (mtbuf.idxen && mtbuf.offen) { + if (mubuf.idxen && mubuf.offen) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); } - if (mtbuf.idxen || mtbuf.offen) { + if (mubuf.idxen || mubuf.offen) { return ir.GetVectorReg(vaddr); } return {}; }(); IR::BufferInstInfo buffer_info{}; - buffer_info.index_enable.Assign(mtbuf.idxen); - buffer_info.offset_enable.Assign(mtbuf.offen); - buffer_info.inst_offset.Assign(mtbuf.offset); - buffer_info.globally_coherent.Assign(mtbuf.glc); - buffer_info.system_coherent.Assign(mtbuf.slc); + buffer_info.index_enable.Assign(mubuf.idxen); + buffer_info.offset_enable.Assign(mubuf.offen); + buffer_info.inst_offset.Assign(mubuf.offset); + buffer_info.globally_coherent.Assign(mubuf.glc); + buffer_info.system_coherent.Assign(mubuf.slc); if (is_typed) { + const auto& mtbuf = inst.control.mtbuf; const auto dmft = static_cast(mtbuf.dfmt); const auto nfmt = static_cast(mtbuf.nfmt); ASSERT(nfmt == AmdGpu::NumberFormat::Float && @@ -220,9 +221,11 @@ void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) { const auto& mubuf = inst.control.mubuf; const IR::VectorReg vaddr{inst.src[0].code}; const IR::ScalarReg sharp{inst.src[2].code * 4}; - ASSERT_MSG(!mubuf.offen && mubuf.offset == 0, "Offsets for image buffers are not supported"); const IR::Value address = [&] -> IR::Value { - if (mubuf.idxen) { + if (mubuf.idxen && mubuf.offen) { + return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); + } + if (mubuf.idxen || mubuf.offen) { return ir.GetVectorReg(vaddr); } return {}; @@ -230,13 +233,17 @@ void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) { const IR::Value soffset{GetSrc(inst.src[3])}; ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported"); - IR::BufferInstInfo info{}; - info.index_enable.Assign(mubuf.idxen); + IR::BufferInstInfo buffer_info{}; + buffer_info.index_enable.Assign(mubuf.idxen); + buffer_info.offset_enable.Assign(mubuf.offen); + buffer_info.inst_offset.Assign(mubuf.offset); + buffer_info.globally_coherent.Assign(mubuf.glc); + buffer_info.system_coherent.Assign(mubuf.slc); const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - const IR::Value value = ir.LoadBufferFormat(handle, address, info); + const IR::Value value = ir.LoadBufferFormat(handle, address, buffer_info); const IR::VectorReg dst_reg{inst.src[1].code}; for (u32 i = 0; i < num_dwords; i++) { ir.SetVectorReg(dst_reg + i, IR::F32{ir.CompositeExtract(value, i)}); @@ -244,8 +251,8 @@ void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) { } void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst) { - const auto& mtbuf = inst.control.mtbuf; - const bool is_ring = mtbuf.glc && mtbuf.slc; + const auto& mubuf = inst.control.mubuf; + const bool is_ring = mubuf.glc && mubuf.slc; const IR::VectorReg vaddr{inst.src[0].code}; const IR::ScalarReg sharp{inst.src[2].code * 4}; const IR::Value soffset{GetSrc(inst.src[3])}; @@ -259,22 +266,23 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst if (is_ring) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), soffset); } - if (mtbuf.idxen && mtbuf.offen) { + if (mubuf.idxen && mubuf.offen) { return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); } - if (mtbuf.idxen || mtbuf.offen) { + if (mubuf.idxen || mubuf.offen) { return ir.GetVectorReg(vaddr); } return {}; }(); IR::BufferInstInfo buffer_info{}; - buffer_info.index_enable.Assign(mtbuf.idxen); - buffer_info.offset_enable.Assign(mtbuf.offen); - buffer_info.inst_offset.Assign(mtbuf.offset); - buffer_info.globally_coherent.Assign(mtbuf.glc); - buffer_info.system_coherent.Assign(mtbuf.slc); + buffer_info.index_enable.Assign(mubuf.idxen); + buffer_info.offset_enable.Assign(mubuf.offen); + buffer_info.inst_offset.Assign(mubuf.offset); + buffer_info.globally_coherent.Assign(mubuf.glc); + buffer_info.system_coherent.Assign(mubuf.slc); if (is_typed) { + const auto& mtbuf = inst.control.mtbuf; const auto dmft = static_cast(mtbuf.dfmt); const auto nfmt = static_cast(mtbuf.nfmt); ASSERT(nfmt == AmdGpu::NumberFormat::Float && @@ -321,8 +329,12 @@ void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) { const IR::Value soffset{GetSrc(inst.src[3])}; ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported"); - IR::BufferInstInfo info{}; - info.index_enable.Assign(mubuf.idxen); + IR::BufferInstInfo buffer_info{}; + buffer_info.index_enable.Assign(mubuf.idxen); + buffer_info.offset_enable.Assign(mubuf.offen); + buffer_info.inst_offset.Assign(mubuf.offset); + buffer_info.globally_coherent.Assign(mubuf.glc); + buffer_info.system_coherent.Assign(mubuf.slc); const IR::VectorReg src_reg{inst.src[1].code}; @@ -338,7 +350,7 @@ void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) { const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - ir.StoreBufferFormat(handle, address, value, info); + ir.StoreBufferFormat(handle, address, value, buffer_info); } void Translator::BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst) { @@ -358,10 +370,12 @@ void Translator::BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst) { const IR::U32 soffset{GetSrc(inst.src[3])}; ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported"); - IR::BufferInstInfo info{}; - info.index_enable.Assign(mubuf.idxen); - info.inst_offset.Assign(mubuf.offset); - info.offset_enable.Assign(mubuf.offen); + IR::BufferInstInfo buffer_info{}; + buffer_info.index_enable.Assign(mubuf.idxen); + buffer_info.offset_enable.Assign(mubuf.offen); + buffer_info.inst_offset.Assign(mubuf.offset); + buffer_info.globally_coherent.Assign(mubuf.glc); + buffer_info.system_coherent.Assign(mubuf.slc); IR::Value vdata_val = ir.GetVectorReg(vdata); const IR::Value handle = @@ -371,27 +385,27 @@ void Translator::BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst) { const IR::Value original_val = [&] { switch (op) { case AtomicOp::Swap: - return ir.BufferAtomicSwap(handle, address, vdata_val, info); + return ir.BufferAtomicSwap(handle, address, vdata_val, buffer_info); case AtomicOp::Add: - return ir.BufferAtomicIAdd(handle, address, vdata_val, info); + return ir.BufferAtomicIAdd(handle, address, vdata_val, buffer_info); case AtomicOp::Smin: - return ir.BufferAtomicIMin(handle, address, vdata_val, true, info); + return ir.BufferAtomicIMin(handle, address, vdata_val, true, buffer_info); case AtomicOp::Umin: - return ir.BufferAtomicIMin(handle, address, vdata_val, false, info); + return ir.BufferAtomicIMin(handle, address, vdata_val, false, buffer_info); case AtomicOp::Smax: - return ir.BufferAtomicIMax(handle, address, vdata_val, true, info); + return ir.BufferAtomicIMax(handle, address, vdata_val, true, buffer_info); case AtomicOp::Umax: - return ir.BufferAtomicIMax(handle, address, vdata_val, false, info); + return ir.BufferAtomicIMax(handle, address, vdata_val, false, buffer_info); case AtomicOp::And: - return ir.BufferAtomicAnd(handle, address, vdata_val, info); + return ir.BufferAtomicAnd(handle, address, vdata_val, buffer_info); case AtomicOp::Or: - return ir.BufferAtomicOr(handle, address, vdata_val, info); + return ir.BufferAtomicOr(handle, address, vdata_val, buffer_info); case AtomicOp::Xor: - return ir.BufferAtomicXor(handle, address, vdata_val, info); + return ir.BufferAtomicXor(handle, address, vdata_val, buffer_info); case AtomicOp::Inc: - return ir.BufferAtomicInc(handle, address, vdata_val, info); + return ir.BufferAtomicInc(handle, address, vdata_val, buffer_info); case AtomicOp::Dec: - return ir.BufferAtomicDec(handle, address, vdata_val, info); + return ir.BufferAtomicDec(handle, address, vdata_val, buffer_info); default: UNREACHABLE(); } diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp index fcf2f7d9f..26d819d8e 100644 --- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp @@ -222,9 +222,15 @@ void FoldMul(IR::Block& block, IR::Inst& inst) { return; } const IR::Value rhs{inst.Arg(1)}; - if (rhs.IsImmediate() && Arg(rhs) == 0) { - inst.ReplaceUsesWithAndRemove(IR::Value(0u)); - return; + if (rhs.IsImmediate()) { + if (Arg(rhs) == 0) { + inst.ReplaceUsesWithAndRemove(IR::Value(0u)); + return; + } + if (Arg(rhs) == 1) { + inst.ReplaceUsesWithAndRemove(inst.Arg(0)); + return; + } } } diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index a132cac2c..d94c5223a 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -484,55 +484,73 @@ void PatchDataRingAccess(IR::Block& block, IR::Inst& inst, Info& info, Descripto inst.SetArg(1, ir.Imm32(binding)); } +IR::U32 CalculateBufferAddress(IR::IREmitter& ir, const IR::Inst& inst, const Info& info, + const AmdGpu::Buffer& buffer, u32 stride) { + const auto inst_info = inst.Flags(); + + // index = (inst_idxen ? vgpr_index : 0) + (const_add_tid_enable ? thread_id[5:0] : 0) + IR::U32 index = ir.Imm32(0U); + if (inst_info.index_enable) { + const IR::U32 vgpr_index{inst_info.offset_enable + ? IR::U32{ir.CompositeExtract(inst.Arg(1), 0)} + : IR::U32{inst.Arg(1)}}; + index = ir.IAdd(index, vgpr_index); + } + if (buffer.add_tid_enable) { + ASSERT_MSG(info.l_stage == LogicalStage::Compute, + "Thread ID buffer addressing is not supported outside of compute."); + const IR::U32 thread_id{ir.LaneId()}; + index = ir.IAdd(index, thread_id); + } + // offset = (inst_offen ? vgpr_offset : 0) + inst_offset + IR::U32 offset = ir.Imm32(inst_info.inst_offset.Value()); + if (inst_info.offset_enable) { + const IR::U32 vgpr_offset = inst_info.index_enable + ? IR::U32{ir.CompositeExtract(inst.Arg(1), 1)} + : IR::U32{inst.Arg(1)}; + offset = ir.IAdd(offset, vgpr_offset); + } + const IR::U32 const_stride = ir.Imm32(stride); + IR::U32 buffer_offset; + if (buffer.swizzle_enable) { + const IR::U32 const_index_stride = ir.Imm32(buffer.GetIndexStride()); + const IR::U32 const_element_size = ir.Imm32(buffer.GetElementSize()); + // index_msb = index / const_index_stride + const IR::U32 index_msb{ir.IDiv(index, const_index_stride)}; + // index_lsb = index % const_index_stride + const IR::U32 index_lsb{ir.IMod(index, const_index_stride)}; + // offset_msb = offset / const_element_size + const IR::U32 offset_msb{ir.IDiv(offset, const_element_size)}; + // offset_lsb = offset % const_element_size + const IR::U32 offset_lsb{ir.IMod(offset, const_element_size)}; + // buffer_offset = + // (index_msb * const_stride + offset_msb * const_element_size) * const_index_stride + // + index_lsb * const_element_size + offset_lsb + const IR::U32 buffer_offset_msb = ir.IMul( + ir.IAdd(ir.IMul(index_msb, const_stride), ir.IMul(offset_msb, const_element_size)), + const_index_stride); + const IR::U32 buffer_offset_lsb = + ir.IAdd(ir.IMul(index_lsb, const_element_size), offset_lsb); + buffer_offset = ir.IAdd(buffer_offset_msb, buffer_offset_lsb); + } else { + // buffer_offset = index * const_stride + offset + buffer_offset = ir.IAdd(ir.IMul(index, const_stride), offset); + } + return buffer_offset; +} + void PatchBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { const auto handle = inst.Arg(0); const auto buffer_res = info.buffers[handle.U32()]; const auto buffer = buffer_res.GetSharp(info); - ASSERT(!buffer.add_tid_enable); - // Address of constant buffer reads can be calculated at IR emission time. if (inst.GetOpcode() == IR::Opcode::ReadConstBuffer) { return; } IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - const auto inst_info = inst.Flags(); - - const IR::U32 index_stride = ir.Imm32(buffer.index_stride); - const IR::U32 element_size = ir.Imm32(buffer.element_size); - - // Compute address of the buffer using the stride. - IR::U32 address = ir.Imm32(inst_info.inst_offset.Value()); - if (inst_info.index_enable) { - const IR::U32 index = inst_info.offset_enable ? IR::U32{ir.CompositeExtract(inst.Arg(1), 0)} - : IR::U32{inst.Arg(1)}; - if (buffer.swizzle_enable) { - const IR::U32 stride_index_stride = - ir.Imm32(static_cast(buffer.stride * buffer.index_stride)); - const IR::U32 index_msb = ir.IDiv(index, index_stride); - const IR::U32 index_lsb = ir.IMod(index, index_stride); - address = ir.IAdd(address, ir.IAdd(ir.IMul(index_msb, stride_index_stride), - ir.IMul(index_lsb, element_size))); - } else { - address = ir.IAdd(address, ir.IMul(index, ir.Imm32(buffer.GetStride()))); - } - } - if (inst_info.offset_enable) { - const IR::U32 offset = inst_info.index_enable ? IR::U32{ir.CompositeExtract(inst.Arg(1), 1)} - : IR::U32{inst.Arg(1)}; - if (buffer.swizzle_enable) { - const IR::U32 element_size_index_stride = - ir.Imm32(buffer.element_size * buffer.index_stride); - const IR::U32 offset_msb = ir.IDiv(offset, element_size); - const IR::U32 offset_lsb = ir.IMod(offset, element_size); - address = ir.IAdd(address, - ir.IAdd(ir.IMul(offset_msb, element_size_index_stride), offset_lsb)); - } else { - address = ir.IAdd(address, offset); - } - } - inst.SetArg(1, address); + inst.SetArg(1, CalculateBufferAddress(ir, inst, info, buffer, buffer.stride)); } void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { @@ -540,8 +558,15 @@ void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { const auto buffer_res = info.texture_buffers[handle.U32()]; const auto buffer = buffer_res.GetSharp(info); - ASSERT(!buffer.swizzle_enable && !buffer.add_tid_enable); + // Only linear addressing with index is supported currently, since we cannot yet + // address with sub-texel granularity. + const auto inst_info = inst.Flags(); + ASSERT_MSG(!buffer.swizzle_enable && !inst_info.offset_enable && inst_info.inst_offset == 0, + "Unsupported texture buffer address mode."); + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + // Stride of 1 to get an index into formatted data. See above addressing limitations. + inst.SetArg(1, CalculateBufferAddress(ir, inst, info, buffer, 1U)); if (inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32) { const auto swizzled = ApplySwizzle(ir, inst.Arg(2), buffer.DstSelect()); diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index 18b1df1f9..523e63497 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -21,10 +21,16 @@ struct VsAttribSpecialization { struct BufferSpecialization { u16 stride : 14; u16 is_storage : 1; + u16 swizzle_enable : 1; + u8 index_stride : 2 = 0; + u8 element_size : 2 = 0; u32 size = 0; bool operator==(const BufferSpecialization& other) const { return stride == other.stride && is_storage == other.is_storage && + swizzle_enable == other.swizzle_enable && + (!swizzle_enable || + (index_stride == other.index_stride && element_size == other.element_size)) && (size >= other.is_storage || is_storage); } }; @@ -101,6 +107,11 @@ struct StageSpecialization { [](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { spec.stride = sharp.GetStride(); spec.is_storage = desc.IsStorage(sharp); + spec.swizzle_enable = sharp.swizzle_enable; + if (spec.swizzle_enable) { + spec.index_stride = sharp.index_stride; + spec.element_size = sharp.element_size; + } if (!spec.is_storage) { spec.size = sharp.GetSize(); } diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index 75b8b2acf..fa8edb3e2 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -76,6 +76,16 @@ struct Buffer { u32 GetSize() const noexcept { return stride == 0 ? num_records : (stride * num_records); } + + u32 GetIndexStride() const noexcept { + // Index stride is 2 bits, meaning 8, 16, 32, or 64. + return 8 << index_stride; + } + + u32 GetElementSize() const noexcept { + // Element size is 2 bits, meaning 2, 4, 8, or 16. + return 2 << element_size; + } }; static_assert(sizeof(Buffer) == 16); // 128bits From c13b29662e23220ff88811173da13463deb1392e Mon Sep 17 00:00:00 2001 From: baggins183 Date: Fri, 17 Jan 2025 00:14:54 -0800 Subject: [PATCH 076/455] handle control point strides that arent a multiple of 16 (#2172) --- .../backend/spirv/spirv_emit_context.cpp | 12 +++++------ .../ir/passes/hull_shader_transform.cpp | 21 +++++++++---------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 7e86dfb4b..7d492a384 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -395,7 +395,7 @@ void EmitContext::DefineInputs() { DefineVariable(U32[1], spv::BuiltIn::PatchVertices, spv::StorageClass::Input); primitive_id = DefineVariable(U32[1], spv::BuiltIn::PrimitiveId, spv::StorageClass::Input); - const u32 num_attrs = runtime_info.hs_info.ls_stride >> 4; + const u32 num_attrs = Common::AlignUp(runtime_info.hs_info.ls_stride, 16) >> 4; if (num_attrs > 0) { const Id per_vertex_type{TypeArray(F32[4], ConstU32(num_attrs))}; // The input vertex count isn't statically known, so make length 32 (what glslang does) @@ -409,7 +409,7 @@ void EmitContext::DefineInputs() { tess_coord = DefineInput(F32[3], std::nullopt, spv::BuiltIn::TessCoord); primitive_id = DefineVariable(U32[1], spv::BuiltIn::PrimitiveId, spv::StorageClass::Input); - const u32 num_attrs = runtime_info.vs_info.hs_output_cp_stride >> 4; + const u32 num_attrs = Common::AlignUp(runtime_info.vs_info.hs_output_cp_stride, 16) >> 4; if (num_attrs > 0) { const Id per_vertex_type{TypeArray(F32[4], ConstU32(num_attrs))}; // The input vertex count isn't statically known, so make length 32 (what glslang does) @@ -418,7 +418,7 @@ void EmitContext::DefineInputs() { Name(input_attr_array, "in_attrs"); } - u32 patch_base_location = runtime_info.vs_info.hs_output_cp_stride >> 4; + const u32 patch_base_location = num_attrs; for (size_t index = 0; index < 30; ++index) { if (!(info.uses_patches & (1U << index))) { continue; @@ -453,7 +453,7 @@ void EmitContext::DefineOutputs() { DefineVariable(type, spv::BuiltIn::CullDistance, spv::StorageClass::Output); } if (stage == Shader::Stage::Local && runtime_info.ls_info.links_with_tcs) { - const u32 num_attrs = runtime_info.ls_info.ls_stride >> 4; + const u32 num_attrs = Common::AlignUp(runtime_info.ls_info.ls_stride, 16) >> 4; if (num_attrs > 0) { const Id type{TypeArray(F32[4], ConstU32(num_attrs))}; output_attr_array = DefineOutput(type, 0); @@ -488,7 +488,7 @@ void EmitContext::DefineOutputs() { Decorate(output_tess_level_inner, spv::Decoration::Patch); } - const u32 num_attrs = runtime_info.hs_info.hs_output_cp_stride >> 4; + const u32 num_attrs = Common::AlignUp(runtime_info.hs_info.hs_output_cp_stride, 16) >> 4; if (num_attrs > 0) { const Id per_vertex_type{TypeArray(F32[4], ConstU32(num_attrs))}; // The input vertex count isn't statically known, so make length 32 (what glslang does) @@ -498,7 +498,7 @@ void EmitContext::DefineOutputs() { Name(output_attr_array, "out_attrs"); } - u32 patch_base_location = runtime_info.hs_info.hs_output_cp_stride >> 4; + const u32 patch_base_location = num_attrs; for (size_t index = 0; index < 30; ++index) { if (!(info.uses_patches & (1U << index))) { continue; diff --git a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp index 6164fec12..b41e38339 100644 --- a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp +++ b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp @@ -349,11 +349,11 @@ static IR::F32 ReadTessControlPointAttribute(IR::U32 addr, const u32 stride, IR: addr = ir.IAdd(addr, ir.Imm32(off_dw)); } const IR::U32 control_point_index = ir.IDiv(addr, ir.Imm32(stride)); - const IR::U32 addr_for_attrs = TryOptimizeAddressModulo(addr, stride, ir); - const IR::U32 attr_index = - ir.ShiftRightLogical(ir.IMod(addr_for_attrs, ir.Imm32(stride)), ir.Imm32(4u)); + const IR::U32 opt_addr = TryOptimizeAddressModulo(addr, stride, ir); + const IR::U32 offset = ir.IMod(opt_addr, ir.Imm32(stride)); + const IR::U32 attr_index = ir.ShiftRightLogical(offset, ir.Imm32(4u)); const IR::U32 comp_index = - ir.ShiftRightLogical(ir.BitwiseAnd(addr_for_attrs, ir.Imm32(0xFU)), ir.Imm32(2u)); + ir.ShiftRightLogical(ir.BitwiseAnd(offset, ir.Imm32(0xFU)), ir.Imm32(2u)); if (is_output_read_in_tcs) { return ir.ReadTcsGenericOuputAttribute(control_point_index, attr_index, comp_index); } else { @@ -452,13 +452,13 @@ void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info) { if (off_dw > 0) { addr = ir.IAdd(addr, ir.Imm32(off_dw)); } - u32 stride = runtime_info.hs_info.hs_output_cp_stride; + const u32 stride = runtime_info.hs_info.hs_output_cp_stride; // Invocation ID array index is implicit, handled by SPIRV backend - const IR::U32 addr_for_attrs = TryOptimizeAddressModulo(addr, stride, ir); - const IR::U32 attr_index = ir.ShiftRightLogical( - ir.IMod(addr_for_attrs, ir.Imm32(stride)), ir.Imm32(4u)); + const IR::U32 opt_addr = TryOptimizeAddressModulo(addr, stride, ir); + const IR::U32 offset = ir.IMod(opt_addr, ir.Imm32(stride)); + const IR::U32 attr_index = ir.ShiftRightLogical(offset, ir.Imm32(4u)); const IR::U32 comp_index = ir.ShiftRightLogical( - ir.BitwiseAnd(addr_for_attrs, ir.Imm32(0xFU)), ir.Imm32(2u)); + ir.BitwiseAnd(offset, ir.Imm32(0xFU)), ir.Imm32(2u)); ir.SetTcsGenericAttribute(data_component, attr_index, comp_index); } else { ASSERT(output_kind == AttributeRegion::PatchConst); @@ -535,8 +535,7 @@ void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info) { // ... IR::IREmitter ir{*entry_block, it}; - ASSERT(runtime_info.hs_info.ls_stride % 16 == 0); - u32 num_attributes = runtime_info.hs_info.ls_stride / 16; + u32 num_attributes = Common::AlignUp(runtime_info.hs_info.ls_stride, 16) >> 4; const auto invocation_id = ir.GetAttributeU32(IR::Attribute::InvocationId); for (u32 attr_no = 0; attr_no < num_attributes; attr_no++) { for (u32 comp = 0; comp < 4; comp++) { From 1e5b316ac4f7b4e4a5f9d521812b425dc0f0b94f Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:15:43 -0800 Subject: [PATCH 077/455] renderer_vulkan: Add debug markers for presenter. (#2167) --- .../renderer_vulkan/vk_presenter.cpp | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 4d76eb8db..95c7c4ea1 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -468,6 +468,12 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { draw_scheduler.EndRendering(); const auto cmdbuf = draw_scheduler.CommandBuffer(); + if (Config::vkHostMarkersEnabled()) { + cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ + .pLabelName = "ShowSplash", + }); + } + if (!frame) { if (!splash_img.has_value()) { VideoCore::ImageInfo info{}; @@ -535,6 +541,10 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { .pImageMemoryBarriers = &post_barrier, }); + if (Config::vkHostMarkersEnabled()) { + cmdbuf.endDebugUtilsLabelEXT(); + } + // Flush frame creation commands. frame->ready_semaphore = draw_scheduler.GetMasterSemaphore()->Handle(); frame->ready_tick = draw_scheduler.CurrentTick(); @@ -563,6 +573,12 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) auto& scheduler = is_eop ? draw_scheduler : flip_scheduler; scheduler.EndRendering(); const auto cmdbuf = scheduler.CommandBuffer(); + if (Config::vkHostMarkersEnabled()) { + const auto label = fmt::format("PrepareFrameInternal:{}", image_id.index); + cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ + .pLabelName = label.c_str(), + }); + } const auto frame_subresources = vk::ImageSubresourceRange{ .aspectMask = vk::ImageAspectFlagBits::eColor, @@ -677,6 +693,10 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) .pImageMemoryBarriers = &post_barrier, }); + if (Config::vkHostMarkersEnabled()) { + cmdbuf.endDebugUtilsLabelEXT(); + } + // Flush frame creation commands. frame->ready_semaphore = scheduler.GetMasterSemaphore()->Handle(); frame->ready_tick = scheduler.CurrentTick(); @@ -724,6 +744,12 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { auto& scheduler = present_scheduler; const auto cmdbuf = scheduler.CommandBuffer(); + if (Config::vkHostMarkersEnabled()) { + cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ + .pLabelName = "Present", + }); + } + { auto* profiler_ctx = instance.GetProfilerContext(); TracyVkNamedZoneC(profiler_ctx, renderer_gpu_zone, cmdbuf, "Host frame", @@ -816,6 +842,10 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { } } + if (Config::vkHostMarkersEnabled()) { + cmdbuf.endDebugUtilsLabelEXT(); + } + // Flush vulkan commands. SubmitInfo info{}; info.AddWait(swapchain.GetImageAcquiredSemaphore()); From 1d3427780a118532d6c74788f4bc7f8fc78d12f4 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:16:03 -0800 Subject: [PATCH 078/455] renderer_vulkan: Fix present related validation errors. (#2169) --- src/imgui/renderer/imgui_impl_vulkan.cpp | 5 +---- src/imgui/renderer/imgui_impl_vulkan.h | 1 - src/video_core/renderer_vulkan/vk_instance.cpp | 2 +- src/video_core/renderer_vulkan/vk_presenter.cpp | 10 ++++++++-- src/video_core/renderer_vulkan/vk_swapchain.cpp | 14 +++++++++++++- src/video_core/renderer_vulkan/vk_swapchain.h | 5 +++++ 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/imgui/renderer/imgui_impl_vulkan.cpp b/src/imgui/renderer/imgui_impl_vulkan.cpp index bd98fa004..104ce4b52 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.cpp +++ b/src/imgui/renderer/imgui_impl_vulkan.cpp @@ -687,8 +687,6 @@ void RenderDrawData(ImDrawData& draw_data, vk::CommandBuffer command_buffer, vk::DescriptorSet desc_set[1]{pcmd->TextureId->descriptor_set}; command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, bd->pipeline_layout, 0, {desc_set}, {}); - command_buffer.setColorBlendEnableEXT( - 0, {pcmd->TextureId->disable_blend ? vk::False : vk::True}); // Draw command_buffer.drawIndexed(pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, @@ -1058,10 +1056,9 @@ static void CreatePipeline(vk::Device device, const vk::AllocationCallbacks* all .pAttachments = color_attachment, }; - vk::DynamicState dynamic_states[3]{ + vk::DynamicState dynamic_states[2]{ vk::DynamicState::eViewport, vk::DynamicState::eScissor, - vk::DynamicState::eColorBlendEnableEXT, }; vk::PipelineDynamicStateCreateInfo dynamic_state{ .dynamicStateCount = (uint32_t)IM_ARRAYSIZE(dynamic_states), diff --git a/src/imgui/renderer/imgui_impl_vulkan.h b/src/imgui/renderer/imgui_impl_vulkan.h index 05f4489da..9b15dcae6 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.h +++ b/src/imgui/renderer/imgui_impl_vulkan.h @@ -13,7 +13,6 @@ struct ImDrawData; namespace ImGui { struct Texture { vk::DescriptorSet descriptor_set{nullptr}; - bool disable_blend{false}; }; } // namespace ImGui diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 323b30816..1600600b9 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -270,6 +270,7 @@ bool Instance::CreateDevice() { legacy_vertex_attributes = add_extension(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME); image_load_store_lod = add_extension(VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME); amd_gcn_shader = add_extension(VK_AMD_GCN_SHADER_EXTENSION_NAME); + add_extension(VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME); // These extensions are promoted by Vulkan 1.3, but for greater compatibility we use Vulkan 1.2 // with extensions. @@ -383,7 +384,6 @@ bool Instance::CreateDevice() { .extendedDynamicState = true, }, vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT{ - .extendedDynamicState3ColorBlendEnable = true, .extendedDynamicState3ColorWriteMask = true, }, vk::PhysicalDeviceDepthClipControlFeaturesEXT{ diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 95c7c4ea1..0f45574bc 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -380,7 +380,7 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { const vk::ImageViewCreateInfo view_info = { .image = frame->image, .viewType = vk::ImageViewType::e2D, - .format = FormatToUnorm(format), + .format = swapchain.GetViewFormat(), .subresourceRange{ .aspectMask = vk::ImageAspectFlagBits::eColor, .baseMipLevel = 0, @@ -397,7 +397,6 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { frame->height = height; frame->imgui_texture = ImGui::Vulkan::AddTexture(view, vk::ImageLayout::eShaderReadOnlyOptimal); - frame->imgui_texture->disable_blend = true; } Frame* Presenter::PrepareLastFrame() { @@ -615,6 +614,13 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) VideoCore::ImageViewInfo info{}; info.format = image.info.pixel_format; + // Exclude alpha from output frame to avoid blending with UI. + info.mapping = vk::ComponentMapping{ + .r = vk::ComponentSwizzle::eIdentity, + .g = vk::ComponentSwizzle::eIdentity, + .b = vk::ComponentSwizzle::eIdentity, + .a = vk::ComponentSwizzle::eOne, + }; if (auto view = image.FindView(info)) { image_info.imageView = *texture_cache.GetImageView(view).image_view; } else { diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 556cccd32..438fe30ce 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -17,7 +17,7 @@ Swapchain::Swapchain(const Instance& instance_, const Frontend::WindowSDL& windo FindPresentFormat(); Create(window.GetWidth(), window.GetHeight()); - ImGui::Core::Initialize(instance, window, image_count, surface_format.format); + ImGui::Core::Initialize(instance, window, image_count, view_format); } Swapchain::~Swapchain() { @@ -57,7 +57,17 @@ void Swapchain::Create(u32 width_, u32 height_) { const u32 queue_family_indices_count = exclusive ? 1u : 2u; const vk::SharingMode sharing_mode = exclusive ? vk::SharingMode::eExclusive : vk::SharingMode::eConcurrent; + const vk::Format view_formats[2] = { + surface_format.format, + view_format, + }; + const vk::ImageFormatListCreateInfo format_list = { + .viewFormatCount = 2, + .pViewFormats = view_formats, + }; const vk::SwapchainCreateInfoKHR swapchain_info = { + .pNext = &format_list, + .flags = vk::SwapchainCreateFlagBitsKHR::eMutableFormat, .surface = surface, .minImageCount = image_count, .imageFormat = surface_format.format, @@ -149,6 +159,7 @@ void Swapchain::FindPresentFormat() { if (formats[0].format == vk::Format::eUndefined) { surface_format.format = vk::Format::eR8G8B8A8Srgb; surface_format.colorSpace = vk::ColorSpaceKHR::eSrgbNonlinear; + view_format = FormatToUnorm(surface_format.format); return; } @@ -161,6 +172,7 @@ void Swapchain::FindPresentFormat() { surface_format.format = format; surface_format.colorSpace = sformat.colorSpace; + view_format = FormatToUnorm(surface_format.format); return; } diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index 192271f32..9da75c758 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -61,6 +61,10 @@ public: return surface_format; } + vk::Format GetViewFormat() const { + return view_format; + } + vk::SwapchainKHR GetHandle() const { return swapchain; } @@ -114,6 +118,7 @@ private: vk::SwapchainKHR swapchain{}; vk::SurfaceKHR surface{}; vk::SurfaceFormatKHR surface_format; + vk::Format view_format; vk::Extent2D extent; vk::SurfaceTransformFlagBitsKHR transform; vk::CompositeAlphaFlagBitsKHR composite_alpha; From 9e5b50c86681053aa05a798663c6eaac6581cd46 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:16:15 -0800 Subject: [PATCH 079/455] vk_platform: Clean up unnecessary debug message filters. (#2171) --- src/video_core/renderer_vulkan/vk_platform.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index 7f0bcb5d2..fdd590e9d 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -31,17 +31,6 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL DebugUtilsCallback( VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT type, const VkDebugUtilsMessengerCallbackDataEXT* callback_data, void* user_data) { - switch (static_cast(callback_data->messageIdNumber)) { - case 0x609a13b: // Vertex attribute at location not consumed by shader - case 0xc81ad50e: - case 0xb7c39078: - case 0x32868fde: // vkCreateBufferView(): pCreateInfo->range does not equal VK_WHOLE_SIZE - case 0x1012616b: // `VK_FORMAT_UNDEFINED` does not match fragment shader output type - return VK_FALSE; - default: - break; - } - Common::Log::Level level{}; switch (severity) { case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: From 0cee59cbe6b7ab2471484234e5e7f98c0f6c55e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pl=C3=ADnio=20Larrubia?= Date: Fri, 17 Jan 2025 11:56:52 -0300 Subject: [PATCH 080/455] ci: Don't use the same cache for clang and gcc on linux (#2173) --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c36c026fc..3da7163dd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -390,7 +390,7 @@ jobs: - name: Cache CMake Configuration uses: actions/cache@v4 env: - cache-name: ${{ runner.os }}-sdl-cache-cmake-configuration + cache-name: ${{ runner.os }}-sdl-gcc-cache-cmake-configuration with: path: | ${{github.workspace}}/build @@ -401,7 +401,7 @@ jobs: - name: Cache CMake Build uses: hendrikmuhs/ccache-action@v1.2.14 env: - cache-name: ${{ runner.os }}-sdl-cache-cmake-build + cache-name: ${{ runner.os }}-sdl-gcc-cache-cmake-build with: append-timestamp: false key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} @@ -426,7 +426,7 @@ jobs: - name: Cache CMake Configuration uses: actions/cache@v4 env: - cache-name: ${{ runner.os }}-qt-cache-cmake-configuration + cache-name: ${{ runner.os }}-qt-gcc-cache-cmake-configuration with: path: | ${{github.workspace}}/build @@ -437,7 +437,7 @@ jobs: - name: Cache CMake Build uses: hendrikmuhs/ccache-action@v1.2.14 env: - cache-name: ${{ runner.os }}-qt-cache-cmake-build + cache-name: ${{ runner.os }}-qt-gcc-cache-cmake-build with: append-timestamp: false key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} From 4e8c178aecc2d968095a8cc3d88f4290b29b0ed3 Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Fri, 17 Jan 2025 16:11:37 -0300 Subject: [PATCH 081/455] imgui: central node auto-hide tab (#2174) --- src/imgui/renderer/imgui_core.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index f3e4609ba..26253822c 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -186,7 +186,8 @@ ImGuiID NewFrame(bool is_reusing_frame) { Sdl::NewFrame(is_reusing_frame); ImGui::NewFrame(); - ImGuiWindowFlags flags = ImGuiDockNodeFlags_PassthruCentralNode; + ImGuiWindowFlags flags = + ImGuiDockNodeFlags_PassthruCentralNode | ImGuiDockNodeFlags_AutoHideTabBar; if (!DebugState.IsShowingDebugMenuBar()) { flags |= ImGuiDockNodeFlags_NoTabBar; } From 99a04357d139461e741c2003733e74af3ede6747 Mon Sep 17 00:00:00 2001 From: polybiusproxy <47796739+polybiusproxy@users.noreply.github.com> Date: Fri, 17 Jan 2025 21:51:33 +0100 Subject: [PATCH 082/455] don't compile cs with higher shared memory than supported (#2175) --- src/shader_recompiler/backend/spirv/spirv_emit_context.cpp | 4 ++++ src/shader_recompiler/runtime_info.h | 1 + src/video_core/renderer_vulkan/vk_instance.h | 5 +++++ src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 1 + 4 files changed, 11 insertions(+) diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 7d492a384..295bef75d 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -847,6 +847,10 @@ void EmitContext::DefineSharedMemory() { if (shared_memory_size == 0) { shared_memory_size = DefaultSharedMemSize; } + + const u32 max_shared_memory_size = runtime_info.cs_info.max_shared_memory_size; + ASSERT(shared_memory_size <= max_shared_memory_size); + const u32 num_elements{Common::DivCeil(shared_memory_size, 4U)}; const Id type{TypeArray(U32[1], ConstU32(num_elements))}; shared_memory_u32_type = TypePointer(spv::StorageClass::Workgroup, type); diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index cf49b0879..8a5e0a1a6 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -198,6 +198,7 @@ struct FragmentRuntimeInfo { struct ComputeRuntimeInfo { u32 shared_memory_size; + u32 max_shared_memory_size; std::array workgroup_size; std::array tgid_enable; diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index e0d4d0b4d..1b0c276dc 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -239,6 +239,11 @@ public: return subgroup_size; } + /// Returns the maximum size of compute shared memory. + u32 MaxComputeSharedMemorySize() const { + return properties.limits.maxComputeSharedMemorySize; + } + /// Returns the maximum supported elements in a texel buffer u32 MaxTexelBufferElements() const { return properties.limits.maxTexelBufferElements; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index f93494389..86f6dcc7a 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -183,6 +183,7 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS info.cs_info.tgid_enable = {cs_pgm.IsTgidEnabled(0), cs_pgm.IsTgidEnabled(1), cs_pgm.IsTgidEnabled(2)}; info.cs_info.shared_memory_size = cs_pgm.SharedMemSize(); + info.cs_info.max_shared_memory_size = instance.MaxComputeSharedMemorySize(); break; } default: From e134fc5f1e0492102f75e30aa3cefd512128c59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Sat, 18 Jan 2025 07:09:10 +0100 Subject: [PATCH 083/455] Qt: Open shadPS4 Folder (#2107) * Qt: Open shadPS4 Folder * clang-format * Change order * Update pt_BR.ts --- src/qt_gui/main_window.cpp | 7 +++++++ src/qt_gui/main_window_ui.h | 8 ++++++++ src/qt_gui/translations/ar.ts | 4 ++++ src/qt_gui/translations/da_DK.ts | 4 ++++ src/qt_gui/translations/de.ts | 4 ++++ src/qt_gui/translations/el.ts | 4 ++++ src/qt_gui/translations/en.ts | 4 ++++ src/qt_gui/translations/es_ES.ts | 4 ++++ src/qt_gui/translations/fa_IR.ts | 4 ++++ src/qt_gui/translations/fi.ts | 4 ++++ src/qt_gui/translations/fr.ts | 4 ++++ src/qt_gui/translations/hu_HU.ts | 4 ++++ src/qt_gui/translations/id.ts | 4 ++++ src/qt_gui/translations/it.ts | 4 ++++ src/qt_gui/translations/ja_JP.ts | 4 ++++ src/qt_gui/translations/ko_KR.ts | 4 ++++ src/qt_gui/translations/lt_LT.ts | 4 ++++ src/qt_gui/translations/nb.ts | 4 ++++ src/qt_gui/translations/nl.ts | 4 ++++ src/qt_gui/translations/pl_PL.ts | 4 ++++ src/qt_gui/translations/pt_BR.ts | 6 +++++- src/qt_gui/translations/ro_RO.ts | 4 ++++ src/qt_gui/translations/ru_RU.ts | 4 ++++ src/qt_gui/translations/sq.ts | 4 ++++ src/qt_gui/translations/sv.ts | 4 ++++ src/qt_gui/translations/tr_TR.ts | 4 ++++ src/qt_gui/translations/uk_UA.ts | 4 ++++ src/qt_gui/translations/vi_VN.ts | 4 ++++ src/qt_gui/translations/zh_CN.ts | 4 ++++ src/qt_gui/translations/zh_TW.ts | 4 ++++ 30 files changed, 128 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index bd3c27809..3ee392613 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -247,6 +247,12 @@ void MainWindow::CreateConnects() { } }); + connect(ui->shadFolderAct, &QAction::triggered, this, [this]() { + QString userPath; + Common::FS::PathToQString(userPath, Common::FS::GetUserPath(Common::FS::PathType::UserDir)); + QDesktopServices::openUrl(QUrl::fromLocalFile(userPath)); + }); + connect(ui->playButton, &QPushButton::clicked, this, &MainWindow::StartGame); connect(m_game_grid_frame.get(), &QTableWidget::cellDoubleClicked, this, &MainWindow::StartGame); @@ -982,6 +988,7 @@ QIcon MainWindow::RecolorIcon(const QIcon& icon, bool isWhite) { void MainWindow::SetUiIcons(bool isWhite) { ui->bootInstallPkgAct->setIcon(RecolorIcon(ui->bootInstallPkgAct->icon(), isWhite)); ui->bootGameAct->setIcon(RecolorIcon(ui->bootGameAct->icon(), isWhite)); + ui->shadFolderAct->setIcon(RecolorIcon(ui->shadFolderAct->icon(), isWhite)); ui->exitAct->setIcon(RecolorIcon(ui->exitAct->icon(), isWhite)); #ifdef ENABLE_UPDATER ui->updaterAct->setIcon(RecolorIcon(ui->updaterAct->icon(), isWhite)); diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 0d5038d7e..7de166121 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -12,6 +12,7 @@ public: QAction* bootInstallPkgAct; QAction* bootGameAct; QAction* addElfFolderAct; + QAction* shadFolderAct; QAction* exitAct; QAction* showGameListAct; QAction* refreshGameListAct; @@ -89,6 +90,9 @@ public: addElfFolderAct = new QAction(MainWindow); addElfFolderAct->setObjectName("addElfFolderAct"); addElfFolderAct->setIcon(QIcon(":images/folder_icon.png")); + shadFolderAct = new QAction(MainWindow); + shadFolderAct->setObjectName("shadFolderAct"); + shadFolderAct->setIcon(QIcon(":images/folder_icon.png")); exitAct = new QAction(MainWindow); exitAct->setObjectName("exitAct"); exitAct->setIcon(QIcon(":images/exit_icon.png")); @@ -274,7 +278,9 @@ public: menuBar->addAction(menuHelp->menuAction()); menuFile->addAction(bootInstallPkgAct); menuFile->addAction(bootGameAct); + menuFile->addSeparator(); menuFile->addAction(addElfFolderAct); + menuFile->addAction(shadFolderAct); menuFile->addSeparator(); menuFile->addAction(menuRecent->menuAction()); menuFile->addSeparator(); @@ -333,6 +339,8 @@ public: "MainWindow", "Install application from a .pkg file", nullptr)); #endif // QT_CONFIG(tooltip) menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr)); + shadFolderAct->setText( + QCoreApplication::translate("MainWindow", "Open shadPS4 Folder", nullptr)); exitAct->setText(QCoreApplication::translate("MainWindow", "Exit", nullptr)); #if QT_CONFIG(tooltip) exitAct->setToolTip(QCoreApplication::translate("MainWindow", "Exit shadPS4", nullptr)); diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index a4dadcb1a..47bd673b2 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -247,6 +247,10 @@ Recent Games الألعاب الأخيرة + + Open shadPS4 Folder + Open shadPS4 Folder + Exit خروج diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 70b7d3ecc..91a98abd4 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 7f1de3afd..b1e1d2664 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -247,6 +247,10 @@ Recent Games Zuletzt gespielt + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Beenden diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 84165536e..ecda0ede0 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index fad185d41..9127df7e3 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index a97d3d3c8..a47f7c577 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -247,6 +247,10 @@ Recent Games Juegos recientes + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Salir diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 697e615fb..976e7614e 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -247,6 +247,10 @@ Recent Games بازی های اخیر + + Open shadPS4 Folder + Open shadPS4 Folder + Exit خروج diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 51e85dfbb..abc091b7e 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -247,6 +247,10 @@ Recent Games Viimeisimmät Pelit + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Sulje diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 35f3eb55f..d2a1c5307 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -247,6 +247,10 @@ Recent Games Jeux récents + + Open shadPS4 Folder + Ouvrir le dossier de shadPS4 + Exit Fermer diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index a2bd9c1da..dff6a3a18 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -247,6 +247,10 @@ Recent Games Legutóbbi Játékok + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Kilépés diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index b97914ca2..e6fb8b5aa 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index d4ea1c7e6..73dbdc603 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -247,6 +247,10 @@ Recent Games Giochi Recenti + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Uscita diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 359955765..e07d4eb25 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -247,6 +247,10 @@ Recent Games 最近のゲーム + + Open shadPS4 Folder + Open shadPS4 Folder + Exit 終了 diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 9cca0b656..560b58340 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 0594bcbd2..e2ec1e5c3 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index 8ca8246ba..b94d29b23 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -247,6 +247,10 @@ Recent Games Nylige spill + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Avslutt diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 12d644458..add27500f 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 782db12e2..3280beea7 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -247,6 +247,10 @@ Recent Games Ostatnie gry + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Wyjdź diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 94bbf028a..b9d889519 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -247,6 +247,10 @@ Recent Games Jogos Recentes + + Open shadPS4 Folder + Abrir pasta shadPS4 + Exit Sair @@ -1341,4 +1345,4 @@ TB - \ No newline at end of file + diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 3bd8e38b5..00a9eb179 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index a38e2fd98..4c90450dd 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -247,6 +247,10 @@ Recent Games Недавние игры + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Выход diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index a83dc9829..768db1e75 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -247,6 +247,10 @@ Recent Games Lojërat e fundit + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Dil diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 9a244a9df..3781ba45c 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -722,6 +722,10 @@ Recent Games Senaste spel + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Avsluta diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index be50f935a..5e8499073 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -247,6 +247,10 @@ Recent Games Son Oyunlar + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Çıkış diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index ff4e48e80..a1c7e97e0 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -247,6 +247,10 @@ Recent Games Нещодавні ігри + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Вихід diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index e546d955c..a579a1983 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index ece5f9490..5450f3dfd 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -247,6 +247,10 @@ Recent Games 最近启动的游戏 + + Open shadPS4 Folder + Open shadPS4 Folder + Exit 退出 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 11642d52b..0ce0b4d69 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -247,6 +247,10 @@ Recent Games Recent Games + + Open shadPS4 Folder + Open shadPS4 Folder + Exit Exit From a5440e0e43f1d91fff0b23e0c0ba4103d5e8976e Mon Sep 17 00:00:00 2001 From: Ian Maclachlan <32774670+imaclachlan@users.noreply.github.com> Date: Sat, 18 Jan 2025 06:16:07 +0000 Subject: [PATCH 084/455] Update kernel.cpp (#2125) In kernel.cpp boost io_context.reset() deprecated/discontinued in latest versions. Changed to io_context.restart() as recommended. --- src/core/libraries/kernel/kernel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/kernel.cpp b/src/core/libraries/kernel/kernel.cpp index a9d04ca38..2b7735219 100644 --- a/src/core/libraries/kernel/kernel.cpp +++ b/src/core/libraries/kernel/kernel.cpp @@ -60,7 +60,7 @@ static void KernelServiceThread(std::stop_token stoken) { } io_context.run(); - io_context.reset(); + io_context.restart(); asio_requests = 0; } From 7b8177f48e3d5dfa12b2d416fdf291572e56b905 Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Sat, 18 Jan 2025 09:20:38 +0300 Subject: [PATCH 085/455] renderer: handle disabled clipping (#2146) Co-authored-by: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> --- .../backend/spirv/emit_spirv_special.cpp | 38 +++++++++++ .../backend/spirv/spirv_emit_context.cpp | 37 ++++++---- src/shader_recompiler/info.h | 8 +++ src/shader_recompiler/profile.h | 2 + src/shader_recompiler/runtime_info.h | 4 +- .../renderer_vulkan/vk_graphics_pipeline.h | 7 +- .../renderer_vulkan/vk_instance.cpp | 6 ++ src/video_core/renderer_vulkan/vk_instance.h | 8 +++ .../renderer_vulkan/vk_pipeline_cache.cpp | 5 ++ .../renderer_vulkan/vk_rasterizer.cpp | 67 ++++++++++++++----- .../renderer_vulkan/vk_rasterizer.h | 2 +- 11 files changed, 149 insertions(+), 35 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp index 4a22ba09f..a0a3ed8ff 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp @@ -24,10 +24,48 @@ void ConvertDepthMode(EmitContext& ctx) { ctx.OpStore(ctx.output_position, vector); } +void ConvertPositionToClipSpace(EmitContext& ctx) { + const Id type{ctx.F32[1]}; + Id position{ctx.OpLoad(ctx.F32[4], ctx.output_position)}; + const Id x{ctx.OpCompositeExtract(type, position, 0u)}; + const Id y{ctx.OpCompositeExtract(type, position, 1u)}; + const Id z{ctx.OpCompositeExtract(type, position, 2u)}; + const Id w{ctx.OpCompositeExtract(type, position, 3u)}; + const Id xoffset_ptr{ctx.OpAccessChain(ctx.TypePointer(spv::StorageClass::PushConstant, type), + ctx.push_data_block, + ctx.ConstU32(PushData::XOffsetIndex))}; + const Id xoffset{ctx.OpLoad(type, xoffset_ptr)}; + const Id yoffset_ptr{ctx.OpAccessChain(ctx.TypePointer(spv::StorageClass::PushConstant, type), + ctx.push_data_block, + ctx.ConstU32(PushData::YOffsetIndex))}; + const Id yoffset{ctx.OpLoad(type, yoffset_ptr)}; + const Id xscale_ptr{ctx.OpAccessChain(ctx.TypePointer(spv::StorageClass::PushConstant, type), + ctx.push_data_block, + ctx.ConstU32(PushData::XScaleIndex))}; + const Id xscale{ctx.OpLoad(type, xscale_ptr)}; + const Id yscale_ptr{ctx.OpAccessChain(ctx.TypePointer(spv::StorageClass::PushConstant, type), + ctx.push_data_block, + ctx.ConstU32(PushData::YScaleIndex))}; + const Id yscale{ctx.OpLoad(type, yscale_ptr)}; + const Id vport_w = + ctx.Constant(type, float(std::min(ctx.profile.max_viewport_width / 2, 8_KB))); + const Id wnd_x = ctx.OpFAdd(type, ctx.OpFMul(type, x, xscale), xoffset); + const Id ndc_x = ctx.OpFSub(type, ctx.OpFDiv(type, wnd_x, vport_w), ctx.Constant(type, 1.f)); + const Id vport_h = + ctx.Constant(type, float(std::min(ctx.profile.max_viewport_height / 2, 8_KB))); + const Id wnd_y = ctx.OpFAdd(type, ctx.OpFMul(type, y, yscale), yoffset); + const Id ndc_y = ctx.OpFSub(type, ctx.OpFDiv(type, wnd_y, vport_h), ctx.Constant(type, 1.f)); + const Id vector{ctx.OpCompositeConstruct(ctx.F32[4], std::array({ndc_x, ndc_y, z, w}))}; + ctx.OpStore(ctx.output_position, vector); +} + void EmitEpilogue(EmitContext& ctx) { if (ctx.stage == Stage::Vertex && ctx.runtime_info.vs_info.emulate_depth_negative_one_to_one) { ConvertDepthMode(ctx); } + if (ctx.stage == Stage::Vertex && ctx.runtime_info.vs_info.clip_disable) { + ConvertPositionToClipSpace(ctx); + } } void EmitDiscard(EmitContext& ctx) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 295bef75d..b0bf5aa0a 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -568,25 +568,34 @@ void EmitContext::DefineOutputs() { void EmitContext::DefinePushDataBlock() { // Create push constants block for instance steps rates - const Id struct_type{Name( - TypeStruct(U32[1], U32[1], U32[4], U32[4], U32[4], U32[4], U32[4], U32[4]), "AuxData")}; + const Id struct_type{Name(TypeStruct(U32[1], U32[1], U32[4], U32[4], U32[4], U32[4], U32[4], + U32[4], F32[1], F32[1], F32[1], F32[1]), + "AuxData")}; Decorate(struct_type, spv::Decoration::Block); MemberName(struct_type, 0, "sr0"); MemberName(struct_type, 1, "sr1"); - MemberName(struct_type, 2, "buf_offsets0"); - MemberName(struct_type, 3, "buf_offsets1"); - MemberName(struct_type, 4, "ud_regs0"); - MemberName(struct_type, 5, "ud_regs1"); - MemberName(struct_type, 6, "ud_regs2"); - MemberName(struct_type, 7, "ud_regs3"); + MemberName(struct_type, Shader::PushData::BufOffsetIndex + 0, "buf_offsets0"); + MemberName(struct_type, Shader::PushData::BufOffsetIndex + 1, "buf_offsets1"); + MemberName(struct_type, Shader::PushData::UdRegsIndex + 0, "ud_regs0"); + MemberName(struct_type, Shader::PushData::UdRegsIndex + 1, "ud_regs1"); + MemberName(struct_type, Shader::PushData::UdRegsIndex + 2, "ud_regs2"); + MemberName(struct_type, Shader::PushData::UdRegsIndex + 3, "ud_regs3"); + MemberName(struct_type, Shader::PushData::XOffsetIndex, "xoffset"); + MemberName(struct_type, Shader::PushData::YOffsetIndex, "yoffset"); + MemberName(struct_type, Shader::PushData::XScaleIndex, "xscale"); + MemberName(struct_type, Shader::PushData::YScaleIndex, "yscale"); MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U); MemberDecorate(struct_type, 1, spv::Decoration::Offset, 4U); - MemberDecorate(struct_type, 2, spv::Decoration::Offset, 8U); - MemberDecorate(struct_type, 3, spv::Decoration::Offset, 24U); - MemberDecorate(struct_type, 4, spv::Decoration::Offset, 40U); - MemberDecorate(struct_type, 5, spv::Decoration::Offset, 56U); - MemberDecorate(struct_type, 6, spv::Decoration::Offset, 72U); - MemberDecorate(struct_type, 7, spv::Decoration::Offset, 88U); + MemberDecorate(struct_type, Shader::PushData::BufOffsetIndex + 0, spv::Decoration::Offset, 8U); + MemberDecorate(struct_type, Shader::PushData::BufOffsetIndex + 1, spv::Decoration::Offset, 24U); + MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 0, spv::Decoration::Offset, 40U); + MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 1, spv::Decoration::Offset, 56U); + MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 2, spv::Decoration::Offset, 72U); + MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 3, spv::Decoration::Offset, 88U); + MemberDecorate(struct_type, Shader::PushData::XOffsetIndex, spv::Decoration::Offset, 104U); + MemberDecorate(struct_type, Shader::PushData::YOffsetIndex, spv::Decoration::Offset, 108U); + MemberDecorate(struct_type, Shader::PushData::XScaleIndex, spv::Decoration::Offset, 112U); + MemberDecorate(struct_type, Shader::PushData::YScaleIndex, spv::Decoration::Offset, 116U); push_data_block = DefineVar(struct_type, spv::StorageClass::PushConstant); Name(push_data_block, "push_data"); interfaces.push_back(push_data_block); diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index aeff346fa..2cde30629 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -96,11 +96,19 @@ using FMaskResourceList = boost::container::small_vector; struct PushData { static constexpr u32 BufOffsetIndex = 2; static constexpr u32 UdRegsIndex = 4; + static constexpr u32 XOffsetIndex = 8; + static constexpr u32 YOffsetIndex = 9; + static constexpr u32 XScaleIndex = 10; + static constexpr u32 YScaleIndex = 11; u32 step0; u32 step1; std::array buf_offsets; std::array ud_regs; + float xoffset; + float yoffset; + float xscale; + float yscale; void AddOffset(u32 binding, u32 offset) { ASSERT(offset < 256 && binding < buf_offsets.size()); diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index f8878d442..f8b91a283 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -30,6 +30,8 @@ struct Profile { bool needs_manual_interpolation{}; bool needs_lds_barriers{}; u64 min_ssbo_alignment{}; + u32 max_viewport_width{}; + u32 max_viewport_height{}; }; } // namespace Shader diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 8a5e0a1a6..2bf5e3f0a 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -84,6 +84,7 @@ struct VertexRuntimeInfo { u32 num_outputs; std::array outputs; bool emulate_depth_negative_one_to_one{}; + bool clip_disable{}; // Domain AmdGpu::TessellationType tess_type; AmdGpu::TessellationTopology tess_topology; @@ -92,7 +93,8 @@ struct VertexRuntimeInfo { bool operator==(const VertexRuntimeInfo& other) const noexcept { return emulate_depth_negative_one_to_one == other.emulate_depth_negative_one_to_one && - tess_type == other.tess_type && tess_topology == other.tess_topology && + clip_disable == other.clip_disable && tess_type == other.tess_type && + tess_topology == other.tess_topology && tess_partitioning == other.tess_partitioning && hs_output_cp_stride == other.hs_output_cp_stride; } diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index f696c1f72..9a20f94c1 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -42,13 +42,14 @@ struct GraphicsPipelineKey { vk::Format stencil_format; struct { + bool clip_disable : 1; bool depth_test_enable : 1; bool depth_write_enable : 1; bool depth_bounds_test_enable : 1; bool depth_bias_enable : 1; bool stencil_test_enable : 1; // Must be named to be zero-initialized. - u8 _unused : 3; + u8 _unused : 2; }; vk::CompareOp depth_compare_op; @@ -94,6 +95,10 @@ public: return key.mrt_mask; } + auto IsClipDisabled() const { + return key.clip_disable; + } + [[nodiscard]] bool IsPrimitiveListTopology() const { return key.prim_type == AmdGpu::PrimitiveType::PointList || key.prim_type == AmdGpu::PrimitiveType::LineList || diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 1600600b9..d9577a612 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -208,6 +208,7 @@ std::string Instance::GetDriverVersionName() { bool Instance::CreateDevice() { const vk::StructureChain feature_chain = physical_device.getFeatures2< vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT, + vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, vk::PhysicalDeviceExtendedDynamicState2FeaturesEXT, vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT, vk::PhysicalDeviceCustomBorderColorFeaturesEXT, @@ -317,6 +318,9 @@ bool Instance::CreateDevice() { .pQueuePriorities = queue_priorities.data(), }; + const auto topology_list_restart_features = + feature_chain.get(); + const auto vk12_features = feature_chain.get(); vk::StructureChain device_chain = { vk::DeviceCreateInfo{ @@ -406,6 +410,8 @@ bool Instance::CreateDevice() { }, vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT{ .primitiveTopologyListRestart = true, + .primitiveTopologyPatchListRestart = + topology_list_restart_features.primitiveTopologyPatchListRestart, }, vk::PhysicalDeviceFragmentShaderBarycentricFeaturesKHR{ .fragmentShaderBarycentric = true, diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 1b0c276dc..8c4752c3f 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -279,6 +279,14 @@ public: return min_imported_host_pointer_alignment; } + u32 GetMaxViewportWidth() const { + return properties.limits.maxViewportDimensions[0]; + } + + u32 GetMaxViewportHeight() const { + return properties.limits.maxViewportDimensions[1]; + } + /// Returns the sample count flags supported by framebuffers. vk::SampleCountFlags GetFramebufferSampleCounts() const { return properties.limits.framebufferColorSampleCounts & diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 86f6dcc7a..c6a56745d 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -125,6 +125,7 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS info.vs_info.emulate_depth_negative_one_to_one = !instance.IsDepthClipControlSupported() && regs.clipper_control.clip_space == Liverpool::ClipSpace::MinusWToW; + info.vs_info.clip_disable = graphics_key.clip_disable; if (l_stage == LogicalStage::TessellationEval) { info.vs_info.tess_type = regs.tess_config.type; info.vs_info.tess_topology = regs.tess_config.topology; @@ -210,6 +211,8 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, instance.GetDriverID() == vk::DriverId::eNvidiaProprietary, .needs_lds_barriers = instance.GetDriverID() == vk::DriverId::eNvidiaProprietary || instance.GetDriverID() == vk::DriverId::eMoltenvk, + .max_viewport_width = instance.GetMaxViewportWidth(), + .max_viewport_height = instance.GetMaxViewportHeight(), }; auto [cache_result, cache] = instance.GetDevice().createPipelineCacheUnique({}); ASSERT_MSG(cache_result == vk::Result::eSuccess, "Failed to create pipeline cache: {}", @@ -262,6 +265,8 @@ bool PipelineCache::RefreshGraphicsKey() { auto& regs = liverpool->regs; auto& key = graphics_key; + key.clip_disable = + regs.clipper_control.clip_disable || regs.primitive_type == AmdGpu::PrimitiveType::RectList; key.depth_test_enable = regs.depth_control.depth_enable; key.depth_write_enable = regs.depth_control.depth_write_enable && !regs.depth_render_control.depth_clear_enable; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index bac647125..07369c620 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -504,6 +504,17 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) { } push_data.step0 = regs.vgt_instance_step_rate_0; push_data.step1 = regs.vgt_instance_step_rate_1; + + // TODO(roamic): add support for multiple viewports and geometry shaders when ViewportIndex + // is encountered and implemented in the recompiler. + if (stage->stage == Shader::Stage::Vertex) { + push_data.xoffset = + regs.viewport_control.xoffset_enable ? regs.viewports[0].xoffset : 0.f; + push_data.xscale = regs.viewport_control.xscale_enable ? regs.viewports[0].xscale : 1.f; + push_data.yoffset = + regs.viewport_control.yoffset_enable ? regs.viewports[0].yoffset : 0.f; + push_data.yscale = regs.viewport_control.yscale_enable ? regs.viewports[0].yscale : 1.f; + } stage->PushUd(binding, push_data); BindBuffers(*stage, binding, push_data, set_writes, buffer_barriers); @@ -1032,7 +1043,7 @@ void Rasterizer::UnmapMemory(VAddr addr, u64 size) { } void Rasterizer::UpdateDynamicState(const GraphicsPipeline& pipeline) { - UpdateViewportScissorState(); + UpdateViewportScissorState(pipeline); auto& regs = liverpool->regs; const auto cmdbuf = scheduler.CommandBuffer(); @@ -1112,7 +1123,7 @@ void Rasterizer::UpdateDynamicState(const GraphicsPipeline& pipeline) { } } -void Rasterizer::UpdateViewportScissorState() { +void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) { const auto& regs = liverpool->regs; const auto combined_scissor_value_tl = [](s16 scr, s16 win, s16 gen, s16 win_offset) { @@ -1151,26 +1162,46 @@ void Rasterizer::UpdateViewportScissorState() { ? 1.0f : 0.0f; + if (regs.polygon_control.enable_window_offset) { + LOG_ERROR(Render_Vulkan, + "PA_SU_SC_MODE_CNTL.VTX_WINDOW_OFFSET_ENABLE support is not yet implemented."); + } + for (u32 i = 0; i < Liverpool::NumViewports; i++) { const auto& vp = regs.viewports[i]; const auto& vp_d = regs.viewport_depths[i]; if (vp.xscale == 0) { continue; } - const auto xoffset = vp_ctl.xoffset_enable ? vp.xoffset : 0.f; - const auto xscale = vp_ctl.xscale_enable ? vp.xscale : 1.f; - const auto yoffset = vp_ctl.yoffset_enable ? vp.yoffset : 0.f; - const auto yscale = vp_ctl.yscale_enable ? vp.yscale : 1.f; - const auto zoffset = vp_ctl.zoffset_enable ? vp.zoffset : 0.f; - const auto zscale = vp_ctl.zscale_enable ? vp.zscale : 1.f; - viewports.push_back({ - .x = xoffset - xscale, - .y = yoffset - yscale, - .width = xscale * 2.0f, - .height = yscale * 2.0f, - .minDepth = zoffset - zscale * reduce_z, - .maxDepth = zscale + zoffset, - }); + + if (pipeline.IsClipDisabled()) { + // In case if clipping is disabled we patch the shader to convert vertex position + // from screen space coordinates to NDC by defining a render space as full hardware + // window range [0..16383, 0..16383] and setting the viewport to its size. + viewports.push_back({ + .x = 0.f, + .y = 0.f, + .width = float(std::min(instance.GetMaxViewportWidth(), 16_KB)), + .height = float(std::min(instance.GetMaxViewportHeight(), 16_KB)), + .minDepth = 0.0, + .maxDepth = 1.0, + }); + } else { + const auto xoffset = vp_ctl.xoffset_enable ? vp.xoffset : 0.f; + const auto xscale = vp_ctl.xscale_enable ? vp.xscale : 1.f; + const auto yoffset = vp_ctl.yoffset_enable ? vp.yoffset : 0.f; + const auto yscale = vp_ctl.yscale_enable ? vp.yscale : 1.f; + const auto zoffset = vp_ctl.zoffset_enable ? vp.zoffset : 0.f; + const auto zscale = vp_ctl.zscale_enable ? vp.zscale : 1.f; + viewports.push_back({ + .x = xoffset - xscale, + .y = yoffset - yscale, + .width = xscale * 2.0f, + .height = yscale * 2.0f, + .minDepth = zoffset - zscale * reduce_z, + .maxDepth = zscale + zoffset, + }); + } auto vp_scsr = scsr; if (regs.mode_control.vport_scissor_enable) { @@ -1192,8 +1223,8 @@ void Rasterizer::UpdateViewportScissorState() { if (viewports.empty()) { // Vulkan requires providing at least one viewport. constexpr vk::Viewport empty_viewport = { - .x = 0.0f, - .y = 0.0f, + .x = -1.0f, + .y = -1.0f, .width = 1.0f, .height = 1.0f, .minDepth = 0.0f, diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index abf58e522..ed6cc7e71 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -76,7 +76,7 @@ private: void EliminateFastClear(); void UpdateDynamicState(const GraphicsPipeline& pipeline); - void UpdateViewportScissorState(); + void UpdateViewportScissorState(const GraphicsPipeline& pipeline); bool FilterDraw(); From 90b04e8cc0227a35aa5b01d6c361b4eaaefaee44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sat, 18 Jan 2025 13:59:38 +0700 Subject: [PATCH 086/455] input: Don't use old input state in GameController::ReadState() (#2170) --- src/core/libraries/pad/pad.cpp | 33 +++-- src/input/controller.cpp | 146 ++++++++++---------- src/input/controller.h | 36 +++-- src/sdl_window.cpp | 234 +++++++++++++++++++++++++++------ src/sdl_window.h | 22 +++- 5 files changed, 340 insertions(+), 131 deletions(-) diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index 7eb628a90..9a44f91f0 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -11,6 +11,8 @@ namespace Libraries::Pad { +using Input::GameController; + int PS4_SYSV_ABI scePadClose(s32 handle) { LOG_ERROR(Lib_Pad, "(STUBBED) called"); return ORBIS_OK; @@ -290,7 +292,8 @@ int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num) { int connected_count = 0; bool connected = false; Input::State states[64]; - auto* controller = Common::Singleton::Instance(); + auto* controller = Common::Singleton::Instance(); + const auto* engine = controller->GetEngine(); int ret_num = controller->ReadStates(states, num, &connected, &connected_count); if (!connected) { @@ -311,9 +314,14 @@ int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num) { pData[i].angularVelocity.x = states[i].angularVelocity.x; pData[i].angularVelocity.y = states[i].angularVelocity.y; pData[i].angularVelocity.z = states[i].angularVelocity.z; - Input::GameController::CalculateOrientation(pData[i].acceleration, pData[i].angularVelocity, - 1.0f / controller->accel_poll_rate, - pData[i].orientation); + if (engine) { + const auto accel_poll_rate = engine->GetAccelPollRate(); + if (accel_poll_rate != 0.0f) { + GameController::CalculateOrientation(pData[i].acceleration, + pData[i].angularVelocity, + 1.0f / accel_poll_rate, pData[i].orientation); + } + } pData[i].touchData.touchNum = (states[i].touchpad[0].state ? 1 : 0) + (states[i].touchpad[1].state ? 1 : 0); pData[i].touchData.touch[0].x = states[i].touchpad[0].x; @@ -356,7 +364,8 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) { if (handle == ORBIS_PAD_ERROR_DEVICE_NO_HANDLE) { return ORBIS_PAD_ERROR_INVALID_HANDLE; } - auto* controller = Common::Singleton::Instance(); + auto* controller = Common::Singleton::Instance(); + const auto* engine = controller->GetEngine(); int connectedCount = 0; bool isConnected = false; Input::State state; @@ -374,9 +383,13 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) { pData->angularVelocity.x = state.angularVelocity.x; pData->angularVelocity.y = state.angularVelocity.y; pData->angularVelocity.z = state.angularVelocity.z; - Input::GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity, - 1.0f / controller->accel_poll_rate, - pData->orientation); + if (engine) { + const auto accel_poll_rate = engine->GetAccelPollRate(); + if (accel_poll_rate != 0.0f) { + GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity, + 1.0f / accel_poll_rate, pData->orientation); + } + } pData->touchData.touchNum = (state.touchpad[0].state ? 1 : 0) + (state.touchpad[1].state ? 1 : 0); pData->touchData.touch[0].x = state.touchpad[0].x; @@ -468,7 +481,7 @@ int PS4_SYSV_ABI scePadSetLightBar(s32 handle, const OrbisPadLightBarParam* pPar return ORBIS_PAD_ERROR_INVALID_LIGHTBAR_SETTING; } - auto* controller = Common::Singleton::Instance(); + auto* controller = Common::Singleton::Instance(); controller->SetLightBarRGB(pParam->r, pParam->g, pParam->b); return ORBIS_OK; } @@ -536,7 +549,7 @@ int PS4_SYSV_ABI scePadSetVibration(s32 handle, const OrbisPadVibrationParam* pP if (pParam != nullptr) { LOG_DEBUG(Lib_Pad, "scePadSetVibration called handle = {} data = {} , {}", handle, pParam->smallMotor, pParam->largeMotor); - auto* controller = Common::Singleton::Instance(); + auto* controller = Common::Singleton::Instance(); controller->SetVibration(pParam->smallMotor, pParam->largeMotor); return ORBIS_OK; } diff --git a/src/input/controller.cpp b/src/input/controller.cpp index eb43e6adf..71f0b0c09 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -10,6 +10,55 @@ namespace Input { +using Libraries::Pad::OrbisPadButtonDataOffset; + +void State::OnButton(OrbisPadButtonDataOffset button, bool isPressed) { + if (isPressed) { + buttonsState |= button; + } else { + buttonsState &= ~button; + } +} + +void State::OnAxis(Axis axis, int value) { + const auto toggle = [&](const auto button) { + if (value > 0) { + buttonsState |= button; + } else { + buttonsState &= ~button; + } + }; + switch (axis) { + case Axis::TriggerLeft: + toggle(OrbisPadButtonDataOffset::L2); + break; + case Axis::TriggerRight: + toggle(OrbisPadButtonDataOffset::R2); + break; + default: + break; + } + axes[static_cast(axis)] = value; +} + +void State::OnTouchpad(int touchIndex, bool isDown, float x, float y) { + touchpad[touchIndex].state = isDown; + touchpad[touchIndex].x = static_cast(x * 1920); + touchpad[touchIndex].y = static_cast(y * 941); +} + +void State::OnGyro(const float gyro[3]) { + angularVelocity.x = gyro[0]; + angularVelocity.y = gyro[1]; + angularVelocity.z = gyro[2]; +} + +void State::OnAccel(const float accel[3]) { + acceleration.x = accel[0]; + acceleration.y = accel[1]; + acceleration.z = accel[2]; +} + GameController::GameController() { m_states_num = 0; m_last_state = State(); @@ -20,7 +69,7 @@ void GameController::ReadState(State* state, bool* isConnected, int* connectedCo *isConnected = m_connected; *connectedCount = m_connected_count; - *state = GetLastState(); + *state = m_engine && m_connected ? m_engine->ReadState() : GetLastState(); } int GameController::ReadStates(State* states, int states_num, bool* isConnected, @@ -75,45 +124,22 @@ void GameController::AddState(const State& state) { m_states_num++; } -void GameController::CheckButton(int id, Libraries::Pad::OrbisPadButtonDataOffset button, - bool is_pressed) { +void GameController::CheckButton(int id, OrbisPadButtonDataOffset button, bool is_pressed) { std::scoped_lock lock{m_mutex}; auto state = GetLastState(); + state.time = Libraries::Kernel::sceKernelGetProcessTime(); - if (is_pressed) { - state.buttonsState |= button; - } else { - state.buttonsState &= ~button; - } + state.OnButton(button, is_pressed); AddState(state); } void GameController::Axis(int id, Input::Axis axis, int value) { - using Libraries::Pad::OrbisPadButtonDataOffset; - std::scoped_lock lock{m_mutex}; auto state = GetLastState(); state.time = Libraries::Kernel::sceKernelGetProcessTime(); - int axis_id = static_cast(axis); - state.axes[axis_id] = value; - - if (axis == Input::Axis::TriggerLeft) { - if (value > 0) { - state.buttonsState |= OrbisPadButtonDataOffset::L2; - } else { - state.buttonsState &= ~OrbisPadButtonDataOffset::L2; - } - } - - if (axis == Input::Axis::TriggerRight) { - if (value > 0) { - state.buttonsState |= OrbisPadButtonDataOffset::R2; - } else { - state.buttonsState &= ~OrbisPadButtonDataOffset::R2; - } - } + state.OnAxis(axis, value); AddState(state); } @@ -124,9 +150,7 @@ void GameController::Gyro(int id, const float gyro[3]) { state.time = Libraries::Kernel::sceKernelGetProcessTime(); // Update the angular velocity (gyro data) - state.angularVelocity.x = gyro[0]; // X-axis - state.angularVelocity.y = gyro[1]; // Y-axis - state.angularVelocity.z = gyro[2]; // Z-axis + state.OnGyro(gyro); AddState(state); } @@ -136,9 +160,7 @@ void GameController::Acceleration(int id, const float acceleration[3]) { state.time = Libraries::Kernel::sceKernelGetProcessTime(); // Update the acceleration values - state.acceleration.x = acceleration[0]; // X-axis - state.acceleration.y = acceleration[1]; // Y-axis - state.acceleration.z = acceleration[2]; // Z-axis + state.OnAccel(acceleration); AddState(state); } @@ -211,62 +233,48 @@ void GameController::CalculateOrientation(Libraries::Pad::OrbisFVector3& acceler } void GameController::SetLightBarRGB(u8 r, u8 g, u8 b) { - if (m_sdl_gamepad != nullptr) { - SDL_SetGamepadLED(m_sdl_gamepad, r, g, b); + if (!m_engine) { + return; } + std::scoped_lock _{m_mutex}; + m_engine->SetLightBarRGB(r, g, b); } -bool GameController::SetVibration(u8 smallMotor, u8 largeMotor) { - if (m_sdl_gamepad != nullptr) { - return SDL_RumbleGamepad(m_sdl_gamepad, (smallMotor / 255.0f) * 0xFFFF, - (largeMotor / 255.0f) * 0xFFFF, -1); +void GameController::SetVibration(u8 smallMotor, u8 largeMotor) { + if (!m_engine) { + return; } - return true; + std::scoped_lock _{m_mutex}; + m_engine->SetVibration(smallMotor, largeMotor); } void GameController::SetTouchpadState(int touchIndex, bool touchDown, float x, float y) { if (touchIndex < 2) { std::scoped_lock lock{m_mutex}; auto state = GetLastState(); - state.time = Libraries::Kernel::sceKernelGetProcessTime(); - state.touchpad[touchIndex].state = touchDown; - state.touchpad[touchIndex].x = static_cast(x * 1920); - state.touchpad[touchIndex].y = static_cast(y * 941); + state.time = Libraries::Kernel::sceKernelGetProcessTime(); + state.OnTouchpad(touchIndex, touchDown, x, y); AddState(state); } } -void GameController::TryOpenSDLController() { - if (m_sdl_gamepad == nullptr || !SDL_GamepadConnected(m_sdl_gamepad)) { - int gamepad_count; - SDL_JoystickID* gamepads = SDL_GetGamepads(&gamepad_count); - m_sdl_gamepad = gamepad_count > 0 ? SDL_OpenGamepad(gamepads[0]) : nullptr; - if (Config::getIsMotionControlsEnabled()) { - if (SDL_SetGamepadSensorEnabled(m_sdl_gamepad, SDL_SENSOR_GYRO, true)) { - gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_sdl_gamepad, SDL_SENSOR_GYRO); - LOG_INFO(Input, "Gyro initialized, poll rate: {}", gyro_poll_rate); - } else { - LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad"); - } - if (SDL_SetGamepadSensorEnabled(m_sdl_gamepad, SDL_SENSOR_ACCEL, true)) { - accel_poll_rate = SDL_GetGamepadSensorDataRate(m_sdl_gamepad, SDL_SENSOR_ACCEL); - LOG_INFO(Input, "Accel initialized, poll rate: {}", accel_poll_rate); - } else { - LOG_ERROR(Input, "Failed to initialize accel controls for gamepad"); - } - } - - SDL_free(gamepads); - - SetLightBarRGB(0, 0, 255); +void GameController::SetEngine(std::unique_ptr engine) { + std::scoped_lock _{m_mutex}; + m_engine = std::move(engine); + if (m_engine) { + m_engine->Init(); } } +Engine* GameController::GetEngine() { + return m_engine.get(); +} + u32 GameController::Poll() { - std::scoped_lock lock{m_mutex}; if (m_connected) { + std::scoped_lock lock{m_mutex}; auto time = Libraries::Kernel::sceKernelGetProcessTime(); if (m_states_num == 0) { auto diff = (time - m_last_state.time) / 1000; diff --git a/src/input/controller.h b/src/input/controller.h index c6fc02c24..a45e71d77 100644 --- a/src/input/controller.h +++ b/src/input/controller.h @@ -3,12 +3,12 @@ #pragma once +#include +#include #include #include "common/types.h" #include "core/libraries/pad/pad.h" -struct SDL_Gamepad; - namespace Input { enum class Axis { @@ -28,7 +28,14 @@ struct TouchpadEntry { u16 y{}; }; -struct State { +class State { +public: + void OnButton(Libraries::Pad::OrbisPadButtonDataOffset, bool); + void OnAxis(Axis, int); + void OnTouchpad(int touchIndex, bool isDown, float x, float y); + void OnGyro(const float[3]); + void OnAccel(const float[3]); + Libraries::Pad::OrbisPadButtonDataOffset buttonsState{}; u64 time = 0; int axes[static_cast(Axis::AxisMax)] = {128, 128, 128, 128, 0, 0}; @@ -38,9 +45,19 @@ struct State { Libraries::Pad::OrbisFQuaternion orientation = {0.0f, 0.0f, 0.0f, 1.0f}; }; +class Engine { +public: + virtual ~Engine() = default; + virtual void Init() = 0; + virtual void SetLightBarRGB(u8 r, u8 g, u8 b) = 0; + virtual void SetVibration(u8 smallMotor, u8 largeMotor) = 0; + virtual State ReadState() = 0; + virtual float GetAccelPollRate() const = 0; + virtual float GetGyroPollRate() const = 0; +}; + inline int GetAxis(int min, int max, int value) { - int v = (255 * (value - min)) / (max - min); - return (v < 0 ? 0 : (v > 255 ? 255 : v)); + return std::clamp((255 * (value - min)) / (max - min), 0, 255); } constexpr u32 MAX_STATES = 64; @@ -59,13 +76,12 @@ public: void Gyro(int id, const float gyro[3]); void Acceleration(int id, const float acceleration[3]); void SetLightBarRGB(u8 r, u8 g, u8 b); - bool SetVibration(u8 smallMotor, u8 largeMotor); + void SetVibration(u8 smallMotor, u8 largeMotor); void SetTouchpadState(int touchIndex, bool touchDown, float x, float y); - void TryOpenSDLController(); + void SetEngine(std::unique_ptr); + Engine* GetEngine(); u32 Poll(); - float gyro_poll_rate; - float accel_poll_rate; static void CalculateOrientation(Libraries::Pad::OrbisFVector3& acceleration, Libraries::Pad::OrbisFVector3& angularVelocity, float deltaTime, @@ -85,7 +101,7 @@ private: std::array m_states; std::array m_private; - SDL_Gamepad* m_sdl_gamepad = nullptr; + std::unique_ptr m_engine = nullptr; }; } // namespace Input diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index b0126def2..d1fe6bbab 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -10,6 +10,7 @@ #include "common/assert.h" #include "common/config.h" +#include "core/libraries/kernel/time.h" #include "core/libraries/pad/pad.h" #include "imgui/renderer/imgui_core.h" #include "input/controller.h" @@ -20,47 +21,200 @@ #include #endif +namespace Input { + +using Libraries::Pad::OrbisPadButtonDataOffset; + +static OrbisPadButtonDataOffset SDLGamepadToOrbisButton(u8 button) { + using OPBDO = OrbisPadButtonDataOffset; + + switch (button) { + case SDL_GAMEPAD_BUTTON_DPAD_DOWN: + return OPBDO::Down; + case SDL_GAMEPAD_BUTTON_DPAD_UP: + return OPBDO::Up; + case SDL_GAMEPAD_BUTTON_DPAD_LEFT: + return OPBDO::Left; + case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: + return OPBDO::Right; + case SDL_GAMEPAD_BUTTON_SOUTH: + return OPBDO::Cross; + case SDL_GAMEPAD_BUTTON_NORTH: + return OPBDO::Triangle; + case SDL_GAMEPAD_BUTTON_WEST: + return OPBDO::Square; + case SDL_GAMEPAD_BUTTON_EAST: + return OPBDO::Circle; + case SDL_GAMEPAD_BUTTON_START: + return OPBDO::Options; + case SDL_GAMEPAD_BUTTON_TOUCHPAD: + return OPBDO::TouchPad; + case SDL_GAMEPAD_BUTTON_BACK: + return OPBDO::TouchPad; + case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: + return OPBDO::L1; + case SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: + return OPBDO::R1; + case SDL_GAMEPAD_BUTTON_LEFT_STICK: + return OPBDO::L3; + case SDL_GAMEPAD_BUTTON_RIGHT_STICK: + return OPBDO::R3; + default: + return OPBDO::None; + } +} + +static SDL_GamepadAxis InputAxisToSDL(Axis axis) { + switch (axis) { + case Axis::LeftX: + return SDL_GAMEPAD_AXIS_LEFTX; + case Axis::LeftY: + return SDL_GAMEPAD_AXIS_LEFTY; + case Axis::RightX: + return SDL_GAMEPAD_AXIS_RIGHTX; + case Axis::RightY: + return SDL_GAMEPAD_AXIS_RIGHTY; + case Axis::TriggerLeft: + return SDL_GAMEPAD_AXIS_LEFT_TRIGGER; + case Axis::TriggerRight: + return SDL_GAMEPAD_AXIS_RIGHT_TRIGGER; + default: + UNREACHABLE(); + } +} + +SDLInputEngine::~SDLInputEngine() { + if (m_gamepad) { + SDL_CloseGamepad(m_gamepad); + } +} + +void SDLInputEngine::Init() { + if (m_gamepad) { + SDL_CloseGamepad(m_gamepad); + m_gamepad = nullptr; + } + int gamepad_count; + SDL_JoystickID* gamepads = SDL_GetGamepads(&gamepad_count); + if (!gamepads) { + LOG_ERROR(Input, "Cannot get gamepad list: {}", SDL_GetError()); + return; + } + if (gamepad_count == 0) { + LOG_INFO(Input, "No gamepad found!"); + SDL_free(gamepads); + return; + } + LOG_INFO(Input, "Got {} gamepads. Opening the first one.", gamepad_count); + if (!(m_gamepad = SDL_OpenGamepad(gamepads[0]))) { + LOG_ERROR(Input, "Failed to open gamepad 0: {}", SDL_GetError()); + SDL_free(gamepads); + return; + } + if (Config::getIsMotionControlsEnabled()) { + if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_GYRO, true)) { + m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO); + LOG_INFO(Input, "Gyro initialized, poll rate: {}", m_gyro_poll_rate); + } else { + LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad"); + } + if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, true)) { + m_accel_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_ACCEL); + LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate); + } else { + LOG_ERROR(Input, "Failed to initialize accel controls for gamepad"); + }; + } + SDL_free(gamepads); + SetLightBarRGB(0, 0, 255); +} + +void SDLInputEngine::SetLightBarRGB(u8 r, u8 g, u8 b) { + if (m_gamepad) { + SDL_SetGamepadLED(m_gamepad, r, g, b); + } +} + +void SDLInputEngine::SetVibration(u8 smallMotor, u8 largeMotor) { + if (m_gamepad) { + const auto low_freq = (smallMotor / 255.0f) * 0xFFFF; + const auto high_freq = (largeMotor / 255.0f) * 0xFFFF; + SDL_RumbleGamepad(m_gamepad, low_freq, high_freq, -1); + } +} + +State SDLInputEngine::ReadState() { + State state{}; + state.time = Libraries::Kernel::sceKernelGetProcessTime(); + + // Buttons + for (u8 i = 0; i < SDL_GAMEPAD_BUTTON_COUNT; ++i) { + auto orbisButton = SDLGamepadToOrbisButton(i); + if (orbisButton == OrbisPadButtonDataOffset::None) { + continue; + } + state.OnButton(orbisButton, SDL_GetGamepadButton(m_gamepad, (SDL_GamepadButton)i)); + } + + // Axes + for (int i = 0; i < static_cast(Axis::AxisMax); ++i) { + const auto axis = static_cast(i); + const auto value = SDL_GetGamepadAxis(m_gamepad, InputAxisToSDL(axis)); + switch (axis) { + case Axis::TriggerLeft: + case Axis::TriggerRight: + state.OnAxis(axis, GetAxis(0, 0x8000, value)); + break; + default: + state.OnAxis(axis, GetAxis(-0x8000, 0x8000, value)); + break; + } + } + + // Touchpad + if (SDL_GetNumGamepadTouchpads(m_gamepad) > 0) { + for (int finger = 0; finger < 2; ++finger) { + bool down; + float x, y; + if (SDL_GetGamepadTouchpadFinger(m_gamepad, 0, finger, &down, &x, &y, NULL)) { + state.OnTouchpad(finger, down, x, y); + } + } + } + + // Gyro + if (SDL_GamepadHasSensor(m_gamepad, SDL_SENSOR_GYRO)) { + float gyro[3]; + if (SDL_GetGamepadSensorData(m_gamepad, SDL_SENSOR_GYRO, gyro, 3)) { + state.OnGyro(gyro); + } + } + + // Accel + if (SDL_GamepadHasSensor(m_gamepad, SDL_SENSOR_ACCEL)) { + float accel[3]; + if (SDL_GetGamepadSensorData(m_gamepad, SDL_SENSOR_ACCEL, accel, 3)) { + state.OnAccel(accel); + } + } + + return state; +} + +float SDLInputEngine::GetGyroPollRate() const { + return m_gyro_poll_rate; +} + +float SDLInputEngine::GetAccelPollRate() const { + return m_accel_poll_rate; +} + +} // namespace Input + namespace Frontend { using namespace Libraries::Pad; -static OrbisPadButtonDataOffset SDLGamepadToOrbisButton(u8 button) { - switch (button) { - case SDL_GAMEPAD_BUTTON_DPAD_DOWN: - return OrbisPadButtonDataOffset::Down; - case SDL_GAMEPAD_BUTTON_DPAD_UP: - return OrbisPadButtonDataOffset::Up; - case SDL_GAMEPAD_BUTTON_DPAD_LEFT: - return OrbisPadButtonDataOffset::Left; - case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: - return OrbisPadButtonDataOffset::Right; - case SDL_GAMEPAD_BUTTON_SOUTH: - return OrbisPadButtonDataOffset::Cross; - case SDL_GAMEPAD_BUTTON_NORTH: - return OrbisPadButtonDataOffset::Triangle; - case SDL_GAMEPAD_BUTTON_WEST: - return OrbisPadButtonDataOffset::Square; - case SDL_GAMEPAD_BUTTON_EAST: - return OrbisPadButtonDataOffset::Circle; - case SDL_GAMEPAD_BUTTON_START: - return OrbisPadButtonDataOffset::Options; - case SDL_GAMEPAD_BUTTON_TOUCHPAD: - return OrbisPadButtonDataOffset::TouchPad; - case SDL_GAMEPAD_BUTTON_BACK: - return OrbisPadButtonDataOffset::TouchPad; - case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: - return OrbisPadButtonDataOffset::L1; - case SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: - return OrbisPadButtonDataOffset::R1; - case SDL_GAMEPAD_BUTTON_LEFT_STICK: - return OrbisPadButtonDataOffset::L3; - case SDL_GAMEPAD_BUTTON_RIGHT_STICK: - return OrbisPadButtonDataOffset::R3; - default: - return OrbisPadButtonDataOffset::None; - } -} - static Uint32 SDLCALL PollController(void* userdata, SDL_TimerID timer_id, Uint32 interval) { auto* controller = reinterpret_cast(userdata); return controller->Poll(); @@ -112,7 +266,7 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_ SDL_SetWindowFullscreen(window, Config::getIsFullscreen()); SDL_InitSubSystem(SDL_INIT_GAMEPAD); - controller->TryOpenSDLController(); + controller->SetEngine(std::make_unique()); #if defined(SDL_PLATFORM_WIN32) window_info.type = WindowSystemType::Windows; @@ -422,7 +576,7 @@ void WindowSDL::OnGamepadEvent(const SDL_Event* event) { switch (event->type) { case SDL_EVENT_GAMEPAD_ADDED: case SDL_EVENT_GAMEPAD_REMOVED: - controller->TryOpenSDLController(); + controller->SetEngine(std::make_unique()); break; case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: @@ -433,7 +587,7 @@ void WindowSDL::OnGamepadEvent(const SDL_Event* event) { break; case SDL_EVENT_GAMEPAD_BUTTON_DOWN: case SDL_EVENT_GAMEPAD_BUTTON_UP: { - button = SDLGamepadToOrbisButton(event->gbutton.button); + button = Input::SDLGamepadToOrbisButton(event->gbutton.button); if (button == OrbisPadButtonDataOffset::None) { break; } diff --git a/src/sdl_window.h b/src/sdl_window.h index 78d4bbc39..3ab3c3613 100644 --- a/src/sdl_window.h +++ b/src/sdl_window.h @@ -5,14 +5,32 @@ #include #include "common/types.h" +#include "input/controller.h" struct SDL_Window; struct SDL_Gamepad; union SDL_Event; namespace Input { -class GameController; -} + +class SDLInputEngine : public Engine { +public: + ~SDLInputEngine() override; + void Init() override; + void SetLightBarRGB(u8 r, u8 g, u8 b) override; + void SetVibration(u8 smallMotor, u8 largeMotor) override; + float GetGyroPollRate() const override; + float GetAccelPollRate() const override; + State ReadState() override; + +private: + SDL_Gamepad* m_gamepad = nullptr; + + float m_gyro_poll_rate{}; + float m_accel_poll_rate{}; +}; + +} // namespace Input namespace Frontend { From 40385e13e7ca96f19e004a0c21b718d9bf701570 Mon Sep 17 00:00:00 2001 From: tomboylover93 <95257311+tomboylover93@users.noreply.github.com> Date: Fri, 17 Jan 2025 23:08:20 -0800 Subject: [PATCH 087/455] qt: Improve user experience on Steam Deck and window managers (#2103) --- src/qt_gui/cheats_patches.cpp | 6 + src/qt_gui/settings_dialog.cpp | 16 - src/qt_gui/settings_dialog.ui | 629 ++++++++++++++++----------------- 3 files changed, 310 insertions(+), 341 deletions(-) diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index 2fea0b6ea..13157aa3a 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -188,8 +188,12 @@ void CheatsPatches::setupUI() { } }); + QPushButton* closeButton = new QPushButton(tr("Close")); + connect(closeButton, &QPushButton::clicked, [this]() { QWidget::close(); }); + controlLayout->addWidget(downloadButton); controlLayout->addWidget(deleteCheatButton); + controlLayout->addWidget(closeButton); cheatsLayout->addLayout(controlLayout); cheatsTab->setLayout(cheatsLayout); @@ -464,6 +468,8 @@ void CheatsPatches::onSaveButtonClicked() { } else { QMessageBox::information(this, tr("Success"), tr("Options saved successfully.")); } + + QWidget::close(); } QCheckBox* CheatsPatches::findCheckBoxByName(const QString& name) { diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index a4b584294..175c8c51d 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -522,22 +522,6 @@ bool SettingsDialog::eventFilter(QObject* obj, QEvent* event) { } else { ui->descriptionText->setText(defaultTextEdit); } - - // if the text exceeds the size of the box, it will increase the size - QRect currentGeometry = this->geometry(); - int newWidth = currentGeometry.width(); - - int documentHeight = ui->descriptionText->document()->size().height(); - int visibleHeight = ui->descriptionText->viewport()->height(); - if (documentHeight > visibleHeight) { - ui->descriptionText->setMaximumSize(16777215, 110); - this->setGeometry(currentGeometry.x(), currentGeometry.y(), newWidth, - currentGeometry.height() + 40); - } else { - ui->descriptionText->setMaximumSize(16777215, 70); - this->setGeometry(currentGeometry.x(), currentGeometry.y(), newWidth, - initialHeight); - } return true; } } diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 8d68d1c90..c084d4849 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -12,7 +12,7 @@ 0 0 970 - 750 + 820 @@ -68,7 +68,7 @@ 0 0 946 - 586 + 611 @@ -77,43 +77,6 @@ 0 - - - - - - System - - - - - - Console Language - - - - - - - - - - - - Emulator Language - - - - - - - - - - - - - @@ -217,246 +180,6 @@ - - - - 6 - - - QLayout::SizeConstraint::SetDefaultConstraint - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Update - - - - 10 - - - 1 - - - 11 - - - 11 - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Update Channel - - - - 7 - - - 11 - - - 11 - - - 11 - - - 11 - - - - - - 0 - 0 - - - - - Release - - - - - Nightly - - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Check for Updates - - - - - - - - 0 - 0 - - - - - 11 - false - - - - Check for Updates at Startup - - - - - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Game Compatibility - - - - 10 - - - 1 - - - 11 - - - - - Display Compatibility Data - - - - - - - Update Compatibility Database On Startup - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Update Compatibility Database - - - - - - - - @@ -627,6 +350,283 @@ + + + + + + System + + + + + + Console Language + + + + + + + + + + + + Emulator Language + + + + + + + + + + + + + + + + + 6 + + + QLayout::SizeConstraint::SetDefaultConstraint + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Update + + + + 10 + + + 1 + + + 11 + + + 190 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Update Channel + + + + 7 + + + 11 + + + 11 + + + 11 + + + 11 + + + + + + 0 + 0 + + + + + Release + + + + + Nightly + + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Check for Updates + + + + + + + + 0 + 0 + + + + + 11 + false + + + + Check for Updates at Startup + + + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Game Compatibility + + + + 10 + + + 1 + + + 11 + + + + + Display Compatibility Data + + + + + + + Update Compatibility Database On Startup + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Update Compatibility Database + + + + + + + + @@ -645,12 +645,12 @@ 0 0 946 - 586 + 605 - + @@ -664,17 +664,14 @@ Cursor - - - 0 - + 11 11 - + true @@ -701,7 +698,7 @@ - + true @@ -836,7 +833,7 @@ true - + 0 0 @@ -872,6 +869,12 @@ true + + + 0 + 0 + + 0 @@ -885,23 +888,6 @@ - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - @@ -943,7 +929,7 @@ 0 0 946 - 586 + 605 @@ -1124,11 +1110,14 @@ + + true + Advanced - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop @@ -1194,7 +1183,7 @@ 0 0 946 - 586 + 605 @@ -1233,22 +1222,6 @@ - - - - Qt::Orientation::Horizontal - - - QSizePolicy::Policy::Preferred - - - - 40 - 20 - - - - @@ -1445,10 +1418,16 @@ + + + 0 + 0 + + 16777215 - 70 + 120 From 9a956f5ed00584cbdf70240826c01445ee083f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sat, 18 Jan 2025 14:08:45 +0700 Subject: [PATCH 088/455] renderer_vulkan: Clear blank frame (#2095) * renderer_vulkan: Clear blank frame Fix display of garbage images on startup on some drivers. * Remove duplicated attachment declarations * Remove duplicated rendering_info declarations --- .../renderer_vulkan/vk_presenter.cpp | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 0f45574bc..fcdb84676 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -602,6 +602,23 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) .pImageMemoryBarriers = &pre_barrier, }); + const std::array attachments = {vk::RenderingAttachmentInfo{ + .imageView = frame->image_view, + .imageLayout = vk::ImageLayout::eColorAttachmentOptimal, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eStore, + }}; + const vk::RenderingInfo rendering_info{ + .renderArea = + vk::Rect2D{ + .offset = {0, 0}, + .extent = {frame->width, frame->height}, + }, + .layerCount = 1, + .colorAttachmentCount = attachments.size(), + .pColorAttachments = attachments.data(), + }; + if (image_id != VideoCore::NULL_IMAGE_ID) { auto& image = texture_cache.GetImage(image_id); image.Transit(vk::ImageLayout::eShaderReadOnlyOptimal, vk::AccessFlagBits2::eShaderRead, {}, @@ -662,26 +679,13 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) cmdbuf.pushConstants(*pp_pipeline_layout, vk::ShaderStageFlagBits::eFragment, 0, sizeof(PostProcessSettings), &pp_settings); - const std::array attachments = {vk::RenderingAttachmentInfo{ - .imageView = frame->image_view, - .imageLayout = vk::ImageLayout::eColorAttachmentOptimal, - .loadOp = vk::AttachmentLoadOp::eClear, - .storeOp = vk::AttachmentStoreOp::eStore, - }}; - - vk::RenderingInfo rendering_info{ - .renderArea = - vk::Rect2D{ - .offset = {0, 0}, - .extent = {frame->width, frame->height}, - }, - .layerCount = 1, - .colorAttachmentCount = attachments.size(), - .pColorAttachments = attachments.data(), - }; cmdbuf.beginRendering(rendering_info); cmdbuf.draw(3, 1, 0, 0); cmdbuf.endRendering(); + } else { + // Fix display of garbage images on startup on some drivers + cmdbuf.beginRendering(rendering_info); + cmdbuf.endRendering(); } const auto post_barrier = From 81ad575b2294224194a365d087b2a6240a0b9161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sat, 18 Jan 2025 14:47:38 +0700 Subject: [PATCH 089/455] video_core: Use adaptive mutex on Linux (#2105) Fix performance regression with #1973 on SteamDeck --- src/common/adaptive_mutex.h | 27 ++++++++++++++++++++++ src/video_core/buffer_cache/word_manager.h | 7 ++++++ src/video_core/page_manager.h | 7 ++++++ 3 files changed, 41 insertions(+) create mode 100644 src/common/adaptive_mutex.h diff --git a/src/common/adaptive_mutex.h b/src/common/adaptive_mutex.h new file mode 100644 index 000000000..f174f5996 --- /dev/null +++ b/src/common/adaptive_mutex.h @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#ifdef __linux__ +#include +#endif + +namespace Common { + +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +class AdaptiveMutex { +public: + void lock() { + pthread_mutex_lock(&mutex); + } + void unlock() { + pthread_mutex_unlock(&mutex); + } + +private: + pthread_mutex_t mutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; +}; +#endif // PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP + +} // namespace Common diff --git a/src/video_core/buffer_cache/word_manager.h b/src/video_core/buffer_cache/word_manager.h index 7ad33d7a6..5ad724f96 100644 --- a/src/video_core/buffer_cache/word_manager.h +++ b/src/video_core/buffer_cache/word_manager.h @@ -8,6 +8,9 @@ #include #include +#ifdef __linux__ +#include "common/adaptive_mutex.h" +#endif #include "common/spin_lock.h" #include "common/types.h" #include "video_core/page_manager.h" @@ -272,7 +275,11 @@ private: } } +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP + Common::AdaptiveMutex lock; +#else Common::SpinLock lock; +#endif PageManager* tracker; VAddr cpu_addr = 0; WordsArray cpu; diff --git a/src/video_core/page_manager.h b/src/video_core/page_manager.h index f44307f92..f6bae9641 100644 --- a/src/video_core/page_manager.h +++ b/src/video_core/page_manager.h @@ -5,6 +5,9 @@ #include #include +#ifdef __linux__ +#include "common/adaptive_mutex.h" +#endif #include "common/spin_lock.h" #include "common/types.h" @@ -36,7 +39,11 @@ private: std::unique_ptr impl; Vulkan::Rasterizer* rasterizer; boost::icl::interval_map cached_pages; +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP + Common::AdaptiveMutex lock; +#else Common::SpinLock lock; +#endif }; } // namespace VideoCore From 12364b197a87ec79cd476eb0e73d1015ef02cac0 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 18 Jan 2025 01:13:16 -0800 Subject: [PATCH 090/455] renderer_vulkan: Remove swapchain image reinterpretation. (#2176) --- .../renderer_vulkan/vk_instance.cpp | 1 - .../renderer_vulkan/vk_presenter.cpp | 2 +- .../renderer_vulkan/vk_swapchain.cpp | 20 ++++--------------- src/video_core/renderer_vulkan/vk_swapchain.h | 15 -------------- 4 files changed, 5 insertions(+), 33 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index d9577a612..15bd573ef 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -271,7 +271,6 @@ bool Instance::CreateDevice() { legacy_vertex_attributes = add_extension(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME); image_load_store_lod = add_extension(VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME); amd_gcn_shader = add_extension(VK_AMD_GCN_SHADER_EXTENSION_NAME); - add_extension(VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME); // These extensions are promoted by Vulkan 1.3, but for greater compatibility we use Vulkan 1.2 // with extensions. diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index fcdb84676..ce2e02a43 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -380,7 +380,7 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { const vk::ImageViewCreateInfo view_info = { .image = frame->image, .viewType = vk::ImageViewType::e2D, - .format = swapchain.GetViewFormat(), + .format = format, .subresourceRange{ .aspectMask = vk::ImageAspectFlagBits::eColor, .baseMipLevel = 0, diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 438fe30ce..5467a5733 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -17,7 +17,7 @@ Swapchain::Swapchain(const Instance& instance_, const Frontend::WindowSDL& windo FindPresentFormat(); Create(window.GetWidth(), window.GetHeight()); - ImGui::Core::Initialize(instance, window, image_count, view_format); + ImGui::Core::Initialize(instance, window, image_count, surface_format.format); } Swapchain::~Swapchain() { @@ -57,17 +57,7 @@ void Swapchain::Create(u32 width_, u32 height_) { const u32 queue_family_indices_count = exclusive ? 1u : 2u; const vk::SharingMode sharing_mode = exclusive ? vk::SharingMode::eExclusive : vk::SharingMode::eConcurrent; - const vk::Format view_formats[2] = { - surface_format.format, - view_format, - }; - const vk::ImageFormatListCreateInfo format_list = { - .viewFormatCount = 2, - .pViewFormats = view_formats, - }; const vk::SwapchainCreateInfoKHR swapchain_info = { - .pNext = &format_list, - .flags = vk::SwapchainCreateFlagBitsKHR::eMutableFormat, .surface = surface, .minImageCount = image_count, .imageFormat = surface_format.format, @@ -157,22 +147,20 @@ void Swapchain::FindPresentFormat() { // If there is a single undefined surface format, the device doesn't care, so we'll just use // RGBA sRGB. if (formats[0].format == vk::Format::eUndefined) { - surface_format.format = vk::Format::eR8G8B8A8Srgb; + surface_format.format = vk::Format::eR8G8B8A8Unorm; surface_format.colorSpace = vk::ColorSpaceKHR::eSrgbNonlinear; - view_format = FormatToUnorm(surface_format.format); return; } // Try to find a suitable format. for (const vk::SurfaceFormatKHR& sformat : formats) { vk::Format format = sformat.format; - if (format != vk::Format::eR8G8B8A8Srgb && format != vk::Format::eB8G8R8A8Srgb) { + if (format != vk::Format::eR8G8B8A8Unorm && format != vk::Format::eB8G8R8A8Unorm) { continue; } surface_format.format = format; surface_format.colorSpace = sformat.colorSpace; - view_format = FormatToUnorm(surface_format.format); return; } @@ -274,7 +262,7 @@ void Swapchain::SetupImages() { auto [im_view_result, im_view] = device.createImageView(vk::ImageViewCreateInfo{ .image = images[i], .viewType = vk::ImageViewType::e2D, - .format = FormatToUnorm(surface_format.format), + .format = surface_format.format, .subresourceRange = { .aspectMask = vk::ImageAspectFlagBits::eColor, diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index 9da75c758..f5cf9f0d2 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -17,17 +17,6 @@ namespace Vulkan { class Instance; class Scheduler; -inline vk::Format FormatToUnorm(vk::Format fmt) { - switch (fmt) { - case vk::Format::eR8G8B8A8Srgb: - return vk::Format::eR8G8B8A8Unorm; - case vk::Format::eB8G8R8A8Srgb: - return vk::Format::eB8G8R8A8Unorm; - default: - UNREACHABLE(); - } -} - class Swapchain { public: explicit Swapchain(const Instance& instance, const Frontend::WindowSDL& window); @@ -61,10 +50,6 @@ public: return surface_format; } - vk::Format GetViewFormat() const { - return view_format; - } - vk::SwapchainKHR GetHandle() const { return swapchain; } From d3615796186b44902599ca2a41c61dd0b73b3eb5 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 18 Jan 2025 01:35:44 -0800 Subject: [PATCH 091/455] texture_cache: Fix image mip overlap. (#2177) --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 2 -- src/video_core/texture_cache/image_info.cpp | 2 +- src/video_core/texture_cache/image_view.cpp | 9 ++++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 07369c620..88b510eca 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -802,8 +802,6 @@ void Rasterizer::BeginRendering(const GraphicsPipeline& pipeline, RenderState& s const auto mip = view.info.range.base.level; state.width = std::min(state.width, std::max(image.info.size.width >> mip, 1u)); state.height = std::min(state.height, std::max(image.info.size.height >> mip, 1u)); - ASSERT(old_img.info.size.width == state.width); - ASSERT(old_img.info.size.height == state.height); } auto& image = texture_cache.GetImage(image_id); if (image.binding.force_general) { diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 07a0488f3..a9ed76960 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -219,7 +219,7 @@ int ImageInfo::IsMipOf(const ImageInfo& info) const { return -1; } - if (IsTilingCompatible(info.tiling_idx, tiling_idx)) { + if (!IsTilingCompatible(info.tiling_idx, tiling_idx)) { return -1; } diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index 6b1349386..7befb5259 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -114,9 +114,12 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info const auto view_aspect = aspect & vk::ImageAspectFlagBits::eDepth ? "Depth" : aspect & vk::ImageAspectFlagBits::eStencil ? "Stencil" : "Color"; - Vulkan::SetObjectName(instance.GetDevice(), *image_view, "ImageView {}x{}x{} {:#x}:{:#x} ({})", - image.info.size.width, image.info.size.height, image.info.size.depth, - image.info.guest_address, image.info.guest_size, view_aspect); + Vulkan::SetObjectName( + instance.GetDevice(), *image_view, "ImageView {}x{}x{} {:#x}:{:#x} {}:{} {}:{} ({})", + image.info.size.width, image.info.size.height, image.info.size.depth, + image.info.guest_address, image.info.guest_size, info.range.base.level, + info.range.base.level + info.range.extent.levels - 1, info.range.base.layer, + info.range.base.layer + info.range.extent.layers - 1, view_aspect); } ImageView::~ImageView() = default; From c80151addedf25f497ad1064f5b3ab36bdcca28d Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 18 Jan 2025 02:29:19 -0800 Subject: [PATCH 092/455] vk_presenter: Fix splash issues. (#2180) --- src/video_core/renderer_vulkan/vk_presenter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index ce2e02a43..36d64a5d5 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -476,7 +476,7 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { if (!frame) { if (!splash_img.has_value()) { VideoCore::ImageInfo info{}; - info.pixel_format = vk::Format::eR8G8B8A8Srgb; + info.pixel_format = vk::Format::eR8G8B8A8Unorm; info.type = vk::ImageType::e2D; info.size = VideoCore::Extent3D{splash->GetImageInfo().width, splash->GetImageInfo().height, 1}; @@ -487,6 +487,7 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { splash->GetImageInfo().width, splash->GetImageInfo().height, 0); splash_img.emplace(instance, present_scheduler, info); + splash_img->flags &= ~VideoCore::GpuDirty; texture_cache.RefreshImage(*splash_img); splash_img->Transit(vk::ImageLayout::eTransferSrcOptimal, From 1ea5f8f09243b958ff64d879116c89dd24a627ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sat, 18 Jan 2025 17:48:39 +0700 Subject: [PATCH 093/455] input: Unbroke KBM-only input (#2179) --- src/input/controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input/controller.cpp b/src/input/controller.cpp index 71f0b0c09..ae54553f4 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -69,7 +69,7 @@ void GameController::ReadState(State* state, bool* isConnected, int* connectedCo *isConnected = m_connected; *connectedCount = m_connected_count; - *state = m_engine && m_connected ? m_engine->ReadState() : GetLastState(); + *state = GetLastState(); } int GameController::ReadStates(State* states, int states_num, bool* isConnected, From 3b92cd1c1a68f18b3f68afb58860d3c2e828aff2 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Sat, 18 Jan 2025 13:21:08 +0100 Subject: [PATCH 094/455] CLI: Add argument to pass an argument to the game (#2135) --- src/core/linker.cpp | 10 ++++++++-- src/core/linker.h | 4 ++-- src/emulator.cpp | 13 +++++++++++-- src/emulator.h | 2 +- src/main.cpp | 21 ++++++++++++++++++++- src/qt_gui/main.cpp | 20 +++++++++++++++++++- 6 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/core/linker.cpp b/src/core/linker.cpp index 28d2eea7b..2461edcb2 100644 --- a/src/core/linker.cpp +++ b/src/core/linker.cpp @@ -52,7 +52,7 @@ Linker::Linker() : memory{Memory::Instance()} {} Linker::~Linker() = default; -void Linker::Execute() { +void Linker::Execute(const std::vector args) { if (Config::debugDump()) { DebugDump(); } @@ -101,7 +101,7 @@ void Linker::Execute() { memory->SetupMemoryRegions(fmem_size, use_extended_mem1, use_extended_mem2); - main_thread.Run([this, module](std::stop_token) { + main_thread.Run([this, module, args](std::stop_token) { Common::SetCurrentThreadName("GAME_MainThread"); LoadSharedLibraries(); @@ -109,6 +109,12 @@ void Linker::Execute() { EntryParams params{}; params.argc = 1; params.argv[0] = "eboot.bin"; + if (!args.empty()) { + params.argc = args.size() + 1; + for (int i = 0; i < args.size() && i < 32; i++) { + params.argv[i + 1] = args[i].c_str(); + } + } params.entry_addr = module->GetEntryAddress(); RunMainEntry(¶ms); }); diff --git a/src/core/linker.h b/src/core/linker.h index 7ef13ae56..00da3a08c 100644 --- a/src/core/linker.h +++ b/src/core/linker.h @@ -49,7 +49,7 @@ class Linker; struct EntryParams { int argc; u32 padding; - const char* argv[3]; + const char* argv[33]; VAddr entry_addr; }; @@ -143,7 +143,7 @@ public: void Relocate(Module* module); bool Resolve(const std::string& name, Loader::SymbolType type, Module* module, Loader::SymbolRecord* return_info); - void Execute(); + void Execute(const std::vector args = {}); void DebugDump(); private: diff --git a/src/emulator.cpp b/src/emulator.cpp index 61d6d3862..e77c2b87f 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -99,7 +99,7 @@ Emulator::~Emulator() { Config::saveMainWindow(config_dir / "config.toml"); } -void Emulator::Run(const std::filesystem::path& file) { +void Emulator::Run(const std::filesystem::path& file, const std::vector args) { // Applications expect to be run from /app0 so mount the file's parent path as app0. auto* mnt = Common::Singleton::Instance(); const auto game_folder = file.parent_path(); @@ -152,6 +152,15 @@ void Emulator::Run(const std::filesystem::path& file) { if (const auto raw_attributes = param_sfo->GetInteger("ATTRIBUTE")) { psf_attributes.raw = *raw_attributes; } + if (!args.empty()) { + int argc = std::min(args.size(), 32); + for (int i = 0; i < argc; i++) { + LOG_INFO(Loader, "Game argument {}: {}", i, args[i]); + } + if (args.size() > 32) { + LOG_ERROR(Loader, "Too many game arguments, only passing the first 32"); + } + } } const auto pic1_path = mnt->GetHostPath("/app0/sce_sys/pic1.png"); @@ -239,7 +248,7 @@ void Emulator::Run(const std::filesystem::path& file) { } #endif - linker->Execute(); + linker->Execute(args); window->InitTimers(); while (window->IsOpen()) { diff --git a/src/emulator.h b/src/emulator.h index a08ab43c3..08c2807a1 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -25,7 +25,7 @@ public: Emulator(); ~Emulator(); - void Run(const std::filesystem::path& file); + void Run(const std::filesystem::path& file, const std::vector args = {}); void UpdatePlayTime(const std::string& serial); private: diff --git a/src/main.cpp b/src/main.cpp index 54772870c..fad3b1f53 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,6 +29,7 @@ int main(int argc, char* argv[]) { bool has_game_argument = false; std::string game_path; + std::vector game_args{}; // Map of argument strings to lambda functions std::unordered_map> arg_map = { @@ -37,6 +38,9 @@ int main(int argc, char* argv[]) { std::cout << "Usage: shadps4 [options] \n" "Options:\n" " -g, --game Specify game path to launch\n" + " -- ... Parameters passed to the game ELF. " + "Needs to be at the end of the line, and everything after \"--\" is a " + "game argument.\n" " -p, --patch Apply specified patch file\n" " -f, --fullscreen Specify window initial fullscreen " "state. Does not overwrite the config file.\n" @@ -126,6 +130,21 @@ int main(int argc, char* argv[]) { // Assume the last argument is the game file if not specified via -g/--game game_path = argv[i]; has_game_argument = true; + } else if (std::string(argv[i]) == "--") { + if (i + 1 == argc) { + std::cerr << "Warning: -- is set, but no game arguments are added!\n"; + break; + } + for (int j = i + 1; j < argc; j++) { + game_args.push_back(argv[j]); + } + break; + } else if (i + 1 < argc && std::string(argv[i + 1]) == "--") { + if (!has_game_argument) { + game_path = argv[i]; + has_game_argument = true; + } + break; } else { std::cerr << "Unknown argument: " << cur_arg << ", see --help for info.\n"; return 1; @@ -166,7 +185,7 @@ int main(int argc, char* argv[]) { // Run the emulator with the resolved eboot path Core::Emulator emulator; - emulator.Run(eboot_path); + emulator.Run(eboot_path, game_args); return 0; } diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 2d524e199..8babadc35 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -33,6 +33,7 @@ int main(int argc, char* argv[]) { bool has_command_line_argument = argc > 1; bool show_gui = false, has_game_argument = false; std::string game_path; + std::vector game_args{}; // Map of argument strings to lambda functions std::unordered_map> arg_map = { @@ -43,6 +44,9 @@ int main(int argc, char* argv[]) { " No arguments: Opens the GUI.\n" " -g, --game Specify or " " to launch\n" + " -- ... Parameters passed to the game ELF. " + "Needs to be at the end of the line, and everything after \"--\" is a " + "game argument.\n" " -p, --patch Apply specified patch file\n" " -s, --show-gui Show the GUI\n" " -f, --fullscreen Specify window initial fullscreen " @@ -131,6 +135,20 @@ int main(int argc, char* argv[]) { // Assume the last argument is the game file if not specified via -g/--game game_path = argv[i]; has_game_argument = true; + } else if (std::string(argv[i]) == "--") { + if (i + 1 == argc) { + std::cerr << "Warning: -- is set, but no game arguments are added!\n"; + break; + } + for (int j = i + 1; j < argc; j++) { + game_args.push_back(argv[j]); + } + break; + } else if (i + 1 < argc && std::string(argv[i + 1]) == "--") { + if (!has_game_argument) { + game_path = argv[i]; + has_game_argument = true; + } } else { std::cerr << "Unknown argument: " << cur_arg << ", see --help for info.\n"; return 1; @@ -181,7 +199,7 @@ int main(int argc, char* argv[]) { // Run the emulator with the resolved game path Core::Emulator emulator; - emulator.Run(game_file_path.string()); + emulator.Run(game_file_path.string(), game_args); if (!show_gui) { return 0; // Exit after running the emulator without showing the GUI } From 388548ba470aa68c5fff4e5737e03031e5783f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Sat, 18 Jan 2025 14:02:02 +0100 Subject: [PATCH 095/455] pad: Configurable DeadZone (#2030) --- src/common/config.cpp | 14 ++++++++++++++ src/common/config.h | 2 ++ src/core/libraries/pad/pad.cpp | 8 ++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 9c842f8b7..ed9af5a72 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -45,6 +45,8 @@ static std::string logFilter; static std::string logType = "async"; static std::string userName = "shadPS4"; static std::string updateChannel; +static u16 deadZoneLeft = 2.0; +static u16 deadZoneRight = 2.0; static std::string backButtonBehavior = "left"; static bool useSpecialPad = false; static int specialPadClass = 1; @@ -140,6 +142,14 @@ bool getEnableDiscordRPC() { return enableDiscordRPC; } +u16 leftDeadZone() { + return deadZoneLeft; +} + +u16 rightDeadZone() { + return deadZoneRight; +} + s16 getCursorState() { return cursorState; } @@ -620,6 +630,8 @@ void load(const std::filesystem::path& path) { if (data.contains("Input")) { const toml::value& input = data.at("Input"); + deadZoneLeft = toml::find_or(input, "deadZoneLeft", 2.0); + deadZoneRight = toml::find_or(input, "deadZoneRight", 2.0); cursorState = toml::find_or(input, "cursorState", HideCursorState::Idle); cursorHideTimeout = toml::find_or(input, "cursorHideTimeout", 5); backButtonBehavior = toml::find_or(input, "backButtonBehavior", "left"); @@ -739,6 +751,8 @@ void save(const std::filesystem::path& path) { data["General"]["separateUpdateEnabled"] = separateupdatefolder; data["General"]["compatibilityEnabled"] = compatibilityData; data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup; + data["Input"]["deadZoneLeft"] = deadZoneLeft; + data["Input"]["deadZoneRight"] = deadZoneRight; data["Input"]["cursorState"] = cursorState; data["Input"]["cursorHideTimeout"] = cursorHideTimeout; data["Input"]["backButtonBehavior"] = backButtonBehavior; diff --git a/src/common/config.h b/src/common/config.h index f9e4c2815..cb56f99c7 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -35,6 +35,8 @@ std::string getLogType(); std::string getUserName(); std::string getUpdateChannel(); +u16 leftDeadZone(); +u16 rightDeadZone(); s16 getCursorState(); int getCursorHideTimeout(); std::string getBackButtonBehavior(); diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index 9a44f91f0..f2b81fbe0 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -95,8 +95,8 @@ int PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadControllerIn pInfo->touchPadInfo.pixelDensity = 1; pInfo->touchPadInfo.resolution.x = 1920; pInfo->touchPadInfo.resolution.y = 950; - pInfo->stickInfo.deadZoneLeft = 2; - pInfo->stickInfo.deadZoneRight = 2; + pInfo->stickInfo.deadZoneLeft = Config::leftDeadZone(); + pInfo->stickInfo.deadZoneRight = Config::rightDeadZone(); pInfo->connectionType = ORBIS_PAD_PORT_TYPE_STANDARD; pInfo->connectedCount = 1; pInfo->connected = false; @@ -106,8 +106,8 @@ int PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadControllerIn pInfo->touchPadInfo.pixelDensity = 1; pInfo->touchPadInfo.resolution.x = 1920; pInfo->touchPadInfo.resolution.y = 950; - pInfo->stickInfo.deadZoneLeft = 2; - pInfo->stickInfo.deadZoneRight = 2; + pInfo->stickInfo.deadZoneLeft = Config::leftDeadZone(); + pInfo->stickInfo.deadZoneRight = Config::rightDeadZone(); pInfo->connectionType = ORBIS_PAD_PORT_TYPE_STANDARD; pInfo->connectedCount = 1; pInfo->connected = true; From 269ce126149700ba340d7014a04faa215ddf64f9 Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Sat, 18 Jan 2025 16:54:06 +0300 Subject: [PATCH 096/455] fix build on arch --- src/video_core/renderer_vulkan/vk_instance.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 15bd573ef..5efdf4127 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -566,7 +566,8 @@ void Instance::CollectToolingInfo() { return; } for (const vk::PhysicalDeviceToolProperties& tool : tools) { - LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", tool.name); + const std::string_view name = tool.name; + LOG_INFO(Render_Vulkan, "Attached debugging tool: {}", name); } } From 746f2e091d3aa1c56cf56e0a16c858d01eaf31cd Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 19 Jan 2025 03:06:31 -0800 Subject: [PATCH 097/455] tile: Account for thickness in micro tiled size calculation. (#2185) --- src/video_core/texture_cache/image_info.cpp | 10 ++++++---- src/video_core/texture_cache/tile.h | 10 +++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index a9ed76960..8068aae2f 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -166,6 +166,7 @@ void ImageInfo::UpdateSize() { mip_w = std::max(mip_w, 1u); mip_h = std::max(mip_h, 1u); auto mip_d = std::max(size.depth >> mip, 1u); + auto thickness = 1; if (props.is_pow2) { mip_w = std::bit_ceil(mip_w); @@ -181,12 +182,13 @@ void ImageInfo::UpdateSize() { break; } case AmdGpu::TilingMode::Texture_Volume: - mip_d += (-mip_d) & 3u; + thickness = 4; + mip_d += (-mip_d) & (thickness - 1); [[fallthrough]]; case AmdGpu::TilingMode::Display_MicroTiled: case AmdGpu::TilingMode::Texture_MicroTiled: { std::tie(mip_info.pitch, mip_info.size) = - ImageSizeMicroTiled(mip_w, mip_h, bpp, num_samples); + ImageSizeMicroTiled(mip_w, mip_h, bpp, thickness, num_samples); mip_info.height = std::max(mip_h, 8u); if (props.is_block) { mip_info.pitch = std::max(mip_info.pitch * 4, 32u); @@ -198,8 +200,8 @@ void ImageInfo::UpdateSize() { case AmdGpu::TilingMode::Texture_MacroTiled: case AmdGpu::TilingMode::Depth_MacroTiled: { ASSERT(!props.is_block); - std::tie(mip_info.pitch, mip_info.size) = - ImageSizeMacroTiled(mip_w, mip_h, bpp, num_samples, tiling_idx, mip, alt_tile); + std::tie(mip_info.pitch, mip_info.size) = ImageSizeMacroTiled( + mip_w, mip_h, thickness, bpp, num_samples, tiling_idx, mip, alt_tile); break; } default: { diff --git a/src/video_core/texture_cache/tile.h b/src/video_core/texture_cache/tile.h index 532bf3d88..c111e6aca 100644 --- a/src/video_core/texture_cache/tile.h +++ b/src/video_core/texture_cache/tile.h @@ -308,20 +308,20 @@ constexpr std::pair ImageSizeLinearAligned(u32 pitch, u32 height, u return {pitch_aligned, (log_sz * bpp + 7) / 8}; } -constexpr std::pair ImageSizeMicroTiled(u32 pitch, u32 height, u32 bpp, +constexpr std::pair ImageSizeMicroTiled(u32 pitch, u32 height, u32 thickness, u32 bpp, u32 num_samples) { const auto& [pitch_align, height_align] = micro_tile_extent; auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); const auto height_aligned = (height + height_align - 1) & ~(height_align - 1); - size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; + size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples * thickness + 7) / 8; while (log_sz % 256) { - pitch_aligned += 8; + pitch_aligned += pitch_align; log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; } return {pitch_aligned, log_sz}; } -constexpr std::pair ImageSizeMacroTiled(u32 pitch, u32 height, u32 bpp, +constexpr std::pair ImageSizeMacroTiled(u32 pitch, u32 height, u32 thickness, u32 bpp, u32 num_samples, u32 tiling_idx, u32 mip_n, bool alt) { const auto& [pitch_align, height_align] = @@ -335,7 +335,7 @@ constexpr std::pair ImageSizeMacroTiled(u32 pitch, u32 height, u32 } if (downgrade_to_micro) { - return ImageSizeMicroTiled(pitch, height, bpp, num_samples); + return ImageSizeMicroTiled(pitch, height, thickness, bpp, num_samples); } const auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); From ec0dfb32b532fe2ddc28b3a1e65343e71cfcd92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sun, 19 Jan 2025 19:03:15 +0700 Subject: [PATCH 098/455] Some ImGui tweaks for the game window (#2183) * Remove window border * Remove window rounding * Set background color to black --- src/video_core/renderer_vulkan/vk_presenter.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 36d64a5d5..35ab4318a 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -825,6 +825,9 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { { // Draw the game ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{0.0f}); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0f, 0.0f, 0.0f, 1.0f)); ImGui::SetNextWindowDockID(dockId, ImGuiCond_Once); ImGui::Begin("Display##game_display", nullptr, ImGuiWindowFlags_NoNav); @@ -840,7 +843,8 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { static_cast(imgRect.extent.height), }); ImGui::End(); - ImGui::PopStyleVar(); + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(); } ImGui::Core::Render(cmdbuf, swapchain_image_view, swapchain.GetExtent()); From a7d45231b77633361862ef82cfafeb4d2a4669ac Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 19 Jan 2025 15:44:57 +0200 Subject: [PATCH 099/455] Filesystem devices (#2184) * added dummy devices * More WIP * added urandom,srandom,random,console,deci_tty6 devices * small fix * macOS fix --- CMakeLists.txt | 10 ++++ src/core/devices/deci_tty6.cpp | 66 +++++++++++++++++++++ src/core/devices/deci_tty6.h | 33 +++++++++++ src/core/devices/dev_console.cpp | 67 +++++++++++++++++++++ src/core/devices/dev_console.h | 33 +++++++++++ src/core/devices/random.cpp | 68 ++++++++++++++++++++++ src/core/devices/random.h | 33 +++++++++++ src/core/devices/srandom.cpp | 69 ++++++++++++++++++++++ src/core/devices/srandom.h | 33 +++++++++++ src/core/devices/urandom.cpp | 71 +++++++++++++++++++++++ src/core/devices/urandom.h | 33 +++++++++++ src/core/libraries/kernel/file_system.cpp | 33 ++++------- 12 files changed, 527 insertions(+), 22 deletions(-) create mode 100644 src/core/devices/deci_tty6.cpp create mode 100644 src/core/devices/deci_tty6.h create mode 100644 src/core/devices/dev_console.cpp create mode 100644 src/core/devices/dev_console.h create mode 100644 src/core/devices/random.cpp create mode 100644 src/core/devices/random.h create mode 100644 src/core/devices/srandom.cpp create mode 100644 src/core/devices/srandom.h create mode 100644 src/core/devices/urandom.cpp create mode 100644 src/core/devices/urandom.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 30cb033ed..e5c16bd1b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -557,6 +557,16 @@ set(CORE src/core/aerolib/stubs.cpp src/core/devices/logger.cpp src/core/devices/logger.h src/core/devices/nop_device.h + src/core/devices/dev_console.cpp + src/core/devices/dev_console.h + src/core/devices/deci_tty6.cpp + src/core/devices/deci_tty6.h + src/core/devices/random.cpp + src/core/devices/random.h + src/core/devices/urandom.cpp + src/core/devices/urandom.h + src/core/devices/srandom.cpp + src/core/devices/srandom.h src/core/file_format/pfs.h src/core/file_format/pkg.cpp src/core/file_format/pkg.h diff --git a/src/core/devices/deci_tty6.cpp b/src/core/devices/deci_tty6.cpp new file mode 100644 index 000000000..20423de61 --- /dev/null +++ b/src/core/devices/deci_tty6.cpp @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "deci_tty6.h" + +namespace Core::Devices { +std::shared_ptr DeciTty6Device::Create(u32 handle, const char*, int, u16) { + return std::shared_ptr( + reinterpret_cast(new DeciTty6Device(handle))); +} +int DeciTty6Device::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 DeciTty6Device::write(const void* buf, size_t nbytes) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t DeciTty6Device::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t DeciTty6Device::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 DeciTty6Device::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 DeciTty6Device::lseek(s64 offset, int whence) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 DeciTty6Device::read(void* buf, size_t nbytes) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int DeciTty6Device::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s32 DeciTty6Device::fsync() { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int DeciTty6Device::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int DeciTty6Device::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 DeciTty6Device::pwrite(const void* buf, size_t nbytes, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/deci_tty6.h b/src/core/devices/deci_tty6.h new file mode 100644 index 000000000..71cbfba6b --- /dev/null +++ b/src/core/devices/deci_tty6.h @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include +#include "base_device.h" + +namespace Core::Devices { + +class DeciTty6Device final : BaseDevice { + u32 handle; + +public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); + explicit DeciTty6Device(u32 handle) : handle(handle) {} + + ~DeciTty6Device() override = default; + + int ioctl(u64 cmd, Common::VaCtx* args) override; + s64 write(const void* buf, size_t nbytes) override; + size_t readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + size_t writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + s64 preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) override; + s64 lseek(s64 offset, int whence) override; + s64 read(void* buf, size_t nbytes) override; + int fstat(Libraries::Kernel::OrbisKernelStat* sb) override; + s32 fsync() override; + int ftruncate(s64 length) override; + int getdents(void* buf, u32 nbytes, s64* basep) override; + s64 pwrite(const void* buf, size_t nbytes, u64 offset) override; +}; + +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/dev_console.cpp b/src/core/devices/dev_console.cpp new file mode 100644 index 000000000..0ddcfd040 --- /dev/null +++ b/src/core/devices/dev_console.cpp @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "dev_console.h" + +namespace Core::Devices { +std::shared_ptr ConsoleDevice::Create(u32 handle, const char*, int, u16) { + return std::shared_ptr( + reinterpret_cast(new ConsoleDevice(handle))); +} +int ConsoleDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 ConsoleDevice::write(const void* buf, size_t nbytes) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t ConsoleDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t ConsoleDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 ConsoleDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 ConsoleDevice::lseek(s64 offset, int whence) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 ConsoleDevice::read(void* buf, size_t nbytes) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int ConsoleDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s32 ConsoleDevice::fsync() { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int ConsoleDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int ConsoleDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 ConsoleDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/dev_console.h b/src/core/devices/dev_console.h new file mode 100644 index 000000000..f280200e2 --- /dev/null +++ b/src/core/devices/dev_console.h @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include +#include "base_device.h" + +namespace Core::Devices { + +class ConsoleDevice final : BaseDevice { + u32 handle; + +public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); + explicit ConsoleDevice(u32 handle) : handle(handle) {} + + ~ConsoleDevice() override = default; + + int ioctl(u64 cmd, Common::VaCtx* args) override; + s64 write(const void* buf, size_t nbytes) override; + size_t readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + size_t writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + s64 preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) override; + s64 lseek(s64 offset, int whence) override; + s64 read(void* buf, size_t nbytes) override; + int fstat(Libraries::Kernel::OrbisKernelStat* sb) override; + s32 fsync() override; + int ftruncate(s64 length) override; + int getdents(void* buf, u32 nbytes, s64* basep) override; + s64 pwrite(const void* buf, size_t nbytes, u64 offset) override; +}; + +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/random.cpp b/src/core/devices/random.cpp new file mode 100644 index 000000000..705449423 --- /dev/null +++ b/src/core/devices/random.cpp @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include "common/logging/log.h" +#include "random.h" + +namespace Core::Devices { +std::shared_ptr RandomDevice::Create(u32 handle, const char*, int, u16) { + std::srand(std::time(nullptr)); + return std::shared_ptr( + reinterpret_cast(new RandomDevice(handle))); +} +int RandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 RandomDevice::write(const void* buf, size_t nbytes) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t RandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t RandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 RandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 RandomDevice::lseek(s64 offset, int whence) { + return 0; +} + +s64 RandomDevice::read(void* buf, size_t nbytes) { + auto rbuf = static_cast(buf); + for (size_t i = 0; i < nbytes; i++) + rbuf[i] = std::rand() & 0xFF; + return nbytes; +} + +int RandomDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s32 RandomDevice::fsync() { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int RandomDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int RandomDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 RandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/random.h b/src/core/devices/random.h new file mode 100644 index 000000000..3bbed1ca2 --- /dev/null +++ b/src/core/devices/random.h @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include +#include "base_device.h" + +namespace Core::Devices { + +class RandomDevice final : BaseDevice { + u32 handle; + +public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); + explicit RandomDevice(u32 handle) : handle(handle) {} + + ~RandomDevice() override = default; + + int ioctl(u64 cmd, Common::VaCtx* args) override; + s64 write(const void* buf, size_t nbytes) override; + size_t readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + size_t writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + s64 preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) override; + s64 lseek(s64 offset, int whence) override; + s64 read(void* buf, size_t nbytes) override; + int fstat(Libraries::Kernel::OrbisKernelStat* sb) override; + s32 fsync() override; + int ftruncate(s64 length) override; + int getdents(void* buf, u32 nbytes, s64* basep) override; + s64 pwrite(const void* buf, size_t nbytes, u64 offset) override; +}; + +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/srandom.cpp b/src/core/devices/srandom.cpp new file mode 100644 index 000000000..ff80adeaf --- /dev/null +++ b/src/core/devices/srandom.cpp @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include "common/logging/log.h" +#include "srandom.h" + +namespace Core::Devices { +std::shared_ptr SRandomDevice::Create(u32 handle, const char*, int, u16) { + std::srand(std::time(nullptr)); + return std::shared_ptr( + reinterpret_cast(new SRandomDevice(handle))); +} +int SRandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 SRandomDevice::write(const void* buf, size_t nbytes) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t SRandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t SRandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 SRandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 SRandomDevice::lseek(s64 offset, int whence) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 SRandomDevice::read(void* buf, size_t nbytes) { + auto rbuf = static_cast(buf); + for (size_t i = 0; i < nbytes; i++) + rbuf[i] = std::rand(); + return nbytes; +} + +int SRandomDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s32 SRandomDevice::fsync() { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return s32(); +} + +int SRandomDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int SRandomDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 SRandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/srandom.h b/src/core/devices/srandom.h new file mode 100644 index 000000000..3a3b02571 --- /dev/null +++ b/src/core/devices/srandom.h @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include +#include "base_device.h" + +namespace Core::Devices { + +class SRandomDevice final : BaseDevice { + u32 handle; + +public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); + explicit SRandomDevice(u32 handle) : handle(handle) {} + + ~SRandomDevice() override = default; + + int ioctl(u64 cmd, Common::VaCtx* args) override; + s64 write(const void* buf, size_t nbytes) override; + size_t readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + size_t writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + s64 preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) override; + s64 lseek(s64 offset, int whence) override; + s64 read(void* buf, size_t nbytes) override; + int fstat(Libraries::Kernel::OrbisKernelStat* sb) override; + s32 fsync() override; + int ftruncate(s64 length) override; + int getdents(void* buf, u32 nbytes, s64* basep) override; + s64 pwrite(const void* buf, size_t nbytes, u64 offset) override; +}; + +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/urandom.cpp b/src/core/devices/urandom.cpp new file mode 100644 index 000000000..8917caea5 --- /dev/null +++ b/src/core/devices/urandom.cpp @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include "common/logging/log.h" +#include "urandom.h" + +namespace Core::Devices { + +std::shared_ptr URandomDevice::Create(u32 handle, const char*, int, u16) { + std::srand(std::time(nullptr)); + return std::shared_ptr( + reinterpret_cast(new URandomDevice(handle))); +} + +int URandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 URandomDevice::write(const void* buf, size_t nbytes) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t URandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +size_t URandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 URandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +s64 URandomDevice::lseek(s64 offset, int whence) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 URandomDevice::read(void* buf, size_t nbytes) { + auto rbuf = static_cast(buf); + for (size_t i = 0; i < nbytes; i++) + rbuf[i] = std::rand() & 0xFF; + return nbytes; +} + +int URandomDevice::fstat(Libraries::Kernel::OrbisKernelStat* sb) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s32 URandomDevice::fsync() { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int URandomDevice::ftruncate(s64 length) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +int URandomDevice::getdents(void* buf, u32 nbytes, s64* basep) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} + +s64 URandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { + LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); + return 0; +} +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/urandom.h b/src/core/devices/urandom.h new file mode 100644 index 000000000..9370017d5 --- /dev/null +++ b/src/core/devices/urandom.h @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +#include +#include "base_device.h" + +namespace Core::Devices { + +class URandomDevice final : BaseDevice { + u32 handle; + +public: + static std::shared_ptr Create(u32 handle, const char*, int, u16); + explicit URandomDevice(u32 handle) : handle(handle) {} + + ~URandomDevice() override = default; + + int ioctl(u64 cmd, Common::VaCtx* args) override; + s64 write(const void* buf, size_t nbytes) override; + size_t readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + size_t writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override; + s64 preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) override; + s64 lseek(s64 offset, int whence) override; + s64 read(void* buf, size_t nbytes) override; + int fstat(Libraries::Kernel::OrbisKernelStat* sb) override; + s32 fsync() override; + int ftruncate(s64 length) override; + int getdents(void* buf, u32 nbytes, s64* basep) override; + s64 pwrite(const void* buf, size_t nbytes, u64 offset) override; +}; + +} // namespace Core::Devices \ No newline at end of file diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 2eb5d1621..ce91fe192 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -8,8 +8,13 @@ #include "common/logging/log.h" #include "common/scope_exit.h" #include "common/singleton.h" +#include "core/devices/deci_tty6.h" +#include "core/devices/dev_console.h" #include "core/devices/logger.h" #include "core/devices/nop_device.h" +#include "core/devices/random.h" +#include "core/devices/srandom.h" +#include "core/devices/urandom.h" #include "core/file_sys/fs.h" #include "core/libraries/kernel/file_system.h" #include "core/libraries/kernel/orbis_error.h" @@ -41,6 +46,12 @@ static std::map available_device = { {"/dev/deci_stderr", GET_DEVICE_FD(2)}, {"/dev/null", GET_DEVICE_FD(0)}, // fd0 (stdin) is a nop device + + {"/dev/urandom", &D::URandomDevice::Create }, + {"/dev/random", &D::RandomDevice::Create }, + {"/dev/srandom", &D::SRandomDevice::Create }, + {"/dev/console", &D::ConsoleDevice::Create }, + {"/dev/deci_tty6",&D::DeciTty6Device::Create } // clang-format on }; @@ -67,17 +78,6 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { bool directory = (flags & ORBIS_KERNEL_O_DIRECTORY) != 0; std::string_view path{raw_path}; - - if (path == "/dev/console") { - return 2000; - } - if (path == "/dev/deci_tty6") { - return 2001; - } - if (path == "/dev/urandom") { - return 2003; - } - u32 handle = h->CreateHandle(); auto* file = h->GetFile(handle); @@ -167,9 +167,6 @@ int PS4_SYSV_ABI sceKernelClose(int d) { if (d < 3) { // d probably hold an error code return ORBIS_KERNEL_ERROR_EPERM; } - if (d == 2003) { // dev/urandom case - return ORBIS_OK; - } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(d); if (file == nullptr) { @@ -337,13 +334,6 @@ s64 PS4_SYSV_ABI posix_lseek(int d, s64 offset, int whence) { } s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes) { - if (d == 2003) // dev urandom case - { - auto rbuf = static_cast(buf); - for (size_t i = 0; i < nbytes; i++) - rbuf[i] = std::rand() & 0xFF; - return nbytes; - } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(d); if (file == nullptr) { @@ -757,7 +747,6 @@ s32 PS4_SYSV_ABI sceKernelRename(const char* from, const char* to) { } void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) { - std::srand(std::time(nullptr)); LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open); LIB_FUNCTION("wuCroIGjt2g", "libkernel", 1, "libkernel", 1, 1, open); From c8bbecda2654e4cb0825cfce396942142ab3d19f Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 19 Jan 2025 12:45:24 -0300 Subject: [PATCH 100/455] Devtools: Close Button ( X ) (#2187) --- src/core/devtools/layer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index c652849e7..a6d99b49b 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -93,6 +93,12 @@ void L::DrawMenuBar() { } ImGui::EndMenu(); } + + SameLine(ImGui::GetWindowWidth() - 30.0f); + if (Button("X", ImVec2(25, 25))) { + DebugState.IsShowingDebugMenuBar() = false; + } + EndMainMenuBar(); } From 17ac63d23a4abd046854a852642bd093a28108d7 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 19 Jan 2025 12:47:40 -0300 Subject: [PATCH 101/455] Fix SurfaceFormat (#2188) --- src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 9695e127f..4ac8d5cc8 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -612,7 +612,7 @@ std::span SurfaceFormats() { vk::Format::eB5G6R5UnormPack16), // 1_5_5_5 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format1_5_5_5, AmdGpu::NumberFormat::Unorm, - vk::Format::eR5G5B5A1UnormPack16), + vk::Format::eA1B5G5R5UnormPack16), // 5_5_5_1 - Remapped to 1_5_5_5. // 4_4_4_4 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format4_4_4_4, AmdGpu::NumberFormat::Unorm, From 201f2817ca929d54460bfd5e18d3a23b0cad65c5 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 19 Jan 2025 18:55:27 -0300 Subject: [PATCH 102/455] Fix SurfaceFormat Format1_5_5_5 - Format5_5_5_1 (#2191) * Fix SurfaceFormat Format1_5_5_5 - again * Fix Format5_5_5_1 --- src/video_core/amdgpu/types.h | 11 +++++++++-- src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 6 ++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index 57f97418a..63e184cc5 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -283,8 +283,7 @@ inline CompMapping RemapSwizzle(const DataFormat format, const CompMapping swizz result.a = swizzle.a; return result; } - case DataFormat::Format10_10_10_2: - case DataFormat::Format5_5_5_1: { + case DataFormat::Format10_10_10_2: { CompMapping result; result.r = swizzle.a; result.g = swizzle.b; @@ -292,6 +291,14 @@ inline CompMapping RemapSwizzle(const DataFormat format, const CompMapping swizz result.a = swizzle.r; return result; } + case DataFormat::Format1_5_5_5: { + CompMapping result; + result.r = swizzle.b; + result.g = swizzle.g; + result.b = swizzle.r; + result.a = swizzle.a; + return result; + } default: return swizzle; } diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 4ac8d5cc8..35585edb7 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -612,8 +612,10 @@ std::span SurfaceFormats() { vk::Format::eB5G6R5UnormPack16), // 1_5_5_5 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format1_5_5_5, AmdGpu::NumberFormat::Unorm, - vk::Format::eA1B5G5R5UnormPack16), - // 5_5_5_1 - Remapped to 1_5_5_5. + vk::Format::eA1R5G5B5UnormPack16), + // 5_5_5_1 + CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format5_5_5_1, AmdGpu::NumberFormat::Unorm, + vk::Format::eR5G5B5A1UnormPack16), // 4_4_4_4 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format4_4_4_4, AmdGpu::NumberFormat::Unorm, vk::Format::eR4G4B4A4UnormPack16), From 80092b6367e1aa230fb6e72fb304a0828061d409 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 19 Jan 2025 20:09:10 -0300 Subject: [PATCH 103/455] Fix SurfaceFormat Format4_4_4_4 (#2193) * Fix SurfaceFormat Format4_4_4_4 Pac-Man 256 * add_extension --- src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 2 +- src/video_core/renderer_vulkan/vk_instance.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 35585edb7..f2fbc6530 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -618,7 +618,7 @@ std::span SurfaceFormats() { vk::Format::eR5G5B5A1UnormPack16), // 4_4_4_4 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format4_4_4_4, AmdGpu::NumberFormat::Unorm, - vk::Format::eR4G4B4A4UnormPack16), + vk::Format::eA4B4G4R4UnormPack16), // 8_24 // 24_8 // X24_8_32 diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 5efdf4127..d183d6b09 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -283,6 +283,7 @@ bool Instance::CreateDevice() { add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME); add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); + add_extension(VK_EXT_4444_FORMATS_EXTENSION_NAME); #ifdef __APPLE__ // Required by Vulkan spec if supported. From d14e57f6a8bf327db8a032382fcaefa0b441fd1c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:45:34 -0800 Subject: [PATCH 104/455] hotfix: Move some command buffer references down. Prevents references becoming stale due to stream buffer flushes. --- src/video_core/buffer_cache/buffer_cache.cpp | 2 +- src/video_core/texture_cache/texture_cache.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 487544a21..11ad0e96f 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -210,7 +210,6 @@ void BufferCache::InlineData(VAddr address, const void* value, u32 num_bytes, bo return; } scheduler.EndRendering(); - const auto cmdbuf = scheduler.CommandBuffer(); const Buffer* buffer = [&] { if (is_gds) { return &gds_buffer; @@ -218,6 +217,7 @@ void BufferCache::InlineData(VAddr address, const void* value, u32 num_bytes, bo const BufferId buffer_id = FindBuffer(address, num_bytes); return &slot_buffers[buffer_id]; }(); + const auto cmdbuf = scheduler.CommandBuffer(); const vk::BufferMemoryBarrier2 pre_barrier = { .srcStageMask = vk::PipelineStageFlagBits2::eAllCommands, .srcAccessMask = vk::AccessFlagBits2::eMemoryRead, diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index a281b89c9..5947db864 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -545,12 +545,12 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule auto* sched_ptr = custom_scheduler ? custom_scheduler : &scheduler; sched_ptr->EndRendering(); - const auto cmdbuf = sched_ptr->CommandBuffer(); const VAddr image_addr = image.info.guest_address; const size_t image_size = image.info.guest_size; const auto [vk_buffer, buf_offset] = buffer_cache.ObtainViewBuffer(image_addr, image_size, is_gpu_dirty); + const auto cmdbuf = sched_ptr->CommandBuffer(); // The obtained buffer may be written by a shader so we need to emit a barrier to prevent RAW // hazard if (auto barrier = vk_buffer->GetBarrier(vk::AccessFlagBits2::eTransferRead, From 4fa501c8d525a6afa3ae36134b26e2dc8007a24e Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 19 Jan 2025 21:12:42 -0600 Subject: [PATCH 105/455] Additional libSceNpManager functions and cleanup (#2195) * Error return on sceNpGetAccountIdA Confirmed through hardware testing, this returns ORBIS_NP_ERROR_SIGNED_OUT on a signed out console. Parameters are based on fpPS4 code. * Fix compile * Move errors to separate file * Cleanup function headers Swaps user_ids to use our OrbisUserServiceUserId type, and fixes parameter names to align with our coding standards. * Add proper parameter checks * Implement sceNpGetAccountId This function takes an online_id, uses an NpManager function to get the user_id, then uses that user_id to perform the same internal functions as sceNpGetAccountIdA. * Implement sceNpHasSignedUp * Fix sceNpGetAccountId Further hardware testing shows that these always write 0 to account_id when failing. * Update np_manager.cpp --- src/core/libraries/np_manager/np_manager.cpp | 42 ++++++++++++++----- src/core/libraries/np_manager/np_manager.h | 14 +++---- .../libraries/np_manager/np_manager_error.h | 9 ++++ 3 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 src/core/libraries/np_manager/np_manager_error.h diff --git a/src/core/libraries/np_manager/np_manager.cpp b/src/core/libraries/np_manager/np_manager.cpp index e26c5a830..a60dcd86f 100644 --- a/src/core/libraries/np_manager/np_manager.cpp +++ b/src/core/libraries/np_manager/np_manager.cpp @@ -5,6 +5,7 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/np_manager/np_manager.h" +#include "core/libraries/np_manager/np_manager_error.h" #include "core/tls.h" namespace Libraries::NpManager { @@ -935,14 +936,22 @@ int PS4_SYSV_ABI sceNpGetAccountDateOfBirthA() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetAccountId() { - LOG_ERROR(Lib_NpManager, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNpGetAccountId(OrbisNpOnlineId* online_id, u64* account_id) { + LOG_DEBUG(Lib_NpManager, "called"); + if (online_id == nullptr || account_id == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } + *account_id = 0; + return ORBIS_NP_ERROR_SIGNED_OUT; } -int PS4_SYSV_ABI sceNpGetAccountIdA() { - LOG_ERROR(Lib_NpManager, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNpGetAccountIdA(OrbisUserServiceUserId user_id, u64* account_id) { + LOG_DEBUG(Lib_NpManager, "user_id {}", user_id); + if (account_id == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } + *account_id = 0; + return ORBIS_NP_ERROR_SIGNED_OUT; } int PS4_SYSV_ABI sceNpGetAccountLanguage() { @@ -972,6 +981,9 @@ int PS4_SYSV_ABI sceNpGetGamePresenceStatusA() { int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId user_id, OrbisNpId* np_id) { LOG_DEBUG(Lib_NpManager, "user_id {}", user_id); + if (np_id == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } return ORBIS_NP_ERROR_SIGNED_OUT; } @@ -980,8 +992,11 @@ int PS4_SYSV_ABI sceNpGetNpReachabilityState() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetOnlineId(s32 user_id, OrbisNpOnlineId* online_id) { +int PS4_SYSV_ABI sceNpGetOnlineId(OrbisUserServiceUserId user_id, OrbisNpOnlineId* online_id) { LOG_DEBUG(Lib_NpManager, "user_id {}", user_id); + if (online_id == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } return ORBIS_NP_ERROR_SIGNED_OUT; } @@ -995,7 +1010,10 @@ int PS4_SYSV_ABI sceNpGetParentalControlInfoA() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpGetState(s32 userId, OrbisNpState* state) { +int PS4_SYSV_ABI sceNpGetState(OrbisUserServiceUserId user_id, OrbisNpState* state) { + if (state == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } *state = OrbisNpState::SignedOut; LOG_DEBUG(Lib_NpManager, "Signed out"); return ORBIS_OK; @@ -1011,8 +1029,12 @@ int PS4_SYSV_ABI sceNpGetUserIdByOnlineId() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNpHasSignedUp() { - LOG_ERROR(Lib_NpManager, "(STUBBED) called"); +int PS4_SYSV_ABI sceNpHasSignedUp(OrbisUserServiceUserId user_id, bool* has_signed_up) { + LOG_DEBUG(Lib_NpManager, "called"); + if (has_signed_up == nullptr) { + return ORBIS_NP_ERROR_INVALID_ARGUMENT; + } + *has_signed_up = false; return ORBIS_OK; } diff --git a/src/core/libraries/np_manager/np_manager.h b/src/core/libraries/np_manager/np_manager.h index 6ba588e5e..02a1a32f6 100644 --- a/src/core/libraries/np_manager/np_manager.h +++ b/src/core/libraries/np_manager/np_manager.h @@ -11,8 +11,6 @@ class SymbolsResolver; namespace Libraries::NpManager { -constexpr int ORBIS_NP_ERROR_SIGNED_OUT = 0x80550006; - enum class OrbisNpState : u32 { Unknown = 0, SignedOut, SignedIn }; using OrbisNpStateCallbackForNpToolkit = PS4_SYSV_ABI void (*)(s32 userId, OrbisNpState state, @@ -220,22 +218,22 @@ int PS4_SYSV_ABI sceNpGetAccountCountry(); int PS4_SYSV_ABI sceNpGetAccountCountryA(); int PS4_SYSV_ABI sceNpGetAccountDateOfBirth(); int PS4_SYSV_ABI sceNpGetAccountDateOfBirthA(); -int PS4_SYSV_ABI sceNpGetAccountId(); -int PS4_SYSV_ABI sceNpGetAccountIdA(); +int PS4_SYSV_ABI sceNpGetAccountId(OrbisNpOnlineId* online_id, u64* account_id); +int PS4_SYSV_ABI sceNpGetAccountIdA(OrbisUserServiceUserId user_id, u64* account_id); int PS4_SYSV_ABI sceNpGetAccountLanguage(); int PS4_SYSV_ABI sceNpGetAccountLanguage2(); int PS4_SYSV_ABI sceNpGetAccountLanguageA(); int PS4_SYSV_ABI sceNpGetGamePresenceStatus(); int PS4_SYSV_ABI sceNpGetGamePresenceStatusA(); -int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId userId, OrbisNpId* npId); +int PS4_SYSV_ABI sceNpGetNpId(OrbisUserServiceUserId user_id, OrbisNpId* np_id); int PS4_SYSV_ABI sceNpGetNpReachabilityState(); -int PS4_SYSV_ABI sceNpGetOnlineId(s32 userId, OrbisNpOnlineId* onlineId); +int PS4_SYSV_ABI sceNpGetOnlineId(OrbisUserServiceUserId user_id, OrbisNpOnlineId* online_id); int PS4_SYSV_ABI sceNpGetParentalControlInfo(); int PS4_SYSV_ABI sceNpGetParentalControlInfoA(); -int PS4_SYSV_ABI sceNpGetState(s32 userId, OrbisNpState* state); +int PS4_SYSV_ABI sceNpGetState(OrbisUserServiceUserId user_id, OrbisNpState* state); int PS4_SYSV_ABI sceNpGetUserIdByAccountId(); int PS4_SYSV_ABI sceNpGetUserIdByOnlineId(); -int PS4_SYSV_ABI sceNpHasSignedUp(); +int PS4_SYSV_ABI sceNpHasSignedUp(OrbisUserServiceUserId user_id, bool* has_signed_up); int PS4_SYSV_ABI sceNpIdMapperAbortRequest(); int PS4_SYSV_ABI sceNpIdMapperAccountIdToNpId(); int PS4_SYSV_ABI sceNpIdMapperAccountIdToOnlineId(); diff --git a/src/core/libraries/np_manager/np_manager_error.h b/src/core/libraries/np_manager/np_manager_error.h new file mode 100644 index 000000000..4af0d08ef --- /dev/null +++ b/src/core/libraries/np_manager/np_manager_error.h @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/libraries/error_codes.h" + +constexpr int ORBIS_NP_ERROR_INVALID_ARGUMENT = 0x80550003; +constexpr int ORBIS_NP_ERROR_SIGNED_OUT = 0x80550006; \ No newline at end of file From 0f93edb377f50dcb462427cdda0eb9939f37de31 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 19 Jan 2025 21:20:51 -0600 Subject: [PATCH 106/455] Implement IMAGE_ATOMIC_SWAP (#2194) We already handle everything for this opcode in our IMAGE_ATOMIC function, so implementing this is fairly simple. Should improve Wipeout 3. --- src/shader_recompiler/frontend/format.cpp | 4 ++-- src/shader_recompiler/frontend/translate/vector_memory.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/shader_recompiler/frontend/format.cpp b/src/shader_recompiler/frontend/format.cpp index 9677be3e5..2fcac7c10 100644 --- a/src/shader_recompiler/frontend/format.cpp +++ b/src/shader_recompiler/frontend/format.cpp @@ -3420,8 +3420,8 @@ constexpr std::array InstructionFormatMIMG = {{ {InstClass::VectorMemImgUt, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32, ScalarType::Uint32}, // 15 = IMAGE_ATOMIC_SWAP - {InstClass::VectorMemImgNoSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined, - ScalarType::Undefined}, + {InstClass::VectorMemImgNoSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Uint32, + ScalarType::Uint32}, // 16 = IMAGE_ATOMIC_CMPSWAP {InstClass::VectorMemImgNoSmp, InstCategory::VectorMemory, 4, 1, ScalarType::Undefined, ScalarType::Undefined}, diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index 8fa0f3f87..685785af1 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -107,6 +107,8 @@ void Translator::EmitVectorMemory(const GcnInst& inst) { return IMAGE_GET_RESINFO(inst); // Image atomic operations + case Opcode::IMAGE_ATOMIC_SWAP: + return IMAGE_ATOMIC(AtomicOp::Swap, inst); case Opcode::IMAGE_ATOMIC_ADD: return IMAGE_ATOMIC(AtomicOp::Add, inst); case Opcode::IMAGE_ATOMIC_SMIN: From e1132db197def956132f08870258a1f8c21e9c99 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 19 Jan 2025 23:33:37 -0800 Subject: [PATCH 107/455] texture_cache: Prevent unregistered images from being tracked. (#2196) --- src/video_core/texture_cache/texture_cache.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 5947db864..798ecf030 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -643,6 +643,9 @@ void TextureCache::UnregisterImage(ImageId image_id) { void TextureCache::TrackImage(ImageId image_id) { auto& image = slot_images[image_id]; + if (!(image.flags & ImageFlagBits::Registered)) { + return; + } const auto image_begin = image.info.guest_address; const auto image_end = image.info.guest_address + image.info.guest_size; if (image_begin == image.track_addr && image_end == image.track_addr_end) { @@ -666,6 +669,9 @@ void TextureCache::TrackImage(ImageId image_id) { void TextureCache::TrackImageHead(ImageId image_id) { auto& image = slot_images[image_id]; + if (!(image.flags & ImageFlagBits::Registered)) { + return; + } const auto image_begin = image.info.guest_address; if (image_begin == image.track_addr) { return; @@ -678,6 +684,9 @@ void TextureCache::TrackImageHead(ImageId image_id) { void TextureCache::TrackImageTail(ImageId image_id) { auto& image = slot_images[image_id]; + if (!(image.flags & ImageFlagBits::Registered)) { + return; + } const auto image_end = image.info.guest_address + image.info.guest_size; if (image_end == image.track_addr_end) { return; From a3967ccdb43ebe5c8005dd35e72825497abbbb3d Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 20 Jan 2025 04:48:32 -0800 Subject: [PATCH 108/455] externals: Update vulkan-headers (#2197) --- CMakeLists.txt | 2 +- externals/vulkan-headers | 2 +- src/video_core/renderer_vulkan/vk_platform.cpp | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e5c16bd1b..918a1acb7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,7 +120,7 @@ find_package(SDL3 3.1.2 CONFIG) find_package(stb MODULE) find_package(toml11 4.2.0 CONFIG) find_package(tsl-robin-map 1.3.0 CONFIG) -find_package(VulkanHeaders 1.4.303 CONFIG) +find_package(VulkanHeaders 1.4.305 CONFIG) find_package(VulkanMemoryAllocator 3.1.0 CONFIG) find_package(xbyak 7.07 CONFIG) find_package(xxHash 0.8.2 MODULE) diff --git a/externals/vulkan-headers b/externals/vulkan-headers index 6a74a7d65..a03d2f6d5 160000 --- a/externals/vulkan-headers +++ b/externals/vulkan-headers @@ -1 +1 @@ -Subproject commit 6a74a7d65cafa19e38ec116651436cce6efd5b2e +Subproject commit a03d2f6d5753b365d704d58161825890baad0755 diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index fdd590e9d..07ebfbda6 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -28,19 +28,19 @@ static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_KHRONOS_validation"; static const char* const CRASH_DIAGNOSTIC_LAYER_NAME = "VK_LAYER_LUNARG_crash_diagnostic"; static VKAPI_ATTR VkBool32 VKAPI_CALL DebugUtilsCallback( - VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT type, - const VkDebugUtilsMessengerCallbackDataEXT* callback_data, void* user_data) { + vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, + const vk::DebugUtilsMessengerCallbackDataEXT* callback_data, void* user_data) { Common::Log::Level level{}; switch (severity) { - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: + case vk::DebugUtilsMessageSeverityFlagBitsEXT::eError: level = Common::Log::Level::Error; break; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: + case vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning: level = Common::Log::Level::Info; break; - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: - case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: + case vk::DebugUtilsMessageSeverityFlagBitsEXT::eInfo: + case vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose: level = Common::Log::Level::Debug; break; default: From 95a30b2b3e1aa4e20c3db632955cc67bbded0fb1 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 20 Jan 2025 13:38:09 -0800 Subject: [PATCH 109/455] texture_cache: Lock when updating image. (#2198) --- src/video_core/texture_cache/texture_cache.cpp | 6 ++---- src/video_core/texture_cache/texture_cache.h | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 798ecf030..04711539c 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -60,15 +60,13 @@ void TextureCache::MarkAsMaybeDirty(ImageId image_id, Image& image) { void TextureCache::InvalidateMemory(VAddr addr, size_t size) { std::scoped_lock lock{mutex}; - const auto end = addr + size; const auto pages_start = PageManager::GetPageAddr(addr); const auto pages_end = PageManager::GetNextPageAddr(addr + size - 1); ForEachImageInRegion(pages_start, pages_end - pages_start, [&](ImageId image_id, Image& image) { const auto image_begin = image.info.guest_address; const auto image_end = image.info.guest_address + image.info.guest_size; - if (image_begin < end && addr < image_end) { - // Start or end of the modified region is in the image, or the image is entirely within - // the modified region, so the image was definitely accessed by this page fault. + if (image.Overlaps(addr, size)) { + // Modified region overlaps image, so the image was definitely accessed by this fault. // Untrack the image, so that the range is unprotected and the guest can write freely. image.flags |= ImageFlagBits::CpuDirty; UntrackImage(image_id); diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 343a510e6..f262768ea 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -118,6 +118,7 @@ public: /// Updates image contents if it was modified by CPU. void UpdateImage(ImageId image_id, Vulkan::Scheduler* custom_scheduler = nullptr) { + std::scoped_lock lock{mutex}; Image& image = slot_images[image_id]; TrackImage(image_id); RefreshImage(image, custom_scheduler); From 3563b88d8c9b72474460233b13e4b28ac93e8bc1 Mon Sep 17 00:00:00 2001 From: polyproxy <47796739+polybiusproxy@users.noreply.github.com> Date: Tue, 21 Jan 2025 19:28:39 +0100 Subject: [PATCH 110/455] hotfix: use logger device on stdin --- CMakeLists.txt | 20 +++++++++---------- src/core/devices/base_device.cpp | 4 ++-- src/core/devices/base_device.h | 4 ++-- .../{dev_console.cpp => console_device.cpp} | 13 +++++++++--- .../{dev_console.h => console_device.h} | 4 ++-- .../{deci_tty6.cpp => deci_tty6_device.cpp} | 14 ++++++++++--- .../{deci_tty6.h => deci_tty6_device.h} | 4 ++-- src/core/devices/ioccom.h | 4 ++-- src/core/devices/logger.cpp | 8 +++++--- src/core/devices/logger.h | 4 ++-- src/core/devices/nop_device.h | 17 +++++++++++++--- .../devices/{random.cpp => random_device.cpp} | 18 +++++++++++++---- .../devices/{random.h => random_device.h} | 4 ++-- .../{srandom.cpp => srandom_device.cpp} | 18 +++++++++++++---- .../devices/{srandom.h => srandom_device.h} | 4 ++-- .../{urandom.cpp => urandom_device.cpp} | 16 +++++++++++---- .../devices/{urandom.h => urandom_device.h} | 4 ++-- src/core/file_sys/fs.cpp | 2 +- src/core/libraries/kernel/file_system.cpp | 17 +++++----------- 19 files changed, 114 insertions(+), 65 deletions(-) rename src/core/devices/{dev_console.cpp => console_device.cpp} (92%) rename src/core/devices/{dev_console.h => console_device.h} (90%) rename src/core/devices/{deci_tty6.cpp => deci_tty6_device.cpp} (92%) rename src/core/devices/{deci_tty6.h => deci_tty6_device.h} (90%) rename src/core/devices/{random.cpp => random_device.cpp} (90%) rename src/core/devices/{random.h => random_device.h} (90%) rename src/core/devices/{srandom.cpp => srandom_device.cpp} (90%) rename src/core/devices/{srandom.h => srandom_device.h} (90%) rename src/core/devices/{urandom.cpp => urandom_device.cpp} (90%) rename src/core/devices/{urandom.h => urandom_device.h} (90%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 918a1acb7..131809c8e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -557,16 +557,16 @@ set(CORE src/core/aerolib/stubs.cpp src/core/devices/logger.cpp src/core/devices/logger.h src/core/devices/nop_device.h - src/core/devices/dev_console.cpp - src/core/devices/dev_console.h - src/core/devices/deci_tty6.cpp - src/core/devices/deci_tty6.h - src/core/devices/random.cpp - src/core/devices/random.h - src/core/devices/urandom.cpp - src/core/devices/urandom.h - src/core/devices/srandom.cpp - src/core/devices/srandom.h + src/core/devices/console_device.cpp + src/core/devices/console_device.h + src/core/devices/deci_tty6_device.cpp + src/core/devices/deci_tty6_device.h + src/core/devices/random_device.cpp + src/core/devices/random_device.h + src/core/devices/urandom_device.cpp + src/core/devices/urandom_device.h + src/core/devices/srandom_device.cpp + src/core/devices/srandom_device.h src/core/file_format/pfs.h src/core/file_format/pkg.cpp src/core/file_format/pkg.h diff --git a/src/core/devices/base_device.cpp b/src/core/devices/base_device.cpp index 4f91c81c7..fc2a98a29 100644 --- a/src/core/devices/base_device.cpp +++ b/src/core/devices/base_device.cpp @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include "base_device.h" diff --git a/src/core/devices/base_device.h b/src/core/devices/base_device.h index 351af82b4..36614b8f4 100644 --- a/src/core/devices/base_device.h +++ b/src/core/devices/base_device.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/devices/dev_console.cpp b/src/core/devices/console_device.cpp similarity index 92% rename from src/core/devices/dev_console.cpp rename to src/core/devices/console_device.cpp index 0ddcfd040..f109cadb9 100644 --- a/src/core/devices/dev_console.cpp +++ b/src/core/devices/console_device.cpp @@ -1,34 +1,41 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" -#include "dev_console.h" +#include "console_device.h" namespace Core::Devices { + std::shared_ptr ConsoleDevice::Create(u32 handle, const char*, int, u16) { return std::shared_ptr( reinterpret_cast(new ConsoleDevice(handle))); } + int ConsoleDevice::ioctl(u64 cmd, Common::VaCtx* args) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 ConsoleDevice::write(const void* buf, size_t nbytes) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t ConsoleDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t ConsoleDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 ConsoleDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 ConsoleDevice::lseek(s64 offset, int whence) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; diff --git a/src/core/devices/dev_console.h b/src/core/devices/console_device.h similarity index 90% rename from src/core/devices/dev_console.h rename to src/core/devices/console_device.h index f280200e2..d4b590ba0 100644 --- a/src/core/devices/dev_console.h +++ b/src/core/devices/console_device.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include diff --git a/src/core/devices/deci_tty6.cpp b/src/core/devices/deci_tty6_device.cpp similarity index 92% rename from src/core/devices/deci_tty6.cpp rename to src/core/devices/deci_tty6_device.cpp index 20423de61..e7a5fd4fc 100644 --- a/src/core/devices/deci_tty6.cpp +++ b/src/core/devices/deci_tty6_device.cpp @@ -1,34 +1,41 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" -#include "deci_tty6.h" +#include "deci_tty6_device.h" namespace Core::Devices { + std::shared_ptr DeciTty6Device::Create(u32 handle, const char*, int, u16) { return std::shared_ptr( reinterpret_cast(new DeciTty6Device(handle))); } + int DeciTty6Device::ioctl(u64 cmd, Common::VaCtx* args) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 DeciTty6Device::write(const void* buf, size_t nbytes) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t DeciTty6Device::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t DeciTty6Device::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 DeciTty6Device::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 DeciTty6Device::lseek(s64 offset, int whence) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; @@ -63,4 +70,5 @@ s64 DeciTty6Device::pwrite(const void* buf, size_t nbytes, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/deci_tty6.h b/src/core/devices/deci_tty6_device.h similarity index 90% rename from src/core/devices/deci_tty6.h rename to src/core/devices/deci_tty6_device.h index 71cbfba6b..b8bd48556 100644 --- a/src/core/devices/deci_tty6.h +++ b/src/core/devices/deci_tty6_device.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include diff --git a/src/core/devices/ioccom.h b/src/core/devices/ioccom.h index 671ee33d4..2ded90bd8 100644 --- a/src/core/devices/ioccom.h +++ b/src/core/devices/ioccom.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/devices/logger.cpp b/src/core/devices/logger.cpp index 6f104509c..8dcb24a3b 100644 --- a/src/core/devices/logger.cpp +++ b/src/core/devices/logger.cpp @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #include "common/logging/log.h" #include "core/libraries/kernel/file_system.h" @@ -17,10 +17,12 @@ s64 Logger::write(const void* buf, size_t nbytes) { } size_t Logger::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { + size_t total_written = 0; for (int i = 0; i < iovcnt; i++) { log(static_cast(iov[i].iov_base), iov[i].iov_len); + total_written += iov[i].iov_len; } - return iovcnt; + return total_written; } s64 Logger::pwrite(const void* buf, size_t nbytes, u64 offset) { diff --git a/src/core/devices/logger.h b/src/core/devices/logger.h index bfb07f337..eef17bc4b 100644 --- a/src/core/devices/logger.h +++ b/src/core/devices/logger.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/devices/nop_device.h b/src/core/devices/nop_device.h index a75b92f1b..5518b1de1 100644 --- a/src/core/devices/nop_device.h +++ b/src/core/devices/nop_device.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "base_device.h" @@ -17,36 +17,47 @@ public: int ioctl(u64 cmd, Common::VaCtx* args) override { return 0; } + s64 write(const void* buf, size_t nbytes) override { return 0; } + size_t readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override { return 0; } + size_t writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override { - return 0; + return ORBIS_KERNEL_ERROR_EBADF; } + s64 preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) override { return 0; } + s64 lseek(s64 offset, int whence) override { return 0; } + s64 read(void* buf, size_t nbytes) override { return 0; } + int fstat(Libraries::Kernel::OrbisKernelStat* sb) override { return 0; } + s32 fsync() override { return 0; } + int ftruncate(s64 length) override { return 0; } + int getdents(void* buf, u32 nbytes, s64* basep) override { return 0; } + s64 pwrite(const void* buf, size_t nbytes, u64 offset) override { return 0; } diff --git a/src/core/devices/random.cpp b/src/core/devices/random_device.cpp similarity index 90% rename from src/core/devices/random.cpp rename to src/core/devices/random_device.cpp index 705449423..50934e3b8 100644 --- a/src/core/devices/random.cpp +++ b/src/core/devices/random_device.cpp @@ -1,43 +1,52 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #include #include "common/logging/log.h" -#include "random.h" +#include "random_device.h" namespace Core::Devices { + std::shared_ptr RandomDevice::Create(u32 handle, const char*, int, u16) { std::srand(std::time(nullptr)); return std::shared_ptr( reinterpret_cast(new RandomDevice(handle))); } + int RandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 RandomDevice::write(const void* buf, size_t nbytes) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t RandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t RandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 RandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 RandomDevice::lseek(s64 offset, int whence) { return 0; } s64 RandomDevice::read(void* buf, size_t nbytes) { auto rbuf = static_cast(buf); - for (size_t i = 0; i < nbytes; i++) + for (size_t i = 0; i < nbytes; i++) { rbuf[i] = std::rand() & 0xFF; + } return nbytes; } @@ -65,4 +74,5 @@ s64 RandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/random.h b/src/core/devices/random_device.h similarity index 90% rename from src/core/devices/random.h rename to src/core/devices/random_device.h index 3bbed1ca2..a5c8e9845 100644 --- a/src/core/devices/random.h +++ b/src/core/devices/random_device.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include diff --git a/src/core/devices/srandom.cpp b/src/core/devices/srandom_device.cpp similarity index 90% rename from src/core/devices/srandom.cpp rename to src/core/devices/srandom_device.cpp index ff80adeaf..ab78ddbe2 100644 --- a/src/core/devices/srandom.cpp +++ b/src/core/devices/srandom_device.cpp @@ -1,35 +1,43 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #include #include "common/logging/log.h" -#include "srandom.h" +#include "srandom_device.h" namespace Core::Devices { + std::shared_ptr SRandomDevice::Create(u32 handle, const char*, int, u16) { std::srand(std::time(nullptr)); return std::shared_ptr( reinterpret_cast(new SRandomDevice(handle))); } + int SRandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 SRandomDevice::write(const void* buf, size_t nbytes) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t SRandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t SRandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 SRandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 SRandomDevice::lseek(s64 offset, int whence) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; @@ -37,8 +45,9 @@ s64 SRandomDevice::lseek(s64 offset, int whence) { s64 SRandomDevice::read(void* buf, size_t nbytes) { auto rbuf = static_cast(buf); - for (size_t i = 0; i < nbytes; i++) + for (size_t i = 0; i < nbytes; i++) { rbuf[i] = std::rand(); + } return nbytes; } @@ -66,4 +75,5 @@ s64 SRandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/srandom.h b/src/core/devices/srandom_device.h similarity index 90% rename from src/core/devices/srandom.h rename to src/core/devices/srandom_device.h index 3a3b02571..cd32f7289 100644 --- a/src/core/devices/srandom.h +++ b/src/core/devices/srandom_device.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include diff --git a/src/core/devices/urandom.cpp b/src/core/devices/urandom_device.cpp similarity index 90% rename from src/core/devices/urandom.cpp rename to src/core/devices/urandom_device.cpp index 8917caea5..c001aab83 100644 --- a/src/core/devices/urandom.cpp +++ b/src/core/devices/urandom_device.cpp @@ -1,8 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #include #include "common/logging/log.h" -#include "urandom.h" +#include "urandom_device.h" namespace Core::Devices { @@ -16,22 +17,27 @@ int URandomDevice::ioctl(u64 cmd, Common::VaCtx* args) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 URandomDevice::write(const void* buf, size_t nbytes) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t URandomDevice::writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + size_t URandomDevice::readv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 URandomDevice::preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + s64 URandomDevice::lseek(s64 offset, int whence) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; @@ -39,8 +45,9 @@ s64 URandomDevice::lseek(s64 offset, int whence) { s64 URandomDevice::read(void* buf, size_t nbytes) { auto rbuf = static_cast(buf); - for (size_t i = 0; i < nbytes; i++) + for (size_t i = 0; i < nbytes; i++) { rbuf[i] = std::rand() & 0xFF; + } return nbytes; } @@ -68,4 +75,5 @@ s64 URandomDevice::pwrite(const void* buf, size_t nbytes, u64 offset) { LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); return 0; } + } // namespace Core::Devices \ No newline at end of file diff --git a/src/core/devices/urandom.h b/src/core/devices/urandom_device.h similarity index 90% rename from src/core/devices/urandom.h rename to src/core/devices/urandom_device.h index 9370017d5..b8a854cc0 100644 --- a/src/core/devices/urandom.h +++ b/src/core/devices/urandom_device.h @@ -1,5 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include diff --git a/src/core/file_sys/fs.cpp b/src/core/file_sys/fs.cpp index 7d456780b..8a191e666 100644 --- a/src/core/file_sys/fs.cpp +++ b/src/core/file_sys/fs.cpp @@ -233,7 +233,7 @@ void HandleTable::CreateStdHandles() { std::shared_ptr{reinterpret_cast(device)}; }; // order matters - setup("/dev/stdin", new Devices::NopDevice(0)); // stdin + setup("/dev/stdin", new Devices::Logger("stdin", false)); // stdin setup("/dev/stdout", new Devices::Logger("stdout", false)); // stdout setup("/dev/stderr", new Devices::Logger("stderr", true)); // stderr } diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index ce91fe192..b0f7fdafe 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -8,13 +8,13 @@ #include "common/logging/log.h" #include "common/scope_exit.h" #include "common/singleton.h" -#include "core/devices/deci_tty6.h" -#include "core/devices/dev_console.h" +#include "core/devices/deci_tty6_device.h" +#include "core/devices/console_device.h" #include "core/devices/logger.h" #include "core/devices/nop_device.h" -#include "core/devices/random.h" -#include "core/devices/srandom.h" -#include "core/devices/urandom.h" +#include "core/devices/random_device.h" +#include "core/devices/srandom_device.h" +#include "core/devices/urandom_device.h" #include "core/file_sys/fs.h" #include "core/libraries/kernel/file_system.h" #include "core/libraries/kernel/orbis_error.h" @@ -270,13 +270,6 @@ size_t PS4_SYSV_ABI _readv(int d, const SceKernelIovec* iov, int iovcnt) { } size_t PS4_SYSV_ABI _writev(int fd, const SceKernelIovec* iov, int iovcn) { - if (fd == 1) { - size_t total_written = 0; - for (int i = 0; i < iovcn; i++) { - total_written += ::fwrite(iov[i].iov_base, 1, iov[i].iov_len, stdout); - } - return total_written; - } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); if (file == nullptr) { From 84a341dce570c4a070d07bc023a757652247fb6f Mon Sep 17 00:00:00 2001 From: polyproxy <47796739+polybiusproxy@users.noreply.github.com> Date: Tue, 21 Jan 2025 19:30:34 +0100 Subject: [PATCH 111/455] remove BADF return --- src/core/devices/nop_device.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/devices/nop_device.h b/src/core/devices/nop_device.h index 5518b1de1..da9a3fc82 100644 --- a/src/core/devices/nop_device.h +++ b/src/core/devices/nop_device.h @@ -27,7 +27,7 @@ public: } size_t writev(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt) override { - return ORBIS_KERNEL_ERROR_EBADF; + return 0; } s64 preadv(const Libraries::Kernel::SceKernelIovec* iov, int iovcnt, u64 offset) override { From 41b39428335025e65f9e707ed8d5a9a1b09ba942 Mon Sep 17 00:00:00 2001 From: polyproxy <47796739+polybiusproxy@users.noreply.github.com> Date: Tue, 21 Jan 2025 19:34:05 +0100 Subject: [PATCH 112/455] clang-format --- src/core/file_sys/fs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/file_sys/fs.cpp b/src/core/file_sys/fs.cpp index 8a191e666..ec940503f 100644 --- a/src/core/file_sys/fs.cpp +++ b/src/core/file_sys/fs.cpp @@ -233,7 +233,7 @@ void HandleTable::CreateStdHandles() { std::shared_ptr{reinterpret_cast(device)}; }; // order matters - setup("/dev/stdin", new Devices::Logger("stdin", false)); // stdin + setup("/dev/stdin", new Devices::Logger("stdin", false)); // stdin setup("/dev/stdout", new Devices::Logger("stdout", false)); // stdout setup("/dev/stderr", new Devices::Logger("stderr", true)); // stderr } From 5c62a00134523c4d0b2f06e9b6c28c596631e748 Mon Sep 17 00:00:00 2001 From: polyproxy <47796739+polybiusproxy@users.noreply.github.com> Date: Tue, 21 Jan 2025 21:14:05 +0100 Subject: [PATCH 113/455] `clang-format` (again) --- src/core/libraries/kernel/file_system.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index b0f7fdafe..0150c11f5 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -8,8 +8,8 @@ #include "common/logging/log.h" #include "common/scope_exit.h" #include "common/singleton.h" -#include "core/devices/deci_tty6_device.h" #include "core/devices/console_device.h" +#include "core/devices/deci_tty6_device.h" #include "core/devices/logger.h" #include "core/devices/nop_device.h" #include "core/devices/random_device.h" From 2a4798cfa60f430840855a88339c1f4b364df9a4 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 22 Jan 2025 00:40:00 -0800 Subject: [PATCH 114/455] tile: Fix some tile thickness calculation errors. (#2203) * tile: Fix some tile thickness calculation errors. * tile: Do not pad mip height to tile height. --- src/video_core/texture_cache/image_info.cpp | 13 ++++++------- src/video_core/texture_cache/tile.h | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 8068aae2f..dd89be8aa 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -178,7 +178,6 @@ void ImageInfo::UpdateSize() { case AmdGpu::TilingMode::Display_Linear: { std::tie(mip_info.pitch, mip_info.size) = ImageSizeLinearAligned(mip_w, mip_h, bpp, num_samples); - mip_info.height = mip_h; break; } case AmdGpu::TilingMode::Texture_Volume: @@ -188,12 +187,7 @@ void ImageInfo::UpdateSize() { case AmdGpu::TilingMode::Display_MicroTiled: case AmdGpu::TilingMode::Texture_MicroTiled: { std::tie(mip_info.pitch, mip_info.size) = - ImageSizeMicroTiled(mip_w, mip_h, bpp, thickness, num_samples); - mip_info.height = std::max(mip_h, 8u); - if (props.is_block) { - mip_info.pitch = std::max(mip_info.pitch * 4, 32u); - mip_info.height = std::max(mip_info.height * 4, 32u); - } + ImageSizeMicroTiled(mip_w, mip_h, thickness, bpp, num_samples); break; } case AmdGpu::TilingMode::Display_MacroTiled: @@ -208,6 +202,11 @@ void ImageInfo::UpdateSize() { UNREACHABLE(); } } + mip_info.height = mip_h; + if (props.is_block) { + mip_info.pitch = std::max(mip_info.pitch * 4, 32u); + mip_info.height = std::max(mip_info.height * 4, 32u); + } mip_info.size *= mip_d; mip_info.offset = guest_size; mips_layout.emplace_back(mip_info); diff --git a/src/video_core/texture_cache/tile.h b/src/video_core/texture_cache/tile.h index c111e6aca..54938b801 100644 --- a/src/video_core/texture_cache/tile.h +++ b/src/video_core/texture_cache/tile.h @@ -313,8 +313,8 @@ constexpr std::pair ImageSizeMicroTiled(u32 pitch, u32 height, u32 const auto& [pitch_align, height_align] = micro_tile_extent; auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1); const auto height_aligned = (height + height_align - 1) & ~(height_align - 1); - size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples * thickness + 7) / 8; - while (log_sz % 256) { + size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; + while ((log_sz * thickness) % 256) { pitch_aligned += pitch_align; log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8; } From 78ae9613c5f0e40f30b5a5cea83fa368530f1c24 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 22 Jan 2025 04:07:43 -0600 Subject: [PATCH 115/455] Fix for address_space initialization on Windows (#2202) Should fix some `Region coalescing failed: Attempt to access invalid address.` crashes. Co-authored-by: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> --- src/core/address_space.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/core/address_space.cpp b/src/core/address_space.cpp index 2b7331cbd..e9fb8cfbc 100644 --- a/src/core/address_space.cpp +++ b/src/core/address_space.cpp @@ -67,28 +67,25 @@ struct AddressSpace::Impl { static constexpr size_t ReductionOnFail = 1_GB; static constexpr size_t MaxReductions = 10; - size_t reduction = 0; size_t virtual_size = SystemManagedSize + SystemReservedSize + UserSize; for (u32 i = 0; i < MaxReductions; i++) { - virtual_base = static_cast(VirtualAlloc2(process, NULL, virtual_size - reduction, + virtual_base = static_cast(VirtualAlloc2(process, NULL, virtual_size, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, ¶m, 1)); if (virtual_base) { break; } - reduction += ReductionOnFail; + virtual_size -= ReductionOnFail; } ASSERT_MSG(virtual_base, "Unable to reserve virtual address space: {}", Common::GetLastErrorMsg()); - // Take the reduction off of the system managed area, and leave the others unchanged. - reduction = size_t(virtual_base - SYSTEM_MANAGED_MIN); - system_managed_base = virtual_base; - system_managed_size = SystemManagedSize - reduction; system_reserved_base = reinterpret_cast(SYSTEM_RESERVED_MIN); system_reserved_size = SystemReservedSize; + system_managed_base = virtual_base; + system_managed_size = system_reserved_base - virtual_base; user_base = reinterpret_cast(USER_MIN); - user_size = UserSize; + user_size = virtual_base + virtual_size - user_base; LOG_INFO(Kernel_Vmm, "System managed virtual memory region: {} - {}", fmt::ptr(system_managed_base), @@ -101,10 +98,8 @@ struct AddressSpace::Impl { // Initializer placeholder tracker const uintptr_t system_managed_addr = reinterpret_cast(system_managed_base); - const uintptr_t system_reserved_addr = reinterpret_cast(system_reserved_base); - const uintptr_t user_addr = reinterpret_cast(user_base); regions.emplace(system_managed_addr, - MemoryRegion{system_managed_addr, virtual_size - reduction, false}); + MemoryRegion{system_managed_addr, virtual_size, false}); // Allocate backing file that represents the total physical memory. backing_handle = From adbff4056fe5a98026c2239ecd9511cd1be90e0f Mon Sep 17 00:00:00 2001 From: f3d209 <45915273+rootexpm@users.noreply.github.com> Date: Wed, 22 Jan 2025 10:10:35 +0000 Subject: [PATCH 116/455] Added ability to change save data path (#2199) * added ability to change save data path * get default save data path from fs * add copyright * formatting --- src/common/config.cpp | 15 +++ src/common/config.h | 2 + .../libraries/save_data/save_instance.cpp | 6 +- src/qt_gui/settings_dialog.cpp | 33 ++++- src/qt_gui/settings_dialog.ui | 121 +++++++++++------- src/qt_gui/translations/en.ts | 8 ++ 6 files changed, 132 insertions(+), 53 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index ed9af5a72..6e9db50ff 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -78,6 +78,7 @@ static std::string trophyKey; static bool load_game_size = true; std::vector settings_install_dirs = {}; std::filesystem::path settings_addon_install_dir = {}; +std::filesystem::path save_data_path = {}; u32 main_window_geometry_x = 400; u32 main_window_geometry_y = 400; u32 main_window_geometry_w = 1280; @@ -110,6 +111,13 @@ bool GetLoadGameSizeEnabled() { return load_game_size; } +std::filesystem::path GetSaveDataPath() { + if (save_data_path.empty()) { + return Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir); + } + return save_data_path; +} + void setLoadGameSizeEnabled(bool enable) { load_game_size = enable; } @@ -502,6 +510,10 @@ void setGameInstallDirs(const std::vector& settings_insta settings_install_dirs = settings_install_dirs_config; } +void setSaveDataPath(const std::filesystem::path& path) { + save_data_path = path; +} + u32 getMainWindowGeometryX() { return main_window_geometry_x; } @@ -690,6 +702,8 @@ void load(const std::filesystem::path& path) { addGameInstallDir(std::filesystem::path{dir}); } + save_data_path = toml::find_fs_path_or(gui, "saveDataPath", {}); + settings_addon_install_dir = toml::find_fs_path_or(gui, "addonInstallDir", {}); main_window_geometry_x = toml::find_or(gui, "geometry_x", 0); main_window_geometry_y = toml::find_or(gui, "geometry_y", 0); @@ -784,6 +798,7 @@ void save(const std::filesystem::path& path) { install_dirs.emplace_back(std::string{fmt::UTF(dirString.u8string()).data}); } data["GUI"]["installDirs"] = install_dirs; + data["GUI"]["saveDataPath"] = std::string{fmt::UTF(save_data_path.u8string()).data}; data["GUI"]["loadGameSizeEnabled"] = load_game_size; data["GUI"]["addonInstallDir"] = diff --git a/src/common/config.h b/src/common/config.h index cb56f99c7..564947f1e 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -18,6 +18,7 @@ void saveMainWindow(const std::filesystem::path& path); std::string getTrophyKey(); void setTrophyKey(std::string key); bool GetLoadGameSizeEnabled(); +std::filesystem::path GetSaveDataPath(); void setLoadGameSizeEnabled(bool enable); bool getIsFullscreen(); std::string getFullscreenMode(); @@ -82,6 +83,7 @@ void setUserName(const std::string& type); void setUpdateChannel(const std::string& type); void setSeparateUpdateEnabled(bool use); void setGameInstallDirs(const std::vector& settings_install_dirs_config); +void setSaveDataPath(const std::filesystem::path& path); void setCompatibilityEnabled(bool use); void setCheckCompatibilityOnStartup(bool use); diff --git a/src/core/libraries/save_data/save_instance.cpp b/src/core/libraries/save_data/save_instance.cpp index 99daf83cc..c2b7dca3c 100644 --- a/src/core/libraries/save_data/save_instance.cpp +++ b/src/core/libraries/save_data/save_instance.cpp @@ -47,15 +47,13 @@ namespace Libraries::SaveData { std::filesystem::path SaveInstance::MakeTitleSavePath(OrbisUserServiceUserId user_id, std::string_view game_serial) { - return Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / std::to_string(user_id) / - game_serial; + return Config::GetSaveDataPath() / std::to_string(user_id) / game_serial; } std::filesystem::path SaveInstance::MakeDirSavePath(OrbisUserServiceUserId user_id, std::string_view game_serial, std::string_view dir_name) { - return Common::FS::GetUserPath(Common::FS::PathType::SaveDataDir) / std::to_string(user_id) / - game_serial / dir_name; + return Config::GetSaveDataPath() / std::to_string(user_id) / game_serial / dir_name; } uint64_t SaveInstance::GetMaxBlockFromSFO(const PSF& psf) { diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 175c8c51d..5695d6232 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -202,6 +202,21 @@ SettingsDialog::SettingsDialog(std::span physical_devices, delete selected_item; } }); + + connect(ui->browseButton, &QPushButton::clicked, this, [this]() { + const auto save_data_path = Config::GetSaveDataPath(); + QString initial_path; + Common::FS::PathToQString(initial_path, save_data_path); + + QString save_data_path_string = + QFileDialog::getExistingDirectory(this, tr("Directory to save data"), initial_path); + + auto file_path = Common::FS::PathFromQString(save_data_path_string); + if (!file_path.empty()) { + Config::setSaveDataPath(file_path); + ui->currentSaveDataPath->setText(save_data_path_string); + } + }); } // DEBUG TAB @@ -256,6 +271,10 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->addFolderButton->installEventFilter(this); ui->removeFolderButton->installEventFilter(this); + ui->saveDataGroupBox->installEventFilter(this); + ui->currentSaveDataPath->installEventFilter(this); + ui->browseButton->installEventFilter(this); + // Debug ui->debugDump->installEventFilter(this); ui->vkValidationCheckBox->installEventFilter(this); @@ -286,6 +305,11 @@ void SettingsDialog::LoadValuesFromConfig() { const QVector languageIndexes = {21, 23, 14, 6, 18, 1, 12, 22, 2, 4, 25, 24, 29, 5, 0, 9, 15, 16, 17, 7, 26, 8, 11, 20, 3, 13, 27, 10, 19, 30, 28}; + const auto save_data_path = Config::GetSaveDataPath(); + QString save_data_path_string; + Common::FS::PathToQString(save_data_path_string, save_data_path); + ui->currentSaveDataPath->setText(save_data_path_string); + ui->consoleLanguageComboBox->setCurrentIndex( std::distance(languageIndexes.begin(), std::find(languageIndexes.begin(), languageIndexes.end(), @@ -497,6 +521,13 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { text = tr("removeFolderButton"); } + // Save Data + if (elementName == "saveDataGroupBox" || elementName == "currentSaveDataPath") { + text = tr("saveDataBox"); + } else if (elementName == "browseButton") { + text = tr("browseButton"); + } + // Debug if (elementName == "debugDump") { text = tr("debugDump"); @@ -603,4 +634,4 @@ void SettingsDialog::ResetInstallFolders() { } Config::setGameInstallDirs(settings_install_dirs_config); } -} +} \ No newline at end of file diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index c084d4849..d72a56973 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -53,7 +53,7 @@ - 0 + 3 @@ -67,8 +67,8 @@ 0 0 - 946 - 611 + 771 + 606 @@ -644,8 +644,8 @@ 0 0 - 946 - 605 + 455 + 252 @@ -928,8 +928,8 @@ 0 0 - 946 - 605 + 579 + 194 @@ -1178,51 +1178,76 @@ Paths - - - 0 - 0 - 946 - 605 - - - + - - - - - Game Folders - - - - - - 0 - - + + + Game Folders + + + + + - - Add... - + + Add... + - - + + - - Remove - + + Remove + - - - - - - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + - - - + + + + + + + + + + + Save Data Path + + + + + + + + true + + + + + + + Browse + + + + + + + @@ -1239,8 +1264,8 @@ 0 0 - 946 - 586 + 510 + 269 diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 9127df7e3..dc72d97c9 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -912,6 +912,14 @@ rdocCheckBox Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + + + browseButton + Browse:\nBrowse for a folder to set as the save data path. + CheatsPatches From 2968cf5a99a1be2fe7f3f28dbc65fe16f488c8af Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 22 Jan 2025 09:06:27 -0600 Subject: [PATCH 117/455] sceKernelVirtualQuery Fixes (#2204) --- src/core/memory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 619941000..f90d4e6aa 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -529,8 +529,8 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags, info->is_flexible.Assign(vma.type == VMAType::Flexible); info->is_direct.Assign(vma.type == VMAType::Direct); info->is_stack.Assign(vma.type == VMAType::Stack); - info->is_pooled.Assign(vma.type == VMAType::PoolReserved); - info->is_committed.Assign(vma.type == VMAType::Pooled); + info->is_pooled.Assign(vma.type == VMAType::PoolReserved || vma.type == VMAType::Pooled); + info->is_committed.Assign(vma.IsMapped()); vma.name.copy(info->name.data(), std::min(info->name.size(), vma.name.size())); if (vma.type == VMAType::Direct) { const auto dmem_it = FindDmemArea(vma.phys_base); From b3bce086b30c148f25817f9df06abaedad244453 Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Wed, 22 Jan 2025 12:08:49 -0300 Subject: [PATCH 118/455] devtools: fix ReleaseKeyboard assert being triggered if many shader editor windows exist (#2205) --- src/core/devtools/widget/shader_list.cpp | 65 +++++++++++++++--------- src/core/devtools/widget/shader_list.h | 9 ++-- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/core/devtools/widget/shader_list.cpp b/src/core/devtools/widget/shader_list.cpp index 97d01896d..0285db5a5 100644 --- a/src/core/devtools/widget/shader_list.cpp +++ b/src/core/devtools/widget/shader_list.cpp @@ -24,16 +24,33 @@ using namespace ImGui; namespace Core::Devtools::Widget { -ShaderList::Selection::Selection(int index) : index(index) { - isa_editor.SetPalette(TextEditor::GetDarkPalette()); - isa_editor.SetReadOnly(true); - glsl_editor.SetPalette(TextEditor::GetDarkPalette()); - glsl_editor.SetLanguageDefinition(TextEditor::LanguageDefinition::GLSL()); +ShaderList::Selection::Selection(int index) + : index(index), isa_editor(std::make_unique()), + glsl_editor(std::make_unique()) { + isa_editor->SetPalette(TextEditor::GetDarkPalette()); + isa_editor->SetReadOnly(true); + glsl_editor->SetPalette(TextEditor::GetDarkPalette()); + glsl_editor->SetLanguageDefinition(TextEditor::LanguageDefinition::GLSL()); presenter->GetWindow().RequestKeyboard(); } ShaderList::Selection::~Selection() { - presenter->GetWindow().ReleaseKeyboard(); + if (index >= 0) { + presenter->GetWindow().ReleaseKeyboard(); + } +} + +ShaderList::Selection::Selection(Selection&& other) noexcept + : index{other.index}, isa_editor{std::move(other.isa_editor)}, + glsl_editor{std::move(other.glsl_editor)}, open{other.open}, showing_bin{other.showing_bin}, + patch_path{std::move(other.patch_path)}, patch_bin_path{std::move(other.patch_bin_path)} { + other.index = -1; +} + +ShaderList::Selection& ShaderList::Selection::operator=(Selection other) { + using std::swap; + swap(*this, other); + return *this; } void ShaderList::Selection::ReloadShader(DebugStateType::ShaderDump& value) { @@ -72,13 +89,13 @@ bool ShaderList::Selection::DrawShader(DebugStateType::ShaderDump& value) { value.is_patched = !value.patch_spv.empty(); if (!value.is_patched) { // No patch - isa_editor.SetText(value.cache_isa_disasm); - glsl_editor.SetText(value.cache_spv_disasm); + isa_editor->SetText(value.cache_isa_disasm); + glsl_editor->SetText(value.cache_spv_disasm); } else { - isa_editor.SetText(value.cache_patch_disasm); - isa_editor.SetLanguageDefinition(TextEditor::LanguageDefinition::SPIRV()); - glsl_editor.SetText(value.patch_source); - glsl_editor.SetReadOnly(false); + isa_editor->SetText(value.cache_patch_disasm); + isa_editor->SetLanguageDefinition(TextEditor::LanguageDefinition::SPIRV()); + glsl_editor->SetText(value.patch_source); + glsl_editor->SetReadOnly(false); } } @@ -97,18 +114,18 @@ bool ShaderList::Selection::DrawShader(DebugStateType::ShaderDump& value) { if (value.patch_source.empty()) { value.patch_source = value.cache_spv_disasm; } - isa_editor.SetText(value.cache_patch_disasm); - isa_editor.SetLanguageDefinition(TextEditor::LanguageDefinition::SPIRV()); - glsl_editor.SetText(value.patch_source); - glsl_editor.SetReadOnly(false); + isa_editor->SetText(value.cache_patch_disasm); + isa_editor->SetLanguageDefinition(TextEditor::LanguageDefinition::SPIRV()); + glsl_editor->SetText(value.patch_source); + glsl_editor->SetReadOnly(false); if (!value.patch_spv.empty()) { ReloadShader(value); } } else { - isa_editor.SetText(value.cache_isa_disasm); - isa_editor.SetLanguageDefinition(TextEditor::LanguageDefinition()); - glsl_editor.SetText(value.cache_spv_disasm); - glsl_editor.SetReadOnly(true); + isa_editor->SetText(value.cache_isa_disasm); + isa_editor->SetLanguageDefinition(TextEditor::LanguageDefinition()); + glsl_editor->SetText(value.cache_spv_disasm); + glsl_editor->SetReadOnly(true); ReloadShader(value); } } @@ -154,7 +171,7 @@ bool ShaderList::Selection::DrawShader(DebugStateType::ShaderDump& value) { compile = true; } if (save) { - value.patch_source = glsl_editor.GetText(); + value.patch_source = glsl_editor->GetText(); std::ofstream file{patch_path, std::ios::binary | std::ios::trunc}; file << value.patch_source; std::string msg = "Patch saved to "; @@ -192,7 +209,7 @@ bool ShaderList::Selection::DrawShader(DebugStateType::ShaderDump& value) { DebugState.ShowDebugMessage("Decompilation failed (Compile was ok):\n" + res); } else { - isa_editor.SetText(value.cache_patch_disasm); + isa_editor->SetText(value.cache_patch_disasm); ReloadShader(value); } } @@ -201,9 +218,9 @@ bool ShaderList::Selection::DrawShader(DebugStateType::ShaderDump& value) { } if (showing_bin) { - isa_editor.Render(value.is_patched ? "SPIRV" : "ISA", GetContentRegionAvail()); + isa_editor->Render(value.is_patched ? "SPIRV" : "ISA", GetContentRegionAvail()); } else { - glsl_editor.Render("GLSL", GetContentRegionAvail()); + glsl_editor->Render("GLSL", GetContentRegionAvail()); } End(); diff --git a/src/core/devtools/widget/shader_list.h b/src/core/devtools/widget/shader_list.h index fbb8d2070..c882b0964 100644 --- a/src/core/devtools/widget/shader_list.h +++ b/src/core/devtools/widget/shader_list.h @@ -14,14 +14,17 @@ class ShaderList { struct Selection { explicit Selection(int index); ~Selection(); + Selection(const Selection& other) = delete; + Selection(Selection&& other) noexcept; + Selection& operator=(Selection other); void ReloadShader(DebugStateType::ShaderDump& value); bool DrawShader(DebugStateType::ShaderDump& value); - int index; - TextEditor isa_editor{}; - TextEditor glsl_editor{}; + int index{-1}; + std::unique_ptr isa_editor{}; + std::unique_ptr glsl_editor{}; bool open = true; bool showing_bin = false; From e584444aa38a6f1191f622ef1b8db7617c0549c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8A=E9=A4=85=E3=81=AECreeeper?= <56744841+creeper-0910@users.noreply.github.com> Date: Thu, 23 Jan 2025 06:52:27 +0900 Subject: [PATCH 119/455] Update Japanese translation (#2209) * Update Japanese translation * Update Japanese translation * Update Japanese translation --- src/qt_gui/translations/ja_JP.ts | 164 +++++++++++++++---------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index e07d4eb25..bb9488a6b 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -19,7 +19,7 @@ This software should not be used to play games you have not legally obtained. - このソフトウェアは、合法的に入手していないゲームをプレイするために使用するものではありません。 + 非正規、非合法のゲームをプレイするためにこのソフトウェアを使用しないでください。 @@ -33,7 +33,7 @@ GameInfoClass Loading game list, please wait :3 - ゲームリストを読み込み中です。お待ちください :3 + ゲームリストを読み込み中です。しばらくお待ちください :3 Cancel @@ -52,7 +52,7 @@ Select which directory you want to install to. - Select which directory you want to install to. + インストール先のディレクトリを選択してください。 @@ -75,7 +75,7 @@ The value for location to install games is not valid. - ゲームをインストールする場所が無効です。 + ゲームのインストール場所が無効です。 @@ -130,35 +130,35 @@ Delete... - Delete... + 削除... Delete Game - Delete Game + ゲームを削除 Delete Update - Delete Update + アップデートを削除 Delete DLC - Delete DLC + DLCを削除 Compatibility... - Compatibility... + 互換性... Update database - Update database + データベースを更新 View report - View report + レポートを表示 Submit a report - Submit a report + レポートを送信 Shortcut creation @@ -182,23 +182,23 @@ Game - Game + ゲーム requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. + この機能を利用するには、 'アップデートフォルダの分離を有効化' を有効化する必要があります。 This game has no update to delete! - This game has no update to delete! + このゲームにはアップデートがないため削除することができません! Update - Update + アップデート This game has no DLC to delete! - This game has no DLC to delete! + このゲームにはDLCがないため削除することができません! DLC @@ -206,11 +206,11 @@ Delete %1 - Delete %1 + %1 を削除 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + %1 の %2 ディレクトリを本当に削除しますか? @@ -241,15 +241,15 @@ Install application from a .pkg file - .pkgファイルからアプリケーションをインストールする + .pkgファイルからアプリケーションをインストール Recent Games - 最近のゲーム + 最近プレイしたゲーム Open shadPS4 Folder - Open shadPS4 Folder + shadPS4フォルダを開く Exit @@ -273,7 +273,7 @@ Tiny - 極小 + 最小 Small @@ -297,7 +297,7 @@ Elf Viewer - Elfビュワー + Elfビューアー Game Install Directory @@ -397,11 +397,11 @@ You have downloaded cheats for all the games you have installed. - インストールしたすべてのゲームのチートをダウンロードしました。 + インストールされているすべてのゲームのチートをダウンロードしました。 Patches Downloaded Successfully! - パッチが正常にダウンロードされました! + パッチが正常にダウンロードされました! All Patches available for all games have been downloaded. @@ -425,11 +425,11 @@ Only one file can be selected! - 1つのファイルしか選択できません! + 1つのファイルしか選択できません! PKG Extraction - PKG抽出 + PKGの抽出 Patch detected! @@ -473,7 +473,7 @@ PKG is a patch, please install the game first! - PKGはパッチです。ゲームを先にインストールしてください! + PKGはパッチです。ゲームを先にインストールしてください! PKG ERROR @@ -526,11 +526,11 @@ Console Language - コンソール言語 + コンソールの言語 Emulator Language - エミュレーター言語 + エミュレーターの言語 Emulator @@ -542,7 +542,7 @@ Enable Separate Update Folder - Enable Separate Update Folder + アップデートフォルダの分離を有効化 Show Game Size In List @@ -550,7 +550,7 @@ Show Splash - スプラッシュを表示する + スプラッシュ画面を表示する Is PS4 Pro @@ -566,11 +566,11 @@ Trophy Key - Trophy Key + トロフィーキー Trophy - Trophy + トロフィー Logger @@ -602,7 +602,7 @@ Hide Cursor Idle Timeout - カーソル非アクティブタイムアウト + カーソルを隠すまでの非アクティブ期間 s @@ -706,7 +706,7 @@ Disable Trophy Pop-ups - Disable Trophy Pop-ups + トロフィーのポップアップを無効化 Play title music @@ -714,19 +714,19 @@ Update Compatibility Database On Startup - Update Compatibility Database On Startup + 起動時に互換性データベースを更新する Game Compatibility - Game Compatibility + ゲームの互換性 Display Compatibility Data - Display Compatibility Data + 互換性に関するデータを表示 Update Compatibility Database - Update Compatibility Database + 互換性データベースを更新 Volume @@ -734,7 +734,7 @@ Audio Backend - Audio Backend + オーディオ バックエンド Save @@ -754,15 +754,15 @@ Point your mouse at an option to display its description. - オプションにマウスをポイントすると、その説明が表示されます。 + 設定項目にマウスをホバーすると、説明が表示されます。 consoleLanguageGroupBox - コンソール言語:\nPS4ゲームが使用する言語を設定します。\nこれはゲームがサポートする言語に設定することをお勧めしますが、地域によって異なる場合があります。 + コンソールの言語:\nPS4ゲームが使用する言語を設定します。\nゲームでサポートされている言語に設定することをお勧めしますが、地域によって異なる場合があります。 emulatorLanguageGroupBox - エミュレーター言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 + エミュレーターの言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 fullscreenCheckBox @@ -770,7 +770,7 @@ separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで、管理が容易になります。 showSplashCheckBox @@ -778,7 +778,7 @@ ps4proCheckBox - PS4 Proです:\nエミュレーターがPS4 PROとして動作するようにし、これをサポートするゲームで特別な機能を有効にする場合があります。 + PS4 Pro モード:\nエミュレーターがPS4 PROとして動作するようになり、PS4 PROをサポートする一部のゲームで特別な機能が有効化される場合があります。 discordRPCCheckbox @@ -790,7 +790,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + トロフィーキー:\nトロフィーの復号に使用されるキーです。脱獄済みのコンソールから取得することができます。\n16進数のみを受け入れます。 logTypeGroupBox @@ -798,27 +798,27 @@ logFilter - ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" レベル: Trace, Debug, Info, Warning, Error, Critical - この順序で、特定のレベルはリスト内のすべての前のレベルをサイレンスし、その後のすべてのレベルをログに記録します。 + ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" \nレベル: Trace, Debug, Info, Warning, Error, Critical - レベルはこの並び通りに処理され、指定されたレベルより前のレベル ログを抑制し、それ以外のすべてのレベルをログに記録します。 updaterGroupBox - 更新:\nRelease: 非常に古いかもしれないが、より信頼性が高くテスト済みの公式バージョンを毎月リリースします。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 + 更新:\nRelease: 最新の機能を利用できない可能性がありますが、より信頼性が高くテストされた公式バージョンが毎月リリースされます。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 GUIgroupBox - タイトルミュージックを再生:\nゲームがそれをサポートしている場合、GUIでゲームを選択したときに特別な音楽を再生することを有効にします。 + タイトルミュージックを再生:\nゲームでサポートされている場合に、GUIでゲームを選択したときに特別な音楽を再生する機能を有効にします。 disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + トロフィーのポップアップを無効化:\nゲーム内でのトロフィー通知を無効化します。 トロフィーの進行状況は、トロフィービューアーを使用して確認できます。(メインウィンドウでゲームを右クリック) hideCursorGroupBox - カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n決して: いつでもマウスが見えます。\nアイドル: アイダルの後に消えるまでの時間を設定します。\n常に: マウスは決して見えません。 + カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n無効: 常にカーソルが表示されます。\n非アクティブ時: カーソルの非アクティブ期間が指定した時間を超えた場合にカーソルを隠します。\n常に: カーソルは常に隠れた状態になります。 idleTimeoutGroupBox - アイドル後にマウスが消えるまでの時間を設定します。 + カーソルが非アクティブになってから隠すまでの時間を設定します。 backButtonBehaviorGroupBox @@ -826,23 +826,23 @@ enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + 互換性に関するデータを表示:\nゲームの互換性に関する情報を表として表示します。常に最新情報を取得したい場合、"起動時に互換性データベースを更新する" を有効化してください。 checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + 起動時に互換性データベースを更新する:\nshadPS4の起動時に自動で互換性データベースを更新します。 updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 Never - 決して + 無効 Idle - アイドル + 非アクティブ時 Always @@ -850,11 +850,11 @@ Touchpad Left - タッチパッド左 + 左タッチパッド Touchpad Right - タッチパッド右 + 右タッチパッド Touchpad Center @@ -866,15 +866,15 @@ graphicsAdapterGroupBox - グラフィックデバイス:\n複数のGPUシステムで、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 + グラフィックデバイス:\nシステムに複数のGPUが搭載されている場合、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 resolutionLayout - 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中にサイズ変更できます。\nこれはゲーム内の解像度とは異なります。 + 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中でもサイズを変更することができます。\nこれはゲーム内の解像度とは異なります。 heightDivider - Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! + Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! dumpShadersCheckBox @@ -917,11 +917,11 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + のチート/パッチ defaultTextEdit_MSG - チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチを開発していないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 + チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチは開発を行っていないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 No Image Available @@ -997,7 +997,7 @@ Unable to open files.json for reading. - files.jsonを読み込み用に開けません。 + files.jsonを読み取りのために開く事が出来ませんでした。 No patch file found for the current serial. @@ -1005,11 +1005,11 @@ Unable to open the file for reading. - ファイルを読み込み用に開けません。 + ファイルを読み取りのために開く事が出来ませんでした。 Unable to open the file for writing. - ファイルを記録用に開けません。 + ファイルをを書き込みのために開く事が出来ませんでした。 Failed to parse XML: @@ -1029,7 +1029,7 @@ The selected source is invalid. - 選択したソースは無効です。 + 選択されたソースは無効です。 File Exists @@ -1113,7 +1113,7 @@ Failed to open files.json for writing - files.jsonを記録用に開けません + files.jsonを読み取りのために開く事が出来ませんでした。 Author: @@ -1125,7 +1125,7 @@ Failed to open files.json for reading. - files.jsonを読み込み用に開けません。 + files.jsonを読み取りのために開く事が出来ませんでした。 Name: @@ -1180,43 +1180,43 @@ Never Played - Never Played + 未プレイ h - h + 時間 m - m + s - s + Compatibility is untested - Compatibility is untested + 互換性は未検証です Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + ゲームが正常に初期化されない/エミュレーターがクラッシュする Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + ゲームは起動しますが、空のスクリーンが表示されます Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + 正常にゲーム画面が表示されますが、メニューから先に進むことができません Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + ゲームを壊すような不具合や、プレイが不可能なほどのパフォーマンスの問題があります Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + パフォーマンスに問題はなく、大きな不具合なしでゲームをプレイすることができます From c015ac134462b3c425d69953e27da0e6c8ca9498 Mon Sep 17 00:00:00 2001 From: tomboylover93 <95257311+tomboylover93@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:53:27 -0800 Subject: [PATCH 120/455] Update Linux building documentation (#2211) * wip: redo build instructions guide for Linux * Add Linux screenshots directory to REUSE.toml * change links for Visual Studio Code images * change instructions for building from terminal reference: https://github.com/shadps4-emu/shadPS4/pull/2211#issuecomment-2608134455 --- REUSE.toml | 1 + documents/Screenshots/Linux/1.png | Bin 0 -> 11447 bytes documents/Screenshots/Linux/2.png | Bin 0 -> 20159 bytes documents/Screenshots/Linux/3.png | Bin 0 -> 25540 bytes documents/Screenshots/Linux/4.png | Bin 0 -> 16845 bytes documents/Screenshots/Linux/5.png | Bin 0 -> 26893 bytes documents/building-linux.md | 103 +++++++++++++++++++++++++----- 7 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 documents/Screenshots/Linux/1.png create mode 100644 documents/Screenshots/Linux/2.png create mode 100644 documents/Screenshots/Linux/3.png create mode 100644 documents/Screenshots/Linux/4.png create mode 100644 documents/Screenshots/Linux/5.png diff --git a/REUSE.toml b/REUSE.toml index 55d76673d..a62974bcd 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -14,6 +14,7 @@ path = [ "documents/changelog.md", "documents/Quickstart/2.png", "documents/Screenshots/*", + "documents/Screenshots/Linux/*", "externals/MoltenVK/MoltenVK_icd.json", "scripts/ps4_names.txt", "src/images/about_icon.png", diff --git a/documents/Screenshots/Linux/1.png b/documents/Screenshots/Linux/1.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd5ef92b39960dcf98cf22d47f3895d84884581 GIT binary patch literal 11447 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 OgJdKW#s7Xb^#4D*Qdz11 literal 0 HcmV?d00001 diff --git a/documents/Screenshots/Linux/2.png b/documents/Screenshots/Linux/2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5ff3b534773394c892a9d026a4d5e553ed2cfa GIT binary patch literal 20159 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

IFt#Ds2NY9n;YzAXc!7BTm6;cMp= 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 HFG2qUd8Vx* literal 0 HcmV?d00001 diff --git a/documents/Screenshots/Linux/4.png b/documents/Screenshots/Linux/4.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8a3b6c1e9a39d06bfc9ec0364db3b1f0b7a5bc GIT binary patch literal 16845 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 r -## Build shadPS4 for Linux +## Build shadPS4 for Linux -### Install the necessary tools to build shadPS4: +First and foremost, Clang 18 is the **recommended compiler** as it is used for official builds and CI. If you build with GCC, you might encounter issues — please report any you find. Additionally, if you choose to use GCC, please build shadPS4 with Clang at least once before creating an `[APP BUG]` issue or submitting a pull request. + +## Preparatory steps + +### Installing dependencies #### Debian & Ubuntu + ``` sudo apt install build-essential clang git cmake libasound2-dev libpulse-dev libopenal-dev libssl-dev zlib1g-dev libedit-dev libudev-dev libevdev-dev libsdl2-dev libjack-dev libsndio-dev qt6-base-dev qt6-tools-dev qt6-multimedia-dev libvulkan-dev vulkan-validationlayers ``` #### Fedora + ``` sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-connection-kit-devel openal-devel openssl-devel libevdev-devel libudev-devel libXext-devel qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtmultimedia-devel qt6-qtsvg-devel qt6-qttools-devel vulkan-devel vulkan-validation-layers ``` #### Arch Linux + ``` sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers ``` +**Note**: The `shadps4-git` AUR package is not maintained by any of the developers, and it uses GCC as the compiler as opposed to Clang. Use at your own discretion. #### OpenSUSE + ``` sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers ``` -### Cloning and compiling: -Clone the repository recursively: +#### Other Linux distributions + +You can try one of two methods: + +- Search the packages by name and install them with your package manager, or +- Install [distrobox](https://distrobox.it/), create a container using any of the distributions cited above as a base, for Arch Linux you'd do: + +``` +distrobox create --name archlinux --init --image archlinux:latest +``` + +and install the dependencies on that container as cited above. +This option is **highly recommended** for NixOS and distributions with immutable/atomic filesystems (example: Fedora Kinoite, SteamOS). +### Cloning + ``` git clone --recursive https://github.com/shadps4-emu/shadPS4.git cd shadPS4 ``` -Generate the build directory in the shadPS4 directory. To disable the QT GUI, remove the ```-DENABLE_QT_GUI=ON``` flag: +## Building + +There are 3 options you can choose from. Option 1 is **highly recommended**. + +#### Option 1: Terminal-only + +1. Generate the build directory in the shadPS4 directory. -**Note**: Clang is the compiler used for official builds and CI. If you build with GCC, you might encounter issues—please report any you find. If you choose to use GCC, we recommend building with Clang at least once before submitting a pull request. ``` cmake -S . -B build/ -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ``` -Enter the directory: +To disable the Qt GUI, remove the `-DENABLE_QT_GUI=ON` flag. To change the build type (for debugging), add `-DCMAKE_BUILD_TYPE=Debug`. + +2. Use CMake to build the project: + ``` -cd build/ +cmake --build ./build --parallel$(nproc) ``` -Use make to build the project: +If your computer freezes during this step, this could be caused by excessive system resource usage. In that case, remove `--parallel$(nproc)`. + +Now run the emulator. If Qt was enabled at configure time: + ``` -cmake --build . --parallel$(nproc) +./build/shadps4 ``` -Now run the emulator. If QT is enabled: -``` -./shadps4 -``` Otherwise, specify the path to your PKG's boot file: + ``` -./shadps4 /"PATH"/"TO"/"GAME"/"FOLDER"/eboot.bin +./build/shadps4 /"PATH"/"TO"/"GAME"/"FOLDER"/eboot.bin ``` + +You can also specify the Game ID as an argument for which game to boot, as long as the folder containing the games is specified in config.toml (example: Bloodborne (US) is CUSA00900). +#### Option 2: Configuring with cmake-gui + +`cmake-gui` should be installed by default alongside `cmake`, if not search for the package in your package manager and install it. + +Open `cmake-gui` and specify the source code and build directories. If you cloned the source code to your Home directory, it would be `/home/user/shadPS4` and `/home/user/shadPS4/build`. + +Click on Configure, select "Unix Makefiles", select "Specify native compilers", click Next and choose `clang` and `clang++` as the C and CXX compilers. Usually they are located in `/bin/clang` and `/bin/clang++`. Click on Finish and let it configure the project. + +Now every option should be displayed in red. Change anything you want, then click on Generate to make the changes permanent, then open a terminal window and do steps 2 and 3 of Option 1. + +#### Option 3: Visual Studio Code + +This option is pretty convoluted and should only be used if you have VSCode as your default IDE, or just prefer building and debugging projects through it. This also assumes that you're using an Arch Linux environment, as the naming for some options might differ from other distros. + +[Download Visual Studio Code for your platform](https://code.visualstudio.com/download), or use [Code - OSS](https://github.com/microsoft/vscode) if you'd like. Code - OSS is available on most Linux distributions' package repositories (on Arch Linux it is simply named `code`). + +Once set up, go to Extensions and install "CMake Tools": + +![image](https://raw.githubusercontent.com/shadps4-emu/shadPS4/refs/heads/main/documents/Screenshots/Linux/3.png) + +You can also install other CMake and Clang related extensions if you'd like, but this one is what enables you to configure and build CMake projects directly within VSCode. + +Go to Settings, filter by `@ext:ms-vscode.cmake-tools configure` and disable this option: + +![image](https://raw.githubusercontent.com/shadps4-emu/shadPS4/refs/heads/main/documents/Screenshots/Linux/1.png) + +If you wish to build with the Qt GUI, add `-DENABLE_QT_GUI=ON` to the configure arguments: + +![image](https://raw.githubusercontent.com/shadps4-emu/shadPS4/refs/heads/main/documents/Screenshots/Linux/2.png) + +On the CMake tab, change the options as you wish, but make sure that it looks similar to or exactly like this: + +![image](https://raw.githubusercontent.com/shadps4-emu/shadPS4/refs/heads/main/documents/Screenshots/Linux/4.png) + +When hovering over Project Status > Configure, there should be an icon titled "Configure". Click on it and let it configure the project, then do the same for Project Status > Build. + +If you want to debug it, change the build type under Project Status > Configure to Debug (it should be the default) and compile it, then click on the icon in Project Status > Debug. If you simply want to launch the shadPS4 executable from within VSCode, click on the icon in Project Status > Launch. + +Don't forget to change the launch target for both options to the shadPS4 executable inside shadPS4/build: + +![image](https://raw.githubusercontent.com/shadps4-emu/shadPS4/refs/heads/main/documents/Screenshots/Linux/5.png) \ No newline at end of file From d7c2cb17f3e1b339d78c5eb1bcb44e0305a85e89 Mon Sep 17 00:00:00 2001 From: panzone91 <150828896+panzone91@users.noreply.github.com> Date: Wed, 22 Jan 2025 21:53:54 +0000 Subject: [PATCH 121/455] update extension vector capacity (#2210) --- src/video_core/renderer_vulkan/vk_instance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index d183d6b09..a722b5322 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -232,7 +232,7 @@ bool Instance::CreateDevice() { return false; } - boost::container::static_vector enabled_extensions; + boost::container::static_vector enabled_extensions; const auto add_extension = [&](std::string_view extension) -> bool { const auto result = std::find_if(available_extensions.begin(), available_extensions.end(), From 1fcfb07421909ab779ee1a884b6a5ce0fb0fd4e3 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Wed, 22 Jan 2025 19:21:52 -0300 Subject: [PATCH 122/455] GUI: Settings improvements (#2213) --- src/common/config.cpp | 13 +- src/common/config.h | 2 + src/qt_gui/settings_dialog.cpp | 23 +- src/qt_gui/settings_dialog.ui | 1336 ++++++++++++++++++------------ src/qt_gui/translations/ar.ts | 18 +- src/qt_gui/translations/da_DK.ts | 18 +- src/qt_gui/translations/de.ts | 18 +- src/qt_gui/translations/el.ts | 18 +- src/qt_gui/translations/en.ts | 18 +- src/qt_gui/translations/es_ES.ts | 18 +- src/qt_gui/translations/fa_IR.ts | 18 +- src/qt_gui/translations/fi.ts | 18 +- src/qt_gui/translations/fr.ts | 18 +- src/qt_gui/translations/hu_HU.ts | 18 +- src/qt_gui/translations/id.ts | 18 +- src/qt_gui/translations/it.ts | 18 +- src/qt_gui/translations/ja_JP.ts | 18 +- src/qt_gui/translations/ko_KR.ts | 18 +- src/qt_gui/translations/lt_LT.ts | 18 +- src/qt_gui/translations/nb.ts | 18 +- src/qt_gui/translations/nl.ts | 18 +- src/qt_gui/translations/pl_PL.ts | 18 +- src/qt_gui/translations/pt_BR.ts | 24 +- src/qt_gui/translations/ro_RO.ts | 18 +- src/qt_gui/translations/ru_RU.ts | 18 +- src/qt_gui/translations/sq.ts | 18 +- src/qt_gui/translations/sv.ts | 18 +- src/qt_gui/translations/tr_TR.ts | 18 +- src/qt_gui/translations/uk_UA.ts | 18 +- src/qt_gui/translations/vi_VN.ts | 18 +- src/qt_gui/translations/zh_CN.ts | 18 +- src/qt_gui/translations/zh_TW.ts | 18 +- 32 files changed, 1339 insertions(+), 545 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 6e9db50ff..a57b6d35c 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -45,6 +45,7 @@ static std::string logFilter; static std::string logType = "async"; static std::string userName = "shadPS4"; static std::string updateChannel; +static std::string chooseHomeTab; static u16 deadZoneLeft = 2.0; static u16 deadZoneRight = 2.0; static std::string backButtonBehavior = "left"; @@ -194,6 +195,10 @@ std::string getUpdateChannel() { return updateChannel; } +std::string getChooseHomeTab() { + return chooseHomeTab; +} + std::string getBackButtonBehavior() { return backButtonBehavior; } @@ -399,6 +404,9 @@ void setUserName(const std::string& type) { void setUpdateChannel(const std::string& type) { updateChannel = type; } +void setChooseHomeTab(const std::string& type) { + chooseHomeTab = type; +} void setBackButtonBehavior(const std::string& type) { backButtonBehavior = type; @@ -637,6 +645,7 @@ void load(const std::filesystem::path& path) { compatibilityData = toml::find_or(general, "compatibilityEnabled", false); checkCompatibilityOnStartup = toml::find_or(general, "checkCompatibilityOnStartup", false); + chooseHomeTab = toml::find_or(general, "chooseHomeTab", "Release"); } if (data.contains("Input")) { @@ -760,6 +769,7 @@ void save(const std::filesystem::path& path) { data["General"]["logType"] = logType; data["General"]["userName"] = userName; data["General"]["updateChannel"] = updateChannel; + data["General"]["chooseHomeTab"] = chooseHomeTab; data["General"]["showSplash"] = isShowSplash; data["General"]["autoUpdate"] = isAutoUpdate; data["General"]["separateUpdateEnabled"] = separateupdatefolder; @@ -871,6 +881,7 @@ void setDefaultValues() { } else { updateChannel = "Nightly"; } + chooseHomeTab = "General"; cursorState = HideCursorState::Idle; cursorHideTimeout = 5; backButtonBehavior = "left"; @@ -898,4 +909,4 @@ void setDefaultValues() { checkCompatibilityOnStartup = false; } -} // namespace Config +} // namespace Config \ No newline at end of file diff --git a/src/common/config.h b/src/common/config.h index 564947f1e..15937606e 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -35,6 +35,7 @@ std::string getLogFilter(); std::string getLogType(); std::string getUserName(); std::string getUpdateChannel(); +std::string getChooseHomeTab(); u16 leftDeadZone(); u16 rightDeadZone(); @@ -81,6 +82,7 @@ void setLanguage(u32 language); void setNeoMode(bool enable); void setUserName(const std::string& type); void setUpdateChannel(const std::string& type); +void setChooseHomeTab(const std::string& type); void setSeparateUpdateEnabled(bool use); void setGameInstallDirs(const std::vector& settings_install_dirs_config); void setSaveDataPath(const std::filesystem::path& path); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 5695d6232..b41fde745 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -65,6 +65,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, : QDialog(parent), ui(new Ui::SettingsDialog) { ui->setupUi(this); ui->tabWidgetSettings->setUsesScrollButtons(false); + initialHeight = this->height(); const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); @@ -150,7 +151,6 @@ SettingsDialog::SettingsDialog(std::span physical_devices, }); #else ui->updaterGroupBox->setVisible(false); - ui->GUIgroupBox->setMaximumSize(265, 16777215); #endif connect(ui->updateCompatibilityButton, &QPushButton::clicked, this, [this, parent, m_compat_info]() { @@ -169,6 +169,11 @@ SettingsDialog::SettingsDialog(std::span physical_devices, }); } + // Gui TAB + { + connect(ui->chooseHomeTabComboBox, &QComboBox::currentTextChanged, this, + [](const QString& hometab) { Config::setChooseHomeTab(hometab.toStdString()); }); + } // Input TAB { connect(ui->hideCursorComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, @@ -246,7 +251,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, #ifdef ENABLE_UPDATER ui->updaterGroupBox->installEventFilter(this); #endif - ui->GUIgroupBox->installEventFilter(this); + ui->GUIMusicGroupBox->installEventFilter(this); ui->disableTrophycheckBox->installEventFilter(this); ui->enableCompatibilityCheckBox->installEventFilter(this); ui->checkCompatibilityOnStartupCheckBox->installEventFilter(this); @@ -373,6 +378,15 @@ void SettingsDialog::LoadValuesFromConfig() { ui->updateComboBox->setCurrentText(QString::fromStdString(updateChannel)); #endif + std::string chooseHomeTab = toml::find_or(data, "General", "chooseHomeTab", ""); + ui->chooseHomeTabComboBox->setCurrentText(QString::fromStdString(chooseHomeTab)); + QStringList tabNames = {tr("General"), tr("Gui"), tr("Graphics"), tr("User"), + tr("Input"), tr("Paths"), tr("Debug")}; + QString chooseHomeTabQString = QString::fromStdString(chooseHomeTab); + int indexTab = tabNames.indexOf(chooseHomeTabQString); + indexTab = (indexTab == -1) ? 0 : indexTab; + ui->tabWidgetSettings->setCurrentIndex(indexTab); + QString backButtonBehavior = QString::fromStdString( toml::find_or(data, "Input", "backButtonBehavior", "left")); int index = ui->backButtonBehaviorComboBox->findData(backButtonBehavior); @@ -476,8 +490,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { } else if (elementName == "updaterGroupBox") { text = tr("updaterGroupBox"); #endif - } else if (elementName == "GUIgroupBox") { - text = tr("GUIgroupBox"); + } else if (elementName == "GUIMusicGroupBox") { + text = tr("GUIMusicGroupBox"); } else if (elementName == "disableTrophycheckBox") { text = tr("disableTrophycheckBox"); } else if (elementName == "enableCompatibilityCheckBox") { @@ -592,6 +606,7 @@ void SettingsDialog::UpdateSettings() { Config::setRdocEnabled(ui->rdocCheckBox->isChecked()); Config::setAutoUpdate(ui->updateCheckBox->isChecked()); Config::setUpdateChannel(ui->updateComboBox->currentText().toStdString()); + Config::setChooseHomeTab(ui->chooseHomeTabComboBox->currentText().toStdString()); Config::setCompatibilityEnabled(ui->enableCompatibilityCheckBox->isChecked()); Config::setCheckCompatibilityOnStartup(ui->checkCompatibilityOnStartupCheckBox->isChecked()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index d72a56973..5da6a8198 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -12,11 +12,11 @@ 0 0 970 - 820 + 600 - + 0 0 @@ -52,8 +52,14 @@ 0 + + + 0 + 0 + + - 3 + 0 @@ -67,8 +73,8 @@ 0 0 - 771 - 606 + 946 + 386 @@ -77,14 +83,56 @@ 0 - + + 6 + + + + 0 + + + 0 + + + 0 + + + + 0 + 0 + + Emulator - + + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft + + + false + + + false + + + + 6 + + + 9 + + + 9 + + + 9 + + + 9 + @@ -106,7 +154,7 @@ - + 0 0 @@ -149,215 +197,40 @@ - - - - 6 - - - 0 - - - - - - - Username - - - - - - - - - - - - - - + + + + 6 + + + 0 + - + - + 0 0 - + 0 0 - - GUI Settings - - - - 1 - - - 11 - - - - - Show Game Size In List - - - - - - - - 0 - 0 - - - - Play title music - - - - - - - 1 - - - 0 - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Volume - - - - - - - Set the volume of the background music. - - - 100 - - - 10 - - - 20 - - - 50 - - - Qt::Orientation::Horizontal - - - false - - - false - - - QSlider::TickPosition::NoTicks - - - 10 - - - - - - - - - 6 - - - 0 - - - 50 - - - - - - - Trophy - - - - - - Disable Trophy Pop-ups - - - - - - - Trophy Key - - - - - - - - 0 - 0 - - - - - 10 - false - - - - - - - - - - - - - - - - - - - - System + + 70 + @@ -387,6 +260,45 @@ + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + @@ -432,16 +344,16 @@ - 10 + 6 - 1 + 9 - 11 + 9 - 190 + 80 @@ -508,7 +420,7 @@ - + 0 0 @@ -554,8 +466,255 @@ - + + + + + + + + true + + + Gui + + + + + 0 + 0 + 946 + 386 + + + + + + + 0 + + + 0 + + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + GUI Settings + + + + 9 + + + 9 + + + + + Default tab when opening settings + + + + + + + 0 + 0 + + + + + General + + + + + Gui + + + + + Graphics + + + + + User + + + + + Input + + + + + Paths + + + + + Debug + + + + + + + + + + + Show Game Size In List + + + + + + + + 0 + 0 + + + + + 11 + false + true + + + + false + + + + + + false + + + + + 10 + 80 + 416 + 29 + + + + + 0 + 0 + + + + Set the volume of the background music. + + + 100 + + + 10 + + + 20 + + + 50 + + + Qt::Orientation::Horizontal + + + false + + + false + + + QSlider::TickPosition::NoTicks + + + 10 + + + + + + 10 + 22 + 416 + 26 + + + + + 0 + 0 + + + + Play title music + + + + + + 10 + 54 + 416 + 20 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Volume + + + + + + + + + + + + 6 + + + 210 + @@ -570,6 +729,12 @@ 0 + + + 0 + 0 + + Game Compatibility @@ -578,10 +743,10 @@ 10 - 1 + 9 - 11 + 9 @@ -632,6 +797,394 @@ + + + true + + + Graphics + + + + + 0 + 0 + 946 + 386 + + + + + + + + + + + Graphics Device + + + + + + + + + Enable NULL GPU + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + 6 + + + 0 + + + + + + + Width + + + + + + true + + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + + + false + + + 0 + + + 9999 + + + 1280 + + + + + + + + + + Height + + + + + + true + + + true + + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + + + false + + + 0 + + + 9999 + + + 720 + + + + + + + + + + Vblank Divider + + + + + + true + + + true + + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + + + false + + + 1 + + + 9999 + + + 1 + + + + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + 12 + + + 12 + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + true + + + User + + + + + 0 + 0 + 946 + 386 + + + + + + + 0 + + + 0 + + + + + + + Username + + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 40 + + + + + + + + + + 6 + + + 0 + + + 50 + + + + + + + Trophy + + + + + + Disable Trophy Pop-ups + + + + + + + Trophy Key + + + + + + + + 0 + 0 + + + + + 10 + false + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::MinimumExpanding + + + + 0 + 0 + + + + + + + true @@ -644,8 +1197,8 @@ 0 0 - 455 - 252 + 946 + 386 @@ -916,260 +1469,6 @@ - - - true - - - Graphics - - - - - 0 - 0 - 579 - 194 - - - - - - - - - - - Graphics Device - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - 6 - - - 0 - - - - - - - Width - - - - - - true - - - QAbstractSpinBox::CorrectionMode::CorrectToNearestValue - - - false - - - 0 - - - 9999 - - - 1280 - - - - - - - - - - Height - - - - - - true - - - true - - - QAbstractSpinBox::CorrectionMode::CorrectToNearestValue - - - false - - - 0 - - - 9999 - - - 720 - - - - - - - - - - - - - - 6 - - - 0 - - - - - - - Vblank Divider - - - - - - true - - - true - - - QAbstractSpinBox::CorrectionMode::CorrectToNearestValue - - - false - - - 1 - - - 9999 - - - 1 - - - - - - - - - - - - - - - - 12 - - - 12 - - - - - true - - - Advanced - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop - - - - - - Enable Shaders Dumping - - - - - - - Enable NULL GPU - - - - - - - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - - - - - - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - - - - true @@ -1178,6 +1477,14 @@ Paths + + + 0 + 0 + 946 + 386 + + @@ -1186,34 +1493,34 @@ - - - - - Add... - - - - - - - Remove - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - + + + + + Add... + + + + + + + Remove + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + @@ -1225,27 +1532,27 @@ - Save Data Path + Save Data Path - - - - - - true - - - - - - - Browse - - - - - + + + + + + true + + + + + + + Browse + + + + + @@ -1264,13 +1571,13 @@ 0 0 - 510 - 269 + 946 + 386 - + 0 @@ -1291,6 +1598,13 @@ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop + + + + Enable Shaders Dumping + + + diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index 47bd673b2..f7b93028a 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -540,10 +540,18 @@ Enable Fullscreen تمكين ملء الشاشة + + Fullscreen Mode + وضع ملء الشاشة + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + علامة التبويب الافتراضية عند فتح الإعدادات + Show Game Size In List عرض حجم اللعبة في القائمة @@ -620,6 +628,14 @@ Graphics الرسومات + + Gui + واجهة + + + User + مستخدم + Graphics Device جهاز الرسومات @@ -805,7 +821,7 @@ تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. - GUIgroupBox + GUIMusicGroupBox تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 91a98abd4..61d2f68bf 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Fuldskærmstilstand + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Standardfaneblad ved åbning af indstillinger + Show Game Size In List Vis vis spilstørrelse i listen @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Interface + + + User + Bruger + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. - GUIgroupBox + GUIMusicGroupBox Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index b1e1d2664..9d99a7048 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -540,10 +540,18 @@ Enable Fullscreen Vollbild aktivieren + + Fullscreen Mode + Vollbildmodus + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Standardregisterkarte beim Öffnen der Einstellungen + Show Game Size In List Zeigen Sie die Spielgröße in der Liste @@ -620,6 +628,14 @@ Graphics Grafik + + Gui + Benutzeroberfläche + + + User + Benutzer + Graphics Device Grafikgerät @@ -805,7 +821,7 @@ Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. - GUIgroupBox + GUIMusicGroupBox Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index ecda0ede0..66c3c07cd 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Λειτουργία Πλήρους Οθόνης + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Προεπιλεγμένη καρτέλα κατά την ανοίγμα των ρυθμίσεων + Show Game Size In List Εμφάνιση Μεγέθους Παιχνιδιού στη Λίστα @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Διεπαφή + + + User + Χρήστης + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. - GUIgroupBox + GUIMusicGroupBox Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index dc72d97c9..8b6c3c69f 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Fullscreen Mode + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Default tab when opening settings + Show Game Size In List Show Game Size In List @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Gui + + + User + User + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - GUIgroupBox + GUIMusicGroupBox Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index a47f7c577..8f7a09b5d 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -540,10 +540,18 @@ Enable Fullscreen Habilitar pantalla completa + + Fullscreen Mode + Modo de Pantalla Completa + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Pestaña predeterminada al abrir la configuración + Show Game Size In List Mostrar Tamaño del Juego en la Lista @@ -620,6 +628,14 @@ Graphics Gráficos + + Gui + Interfaz + + + User + Usuario + Graphics Device Dispositivo gráfico @@ -805,7 +821,7 @@ Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. - GUIgroupBox + GUIMusicGroupBox Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 976e7614e..043d782c2 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -540,10 +540,18 @@ Enable Fullscreen تمام صفحه + + Fullscreen Mode + حالت تمام صفحه + Enable Separate Update Folder فعال‌سازی پوشه جداگانه برای به‌روزرسانی + + Default tab when opening settings + زبان پیش‌فرض هنگام باز کردن تنظیمات + Show Game Size In List نمایش اندازه بازی در لیست @@ -620,6 +628,14 @@ Graphics گرافیک + + Gui + رابط کاربری + + + User + کاربر + Graphics Device کارت گرافیک مورداستفاده @@ -805,7 +821,7 @@ به‌روزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر می‌شوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست‌ شده‌تر هستند.\nشبانه: نسخه‌های توسعه‌ای که شامل جدیدترین ویژگی‌ها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند. - GUIgroupBox + GUIMusicGroupBox پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال می‌کند. diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index abc091b7e..86f6a6d3c 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -540,10 +540,18 @@ Enable Fullscreen Ota Käyttöön Koko Ruudun Tila + + Fullscreen Mode + Koko näytön tila + Enable Separate Update Folder Ota Käyttöön Erillinen Päivityshakemisto + + Default tab when opening settings + Oletusvälilehti avattaessa asetuksia + Show Game Size In List Näytä pelin koko luettelossa @@ -620,6 +628,14 @@ Graphics Grafiikka + + Gui + Rajapinta + + + User + Käyttäjä + Graphics Device Näytönohjain @@ -805,7 +821,7 @@ Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. - GUIgroupBox + GUIMusicGroupBox Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index d2a1c5307..601ece8b4 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -540,10 +540,18 @@ Enable Fullscreen Plein écran + + Fullscreen Mode + Mode Plein Écran + Enable Separate Update Folder Dossier séparé pour les mises à jours + + Default tab when opening settings + Onglet par défaut lors de l'ouverture des paramètres + Show Game Size In List Afficher la taille du jeu dans la liste @@ -620,6 +628,14 @@ Graphics Graphismes + + Gui + Interface + + + User + Utilisateur + Graphics Device Carte graphique @@ -805,7 +821,7 @@ Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. - GUIgroupBox + GUIMusicGroupBox Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index dff6a3a18..fe71e8120 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -540,10 +540,18 @@ Enable Fullscreen Teljes Képernyő Engedélyezése + + Fullscreen Mode + Teljes képernyős mód + Enable Separate Update Folder Külön Frissítési Mappa Engedélyezése + + Default tab when opening settings + Alapértelmezett fül a beállítások megnyitásakor + Show Game Size In List Játékméret megjelenítése a listában @@ -620,6 +628,14 @@ Graphics Grafika + + Gui + Felület + + + User + Felhasználó + Graphics Device Grafikai Eszköz @@ -805,7 +821,7 @@ Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. - GUIgroupBox + GUIMusicGroupBox Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index e6fb8b5aa..acfde43a7 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Mode Layar Penuh + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Tab default saat membuka pengaturan + Show Game Size In List Tampilkan Ukuran Game di Daftar @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Antarmuka + + + User + Pengguna + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. - GUIgroupBox + GUIMusicGroupBox Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 73dbdc603..93c6233a6 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -540,10 +540,18 @@ Enable Fullscreen Abilita Schermo Intero + + Fullscreen Mode + Modalità Schermo Intero + Enable Separate Update Folder Abilita Cartella Aggiornamenti Separata + + Default tab when opening settings + Scheda predefinita all'apertura delle impostazioni + Show Game Size In List Mostra la dimensione del gioco nell'elenco @@ -620,6 +628,14 @@ Graphics Grafica + + Gui + Interfaccia + + + User + Utente + Graphics Device Scheda Grafica @@ -805,7 +821,7 @@ Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. - GUIgroupBox + GUIMusicGroupBox Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index bb9488a6b..921af52bb 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -540,10 +540,18 @@ Enable Fullscreen フルスクリーンを有効にする + + Fullscreen Mode + 全画面モード + Enable Separate Update Folder アップデートフォルダの分離を有効化 + + Default tab when opening settings + 設定を開くときのデフォルトタブ + Show Game Size In List ゲームサイズをリストに表示 @@ -620,6 +628,14 @@ Graphics グラフィックス + + Gui + インターフェース + + + User + ユーザー + Graphics Device グラフィックスデバイス @@ -805,7 +821,7 @@ 更新:\nRelease: 最新の機能を利用できない可能性がありますが、より信頼性が高くテストされた公式バージョンが毎月リリースされます。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 - GUIgroupBox + GUIMusicGroupBox タイトルミュージックを再生:\nゲームでサポートされている場合に、GUIでゲームを選択したときに特別な音楽を再生する機能を有効にします。 diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 560b58340..2491959a6 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + 전체 화면 모드 + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + 설정 열기 시 기본 탭 + Show Game Size In List 게임 크기를 목록에 표시 @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + 인터페이스 + + + User + 사용자 + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - GUIgroupBox + GUIMusicGroupBox Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index e2ec1e5c3..23a52e948 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Viso ekranas + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Numatytoji kortelė atidarius nustatymus + Show Game Size In List Rodyti žaidimo dydį sąraše @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Interfeisa + + + User + Naudotojas + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. - GUIgroupBox + GUIMusicGroupBox Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index b94d29b23..d6d4090df 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -540,10 +540,18 @@ Enable Fullscreen Aktiver fullskjerm + + Fullscreen Mode + Fullskjermmodus + Enable Separate Update Folder Aktiver seperat oppdateringsmappe + + Default tab when opening settings + Standardfanen når innstillingene åpnes + Show Game Size In List Vis spillstørrelse i listen @@ -620,6 +628,14 @@ Graphics Grafikk + + Gui + Grensesnitt + + + User + Bruker + Graphics Device Grafikkenhet @@ -805,7 +821,7 @@ Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. - GUIgroupBox + GUIMusicGroupBox Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index add27500f..1dabda8b4 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Volledig schermmodus + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Standaardtabblad bij het openen van instellingen + Show Game Size In List Toon grootte van het spel in de lijst @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Interface + + + User + Gebruiker + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. - GUIgroupBox + GUIMusicGroupBox Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 3280beea7..528e88337 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -540,10 +540,18 @@ Enable Fullscreen Włącz pełny ekran + + Fullscreen Mode + Tryb Pełnoekranowy + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Domyślna zakładka podczas otwierania ustawień + Show Game Size In List Pokaż rozmiar gry na liście @@ -620,6 +628,14 @@ Graphics Grafika + + Gui + Interfejs + + + User + Użytkownik + Graphics Device Karta graficzna @@ -805,7 +821,7 @@ Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. - GUIgroupBox + GUIMusicGroupBox Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index b9d889519..fde1d3b63 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -540,10 +540,18 @@ Enable Fullscreen Ativar Tela Cheia + + Fullscreen Mode + Modo de Tela Cheia + Enable Separate Update Folder Habilitar pasta de atualização separada + + Default tab when opening settings + Aba padrão ao abrir as configurações + Show Game Size In List Mostrar Tamanho do Jogo na Lista @@ -620,6 +628,14 @@ Graphics Gráficos + + Gui + Interface + + + User + Usuário + Graphics Device Placa de Vídeo @@ -766,7 +782,7 @@ fullscreenCheckBox - Ativar Tela Cheia:\nMove automaticamente a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. + Ativar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. separateUpdatesCheckBox @@ -805,7 +821,11 @@ Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. - GUIgroupBox + chooseHomeTabGroupBox + do menu. + + + GUIMusicGroupBox Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 00a9eb179..9791a7682 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Mod Ecran Complet + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Tab-ul implicit la deschiderea setărilor + Show Game Size In List Afișează dimensiunea jocului în listă @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Interfață + + + User + Utilizator + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. - GUIgroupBox + GUIMusicGroupBox Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 4c90450dd..6423f5ba4 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -540,10 +540,18 @@ Enable Fullscreen Полноэкранный режим + + Fullscreen Mode + Режим Полного Экран + Enable Separate Update Folder Отдельная папка обновлений + + Default tab when opening settings + Вкладка по умолчанию при открытии настроек + Show Game Size In List Показать размер игры в списке @@ -620,6 +628,14 @@ Graphics Графика + + Gui + Интерфейс + + + User + Пользователь + Graphics Device Графическое устройство @@ -805,7 +821,7 @@ Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. - GUIgroupBox + GUIMusicGroupBox Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 768db1e75..2f88b4390 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -540,10 +540,18 @@ Enable Fullscreen Aktivizo Ekranin e plotë + + Fullscreen Mode + Modaliteti i Plotë + Enable Separate Update Folder Aktivizo dosjen e ndarë të përditësimit + + Default tab when opening settings + Skeda e parazgjedhur kur hapni cilësimet + Show Game Size In List Shfaq madhësinë e lojës në listë @@ -620,6 +628,14 @@ Graphics Grafika + + Gui + Ndërfaqe + + + User + Përdorues + Graphics Device Pajisja e Grafikës @@ -805,7 +821,7 @@ Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. - GUIgroupBox + GUIMusicGroupBox Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në GUI. diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 3781ba45c..e17944f12 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1032,10 +1032,18 @@ Enable Fullscreen Aktivera helskärm + + Fullscreen Mode + Helskärmsläge + Enable Separate Update Folder Aktivera separat uppdateringsmapp + + Default tab when opening settings + Standardflik när inställningar öppnas + Show Game Size In List Visa spelstorlek i listan @@ -1108,6 +1116,14 @@ Graphics Grafik + + Gui + Gränssnitt + + + User + Användare + Graphics Device Grafikenhet @@ -1285,7 +1301,7 @@ updaterGroupBox - GUIgroupBox + GUIMusicGroupBox Spela upp titelmusik:\nOm ett spel har stöd för det kan speciell musik spelas upp från spelet i gränssnittet diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 5e8499073..6436278de 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -540,10 +540,18 @@ Enable Fullscreen Tam Ekranı Etkinleştir + + Fullscreen Mode + Tam Ekran Modu + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Ayarlar açıldığında varsayılan sekme + Show Game Size In List Göster oyun boyutunu listede @@ -620,6 +628,14 @@ Graphics Grafikler + + Gui + Arayüz + + + User + Kullanıcı + Graphics Device Grafik Cihazı @@ -805,7 +821,7 @@ Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. - GUIgroupBox + GUIMusicGroupBox Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index a1c7e97e0..720ad5b99 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -540,10 +540,18 @@ Enable Fullscreen Увімкнути повноекранний режим + + Fullscreen Mode + Режим Повноекранний + Enable Separate Update Folder Увімкнути окрему папку оновлень + + Default tab when opening settings + Вкладка за замовчуванням при відкритті налаштувань + Show Game Size In List Показати розмір гри в списку @@ -620,6 +628,14 @@ Graphics Графіка + + Gui + Інтерфейс + + + User + Користувач + Graphics Device Графічний пристрій @@ -805,7 +821,7 @@ Оновлення:\nRelease: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nNightly: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. - GUIgroupBox + GUIMusicGroupBox Грати заголовну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index a579a1983..a81630fad 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + Chế độ Toàn màn hình + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + Tab mặc định khi mở cài đặt + Show Game Size In List Hiển thị Kích thước Game trong Danh sách @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + Giao diện + + + User + Người dùng + Graphics Device Graphics Device @@ -805,7 +821,7 @@ Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. - GUIgroupBox + GUIMusicGroupBox Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 5450f3dfd..b06b0a286 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -540,10 +540,18 @@ Enable Fullscreen 启用全屏 + + Fullscreen Mode + 全屏模式 + Enable Separate Update Folder 启用单独的更新目录 + + Default tab when opening settings + 打开设置时的默认选项卡 + Show Game Size In List 显示游戏大小在列表中 @@ -620,6 +628,14 @@ Graphics 图像 + + Gui + 界面 + + + User + 用户 + Graphics Device 图形设备 @@ -805,7 +821,7 @@ 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 - GUIgroupBox + GUIMusicGroupBox 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 0ce0b4d69..9f6758797 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -540,10 +540,18 @@ Enable Fullscreen Enable Fullscreen + + Fullscreen Mode + 全螢幕模式 + Enable Separate Update Folder Enable Separate Update Folder + + Default tab when opening settings + 打開設置時的默認選項卡 + Show Game Size In List 顯示遊戲大小在列表中 @@ -620,6 +628,14 @@ Graphics Graphics + + Gui + 介面 + + + User + 使用者 + Graphics Device Graphics Device @@ -805,7 +821,7 @@ 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 - GUIgroupBox + GUIMusicGroupBox 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 From 81e7e4b21646ad40edaae06f9b1e58eaea139b3c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 23 Jan 2025 00:52:22 +0200 Subject: [PATCH 123/455] Update building-linux.md --- documents/building-linux.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documents/building-linux.md b/documents/building-linux.md index 2672c70f4..28b8c6056 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -99,7 +99,7 @@ Open `cmake-gui` and specify the source code and build directories. If you clone Click on Configure, select "Unix Makefiles", select "Specify native compilers", click Next and choose `clang` and `clang++` as the C and CXX compilers. Usually they are located in `/bin/clang` and `/bin/clang++`. Click on Finish and let it configure the project. -Now every option should be displayed in red. Change anything you want, then click on Generate to make the changes permanent, then open a terminal window and do steps 2 and 3 of Option 1. +Now every option should be displayed in red. Change anything you want, then click on Generate to make the changes permanent, then open a terminal window and do step 2 of Option 1. #### Option 3: Visual Studio Code @@ -131,4 +131,4 @@ If you want to debug it, change the build type under Project Status > Configure Don't forget to change the launch target for both options to the shadPS4 executable inside shadPS4/build: -![image](https://raw.githubusercontent.com/shadps4-emu/shadPS4/refs/heads/main/documents/Screenshots/Linux/5.png) \ No newline at end of file +![image](https://raw.githubusercontent.com/shadps4-emu/shadPS4/refs/heads/main/documents/Screenshots/Linux/5.png) From cc2e13873f9be4e2f95e4da7a71e7333502fa183 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Wed, 22 Jan 2025 22:21:41 -0300 Subject: [PATCH 124/455] Fix showing debug menu bar / Devtools (#2214) * Fix showing debug menu bar / Devtools * Fix --- src/core/debug_state.cpp | 2 ++ src/core/debug_state.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/debug_state.cpp b/src/core/debug_state.cpp index 6508a9875..23ebcbb9b 100644 --- a/src/core/debug_state.cpp +++ b/src/core/debug_state.cpp @@ -17,6 +17,8 @@ using namespace DebugStateType; DebugStateImpl& DebugState = *Common::Singleton::Instance(); +bool DebugStateType::showing_debug_menu_bar = false; + static ThreadID ThisThreadID() { #ifdef _WIN32 return GetCurrentThreadId(); diff --git a/src/core/debug_state.h b/src/core/debug_state.h index a9e6f48b7..217efd1a9 100644 --- a/src/core/debug_state.h +++ b/src/core/debug_state.h @@ -35,6 +35,8 @@ class ShaderList; namespace DebugStateType { +extern bool showing_debug_menu_bar; + enum class QueueType { dcb = 0, ccb = 1, @@ -131,8 +133,6 @@ class DebugStateImpl { friend class Core::Devtools::Widget::FrameGraph; friend class Core::Devtools::Widget::ShaderList; - bool showing_debug_menu_bar = false; - std::queue debug_message_popup; std::mutex guest_threads_mutex{}; From cef92fbcaad34e0caa90bc5afbce5e5b30c43636 Mon Sep 17 00:00:00 2001 From: DemoJameson Date: Thu, 23 Jan 2025 19:28:44 +0800 Subject: [PATCH 125/455] Update Simplified Chinese translation (#2216) * Update Simplified Chinese translation * Fix incorrect translation * Fix new line --- src/qt_gui/translations/zh_CN.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index b06b0a286..16ae03f94 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -552,7 +552,7 @@ Default tab when opening settings 打开设置时的默认选项卡 - + Show Game Size In List 显示游戏大小在列表中 @@ -830,7 +830,7 @@ hideCursorGroupBox - 隐藏光标:\n选择光标何时消失:\n从不: 始终显示光标。\闲置: 光标在闲置若干秒后消失。\n始终: 始终显示光标。 + 隐藏光标:\n选择光标何时消失:\n从不: 从不隐藏光标。\n闲置:光标在闲置若干秒后消失。\n始终:始终隐藏光标。 idleTimeoutGroupBox @@ -928,6 +928,14 @@ rdocCheckBox 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 + + saveDataBox + 存档数据路径:\n保存游戏存档数据的目录。 + + + browseButton + 浏览:\n选择一个目录保存游戏存档数据。 + CheatsPatches From fb738bc24739704abcc87d87f25dd6a241c9719d Mon Sep 17 00:00:00 2001 From: Angelo Rosa Date: Thu, 23 Jan 2025 05:54:42 -0800 Subject: [PATCH 126/455] Optimize workflows by caching `apt install` (#2212) * optimize apt caches * change on push syntax * removing comments and check time improvements on following pushes * add recursive submodule fetch * Revert "add recursive submodule fetch" This reverts commit b059bda3b88aa7d81e4bee3348c9104536b15fd2. * restore old push on everyhing rule * fix libfuse2 uncaching package * moving qt deps outside from caching directives --- .github/workflows/build.yml | 48 ++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3da7163dd..a49ffefe9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,20 +24,27 @@ jobs: runs-on: ubuntu-24.04 continue-on-error: true steps: + - uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Install run: | wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main' - sudo apt update - sudo apt install clang-format-18 + + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: clang-format-18 + version: 1.0 + - name: Build env: COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} run: ./.ci/clang-format.sh - + + get-info: runs-on: ubuntu-24.04 outputs: @@ -282,7 +289,13 @@ jobs: submodules: recursive - name: Install dependencies - run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 clang build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev + run: | + sudo apt install -y libfuse2 + + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev clang build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev + version: 1.0 - name: Cache CMake Configuration uses: actions/cache@v4 @@ -338,7 +351,13 @@ jobs: submodules: recursive - name: Install dependencies - run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 clang build-essential qt6-base-dev qt6-tools-dev qt6-multimedia-dev libasound2-dev libpulse-dev libopenal-dev libudev-dev + run: | + sudo apt install -y libfuse2 qt6-base-dev qt6-tools-dev qt6-multimedia-dev + + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev clang build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev + version: 1.0 - name: Cache CMake Configuration uses: actions/cache@v4 @@ -385,7 +404,13 @@ jobs: submodules: recursive - name: Install dependencies - run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 gcc-14 build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev + run: | + sudo apt install -y libfuse2 + + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev gcc-14 build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev + version: 1.0 - name: Cache CMake Configuration uses: actions/cache@v4 @@ -421,7 +446,13 @@ jobs: submodules: recursive - name: Install dependencies - run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 gcc-14 build-essential qt6-base-dev qt6-tools-dev qt6-multimedia-dev libasound2-dev libpulse-dev libopenal-dev libudev-dev + run: | + sudo apt install -y libfuse2 qt6-base-dev qt6-tools-dev qt6-multimedia-dev + + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev gcc-14 build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev + version: 1.0 - name: Cache CMake Configuration uses: actions/cache@v4 @@ -443,7 +474,8 @@ jobs: key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - name: Configure CMake - run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DENABLE_QT_GUI=ON -DENABLE_UPDATER=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + run: | + cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DENABLE_QT_GUI=ON -DENABLE_UPDATER=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - name: Build run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(nproc) From 2e6c9b8f9866f48bd39dc35b25310e77e3fa89f6 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 23 Jan 2025 22:58:45 +0200 Subject: [PATCH 127/455] Revert "Optimize workflows by caching `apt install` (#2212)" (#2220) This reverts commit fb738bc24739704abcc87d87f25dd6a241c9719d. --- .github/workflows/build.yml | 48 +++++++------------------------------ 1 file changed, 8 insertions(+), 40 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a49ffefe9..3da7163dd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,27 +24,20 @@ jobs: runs-on: ubuntu-24.04 continue-on-error: true steps: - - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Install run: | wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main' - - - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: clang-format-18 - version: 1.0 - + sudo apt update + sudo apt install clang-format-18 - name: Build env: COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} run: ./.ci/clang-format.sh - - + get-info: runs-on: ubuntu-24.04 outputs: @@ -289,13 +282,7 @@ jobs: submodules: recursive - name: Install dependencies - run: | - sudo apt install -y libfuse2 - - - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev clang build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev - version: 1.0 + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 clang build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev - name: Cache CMake Configuration uses: actions/cache@v4 @@ -351,13 +338,7 @@ jobs: submodules: recursive - name: Install dependencies - run: | - sudo apt install -y libfuse2 qt6-base-dev qt6-tools-dev qt6-multimedia-dev - - - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev clang build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev - version: 1.0 + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 clang build-essential qt6-base-dev qt6-tools-dev qt6-multimedia-dev libasound2-dev libpulse-dev libopenal-dev libudev-dev - name: Cache CMake Configuration uses: actions/cache@v4 @@ -404,13 +385,7 @@ jobs: submodules: recursive - name: Install dependencies - run: | - sudo apt install -y libfuse2 - - - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev gcc-14 build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev - version: 1.0 + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 gcc-14 build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev - name: Cache CMake Configuration uses: actions/cache@v4 @@ -446,13 +421,7 @@ jobs: submodules: recursive - name: Install dependencies - run: | - sudo apt install -y libfuse2 qt6-base-dev qt6-tools-dev qt6-multimedia-dev - - - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev gcc-14 build-essential libasound2-dev libpulse-dev libopenal-dev libudev-dev - version: 1.0 + run: sudo apt-get update && sudo apt install -y libx11-dev libxext-dev libwayland-dev libdecor-0-dev libxkbcommon-dev libglfw3-dev libgles2-mesa-dev libfuse2 gcc-14 build-essential qt6-base-dev qt6-tools-dev qt6-multimedia-dev libasound2-dev libpulse-dev libopenal-dev libudev-dev - name: Cache CMake Configuration uses: actions/cache@v4 @@ -474,8 +443,7 @@ jobs: key: ${{ env.cache-name }}-${{ hashFiles('**/CMakeLists.txt', 'cmake/**') }} - name: Configure CMake - run: | - cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DENABLE_QT_GUI=ON -DENABLE_UPDATER=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + run: cmake --fresh -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DENABLE_QT_GUI=ON -DENABLE_UPDATER=ON -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache - name: Build run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --parallel $(nproc) From cdca420a2e8579832c7ebffb7ec2ed8f9e74030c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 23 Jan 2025 23:27:37 +0200 Subject: [PATCH 128/455] Update building-linux.md --- documents/building-linux.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/documents/building-linux.md b/documents/building-linux.md index 28b8c6056..eedcd6664 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -29,8 +29,7 @@ sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-co sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers ``` -**Note**: The `shadps4-git` AUR package is not maintained by any of the developers, and it uses GCC as the compiler as opposed to Clang. Use at your own discretion. -#### OpenSUSE +**Note**: The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion.#### OpenSUSE ``` sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers From 0ebe817a28afc14511578d183f8ef2afce3905aa Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 23 Jan 2025 23:46:15 +0200 Subject: [PATCH 129/455] Update building-linux.md --- documents/building-linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documents/building-linux.md b/documents/building-linux.md index eedcd6664..2342e9afc 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -29,7 +29,7 @@ sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-co sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers ``` -**Note**: The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion.#### OpenSUSE +**Note** : The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion.#### OpenSUSE ``` sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers From cc4ddd28c3f3cfe978a0be75131a99ca4e86851b Mon Sep 17 00:00:00 2001 From: Log3rinioo <80830849+Log3rinioo@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:56:06 +0100 Subject: [PATCH 130/455] Add missing Polish translations and fix typos (#2222) --- src/qt_gui/translations/pl_PL.ts | 86 ++++++++++++++++---------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 528e88337..85eb63bfb 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -52,7 +52,7 @@ Select which directory you want to install to. - Select which directory you want to install to. + Wybierz katalog, do którego chcesz zainstalować. @@ -130,35 +130,35 @@ Delete... - Delete... + Usuń... Delete Game - Delete Game + Usuń Grę Delete Update - Delete Update + Usuń Aktualizację Delete DLC - Delete DLC + Usuń DLC Compatibility... - Compatibility... + kompatybilność... Update database - Update database + Zaktualizuj bazę danych View report - View report + Wyświetl zgłoszenie Submit a report - Submit a report + Wyślij zgłoszenie Shortcut creation @@ -182,23 +182,23 @@ Game - Game + Gra requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. + Ta funkcja wymaga do działania opcji „Włącz oddzielny folder aktualizacji”. Jeśli chcesz korzystać z tej funkcji, włącz ją. This game has no update to delete! - This game has no update to delete! + Ta gra nie ma aktualizacji do usunięcia! Update - Update + Aktualizacja This game has no DLC to delete! - This game has no DLC to delete! + Ta gra nie ma DLC do usunięcia! DLC @@ -206,11 +206,11 @@ Delete %1 - Delete %1 + Usuń %1 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + Czy na pewno chcesz usunąć katalog %1 z %2? @@ -249,7 +249,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Otwórz folder shadPS4 Exit @@ -546,7 +546,7 @@ Enable Separate Update Folder - Enable Separate Update Folder + Włącz oddzielny folder aktualizacji Default tab when opening settings @@ -574,11 +574,11 @@ Trophy Key - Trophy Key + Klucz trofeów Trophy - Trophy + Trofeum Logger @@ -722,7 +722,7 @@ Disable Trophy Pop-ups - Disable Trophy Pop-ups + Wyłącz wyskakujące okienka trofeów Play title music @@ -730,19 +730,19 @@ Update Compatibility Database On Startup - Update Compatibility Database On Startup + Aktualizuj bazę danych zgodności podczas uruchamiania Game Compatibility - Game Compatibility + Kompatybilność gier Display Compatibility Data - Display Compatibility Data + Wyświetl dane zgodności Update Compatibility Database - Update Compatibility Database + Aktualizuj bazę danych zgodności Volume @@ -750,7 +750,7 @@ Audio Backend - Audio Backend + Zaplecze audio Save @@ -786,7 +786,7 @@ separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania. showSplashCheckBox @@ -798,7 +798,7 @@ discordRPCCheckbox - Włącz Discord Rich Presence:\nWyświetla ikonę emuladora i odpowiednie informacje na twoim profilu Discord. + Włącz Discord Rich Presence:\nWyświetla ikonę emulatora i odpowiednie informacje na twoim profilu Discord. userName @@ -806,7 +806,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Klucz trofeów:\nKlucz używany do odszyfrowywania trofeów. Musi być uzyskany z konsoli po jailbreaku. Musi zawierać tylko znaki w kodzie szesnastkowym. logTypeGroupBox @@ -826,7 +826,7 @@ disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Wyłącz wyskakujące okienka trofeów:\nWyłącz powiadomienia o trofeach w grze. Postępy w zdobywaniu trofeów można nadal śledzić za pomocą przeglądarki trofeów (kliknij prawym przyciskiem myszy grę w oknie głównym). hideCursorGroupBox @@ -842,15 +842,15 @@ enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję „Aktualizuj zgodność przy uruchomieniu”, aby uzyskać aktualne informacje. checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Aktualizuj zgodność przy uruchomieniu:\nAutomatycznie aktualizuj bazę danych kompatybilności podczas uruchamiania shadPS4. updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. Never @@ -933,7 +933,7 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + Kody / Łatki dla defaultTextEdit_MSG @@ -1145,7 +1145,7 @@ Failed to parse JSON: - Nie udało się przeanlizować JSON: + Nie udało się przeanalizować JSON: Can't apply cheats before the game is started @@ -1168,7 +1168,7 @@ Compatibility - Compatibility + Zgodność Region @@ -1196,7 +1196,7 @@ Never Played - Never Played + Nigdy nie grane h @@ -1212,27 +1212,27 @@ Compatibility is untested - Compatibility is untested + Kompatybilność nie została przetestowana Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Gra nie inicjuje się poprawnie / zawiesza się emulator Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Gra uruchamia się, ale wyświetla tylko pusty ekran Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Gra wyświetla obraz, ale nie przechodzi do menu Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Gra ma usterki przerywające rozgrywkę lub niegrywalną wydajność Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Grę można ukończyć z grywalną wydajnością i bez większych usterek From e652369f22fc7cbdd456ce338dd1dae0974c69a4 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 23 Jan 2025 23:58:43 +0200 Subject: [PATCH 131/455] sdl3 update (#2221) --- externals/MoltenVK/MoltenVK | 2 +- externals/sdl3 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/externals/MoltenVK/MoltenVK b/externals/MoltenVK/MoltenVK index 9f0b616d9..2473ce6f0 160000 --- a/externals/MoltenVK/MoltenVK +++ b/externals/MoltenVK/MoltenVK @@ -1 +1 @@ -Subproject commit 9f0b616d9e2c39464d2a859b79dbc655c4a30e7e +Subproject commit 2473ce6f0ab7d5d8a49aa91b2e37f3447a939f18 diff --git a/externals/sdl3 b/externals/sdl3 index 22422f774..a336b62d8 160000 --- a/externals/sdl3 +++ b/externals/sdl3 @@ -1 +1 @@ -Subproject commit 22422f7748d5128135995ed34c8f8012861c7332 +Subproject commit a336b62d8b0b97b09214e053203e442e2b6e2be5 From a8a779c79b48f020a1432274114f1ddaff0b1dec Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 24 Jan 2025 05:11:48 -0300 Subject: [PATCH 132/455] Fix AutoUpdate Changelog (#2224) --- src/qt_gui/check_update.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qt_gui/check_update.cpp b/src/qt_gui/check_update.cpp index e3e019144..0c1cce5da 100644 --- a/src/qt_gui/check_update.cpp +++ b/src/qt_gui/check_update.cpp @@ -146,14 +146,14 @@ void CheckUpdate::CheckForUpdates(const bool showMessage) { } QString currentRev = (updateChannel == "Nightly") - ? QString::fromStdString(Common::g_scm_rev).left(7) + ? QString::fromStdString(Common::g_scm_rev) : "v." + QString::fromStdString(Common::VERSION); QString currentDate = Common::g_scm_date; QDateTime dateTime = QDateTime::fromString(latestDate, Qt::ISODate); latestDate = dateTime.isValid() ? dateTime.toString("yyyy-MM-dd HH:mm:ss") : "Unknown date"; - if (latestRev == currentRev) { + if (latestRev == currentRev.left(7)) { if (showMessage) { QMessageBox::information(this, tr("Auto Updater"), tr("Your version is already up to date!")); @@ -190,7 +190,7 @@ void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate, QString("


" + tr("Update Channel") + ":
" + updateChannel + "
" + tr("Current Version") + ": %1 (%2)
" + tr("Latest Version") + ": %3 (%4)

" + tr("Do you want to update?") + "

") - .arg(currentRev, currentDate, latestRev, latestDate); + .arg(currentRev.left(7), currentDate, latestRev, latestDate); QLabel* updateLabel = new QLabel(updateText, this); layout->addWidget(updateLabel); From 91444a05453ba1468b29c575d844ae173cc7e738 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 00:21:32 -0800 Subject: [PATCH 133/455] liverpool: Fix tiled check for color buffer. (#2227) --- src/video_core/amdgpu/liverpool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index a29bde4ce..ec9c92ef1 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -904,7 +904,7 @@ struct Liverpool { } bool IsTiled() const { - return !info.linear_general; + return GetTilingMode() != TilingMode::Display_Linear; } [[nodiscard]] DataFormat GetDataFmt() const { From 74710116f6bdd805c39ffe7fff4be017df3ac910 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 00:21:56 -0800 Subject: [PATCH 134/455] renderer_vulkan: Remove dead code. (#2228) --- CMakeLists.txt | 2 - .../vk_descriptor_update_queue.cpp | 108 ------------------ .../vk_descriptor_update_queue.h | 51 --------- 3 files changed, 161 deletions(-) delete mode 100644 src/video_core/renderer_vulkan/vk_descriptor_update_queue.cpp delete mode 100644 src/video_core/renderer_vulkan/vk_descriptor_update_queue.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 131809c8e..3db142be7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -751,8 +751,6 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp src/video_core/renderer_vulkan/vk_common.h src/video_core/renderer_vulkan/vk_compute_pipeline.cpp src/video_core/renderer_vulkan/vk_compute_pipeline.h - src/video_core/renderer_vulkan/vk_descriptor_update_queue.cpp - src/video_core/renderer_vulkan/vk_descriptor_update_queue.h src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp src/video_core/renderer_vulkan/vk_graphics_pipeline.h src/video_core/renderer_vulkan/vk_instance.cpp diff --git a/src/video_core/renderer_vulkan/vk_descriptor_update_queue.cpp b/src/video_core/renderer_vulkan/vk_descriptor_update_queue.cpp deleted file mode 100644 index 7699bea9d..000000000 --- a/src/video_core/renderer_vulkan/vk_descriptor_update_queue.cpp +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "video_core/renderer_vulkan/vk_descriptor_update_queue.h" -#include "video_core/renderer_vulkan/vk_instance.h" - -namespace Vulkan { - -DescriptorUpdateQueue::DescriptorUpdateQueue(const Instance& instance, u32 descriptor_write_max_) - : device{instance.GetDevice()}, descriptor_write_max{descriptor_write_max_} { - descriptor_infos = std::make_unique(descriptor_write_max); - descriptor_writes = std::make_unique(descriptor_write_max); -} - -void DescriptorUpdateQueue::Flush() { - if (descriptor_write_end == 0) { - return; - } - device.updateDescriptorSets({std::span(descriptor_writes.get(), descriptor_write_end)}, {}); - descriptor_write_end = 0; -} - -void DescriptorUpdateQueue::AddStorageImage(vk::DescriptorSet target, u8 binding, - vk::ImageView image_view, - vk::ImageLayout image_layout) { - if (descriptor_write_end >= descriptor_write_max) [[unlikely]] { - Flush(); - } - - auto& image_info = descriptor_infos[descriptor_write_end].image_info; - image_info.sampler = VK_NULL_HANDLE; - image_info.imageView = image_view; - image_info.imageLayout = image_layout; - - descriptor_writes[descriptor_write_end++] = vk::WriteDescriptorSet{ - .dstSet = target, - .dstBinding = binding, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = vk::DescriptorType::eStorageImage, - .pImageInfo = &image_info, - }; -} - -void DescriptorUpdateQueue::AddImageSampler(vk::DescriptorSet target, u8 binding, u8 array_index, - vk::ImageView image_view, vk::Sampler sampler, - vk::ImageLayout image_layout) { - if (descriptor_write_end >= descriptor_write_max) [[unlikely]] { - Flush(); - } - - auto& image_info = descriptor_infos[descriptor_write_end].image_info; - image_info.sampler = sampler; - image_info.imageView = image_view; - image_info.imageLayout = image_layout; - - descriptor_writes[descriptor_write_end++] = vk::WriteDescriptorSet{ - .dstSet = target, - .dstBinding = binding, - .dstArrayElement = array_index, - .descriptorCount = 1, - .descriptorType = - sampler ? vk::DescriptorType::eCombinedImageSampler : vk::DescriptorType::eSampledImage, - .pImageInfo = &image_info, - }; -} - -void DescriptorUpdateQueue::AddBuffer(vk::DescriptorSet target, u8 binding, vk::Buffer buffer, - vk::DeviceSize offset, vk::DeviceSize size, - vk::DescriptorType type) { - if (descriptor_write_end >= descriptor_write_max) [[unlikely]] { - Flush(); - } - - auto& buffer_info = descriptor_infos[descriptor_write_end].buffer_info; - buffer_info.buffer = buffer; - buffer_info.offset = offset; - buffer_info.range = size; - - descriptor_writes[descriptor_write_end++] = vk::WriteDescriptorSet{ - .dstSet = target, - .dstBinding = binding, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = type, - .pBufferInfo = &buffer_info, - }; -} - -void DescriptorUpdateQueue::AddTexelBuffer(vk::DescriptorSet target, u8 binding, - vk::BufferView buffer_view) { - if (descriptor_write_end >= descriptor_write_max) [[unlikely]] { - Flush(); - } - - auto& buffer_info = descriptor_infos[descriptor_write_end].buffer_view; - buffer_info = buffer_view; - descriptor_writes[descriptor_write_end++] = vk::WriteDescriptorSet{ - .dstSet = target, - .dstBinding = binding, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = vk::DescriptorType::eUniformTexelBuffer, - .pTexelBufferView = &buffer_info, - }; -} - -} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_descriptor_update_queue.h b/src/video_core/renderer_vulkan/vk_descriptor_update_queue.h deleted file mode 100644 index 9e864db6e..000000000 --- a/src/video_core/renderer_vulkan/vk_descriptor_update_queue.h +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include "common/types.h" -#include "video_core/renderer_vulkan/vk_common.h" - -namespace Vulkan { - -class Instance; - -struct DescriptorInfoUnion { - DescriptorInfoUnion() {} - - union { - vk::DescriptorImageInfo image_info; - vk::DescriptorBufferInfo buffer_info; - vk::BufferView buffer_view; - }; -}; - -class DescriptorUpdateQueue { -public: - explicit DescriptorUpdateQueue(const Instance& instance, u32 descriptor_write_max = 2048); - ~DescriptorUpdateQueue() = default; - - void Flush(); - - void AddStorageImage(vk::DescriptorSet target, u8 binding, vk::ImageView image_view, - vk::ImageLayout image_layout = vk::ImageLayout::eGeneral); - - void AddImageSampler(vk::DescriptorSet target, u8 binding, u8 array_index, - vk::ImageView image_view, vk::Sampler sampler, - vk::ImageLayout imageLayout = vk::ImageLayout::eGeneral); - - void AddBuffer(vk::DescriptorSet target, u8 binding, vk::Buffer buffer, vk::DeviceSize offset, - vk::DeviceSize size = VK_WHOLE_SIZE, - vk::DescriptorType type = vk::DescriptorType::eUniformBufferDynamic); - - void AddTexelBuffer(vk::DescriptorSet target, u8 binding, vk::BufferView buffer_view); - -private: - const vk::Device device; - const u32 descriptor_write_max; - std::unique_ptr descriptor_infos; - std::unique_ptr descriptor_writes; - u32 descriptor_write_end = 0; -}; - -} // namespace Vulkan From d1b9a5adcceb0c61e03293db9840ca6844442398 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 00:23:18 -0800 Subject: [PATCH 135/455] texture_cache: Do not overwrite overlap hit with a miss. (#2217) --- src/video_core/texture_cache/texture_cache.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 04711539c..e995b10b2 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -345,8 +345,13 @@ ImageId TextureCache::FindImage(BaseDesc& desc, FindFlags flags) { view_slice = -1; const auto& merged_info = image_id ? slot_images[image_id].info : info; - std::tie(image_id, view_mip, view_slice) = + auto [overlap_image_id, overlap_view_mip, overlap_view_slice] = ResolveOverlap(merged_info, desc.type, cache_id, image_id); + if (overlap_image_id) { + image_id = overlap_image_id; + view_mip = overlap_view_mip; + view_slice = overlap_view_slice; + } } } From 481f420a892e02ac30bfe3e4966368900c69ead2 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 24 Jan 2025 10:28:14 +0200 Subject: [PATCH 136/455] Update building-linux.md --- documents/building-linux.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/documents/building-linux.md b/documents/building-linux.md index 2342e9afc..4aa66aac6 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -29,7 +29,9 @@ sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-co sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers ``` -**Note** : The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion.#### OpenSUSE +**Note** : The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion. + +#### OpenSUSE ``` sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers @@ -48,6 +50,7 @@ distrobox create --name archlinux --init --image archlinux:latest and install the dependencies on that container as cited above. This option is **highly recommended** for NixOS and distributions with immutable/atomic filesystems (example: Fedora Kinoite, SteamOS). + ### Cloning ``` From 0f69697acb7504e57abe2b15238b2c92414a0d8f Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 00:48:39 -0800 Subject: [PATCH 137/455] documents: Update CPU requirements. (#2229) --- documents/Quickstart/Quickstart.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/documents/Quickstart/Quickstart.md b/documents/Quickstart/Quickstart.md index b2931e51e..2f2751887 100644 --- a/documents/Quickstart/Quickstart.md +++ b/documents/Quickstart/Quickstart.md @@ -22,7 +22,10 @@ SPDX-License-Identifier: GPL-2.0-or-later - A processor with at least 4 cores and 6 threads - Above 2.5 GHz frequency -- required support AVX2 extension or Rosetta 2 on ARM +- A CPU supporting the following instruction sets: MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, F16C, CLMUL, AES, BMI1, MOVBE, XSAVE, ABM + - **Intel**: Haswell generation or newer + - **AMD**: Jaguar generation or newer + - **Apple**: Rosetta 2 on macOS 15 or newer ### GPU From 9dcf40e261c6775a997b92d26a4bd8113821c6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Fri, 24 Jan 2025 11:07:36 +0000 Subject: [PATCH 138/455] Handle more 64bit shifts in Translator (#1825) --- .../frontend/translate/scalar_alu.cpp | 22 ++++++++++++++++++- .../frontend/translate/translate.h | 2 ++ .../frontend/translate/vector_alu.cpp | 4 ++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index 7f34126f5..b1b260fde 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -72,10 +72,14 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { return S_OR_B64(NegateMode::Result, true, inst); case Opcode::S_LSHL_B32: return S_LSHL_B32(inst); + case Opcode::S_LSHL_B64: + return S_LSHL_B64(inst); case Opcode::S_LSHR_B32: return S_LSHR_B32(inst); case Opcode::S_ASHR_I32: return S_ASHR_I32(inst); + case Opcode::S_ASHR_I64: + return S_ASHR_I64(inst); case Opcode::S_BFM_B32: return S_BFM_B32(inst); case Opcode::S_MUL_I32: @@ -420,6 +424,14 @@ void Translator::S_LSHL_B32(const GcnInst& inst) { ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); } +void Translator::S_LSHL_B64(const GcnInst& inst) { + const IR::U64 src0{GetSrc64(inst.src[0])}; + const IR::U64 src1{GetSrc64(inst.src[1])}; + const IR::U64 result = ir.ShiftLeftLogical(src0, ir.BitwiseAnd(src1, ir.Imm64(u64(0x3F)))); + SetDst64(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm64(u64(0)))); +} + void Translator::S_LSHR_B32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; @@ -431,11 +443,19 @@ void Translator::S_LSHR_B32(const GcnInst& inst) { void Translator::S_ASHR_I32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result{ir.ShiftRightArithmetic(src0, src1)}; + const IR::U32 result{ir.ShiftRightArithmetic(src0, ir.BitwiseAnd(src1, ir.Imm32(0x1F)))}; SetDst(inst.dst[0], result); ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); } +void Translator::S_ASHR_I64(const GcnInst& inst) { + const IR::U64 src0{GetSrc64(inst.src[0])}; + const IR::U64 src1{GetSrc64(inst.src[1])}; + const IR::U64 result{ir.ShiftRightArithmetic(src0, ir.BitwiseAnd(src1, ir.Imm64(u64(0x3F))))}; + SetDst64(inst.dst[0], result); + ir.SetScc(ir.INotEqual(result, ir.Imm64(u64(0)))); +} + void Translator::S_BFM_B32(const GcnInst& inst) { const IR::U32 src0{ir.BitwiseAnd(GetSrc(inst.src[0]), ir.Imm32(0x1F))}; const IR::U32 src1{ir.BitwiseAnd(GetSrc(inst.src[1]), ir.Imm32(0x1F))}; diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index bef61f997..496455b50 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -90,8 +90,10 @@ public: void S_OR_B64(NegateMode negate, bool is_xor, const GcnInst& inst); void S_XOR_B32(const GcnInst& inst); void S_LSHL_B32(const GcnInst& inst); + void S_LSHL_B64(const GcnInst& inst); void S_LSHR_B32(const GcnInst& inst); void S_ASHR_I32(const GcnInst& inst); + void S_ASHR_I64(const GcnInst& inst); void S_BFM_B32(const GcnInst& inst); void S_MUL_I32(const GcnInst& inst); void S_BFE(const GcnInst& inst, bool is_signed); diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index b2863f6a8..ac72293e4 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -1273,6 +1273,10 @@ void Translator::V_LSHL_B64(const GcnInst& inst) { ir.SetVectorReg(dst_reg + 1, ir.Imm32(static_cast(result >> 32))); return; } + + const IR::U64 result = ir.ShiftLeftLogical(src0, ir.BitwiseAnd(src1, ir.Imm64(u64(0x3F)))); + SetDst64(inst.dst[0], result); + return; } UNREACHABLE_MSG("Unimplemented V_LSHL_B64 arguments"); } From 4d12de8149cce521916f7752a0830430170144db Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 03:11:13 -0800 Subject: [PATCH 139/455] hotfix: 64-bit shift fixups --- .../backend/spirv/emit_spirv_instructions.h | 3 ++- .../backend/spirv/emit_spirv_integer.cpp | 6 ++++- .../frontend/translate/vector_alu.cpp | 23 +------------------ src/shader_recompiler/ir/ir_emitter.cpp | 14 +++++++++-- src/shader_recompiler/ir/ir_emitter.h | 2 +- src/shader_recompiler/ir/opcodes.inc | 3 ++- .../ir/passes/constant_propagation_pass.cpp | 5 +++- 7 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index f0bb9fd7e..4833dc9d0 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -348,7 +348,8 @@ Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs); Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs); Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs); Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs); -Id EmitINotEqual(EmitContext& ctx, Id lhs, Id rhs); +Id EmitINotEqual32(EmitContext& ctx, Id lhs, Id rhs); +Id EmitINotEqual64(EmitContext& ctx, Id lhs, Id rhs); Id EmitSGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs); Id EmitUGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs); Id EmitLogicalOr(EmitContext& ctx, Id a, Id b); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp index 70411ecec..e2d702389 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp @@ -324,7 +324,11 @@ Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs) { return ctx.OpUGreaterThan(ctx.U1[1], lhs, rhs); } -Id EmitINotEqual(EmitContext& ctx, Id lhs, Id rhs) { +Id EmitINotEqual32(EmitContext& ctx, Id lhs, Id rhs) { + return ctx.OpINotEqual(ctx.U1[1], lhs, rhs); +} + +Id EmitINotEqual64(EmitContext& ctx, Id lhs, Id rhs) { return ctx.OpINotEqual(ctx.U1[1], lhs, rhs); } diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index ac72293e4..42dbcc513 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -1257,28 +1257,7 @@ void Translator::V_CVT_PK_U8_F32(const GcnInst& inst) { void Translator::V_LSHL_B64(const GcnInst& inst) { const IR::U64 src0{GetSrc64(inst.src[0])}; const IR::U64 src1{GetSrc64(inst.src[1])}; - const IR::VectorReg dst_reg{inst.dst[0].code}; - if (src0.IsImmediate()) { - if (src0.U64() == -1) { - // If src0 is a fixed -1, the result will always be -1. - ir.SetVectorReg(dst_reg, ir.Imm32(0xFFFFFFFF)); - ir.SetVectorReg(dst_reg + 1, ir.Imm32(0xFFFFFFFF)); - return; - } - if (src1.IsImmediate()) { - // If both src0 and src1 are immediates, we can calculate the result now. - // Note that according to the manual, only bits 4:0 are used from src1. - const u64 result = src0.U64() << (src1.U64() & 0x1F); - ir.SetVectorReg(dst_reg, ir.Imm32(static_cast(result))); - ir.SetVectorReg(dst_reg + 1, ir.Imm32(static_cast(result >> 32))); - return; - } - - const IR::U64 result = ir.ShiftLeftLogical(src0, ir.BitwiseAnd(src1, ir.Imm64(u64(0x3F)))); - SetDst64(inst.dst[0], result); - return; - } - UNREACHABLE_MSG("Unimplemented V_LSHL_B64 arguments"); + SetDst64(inst.dst[0], ir.ShiftLeftLogical(src0, ir.BitwiseAnd(src1, ir.Imm64(u64(0x3F))))); } void Translator::V_MUL_F64(const GcnInst& inst) { diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index 5ac08e7dc..f0558665b 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -1461,8 +1461,18 @@ U1 IREmitter::IGreaterThan(const U32& lhs, const U32& rhs, bool is_signed) { return Inst(is_signed ? Opcode::SGreaterThan : Opcode::UGreaterThan, lhs, rhs); } -U1 IREmitter::INotEqual(const U32& lhs, const U32& rhs) { - return Inst(Opcode::INotEqual, lhs, rhs); +U1 IREmitter::INotEqual(const U32U64& lhs, const U32U64& rhs) { + if (lhs.Type() != rhs.Type()) { + UNREACHABLE_MSG("Mismatching types {} and {}", lhs.Type(), rhs.Type()); + } + switch (lhs.Type()) { + case Type::U32: + return Inst(Opcode::INotEqual32, lhs, rhs); + case Type::U64: + return Inst(Opcode::INotEqual64, lhs, rhs); + default: + ThrowInvalidType(lhs.Type()); + } } U1 IREmitter::IGreaterThanEqual(const U32& lhs, const U32& rhs, bool is_signed) { diff --git a/src/shader_recompiler/ir/ir_emitter.h b/src/shader_recompiler/ir/ir_emitter.h index d1dc44d74..5dd49ce7a 100644 --- a/src/shader_recompiler/ir/ir_emitter.h +++ b/src/shader_recompiler/ir/ir_emitter.h @@ -258,7 +258,7 @@ public: [[nodiscard]] U1 IEqual(const U32U64& lhs, const U32U64& rhs); [[nodiscard]] U1 ILessThanEqual(const U32& lhs, const U32& rhs, bool is_signed); [[nodiscard]] U1 IGreaterThan(const U32& lhs, const U32& rhs, bool is_signed); - [[nodiscard]] U1 INotEqual(const U32& lhs, const U32& rhs); + [[nodiscard]] U1 INotEqual(const U32U64& lhs, const U32U64& rhs); [[nodiscard]] U1 IGreaterThanEqual(const U32& lhs, const U32& rhs, bool is_signed); [[nodiscard]] U1 LogicalOr(const U1& a, const U1& b); diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index b45151dba..63a4e1e62 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -321,7 +321,8 @@ OPCODE(SLessThanEqual, U1, U32, OPCODE(ULessThanEqual, U1, U32, U32, ) OPCODE(SGreaterThan, U1, U32, U32, ) OPCODE(UGreaterThan, U1, U32, U32, ) -OPCODE(INotEqual, U1, U32, U32, ) +OPCODE(INotEqual32, U1, U32, U32, ) +OPCODE(INotEqual64, U1, U64, U64, ) OPCODE(SGreaterThanEqual, U1, U32, U32, ) OPCODE(UGreaterThanEqual, U1, U32, U32, ) diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp index 26d819d8e..12a1b56e9 100644 --- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp @@ -403,9 +403,12 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { case IR::Opcode::IEqual64: FoldWhenAllImmediates(inst, [](u64 a, u64 b) { return a == b; }); return; - case IR::Opcode::INotEqual: + case IR::Opcode::INotEqual32: FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a != b; }); return; + case IR::Opcode::INotEqual64: + FoldWhenAllImmediates(inst, [](u64 a, u64 b) { return a != b; }); + return; case IR::Opcode::BitwiseAnd32: FoldWhenAllImmediates(inst, [](u32 a, u32 b) { return a & b; }); return; From 4f426b723f2f015af022e2f9c48813448c264d7b Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:30:55 +0100 Subject: [PATCH 140/455] Rebase of "Handle munmap over multiple VMAs" (#2233) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Unmap memory in chunks if spanning over multiple VMAs * clang * Merge fixups * Minor code style changes * Update function declarations --------- Co-authored-by: Marcin Mikołajczyk --- src/core/memory.cpp | 49 +++++++++++++++++++++++++++++---------------- src/core/memory.h | 4 +++- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index f90d4e6aa..a8dd72acc 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -389,32 +389,29 @@ s32 MemoryManager::UnmapMemory(VAddr virtual_addr, size_t size) { return UnmapMemoryImpl(virtual_addr, size); } -s32 MemoryManager::UnmapMemoryImpl(VAddr virtual_addr, size_t size) { - const auto it = FindVMA(virtual_addr); - const auto& vma_base = it->second; - ASSERT_MSG(vma_base.Contains(virtual_addr, size), - "Existing mapping does not contain requested unmap range"); - - const auto type = vma_base.type; - if (type == VMAType::Free) { - return ORBIS_OK; - } - +u64 MemoryManager::UnmapBytesFromEntry(VAddr virtual_addr, VirtualMemoryArea vma_base, u64 size) { const auto vma_base_addr = vma_base.base; const auto vma_base_size = vma_base.size; + const auto type = vma_base.type; const auto phys_base = vma_base.phys_base; const bool is_exec = vma_base.is_exec; const auto start_in_vma = virtual_addr - vma_base_addr; + const auto adjusted_size = + vma_base_size - start_in_vma < size ? vma_base_size - start_in_vma : size; const bool has_backing = type == VMAType::Direct || type == VMAType::File; + + if (type == VMAType::Free) { + return adjusted_size; + } if (type == VMAType::Direct || type == VMAType::Pooled) { - rasterizer->UnmapMemory(virtual_addr, size); + rasterizer->UnmapMemory(virtual_addr, adjusted_size); } if (type == VMAType::Flexible) { - flexible_usage -= size; + flexible_usage -= adjusted_size; } // Mark region as free and attempt to coalesce it with neighbours. - const auto new_it = CarveVMA(virtual_addr, size); + const auto new_it = CarveVMA(virtual_addr, adjusted_size); auto& vma = new_it->second; vma.type = VMAType::Free; vma.prot = MemoryProt::NoAccess; @@ -423,13 +420,25 @@ s32 MemoryManager::UnmapMemoryImpl(VAddr virtual_addr, size_t size) { vma.name = ""; MergeAdjacent(vma_map, new_it); bool readonly_file = vma.prot == MemoryProt::CpuRead && type == VMAType::File; - if (type != VMAType::Reserved && type != VMAType::PoolReserved) { // Unmap the memory region. - impl.Unmap(vma_base_addr, vma_base_size, start_in_vma, start_in_vma + size, phys_base, - is_exec, has_backing, readonly_file); + impl.Unmap(vma_base_addr, vma_base_size, start_in_vma, start_in_vma + adjusted_size, + phys_base, is_exec, has_backing, readonly_file); TRACK_FREE(virtual_addr, "VMEM"); } + return adjusted_size; +} + +s32 MemoryManager::UnmapMemoryImpl(VAddr virtual_addr, u64 size) { + u64 unmapped_bytes = 0; + do { + auto it = FindVMA(virtual_addr + unmapped_bytes); + auto& vma_base = it->second; + auto unmapped = + UnmapBytesFromEntry(virtual_addr + unmapped_bytes, vma_base, size - unmapped_bytes); + ASSERT_MSG(unmapped > 0, "Failed to unmap memory, progress is impossible"); + unmapped_bytes += unmapped; + } while (unmapped_bytes < size); return ORBIS_OK; } @@ -651,6 +660,12 @@ MemoryManager::VMAHandle MemoryManager::CarveVMA(VAddr virtual_addr, size_t size const VAddr start_in_vma = virtual_addr - vma.base; const VAddr end_in_vma = start_in_vma + size; + + if (start_in_vma == 0 && size == vma.size) { + // if requsting the whole VMA, return it + return vma_handle; + } + ASSERT_MSG(end_in_vma <= vma.size, "Mapping cannot fit inside free region"); if (end_in_vma != vma.size) { diff --git a/src/core/memory.h b/src/core/memory.h index 615ecc3eb..59e48b248 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -252,7 +252,9 @@ private: DMemHandle Split(DMemHandle dmem_handle, size_t offset_in_area); - s32 UnmapMemoryImpl(VAddr virtual_addr, size_t size); + u64 UnmapBytesFromEntry(VAddr virtual_addr, VirtualMemoryArea vma_base, u64 size); + + s32 UnmapMemoryImpl(VAddr virtual_addr, u64 size); private: AddressSpace impl; From a4eba8e827c062b5e6874255ff810346943d0ea2 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 24 Jan 2025 19:22:06 +0200 Subject: [PATCH 141/455] stubbed webbrowserdialog,npparty (#2234) * stubbed webbrowserdialog,npparty * added poly's suggestions --- CMakeLists.txt | 4 + src/common/logging/filter.cpp | 2 + src/common/logging/types.h | 2 + src/core/libraries/libs.cpp | 4 + src/core/libraries/np_party/np_party.cpp | 195 ++++++++++++++++++ src/core/libraries/np_party/np_party.h | 44 ++++ .../web_browser_dialog/webbrowserdialog.cpp | 112 ++++++++++ .../web_browser_dialog/webbrowserdialog.h | 30 +++ 8 files changed, 393 insertions(+) create mode 100644 src/core/libraries/np_party/np_party.cpp create mode 100644 src/core/libraries/np_party/np_party.h create mode 100644 src/core/libraries/web_browser_dialog/webbrowserdialog.cpp create mode 100644 src/core/libraries/web_browser_dialog/webbrowserdialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3db142be7..4c9dad307 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -344,6 +344,8 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp src/core/libraries/razor_cpu/razor_cpu.h src/core/libraries/mouse/mouse.cpp src/core/libraries/mouse/mouse.h + src/core/libraries/web_browser_dialog/webbrowserdialog.cpp + src/core/libraries/web_browser_dialog/webbrowserdialog.h ) set(VIDEOOUT_LIB src/core/libraries/videoout/buffer.h @@ -434,6 +436,8 @@ set(NP_LIBS src/core/libraries/np_common/np_common.cpp src/core/libraries/np_trophy/np_trophy_error.h src/core/libraries/np_web_api/np_web_api.cpp src/core/libraries/np_web_api/np_web_api.h + src/core/libraries/np_party/np_party.cpp + src/core/libraries/np_party/np_party.h ) set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 168d03948..f1d3a9499 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -131,6 +131,8 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, Videodec) \ SUB(Lib, RazorCpu) \ SUB(Lib, Mouse) \ + SUB(Lib, WebBrowserDialog) \ + SUB(Lib, NpParty) \ CLS(Frontend) \ CLS(Render) \ SUB(Render, Vulkan) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 4ca88e1be..d5530312c 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -98,6 +98,8 @@ enum class Class : u8 { Lib_Videodec, ///< The LibSceVideodec implementation. Lib_RazorCpu, ///< The LibRazorCpu implementation. Lib_Mouse, ///< The LibSceMouse implementation + Lib_WebBrowserDialog, ///< The LibSceWebBrowserDialog implementation + Lib_NpParty, ///< The LibSceNpParty implementation Frontend, ///< Emulator UI Render, ///< Video Core Render_Vulkan, ///< Vulkan backend diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 6dc455028..e09de1cee 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -28,6 +28,7 @@ #include "core/libraries/network/ssl2.h" #include "core/libraries/np_common/np_common.h" #include "core/libraries/np_manager/np_manager.h" +#include "core/libraries/np_party/np_party.h" #include "core/libraries/np_score/np_score.h" #include "core/libraries/np_trophy/np_trophy.h" #include "core/libraries/np_web_api/np_web_api.h" @@ -52,6 +53,7 @@ #include "core/libraries/videodec/videodec.h" #include "core/libraries/videodec/videodec2.h" #include "core/libraries/videoout/video_out.h" +#include "core/libraries/web_browser_dialog/webbrowserdialog.h" #include "fiber/fiber.h" #include "jpeg/jpegenc.h" @@ -107,6 +109,8 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::Fiber::RegisterlibSceFiber(sym); Libraries::JpegEnc::RegisterlibSceJpegEnc(sym); Libraries::Mouse::RegisterlibSceMouse(sym); + Libraries::WebBrowserDialog::RegisterlibSceWebBrowserDialog(sym); + Libraries::NpParty::RegisterlibSceNpParty(sym); } } // namespace Libraries diff --git a/src/core/libraries/np_party/np_party.cpp b/src/core/libraries/np_party/np_party.cpp new file mode 100644 index 000000000..8a66ccb22 --- /dev/null +++ b/src/core/libraries/np_party/np_party.cpp @@ -0,0 +1,195 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "core/libraries/np_party/np_party.h" + +namespace Libraries::NpParty { + +s32 PS4_SYSV_ABI sceNpPartyCheckCallback() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyCreate() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyCreateA() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetId() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetMemberInfo() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetMemberInfoA() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetMembers() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetMembersA() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetMemberSessionInfo() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetMemberVoiceInfo() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetState() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetStateAsUser() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetStateAsUserA() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyGetVoiceChatPriority() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyInitialize() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyJoin() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyLeave() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyRegisterHandler() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyRegisterHandlerA() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyRegisterPrivateHandler() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartySendBinaryMessage() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartySetVoiceChatPriority() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyShowInvitationList() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyShowInvitationListA() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyTerminate() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNpPartyUnregisterPrivateHandler() { + LOG_ERROR(Lib_NpParty, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceNpParty(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("3e4k2mzLkmc", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyCheckCallback); + LIB_FUNCTION("nOZRy-slBoA", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyCreate); + LIB_FUNCTION("XQSUbbnpPBA", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyCreateA); + LIB_FUNCTION("DRA3ay-1DFQ", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyGetId); + LIB_FUNCTION("F1P+-wpxQow", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyGetMemberInfo); + LIB_FUNCTION("v2RYVGrJDkM", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyGetMemberInfoA); + LIB_FUNCTION("T2UOKf00ZN0", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyGetMembers); + LIB_FUNCTION("TaNw7W25QJw", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyGetMembersA); + LIB_FUNCTION("4gOMfNYzllw", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyGetMemberSessionInfo); + LIB_FUNCTION("EKi1jx59SP4", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyGetMemberVoiceInfo); + LIB_FUNCTION("aEzKdJzATZ0", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyGetState); + LIB_FUNCTION("o7grRhiGHYI", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyGetStateAsUser); + LIB_FUNCTION("EjyAI+QNgFw", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyGetStateAsUserA); + LIB_FUNCTION("-lc6XZnQXvM", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyGetVoiceChatPriority); + LIB_FUNCTION("lhYCTQmBkds", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyInitialize); + LIB_FUNCTION("RXNCDw2GDEg", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyJoin); + LIB_FUNCTION("J8jAi-tfJHc", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyLeave); + LIB_FUNCTION("kA88gbv71ao", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyRegisterHandler); + LIB_FUNCTION("+v4fVHMwFWc", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyRegisterHandlerA); + LIB_FUNCTION("zo4G5WWYpKg", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyRegisterPrivateHandler); + LIB_FUNCTION("U6VdUe-PNAY", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartySendBinaryMessage); + LIB_FUNCTION("nazKyHygHhY", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartySetVoiceChatPriority); + LIB_FUNCTION("-MFiL7hEnPE", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyShowInvitationList); + LIB_FUNCTION("yARHEYLajs0", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyShowInvitationListA); + LIB_FUNCTION("oLYkibiHqRA", "libSceNpParty", 1, "libSceNpParty", 1, 1, sceNpPartyTerminate); + LIB_FUNCTION("zQ7gIvt11Pc", "libSceNpParty", 1, "libSceNpParty", 1, 1, + sceNpPartyUnregisterPrivateHandler); + LIB_FUNCTION("nOZRy-slBoA", "libSceNpPartyCompat", 1, "libSceNpParty", 1, 1, sceNpPartyCreate); + LIB_FUNCTION("F1P+-wpxQow", "libSceNpPartyCompat", 1, "libSceNpParty", 1, 1, + sceNpPartyGetMemberInfo); + LIB_FUNCTION("T2UOKf00ZN0", "libSceNpPartyCompat", 1, "libSceNpParty", 1, 1, + sceNpPartyGetMembers); + LIB_FUNCTION("o7grRhiGHYI", "libSceNpPartyCompat", 1, "libSceNpParty", 1, 1, + sceNpPartyGetStateAsUser); + LIB_FUNCTION("kA88gbv71ao", "libSceNpPartyCompat", 1, "libSceNpParty", 1, 1, + sceNpPartyRegisterHandler); + LIB_FUNCTION("-MFiL7hEnPE", "libSceNpPartyCompat", 1, "libSceNpParty", 1, 1, + sceNpPartyShowInvitationList); +}; + +} // namespace Libraries::NpParty \ No newline at end of file diff --git a/src/core/libraries/np_party/np_party.h b/src/core/libraries/np_party/np_party.h new file mode 100644 index 000000000..d5f20e4f8 --- /dev/null +++ b/src/core/libraries/np_party/np_party.h @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::NpParty { + +s32 PS4_SYSV_ABI sceNpPartyCheckCallback(); +s32 PS4_SYSV_ABI sceNpPartyCreate(); +s32 PS4_SYSV_ABI sceNpPartyCreateA(); +s32 PS4_SYSV_ABI sceNpPartyGetId(); +s32 PS4_SYSV_ABI sceNpPartyGetMemberInfo(); +s32 PS4_SYSV_ABI sceNpPartyGetMemberInfoA(); +s32 PS4_SYSV_ABI sceNpPartyGetMembers(); +s32 PS4_SYSV_ABI sceNpPartyGetMembersA(); +s32 PS4_SYSV_ABI sceNpPartyGetMemberSessionInfo(); +s32 PS4_SYSV_ABI sceNpPartyGetMemberVoiceInfo(); +s32 PS4_SYSV_ABI sceNpPartyGetState(); +s32 PS4_SYSV_ABI sceNpPartyGetStateAsUser(); +s32 PS4_SYSV_ABI sceNpPartyGetStateAsUserA(); +s32 PS4_SYSV_ABI sceNpPartyGetVoiceChatPriority(); +s32 PS4_SYSV_ABI sceNpPartyInitialize(); +s32 PS4_SYSV_ABI sceNpPartyJoin(); +s32 PS4_SYSV_ABI sceNpPartyLeave(); +s32 PS4_SYSV_ABI sceNpPartyRegisterHandler(); +s32 PS4_SYSV_ABI sceNpPartyRegisterHandlerA(); +s32 PS4_SYSV_ABI sceNpPartyRegisterPrivateHandler(); +s32 PS4_SYSV_ABI sceNpPartySendBinaryMessage(); +s32 PS4_SYSV_ABI sceNpPartySetVoiceChatPriority(); +s32 PS4_SYSV_ABI sceNpPartyShowInvitationList(); +s32 PS4_SYSV_ABI sceNpPartyShowInvitationListA(); +s32 PS4_SYSV_ABI sceNpPartyTerminate(); +s32 PS4_SYSV_ABI sceNpPartyUnregisterPrivateHandler(); +s32 PS4_SYSV_ABI module_start(); +s32 PS4_SYSV_ABI module_stop(); + +void RegisterlibSceNpParty(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::NpParty \ No newline at end of file diff --git a/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp b/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp new file mode 100644 index 000000000..ee434f96a --- /dev/null +++ b/src/core/libraries/web_browser_dialog/webbrowserdialog.cpp @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "core/libraries/web_browser_dialog/webbrowserdialog.h" + +namespace Libraries::WebBrowserDialog { + +s32 PS4_SYSV_ABI sceWebBrowserDialogClose() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogGetEvent() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogGetResult() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogGetStatus() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogInitialize() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogNavigate() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogOpen() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogOpenForPredeterminedContent() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogResetCookie() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogSetCookie() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogSetZoom() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogTerminate() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceWebBrowserDialogUpdateStatus() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_F2BE042771625F8C() { + LOG_ERROR(Lib_WebBrowserDialog, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceWebBrowserDialog(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("PSK+Eik919Q", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogClose); + LIB_FUNCTION("Wit4LjeoeX4", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogGetEvent); + LIB_FUNCTION("vCaW0fgVQmc", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogGetResult); + LIB_FUNCTION("CFTG6a8TjOU", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogGetStatus); + LIB_FUNCTION("jqb7HntFQFc", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogInitialize); + LIB_FUNCTION("uYELOMVnmNQ", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogNavigate); + LIB_FUNCTION("FraP7debcdg", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogOpen); + LIB_FUNCTION("O7dIZQrwVFY", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogOpenForPredeterminedContent); + LIB_FUNCTION("Cya+jvTtPqg", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogResetCookie); + LIB_FUNCTION("TZnDVkP91Rg", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogSetCookie); + LIB_FUNCTION("RLhKBOoNyXY", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogSetZoom); + LIB_FUNCTION("ocHtyBwHfys", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogTerminate); + LIB_FUNCTION("h1dR-t5ISgg", "libSceWebBrowserDialog", 1, "libSceWebBrowserDialog", 1, 1, + sceWebBrowserDialogUpdateStatus); + LIB_FUNCTION("8r4EJ3FiX4w", "libSceWebBrowserDialogLimited", 1, "libSceWebBrowserDialog", 1, 1, + Func_F2BE042771625F8C); +}; + +} // namespace Libraries::WebBrowserDialog \ No newline at end of file diff --git a/src/core/libraries/web_browser_dialog/webbrowserdialog.h b/src/core/libraries/web_browser_dialog/webbrowserdialog.h new file mode 100644 index 000000000..aa118fe45 --- /dev/null +++ b/src/core/libraries/web_browser_dialog/webbrowserdialog.h @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::WebBrowserDialog { + +s32 PS4_SYSV_ABI sceWebBrowserDialogClose(); +s32 PS4_SYSV_ABI sceWebBrowserDialogGetEvent(); +s32 PS4_SYSV_ABI sceWebBrowserDialogGetResult(); +s32 PS4_SYSV_ABI sceWebBrowserDialogGetStatus(); +s32 PS4_SYSV_ABI sceWebBrowserDialogInitialize(); +s32 PS4_SYSV_ABI sceWebBrowserDialogNavigate(); +s32 PS4_SYSV_ABI sceWebBrowserDialogOpen(); +s32 PS4_SYSV_ABI sceWebBrowserDialogOpenForPredeterminedContent(); +s32 PS4_SYSV_ABI sceWebBrowserDialogResetCookie(); +s32 PS4_SYSV_ABI sceWebBrowserDialogSetCookie(); +s32 PS4_SYSV_ABI sceWebBrowserDialogSetZoom(); +s32 PS4_SYSV_ABI sceWebBrowserDialogTerminate(); +s32 PS4_SYSV_ABI sceWebBrowserDialogUpdateStatus(); +s32 PS4_SYSV_ABI Func_F2BE042771625F8C(); + +void RegisterlibSceWebBrowserDialog(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::WebBrowserDialog \ No newline at end of file From b3c573f7989ffe3cc0fe15ce69f620bcaab9c61b Mon Sep 17 00:00:00 2001 From: poly <47796739+polybiusproxy@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:37:34 +0100 Subject: [PATCH 142/455] libraries/fiber: print fiber ctx size on stack overflow --- src/core/libraries/fiber/fiber.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/fiber/fiber.cpp b/src/core/libraries/fiber/fiber.cpp index b77b5b5b6..345f0834d 100644 --- a/src/core/libraries/fiber/fiber.cpp +++ b/src/core/libraries/fiber/fiber.cpp @@ -37,8 +37,9 @@ extern "C" void PS4_SYSV_ABI _sceFiberForceQuit(u64 ret) { void PS4_SYSV_ABI _sceFiberCheckStackOverflow(OrbisFiberContext* ctx) { u64* stack_base = reinterpret_cast(ctx->current_fiber->addr_context); + u64 stack_size = ctx->current_fiber->size_context; if (stack_base && *stack_base != kFiberStackSignature) { - UNREACHABLE_MSG("Stack overflow detected in fiber."); + UNREACHABLE_MSG("Stack overflow detected in fiber with size = 0x{:x}", stack_size); } } From 56f4b8a2b860fa14421b0e6884532b441ea34a12 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 10:41:58 -0800 Subject: [PATCH 143/455] shader_recompiler: Implement shader export formats. (#2226) --- externals/sirit | 2 +- .../spirv/emit_spirv_bitwise_conversion.cpp | 44 +++++ .../backend/spirv/emit_spirv_instructions.h | 8 + .../frontend/translate/export.cpp | 152 ++++++++++++++---- .../frontend/translate/translate.h | 9 ++ .../frontend/translate/vector_alu.cpp | 33 ++-- src/shader_recompiler/ir/ir_emitter.cpp | 32 ++++ src/shader_recompiler/ir/ir_emitter.h | 8 + src/shader_recompiler/ir/opcodes.inc | 8 + .../ir/passes/constant_propagation_pass.cpp | 16 ++ src/shader_recompiler/runtime_info.h | 1 + src/video_core/amdgpu/liverpool.h | 4 + .../renderer_vulkan/vk_graphics_pipeline.h | 5 +- .../renderer_vulkan/vk_pipeline_cache.cpp | 21 ++- 14 files changed, 286 insertions(+), 57 deletions(-) diff --git a/externals/sirit b/externals/sirit index 26ad5a9d0..d6f3c0d99 160000 --- a/externals/sirit +++ b/externals/sirit @@ -1 +1 @@ -Subproject commit 26ad5a9d0fe13260b0d7d6c64419d01a196b2e32 +Subproject commit d6f3c0d99862ab2ff8f95e9ac221560f1f97e29a diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp index 02ac74e19..539c6cb81 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp @@ -58,4 +58,48 @@ Id EmitUnpackHalf2x16(EmitContext& ctx, Id value) { return ctx.OpUnpackHalf2x16(ctx.F32[2], value); } +Id EmitPackUnorm2x16(EmitContext& ctx, Id value) { + return ctx.OpPackUnorm2x16(ctx.U32[1], value); +} + +Id EmitUnpackUnorm2x16(EmitContext& ctx, Id value) { + return ctx.OpUnpackUnorm2x16(ctx.F32[2], value); +} + +Id EmitPackSnorm2x16(EmitContext& ctx, Id value) { + return ctx.OpPackSnorm2x16(ctx.U32[1], value); +} + +Id EmitUnpackSnorm2x16(EmitContext& ctx, Id value) { + return ctx.OpUnpackSnorm2x16(ctx.F32[2], value); +} + +Id EmitPackUint2x16(EmitContext& ctx, Id value) { + // No SPIR-V instruction for this, do it manually. + const auto x{ctx.OpCompositeExtract(ctx.U32[1], value, 0)}; + const auto y{ctx.OpCompositeExtract(ctx.U32[1], value, 1)}; + return ctx.OpBitFieldInsert(ctx.U32[1], x, y, ctx.ConstU32(16U), ctx.ConstU32(16U)); +} + +Id EmitUnpackUint2x16(EmitContext& ctx, Id value) { + // No SPIR-V instruction for this, do it manually. + const auto x{ctx.OpBitFieldUExtract(ctx.U32[1], value, ctx.ConstU32(0U), ctx.ConstU32(16U))}; + const auto y{ctx.OpBitFieldUExtract(ctx.U32[1], value, ctx.ConstU32(16U), ctx.ConstU32(16U))}; + return ctx.OpCompositeConstruct(ctx.U32[2], x, y); +} + +Id EmitPackSint2x16(EmitContext& ctx, Id value) { + // No SPIR-V instruction for this, do it manually. + const auto x{ctx.OpCompositeExtract(ctx.U32[1], value, 0)}; + const auto y{ctx.OpCompositeExtract(ctx.U32[1], value, 1)}; + return ctx.OpBitFieldInsert(ctx.U32[1], x, y, ctx.ConstU32(16U), ctx.ConstU32(16U)); +} + +Id EmitUnpackSint2x16(EmitContext& ctx, Id value) { + // No SPIR-V instruction for this, do it manually. + const auto x{ctx.OpBitFieldSExtract(ctx.U32[1], value, ctx.ConstU32(0U), ctx.ConstU32(16U))}; + const auto y{ctx.OpBitFieldSExtract(ctx.U32[1], value, ctx.ConstU32(16U), ctx.ConstU32(16U))}; + return ctx.OpCompositeConstruct(ctx.U32[2], x, y); +} + } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 4833dc9d0..842b13207 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -197,6 +197,14 @@ Id EmitPackFloat2x16(EmitContext& ctx, Id value); Id EmitUnpackFloat2x16(EmitContext& ctx, Id value); Id EmitPackHalf2x16(EmitContext& ctx, Id value); Id EmitUnpackHalf2x16(EmitContext& ctx, Id value); +Id EmitPackUnorm2x16(EmitContext& ctx, Id value); +Id EmitUnpackUnorm2x16(EmitContext& ctx, Id value); +Id EmitPackSnorm2x16(EmitContext& ctx, Id value); +Id EmitUnpackSnorm2x16(EmitContext& ctx, Id value); +Id EmitPackUint2x16(EmitContext& ctx, Id value); +Id EmitUnpackUint2x16(EmitContext& ctx, Id value); +Id EmitPackSint2x16(EmitContext& ctx, Id value); +Id EmitUnpackSint2x16(EmitContext& ctx, Id value); Id EmitFPAbs16(EmitContext& ctx, Id value); Id EmitFPAbs32(EmitContext& ctx, Id value); Id EmitFPAbs64(EmitContext& ctx, Id value); diff --git a/src/shader_recompiler/frontend/translate/export.cpp b/src/shader_recompiler/frontend/translate/export.cpp index 38ff9ae14..84c2ee658 100644 --- a/src/shader_recompiler/frontend/translate/export.cpp +++ b/src/shader_recompiler/frontend/translate/export.cpp @@ -7,6 +7,125 @@ namespace Shader::Gcn { +u32 SwizzleMrtComponent(const FragmentRuntimeInfo::PsColorBuffer& color_buffer, u32 comp) { + const auto [r, g, b, a] = color_buffer.swizzle; + const std::array swizzle_array = {r, g, b, a}; + const auto swizzled_comp_type = static_cast(swizzle_array[comp]); + constexpr auto min_comp_type = static_cast(AmdGpu::CompSwizzle::Red); + return swizzled_comp_type >= min_comp_type ? swizzled_comp_type - min_comp_type : comp; +} + +void Translator::ExportMrtValue(IR::Attribute attribute, u32 comp, const IR::F32& value, + const FragmentRuntimeInfo::PsColorBuffer& color_buffer) { + const auto converted = ApplyWriteNumberConversion(ir, value, color_buffer.num_conversion); + ir.SetAttribute(attribute, converted, comp); +} + +void Translator::ExportMrtCompressed(IR::Attribute attribute, u32 idx, const IR::U32& value) { + const u32 color_buffer_idx = + static_cast(attribute) - static_cast(IR::Attribute::RenderTarget0); + const auto color_buffer = runtime_info.fs_info.color_buffers[color_buffer_idx]; + + IR::Value unpacked_value; + bool is_integer = false; + switch (color_buffer.export_format) { + case AmdGpu::Liverpool::ShaderExportFormat::Zero: + // No export + return; + case AmdGpu::Liverpool::ShaderExportFormat::ABGR_FP16: + unpacked_value = ir.UnpackHalf2x16(value); + break; + case AmdGpu::Liverpool::ShaderExportFormat::ABGR_UNORM16: + unpacked_value = ir.UnpackUnorm2x16(value); + break; + case AmdGpu::Liverpool::ShaderExportFormat::ABGR_SNORM16: + unpacked_value = ir.UnpackSnorm2x16(value); + break; + case AmdGpu::Liverpool::ShaderExportFormat::ABGR_UINT16: + unpacked_value = ir.UnpackUint2x16(value); + is_integer = true; + break; + case AmdGpu::Liverpool::ShaderExportFormat::ABGR_SINT16: + unpacked_value = ir.UnpackSint2x16(value); + is_integer = true; + break; + default: + UNREACHABLE_MSG("Unimplemented compressed MRT export format {}", + static_cast(color_buffer.export_format)); + break; + } + + const auto r = ir.CompositeExtract(unpacked_value, 0); + const auto g = ir.CompositeExtract(unpacked_value, 1); + const IR::F32 float_r = is_integer ? ir.BitCast(IR::U32{r}) : IR::F32{r}; + const IR::F32 float_g = is_integer ? ir.BitCast(IR::U32{g}) : IR::F32{g}; + + const auto swizzled_r = SwizzleMrtComponent(color_buffer, idx * 2); + const auto swizzled_g = SwizzleMrtComponent(color_buffer, idx * 2 + 1); + + ExportMrtValue(attribute, swizzled_r, float_r, color_buffer); + ExportMrtValue(attribute, swizzled_g, float_g, color_buffer); +} + +void Translator::ExportMrtUncompressed(IR::Attribute attribute, u32 comp, const IR::F32& value) { + const u32 color_buffer_idx = + static_cast(attribute) - static_cast(IR::Attribute::RenderTarget0); + const auto color_buffer = runtime_info.fs_info.color_buffers[color_buffer_idx]; + const auto swizzled_comp = SwizzleMrtComponent(color_buffer, comp); + + switch (color_buffer.export_format) { + case AmdGpu::Liverpool::ShaderExportFormat::Zero: + // No export + return; + case AmdGpu::Liverpool::ShaderExportFormat::R_32: + // Red only + if (swizzled_comp != 0) { + return; + } + break; + case AmdGpu::Liverpool::ShaderExportFormat::GR_32: + // Red and Green only + if (swizzled_comp != 0 && swizzled_comp != 1) { + return; + } + break; + case AmdGpu::Liverpool::ShaderExportFormat::AR_32: + // Red and Alpha only + if (swizzled_comp != 0 && swizzled_comp != 3) { + return; + } + break; + case AmdGpu::Liverpool::ShaderExportFormat::ABGR_32: + // All components + break; + default: + UNREACHABLE_MSG("Unimplemented uncompressed MRT export format {}", + static_cast(color_buffer.export_format)); + break; + } + ExportMrtValue(attribute, swizzled_comp, value, color_buffer); +} + +void Translator::ExportCompressed(IR::Attribute attribute, u32 idx, const IR::U32& value) { + if (IsMrt(attribute)) { + ExportMrtCompressed(attribute, idx, value); + return; + } + const IR::Value unpacked_value = ir.UnpackHalf2x16(value); + const IR::F32 r = IR::F32{ir.CompositeExtract(unpacked_value, 0)}; + const IR::F32 g = IR::F32{ir.CompositeExtract(unpacked_value, 1)}; + ir.SetAttribute(attribute, r, idx * 2); + ir.SetAttribute(attribute, g, idx * 2 + 1); +} + +void Translator::ExportUncompressed(IR::Attribute attribute, u32 comp, const IR::F32& value) { + if (IsMrt(attribute)) { + ExportMrtUncompressed(attribute, comp, value); + return; + } + ir.SetAttribute(attribute, value, comp); +} + void Translator::EmitExport(const GcnInst& inst) { if (ir.block->has_multiple_predecessors && info.stage == Stage::Fragment) { ir.Discard(ir.LogicalNot(ir.GetExec())); @@ -26,41 +145,15 @@ void Translator::EmitExport(const GcnInst& inst) { IR::VectorReg(inst.src[3].code), }; - const auto set_attribute = [&](u32 comp, IR::F32 value) { - if (!IR::IsMrt(attrib)) { - ir.SetAttribute(attrib, value, comp); - return; - } - const u32 index = u32(attrib) - u32(IR::Attribute::RenderTarget0); - const auto col_buf = runtime_info.fs_info.color_buffers[index]; - const auto converted = IR::ApplyWriteNumberConversion(ir, value, col_buf.num_conversion); - const auto [r, g, b, a] = col_buf.swizzle; - const std::array swizzle_array = {r, g, b, a}; - const auto swizzled_comp = swizzle_array[comp]; - if (u32(swizzled_comp) < u32(AmdGpu::CompSwizzle::Red)) { - ir.SetAttribute(attrib, converted, comp); - return; - } - ir.SetAttribute(attrib, converted, u32(swizzled_comp) - u32(AmdGpu::CompSwizzle::Red)); - }; - - const auto unpack = [&](u32 idx) { - const IR::Value value = ir.UnpackHalf2x16(ir.GetVectorReg(vsrc[idx])); - const IR::F32 r = IR::F32{ir.CompositeExtract(value, 0)}; - const IR::F32 g = IR::F32{ir.CompositeExtract(value, 1)}; - set_attribute(idx * 2, r); - set_attribute(idx * 2 + 1, g); - }; - // Components are float16 packed into a VGPR if (exp.compr) { // Export R, G if (exp.en & 1) { - unpack(0); + ExportCompressed(attrib, 0, ir.GetVectorReg(vsrc[0])); } // Export B, A if ((exp.en >> 2) & 1) { - unpack(1); + ExportCompressed(attrib, 1, ir.GetVectorReg(vsrc[1])); } } else { // Components are float32 into separate VGPRS @@ -69,8 +162,7 @@ void Translator::EmitExport(const GcnInst& inst) { if ((mask & 1) == 0) { continue; } - const IR::F32 comp = ir.GetVectorReg(vsrc[i]); - set_attribute(i, comp); + ExportUncompressed(attrib, i, ir.GetVectorReg(vsrc[i])); } } if (IR::IsMrt(attrib)) { diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 496455b50..287885854 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -170,6 +170,7 @@ public: void V_SUBBREV_U32(const GcnInst& inst); void V_LDEXP_F32(const GcnInst& inst); void V_CVT_PKNORM_U16_F32(const GcnInst& inst); + void V_CVT_PKNORM_I16_F32(const GcnInst& inst); void V_CVT_PKRTZ_F16_F32(const GcnInst& inst); // VOP1 @@ -244,6 +245,7 @@ public: void V_SAD(const GcnInst& inst); void V_SAD_U32(const GcnInst& inst); void V_CVT_PK_U16_U32(const GcnInst& inst); + void V_CVT_PK_I16_I32(const GcnInst& inst); void V_CVT_PK_U8_F32(const GcnInst& inst); void V_LSHL_B64(const GcnInst& inst); void V_MUL_F64(const GcnInst& inst); @@ -306,6 +308,13 @@ private: IR::F32 SelectCubeResult(const IR::F32& x, const IR::F32& y, const IR::F32& z, const IR::F32& x_res, const IR::F32& y_res, const IR::F32& z_res); + void ExportMrtValue(IR::Attribute attribute, u32 comp, const IR::F32& value, + const FragmentRuntimeInfo::PsColorBuffer& color_buffer); + void ExportMrtCompressed(IR::Attribute attribute, u32 idx, const IR::U32& value); + void ExportMrtUncompressed(IR::Attribute attribute, u32 comp, const IR::F32& value); + void ExportCompressed(IR::Attribute attribute, u32 idx, const IR::U32& value); + void ExportUncompressed(IR::Attribute attribute, u32 comp, const IR::F32& value); + void LogMissingOpcode(const GcnInst& inst); private: diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 42dbcc513..f73618dbe 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -96,6 +96,8 @@ void Translator::EmitVectorAlu(const GcnInst& inst) { return V_LDEXP_F32(inst); case Opcode::V_CVT_PKNORM_U16_F32: return V_CVT_PKNORM_U16_F32(inst); + case Opcode::V_CVT_PKNORM_I16_F32: + return V_CVT_PKNORM_I16_F32(inst); case Opcode::V_CVT_PKRTZ_F16_F32: return V_CVT_PKRTZ_F16_F32(inst); @@ -376,6 +378,8 @@ void Translator::EmitVectorAlu(const GcnInst& inst) { return V_SAD_U32(inst); case Opcode::V_CVT_PK_U16_U32: return V_CVT_PK_U16_U32(inst); + case Opcode::V_CVT_PK_I16_I32: + return V_CVT_PK_I16_I32(inst); case Opcode::V_CVT_PK_U8_F32: return V_CVT_PK_U8_F32(inst); case Opcode::V_LSHL_B64: @@ -645,12 +649,15 @@ void Translator::V_LDEXP_F32(const GcnInst& inst) { } void Translator::V_CVT_PKNORM_U16_F32(const GcnInst& inst) { - const IR::F32 src0{GetSrc(inst.src[0])}; - const IR::F32 src1{GetSrc(inst.src[1])}; - const IR::U32 dst0 = ir.ConvertFToU(32, ir.FPMul(src0, ir.Imm32(65535.f))); - const IR::U32 dst1 = ir.ConvertFToU(32, ir.FPMul(src1, ir.Imm32(65535.f))); - const IR::VectorReg dst_reg{inst.dst[0].code}; - ir.SetVectorReg(dst_reg, ir.BitFieldInsert(dst0, dst1, ir.Imm32(16), ir.Imm32(16))); + const IR::Value vec_f32 = + ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); + SetDst(inst.dst[0], ir.PackUnorm2x16(vec_f32)); +} + +void Translator::V_CVT_PKNORM_I16_F32(const GcnInst& inst) { + const IR::Value vec_f32 = + ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); + SetDst(inst.dst[0], ir.PackSnorm2x16(vec_f32)); } void Translator::V_CVT_PKRTZ_F16_F32(const GcnInst& inst) { @@ -1237,11 +1244,15 @@ void Translator::V_SAD_U32(const GcnInst& inst) { } void Translator::V_CVT_PK_U16_U32(const GcnInst& inst) { - const IR::U32 src0{GetSrc(inst.src[0])}; - const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 lo = ir.IMin(src0, ir.Imm32(0xFFFF), false); - const IR::U32 hi = ir.IMin(src1, ir.Imm32(0xFFFF), false); - SetDst(inst.dst[0], ir.BitFieldInsert(lo, hi, ir.Imm32(16), ir.Imm32(16))); + const IR::Value vec_u32 = + ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); + SetDst(inst.dst[0], ir.PackUint2x16(vec_u32)); +} + +void Translator::V_CVT_PK_I16_I32(const GcnInst& inst) { + const IR::Value vec_u32 = + ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); + SetDst(inst.dst[0], ir.PackSint2x16(vec_u32)); } void Translator::V_CVT_PK_U8_F32(const GcnInst& inst) { diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index f0558665b..ecbe1f838 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -795,6 +795,38 @@ Value IREmitter::UnpackHalf2x16(const U32& value) { return Inst(Opcode::UnpackHalf2x16, value); } +U32 IREmitter::PackUnorm2x16(const Value& vector) { + return Inst(Opcode::PackUnorm2x16, vector); +} + +Value IREmitter::UnpackUnorm2x16(const U32& value) { + return Inst(Opcode::UnpackUnorm2x16, value); +} + +U32 IREmitter::PackSnorm2x16(const Value& vector) { + return Inst(Opcode::PackSnorm2x16, vector); +} + +Value IREmitter::UnpackSnorm2x16(const U32& value) { + return Inst(Opcode::UnpackSnorm2x16, value); +} + +U32 IREmitter::PackUint2x16(const Value& value) { + return Inst(Opcode::PackUint2x16, value); +} + +Value IREmitter::UnpackUint2x16(const U32& value) { + return Inst(Opcode::UnpackUint2x16, value); +} + +U32 IREmitter::PackSint2x16(const Value& value) { + return Inst(Opcode::PackSint2x16, value); +} + +Value IREmitter::UnpackSint2x16(const U32& value) { + return Inst(Opcode::UnpackSint2x16, value); +} + F32F64 IREmitter::FPMul(const F32F64& a, const F32F64& b) { if (a.Type() != b.Type()) { UNREACHABLE_MSG("Mismatching types {} and {}", a.Type(), b.Type()); diff --git a/src/shader_recompiler/ir/ir_emitter.h b/src/shader_recompiler/ir/ir_emitter.h index 5dd49ce7a..97b94187a 100644 --- a/src/shader_recompiler/ir/ir_emitter.h +++ b/src/shader_recompiler/ir/ir_emitter.h @@ -175,6 +175,14 @@ public: [[nodiscard]] U32 PackHalf2x16(const Value& vector); [[nodiscard]] Value UnpackHalf2x16(const U32& value); + [[nodiscard]] U32 PackUnorm2x16(const Value& vector); + [[nodiscard]] Value UnpackUnorm2x16(const U32& value); + [[nodiscard]] U32 PackSnorm2x16(const Value& vector); + [[nodiscard]] Value UnpackSnorm2x16(const U32& value); + [[nodiscard]] U32 PackUint2x16(const Value& value); + [[nodiscard]] Value UnpackUint2x16(const U32& value); + [[nodiscard]] U32 PackSint2x16(const Value& value); + [[nodiscard]] Value UnpackSint2x16(const U32& value); [[nodiscard]] F32F64 FPAdd(const F32F64& a, const F32F64& b); [[nodiscard]] F32F64 FPSub(const F32F64& a, const F32F64& b); diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index 63a4e1e62..6750be5a6 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -187,6 +187,14 @@ OPCODE(PackFloat2x16, U32, F16x OPCODE(UnpackFloat2x16, F16x2, U32, ) OPCODE(PackHalf2x16, U32, F32x2, ) OPCODE(UnpackHalf2x16, F32x2, U32, ) +OPCODE(PackUnorm2x16, U32, F32x2, ) +OPCODE(UnpackUnorm2x16, F32x2, U32, ) +OPCODE(PackSnorm2x16, U32, F32x2, ) +OPCODE(UnpackSnorm2x16, F32x2, U32, ) +OPCODE(PackUint2x16, U32, U32x2, ) +OPCODE(UnpackUint2x16, U32x2, U32, ) +OPCODE(PackSint2x16, U32, U32x2, ) +OPCODE(UnpackSint2x16, U32x2, U32, ) // Floating-point operations OPCODE(FPAbs32, F32, F32, ) diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp index 12a1b56e9..c72b9e835 100644 --- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp @@ -348,6 +348,22 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { return FoldInverseFunc(inst, IR::Opcode::UnpackFloat2x16); case IR::Opcode::UnpackFloat2x16: return FoldInverseFunc(inst, IR::Opcode::PackFloat2x16); + case IR::Opcode::PackUnorm2x16: + return FoldInverseFunc(inst, IR::Opcode::UnpackUnorm2x16); + case IR::Opcode::UnpackUnorm2x16: + return FoldInverseFunc(inst, IR::Opcode::PackUnorm2x16); + case IR::Opcode::PackSnorm2x16: + return FoldInverseFunc(inst, IR::Opcode::UnpackSnorm2x16); + case IR::Opcode::UnpackSnorm2x16: + return FoldInverseFunc(inst, IR::Opcode::PackSnorm2x16); + case IR::Opcode::PackUint2x16: + return FoldInverseFunc(inst, IR::Opcode::UnpackUint2x16); + case IR::Opcode::UnpackUint2x16: + return FoldInverseFunc(inst, IR::Opcode::PackUint2x16); + case IR::Opcode::PackSint2x16: + return FoldInverseFunc(inst, IR::Opcode::UnpackSint2x16); + case IR::Opcode::UnpackSint2x16: + return FoldInverseFunc(inst, IR::Opcode::PackSint2x16); case IR::Opcode::SelectU1: case IR::Opcode::SelectU8: case IR::Opcode::SelectU16: diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 2bf5e3f0a..103c1faa8 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -184,6 +184,7 @@ struct FragmentRuntimeInfo { AmdGpu::NumberFormat num_format; AmdGpu::NumberConversion num_conversion; AmdGpu::CompMapping swizzle; + AmdGpu::Liverpool::ShaderExportFormat export_format; auto operator<=>(const PsColorBuffer&) const noexcept = default; }; diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index ec9c92ef1..67821b0f2 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -266,6 +266,10 @@ struct Liverpool { BitField<20, 4, ShaderExportFormat> col5; BitField<24, 4, ShaderExportFormat> col6; BitField<28, 4, ShaderExportFormat> col7; + + [[nodiscard]] ShaderExportFormat GetFormat(const u32 buf_idx) const { + return static_cast((raw >> (buf_idx * 4)) & 0xfu); + } }; union VsOutputControl { diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 9a20f94c1..8c5cb1f3b 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -35,9 +35,8 @@ struct GraphicsPipelineKey { std::array stage_hashes; u32 num_color_attachments; std::array color_formats; - std::array color_num_formats; - std::array color_num_conversions; - std::array color_swizzles; + std::array + color_buffers; vk::Format depth_format; vk::Format stencil_format; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index c6a56745d..3728a55fb 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -167,11 +167,7 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS }; } for (u32 i = 0; i < Shader::MaxColorBuffers; i++) { - info.fs_info.color_buffers[i] = { - .num_format = graphics_key.color_num_formats[i], - .num_conversion = graphics_key.color_num_conversions[i], - .swizzle = graphics_key.color_swizzles[i], - }; + info.fs_info.color_buffers[i] = graphics_key.color_buffers[i]; } break; } @@ -309,11 +305,9 @@ bool PipelineCache::RefreshGraphicsKey() { // order. We need to do some arrays compaction at this stage key.num_color_attachments = 0; key.color_formats.fill(vk::Format::eUndefined); - key.color_num_formats.fill(AmdGpu::NumberFormat::Unorm); - key.color_num_conversions.fill(AmdGpu::NumberConversion::None); + key.color_buffers.fill({}); key.blend_controls.fill({}); key.write_masks.fill({}); - key.color_swizzles.fill({}); key.vertex_buffer_formats.fill(vk::Format::eUndefined); key.patch_control_points = 0; @@ -338,9 +332,12 @@ bool PipelineCache::RefreshGraphicsKey() { key.color_formats[remapped_cb] = LiverpoolToVK::SurfaceFormat(col_buf.GetDataFmt(), col_buf.GetNumberFmt()); - key.color_num_formats[remapped_cb] = col_buf.GetNumberFmt(); - key.color_num_conversions[remapped_cb] = col_buf.GetNumberConversion(); - key.color_swizzles[remapped_cb] = col_buf.Swizzle(); + key.color_buffers[remapped_cb] = { + .num_format = col_buf.GetNumberFmt(), + .num_conversion = col_buf.GetNumberConversion(), + .swizzle = col_buf.Swizzle(), + .export_format = regs.color_export_format.GetFormat(cb), + }; } fetch_shader = std::nullopt; @@ -456,7 +453,7 @@ bool PipelineCache::RefreshGraphicsKey() { // of the latter we need to change format to undefined, and either way we need to // increment the index for the null attachment binding. key.color_formats[remapped_cb] = vk::Format::eUndefined; - key.color_swizzles[remapped_cb] = {}; + key.color_buffers[remapped_cb] = {}; ++remapped_cb; continue; } From a51c8c17e07063065fe1780d648c3b4808f31d59 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:47:04 -0800 Subject: [PATCH 144/455] shader_recompiler: Fix image write swizzles. (#2236) --- .../ir/passes/resource_tracking_pass.cpp | 4 +-- src/video_core/amdgpu/types.h | 31 ++++++++++++++++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index d94c5223a..43d125bf0 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -569,7 +569,7 @@ void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { inst.SetArg(1, CalculateBufferAddress(ir, inst, info, buffer, 1U)); if (inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32) { - const auto swizzled = ApplySwizzle(ir, inst.Arg(2), buffer.DstSelect()); + const auto swizzled = ApplySwizzle(ir, inst.Arg(2), buffer.DstSelect().Inverse()); const auto converted = ApplyWriteNumberConversionVec4(ir, swizzled, buffer.GetNumberConversion()); inst.SetArg(2, converted); @@ -829,7 +829,7 @@ void PatchImageArgs(IR::Block& block, IR::Inst& inst, Info& info) { auto texel = inst.Arg(4); if (is_storage) { // Storage image requires shader swizzle. - texel = ApplySwizzle(ir, texel, image.DstSelect()); + texel = ApplySwizzle(ir, texel, image.DstSelect().Inverse()); } const auto converted = ApplyWriteNumberConversionVec4(ir, texel, image.GetNumberConversion()); diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index 63e184cc5..b442b2f1e 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -200,10 +200,10 @@ enum class NumberConversion : u32 { }; struct CompMapping { - CompSwizzle r : 3; - CompSwizzle g : 3; - CompSwizzle b : 3; - CompSwizzle a : 3; + CompSwizzle r; + CompSwizzle g; + CompSwizzle b; + CompSwizzle a; auto operator<=>(const CompMapping& other) const = default; @@ -217,6 +217,15 @@ struct CompMapping { }; } + [[nodiscard]] CompMapping Inverse() const { + CompMapping result{}; + InverseSingle(result.r, CompSwizzle::Red); + InverseSingle(result.g, CompSwizzle::Green); + InverseSingle(result.b, CompSwizzle::Blue); + InverseSingle(result.a, CompSwizzle::Alpha); + return result; + } + private: template T ApplySingle(const std::array& data, const CompSwizzle swizzle) const { @@ -237,6 +246,20 @@ private: UNREACHABLE(); } } + + void InverseSingle(CompSwizzle& dst, const CompSwizzle target) const { + if (r == target) { + dst = CompSwizzle::Red; + } else if (g == target) { + dst = CompSwizzle::Green; + } else if (b == target) { + dst = CompSwizzle::Blue; + } else if (a == target) { + dst = CompSwizzle::Alpha; + } else { + dst = CompSwizzle::Zero; + } + } }; inline DataFormat RemapDataFormat(const DataFormat format) { From 361532418ce8a252fd873eacff0d0b83504eeffb Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:47:24 -0800 Subject: [PATCH 145/455] externals: Update SPIRV-Cross for MoltenVK (#2237) --- externals/MoltenVK/SPIRV-Cross | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/MoltenVK/SPIRV-Cross b/externals/MoltenVK/SPIRV-Cross index 6173e24b3..1a7b7ef6d 160000 --- a/externals/MoltenVK/SPIRV-Cross +++ b/externals/MoltenVK/SPIRV-Cross @@ -1 +1 @@ -Subproject commit 6173e24b31f09a0c3217103a130e74c4ddec14a6 +Subproject commit 1a7b7ef6de02cf6767e42b10ddad217c45e90d47 From 7072dfc99fdca87e833bf588587debef3e9b08bd Mon Sep 17 00:00:00 2001 From: hspir404 Date: Fri, 24 Jan 2025 21:56:21 +0000 Subject: [PATCH 146/455] Fix stale heap read in UnmapMemoryImpl (#2232) --- src/core/memory.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index a8dd72acc..271092eaf 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -418,8 +418,9 @@ u64 MemoryManager::UnmapBytesFromEntry(VAddr virtual_addr, VirtualMemoryArea vma vma.phys_base = 0; vma.disallow_merge = false; vma.name = ""; - MergeAdjacent(vma_map, new_it); - bool readonly_file = vma.prot == MemoryProt::CpuRead && type == VMAType::File; + const auto post_merge_it = MergeAdjacent(vma_map, new_it); + auto& post_merge_vma = post_merge_it->second; + bool readonly_file = post_merge_vma.prot == MemoryProt::CpuRead && type == VMAType::File; if (type != VMAType::Reserved && type != VMAType::PoolReserved) { // Unmap the memory region. impl.Unmap(vma_base_addr, vma_base_size, start_in_vma, start_in_vma + adjusted_size, From 73b7d344600a6a7aabb55d44dfe888deb8df312f Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:55:27 -0800 Subject: [PATCH 147/455] hotfix: Drop scePadSetLightBar log to debug level. Some games like to spam this a lot, and we already handle it. --- src/core/libraries/pad/pad.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index f2b81fbe0..d940d0cfa 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -473,7 +473,7 @@ int PS4_SYSV_ABI scePadSetForceIntercepted() { int PS4_SYSV_ABI scePadSetLightBar(s32 handle, const OrbisPadLightBarParam* pParam) { if (pParam != nullptr) { - LOG_INFO(Lib_Pad, "scePadSetLightBar called handle = {} rgb = {} {} {}", handle, pParam->r, + LOG_DEBUG(Lib_Pad, "called handle = {} rgb = {} {} {}", handle, pParam->r, pParam->g, pParam->b); if (pParam->r < 0xD && pParam->g < 0xD && pParam->b < 0xD) { From e433f3116dd9a36a353d054e1a371e7ff257f87a Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 24 Jan 2025 19:57:04 -0800 Subject: [PATCH 148/455] hotfix 2: clang format --- src/core/libraries/pad/pad.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index d940d0cfa..18709bcb2 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -473,8 +473,8 @@ int PS4_SYSV_ABI scePadSetForceIntercepted() { int PS4_SYSV_ABI scePadSetLightBar(s32 handle, const OrbisPadLightBarParam* pParam) { if (pParam != nullptr) { - LOG_DEBUG(Lib_Pad, "called handle = {} rgb = {} {} {}", handle, pParam->r, - pParam->g, pParam->b); + LOG_DEBUG(Lib_Pad, "called handle = {} rgb = {} {} {}", handle, pParam->r, pParam->g, + pParam->b); if (pParam->r < 0xD && pParam->g < 0xD && pParam->b < 0xD) { LOG_INFO(Lib_Pad, "Invalid lightbar setting"); From 564dbc7b94b02c70febd901f613ccb567923cb5e Mon Sep 17 00:00:00 2001 From: Ian Carpenter Date: Sat, 25 Jan 2025 04:00:52 -0500 Subject: [PATCH 149/455] system_service: Add simple event queue and push an EntitlementUpdate event to it when app content is initialized (#2238) --- .../libraries/app_content/app_content.cpp | 10 ++++++++ src/core/libraries/system/systemservice.cpp | 23 ++++++++++++++++--- src/core/libraries/system/systemservice.h | 4 ++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/app_content/app_content.cpp b/src/core/libraries/app_content/app_content.cpp index 1d23e7f44..1223022c5 100644 --- a/src/core/libraries/app_content/app_content.cpp +++ b/src/core/libraries/app_content/app_content.cpp @@ -12,6 +12,7 @@ #include "core/file_sys/fs.h" #include "core/libraries/app_content/app_content_error.h" #include "core/libraries/libs.h" +#include "core/libraries/system/systemservice.h" namespace Libraries::AppContent { @@ -262,6 +263,15 @@ int PS4_SYSV_ABI sceAppContentInitialize(const OrbisAppContentInitParam* initPar entitlement_label.copy(info.entitlement_label, sizeof(info.entitlement_label)); } } + + if (addcont_count > 0) { + SystemService::OrbisSystemServiceEvent event{}; + event.event_type = SystemService::OrbisSystemServiceEventType::EntitlementUpdate; + event.service_entitlement_update.user_id = 0; + event.service_entitlement_update.np_service_label = 0; + SystemService::PushSystemServiceEvent(event); + } + return ORBIS_OK; } diff --git a/src/core/libraries/system/systemservice.cpp b/src/core/libraries/system/systemservice.cpp index ebb9f4392..a67b9a2fc 100644 --- a/src/core/libraries/system/systemservice.cpp +++ b/src/core/libraries/system/systemservice.cpp @@ -10,6 +10,8 @@ namespace Libraries::SystemService { bool g_splash_status{true}; +std::queue g_event_queue; +std::mutex g_event_queue_mutex; bool IsSplashVisible() { return Config::showSplash() && g_splash_status; @@ -1772,7 +1774,9 @@ s32 PS4_SYSV_ABI sceSystemServiceGetStatus(OrbisSystemServiceStatus* status) { LOG_ERROR(Lib_SystemService, "OrbisSystemServiceStatus is null"); return ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER; } - status->event_num = 0; + + std::lock_guard lock(g_event_queue_mutex); + status->event_num = static_cast(g_event_queue.size()); status->is_system_ui_overlaid = false; status->is_in_background_execution = false; status->is_cpu_mode7_cpu_normal = true; @@ -1940,11 +1944,19 @@ int PS4_SYSV_ABI sceSystemServiceRaiseExceptionLocalProcess() { } s32 PS4_SYSV_ABI sceSystemServiceReceiveEvent(OrbisSystemServiceEvent* event) { - LOG_ERROR(Lib_SystemService, "(STUBBED) called"); + LOG_TRACE(Lib_SystemService, "called"); if (event == nullptr) { return ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER; } - return ORBIS_SYSTEM_SERVICE_ERROR_NO_EVENT; + + std::lock_guard lock(g_event_queue_mutex); + if (g_event_queue.empty()) { + return ORBIS_SYSTEM_SERVICE_ERROR_NO_EVENT; + } + + *event = g_event_queue.front(); + g_event_queue.pop(); + return ORBIS_OK; } int PS4_SYSV_ABI sceSystemServiceReenableMusicPlayer() { @@ -2412,6 +2424,11 @@ int PS4_SYSV_ABI Func_CB5E885E225F69F0() { return ORBIS_OK; } +void PushSystemServiceEvent(const OrbisSystemServiceEvent& event) { + std::lock_guard lock(g_event_queue_mutex); + g_event_queue.push(event); +} + void RegisterlibSceSystemService(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("alZfRdr2RP8", "libSceAppMessaging", 1, "libSceSystemService", 1, 1, sceAppMessagingClearEventFlag); diff --git a/src/core/libraries/system/systemservice.h b/src/core/libraries/system/systemservice.h index cdd3c15e8..c22ccc88f 100644 --- a/src/core/libraries/system/systemservice.h +++ b/src/core/libraries/system/systemservice.h @@ -4,6 +4,8 @@ // https://github.com/OpenOrbis/OpenOrbis-PS4-Toolchain/blob/master/include/orbis/_types/sys_service.h #pragma once +#include +#include #include "common/types.h" namespace Core::Loader { @@ -603,5 +605,7 @@ int PS4_SYSV_ABI sceSystemServiceReenableVoiceRecognition(); int PS4_SYSV_ABI Func_6B1CDB955F0EBD65(); int PS4_SYSV_ABI Func_CB5E885E225F69F0(); +void PushSystemServiceEvent(const OrbisSystemServiceEvent& event); + void RegisterlibSceSystemService(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::SystemService From a5a1253185fc6b3231e30477ebb8dba5375ac936 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 25 Jan 2025 04:12:18 -0800 Subject: [PATCH 150/455] liverpool: Implement PM4 MEM_SEMAPHORE. (#2235) --- src/video_core/amdgpu/liverpool.cpp | 24 ++++++++++++ src/video_core/amdgpu/pm4_cmds.h | 61 +++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 8355dd1e6..2f40d4136 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -636,6 +636,18 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); + if (mem_semaphore->IsSignaling()) { + mem_semaphore->Signal(); + } else { + while (!mem_semaphore->Signaled()) { + YIELD_GFX(); + } + mem_semaphore->Decrement(); + } + break; + } case PM4ItOpcode::AcquireMem: { // const auto* acquire_mem = reinterpret_cast(header); break; @@ -848,6 +860,18 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } break; } + case PM4ItOpcode::MemSemaphore: { + const auto* mem_semaphore = reinterpret_cast(header); + if (mem_semaphore->IsSignaling()) { + mem_semaphore->Signal(); + } else { + while (!mem_semaphore->Signaled()) { + YIELD_ASC(vqid); + } + mem_semaphore->Decrement(); + } + break; + } case PM4ItOpcode::WaitRegMem: { const auto* wait_reg_mem = reinterpret_cast(header); ASSERT(wait_reg_mem->engine.Value() == PM4CmdWaitRegMem::Engine::Me); diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index 311f4d4d0..e92ba17fa 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -884,4 +884,65 @@ struct PM4CmdDrawIndexIndirectMulti { u32 draw_initiator; ///< Draw Initiator Register }; +struct PM4CmdMemSemaphore { + enum class ClientCode : u32 { + CommandProcessor = 0u, + CommandBuffer = 1u, + DataBuffer = 2u, + }; + enum class Select : u32 { + SignalSemaphore = 6u, + WaitSemaphore = 7u, + }; + enum class SignalType : u32 { + Increment = 0u, + Write = 1u, + }; + + PM4Type3Header header; ///< header + union { + u32 dw1; + BitField<3, 29, u32> addr_lo; ///< Semaphore address bits [31:3] + }; + union { + u32 dw2; + BitField<0, 8, u32> addr_hi; ///< Semaphore address bits [39:32] + BitField<16, 1, u32> use_mailbox; ///< Enables waiting until mailbox is written to + BitField<20, 1, SignalType> signal_type; ///< Indicates the type of signal sent + BitField<24, 2, ClientCode> client_code; + BitField<29, 3, Select> sem_sel; ///< Indicates whether to do a signal or wait operation + }; + + template + [[nodiscard]] T Address() const { + return std::bit_cast(u64(addr_lo) << 3 | (u64(addr_hi) << 32)); + } + + [[nodiscard]] bool IsSignaling() const { + return sem_sel == Select::SignalSemaphore; + } + + [[nodiscard]] bool Signaled() const { + return *Address() > 0; + } + + void Decrement() const { + *Address() -= 1; + } + + void Signal() const { + auto* ptr = Address(); + switch (signal_type) { + case SignalType::Increment: + *ptr += 1; + break; + case SignalType::Write: + *ptr = 1; + break; + default: + UNREACHABLE_MSG("Unknown signal type {}", static_cast(signal_type.Value())); + } + } +}; + } // namespace AmdGpu From f1bc3b4f3dc492f4c067693a97e5932c8be38491 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 25 Jan 2025 14:59:18 -0800 Subject: [PATCH 151/455] shader_recompiler: Add another constant propagation pass near the end. (#2231) --- src/shader_recompiler/recompiler.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shader_recompiler/recompiler.cpp b/src/shader_recompiler/recompiler.cpp index bb027a11e..01518ab8f 100644 --- a/src/shader_recompiler/recompiler.cpp +++ b/src/shader_recompiler/recompiler.cpp @@ -90,6 +90,7 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info Shader::Optimization::ResourceTrackingPass(program); Shader::Optimization::IdentityRemovalPass(program.blocks); Shader::Optimization::DeadCodeEliminationPass(program); + Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::CollectShaderInfoPass(program); Shader::Optimization::SharedMemoryBarrierPass(program, profile); From 3960283a67af70fbaf2a64a1ac97f695acf47a16 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 26 Jan 2025 01:00:22 -0800 Subject: [PATCH 152/455] hotfix: Fix missing embedded PS shader address bits. If the emulator code is above a 40-bit address, the embedded shaders need to use address-hi to work. Embedded VS shader already supplies it, PS shader should as well. --- src/core/libraries/gnmdriver/gnmdriver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index fdc3a1acd..06124167c 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -1366,7 +1366,7 @@ s32 PS4_SYSV_ABI sceGnmSetEmbeddedPsShader(u32* cmdbuf, u32 size, u32 shader_id, // pointer to a stack memory, so the check will likely fail. To workaround it we will // repeat set shader functionality here as it is trivial. cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 8u, ps_regs[0], - 0u); // SPI_SHADER_PGM_LO_PS/SPI_SHADER_PGM_HI_PS + ps_regs[1]); // SPI_SHADER_PGM_LO_PS/SPI_SHADER_PGM_HI_PS cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 10u, ps_regs[2], ps_regs[3]); // SPI_SHADER_PGM_RSRC1_PS/SPI_SHADER_PGM_RSRC2_PS cmdbuf = PM4CmdSetData::SetContextReg(cmdbuf, 0x1c4u, ps_regs[4], From 461148c22706ea35c8ae4985f21d695e46be01ff Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 26 Jan 2025 04:32:14 -0800 Subject: [PATCH 153/455] qt: Prevent interacting with empty grid cells. (#2243) --- src/qt_gui/game_grid_frame.cpp | 3 ++- src/qt_gui/gui_context_menus.h | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qt_gui/game_grid_frame.cpp b/src/qt_gui/game_grid_frame.cpp index 2ebb09e5d..d719ac878 100644 --- a/src/qt_gui/game_grid_frame.cpp +++ b/src/qt_gui/game_grid_frame.cpp @@ -38,17 +38,18 @@ GameGridFrame::GameGridFrame(std::shared_ptr game_info_get, void GameGridFrame::onCurrentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) { - cellClicked = true; crtRow = currentRow; crtColumn = currentColumn; columnCnt = this->columnCount(); auto itemID = (crtRow * columnCnt) + currentColumn; if (itemID > m_game_info->m_games.count() - 1) { + cellClicked = false; validCellSelected = false; BackgroundMusicPlayer::getInstance().stopMusic(); return; } + cellClicked = true; validCellSelected = true; SetGridBackgroundImage(crtRow, crtColumn); auto snd0Path = QString::fromStdString(m_game_info->m_games[itemID].snd0_path.string()); diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 0e8675c0c..72affeca7 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -41,8 +41,8 @@ public: itemID = widget->currentRow() * widget->columnCount() + widget->currentColumn(); } - // Do not show the menu if an item is selected - if (itemID == -1) { + // Do not show the menu if no item is selected + if (itemID < 0 || itemID >= m_games.size()) { return; } From 46b5437fdfea7e7b3add555d62540766daa4534d Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 26 Jan 2025 08:01:15 -0800 Subject: [PATCH 154/455] emulator: Use correct game folder mount when opening update eboot directly. (#2244) --- src/emulator.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/emulator.cpp b/src/emulator.cpp index e77c2b87f..97215c06f 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -100,9 +100,21 @@ Emulator::~Emulator() { } void Emulator::Run(const std::filesystem::path& file, const std::vector args) { + const auto eboot_name = file.filename().string(); + auto game_folder = file.parent_path(); + if (const auto game_folder_name = game_folder.filename().string(); + game_folder_name.ends_with("-UPDATE")) { + // If an executable was launched from a separate update directory, + // use the base game directory as the game folder. + const auto base_name = game_folder_name.substr(0, game_folder_name.size() - 7); + const auto base_path = game_folder.parent_path() / base_name; + if (std::filesystem::is_directory(base_path)) { + game_folder = base_path; + } + } + // Applications expect to be run from /app0 so mount the file's parent path as app0. auto* mnt = Common::Singleton::Instance(); - const auto game_folder = file.parent_path(); mnt->Mount(game_folder, "/app0"); // Certain games may use /hostapp as well such as CUSA001100 mnt->Mount(game_folder, "/hostapp"); @@ -223,7 +235,7 @@ void Emulator::Run(const std::filesystem::path& file, const std::vectorGetHLESymbols()); // Load the module with the linker - const auto eboot_path = mnt->GetHostPath("/app0/" + file.filename().string()); + const auto eboot_path = mnt->GetHostPath("/app0/" + eboot_name); linker->LoadModule(eboot_path); // check if we have system modules to load From 7d1631f9f43f3b781a20dd91d7ebc0980b55b8ee Mon Sep 17 00:00:00 2001 From: Ian Carpenter Date: Sun, 26 Jan 2025 18:46:59 -0500 Subject: [PATCH 155/455] memory_patcher: Remove hardcoded repositories when loading patches (#2241) --- src/common/memory_patcher.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/common/memory_patcher.cpp b/src/common/memory_patcher.cpp index 6b79edb9f..f81a0ed83 100644 --- a/src/common/memory_patcher.cpp +++ b/src/common/memory_patcher.cpp @@ -7,6 +7,7 @@ #include #include #ifdef ENABLE_QT_GUI +#include #include #include #include @@ -189,14 +190,16 @@ void OnGameLoaded() { // We use the QT headers for the xml and json parsing, this define is only true on QT builds QString patchDir; Common::FS::PathToQString(patchDir, Common::FS::GetUserPath(Common::FS::PathType::PatchesDir)); - QString repositories[] = {"GoldHEN", "shadPS4"}; + QDir dir(patchDir); + QStringList folders = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const QString& repository : repositories) { - QString filesJsonPath = patchDir + "/" + repository + "/files.json"; + for (const QString& folder : folders) { + QString filesJsonPath = patchDir + "/" + folder + "/files.json"; QFile jsonFile(filesJsonPath); if (!jsonFile.open(QIODevice::ReadOnly)) { - LOG_ERROR(Loader, "Unable to open files.json for reading."); + LOG_ERROR(Loader, "Unable to open files.json for reading in repository {}", + folder.toStdString()); continue; } @@ -220,11 +223,12 @@ void OnGameLoaded() { } if (selectedFileName.isEmpty()) { - LOG_ERROR(Loader, "No patch file found for the current serial."); + LOG_ERROR(Loader, "No patch file found for the current serial in repository {}", + folder.toStdString()); continue; } - QString filePath = patchDir + "/" + repository + "/" + selectedFileName; + QString filePath = patchDir + "/" + folder + "/" + selectedFileName; QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { LOG_ERROR(Loader, "Unable to open the file for reading."); From 6f04ea18e4f3d87e9a89f0fefcc1c8c722a87de6 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 26 Jan 2025 19:28:58 -0800 Subject: [PATCH 156/455] externals: Update MoltenVK (#2249) Fixes broken vertex binding dynamic stride when used with tessellation. --- externals/MoltenVK/MoltenVK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/MoltenVK/MoltenVK b/externals/MoltenVK/MoltenVK index 2473ce6f0..6fa077fb8 160000 --- a/externals/MoltenVK/MoltenVK +++ b/externals/MoltenVK/MoltenVK @@ -1 +1 @@ -Subproject commit 2473ce6f0ab7d5d8a49aa91b2e37f3447a939f18 +Subproject commit 6fa077fb8ed8dac4e4cd66b6b1ebd7b4d955a754 From 191e64bfa11e45992e869e7a9df787d6fbe5038b Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Mon, 27 Jan 2025 11:17:23 +0300 Subject: [PATCH 157/455] renderer: respect zmin/zmax even if clipping is disabled (#2250) --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 88b510eca..7a0652ed7 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1172,6 +1172,8 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) { continue; } + const auto zoffset = vp_ctl.zoffset_enable ? vp.zoffset : 0.f; + const auto zscale = vp_ctl.zscale_enable ? vp.zscale : 1.f; if (pipeline.IsClipDisabled()) { // In case if clipping is disabled we patch the shader to convert vertex position // from screen space coordinates to NDC by defining a render space as full hardware @@ -1181,16 +1183,14 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) { .y = 0.f, .width = float(std::min(instance.GetMaxViewportWidth(), 16_KB)), .height = float(std::min(instance.GetMaxViewportHeight(), 16_KB)), - .minDepth = 0.0, - .maxDepth = 1.0, + .minDepth = zoffset - zscale * reduce_z, + .maxDepth = zscale + zoffset, }); } else { const auto xoffset = vp_ctl.xoffset_enable ? vp.xoffset : 0.f; const auto xscale = vp_ctl.xscale_enable ? vp.xscale : 1.f; const auto yoffset = vp_ctl.yoffset_enable ? vp.yoffset : 0.f; const auto yscale = vp_ctl.yscale_enable ? vp.yscale : 1.f; - const auto zoffset = vp_ctl.zoffset_enable ? vp.zoffset : 0.f; - const auto zscale = vp_ctl.zscale_enable ? vp.zscale : 1.f; viewports.push_back({ .x = xoffset - xscale, .y = yoffset - yscale, From 665261efc574562aad240466a9eed8b05b6b9a50 Mon Sep 17 00:00:00 2001 From: F1219R <109141852+F1219R@users.noreply.github.com> Date: Mon, 27 Jan 2025 16:39:27 +0100 Subject: [PATCH 158/455] Update sq translation (#2251) --- src/qt_gui/translations/sq.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 2f88b4390..15c18d2f6 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -249,7 +249,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Hap dosjen e shadPS4 Exit @@ -542,7 +542,7 @@ Fullscreen Mode - Modaliteti i Plotë + Mënyra me ekran të plotë Enable Separate Update Folder @@ -550,7 +550,7 @@ Default tab when opening settings - Skeda e parazgjedhur kur hapni cilësimet + Skeda e parazgjedhur kur hapen cilësimet Show Game Size In List @@ -594,7 +594,7 @@ Open Log Location - Hap vendndodhjen e regjistrit + Hap vendndodhjen e Ditarit Input @@ -630,11 +630,11 @@ Gui - Ndërfaqe + Ndërfaqja User - Përdorues + Përdoruesi Graphics Device @@ -822,7 +822,7 @@ GUIMusicGroupBox - Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në GUI. + Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në ndërfaqe. disableTrophycheckBox From 2837d848eddf2c4b2b361626c220aa415f8b241c Mon Sep 17 00:00:00 2001 From: panzone91 <150828896+panzone91@users.noreply.github.com> Date: Mon, 27 Jan 2025 21:40:58 +0100 Subject: [PATCH 159/455] linker: handle relocation for exported modules (#2247) --- src/core/linker.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/linker.h b/src/core/linker.h index 00da3a08c..357b39664 100644 --- a/src/core/linker.h +++ b/src/core/linker.h @@ -109,10 +109,13 @@ public: void RelocateAnyImports(Module* m) { Relocate(m); - for (auto& module : m_modules) { - const auto imports = module->GetImportModules(); - if (std::ranges::contains(imports, m->name, &ModuleInfo::name)) { - Relocate(module.get()); + const auto exports = m->GetExportModules(); + for (auto& export_mod : exports) { + for (auto& module : m_modules) { + const auto imports = module->GetImportModules(); + if (std::ranges::contains(imports, export_mod.name, &ModuleInfo::name)) { + Relocate(module.get()); + } } } } From d2127b38deace732f0c41b6cc1881e21f4ed268b Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 28 Jan 2025 00:12:48 -0800 Subject: [PATCH 160/455] vk_rasterizer: Keep viewport depth offset even without native depth clip control. (#2257) --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 7a0652ed7..7c77f2519 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1155,10 +1155,7 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) { const auto& vp_ctl = regs.viewport_control; const float reduce_z = - instance.IsDepthClipControlSupported() && - regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW - ? 1.0f - : 0.0f; + regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW ? 1.0f : 0.0f; if (regs.polygon_control.enable_window_offset) { LOG_ERROR(Render_Vulkan, From 8379922f8ab1209d25b4cbec14303401aa75eec9 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 28 Jan 2025 02:31:26 -0800 Subject: [PATCH 161/455] hotfix: Reduce requested videodec memory block sizes. This really needs a more accurate implementation, but for the stub lowering the value helps games that run out of memory space if it is too large. --- src/core/libraries/videodec/videodec.cpp | 2 +- src/core/libraries/videodec/videodec2.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/videodec/videodec.cpp b/src/core/libraries/videodec/videodec.cpp index 6c9a9b8c0..79001e76f 100644 --- a/src/core/libraries/videodec/videodec.cpp +++ b/src/core/libraries/videodec/videodec.cpp @@ -9,7 +9,7 @@ namespace Libraries::Videodec { -static constexpr u64 kMinimumMemorySize = 32_MB; ///> Fake minimum memory size for querying +static constexpr u64 kMinimumMemorySize = 8_MB; ///> Fake minimum memory size for querying int PS4_SYSV_ABI sceVideodecCreateDecoder(const OrbisVideodecConfigInfo* pCfgInfoIn, const OrbisVideodecResourceInfo* pRsrcInfoIn, diff --git a/src/core/libraries/videodec/videodec2.cpp b/src/core/libraries/videodec/videodec2.cpp index 07f7a274b..be0db4ea3 100644 --- a/src/core/libraries/videodec/videodec2.cpp +++ b/src/core/libraries/videodec/videodec2.cpp @@ -10,7 +10,7 @@ namespace Libraries::Vdec2 { -static constexpr u64 kMinimumMemorySize = 32_MB; ///> Fake minimum memory size for querying +static constexpr u64 kMinimumMemorySize = 8_MB; ///> Fake minimum memory size for querying s32 PS4_SYSV_ABI sceVideodec2QueryComputeMemoryInfo(OrbisVideodec2ComputeMemoryInfo* computeMemInfo) { From 4b93b8b57460c83421d0d859e243dd05a864bdc1 Mon Sep 17 00:00:00 2001 From: Martin <67326368+Martini-141@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:47:00 +0100 Subject: [PATCH 162/455] add missing translations and other corrections nb (#2253) --- src/qt_gui/translations/nb.ts | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index d6d4090df..0b7d2699a 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -98,7 +98,7 @@ Open Folder... - Åpne mappen... + Åpne mappe... Open Game Folder @@ -126,7 +126,7 @@ Copy All - Kopier alle + Kopier alt Delete... @@ -146,19 +146,19 @@ Compatibility... - Compatibility... + Kompatibilitet... Update database - Update database + Oppdater database View report - View report + Vis rapport Submit a report - Submit a report + Send inn en rapport Shortcut creation @@ -574,11 +574,11 @@ Trophy Key - Trophy Key + Trofénøkkel Trophy - Trophy + Trofé Logger @@ -658,7 +658,7 @@ Enable Shaders Dumping - Aktiver dumping av skyggelegger + Aktiver skyggeleggerdumping Enable NULL GPU @@ -666,7 +666,7 @@ Paths - Stier + Mapper Game Folders @@ -686,7 +686,7 @@ Enable Debug Dumping - Aktiver dumping av feilretting + Aktiver feilrettingsdumping Enable Vulkan Validation Layers @@ -718,7 +718,7 @@ GUI Settings - GUI-innstillinger + Grensesnitt-innstillinger Disable Trophy Pop-ups @@ -730,7 +730,7 @@ Update Compatibility Database On Startup - Oppdater kompatibilitets-database ved oppstart + Oppdater database ved oppstart Game Compatibility @@ -750,7 +750,7 @@ Audio Backend - Audio Backend + Lydsystem Save @@ -806,7 +806,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. logTypeGroupBox @@ -846,7 +846,7 @@ checkCompatibilityOnStartupCheckBox - Oppdater kompatibilitets-data ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. + Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. updateCompatibilityButton @@ -894,7 +894,7 @@ dumpShadersCheckBox - Aktiver dumping av skyggelegger:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. + Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. nullGpuCheckBox @@ -914,7 +914,7 @@ debugDump - Aktiver dumping av feilsøking:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. + Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. vkValidationCheckBox @@ -1188,7 +1188,7 @@ Path - Sti + Adresse Play Time @@ -1232,7 +1232,7 @@ Game can be completed with playable performance and no major glitches - Spillet kan fullføres med spillbar ytelse og ingen store feil + Spillet kan fullføres med spillbar ytelse og uten store feil
@@ -1361,4 +1361,4 @@ TB - \ No newline at end of file + From 2cdd873681dd3b03d0752bda5c84412f06f4f0b8 Mon Sep 17 00:00:00 2001 From: slick-daddy <129640104+slick-daddy@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:47:12 +0300 Subject: [PATCH 163/455] Update tr_TR.ts (#2255) --- src/qt_gui/translations/tr_TR.ts | 54 ++++++++++++++++---------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 6436278de..a2368bfee 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -546,7 +546,7 @@ Enable Separate Update Folder - Enable Separate Update Folder + Ayrı Güncelleme Klasörünü Etkinleştir Default tab when opening settings @@ -554,7 +554,7 @@ Show Game Size In List - Göster oyun boyutunu listede + Oyun Boyutunu Listede Göster Show Splash @@ -574,11 +574,11 @@ Trophy Key - Trophy Key + Kupa Anahtarı Trophy - Trophy + Kupa Logger @@ -722,7 +722,7 @@ Disable Trophy Pop-ups - Disable Trophy Pop-ups + Kupa Açılır Pencerelerini Devre Dışı Bırak Play title music @@ -730,23 +730,23 @@ Update Compatibility Database On Startup - Update Compatibility Database On Startup + Başlangıçta Uyumluluk Veritabanını Güncelle Game Compatibility - Game Compatibility + Oyun Uyumluluğu Display Compatibility Data - Display Compatibility Data + Uyumluluk Verilerini Göster Update Compatibility Database - Update Compatibility Database + Uyumluluk Veritabanını Güncelle Volume - Ses seviyesi + Ses Seviyesi Audio Backend @@ -1105,11 +1105,11 @@ The game is in version: %1 - Oyun sürümde: %1 + Oyun sürümü: %1 The downloaded patch only works on version: %1 - İndirilen yamanın sadece sürümde çalışıyor: %1 + İndirilen yama sadece şu sürümde çalışıyor: %1 You may need to update your game. @@ -1168,7 +1168,7 @@ Compatibility - Compatibility + Uyumluluk Region @@ -1196,35 +1196,35 @@ Never Played - Never Played + Hiç Oynanmadı h - h + sa m - m + dk s - s + sn Compatibility is untested - Compatibility is untested + Uyumluluk test edilmemiş Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Oyun düzgün bir şekilde başlatılamıyor / emülatörü çökertiyor Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Oyun başlatılabiliyor ancak yalnızca boş bir ekran gösteriyor Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Oyun bir resim gösteriyor ancak menüleri geçemiyor Game has game-breaking glitches or unplayable performance @@ -1232,7 +1232,7 @@ Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Oyun, oynanabilir performansla tamamlanabilir ve büyük aksaklık yok
@@ -1267,7 +1267,7 @@ Your version is already up to date! - Versiyonunuz zaten güncel! + Sürümünüz zaten güncel! Update Available @@ -1279,11 +1279,11 @@ Current Version - Mevcut Versiyon + Mevcut Sürüm Latest Version - Son Versiyon + Son Sürüm Do you want to update? @@ -1335,7 +1335,7 @@ Failed to create the update script file - Güncelleme betiği dosyası oluşturulamadı + Güncelleme komut dosyası oluşturulamadı @@ -1361,4 +1361,4 @@ TB - \ No newline at end of file + From a78f8afe58a995cecdb4eb1f1e6d6e58320444f6 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 28 Jan 2025 08:48:19 -0800 Subject: [PATCH 164/455] libraries: Implement libSceZlib. (#2256) * libraries: add zlib hle skeleton/stub * libraries: Implement libSceZlib. * zlib: Make variables static. --------- Co-authored-by: Nenkai --- CMakeLists.txt | 6 + src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/libs.cpp | 2 + src/core/libraries/zlib/zlib.cpp | 183 +++++++++++++++++++++++++++ src/core/libraries/zlib/zlib_error.h | 18 +++ src/core/libraries/zlib/zlib_sce.h | 21 +++ 7 files changed, 232 insertions(+) create mode 100644 src/core/libraries/zlib/zlib.cpp create mode 100644 src/core/libraries/zlib/zlib_error.h create mode 100644 src/core/libraries/zlib/zlib_sce.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c9dad307..78e3c7997 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -440,6 +440,11 @@ set(NP_LIBS src/core/libraries/np_common/np_common.cpp src/core/libraries/np_party/np_party.h ) +set(ZLIB_LIB src/core/libraries/zlib/zlib.cpp + src/core/libraries/zlib/zlib_sce.h + src/core/libraries/zlib/zlib_error.h +) + set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp src/core/libraries/screenshot/screenshot.h src/core/libraries/move/move.cpp @@ -612,6 +617,7 @@ set(CORE src/core/aerolib/stubs.cpp ${PLAYGO_LIB} ${RANDOM_LIB} ${USBD_LIB} + ${ZLIB_LIB} ${MISC_LIBS} ${IME_LIB} ${FIBER_LIB} diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index f1d3a9499..dd708c528 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -133,6 +133,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, Mouse) \ SUB(Lib, WebBrowserDialog) \ SUB(Lib, NpParty) \ + SUB(Lib, Zlib) \ CLS(Frontend) \ CLS(Render) \ SUB(Render, Vulkan) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index d5530312c..54f8cdd0b 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -100,6 +100,7 @@ enum class Class : u8 { Lib_Mouse, ///< The LibSceMouse implementation Lib_WebBrowserDialog, ///< The LibSceWebBrowserDialog implementation Lib_NpParty, ///< The LibSceNpParty implementation + Lib_Zlib, ///< The LibSceZlib implementation. Frontend, ///< Emulator UI Render, ///< Video Core Render_Vulkan, ///< Vulkan backend diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index e09de1cee..8cf286d13 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -54,6 +54,7 @@ #include "core/libraries/videodec/videodec2.h" #include "core/libraries/videoout/video_out.h" #include "core/libraries/web_browser_dialog/webbrowserdialog.h" +#include "core/libraries/zlib/zlib_sce.h" #include "fiber/fiber.h" #include "jpeg/jpegenc.h" @@ -111,6 +112,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::Mouse::RegisterlibSceMouse(sym); Libraries::WebBrowserDialog::RegisterlibSceWebBrowserDialog(sym); Libraries::NpParty::RegisterlibSceNpParty(sym); + Libraries::Zlib::RegisterlibSceZlib(sym); } } // namespace Libraries diff --git a/src/core/libraries/zlib/zlib.cpp b/src/core/libraries/zlib/zlib.cpp new file mode 100644 index 000000000..899cb5bf6 --- /dev/null +++ b/src/core/libraries/zlib/zlib.cpp @@ -0,0 +1,183 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include + +#include "common/logging/log.h" +#include "common/thread.h" +#include "core/libraries/kernel/threads.h" +#include "core/libraries/libs.h" +#include "core/libraries/zlib/zlib_error.h" +#include "core/libraries/zlib/zlib_sce.h" + +namespace Libraries::Zlib { + +struct InflateTask { + u64 request_id; + const void* src; + u32 src_length; + void* dst; + u32 dst_length; +}; + +struct InflateResult { + u32 length; + s32 status; +}; + +static Kernel::Thread task_thread; + +static std::mutex mutex; +static std::queue task_queue; +static std::condition_variable_any task_queue_cv; +static std::queue done_queue; +static std::condition_variable_any done_queue_cv; +static std::unordered_map results; +static u64 next_request_id; + +void ZlibTaskThread(const std::stop_token& stop) { + Common::SetCurrentThreadName("shadPS4:ZlibTaskThread"); + + while (!stop.stop_requested()) { + InflateTask task; + { + // Lock and pop from the task queue, unless stop has been requested. + std::unique_lock lock(mutex); + if (!task_queue_cv.wait(lock, stop, [&] { return !task_queue.empty(); })) { + break; + } + task = task_queue.back(); + task_queue.pop(); + } + + uLongf decompressed_length = task.dst_length; + const auto ret = uncompress(static_cast(task.dst), &decompressed_length, + static_cast(task.src), task.src_length); + + { + // Lock, insert the new result, and push the finished request ID to the done queue. + std::unique_lock lock(mutex); + results[task.request_id] = InflateResult{ + .length = static_cast(decompressed_length), + .status = ret == Z_BUF_ERROR ? ORBIS_ZLIB_ERROR_NOSPACE + : ret == Z_OK ? ORBIS_OK + : ORBIS_ZLIB_ERROR_FATAL, + }; + done_queue.push(task.request_id); + } + done_queue_cv.notify_one(); + } +} + +s32 PS4_SYSV_ABI sceZlibInitialize(const void* buffer, u32 length) { + LOG_INFO(Lib_Zlib, "called"); + if (task_thread.Joinable()) { + return ORBIS_ZLIB_ERROR_ALREADY_INITIALIZED; + } + + // Initialize with empty task data + task_queue = std::queue(); + done_queue = std::queue(); + results.clear(); + next_request_id = 1; + + task_thread.Run([](const std::stop_token& stop) { ZlibTaskThread(stop); }); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceZlibInflate(const void* src, u32 src_len, void* dst, u32 dst_len, + u64* request_id) { + LOG_DEBUG(Lib_Zlib, "(STUBBED) called"); + if (!task_thread.Joinable()) { + return ORBIS_ZLIB_ERROR_NOT_INITIALIZED; + } + if (!src || !src_len || !dst || !dst_len || !request_id || dst_len > 64_KB || + dst_len % 2_KB != 0) { + return ORBIS_ZLIB_ERROR_INVALID; + } + + { + std::unique_lock lock(mutex); + *request_id = next_request_id++; + task_queue.emplace(InflateTask{ + .request_id = *request_id, + .src = src, + .src_length = src_len, + .dst = dst, + .dst_length = dst_len, + }); + task_queue_cv.notify_one(); + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceZlibWaitForDone(u64* request_id, const u32* timeout) { + LOG_DEBUG(Lib_Zlib, "(STUBBED) called"); + if (!task_thread.Joinable()) { + return ORBIS_ZLIB_ERROR_NOT_INITIALIZED; + } + if (!request_id) { + return ORBIS_ZLIB_ERROR_INVALID; + } + + { + // Pop from the done queue, unless the timeout is reached. + std::unique_lock lock(mutex); + const auto pred = [] { return !done_queue.empty(); }; + if (timeout) { + if (!done_queue_cv.wait_for(lock, std::chrono::milliseconds(*timeout), pred)) { + return ORBIS_ZLIB_ERROR_TIMEDOUT; + } + } else { + done_queue_cv.wait(lock, pred); + } + *request_id = done_queue.back(); + done_queue.pop(); + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceZlibGetResult(const u64 request_id, u32* dst_length, s32* status) { + LOG_DEBUG(Lib_Zlib, "(STUBBED) called"); + if (!task_thread.Joinable()) { + return ORBIS_ZLIB_ERROR_NOT_INITIALIZED; + } + if (!dst_length || !status) { + return ORBIS_ZLIB_ERROR_INVALID; + } + + { + std::unique_lock lock(mutex); + if (!results.contains(request_id)) { + return ORBIS_ZLIB_ERROR_NOT_FOUND; + } + const auto result = results[request_id]; + *dst_length = result.length; + *status = result.status; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceZlibFinalize() { + LOG_INFO(Lib_Zlib, "called"); + if (!task_thread.Joinable()) { + return ORBIS_ZLIB_ERROR_NOT_INITIALIZED; + } + task_thread.Stop(); + return ORBIS_OK; +} + +void RegisterlibSceZlib(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("m1YErdIXCp4", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibInitialize); + LIB_FUNCTION("6na+Sa-B83w", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibFinalize); + LIB_FUNCTION("TLar1HULv1Q", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibInflate); + LIB_FUNCTION("uB8VlDD4e0s", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibWaitForDone); + LIB_FUNCTION("2eDcGHC0YaM", "libSceZlib", 1, "libSceZlib", 1, 1, sceZlibGetResult); +}; + +} // namespace Libraries::Zlib diff --git a/src/core/libraries/zlib/zlib_error.h b/src/core/libraries/zlib/zlib_error.h new file mode 100644 index 000000000..59574f0b2 --- /dev/null +++ b/src/core/libraries/zlib/zlib_error.h @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/libraries/error_codes.h" + +// Zlib library +constexpr int ORBIS_ZLIB_ERROR_NOT_FOUND = 0x81120002; +constexpr int ORBIS_ZLIB_ERROR_BUSY = 0x8112000B; +constexpr int ORBIS_ZLIB_ERROR_FAULT = 0x8112000E; +constexpr int ORBIS_ZLIB_ERROR_INVALID = 0x81120016; +constexpr int ORBIS_ZLIB_ERROR_NOSPACE = 0x8112001C; +constexpr int ORBIS_ZLIB_ERROR_NOT_SUPPORTED = 0x81120025; +constexpr int ORBIS_ZLIB_ERROR_TIMEDOUT = 0x81120027; +constexpr int ORBIS_ZLIB_ERROR_NOT_INITIALIZED = 0x81120032; +constexpr int ORBIS_ZLIB_ERROR_ALREADY_INITIALIZED = 0x81120033; +constexpr int ORBIS_ZLIB_ERROR_FATAL = 0x811200FF; diff --git a/src/core/libraries/zlib/zlib_sce.h b/src/core/libraries/zlib/zlib_sce.h new file mode 100644 index 000000000..6f8cf9468 --- /dev/null +++ b/src/core/libraries/zlib/zlib_sce.h @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} +namespace Libraries::Zlib { + +s32 PS4_SYSV_ABI sceZlibInitialize(const void* buffer, u32 length); +s32 PS4_SYSV_ABI sceZlibInflate(const void* src, u32 src_len, void* dst, u32 dst_len, + u64* request_id); +s32 PS4_SYSV_ABI sceZlibWaitForDone(u64* request_id, const u32* timeout); +s32 PS4_SYSV_ABI sceZlibGetResult(u64 request_id, u32* dst_length, s32* status); +s32 PS4_SYSV_ABI sceZlibFinalize(); + +void RegisterlibSceZlib(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Zlib \ No newline at end of file From 0575853be18d8f0504482b4a5a407fb14a23d492 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:56:05 -0800 Subject: [PATCH 165/455] externals: Update MoltenVK. (#2264) Adds support for VK_EXT_depth_clip_control --- externals/MoltenVK/MoltenVK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/MoltenVK/MoltenVK b/externals/MoltenVK/MoltenVK index 6fa077fb8..aba997657 160000 --- a/externals/MoltenVK/MoltenVK +++ b/externals/MoltenVK/MoltenVK @@ -1 +1 @@ -Subproject commit 6fa077fb8ed8dac4e4cd66b6b1ebd7b4d955a754 +Subproject commit aba997657b94d6de1794ebad36ce5634341252c7 From 78a0a755c5f2ff06c340ec0dc3431fc247aaa3e4 Mon Sep 17 00:00:00 2001 From: ElBread3 <92335081+ElBread3@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:14:47 -0600 Subject: [PATCH 166/455] qt_gui: Some game install features and fixes (#2261) * open update folder + delete save folder + bulk install checkbox * delete pkg on install checkbox + use game icon for finish window --- src/qt_gui/gui_context_menus.h | 45 ++++++++++++++++++++++++++++--- src/qt_gui/install_dir_select.cpp | 24 ++++++++++++++--- src/qt_gui/install_dir_select.h | 12 +++++++++ src/qt_gui/main_window.cpp | 26 +++++++++++++++--- src/qt_gui/main_window.h | 4 +++ 5 files changed, 101 insertions(+), 10 deletions(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 72affeca7..bdc2aec0c 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -52,10 +52,12 @@ public: // "Open Folder..." submenu QMenu* openFolderMenu = new QMenu(tr("Open Folder..."), widget); QAction* openGameFolder = new QAction(tr("Open Game Folder"), widget); + QAction* openUpdateFolder = new QAction(tr("Open Update Folder"), widget); QAction* openSaveDataFolder = new QAction(tr("Open Save Data Folder"), widget); QAction* openLogFolder = new QAction(tr("Open Log Folder"), widget); openFolderMenu->addAction(openGameFolder); + openFolderMenu->addAction(openUpdateFolder); openFolderMenu->addAction(openSaveDataFolder); openFolderMenu->addAction(openLogFolder); @@ -87,10 +89,12 @@ public: QMenu* deleteMenu = new QMenu(tr("Delete..."), widget); QAction* deleteGame = new QAction(tr("Delete Game"), widget); QAction* deleteUpdate = new QAction(tr("Delete Update"), widget); + QAction* deleteSaveData = new QAction(tr("Delete Save Data"), widget); QAction* deleteDLC = new QAction(tr("Delete DLC"), widget); deleteMenu->addAction(deleteGame); deleteMenu->addAction(deleteUpdate); + deleteMenu->addAction(deleteSaveData); deleteMenu->addAction(deleteDLC); menu.addMenu(deleteMenu); @@ -122,6 +126,18 @@ public: QDesktopServices::openUrl(QUrl::fromLocalFile(folderPath)); } + if (selected == openUpdateFolder) { + QString open_update_path; + Common::FS::PathToQString(open_update_path, m_games[itemID].path); + open_update_path += "-UPDATE"; + if (!std::filesystem::exists(Common::FS::PathFromQString(open_update_path))) { + QMessageBox::critical(nullptr, tr("Error"), + QString(tr("This game has no update folder to open!"))); + } else { + QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path)); + } + } + if (selected == openSaveDataFolder) { QString userPath; Common::FS::PathToQString(userPath, @@ -143,7 +159,7 @@ public: PSF psf; std::filesystem::path game_folder_path = m_games[itemID].path; std::filesystem::path game_update_path = game_folder_path; - game_update_path += "UPDATE"; + game_update_path += "-UPDATE"; if (std::filesystem::exists(game_update_path)) { game_folder_path = game_update_path; } @@ -238,6 +254,11 @@ public: QString trophyPath, gameTrpPath; Common::FS::PathToQString(trophyPath, m_games[itemID].serial); Common::FS::PathToQString(gameTrpPath, m_games[itemID].path); + auto game_update_path = Common::FS::PathFromQString(gameTrpPath); + game_update_path += "-UPDATE"; + if (std::filesystem::exists(game_update_path)) { + Common::FS::PathToQString(gameTrpPath, game_update_path); + } TrophyViewer* trophyViewer = new TrophyViewer(trophyPath, gameTrpPath); trophyViewer->show(); connect(widget->parent(), &QWidget::destroyed, trophyViewer, @@ -335,14 +356,18 @@ public: clipboard->setText(combinedText); } - if (selected == deleteGame || selected == deleteUpdate || selected == deleteDLC) { + if (selected == deleteGame || selected == deleteUpdate || selected == deleteDLC || + selected == deleteSaveData) { bool error = false; - QString folder_path, game_update_path, dlc_path; + QString folder_path, game_update_path, dlc_path, save_data_path; Common::FS::PathToQString(folder_path, m_games[itemID].path); game_update_path = folder_path + "-UPDATE"; Common::FS::PathToQString( dlc_path, Config::getAddonInstallDir() / Common::FS::PathFromQString(folder_path).parent_path().filename()); + Common::FS::PathToQString(save_data_path, + Common::FS::GetUserPath(Common::FS::PathType::UserDir) / + "savedata/1" / m_games[itemID].serial); QString message_type = tr("Game"); if (selected == deleteUpdate) { @@ -363,6 +388,15 @@ public: folder_path = dlc_path; message_type = tr("DLC"); } + } else if (selected == deleteSaveData) { + if (!std::filesystem::exists(Common::FS::PathFromQString(save_data_path))) { + QMessageBox::critical(nullptr, tr("Error"), + QString(tr("This game has no save data to delete!"))); + error = true; + } else { + folder_path = save_data_path; + message_type = tr("Save Data"); + } } if (!error) { QString gameName = QString::fromStdString(m_games[itemID].name); @@ -374,7 +408,10 @@ public: QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { dir.removeRecursively(); - widget->removeRow(itemID); + if (selected == deleteGame) { + widget->removeRow(itemID); + m_games.removeAt(itemID); + } } } } diff --git a/src/qt_gui/install_dir_select.cpp b/src/qt_gui/install_dir_select.cpp index e0951b123..e90a10ee6 100644 --- a/src/qt_gui/install_dir_select.cpp +++ b/src/qt_gui/install_dir_select.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include #include @@ -15,10 +16,11 @@ #include "install_dir_select.h" InstallDirSelect::InstallDirSelect() : selected_dir() { - selected_dir = Config::getGameInstallDirs().empty() ? "" : Config::getGameInstallDirs().front(); + auto install_dirs = Config::getGameInstallDirs(); + selected_dir = install_dirs.empty() ? "" : install_dirs.front(); - if (!Config::getGameInstallDirs().empty() && Config::getGameInstallDirs().size() == 1) { - reject(); + if (!install_dirs.empty() && install_dirs.size() == 1) { + accept(); } auto layout = new QVBoxLayout(this); @@ -53,6 +55,14 @@ QWidget* InstallDirSelect::SetupInstallDirList() { vlayout->addWidget(m_path_list); + auto checkbox = new QCheckBox(tr("Install All Queued to Selected Folder")); + connect(checkbox, &QCheckBox::toggled, this, &InstallDirSelect::setUseForAllQueued); + vlayout->addWidget(checkbox); + + auto checkbox2 = new QCheckBox(tr("Delete PKG File on Install")); + connect(checkbox2, &QCheckBox::toggled, this, &InstallDirSelect::setDeleteFileOnInstall); + vlayout->addWidget(checkbox2); + group->setLayout(vlayout); return group; } @@ -66,6 +76,14 @@ void InstallDirSelect::setSelectedDirectory(QListWidgetItem* item) { } } +void InstallDirSelect::setUseForAllQueued(bool enabled) { + use_for_all_queued = enabled; +} + +void InstallDirSelect::setDeleteFileOnInstall(bool enabled) { + delete_file_on_install = enabled; +} + QWidget* InstallDirSelect::SetupDialogActions() { auto actions = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); diff --git a/src/qt_gui/install_dir_select.h b/src/qt_gui/install_dir_select.h index e3e81575a..e11cbf381 100644 --- a/src/qt_gui/install_dir_select.h +++ b/src/qt_gui/install_dir_select.h @@ -22,9 +22,21 @@ public: return selected_dir; } + bool useForAllQueued() { + return use_for_all_queued; + } + + bool deleteFileOnInstall() { + return delete_file_on_install; + } + private: QWidget* SetupInstallDirList(); QWidget* SetupDialogActions(); void setSelectedDirectory(QListWidgetItem* item); + void setDeleteFileOnInstall(bool enabled); + void setUseForAllQueued(bool enabled); std::filesystem::path selected_dir; + bool delete_file_on_install = false; + bool use_for_all_queued = false; }; diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 3ee392613..3678b3a82 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -725,9 +725,20 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int return; } auto category = psf.GetString("CATEGORY"); - InstallDirSelect ids; - ids.exec(); - auto game_install_dir = ids.getSelectedDirectory(); + + if (!use_for_all_queued || pkgNum == 1) { + InstallDirSelect ids; + const auto selected = ids.exec(); + if (selected == QDialog::Rejected) { + return; + } + + last_install_dir = ids.getSelectedDirectory(); + delete_file_on_install = ids.deleteFileOnInstall(); + use_for_all_queued = ids.useForAllQueued(); + } + std::filesystem::path game_install_dir = last_install_dir; + auto game_folder_path = game_install_dir / pkg.GetTitleID(); QString pkgType = QString::fromStdString(pkg.GetPkgFlags()); bool use_game_update = pkgType.contains("PATCH") && Config::getSeparateUpdateEnabled(); @@ -879,8 +890,14 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int if (pkgNum == nPkg) { QString path; Common::FS::PathToQString(path, game_install_dir); + QIcon windowIcon( + Common::FS::PathToUTF8String(game_folder_path / "sce_sys/icon0.png") + .c_str()); QMessageBox extractMsgBox(this); extractMsgBox.setWindowTitle(tr("Extraction Finished")); + if (!windowIcon.isNull()) { + extractMsgBox.setWindowIcon(windowIcon); + } extractMsgBox.setText( QString(tr("Game successfully installed at %1")).arg(path)); extractMsgBox.addButton(QMessageBox::Ok); @@ -894,6 +911,9 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int }); extractMsgBox.exec(); } + if (delete_file_on_install) { + std::filesystem::remove(file); + } }); connect(&dialog, &QProgressDialog::canceled, [&]() { futureWatcher.cancel(); }); connect(&futureWatcher, &QFutureWatcher::progressValueChanged, &dialog, diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h index f4163defa..5ac56e44c 100644 --- a/src/qt_gui/main_window.h +++ b/src/qt_gui/main_window.h @@ -123,4 +123,8 @@ protected: } void resizeEvent(QResizeEvent* event) override; + + std::filesystem::path last_install_dir = ""; + bool delete_file_on_install = false; + bool use_for_all_queued = false; }; From 9bad66b24d4082240d00849a3d342d4d4a7c52d3 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:29:52 -0800 Subject: [PATCH 167/455] hotfix: Raise videodec memory back up to 16MB. Found a game that needs more, still should be low enough compared to before to fix some games. --- src/core/libraries/videodec/videodec.cpp | 2 +- src/core/libraries/videodec/videodec2.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/videodec/videodec.cpp b/src/core/libraries/videodec/videodec.cpp index 79001e76f..02ea61509 100644 --- a/src/core/libraries/videodec/videodec.cpp +++ b/src/core/libraries/videodec/videodec.cpp @@ -9,7 +9,7 @@ namespace Libraries::Videodec { -static constexpr u64 kMinimumMemorySize = 8_MB; ///> Fake minimum memory size for querying +static constexpr u64 kMinimumMemorySize = 16_MB; ///> Fake minimum memory size for querying int PS4_SYSV_ABI sceVideodecCreateDecoder(const OrbisVideodecConfigInfo* pCfgInfoIn, const OrbisVideodecResourceInfo* pRsrcInfoIn, diff --git a/src/core/libraries/videodec/videodec2.cpp b/src/core/libraries/videodec/videodec2.cpp index be0db4ea3..a7e520b41 100644 --- a/src/core/libraries/videodec/videodec2.cpp +++ b/src/core/libraries/videodec/videodec2.cpp @@ -10,7 +10,7 @@ namespace Libraries::Vdec2 { -static constexpr u64 kMinimumMemorySize = 8_MB; ///> Fake minimum memory size for querying +static constexpr u64 kMinimumMemorySize = 16_MB; ///> Fake minimum memory size for querying s32 PS4_SYSV_ABI sceVideodec2QueryComputeMemoryInfo(OrbisVideodec2ComputeMemoryInfo* computeMemInfo) { From aa847de043e2e04512d5d01b4d9e40adc4706b0a Mon Sep 17 00:00:00 2001 From: isshininu Date: Wed, 29 Jan 2025 13:54:08 +0400 Subject: [PATCH 168/455] Update ru_RU translation (#2267) Several changes in ru_RU translation file. --- src/qt_gui/translations/ru_RU.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 6423f5ba4..0fddb1e7f 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -126,11 +126,11 @@ Copy All - Копировать все + Копировать всё Delete... - Удаление... + Удалить... Delete Game @@ -158,7 +158,7 @@ Submit a report - Отправить отчет + Отправить отчёт Shortcut creation @@ -297,7 +297,7 @@ Elf Viewer - Elf + Исполняемый файл Game Install Directory @@ -542,7 +542,7 @@ Fullscreen Mode - Режим Полного Экран + Тип полноэкранного режима Enable Separate Update Folder @@ -574,11 +574,11 @@ Trophy Key - Trophy Key + Ключ трофеев Trophy - Trophy + Трофеи Logger @@ -750,7 +750,7 @@ Audio Backend - Звуковая Подсистема + Звуковая подсистема Save @@ -826,7 +826,7 @@ disableTrophycheckBox - Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по прежнему можно отслеживать в меню Просмотр трофеев (правая кнопка мыши по игре в главном окне). + Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). hideCursorGroupBox @@ -1192,11 +1192,11 @@ Play Time - Времени в игре + Время в игре Never Played - Вы не играли + Нет h @@ -1361,4 +1361,4 @@ ТБ
- \ No newline at end of file + From 4bb578f9fb73ce77680e26621717db460a93b0e8 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Wed, 29 Jan 2025 11:45:44 +0100 Subject: [PATCH 169/455] updates french translation (#2262) * updates the french translation * fix space at the end * forgot to translate a line * final changes * final changes 2 --- src/qt_gui/translations/fr.ts | 66 +++++++++++++++++------------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 601ece8b4..0f87b087b 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -146,19 +146,19 @@ Compatibility... - Compatibility... + Compatibilité... Update database - Update database + Mettre à jour la base de données View report - View report + Voir rapport Submit a report - Submit a report + Soumettre un rapport Shortcut creation @@ -186,7 +186,7 @@ requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. + Cette fonctionnalité nécessite l'option 'Dossier séparé pour les mises à jour' pour fonctionner. Si vous voulez utiliser cette fonctionnalité, veuillez l'activer. This game has no update to delete! @@ -546,7 +546,7 @@ Enable Separate Update Folder - Dossier séparé pour les mises à jours + Dossier séparé pour les mises à jour Default tab when opening settings @@ -574,11 +574,11 @@ Trophy Key - Trophy Key + Clé de trophée Trophy - Trophy + Trophée Logger @@ -586,11 +586,11 @@ Log Type - Type + Type de journal Log Filter - Filtre + Filtre du journal Open Log Location @@ -722,7 +722,7 @@ Disable Trophy Pop-ups - Disable Trophy Pop-ups + Désactiver les notifications de trophées Play title music @@ -730,19 +730,19 @@ Update Compatibility Database On Startup - Update Compatibility Database On Startup + Mettre à jour la base de données de compatibilité au lancement Game Compatibility - Game Compatibility + Compatibilité du jeu Display Compatibility Data - Display Compatibility Data + Afficher les données de compatibilité Update Compatibility Database - Update Compatibility Database + Mettre à jour la base de données de compatibilité Volume @@ -750,7 +750,7 @@ Audio Backend - Audio Backend + Back-end audio Save @@ -786,7 +786,7 @@ separateUpdatesCheckBox - Dossier séparé pour les mises à jours:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. + Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. showSplashCheckBox @@ -806,7 +806,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Clé de trophées:\nClé utilisée pour décrypter les trophées. Doit être obtenu à partir de votre console jailbreakée.\nDoit contenir des caractères hexadécimaux uniquement. logTypeGroupBox @@ -826,7 +826,7 @@ disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Désactiver les notifications de trophées:\nDésactive les notifications de trophées en jeu. La progression des trophées peut toujours être suivie à l'aide de la Visionneuse de trophées (clique droit sur le jeu sur la fenêtre principale). hideCursorGroupBox @@ -842,15 +842,15 @@ enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez "Mettre à jour la compatibilité au démarrage" pour avoir des informations à jour. checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Mettre à jour la compatibilité au démarrage:\nMettre à jour automatiquement la base de données de compatibilité au démarrage de shadPS4. updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. Never @@ -1093,7 +1093,7 @@ DownloadComplete_MSG - Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour le numéro de série et la version spécifiques du jeu. + Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour la série et la version spécifiques du jeu. Failed to parse JSON data from HTML. @@ -1113,7 +1113,7 @@ You may need to update your game. - Vous devrez peut-être mettre à jour votre jeu. + Vous devriez peut-être mettre à jour votre jeu. Incompatibility Notice @@ -1137,7 +1137,7 @@ Directory does not exist: - Répertoire n'existe pas: + Le répertoire n'existe pas: Failed to open files.json for reading. @@ -1149,7 +1149,7 @@ Can't apply cheats before the game is started - Impossible d'appliquer les Cheats avant que le jeu ne commence. + Impossible d'appliquer les cheats avant que le jeu ne soit lancé
@@ -1168,7 +1168,7 @@ Compatibility - Compatibility + Compatibilité Region @@ -1212,27 +1212,27 @@ Compatibility is untested - Compatibility is untested + La compatibilité n'a pas été testé Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Le jeu ne se lance pas correctement / crash l'émulateur Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Le jeu démarre, mais n'affiche qu'un écran noir Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Le jeu affiche une image mais ne dépasse pas le menu Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Le jeu a des problèmes majeurs ou des performances qui le rendent injouable Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Le jeu peut être terminé avec des performances acceptables et sans problèmes majeurs From 929e15260d8d7a618c10a5f396b1f9e872970425 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 29 Jan 2025 18:14:36 -0800 Subject: [PATCH 170/455] shader_recompiler: Fix cube sampling coordinates. (#2266) --- .../ir/passes/resource_tracking_pass.cpp | 25 ++++++++++++++----- src/shader_recompiler/specialization.h | 2 ++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index 43d125bf0..c5f98e5b9 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -583,6 +583,18 @@ void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { } } +IR::Value FixCubeCoords(IR::IREmitter& ir, const AmdGpu::Image& image, const IR::Value& x, + const IR::Value& y, const IR::Value& face) { + if (!image.IsCube()) { + return ir.CompositeConstruct(x, y, face); + } + // AMD cube math results in coordinates in the range [1.0, 2.0]. We need + // to convert this to the range [0.0, 1.0] to get correct results. + const auto fixed_x = ir.FPSub(IR::F32{x}, ir.Imm32(1.f)); + const auto fixed_y = ir.FPSub(IR::F32{y}, ir.Imm32(1.f)); + return ir.CompositeConstruct(fixed_x, fixed_y, face); +} + void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, const ImageResource& image_res, const AmdGpu::Image& image) { const auto handle = inst.Arg(0); @@ -643,8 +655,8 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, case AmdGpu::ImageType::Color1DArray: return read(0); case AmdGpu::ImageType::Color2D: - case AmdGpu::ImageType::Color2DArray: case AmdGpu::ImageType::Color2DMsaa: + case AmdGpu::ImageType::Color2DArray: return ir.CompositeConstruct(read(0), read(8)); case AmdGpu::ImageType::Color3D: return ir.CompositeConstruct(read(0), read(8), read(16)); @@ -665,8 +677,8 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, addr_reg = addr_reg + 2; return {get_addr_reg(addr_reg - 2), get_addr_reg(addr_reg - 1)}; case AmdGpu::ImageType::Color2D: - case AmdGpu::ImageType::Color2DArray: case AmdGpu::ImageType::Color2DMsaa: + case AmdGpu::ImageType::Color2DArray: // (du/dx, dv/dx), (du/dy, dv/dy) addr_reg = addr_reg + 4; return {ir.CompositeConstruct(get_addr_reg(addr_reg - 4), get_addr_reg(addr_reg - 3)), @@ -711,12 +723,13 @@ void PatchImageSampleArgs(IR::Block& block, IR::Inst& inst, Info& info, case AmdGpu::ImageType::Color2D: // x, y addr_reg = addr_reg + 2; return ir.CompositeConstruct(get_coord(addr_reg - 2, 0), get_coord(addr_reg - 1, 1)); - case AmdGpu::ImageType::Color2DArray: // x, y, slice - [[fallthrough]]; case AmdGpu::ImageType::Color2DMsaa: // x, y, frag + [[fallthrough]]; + case AmdGpu::ImageType::Color2DArray: // x, y, slice addr_reg = addr_reg + 3; - return ir.CompositeConstruct(get_coord(addr_reg - 3, 0), get_coord(addr_reg - 2, 1), - get_addr_reg(addr_reg - 1)); + // Note we can use FixCubeCoords with fallthrough cases since it checks for image type. + return FixCubeCoords(ir, image, get_coord(addr_reg - 3, 0), get_coord(addr_reg - 2, 1), + get_addr_reg(addr_reg - 1)); case AmdGpu::ImageType::Color3D: // x, y, z addr_reg = addr_reg + 3; return ir.CompositeConstruct(get_coord(addr_reg - 3, 0), get_coord(addr_reg - 2, 1), diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index 523e63497..eb0085965 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -47,6 +47,7 @@ struct ImageSpecialization { AmdGpu::ImageType type = AmdGpu::ImageType::Color2D; bool is_integer = false; bool is_storage = false; + bool is_cube = false; AmdGpu::CompMapping dst_select{}; AmdGpu::NumberConversion num_conversion{}; @@ -127,6 +128,7 @@ struct StageSpecialization { spec.type = sharp.GetViewType(desc.is_array); spec.is_integer = AmdGpu::IsInteger(sharp.GetNumberFmt()); spec.is_storage = desc.is_written; + spec.is_cube = sharp.IsCube(); if (spec.is_storage) { spec.dst_select = sharp.DstSelect(); } From 0358271b93160a97079376c408b5c270e807826c Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Thu, 30 Jan 2025 04:45:48 -0300 Subject: [PATCH 171/455] Savefixes vii (#2279) * savedata: rewrite save memory functions to handle slot id & better backup management * savedata: auto-restore backup if needed * safe save backup shutdown replaced exit by quick_exit --- src/common/elf_info.h | 1 + src/core/libraries/save_data/save_backup.cpp | 21 +- src/core/libraries/save_data/save_backup.h | 2 + .../libraries/save_data/save_instance.cpp | 53 +-- src/core/libraries/save_data/save_instance.h | 5 +- src/core/libraries/save_data/save_memory.cpp | 365 ++++++++---------- src/core/libraries/save_data/save_memory.h | 36 +- src/core/libraries/save_data/savedata.cpp | 108 ++++-- src/emulator.cpp | 3 +- 9 files changed, 285 insertions(+), 309 deletions(-) diff --git a/src/common/elf_info.h b/src/common/elf_info.h index cb32679bb..d885709cd 100644 --- a/src/common/elf_info.h +++ b/src/common/elf_info.h @@ -80,6 +80,7 @@ public: static constexpr u32 FW_40 = 0x4000000; static constexpr u32 FW_45 = 0x4500000; static constexpr u32 FW_50 = 0x5000000; + static constexpr u32 FW_55 = 0x5500000; static constexpr u32 FW_80 = 0x8000000; static ElfInfo& Instance() { diff --git a/src/core/libraries/save_data/save_backup.cpp b/src/core/libraries/save_data/save_backup.cpp index 5261cdb11..f85845f70 100644 --- a/src/core/libraries/save_data/save_backup.cpp +++ b/src/core/libraries/save_data/save_backup.cpp @@ -121,15 +121,17 @@ static void BackupThreadBody() { std::scoped_lock lk{g_backup_queue_mutex}; g_backup_queue.front().done = true; } - std::this_thread::sleep_for(std::chrono::seconds(5)); // Don't backup too often { std::scoped_lock lk{g_backup_queue_mutex}; g_backup_queue.pop_front(); - g_result_queue.push_back(std::move(req)); - if (g_result_queue.size() > 20) { - g_result_queue.pop_front(); + if (req.origin != OrbisSaveDataEventType::__DO_NOT_SAVE) { + g_result_queue.push_back(std::move(req)); + if (g_result_queue.size() > 20) { + g_result_queue.pop_front(); + } } } + std::this_thread::sleep_for(std::chrono::seconds(5)); // Don't backup too often } g_backup_status = WorkerStatus::NotStarted; } @@ -141,6 +143,15 @@ void StartThread() { LOG_DEBUG(Lib_SaveData, "Starting backup thread"); g_backup_status = WorkerStatus::Waiting; g_backup_thread = std::jthread{BackupThreadBody}; + static std::once_flag flag; + std::call_once(flag, [] { + std::at_quick_exit([] { + StopThread(); + while (GetWorkerStatus() != WorkerStatus::NotStarted) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + }); + }); } void StopThread() { @@ -148,12 +159,12 @@ void StopThread() { return; } LOG_DEBUG(Lib_SaveData, "Stopping backup thread"); + g_backup_status = WorkerStatus::Stopping; { std::scoped_lock lk{g_backup_queue_mutex}; g_backup_queue.emplace_back(BackupRequest{}); } g_backup_thread_semaphore.release(); - g_backup_status = WorkerStatus::Stopping; } bool NewRequest(OrbisUserServiceUserId user_id, std::string_view title_id, diff --git a/src/core/libraries/save_data/save_backup.h b/src/core/libraries/save_data/save_backup.h index e49c69f60..83a263c9b 100644 --- a/src/core/libraries/save_data/save_backup.h +++ b/src/core/libraries/save_data/save_backup.h @@ -25,6 +25,8 @@ enum class OrbisSaveDataEventType : u32 { UMOUNT_BACKUP = 1, BACKUP = 2, SAVE_DATA_MEMORY_SYNC = 3, + + __DO_NOT_SAVE = 1000000, // This value is only for the backup thread }; struct BackupRequest { diff --git a/src/core/libraries/save_data/save_instance.cpp b/src/core/libraries/save_data/save_instance.cpp index c2b7dca3c..26708d2d6 100644 --- a/src/core/libraries/save_data/save_instance.cpp +++ b/src/core/libraries/save_data/save_instance.cpp @@ -10,6 +10,7 @@ #include "common/path_util.h" #include "common/singleton.h" #include "core/file_sys/fs.h" +#include "save_backup.h" #include "save_instance.h" constexpr auto OrbisSaveDataBlocksMin2 = 96; // 3MiB @@ -45,14 +46,13 @@ static const std::unordered_map default_title = { namespace Libraries::SaveData { -std::filesystem::path SaveInstance::MakeTitleSavePath(OrbisUserServiceUserId user_id, - std::string_view game_serial) { +fs::path SaveInstance::MakeTitleSavePath(OrbisUserServiceUserId user_id, + std::string_view game_serial) { return Config::GetSaveDataPath() / std::to_string(user_id) / game_serial; } -std::filesystem::path SaveInstance::MakeDirSavePath(OrbisUserServiceUserId user_id, - std::string_view game_serial, - std::string_view dir_name) { +fs::path SaveInstance::MakeDirSavePath(OrbisUserServiceUserId user_id, std::string_view game_serial, + std::string_view dir_name) { return Config::GetSaveDataPath() / std::to_string(user_id) / game_serial / dir_name; } @@ -65,7 +65,7 @@ uint64_t SaveInstance::GetMaxBlockFromSFO(const PSF& psf) { return *(uint64_t*)value.data(); } -std::filesystem::path SaveInstance::GetParamSFOPath(const std::filesystem::path& dir_path) { +fs::path SaveInstance::GetParamSFOPath(const fs::path& dir_path) { return dir_path / sce_sys / "param.sfo"; } @@ -129,7 +129,6 @@ SaveInstance& SaveInstance::operator=(SaveInstance&& other) noexcept { save_path = std::move(other.save_path); param_sfo_path = std::move(other.param_sfo_path); corrupt_file_path = std::move(other.corrupt_file_path); - corrupt_file = std::move(other.corrupt_file); param_sfo = std::move(other.param_sfo); mount_point = std::move(other.mount_point); max_blocks = other.max_blocks; @@ -142,7 +141,8 @@ SaveInstance& SaveInstance::operator=(SaveInstance&& other) noexcept { return *this; } -void SaveInstance::SetupAndMount(bool read_only, bool copy_icon, bool ignore_corrupt) { +void SaveInstance::SetupAndMount(bool read_only, bool copy_icon, bool ignore_corrupt, + bool dont_restore_backup) { if (mounted) { UNREACHABLE_MSG("Save instance is already mounted"); } @@ -161,25 +161,27 @@ void SaveInstance::SetupAndMount(bool read_only, bool copy_icon, bool ignore_cor } exists = true; } else { + std::optional err; if (!ignore_corrupt && fs::exists(corrupt_file_path)) { - throw std::filesystem::filesystem_error( - "Corrupted save data", corrupt_file_path, - std::make_error_code(std::errc::illegal_byte_sequence)); + err = fs::filesystem_error("Corrupted save data", corrupt_file_path, + std::make_error_code(std::errc::illegal_byte_sequence)); + } else if (!param_sfo.Open(param_sfo_path)) { + err = fs::filesystem_error("Failed to read param.sfo", param_sfo_path, + std::make_error_code(std::errc::illegal_byte_sequence)); } - if (!param_sfo.Open(param_sfo_path)) { - throw std::filesystem::filesystem_error( - "Failed to read param.sfo", param_sfo_path, - std::make_error_code(std::errc::illegal_byte_sequence)); + if (err.has_value()) { + if (dont_restore_backup) { + throw err.value(); + } + if (Backup::Restore(save_path)) { + return SetupAndMount(read_only, copy_icon, ignore_corrupt, true); + } } } if (!ignore_corrupt && !read_only) { - int err = corrupt_file.Open(corrupt_file_path, Common::FS::FileAccessMode::Write); - if (err != 0) { - throw std::filesystem::filesystem_error( - "Failed to open corrupted file", corrupt_file_path, - std::make_error_code(std::errc::illegal_byte_sequence)); - } + Common::FS::IOFile f(corrupt_file_path, Common::FS::FileAccessMode::Write); + f.Close(); } max_blocks = static_cast(GetMaxBlockFromSFO(param_sfo)); @@ -197,12 +199,11 @@ void SaveInstance::Umount() { mounted = false; const bool ok = param_sfo.Encode(param_sfo_path); if (!ok) { - throw std::filesystem::filesystem_error("Failed to write param.sfo", param_sfo_path, - std::make_error_code(std::errc::permission_denied)); + throw fs::filesystem_error("Failed to write param.sfo", param_sfo_path, + std::make_error_code(std::errc::permission_denied)); } param_sfo = PSF(); - corrupt_file.Close(); fs::remove(corrupt_file_path); g_mnt->Unmount(save_path, mount_point); } @@ -216,8 +217,8 @@ void SaveInstance::CreateFiles() { const bool ok = param_sfo.Encode(param_sfo_path); if (!ok) { - throw std::filesystem::filesystem_error("Failed to write param.sfo", param_sfo_path, - std::make_error_code(std::errc::permission_denied)); + throw fs::filesystem_error("Failed to write param.sfo", param_sfo_path, + std::make_error_code(std::errc::permission_denied)); } } diff --git a/src/core/libraries/save_data/save_instance.h b/src/core/libraries/save_data/save_instance.h index 3be5c4595..6e7ac8f66 100644 --- a/src/core/libraries/save_data/save_instance.h +++ b/src/core/libraries/save_data/save_instance.h @@ -42,8 +42,6 @@ class SaveInstance { std::filesystem::path param_sfo_path; std::filesystem::path corrupt_file_path; - Common::FS::IOFile corrupt_file; - PSF param_sfo; std::string mount_point; @@ -80,7 +78,8 @@ public: SaveInstance& operator=(const SaveInstance& other) = delete; SaveInstance& operator=(SaveInstance&& other) noexcept; - void SetupAndMount(bool read_only = false, bool copy_icon = false, bool ignore_corrupt = false); + void SetupAndMount(bool read_only = false, bool copy_icon = false, bool ignore_corrupt = false, + bool dont_restore_backup = false); void Umount(); diff --git a/src/core/libraries/save_data/save_memory.cpp b/src/core/libraries/save_data/save_memory.cpp index 84179bc27..13e122c60 100644 --- a/src/core/libraries/save_data/save_memory.cpp +++ b/src/core/libraries/save_data/save_memory.cpp @@ -6,14 +6,16 @@ #include #include #include +#include #include #include #include #include "common/assert.h" +#include "common/elf_info.h" #include "common/logging/log.h" -#include "common/polyfill_thread.h" +#include "common/path_util.h" #include "common/singleton.h" #include "common/thread.h" #include "core/file_sys/fs.h" @@ -23,265 +25,202 @@ using Common::FS::IOFile; namespace fs = std::filesystem; constexpr std::string_view sce_sys = "sce_sys"; // system folder inside save -constexpr std::string_view DirnameSaveDataMemory = "sce_sdmemory"; +constexpr std::string_view StandardDirnameSaveDataMemory = "sce_sdmemory"; constexpr std::string_view FilenameSaveDataMemory = "memory.dat"; +constexpr std::string_view IconName = "icon0.png"; +constexpr std::string_view CorruptFileName = "corrupted"; namespace Libraries::SaveData::SaveMemory { static Core::FileSys::MntPoints* g_mnt = Common::Singleton::Instance(); -static OrbisUserServiceUserId g_user_id{}; -static std::string g_game_serial{}; -static std::filesystem::path g_save_path{}; -static std::filesystem::path g_param_sfo_path{}; -static PSF g_param_sfo; +struct SlotData { + OrbisUserServiceUserId user_id; + std::string game_serial; + std::filesystem::path folder_path; + PSF sfo; + std::vector memory_cache; +}; -static bool g_save_memory_initialized = false; -static std::mutex g_saving_memory_mutex; -static std::vector g_save_memory; +static std::mutex g_slot_mtx; +static std::unordered_map g_attached_slots; -static std::filesystem::path g_icon_path; -static std::vector g_icon_memory; +void PersistMemory(u32 slot_id, bool lock) { + std::unique_lock lck{g_slot_mtx, std::defer_lock}; + if (lock) { + lck.lock(); + } + auto& data = g_attached_slots[slot_id]; + auto memoryPath = data.folder_path / FilenameSaveDataMemory; + fs::create_directories(memoryPath.parent_path()); -static std::condition_variable g_trigger_save_memory; -static std::atomic_bool g_saving_memory = false; -static std::atomic_bool g_save_event = false; -static std::jthread g_save_memory_thread; - -static std::atomic_bool g_memory_dirty = false; -static std::atomic_bool g_param_dirty = false; -static std::atomic_bool g_icon_dirty = false; - -static void SaveFileSafe(void* buf, size_t count, const std::filesystem::path& path) { - const auto& dir = path.parent_path(); - const auto& name = path.filename(); - const auto tmp_path = dir / (name.string() + ".tmp"); - - IOFile file(tmp_path, Common::FS::FileAccessMode::Write); - file.WriteRaw(buf, count); - file.Close(); - - fs::remove(path); - fs::rename(tmp_path, path); -} - -[[noreturn]] void SaveThreadLoop() { - Common::SetCurrentThreadName("shadPS4:SaveData:SaveDataMemoryThread"); - std::mutex mtx; - while (true) { - { - std::unique_lock lk{mtx}; - g_trigger_save_memory.wait(lk); - } - // Save the memory - g_saving_memory = true; - std::scoped_lock lk{g_saving_memory_mutex}; + int n = 0; + std::string errMsg; + while (n++ < 10) { try { - LOG_DEBUG(Lib_SaveData, "Saving save data memory {}", fmt::UTF(g_save_path.u8string())); - - if (g_memory_dirty) { - g_memory_dirty = false; - SaveFileSafe(g_save_memory.data(), g_save_memory.size(), - g_save_path / FilenameSaveDataMemory); + IOFile f; + int r = f.Open(memoryPath, Common::FS::FileAccessMode::Write); + if (f.IsOpen()) { + f.WriteRaw(data.memory_cache.data(), data.memory_cache.size()); + f.Close(); + return; } - if (g_param_dirty) { - g_param_dirty = false; - static std::vector buf; - g_param_sfo.Encode(buf); - SaveFileSafe(buf.data(), buf.size(), g_param_sfo_path); - } - if (g_icon_dirty) { - g_icon_dirty = false; - SaveFileSafe(g_icon_memory.data(), g_icon_memory.size(), g_icon_path); - } - - if (g_save_event) { - Backup::PushBackupEvent(Backup::BackupRequest{ - .user_id = g_user_id, - .title_id = g_game_serial, - .dir_name = std::string{DirnameSaveDataMemory}, - .origin = Backup::OrbisSaveDataEventType::SAVE_DATA_MEMORY_SYNC, - .save_path = g_save_path, - }); - g_save_event = false; - } - } catch (const fs::filesystem_error& e) { - LOG_ERROR(Lib_SaveData, "Failed to save save data memory: {}", e.what()); - MsgDialog::ShowMsgDialog(MsgDialog::MsgDialogState{ - MsgDialog::MsgDialogState::UserState{ - .type = MsgDialog::ButtonType::OK, - .msg = fmt::format("Failed to save save data memory.\nCode: <{}>\n{}", - e.code().message(), e.what()), - }, - }); + const auto err = std::error_code{r, std::iostream_category()}; + throw std::filesystem::filesystem_error{err.message(), err}; + } catch (const std::filesystem::filesystem_error& e) { + errMsg = std::string{e.what()}; + std::this_thread::sleep_for(std::chrono::seconds(1)); } - g_saving_memory = false; } + const MsgDialog::MsgDialogState dialog{MsgDialog::MsgDialogState::UserState{ + .type = MsgDialog::ButtonType::OK, + .msg = "Failed to persist save memory:\n" + errMsg + "\nat " + + Common::FS::PathToUTF8String(memoryPath), + }}; + MsgDialog::ShowMsgDialog(dialog); } -void SetDirectories(OrbisUserServiceUserId user_id, std::string _game_serial) { - g_user_id = user_id; - g_game_serial = std::move(_game_serial); - g_save_path = SaveInstance::MakeDirSavePath(user_id, g_game_serial, DirnameSaveDataMemory); - g_param_sfo_path = SaveInstance::GetParamSFOPath(g_save_path); - g_param_sfo = PSF(); - g_icon_path = g_save_path / sce_sys / "icon0.png"; +std::string GetSaveDir(u32 slot_id) { + std::string dir(StandardDirnameSaveDataMemory); + if (slot_id > 0) { + dir += std::to_string(slot_id); + } + return dir; } -const std::filesystem::path& GetSavePath() { - return g_save_path; +std::filesystem::path GetSavePath(OrbisUserServiceUserId user_id, u32 slot_id, + std::string_view game_serial) { + std::string dir(StandardDirnameSaveDataMemory); + if (slot_id > 0) { + dir += std::to_string(slot_id); + } + return SaveInstance::MakeDirSavePath(user_id, Common::ElfInfo::Instance().GameSerial(), dir); } -size_t CreateSaveMemory(size_t memory_size) { - size_t existed_size = 0; +size_t SetupSaveMemory(OrbisUserServiceUserId user_id, u32 slot_id, std::string_view game_serial) { + std::lock_guard lck{g_slot_mtx}; - static std::once_flag init_save_thread_flag; - std::call_once(init_save_thread_flag, - [] { g_save_memory_thread = std::jthread{SaveThreadLoop}; }); + const auto save_dir = GetSavePath(user_id, slot_id, game_serial); - g_save_memory.resize(memory_size); - SaveInstance::SetupDefaultParamSFO(g_param_sfo, std::string{DirnameSaveDataMemory}, - g_game_serial); + auto& data = g_attached_slots[slot_id]; + data = SlotData{ + .user_id = user_id, + .game_serial = std::string{game_serial}, + .folder_path = save_dir, + .sfo = {}, + .memory_cache = {}, + }; - g_save_memory_initialized = true; + SaveInstance::SetupDefaultParamSFO(data.sfo, GetSaveDir(slot_id), std::string{game_serial}); - if (!fs::exists(g_param_sfo_path)) { - // Create save memory - fs::create_directories(g_save_path / sce_sys); - - IOFile memory_file{g_save_path / FilenameSaveDataMemory, Common::FS::FileAccessMode::Write}; - bool ok = memory_file.SetSize(memory_size); - if (!ok) { - LOG_ERROR(Lib_SaveData, "Failed to set memory size"); - throw std::filesystem::filesystem_error( - "Failed to set save memory size", g_save_path / FilenameSaveDataMemory, - std::make_error_code(std::errc::no_space_on_device)); - } - memory_file.Close(); - } else { - // Load save memory - - bool ok = g_param_sfo.Open(g_param_sfo_path); - if (!ok) { - LOG_ERROR(Lib_SaveData, "Failed to open SFO at {}", - fmt::UTF(g_param_sfo_path.u8string())); - throw std::filesystem::filesystem_error( - "failed to open SFO", g_param_sfo_path, - std::make_error_code(std::errc::illegal_byte_sequence)); - } - - IOFile memory_file{g_save_path / FilenameSaveDataMemory, Common::FS::FileAccessMode::Read}; - if (!memory_file.IsOpen()) { - LOG_ERROR(Lib_SaveData, "Failed to open save memory"); - throw std::filesystem::filesystem_error( - "failed to open save memory", g_save_path / FilenameSaveDataMemory, - std::make_error_code(std::errc::permission_denied)); - } - size_t save_size = memory_file.GetSize(); - existed_size = save_size; - memory_file.Seek(0); - memory_file.ReadRaw(g_save_memory.data(), std::min(save_size, memory_size)); - memory_file.Close(); + auto param_sfo_path = SaveInstance::GetParamSFOPath(save_dir); + if (!fs::exists(param_sfo_path)) { + return 0; } - return existed_size; + if (!data.sfo.Open(param_sfo_path) || fs::exists(save_dir / CorruptFileName)) { + if (!Backup::Restore(save_dir)) { // Could not restore the backup + return 0; + } + } + + const auto memory = save_dir / FilenameSaveDataMemory; + if (fs::exists(memory)) { + return fs::file_size(memory); + } + + return 0; } -void SetIcon(void* buf, size_t buf_size) { +void SetIcon(u32 slot_id, void* buf, size_t buf_size) { + std::lock_guard lck{g_slot_mtx}; + const auto& data = g_attached_slots[slot_id]; + const auto icon_path = data.folder_path / sce_sys / "icon0.png"; if (buf == nullptr) { const auto& src_icon = g_mnt->GetHostPath("/app0/sce_sys/save_data.png"); - if (fs::exists(src_icon)) { - if (fs::exists(g_icon_path)) { - fs::remove(g_icon_path); - } - fs::copy_file(src_icon, g_icon_path); + if (fs::exists(icon_path)) { + fs::remove(icon_path); } - if (fs::exists(g_icon_path)) { - IOFile file(g_icon_path, Common::FS::FileAccessMode::Read); - size_t size = file.GetSize(); - file.Seek(0); - g_icon_memory.resize(size); - file.ReadRaw(g_icon_memory.data(), size); - file.Close(); + if (fs::exists(src_icon)) { + fs::create_directories(icon_path.parent_path()); + fs::copy_file(src_icon, icon_path); } } else { - g_icon_memory.resize(buf_size); - std::memcpy(g_icon_memory.data(), buf, buf_size); - IOFile file(g_icon_path, Common::FS::FileAccessMode::Write); - file.Seek(0); - file.WriteRaw(g_icon_memory.data(), buf_size); + IOFile file(icon_path, Common::FS::FileAccessMode::Write); + file.WriteRaw(buf, buf_size); file.Close(); } } -void WriteIcon(void* buf, size_t buf_size) { - if (buf_size != g_icon_memory.size()) { - g_icon_memory.resize(buf_size); +bool IsSaveMemoryInitialized(u32 slot_id) { + std::lock_guard lck{g_slot_mtx}; + return g_attached_slots.contains(slot_id); +} + +PSF& GetParamSFO(u32 slot_id) { + std::lock_guard lck{g_slot_mtx}; + auto& data = g_attached_slots[slot_id]; + return data.sfo; +} + +std::vector GetIcon(u32 slot_id) { + std::lock_guard lck{g_slot_mtx}; + auto& data = g_attached_slots[slot_id]; + const auto icon_path = data.folder_path / sce_sys / "icon0.png"; + IOFile f{icon_path, Common::FS::FileAccessMode::Read}; + if (!f.IsOpen()) { + return {}; } - std::memcpy(g_icon_memory.data(), buf, buf_size); - g_icon_dirty = true; + const u64 size = f.GetSize(); + std::vector ret; + ret.resize(size); + f.ReadSpan(std::span{ret}); + return ret; } -bool IsSaveMemoryInitialized() { - return g_save_memory_initialized; -} - -PSF& GetParamSFO() { - return g_param_sfo; -} - -std::span GetIcon() { - return {g_icon_memory}; -} - -void SaveSFO(bool sync) { - if (!sync) { - g_param_dirty = true; - return; - } - const bool ok = g_param_sfo.Encode(g_param_sfo_path); +void SaveSFO(u32 slot_id) { + std::lock_guard lck{g_slot_mtx}; + const auto& data = g_attached_slots[slot_id]; + const auto sfo_path = SaveInstance::GetParamSFOPath(data.folder_path); + fs::create_directories(sfo_path.parent_path()); + const bool ok = data.sfo.Encode(sfo_path); if (!ok) { LOG_ERROR(Lib_SaveData, "Failed to encode param.sfo"); - throw std::filesystem::filesystem_error("Failed to write param.sfo", g_param_sfo_path, + throw std::filesystem::filesystem_error("Failed to write param.sfo", sfo_path, std::make_error_code(std::errc::permission_denied)); } } -bool IsSaving() { - return g_saving_memory; + +void ReadMemory(u32 slot_id, void* buf, size_t buf_size, int64_t offset) { + std::lock_guard lk{g_slot_mtx}; + auto& data = g_attached_slots[slot_id]; + auto& memory = data.memory_cache; + if (memory.empty()) { // Load file + IOFile f{data.folder_path / FilenameSaveDataMemory, Common::FS::FileAccessMode::Read}; + if (f.IsOpen()) { + memory.resize(f.GetSize()); + f.Seek(0); + f.ReadSpan(std::span{memory}); + } + } + s64 read_size = buf_size; + if (read_size + offset > memory.size()) { + read_size = memory.size() - offset; + } + std::memcpy(buf, memory.data() + offset, read_size); } -bool TriggerSaveWithoutEvent() { - if (g_saving_memory) { - return false; +void WriteMemory(u32 slot_id, void* buf, size_t buf_size, int64_t offset) { + std::lock_guard lk{g_slot_mtx}; + auto& data = g_attached_slots[slot_id]; + auto& memory = data.memory_cache; + if (offset + buf_size > memory.size()) { + memory.resize(offset + buf_size); } - g_trigger_save_memory.notify_one(); - return true; -} - -bool TriggerSave() { - if (g_saving_memory) { - return false; - } - g_save_event = true; - g_trigger_save_memory.notify_one(); - return true; -} - -void ReadMemory(void* buf, size_t buf_size, int64_t offset) { - std::scoped_lock lk{g_saving_memory_mutex}; - if (offset + buf_size > g_save_memory.size()) { - UNREACHABLE_MSG("ReadMemory out of bounds"); - } - std::memcpy(buf, g_save_memory.data() + offset, buf_size); -} - -void WriteMemory(void* buf, size_t buf_size, int64_t offset) { - std::scoped_lock lk{g_saving_memory_mutex}; - if (offset + buf_size > g_save_memory.size()) { - g_save_memory.resize(offset + buf_size); - } - std::memcpy(g_save_memory.data() + offset, buf, buf_size); - g_memory_dirty = true; + std::memcpy(memory.data() + offset, buf, buf_size); + PersistMemory(slot_id, false); + Backup::NewRequest(data.user_id, data.game_serial, GetSaveDir(slot_id), + Backup::OrbisSaveDataEventType::__DO_NOT_SAVE); } } // namespace Libraries::SaveData::SaveMemory \ No newline at end of file diff --git a/src/core/libraries/save_data/save_memory.h b/src/core/libraries/save_data/save_memory.h index 04eeaa652..681865634 100644 --- a/src/core/libraries/save_data/save_memory.h +++ b/src/core/libraries/save_data/save_memory.h @@ -3,7 +3,7 @@ #pragma once -#include +#include #include "save_backup.h" class PSF; @@ -14,36 +14,30 @@ using OrbisUserServiceUserId = s32; namespace Libraries::SaveData::SaveMemory { -void SetDirectories(OrbisUserServiceUserId user_id, std::string game_serial); +void PersistMemory(u32 slot_id, bool lock = true); -[[nodiscard]] const std::filesystem::path& GetSavePath(); +[[nodiscard]] std::string GetSaveDir(u32 slot_id); -// returns the size of the existed save memory -size_t CreateSaveMemory(size_t memory_size); +[[nodiscard]] std::filesystem::path GetSavePath(OrbisUserServiceUserId user_id, u32 slot_id, + std::string_view game_serial); -// Initialize the icon. Set buf to null to read the standard icon. -void SetIcon(void* buf, size_t buf_size); +// returns the size of the save memory if exists +size_t SetupSaveMemory(OrbisUserServiceUserId user_id, u32 slot_id, std::string_view game_serial); -// Update the icon -void WriteIcon(void* buf, size_t buf_size); +// Write the icon. Set buf to null to read the standard icon. +void SetIcon(u32 slot_id, void* buf = nullptr, size_t buf_size = 0); -[[nodiscard]] bool IsSaveMemoryInitialized(); +[[nodiscard]] bool IsSaveMemoryInitialized(u32 slot_id); -[[nodiscard]] PSF& GetParamSFO(); +[[nodiscard]] PSF& GetParamSFO(u32 slot_id); -[[nodiscard]] std::span GetIcon(); +[[nodiscard]] std::vector GetIcon(u32 slot_id); // Save now or wait for the background thread to save -void SaveSFO(bool sync = false); +void SaveSFO(u32 slot_id); -[[nodiscard]] bool IsSaving(); +void ReadMemory(u32 slot_id, void* buf, size_t buf_size, int64_t offset); -bool TriggerSaveWithoutEvent(); - -bool TriggerSave(); - -void ReadMemory(void* buf, size_t buf_size, int64_t offset); - -void WriteMemory(void* buf, size_t buf_size, int64_t offset); +void WriteMemory(u32 slot_id, void* buf, size_t buf_size, int64_t offset); } // namespace Libraries::SaveData::SaveMemory \ No newline at end of file diff --git a/src/core/libraries/save_data/savedata.cpp b/src/core/libraries/save_data/savedata.cpp index b573ded1e..e9ad77d69 100644 --- a/src/core/libraries/save_data/savedata.cpp +++ b/src/core/libraries/save_data/savedata.cpp @@ -177,7 +177,8 @@ struct OrbisSaveDataMemoryGet2 { OrbisSaveDataMemoryData* data; OrbisSaveDataParam* param; OrbisSaveDataIcon* icon; - std::array _reserved; + u32 slotId; + std::array _reserved; }; struct OrbisSaveDataMemorySet2 { @@ -186,6 +187,8 @@ struct OrbisSaveDataMemorySet2 { const OrbisSaveDataMemoryData* data; const OrbisSaveDataParam* param; const OrbisSaveDataIcon* icon; + u32 dataNum; + u32 slotId; std::array _reserved; }; @@ -198,7 +201,8 @@ struct OrbisSaveDataMemorySetup2 { const OrbisSaveDataParam* initParam; // +4.5 const OrbisSaveDataIcon* initIcon; - std::array _reserved; + u32 slotId; + std::array _reserved; }; struct OrbisSaveDataMemorySetupResult { @@ -206,9 +210,16 @@ struct OrbisSaveDataMemorySetupResult { std::array _reserved; }; +enum OrbisSaveDataMemorySyncOption : u32 { + NONE = 0, + BLOCKING = 1, +}; + struct OrbisSaveDataMemorySync { OrbisUserServiceUserId userId; - std::array _reserved; + u32 slotId; + OrbisSaveDataMemorySyncOption option; + std::array _reserved; }; struct OrbisSaveDataMount2 { @@ -327,6 +338,7 @@ static void initialize() { g_initialized = true; g_game_serial = ElfInfo::Instance().GameSerial(); g_fw_ver = ElfInfo::Instance().FirmwareVer(); + Backup::StartThread(); } // game_00other | game*other @@ -558,7 +570,6 @@ Error PS4_SYSV_ABI sceSaveDataBackup(const OrbisSaveDataBackup* backup) { } } - Backup::StartThread(); Backup::NewRequest(backup->userId, title, dir_name, OrbisSaveDataEventType::BACKUP); return Error::OK; @@ -1136,22 +1147,27 @@ Error PS4_SYSV_ABI sceSaveDataGetSaveDataMemory2(OrbisSaveDataMemoryGet2* getPar LOG_INFO(Lib_SaveData, "called with invalid parameter"); return Error::PARAMETER; } - if (!SaveMemory::IsSaveMemoryInitialized()) { + + u32 slot_id = 0; + if (g_fw_ver > ElfInfo::FW_50) { + slot_id = getParam->slotId; + } + if (!SaveMemory::IsSaveMemoryInitialized(slot_id)) { LOG_INFO(Lib_SaveData, "called without save memory initialized"); return Error::MEMORY_NOT_READY; } LOG_DEBUG(Lib_SaveData, "called"); auto data = getParam->data; if (data != nullptr) { - SaveMemory::ReadMemory(data->buf, data->bufSize, data->offset); + SaveMemory::ReadMemory(slot_id, data->buf, data->bufSize, data->offset); } auto param = getParam->param; if (param != nullptr) { - param->FromSFO(SaveMemory::GetParamSFO()); + param->FromSFO(SaveMemory::GetParamSFO(slot_id)); } auto icon = getParam->icon; if (icon != nullptr) { - auto icon_mem = SaveMemory::GetIcon(); + auto icon_mem = SaveMemory::GetIcon(slot_id); size_t total = std::min(icon->bufSize, icon_mem.size()); std::memcpy(icon->buf, icon_mem.data(), total); icon->dataSize = total; @@ -1494,36 +1510,37 @@ Error PS4_SYSV_ABI sceSaveDataSetSaveDataMemory2(const OrbisSaveDataMemorySet2* LOG_INFO(Lib_SaveData, "called with invalid parameter"); return Error::PARAMETER; } - if (!SaveMemory::IsSaveMemoryInitialized()) { + u32 slot_id = 0; + u32 data_num = 1; + if (g_fw_ver > ElfInfo::FW_50) { + slot_id = setParam->slotId; + if (setParam->dataNum > 1) { + data_num = setParam->dataNum; + } + } + if (!SaveMemory::IsSaveMemoryInitialized(slot_id)) { LOG_INFO(Lib_SaveData, "called without save memory initialized"); return Error::MEMORY_NOT_READY; } - if (SaveMemory::IsSaving()) { - int count = 0; - while (++count < 100 && SaveMemory::IsSaving()) { // try for more 10 seconds - std::this_thread::sleep_for(chrono::milliseconds(100)); - } - if (SaveMemory::IsSaving()) { - LOG_TRACE(Lib_SaveData, "called while saving"); - return Error::BUSY_FOR_SAVING; - } - } + LOG_DEBUG(Lib_SaveData, "called"); auto data = setParam->data; if (data != nullptr) { - SaveMemory::WriteMemory(data->buf, data->bufSize, data->offset); + for (int i = 0; i < data_num; i++) { + SaveMemory::WriteMemory(slot_id, data[i].buf, data[i].bufSize, data[i].offset); + } } auto param = setParam->param; if (param != nullptr) { - param->ToSFO(SaveMemory::GetParamSFO()); - SaveMemory::SaveSFO(); - } - auto icon = setParam->icon; - if (icon != nullptr) { - SaveMemory::WriteIcon(icon->buf, icon->bufSize); + param->ToSFO(SaveMemory::GetParamSFO(slot_id)); + SaveMemory::SaveSFO(slot_id); + } + + auto icon = setParam->icon; + if (icon != nullptr) { + SaveMemory::SetIcon(slot_id, icon->buf, icon->bufSize); } - SaveMemory::TriggerSaveWithoutEvent(); return Error::OK; } @@ -1563,9 +1580,12 @@ Error PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory2(const OrbisSaveDataMemorySetu } LOG_DEBUG(Lib_SaveData, "called"); - SaveMemory::SetDirectories(setupParam->userId, g_game_serial); + u32 slot_id = 0; + if (g_fw_ver > ElfInfo::FW_50) { + slot_id = setupParam->slotId; + } - const auto& save_path = SaveMemory::GetSavePath(); + const auto& save_path = SaveMemory::GetSavePath(setupParam->userId, slot_id, g_game_serial); for (const auto& instance : g_mount_slots) { if (instance.has_value() && instance->GetSavePath() == save_path) { return Error::BUSY; @@ -1573,21 +1593,21 @@ Error PS4_SYSV_ABI sceSaveDataSetupSaveDataMemory2(const OrbisSaveDataMemorySetu } try { - size_t existed_size = SaveMemory::CreateSaveMemory(setupParam->memorySize); + size_t existed_size = + SaveMemory::SetupSaveMemory(setupParam->userId, slot_id, g_game_serial); if (existed_size == 0) { // Just created if (g_fw_ver >= ElfInfo::FW_45 && setupParam->initParam != nullptr) { - auto& sfo = SaveMemory::GetParamSFO(); + auto& sfo = SaveMemory::GetParamSFO(slot_id); setupParam->initParam->ToSFO(sfo); } - SaveMemory::SaveSFO(); + SaveMemory::SaveSFO(slot_id); auto init_icon = setupParam->initIcon; if (g_fw_ver >= ElfInfo::FW_45 && init_icon != nullptr) { - SaveMemory::SetIcon(init_icon->buf, init_icon->bufSize); + SaveMemory::SetIcon(slot_id, init_icon->buf, init_icon->bufSize); } else { - SaveMemory::SetIcon(nullptr, 0); + SaveMemory::SetIcon(slot_id); } - SaveMemory::TriggerSaveWithoutEvent(); } if (g_fw_ver >= ElfInfo::FW_45 && result != nullptr) { result->existedMemorySize = existed_size; @@ -1631,15 +1651,23 @@ Error PS4_SYSV_ABI sceSaveDataSyncSaveDataMemory(OrbisSaveDataMemorySync* syncPa LOG_INFO(Lib_SaveData, "called with invalid parameter"); return Error::PARAMETER; } - if (!SaveMemory::IsSaveMemoryInitialized()) { + + u32 slot_id = 0; + if (g_fw_ver > ElfInfo::FW_50) { + slot_id = syncParam->slotId; + } + + if (!SaveMemory::IsSaveMemoryInitialized(slot_id)) { LOG_INFO(Lib_SaveData, "called without save memory initialized"); return Error::MEMORY_NOT_READY; } LOG_DEBUG(Lib_SaveData, "called"); - bool ok = SaveMemory::TriggerSave(); - if (!ok) { - return Error::BUSY_FOR_SAVING; - } + + SaveMemory::PersistMemory(slot_id); + const auto& save_path = SaveMemory::GetSaveDir(slot_id); + Backup::NewRequest(syncParam->userId, g_game_serial, save_path, + OrbisSaveDataEventType::SAVE_DATA_MEMORY_SYNC); + return Error::OK; } diff --git a/src/emulator.cpp b/src/emulator.cpp index 97215c06f..d873b3462 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -33,6 +33,7 @@ #include "core/libraries/ngs2/ngs2.h" #include "core/libraries/np_trophy/np_trophy.h" #include "core/libraries/rtc/rtc.h" +#include "core/libraries/save_data/save_backup.h" #include "core/linker.h" #include "core/memory.h" #include "emulator.h" @@ -271,7 +272,7 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector Date: Thu, 30 Jan 2025 00:09:11 -0800 Subject: [PATCH 172/455] sdl_window: Allow alternate face button keys on any system. (#2275) * sdl_window: Allow alternate face button keys on any system. * readme: Fix typo --- README.md | 55 ++++++++++++++++++++++++---------------------- src/sdl_window.cpp | 27 ++++++++--------------- 2 files changed, 38 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index fd40d2d63..89aed29b4 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,9 @@ For more information on how to test, debug and report issues with the emulator o # Keyboard mapping +> [!NOTE] +> Some keyboards may also require you to hold the Fn key to use the F\* keys. Mac users should use the Command key instead of Control, and need to use Command+F11 for full screen to avoid conflicting with system key bindings. + | Button | Function | |-------------|-------------| F10 | FPS Counter @@ -86,32 +89,32 @@ F12 | Trigger RenderDoc Capture > [!NOTE] > Xbox and DualShock controllers work out of the box. -| Controller button | Keyboard equivelant | Mac alternative | -|-------------|-------------|--------------| -LEFT AXIS UP | W | | -LEFT AXIS DOWN | S | | -LEFT AXIS LEFT | A | | -LEFT AXIS RIGHT | D | | -RIGHT AXIS UP | I | | -RIGHT AXIS DOWN | K | | -RIGHT AXIS LEFT | J | | -RIGHT AXIS RIGHT | L | | -TRIANGLE | Numpad 8 | C | -CIRCLE | Numpad 6 | B | -CROSS | Numpad 2 | N | -SQUARE | Numpad 4 | V | -PAD UP | UP | | -PAD DOWN | DOWN | | -PAD LEFT | LEFT | | -PAD RIGHT | RIGHT | | -OPTIONS | RETURN | | -BACK BUTTON / TOUCH PAD | SPACE | | -L1 | Q | | -R1 | U | | -L2 | E | | -R2 | O | | -L3 | X | | -R3 | M | | +| Controller button | Keyboard equivalent | +|-------------|-------------| +LEFT AXIS UP | W | +LEFT AXIS DOWN | S | +LEFT AXIS LEFT | A | +LEFT AXIS RIGHT | D | +RIGHT AXIS UP | I | +RIGHT AXIS DOWN | K | +RIGHT AXIS LEFT | J | +RIGHT AXIS RIGHT | L | +TRIANGLE | Numpad 8 or C | +CIRCLE | Numpad 6 or B | +CROSS | Numpad 2 or N | +SQUARE | Numpad 4 or V | +PAD UP | UP | +PAD DOWN | DOWN | +PAD LEFT | LEFT | +PAD RIGHT | RIGHT | +OPTIONS | RETURN | +BACK BUTTON / TOUCH PAD | SPACE | +L1 | Q | +R1 | U | +L2 | E | +R2 | O | +L3 | X | +R3 | M | # Main team diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index d1fe6bbab..9b7617925 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -382,20 +382,6 @@ void WindowSDL::OnResize() { } void WindowSDL::OnKeyPress(const SDL_Event* event) { -#ifdef __APPLE__ - // Use keys that are more friendly for keyboards without a keypad. - // Once there are key binding options this won't be necessary. - constexpr SDL_Keycode CrossKey = SDLK_N; - constexpr SDL_Keycode CircleKey = SDLK_B; - constexpr SDL_Keycode SquareKey = SDLK_V; - constexpr SDL_Keycode TriangleKey = SDLK_C; -#else - constexpr SDL_Keycode CrossKey = SDLK_KP_2; - constexpr SDL_Keycode CircleKey = SDLK_KP_6; - constexpr SDL_Keycode SquareKey = SDLK_KP_4; - constexpr SDL_Keycode TriangleKey = SDLK_KP_8; -#endif - auto button = OrbisPadButtonDataOffset::None; Input::Axis axis = Input::Axis::AxisMax; int axisvalue = 0; @@ -414,16 +400,21 @@ void WindowSDL::OnKeyPress(const SDL_Event* event) { case SDLK_RIGHT: button = OrbisPadButtonDataOffset::Right; break; - case TriangleKey: + // Provide alternatives for face buttons for users without a numpad. + case SDLK_KP_8: + case SDLK_C: button = OrbisPadButtonDataOffset::Triangle; break; - case CircleKey: + case SDLK_KP_6: + case SDLK_B: button = OrbisPadButtonDataOffset::Circle; break; - case CrossKey: + case SDLK_KP_2: + case SDLK_N: button = OrbisPadButtonDataOffset::Cross; break; - case SquareKey: + case SDLK_KP_4: + case SDLK_V: button = OrbisPadButtonDataOffset::Square; break; case SDLK_RETURN: From d8b411429638b48db375c03682fd1bcc3efdfd11 Mon Sep 17 00:00:00 2001 From: Bhaal42 Date: Thu, 30 Jan 2025 09:25:29 +0100 Subject: [PATCH 173/455] Patch 1 (#2278) * Update fr.ts Corrected some typos * Update fr.ts forgot plural --- src/qt_gui/translations/fr.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 0f87b087b..250b8f3c3 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -373,7 +373,7 @@ toolBar - Bare d'outils + Barre d'outils Game List @@ -489,7 +489,7 @@ Game successfully installed at %1 - Jeu installé avec succès à %1 + Jeu installé avec succès dans %1 File doesn't appear to be a valid PKG file @@ -554,7 +554,7 @@ Show Game Size In List - Afficher la taille du jeu dans la liste + Afficher la taille des jeux dans la liste Show Splash @@ -945,7 +945,7 @@ Serial: - Série: + Numéro de série: Version: @@ -1164,7 +1164,7 @@ Serial - Série + Numéro de série Compatibility @@ -1361,4 +1361,4 @@ TB - \ No newline at end of file + From 132a9d7d357727ab7e16e974647890434dfcd0d6 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 30 Jan 2025 01:38:34 -0800 Subject: [PATCH 174/455] externals: Update MoltenVK (#2280) Small fix for pipeline serialization from last change. --- externals/MoltenVK/MoltenVK | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/MoltenVK/MoltenVK b/externals/MoltenVK/MoltenVK index aba997657..0c090001c 160000 --- a/externals/MoltenVK/MoltenVK +++ b/externals/MoltenVK/MoltenVK @@ -1 +1 @@ -Subproject commit aba997657b94d6de1794ebad36ce5634341252c7 +Subproject commit 0c090001cb42997031cfe43914340e2639944972 From 3a163002d712ba9a22e2d0fac09302de6f324c61 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Thu, 30 Jan 2025 13:06:55 +0100 Subject: [PATCH 175/455] Update README.md (#2281) Lot of people seem to think that building is required to use shad, adding a little note in the README to redirect them to tabs where they can simply download it. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 89aed29b4..30efeb263 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,9 @@ This project began as a fun project. Given our limited free time, it may take so # Building +> [!IMPORTANT] +> If you want to use shadPS4 to play your games, you don't have to follow the build instructions, you can simply download the emulator from either the [**release tab**](https://github.com/shadps4-emu/shadPS4/releases) or the [**action tab**](https://github.com/shadps4-emu/shadPS4/actions). + ## Windows Check the build instructions for [**Windows**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/building-windows.md). From 19bbbf994c541e009fc88ab5366c8e21f27d8a49 Mon Sep 17 00:00:00 2001 From: Zaid Ismail <64991232+zaid-ismail031@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:09:50 +0200 Subject: [PATCH 176/455] Fix game title sorting bug from Issue #2260 (#2284) * Fix alphabetical sorting bug caused by case-sensitive string comparisons in GameListFrame. * Fix bug with incorrect use of std::tolower. * Fix clang-format error. --------- Co-authored-by: Zaid Ismail --- src/qt_gui/game_list_frame.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/qt_gui/game_list_frame.h b/src/qt_gui/game_list_frame.h index 8c6fcb1e2..90d021093 100644 --- a/src/qt_gui/game_list_frame.h +++ b/src/qt_gui/game_list_frame.h @@ -3,6 +3,9 @@ #pragma once +#include // std::transform +#include // std::tolower + #include #include #include @@ -65,8 +68,12 @@ public: static bool CompareStringsAscending(GameInfo a, GameInfo b, int columnIndex) { switch (columnIndex) { - case 1: - return a.name < b.name; + case 1: { + std::string name_a = a.name, name_b = b.name; + std::transform(name_a.begin(), name_a.end(), name_a.begin(), ::tolower); + std::transform(name_b.begin(), name_b.end(), name_b.begin(), ::tolower); + return name_a < name_b; + } case 2: return a.compatibility.status < b.compatibility.status; case 3: @@ -90,8 +97,12 @@ public: static bool CompareStringsDescending(GameInfo a, GameInfo b, int columnIndex) { switch (columnIndex) { - case 1: - return a.name > b.name; + case 1: { + std::string name_a = a.name, name_b = b.name; + std::transform(name_a.begin(), name_a.end(), name_a.begin(), ::tolower); + std::transform(name_b.begin(), name_b.end(), name_b.begin(), ::tolower); + return name_a > name_b; + } case 2: return a.compatibility.status > b.compatibility.status; case 3: From c89c7e8fed8b296204a0175e0414b4c867a84a1c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 30 Jan 2025 09:17:03 -0800 Subject: [PATCH 177/455] cpu_patches: Always use AVX for certain patches. (#2274) --- src/core/cpu_patches.cpp | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/src/core/cpu_patches.cpp b/src/core/cpu_patches.cpp index b812e5444..57d528a81 100644 --- a/src/core/cpu_patches.cpp +++ b/src/core/cpu_patches.cpp @@ -30,16 +30,6 @@ using namespace Xbyak::util; -#define MAYBE_AVX(OPCODE, ...) \ - [&] { \ - Cpu cpu; \ - if (cpu.has(Cpu::tAVX)) { \ - c.v##OPCODE(__VA_ARGS__); \ - } else { \ - c.OPCODE(__VA_ARGS__); \ - } \ - }() - namespace Core { static Xbyak::Reg ZydisToXbyakRegister(const ZydisRegister reg) { @@ -643,7 +633,7 @@ static void GenerateEXTRQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenera ASSERT_MSG(length + index <= 64, "length + index must be less than or equal to 64."); // Get lower qword from xmm register - MAYBE_AVX(movq, scratch1, xmm_dst); + c.vmovq(scratch1, xmm_dst); if (index != 0) { c.shr(scratch1, index); @@ -656,7 +646,7 @@ static void GenerateEXTRQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenera // Writeback to xmm register, extrq instruction says top 64-bits are undefined so we don't // care to preserve them - MAYBE_AVX(movq, xmm_dst, scratch1); + c.vmovq(xmm_dst, scratch1); c.pop(scratch2); c.pop(scratch1); @@ -690,7 +680,7 @@ static void GenerateEXTRQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenera c.push(mask); // Construct the mask out of the length that resides in bottom 6 bits of source xmm - MAYBE_AVX(movq, scratch1, xmm_src); + c.vmovq(scratch1, xmm_src); c.mov(scratch2, scratch1); c.and_(scratch2, 0x3F); c.jz(length_zero); @@ -711,10 +701,10 @@ static void GenerateEXTRQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenera c.and_(scratch1, 0x3F); c.mov(scratch2, scratch1); // cl now contains the shift amount - MAYBE_AVX(movq, scratch1, xmm_dst); + c.vmovq(scratch1, xmm_dst); c.shr(scratch1, cl); c.and_(scratch1, mask); - MAYBE_AVX(movq, xmm_dst, scratch1); + c.vmovq(xmm_dst, scratch1); c.pop(mask); c.pop(scratch2); @@ -765,8 +755,8 @@ static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGene ASSERT_MSG(length + index <= 64, "length + index must be less than or equal to 64."); - MAYBE_AVX(movq, scratch1, xmm_src); - MAYBE_AVX(movq, scratch2, xmm_dst); + c.vmovq(scratch1, xmm_src); + c.vmovq(scratch2, xmm_dst); c.mov(mask, mask_value); // src &= mask @@ -784,12 +774,7 @@ static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGene c.or_(scratch2, scratch1); // Insert scratch2 into low 64 bits of dst, upper 64 bits are unaffected - Cpu cpu; - if (cpu.has(Cpu::tAVX)) { - c.vpinsrq(xmm_dst, xmm_dst, scratch2, 0); - } else { - c.pinsrq(xmm_dst, scratch2, 0); - } + c.vpinsrq(xmm_dst, xmm_dst, scratch2, 0); c.pop(mask); c.pop(scratch2); @@ -816,7 +801,7 @@ static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGene c.push(mask); // Get upper 64 bits of src and copy it to mask and index - MAYBE_AVX(pextrq, index, xmm_src, 1); + c.vpextrq(index, xmm_src, 1); c.mov(mask, index); // When length is 0, set it to 64 @@ -839,7 +824,7 @@ static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGene c.and_(index, 0x3F); // src &= mask - MAYBE_AVX(movq, scratch1, xmm_src); + c.vmovq(scratch1, xmm_src); c.and_(scratch1, mask); // mask = ~(mask << index) @@ -851,12 +836,12 @@ static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGene c.shl(scratch1, cl); // dst = (dst & mask) | src - MAYBE_AVX(movq, scratch2, xmm_dst); + c.vmovq(scratch2, xmm_dst); c.and_(scratch2, mask); c.or_(scratch2, scratch1); // Upper 64 bits are undefined in insertq - MAYBE_AVX(movq, xmm_dst, scratch2); + c.vmovq(xmm_dst, scratch2); c.pop(mask); c.pop(index); From e805b9752097a5292a8c41ca7a5a6c27934a1b94 Mon Sep 17 00:00:00 2001 From: tomboylover93 <95257311+tomboylover93@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:34:31 -0300 Subject: [PATCH 178/455] Add Vulkan debug options to the Debug tab (#2254) Co-authored-by: DanielSvoboda --- documents/building-linux.md | 2 +- src/common/config.cpp | 24 +- src/common/config.h | 9 +- src/emulator.cpp | 6 +- src/imgui/renderer/imgui_core.cpp | 4 +- src/imgui/renderer/texture_manager.cpp | 2 +- src/qt_gui/settings_dialog.cpp | 31 +- src/qt_gui/settings_dialog.ui | 286 ++++++++++++------ src/qt_gui/translations/ar.ts | 44 +++ src/qt_gui/translations/da_DK.ts | 44 +++ src/qt_gui/translations/de.ts | 44 +++ src/qt_gui/translations/el.ts | 44 +++ src/qt_gui/translations/en.ts | 47 ++- src/qt_gui/translations/es_ES.ts | 44 +++ src/qt_gui/translations/fa_IR.ts | 44 +++ src/qt_gui/translations/fi.ts | 44 +++ src/qt_gui/translations/fr.ts | 44 +++ src/qt_gui/translations/hu_HU.ts | 44 +++ src/qt_gui/translations/id.ts | 44 +++ src/qt_gui/translations/it.ts | 44 +++ src/qt_gui/translations/ja_JP.ts | 44 +++ src/qt_gui/translations/ko_KR.ts | 44 +++ src/qt_gui/translations/lt_LT.ts | 44 +++ src/qt_gui/translations/nb.ts | 44 +++ src/qt_gui/translations/nl.ts | 44 +++ src/qt_gui/translations/pl_PL.ts | 44 +++ src/qt_gui/translations/pt_BR.ts | 82 +++-- src/qt_gui/translations/ro_RO.ts | 44 +++ src/qt_gui/translations/ru_RU.ts | 44 +++ src/qt_gui/translations/sq.ts | 44 +++ src/qt_gui/translations/sv.ts | 44 +++ src/qt_gui/translations/tr_TR.ts | 44 +++ src/qt_gui/translations/uk_UA.ts | 44 +++ src/qt_gui/translations/vi_VN.ts | 44 +++ src/qt_gui/translations/zh_CN.ts | 44 +++ src/qt_gui/translations/zh_TW.ts | 44 +++ src/video_core/renderer_vulkan/vk_platform.h | 4 +- .../renderer_vulkan/vk_presenter.cpp | 14 +- .../renderer_vulkan/vk_rasterizer.cpp | 16 +- 39 files changed, 1518 insertions(+), 153 deletions(-) diff --git a/documents/building-linux.md b/documents/building-linux.md index 4aa66aac6..d9ae2e54c 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -29,7 +29,7 @@ sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-co sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers ``` -**Note** : The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion. +**Note**: The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion. #### OpenSUSE diff --git a/src/common/config.cpp b/src/common/config.cpp index a57b6d35c..70b062951 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -267,18 +267,28 @@ bool vkValidationGpuEnabled() { return vkValidationGpu; } -bool vkCrashDiagnosticEnabled() { +bool getVkCrashDiagnosticEnabled() { return vkCrashDiagnostic; } -bool vkHostMarkersEnabled() { - // Forced on when crash diagnostic enabled. - return vkHostMarkers || vkCrashDiagnostic; +bool getVkHostMarkersEnabled() { + return vkHostMarkers; } -bool vkGuestMarkersEnabled() { - // Forced on when crash diagnostic enabled. - return vkGuestMarkers || vkCrashDiagnostic; +bool getVkGuestMarkersEnabled() { + return vkGuestMarkers; +} + +void setVkCrashDiagnosticEnabled(bool enable) { + vkCrashDiagnostic = enable; +} + +void setVkHostMarkersEnabled(bool enable) { + vkHostMarkers = enable; +} + +void setVkGuestMarkersEnabled(bool enable) { + vkGuestMarkers = enable; } bool getSeparateUpdateEnabled() { diff --git a/src/common/config.h b/src/common/config.h index 15937606e..356cf77fc 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -106,9 +106,12 @@ void setRdocEnabled(bool enable); bool vkValidationEnabled(); bool vkValidationSyncEnabled(); bool vkValidationGpuEnabled(); -bool vkCrashDiagnosticEnabled(); -bool vkHostMarkersEnabled(); -bool vkGuestMarkersEnabled(); +bool getVkCrashDiagnosticEnabled(); +bool getVkHostMarkersEnabled(); +bool getVkGuestMarkersEnabled(); +void setVkCrashDiagnosticEnabled(bool enable); +void setVkHostMarkersEnabled(bool enable); +void setVkGuestMarkersEnabled(bool enable); // Gui void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h); diff --git a/src/emulator.cpp b/src/emulator.cpp index d873b3462..81c4d814d 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -67,9 +67,9 @@ Emulator::Emulator() { LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled()); LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled()); LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled()); - LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::vkCrashDiagnosticEnabled()); - LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::vkHostMarkersEnabled()); - LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::vkGuestMarkersEnabled()); + LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::getVkCrashDiagnosticEnabled()); + LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::getVkHostMarkersEnabled()); + LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::getVkGuestMarkersEnabled()); LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled()); // Create stdin/stdout/stderr diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index 26253822c..d9530dd70 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -208,7 +208,7 @@ void Render(const vk::CommandBuffer& cmdbuf, const vk::ImageView& image_view, return; } - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = "ImGui Render", }); @@ -233,7 +233,7 @@ void Render(const vk::CommandBuffer& cmdbuf, const vk::ImageView& image_view, cmdbuf.beginRendering(render_info); Vulkan::RenderDrawData(*draw_data, cmdbuf); cmdbuf.endRendering(); - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { cmdbuf.endDebugUtilsLabelEXT(); } } diff --git a/src/imgui/renderer/texture_manager.cpp b/src/imgui/renderer/texture_manager.cpp index d7516a3a5..e217cd130 100644 --- a/src/imgui/renderer/texture_manager.cpp +++ b/src/imgui/renderer/texture_manager.cpp @@ -152,7 +152,7 @@ void WorkerLoop() { g_job_list.pop_front(); g_job_list_mtx.unlock(); - if (Config::vkCrashDiagnosticEnabled()) { + if (Config::getVkCrashDiagnosticEnabled()) { // FIXME: Crash diagnostic hangs when building the command buffer here continue; } diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index b41fde745..802325126 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -285,6 +285,11 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->vkValidationCheckBox->installEventFilter(this); ui->vkSyncValidationCheckBox->installEventFilter(this); ui->rdocCheckBox->installEventFilter(this); + ui->crashDiagnosticsCheckBox->installEventFilter(this); + ui->guestMarkersCheckBox->installEventFilter(this); + ui->hostMarkersCheckBox->installEventFilter(this); + ui->collectShaderCheckBox->installEventFilter(this); + ui->copyGPUBuffersCheckBox->installEventFilter(this); } } @@ -360,6 +365,15 @@ void SettingsDialog::LoadValuesFromConfig() { ui->vkSyncValidationCheckBox->setChecked( toml::find_or(data, "Vulkan", "validation_sync", false)); ui->rdocCheckBox->setChecked(toml::find_or(data, "Vulkan", "rdocEnable", false)); + ui->crashDiagnosticsCheckBox->setChecked( + toml::find_or(data, "Vulkan", "crashDiagnostic", false)); + ui->guestMarkersCheckBox->setChecked( + toml::find_or(data, "Vulkan", "guestMarkers", false)); + ui->hostMarkersCheckBox->setChecked(toml::find_or(data, "Vulkan", "hostMarkers", false)); + ui->copyGPUBuffersCheckBox->setChecked( + toml::find_or(data, "GPU", "copyGPUBuffers", false)); + ui->collectShaderCheckBox->setChecked( + toml::find_or(data, "Debug", "CollectShader", false)); ui->enableCompatibilityCheckBox->setChecked( toml::find_or(data, "General", "compatibilityEnabled", false)); ui->checkCompatibilityOnStartupCheckBox->setChecked( @@ -380,7 +394,7 @@ void SettingsDialog::LoadValuesFromConfig() { std::string chooseHomeTab = toml::find_or(data, "General", "chooseHomeTab", ""); ui->chooseHomeTabComboBox->setCurrentText(QString::fromStdString(chooseHomeTab)); - QStringList tabNames = {tr("General"), tr("Gui"), tr("Graphics"), tr("User"), + QStringList tabNames = {tr("General"), tr("GUI"), tr("Graphics"), tr("User"), tr("Input"), tr("Paths"), tr("Debug")}; QString chooseHomeTabQString = QString::fromStdString(chooseHomeTab); int indexTab = tabNames.indexOf(chooseHomeTabQString); @@ -551,6 +565,16 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { text = tr("vkSyncValidationCheckBox"); } else if (elementName == "rdocCheckBox") { text = tr("rdocCheckBox"); + } else if (elementName == "crashDiagnosticsCheckBox") { + text = tr("crashDiagnosticsCheckBox"); + } else if (elementName == "guestMarkersCheckBox") { + text = tr("guestMarkersCheckBox"); + } else if (elementName == "hostMarkersCheckBox") { + text = tr("hostMarkersCheckBox"); + } else if (elementName == "copyGPUBuffersCheckBox") { + text = tr("copyGPUBuffersCheckBox"); + } else if (elementName == "collectShaderCheckBox") { + text = tr("collectShaderCheckBox"); } ui->descriptionText->setText(text.replace("\\n", "\n")); @@ -604,6 +628,11 @@ void SettingsDialog::UpdateSettings() { Config::setVkValidation(ui->vkValidationCheckBox->isChecked()); Config::setVkSyncValidation(ui->vkSyncValidationCheckBox->isChecked()); Config::setRdocEnabled(ui->rdocCheckBox->isChecked()); + Config::setVkHostMarkersEnabled(ui->hostMarkersCheckBox->isChecked()); + Config::setVkGuestMarkersEnabled(ui->guestMarkersCheckBox->isChecked()); + Config::setVkCrashDiagnosticEnabled(ui->crashDiagnosticsCheckBox->isChecked()); + Config::setCollectShaderForDebug(ui->collectShaderCheckBox->isChecked()); + Config::setCopyGPUCmdBuffers(ui->copyGPUBuffersCheckBox->isChecked()); Config::setAutoUpdate(ui->updateCheckBox->isChecked()); Config::setUpdateChannel(ui->updateComboBox->currentText().toStdString()); Config::setChooseHomeTab(ui->chooseHomeTabComboBox->currentText().toStdString()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 5da6a8198..4e7440af5 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -12,7 +12,7 @@ 0 0 970 - 600 + 750 @@ -74,7 +74,7 @@ 0 0 946 - 386 + 536 @@ -476,7 +476,7 @@ true - Gui + GUI @@ -484,7 +484,7 @@ 0 0 946 - 386 + 536 @@ -497,14 +497,14 @@ 0 - + 0 - + 0 0 @@ -530,7 +530,7 @@ Default tab when opening settings - + @@ -546,7 +546,7 @@ - Gui + GUI @@ -594,6 +594,18 @@ 0 + + + 0 + 100 + + + + + 16777215 + 16777215 + + 11 @@ -605,62 +617,16 @@ false - + Title Music false - - - - 10 - 80 - 416 - 29 - - - - - 0 - 0 - - - - Set the volume of the background music. - - - 100 - - - 10 - - - 20 - - - 50 - - - Qt::Orientation::Horizontal - - - false - - - false - - - QSlider::TickPosition::NoTicks - - - 10 - - - 10 - 22 + 9 + 30 416 26 @@ -675,45 +641,119 @@ Play title music - + - 10 - 54 - 416 - 20 + 0 + 50 + 431 + 47 - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Volume - + + + 9 + + + 9 + + + 9 + + + 9 + + + 9 + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Volume + + + + + + + + 0 + 0 + + + + Set the volume of the background music. + + + 100 + + + 10 + + + 20 + + + 50 + + + Qt::Orientation::Horizontal + + + false + + + false + + + QSlider::TickPosition::NoTicks + + + 10 + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + - + 6 - 210 + 0 @@ -790,6 +830,19 @@ + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + @@ -810,7 +863,7 @@ 0 0 946 - 386 + 536 @@ -1054,10 +1107,10 @@ 0 0 946 - 386 + 536 - + @@ -1198,7 +1251,7 @@ 0 0 946 - 386 + 536 @@ -1482,7 +1535,7 @@ 0 0 946 - 386 + 536 @@ -1572,10 +1625,10 @@ 0 0 946 - 386 + 536 - + @@ -1585,7 +1638,7 @@ 0 - + @@ -1728,20 +1781,57 @@ - - - Qt::Orientation::Vertical + + + + 0 + 0 + - - QSizePolicy::Policy::MinimumExpanding + + Advanced - - - 0 - 0 - + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop - + + + + + Enable Crash Diagnostics + + + + + + + Collect Shaders + + + + + + + Copy GPU Buffers + + + + + + + Host Debug Markers + + + + + + + Guest Debug Markers + + + + + diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index f7b93028a..617753ab8 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging RenderDoc تمكين تصحيح أخطاء + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update تحديث @@ -720,6 +740,10 @@ GUI Settings إعدادات الواجهة + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. +
CheatsPatches diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 61d2f68bf..abde6ff72 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Opdatering @@ -720,6 +740,10 @@ GUI Settings GUI-Indstillinger + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 9d99a7048..b8fa22881 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging RenderDoc-Debugging aktivieren + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Aktualisieren @@ -720,6 +740,10 @@ GUI Settings GUI-Einstellungen + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 66c3c07cd..828b99248 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Ενημέρωση @@ -720,6 +740,10 @@ GUI Settings Ρυθμίσεις GUI + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 8b6c3c69f..7ad2f15c0 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -700,6 +700,27 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + Update Update @@ -720,6 +741,10 @@ GUI Settings GUI Settings + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +953,26 @@ rdocCheckBox Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + saveDataBox Save Data Path:\nThe folder where game save data will be saved. @@ -1369,4 +1414,4 @@ TB - \ No newline at end of file + diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 8f7a09b5d..8af34c042 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Habilitar depuración de RenderDoc + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Actualización @@ -720,6 +740,10 @@ GUI Settings Configuraciones de la Interfaz + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. +
CheatsPatches diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 043d782c2..16f6533b6 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update به‌روزرسانی @@ -720,6 +740,10 @@ GUI Settings تنظیمات رابط کاربری + + Title Music + Title Music + Disable Trophy Pop-ups غیرفعال کردن نمایش جوایز @@ -928,6 +952,26 @@ rdocCheckBox Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 86f6a6d3c..7269b4125 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Ota Käyttöön RenderDoc Virheenkorjaus + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Päivitys @@ -720,6 +740,10 @@ GUI Settings GUI-asetukset + + Title Music + Title Music + Disable Trophy Pop-ups Poista Trophy Pop-upit Käytöstä @@ -928,6 +952,26 @@ rdocCheckBox Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 250b8f3c3..b93af15a6 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Activer le débogage RenderDoc + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Mise à jour @@ -720,6 +740,10 @@ GUI Settings Paramètres de l'interface + + Title Music + Title Music + Disable Trophy Pop-ups Désactiver les notifications de trophées @@ -928,6 +952,26 @@ rdocCheckBox Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index fe71e8120..98491aa87 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging RenderDoc Debugolás Engedélyezése + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Frissítés @@ -720,6 +740,10 @@ GUI Settings GUI Beállítások + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index acfde43a7..931244209 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Pembaruan @@ -720,6 +740,10 @@ GUI Settings Pengaturan GUI + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 93c6233a6..384272137 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Abilita RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Aggiornamento @@ -720,6 +740,10 @@ GUI Settings Impostazioni GUI + + Title Music + Title Music + Disable Trophy Pop-ups Disabilita Notifica Trofei @@ -928,6 +952,26 @@ rdocCheckBox Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 921af52bb..2aae35987 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging RenderDocデバッグを有効にする + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update 更新 @@ -720,6 +740,10 @@ GUI Settings GUI設定 + + Title Music + Title Music + Disable Trophy Pop-ups トロフィーのポップアップを無効化 @@ -928,6 +952,26 @@ rdocCheckBox RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 2491959a6..56e891214 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Update @@ -720,6 +740,10 @@ GUI Settings GUI Settings + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 23a52e948..c73a43917 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Atnaujinimas @@ -720,6 +740,10 @@ GUI Settings GUI Nustatymai + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index 0b7d2699a..3e6f5fedd 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Aktiver RenderDoc feilretting + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Oppdatering @@ -720,6 +740,10 @@ GUI Settings Grensesnitt-innstillinger + + Title Music + Title Music + Disable Trophy Pop-ups Deaktiver trofé hurtigmeny @@ -928,6 +952,26 @@ rdocCheckBox Aktiver RenderDoc feilsøking:\nHvis aktivert, vil etterligneren gi kompatibilitet med Renderdoc for å tillate opptak og analyse av det nåværende gjengitte bildet. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 1dabda8b4..95ac19ef3 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Bijwerken @@ -720,6 +740,10 @@ GUI Settings GUI-Instellingen + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 85eb63bfb..89f165de2 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Włącz debugowanie RenderDoc + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Aktualizacja @@ -720,6 +740,10 @@ GUI Settings Ustawienia Interfejsu + + Title Music + Title Music + Disable Trophy Pop-ups Wyłącz wyskakujące okienka trofeów @@ -928,6 +952,26 @@ rdocCheckBox Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index fde1d3b63..0bce16dcf 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -538,7 +538,7 @@ Enable Fullscreen - Ativar Tela Cheia + Habilitar Tela Cheia Fullscreen Mode @@ -566,7 +566,7 @@ Enable Discord Rich Presence - Ativar Discord Rich Presence + Habilitar Discord Rich Presence Username @@ -574,7 +574,7 @@ Trophy Key - Trophy Key + Chave de Troféu Trophy @@ -582,7 +582,7 @@ Logger - Registro + Registro-Log Log Type @@ -594,7 +594,7 @@ Open Log Location - Abrir local do log + Abrir local do registro Input @@ -658,11 +658,11 @@ Enable Shaders Dumping - Ativar Dumping de Shaders + Habilitar Dumping de Shaders Enable NULL GPU - Ativar GPU NULA + Habilitar GPU NULA Paths @@ -686,19 +686,39 @@ Enable Debug Dumping - Ativar Depuração de Dumping + Habilitar Depuração de Dumping Enable Vulkan Validation Layers - Ativar Camadas de Validação do Vulkan + Habilitar Camadas de Validação do Vulkan Enable Vulkan Synchronization Validation - Ativar Validação de Sincronização do Vulkan + Habilitar Validação de Sincronização do Vulkan Enable RenderDoc Debugging - Ativar Depuração por RenderDoc + Habilitar Depuração do RenderDoc + + + Enable Crash Diagnostics + Habilitar Diagnóstico de Falhas + + + Collect Shaders + Coletar Shaders + + + Copy GPU Buffers + Copiar Buffers de GPU + + + Host Debug Markers + Marcadores de Depuração do Host + + + Guest Debug Markers + Marcadores de Depuração do Convidado Update @@ -720,6 +740,10 @@ GUI Settings Configurações da Interface + + Title Music + Música no Menu + Disable Trophy Pop-ups Desabilitar Pop-ups dos Troféus @@ -782,7 +806,7 @@ fullscreenCheckBox - Ativar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. + Habilitar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. separateUpdatesCheckBox @@ -798,7 +822,7 @@ discordRPCCheckbox - Ativar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. + Habilitar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. userName @@ -898,11 +922,11 @@ dumpShadersCheckBox - Ativar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. + Habilitar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. nullGpuCheckBox - Ativar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. + Habilitar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. gameFoldersBox @@ -918,19 +942,39 @@ debugDump - Ativar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. + Habilitar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. vkValidationCheckBox - Ativar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + Habilitar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. vkSyncValidationCheckBox - Ativar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + Habilitar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. rdocCheckBox - Ativar depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. + Habilitar Depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. + + + collectShaderCheckBox + Coletar Shaders:\nVocê precisa habilitar isso para editar shaders com o menu de depuração (Ctrl + F10). + + + crashDiagnosticsCheckBox + Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depurar erros de 'Device lost'. Se você tiver isso habilitado, você deve habilitar os Marcadores de Depuração de Host e de Convidado.\nNão funciona em GPUs da Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o SDK do Vulkan para que isso funcione. + + + copyGPUBuffersCheckBox + Copiar Buffers de GPU:\nContorna condições de corrida envolvendo envios de GPU.\nPode ou não ajudar com travamentos do PM4 tipo 0. + + + hostMarkersCheckBox + Marcadores de Depuração de Host:\nInsere informações do lado do emulador, como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, você deve habilitar o "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. + + + guestMarkersCheckBox + Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, você deve habilitar "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 9791a7682..f60de9823 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Actualizare @@ -720,6 +740,10 @@ GUI Settings Setări GUI + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 0fddb1e7f..270396a6d 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Включить отладку RenderDoc + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Обновление @@ -720,6 +740,10 @@ GUI Settings Интерфейс + + Title Music + Title Music + Disable Trophy Pop-ups Отключить уведомления о трофеях @@ -928,6 +952,26 @@ rdocCheckBox Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с Renderdoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 15c18d2f6..1d37fa9c3 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Aktivizo Korrigjimin RenderDoc + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Përditëso @@ -720,6 +740,10 @@ GUI Settings Cilësimet e GUI-së + + Title Music + Title Music + Disable Trophy Pop-ups Çaktivizo njoftimet për Trofetë @@ -928,6 +952,26 @@ rdocCheckBox Aktivizo korrigjimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e pamjes të pasqyruar në moment. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index e17944f12..c5fbce991 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1188,6 +1188,26 @@ Enable RenderDoc Debugging Aktivera RenderDoc-felsökning + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Uppdatera @@ -1208,6 +1228,10 @@ GUI Settings Gränssnittsinställningar + + Title Music + Title Music + Disable Trophy Pop-ups Inaktivera popup för troféer @@ -1408,6 +1432,26 @@ rdocCheckBox Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Release Release diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index a2368bfee..12794e088 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging RenderDoc Hata Ayıklamayı Etkinleştir + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Güncelle @@ -720,6 +740,10 @@ GUI Settings GUI Ayarları + + Title Music + Title Music + Disable Trophy Pop-ups Kupa Açılır Pencerelerini Devre Dışı Bırak @@ -928,6 +952,26 @@ rdocCheckBox RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 720ad5b99..e80d363d3 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Увімкнути налагодження RenderDoc + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Оновлення @@ -720,6 +740,10 @@ GUI Settings Інтерфейс + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Увімкнути налагодження RenderDoc:\nЯкщо увімкнено, емулятор забезпечить сумісність із Renderdoc, даючи змогу захоплювати й аналізувати поточні кадри під час рендерингу. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index a81630fad..32841af81 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update Cập nhật @@ -720,6 +740,10 @@ GUI Settings Cài đặt GUI + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 16ae03f94..00f4337c0 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging 启用 RenderDoc 调试 + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update 更新 @@ -720,6 +740,10 @@ GUI Settings 界面设置 + + Title Music + Title Music + Disable Trophy Pop-ups 禁止弹出奖杯 @@ -928,6 +952,26 @@ rdocCheckBox 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + saveDataBox 存档数据路径:\n保存游戏存档数据的目录。 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 9f6758797..c18e173e4 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -700,6 +700,26 @@ Enable RenderDoc Debugging Enable RenderDoc Debugging + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + Update 更新 @@ -720,6 +740,10 @@ GUI Settings 介面設置 + + Title Music + Title Music + Disable Trophy Pop-ups Disable Trophy Pop-ups @@ -928,6 +952,26 @@ rdocCheckBox 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + CheatsPatches diff --git a/src/video_core/renderer_vulkan/vk_platform.h b/src/video_core/renderer_vulkan/vk_platform.h index d05d12997..4e9587e46 100644 --- a/src/video_core/renderer_vulkan/vk_platform.h +++ b/src/video_core/renderer_vulkan/vk_platform.h @@ -33,7 +33,7 @@ concept VulkanHandleType = vk::isVulkanHandleType::value; template void SetObjectName(vk::Device device, const HandleType& handle, std::string_view debug_name) { - if (!Config::vkHostMarkersEnabled()) { + if (!Config::getVkHostMarkersEnabled()) { return; } const vk::DebugUtilsObjectNameInfoEXT name_info = { @@ -50,7 +50,7 @@ void SetObjectName(vk::Device device, const HandleType& handle, std::string_view template void SetObjectName(vk::Device device, const HandleType& handle, const char* format, const Args&... args) { - if (!Config::vkHostMarkersEnabled()) { + if (!Config::getVkHostMarkersEnabled()) { return; } const std::string debug_name = fmt::vformat(format, fmt::make_format_args(args...)); diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 35ab4318a..c2be1c3e8 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -294,7 +294,7 @@ void Presenter::CreatePostProcessPipeline() { Presenter::Presenter(Frontend::WindowSDL& window_, AmdGpu::Liverpool* liverpool_) : window{window_}, liverpool{liverpool_}, instance{window, Config::getGpuId(), Config::vkValidationEnabled(), - Config::vkCrashDiagnosticEnabled()}, + Config::getVkCrashDiagnosticEnabled()}, draw_scheduler{instance}, present_scheduler{instance}, flip_scheduler{instance}, swapchain{instance, window}, rasterizer{std::make_unique(instance, draw_scheduler, liverpool)}, @@ -467,7 +467,7 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { draw_scheduler.EndRendering(); const auto cmdbuf = draw_scheduler.CommandBuffer(); - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = "ShowSplash", }); @@ -541,7 +541,7 @@ bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { .pImageMemoryBarriers = &post_barrier, }); - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { cmdbuf.endDebugUtilsLabelEXT(); } @@ -573,7 +573,7 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) auto& scheduler = is_eop ? draw_scheduler : flip_scheduler; scheduler.EndRendering(); const auto cmdbuf = scheduler.CommandBuffer(); - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { const auto label = fmt::format("PrepareFrameInternal:{}", image_id.index); cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = label.c_str(), @@ -704,7 +704,7 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) .pImageMemoryBarriers = &post_barrier, }); - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { cmdbuf.endDebugUtilsLabelEXT(); } @@ -755,7 +755,7 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { auto& scheduler = present_scheduler; const auto cmdbuf = scheduler.CommandBuffer(); - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = "Present", }); @@ -857,7 +857,7 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { } } - if (Config::vkHostMarkersEnabled()) { + if (Config::getVkHostMarkersEnabled()) { cmdbuf.endDebugUtilsLabelEXT(); } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 7c77f2519..fde87fcfb 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1239,8 +1239,8 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) { } void Rasterizer::ScopeMarkerBegin(const std::string_view& str, bool from_guest) { - if ((from_guest && !Config::vkGuestMarkersEnabled()) || - (!from_guest && !Config::vkHostMarkersEnabled())) { + if ((from_guest && !Config::getVkGuestMarkersEnabled()) || + (!from_guest && !Config::getVkHostMarkersEnabled())) { return; } const auto cmdbuf = scheduler.CommandBuffer(); @@ -1250,8 +1250,8 @@ void Rasterizer::ScopeMarkerBegin(const std::string_view& str, bool from_guest) } void Rasterizer::ScopeMarkerEnd(bool from_guest) { - if ((from_guest && !Config::vkGuestMarkersEnabled()) || - (!from_guest && !Config::vkHostMarkersEnabled())) { + if ((from_guest && !Config::getVkGuestMarkersEnabled()) || + (!from_guest && !Config::getVkHostMarkersEnabled())) { return; } const auto cmdbuf = scheduler.CommandBuffer(); @@ -1259,8 +1259,8 @@ void Rasterizer::ScopeMarkerEnd(bool from_guest) { } void Rasterizer::ScopedMarkerInsert(const std::string_view& str, bool from_guest) { - if ((from_guest && !Config::vkGuestMarkersEnabled()) || - (!from_guest && !Config::vkHostMarkersEnabled())) { + if ((from_guest && !Config::getVkGuestMarkersEnabled()) || + (!from_guest && !Config::getVkHostMarkersEnabled())) { return; } const auto cmdbuf = scheduler.CommandBuffer(); @@ -1271,8 +1271,8 @@ void Rasterizer::ScopedMarkerInsert(const std::string_view& str, bool from_guest void Rasterizer::ScopedMarkerInsertColor(const std::string_view& str, const u32 color, bool from_guest) { - if ((from_guest && !Config::vkGuestMarkersEnabled()) || - (!from_guest && !Config::vkHostMarkersEnabled())) { + if ((from_guest && !Config::getVkGuestMarkersEnabled()) || + (!from_guest && !Config::getVkHostMarkersEnabled())) { return; } const auto cmdbuf = scheduler.CommandBuffer(); From ad5bd91a13ec891395efdacfbc00cd78c2a58ea6 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Thu, 30 Jan 2025 15:34:42 -0300 Subject: [PATCH 179/455] Fix game title sorting (#2286) * Fix game title sorting * fix * fix * fix --- src/qt_gui/game_list_frame.cpp | 9 +++++++-- src/qt_gui/game_list_frame.h | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index 9753f511b..8255c0daf 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -69,7 +69,7 @@ GameListFrame::GameListFrame(std::shared_ptr game_info_get, ListSortedAsc = true; } this->clearContents(); - PopulateGameList(); + PopulateGameList(false); }); connect(this, &QTableWidget::customContextMenuRequested, this, [=, this](const QPoint& pos) { @@ -103,7 +103,7 @@ void GameListFrame::PlayBackgroundMusic(QTableWidgetItem* item) { BackgroundMusicPlayer::getInstance().playMusic(snd0path); } -void GameListFrame::PopulateGameList() { +void GameListFrame::PopulateGameList(bool isInitialPopulation) { // Do not show status column if it is not enabled this->setColumnHidden(2, !Config::getCompatibilityEnabled()); this->setColumnHidden(6, !Config::GetLoadGameSizeEnabled()); @@ -111,6 +111,11 @@ void GameListFrame::PopulateGameList() { this->setRowCount(m_game_info->m_games.size()); ResizeIcons(icon_size); + if (isInitialPopulation) { + SortNameAscending(1); // Column 1 = Name + ResizeIcons(icon_size); + } + for (int i = 0; i < m_game_info->m_games.size(); i++) { SetTableItem(i, 1, QString::fromStdString(m_game_info->m_games[i].name)); SetTableItem(i, 3, QString::fromStdString(m_game_info->m_games[i].serial)); diff --git a/src/qt_gui/game_list_frame.h b/src/qt_gui/game_list_frame.h index 90d021093..7e37c4ea7 100644 --- a/src/qt_gui/game_list_frame.h +++ b/src/qt_gui/game_list_frame.h @@ -46,7 +46,7 @@ private: bool ListSortedAsc = true; public: - void PopulateGameList(); + void PopulateGameList(bool isInitialPopulation = true); void ResizeIcons(int iconSize); QImage backgroundImage; From 52df7f6fe5bbb9a599c3fbc9e9de27a033c65426 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Thu, 30 Jan 2025 21:18:45 +0100 Subject: [PATCH 180/455] add french tl (#2289) --- src/qt_gui/translations/fr.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index b93af15a6..f2ea4fcc7 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -702,23 +702,23 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Activer le diagnostic de crash Collect Shaders - Collect Shaders + Collecter les shaders Copy GPU Buffers - Copy GPU Buffers + Copier la mémoire tampon GPU Host Debug Markers - Host Debug Markers + Marqueur de débogage hôte Guest Debug Markers - Guest Debug Markers + Marqueur de débogage invité Update @@ -954,30 +954,30 @@ collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collecter les Shaders:\nVous devez activer cette option pour modifier les shaders avec le menu de débogage (Ctrl + F10). crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer le Vulkan Validation Layers ainsi que le Vulkan SDK pour que cela fonctionne. copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copier la mémoire tampon GPU:\nContourne les conditions de course impliquant des soumissions GPU.\nPeut aider ou non en cas de crash PM4 type 0. hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marqueur de débogage hôte:\nInsère des informations côté émulateur telles que des marqueurs pour des commandes spécifiques AMDGPU autour des commandes Vulkan, ainsi que donner les noms de débogages des ressources.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marqueur de débogage invité:\nInsère tous les marqueurs de débogage que le jeu a ajouté a la commande mémoire tampon.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. CheatsPatches Cheats / Patches for - Cheats/Patchs pour + Cheats / Patchs pour defaultTextEdit_MSG From c77f62a7380aa8a504420fa33b80f8fe38f3350c Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Thu, 30 Jan 2025 21:45:49 +0100 Subject: [PATCH 181/455] Detect and log if the user is using a fork (#2219) * Added fork detection * Fallback to "origin" if branch is not found * Add fork names to window titles * clang --- CMakeLists.txt | 24 ++++++++++++++++++++++++ src/common/scm_rev.cpp.in | 12 ++++++++---- src/common/scm_rev.h | 2 ++ src/emulator.cpp | 12 ++++++++++-- src/qt_gui/main_window.cpp | 11 +++++++++-- 5 files changed, 53 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78e3c7997..340715e78 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,6 +106,30 @@ git_describe(GIT_DESC --always --long --dirty) git_branch_name(GIT_BRANCH) string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S") +# Get current remote name and branch +execute_process( + COMMAND git rev-parse --abbrev-ref --symbolic-full-name @{u} + OUTPUT_VARIABLE GIT_REMOTE_NAME + RESULT_VARIABLE GIT_BRANCH_RESULT + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Default to origin if branch is not set +if (GIT_BRANCH_RESULT OR GIT_REMOTE_NAME STREQUAL "") + set(GIT_REMOTE_NAME "origin") +else() + # Extract remote name from full name + string(FIND "${GIT_REMOTE_NAME}" "/" INDEX) + string(SUBSTRING "${GIT_REMOTE_NAME}" 0 "${INDEX}" GIT_REMOTE_NAME) +endif() + +# Get remote link +execute_process( + COMMAND git config --get remote.${GIT_REMOTE_NAME}.url + OUTPUT_VARIABLE GIT_REMOTE_URL + OUTPUT_STRIP_TRAILING_WHITESPACE +) + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/src/common/scm_rev.cpp" @ONLY) find_package(Boost 1.84.0 CONFIG) diff --git a/src/common/scm_rev.cpp.in b/src/common/scm_rev.cpp.in index 642e6373d..2de04e0be 100644 --- a/src/common/scm_rev.cpp.in +++ b/src/common/scm_rev.cpp.in @@ -6,14 +6,18 @@ #define GIT_REV "@GIT_REV@" #define GIT_BRANCH "@GIT_BRANCH@" #define GIT_DESC "@GIT_DESC@" +#define GIT_REMOTE_NAME "@GIT_REMOTE_NAME@" +#define GIT_REMOTE_URL "@GIT_REMOTE_URL@" #define BUILD_DATE "@BUILD_DATE@" namespace Common { -const char g_scm_rev[] = GIT_REV; -const char g_scm_branch[] = GIT_BRANCH; -const char g_scm_desc[] = GIT_DESC; -const char g_scm_date[] = BUILD_DATE; +const char g_scm_rev[] = GIT_REV; +const char g_scm_branch[] = GIT_BRANCH; +const char g_scm_desc[] = GIT_DESC; +const char g_scm_remote_name[] = GIT_REMOTE_NAME; +const char g_scm_remote_url[] = GIT_REMOTE_URL; +const char g_scm_date[] = BUILD_DATE; } // namespace diff --git a/src/common/scm_rev.h b/src/common/scm_rev.h index 005099d2d..f38efff42 100644 --- a/src/common/scm_rev.h +++ b/src/common/scm_rev.h @@ -8,6 +8,8 @@ namespace Common { extern const char g_scm_rev[]; extern const char g_scm_branch[]; extern const char g_scm_desc[]; +extern const char g_scm_remote_name[]; +extern const char g_scm_remote_url[]; extern const char g_scm_date[]; } // namespace Common diff --git a/src/emulator.cpp b/src/emulator.cpp index 81c4d814d..3ab26d484 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -57,6 +57,7 @@ Emulator::Emulator() { LOG_INFO(Loader, "Revision {}", Common::g_scm_rev); LOG_INFO(Loader, "Branch {}", Common::g_scm_branch); LOG_INFO(Loader, "Description {}", Common::g_scm_desc); + LOG_INFO(Loader, "Remote {}", Common::g_scm_remote_url); LOG_INFO(Config, "General LogType: {}", Config::getLogType()); LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole()); @@ -199,8 +200,15 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector( Config::getScreenWidth(), Config::getScreenHeight(), controller, window_title); diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 3678b3a82..ce7b7b19e 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -57,8 +57,15 @@ bool MainWindow::Init() { if (Common::isRelease) { window_title = fmt::format("shadPS4 v{}", Common::VERSION); } else { - window_title = fmt::format("shadPS4 v{} {} {}", Common::VERSION, Common::g_scm_branch, - Common::g_scm_desc); + std::string remote_url(Common::g_scm_remote_url); + if (remote_url == "https://github.com/shadps4-emu/shadPS4.git") { + window_title = fmt::format("shadPS4 v{} {} {}", Common::VERSION, Common::g_scm_branch, + Common::g_scm_desc); + } else { + std::string remote_host = remote_url.substr(19, remote_url.rfind('/') - 19); + window_title = fmt::format("shadPS4 v{} {}/{} {}", Common::VERSION, remote_host, + Common::g_scm_branch, Common::g_scm_desc); + } } setWindowTitle(QString::fromStdString(window_title)); this->show(); From b5d63a31ccc9eefc98818577e87b418af225005e Mon Sep 17 00:00:00 2001 From: C4ndyF1sh <128715345+C4ndyF1sh@users.noreply.github.com> Date: Thu, 30 Jan 2025 23:05:50 +0100 Subject: [PATCH 182/455] update german ts (#2290) * Update de.ts (p1) * Update de.ts (p2) --- src/qt_gui/translations/de.ts | 110 +++++++++++++++++----------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index b8fa22881..d1ae21cca 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -52,7 +52,7 @@ Select which directory you want to install to. - Select which directory you want to install to. + Wählen Sie das Verzeichnis aus, in das Sie installieren möchten. @@ -130,35 +130,35 @@ Delete... - Delete... + Löschen... Delete Game - Delete Game + Lösche Spiel Delete Update - Delete Update + Lösche Aktualisierung Delete DLC - Delete DLC + Lösche DLC Compatibility... - Compatibility... + Kompatibilität... Update database - Update database + Aktualisiere Datenbank View report - View report + Bericht ansehen Submit a report - Submit a report + Einen Bericht einreichen Shortcut creation @@ -182,23 +182,23 @@ Game - Game + Spiel requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. + Damit diese Funktion funktioniert, ist die Konfigurationsoption „Separaten Update-Ordner aktivieren“ erforderlich. Wenn Sie diese Funktion nutzen möchten, aktivieren Sie sie bitte. This game has no update to delete! - This game has no update to delete! + Dieses Spiel hat keine Aktualisierung zum löschen! Update - Update + Aktualisieren This game has no DLC to delete! - This game has no DLC to delete! + Dieses Spiel hat kein DLC zum aktualisieren! DLC @@ -206,11 +206,11 @@ Delete %1 - Delete %1 + Lösche %1 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + Sind Sie sicher dass Sie %1 %2 Ordner löschen wollen? @@ -249,7 +249,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Öffne shadPS4 Ordner Exit @@ -305,7 +305,7 @@ Download Cheats/Patches - Cheats / Patches herunterladen + Cheats/Patches herunterladen Dump Game List @@ -313,7 +313,7 @@ PKG Viewer - PKG-Ansicht + PKG-Anschauer Search... @@ -329,11 +329,11 @@ Game List Icons - Game List Icons + Spiellisten-Symbole Game List Mode - Spiellisten-Symoble + Spiellisten-Modus Settings @@ -373,7 +373,7 @@ toolBar - toolBar + Werkzeugleiste Game List @@ -461,7 +461,7 @@ Would you like to install DLC: %1? - Willst du den DLC installieren: %1? + Willst du das DLC installieren: %1? DLC already installed: @@ -546,7 +546,7 @@ Enable Separate Update Folder - Enable Separate Update Folder + Separaten Update-Ordner aktivieren Default tab when opening settings @@ -574,11 +574,11 @@ Trophy Key - Trophy Key + Trophäenschlüssel Trophy - Trophy + Trophäe Logger @@ -702,23 +702,23 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Absturz-Diagnostik aktivieren Collect Shaders - Collect Shaders + Sammle Shader Copy GPU Buffers - Copy GPU Buffers + Kopiere GPU Puffer Host Debug Markers - Host Debug Markers + Host-Debug-Markierungen Guest Debug Markers - Guest Debug Markers + Guest-Debug-Markierungen Update @@ -746,7 +746,7 @@ Disable Trophy Pop-ups - Disable Trophy Pop-ups + Deaktiviere Trophäen Pop-ups Play title music @@ -754,19 +754,19 @@ Update Compatibility Database On Startup - Update Compatibility Database On Startup + Aktualisiere Kompatibilitätsdatenbank beim Start Game Compatibility - Game Compatibility + Spielkompatibilität Display Compatibility Data - Display Compatibility Data + Zeige Kompatibilitätsdaten Update Compatibility Database - Update Compatibility Database + Aktualisiere Kompatibilitätsdatenbank Volume @@ -810,7 +810,7 @@ separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung. showSplashCheckBox @@ -866,15 +866,15 @@ enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie „Aktualisiere Kompatibilitätsdatenbank beim Start“, um aktuelle Informationen zu erhalten. checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Kompatibilität beim Start aktualisieren:\nAktualisiert die Kompatibilitätsdatenbank automatisch, wenn shadPS4 startet. updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. Never @@ -954,23 +954,23 @@ collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Shader sammeln:\nSie müssen diese Option aktivieren, um Shader mit dem Debug-Menü (Strg + F10) bearbeiten zu können. crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Absturzdiagnose:\nErstellt eine .yaml-Datei mit Informationen über den Vulkan-Status zum Zeitpunkt des Absturzes.\nNützlich zum Debuggen von „Gerät verloren“-Fehlern. Wenn Sie dies aktiviert haben, sollten Sie Host- UND Gast-Debug-Markierungen aktivieren.\nFunktioniert nicht auf Intel-GPUs.\nDamit dies funktioniert, müssen Vulkan Validationsschichten aktiviert und das Vulkan SDK installiert sein. copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + GPU-Puffer kopieren:\nUmgeht Race-Bedingungen mit GPU-Übermittlungen.\nKann bei PM4-Abstürzen vom Typ 0 hilfreich sein oder auch nicht. hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host-Debug-Marker:\nFügt emulatorseitige Informationen wie Marker für bestimmte AMDGPU-Befehle rund um Vulkan-Befehle ein und gibt Ressourcen-Debug-Namen an.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Gast-Debug-Markierer:\nFügt alle Debug-Markierer, die das Spiel selbst hinzugefügt hat, in den Befehlspuffer ein.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. @@ -1165,7 +1165,7 @@ Failed to open file: - Fehler beim Öffnen der Datei: + Öffnung der Datei fehlgeschlagen: XML ERROR: @@ -1212,7 +1212,7 @@ Compatibility - Compatibility + Kompatibilität Region @@ -1240,7 +1240,7 @@ Never Played - Never Played + Niemals gespielt h @@ -1256,27 +1256,27 @@ Compatibility is untested - Compatibility is untested + Kompatibilität wurde noch nicht getested Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Das Spiel wird nicht richtig initialisiert / stürzt den Emulator ab Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Spiel startet, aber zeigt nur einen blanken Bildschirm Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Spiel zeigt ein Bild aber geht nicht über das Menü hinaus Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Spiel hat spiel-brechende Störungen oder unspielbare Leistung Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Spiel kann mit spielbarer Leistung und keinen großen Störungen abgeschlossen werden @@ -1405,4 +1405,4 @@ TB - \ No newline at end of file + From be74f65864eb46f86e6b247db63fcc3cba5a4aed Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Thu, 30 Jan 2025 23:14:13 +0100 Subject: [PATCH 183/455] Fix ccrash if remote is not set (#2291) --- CMakeLists.txt | 14 ++++++++++---- src/emulator.cpp | 3 ++- src/qt_gui/main_window.cpp | 3 ++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 340715e78..e10fcfb98 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,21 +106,27 @@ git_describe(GIT_DESC --always --long --dirty) git_branch_name(GIT_BRANCH) string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S") -# Get current remote name and branch +# Try to get the upstream remote and branch execute_process( COMMAND git rev-parse --abbrev-ref --symbolic-full-name @{u} OUTPUT_VARIABLE GIT_REMOTE_NAME RESULT_VARIABLE GIT_BRANCH_RESULT + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) -# Default to origin if branch is not set +# Default to origin if there's no upstream set or if the command failed if (GIT_BRANCH_RESULT OR GIT_REMOTE_NAME STREQUAL "") set(GIT_REMOTE_NAME "origin") else() - # Extract remote name from full name + # Extract remote name if the output contains a remote/branch format string(FIND "${GIT_REMOTE_NAME}" "/" INDEX) - string(SUBSTRING "${GIT_REMOTE_NAME}" 0 "${INDEX}" GIT_REMOTE_NAME) + if (INDEX GREATER -1) + string(SUBSTRING "${GIT_REMOTE_NAME}" 0 "${INDEX}" GIT_REMOTE_NAME) + else() + # If no remote is present (only a branch name), default to origin + set(GIT_REMOTE_NAME "origin") + endif() endif() # Get remote link diff --git a/src/emulator.cpp b/src/emulator.cpp index 3ab26d484..ba8d8917c 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -201,7 +201,8 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector Date: Thu, 30 Jan 2025 19:41:17 -0300 Subject: [PATCH 184/455] Fix minor issue with 'Emulator' group box (#2292) --- src/qt_gui/settings_dialog.ui | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 4e7440af5..d15f49efe 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -108,9 +108,6 @@ Emulator - - Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft - false From 647694d1b9eb6c34b4567b627ac8752ffeb468c9 Mon Sep 17 00:00:00 2001 From: bigol83 <38129260+bigol83@users.noreply.github.com> Date: Fri, 31 Jan 2025 07:34:42 +0100 Subject: [PATCH 185/455] Update Italian translation (#2293) * Update it.ts Update Italian translation * Update Italian translation * Update Italian translation --- src/qt_gui/translations/it.ts | 50 +++++++++++++++++------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 384272137..106d09de0 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -146,19 +146,19 @@ Compatibility... - Compatibility... + Compatibilità... Update database - Update database + Aggiorna database View report - View report + Visualizza rapporto Submit a report - Submit a report + Invia rapporto Shortcut creation @@ -194,7 +194,7 @@ Update - Update + Aggiornamento This game has no DLC to delete! @@ -249,7 +249,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Apri Cartella shadps4 Exit @@ -574,11 +574,11 @@ Trophy Key - Trophy Key + Chiave Trofei Trophy - Trophy + Trofei Logger @@ -702,23 +702,23 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Abilita Diagnostica Crash Collect Shaders - Collect Shaders + Raccogli Shaders Copy GPU Buffers - Copy GPU Buffers + Copia Buffer GPU Host Debug Markers - Host Debug Markers + Marcatori di Debug dell'Host Guest Debug Markers - Guest Debug Markers + Marcatori di Debug del Guest Update @@ -742,7 +742,7 @@ Title Music - Title Music + Musica del Titolo Disable Trophy Pop-ups @@ -774,7 +774,7 @@ Audio Backend - Audio Backend + Backend Audio Save @@ -830,7 +830,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Chiave Trofei:\nChiave utilizzata per la decrittazione dei trofei. Deve essere estratta dalla vostra console con jailbreak.\nDeve contenere solo caratteri esadecimali. logTypeGroupBox @@ -850,7 +850,7 @@ disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disabilita Notifica Trofei:\nDisabilita notifiche in gioco dei trofei. Il progresso dei Trofei può ancora essere controllato con il Visualizzatore Trofei (clicca tasto destro sul gioco nella finestra principale). hideCursorGroupBox @@ -954,30 +954,30 @@ collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Raccogli Shader:\nBisogna attivare questa opzione per poter modificare gli shader nel menu di debug (Ctrl + F10). crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Diagnostica Crash:\nCrea un file .yaml che contiene informazioni riguardo lo stato del renderer Vulkan nel momento in cui si verifica un crash.\nUtile per poter effettuare il debug degli errori di tipo "Device Lost". Se hai questa opzione attiva dovresti abilitare anche Marcatori di Debug Host e Guest.\nNon è funzionante su GPU Intel.\nVulkan Validation Layers deve essere abilitato e bisogna aver installato l'SDK Vulkan per poter utilizzare questa funzione. copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copia Buffer GPU:\nCerca di aggirare le race conditions che riguardano gli invii alla GPU.\nPotrebbe aiutare ad evitare crash che riguardano i PM4 di tipo 0. hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marcatori di Debug dell'Host:\nInserisce nel log informazioni ottenute dall'emulatore come ad esempio marcatori per comandi specifici AMDGPU quando si hanno comandi Vulkan e associa nomi di debug per le risorse.\nSe hai questa opzione abilitata dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marcatori di Debug del Guest:\nInserisce nel log marcatori di debug che il gioco stesso ha aggiunto al buffer dei comandi.\nSe hai abilitato questa opzione dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc.
CheatsPatches Cheats / Patches for - Cheats / Patches for + Cheats / Patch per defaultTextEdit_MSG @@ -1244,7 +1244,7 @@ h - h + o m @@ -1405,4 +1405,4 @@ TB - \ No newline at end of file + From 6e58c6c5131a0a1bd27833136e1b50f6a652adbf Mon Sep 17 00:00:00 2001 From: C4ndyF1sh <128715345+C4ndyF1sh@users.noreply.github.com> Date: Fri, 31 Jan 2025 07:35:06 +0100 Subject: [PATCH 186/455] update german ts (#2294) * Update de.ts (p1) * Update de.ts (p2) * Update de.ts (p3) * Update de.ts (p4) --- src/qt_gui/translations/de.ts | 36 +++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index d1ae21cca..71ee066c1 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -105,7 +105,11 @@ Spielordner öffnen - Open Save Data Folder + Open Update Folder + Öffne Update-Ordner + + + Open Save Data Folder Speicherordner öffnen @@ -139,7 +143,11 @@ Delete Update Lösche Aktualisierung - + + + Delete Save Data + Lösche Speicherdaten + Delete DLC Lösche DLC @@ -513,7 +521,11 @@ SettingsDialog - Settings + Save Data Path + Speicherdaten-Pfad + + + Settings Einstellungen @@ -554,7 +566,7 @@ Show Game Size In List - Zeigen Sie die Spielgröße in der Liste + Zeige Spielgröße in der Liste Show Splash @@ -599,6 +611,10 @@ Input Eingabe + + + Enable Motion Controls + Aktiviere Bewegungssteuerung Cursor @@ -714,11 +730,11 @@ Host Debug Markers - Host-Debug-Markierungen + Host-Debug-Markierer Guest Debug Markers - Guest-Debug-Markierungen + Guest-Debug-Markierer Update @@ -742,7 +758,7 @@ Title Music - Title Music + Titelmusik Disable Trophy Pop-ups @@ -830,7 +846,7 @@ TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophäenschlüssel:\nSchlüssel zum Entschlüsseln von Trophäen. Muss von Ihrer gejailbreakten Konsole abgerufen werden.\nDarf nur Hex-Zeichen enthalten. logTypeGroupBox @@ -850,7 +866,7 @@ disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Trophäen-Popups deaktivieren:\nDeaktivieren Sie Trophäenbenachrichtigungen im Spiel. Der Trophäenfortschritt kann weiterhin mit dem Trophäen-Viewer verfolgt werden (klicken Sie mit der rechten Maustaste auf das Spiel im Hauptfenster).. hideCursorGroupBox @@ -977,7 +993,7 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + Cheats / Patches für defaultTextEdit_MSG From a55cec1954e62ffe2096aa136749283ffcbe6702 Mon Sep 17 00:00:00 2001 From: Martin <67326368+Martini-141@users.noreply.github.com> Date: Fri, 31 Jan 2025 07:35:31 +0100 Subject: [PATCH 187/455] add advdebug translation nb (#2296) * add advdebug translation nb * vvl is a project so no tr --- src/qt_gui/translations/nb.ts | 50 ++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index 3e6f5fedd..bce5791af 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -629,7 +629,7 @@ Grafikk - Gui + GUI Grensesnitt @@ -680,6 +680,22 @@ Remove Fjern + + Save Data Path + Lagrede datamappe + + + Browse + Endre mappe + + + saveDataBox + Lagrede datamappe:\nListe over data shadPS4 lagrer. + + + browseButton + Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. + Debug Feilretting @@ -690,7 +706,7 @@ Enable Vulkan Validation Layers - Aktiver Vulkan valideringslag + Aktiver Vulkan Validation Layers Enable Vulkan Synchronization Validation @@ -702,23 +718,23 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Aktiver krasjdiagnostikk Collect Shaders - Collect Shaders + Lagre skyggeleggere Copy GPU Buffers - Copy GPU Buffers + Kopier GPU-buffere Host Debug Markers - Host Debug Markers + Vertsfeilsøkingsmarkører Guest Debug Markers - Guest Debug Markers + Gjestefeilsøkingsmarkører Update @@ -742,7 +758,7 @@ Title Music - Title Music + Tittelmusikk Disable Trophy Pop-ups @@ -926,7 +942,7 @@ gameFoldersBox - Spillmapper:\nListen over mapper som brukes for å se etter installerte spill. + Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. addFolderButton @@ -942,7 +958,7 @@ vkValidationCheckBox - Aktiver Vulkan valideringslag:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre etterlignerens atferd. + Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre etterlignerens atferd. vkSyncValidationCheckBox @@ -954,23 +970,23 @@ collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Vertsfeilsøkingsmarkører:\nSetter inn etterligner-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. @@ -1015,6 +1031,10 @@ Delete File Slett fil + + Close + Lukk + No files selected. Ingen filer valgt. From ec7a5412633f68228dab2dc59b5c79ca4be0b1fb Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 31 Jan 2025 09:53:35 +0200 Subject: [PATCH 188/455] tagged 0.6.0 release --- src/common/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/version.h b/src/common/version.h index c903b1db6..0305b929e 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -8,7 +8,7 @@ namespace Common { -constexpr char VERSION[] = "0.5.1 WIP"; -constexpr bool isRelease = false; +constexpr char VERSION[] = "0.6.0"; +constexpr bool isRelease = true; } // namespace Common From 8057ed408c32ae30197b8ec027d5665fe5524adb Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 31 Jan 2025 10:33:17 +0200 Subject: [PATCH 189/455] started 0.6.1 WIP --- src/common/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/version.h b/src/common/version.h index 0305b929e..e7f6cc817 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -8,7 +8,7 @@ namespace Common { -constexpr char VERSION[] = "0.6.0"; -constexpr bool isRelease = true; +constexpr char VERSION[] = "0.6.1 WIP"; +constexpr bool isRelease = false; } // namespace Common From f3c33b29dd249aaf0c78985ff920762289a838ed Mon Sep 17 00:00:00 2001 From: pdaloxd <31321612+pablodrake@users.noreply.github.com> Date: Fri, 31 Jan 2025 09:50:02 +0100 Subject: [PATCH 190/455] Fix issue #1684 (#2277) * Added recursive game scan and only using game directories * Added recursion depth limit to scan directories * Added recursive search by ID in cli mode * Added recursive search to pkg installing --- src/common/path_util.cpp | 28 +++++++++++++++++++++++++ src/common/path_util.h | 15 +++++++++++++ src/main.cpp | 8 +++---- src/qt_gui/game_info.cpp | 35 ++++++++++++++++++++++++------- src/qt_gui/main.cpp | 8 +++---- src/qt_gui/main_window.cpp | 43 +++++++++++++++++++++++++++++++++----- 6 files changed, 117 insertions(+), 20 deletions(-) diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp index 53eb123dc..a4312fada 100644 --- a/src/common/path_util.cpp +++ b/src/common/path_util.cpp @@ -176,6 +176,34 @@ void SetUserPath(PathType shad_path, const fs::path& new_path) { UserPaths.insert_or_assign(shad_path, new_path); } +std::optional FindGameByID(const fs::path& dir, const std::string& game_id, + int max_depth) { + if (max_depth < 0) { + return std::nullopt; + } + + // Check if this is the game we're looking for + if (dir.filename() == game_id && fs::exists(dir / "sce_sys" / "param.sfo")) { + auto eboot_path = dir / "eboot.bin"; + if (fs::exists(eboot_path)) { + return eboot_path; + } + } + + // Recursively search subdirectories + std::error_code ec; + for (const auto& entry : fs::directory_iterator(dir, ec)) { + if (!entry.is_directory()) { + continue; + } + if (auto found = FindGameByID(entry.path(), game_id, max_depth - 1)) { + return found; + } + } + + return std::nullopt; +} + #ifdef ENABLE_QT_GUI void PathToQString(QString& result, const std::filesystem::path& path) { #ifdef _WIN32 diff --git a/src/common/path_util.h b/src/common/path_util.h index 09b7a3337..7190378d6 100644 --- a/src/common/path_util.h +++ b/src/common/path_util.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include #ifdef ENABLE_QT_GUI @@ -115,4 +116,18 @@ void PathToQString(QString& result, const std::filesystem::path& path); [[nodiscard]] std::filesystem::path PathFromQString(const QString& path); #endif +/** + * Recursively searches for a game directory by its ID. + * Limits search depth to prevent excessive filesystem traversal. + * + * @param dir Base directory to start the search from + * @param game_id The game ID to search for + * @param max_depth Maximum directory depth to search + * + * @returns Path to eboot.bin if found, std::nullopt otherwise + */ +[[nodiscard]] std::optional FindGameByID(const std::filesystem::path& dir, + const std::string& game_id, + int max_depth); + } // namespace Common::FS diff --git a/src/main.cpp b/src/main.cpp index fad3b1f53..6b334e446 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -167,12 +167,12 @@ int main(int argc, char* argv[]) { // Check if the provided path is a valid file if (!std::filesystem::exists(eboot_path)) { - // If not a file, treat it as a game ID and search in install directories + // If not a file, treat it as a game ID and search in install directories recursively bool game_found = false; + const int max_depth = 5; for (const auto& install_dir : Config::getGameInstallDirs()) { - const auto candidate_path = install_dir / game_path / "eboot.bin"; - if (std::filesystem::exists(candidate_path)) { - eboot_path = candidate_path; + if (auto found_path = Common::FS::FindGameByID(install_dir, game_path, max_depth)) { + eboot_path = *found_path; game_found = true; break; } diff --git a/src/qt_gui/game_info.cpp b/src/qt_gui/game_info.cpp index e4750fa1d..adbf392ed 100644 --- a/src/qt_gui/game_info.cpp +++ b/src/qt_gui/game_info.cpp @@ -7,6 +7,33 @@ #include "compatibility_info.h" #include "game_info.h" +// Maximum depth to search for games in subdirectories +const int max_recursion_depth = 5; + +void ScanDirectoryRecursively(const QString& dir, QStringList& filePaths, int current_depth = 0) { + // Stop recursion if we've reached the maximum depth + if (current_depth >= max_recursion_depth) { + return; + } + + QDir directory(dir); + QFileInfoList entries = directory.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + + for (const auto& entry : entries) { + if (entry.fileName().endsWith("-UPDATE")) { + continue; + } + + // Check if this directory contains a PS4 game (has sce_sys/param.sfo) + if (QFile::exists(entry.filePath() + "/sce_sys/param.sfo")) { + filePaths.append(entry.absoluteFilePath()); + } else { + // If not a game directory, recursively scan it with increased depth + ScanDirectoryRecursively(entry.absoluteFilePath(), filePaths, current_depth + 1); + } + } +} + GameInfoClass::GameInfoClass() = default; GameInfoClass::~GameInfoClass() = default; @@ -15,13 +42,7 @@ void GameInfoClass::GetGameInfo(QWidget* parent) { for (const auto& installLoc : Config::getGameInstallDirs()) { QString installDir; Common::FS::PathToQString(installDir, installLoc); - QDir parentFolder(installDir); - QFileInfoList fileList = parentFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const auto& fileInfo : fileList) { - if (fileInfo.isDir() && !fileInfo.filePath().endsWith("-UPDATE")) { - filePaths.append(fileInfo.absoluteFilePath()); - } - } + ScanDirectoryRecursively(installDir, filePaths, 0); } m_games = QtConcurrent::mapped(filePaths, [&](const QString& path) { diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 8babadc35..052f73f25 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -181,12 +181,12 @@ int main(int argc, char* argv[]) { // Check if the provided path is a valid file if (!std::filesystem::exists(game_file_path)) { - // If not a file, treat it as a game ID and search in install directories + // If not a file, treat it as a game ID and search in install directories recursively bool game_found = false; + const int max_depth = 5; for (const auto& install_dir : Config::getGameInstallDirs()) { - auto potential_game_path = install_dir / game_path / "eboot.bin"; - if (std::filesystem::exists(potential_game_path)) { - game_file_path = potential_game_path; + if (auto found_path = Common::FS::FindGameByID(install_dir, game_path, max_depth)) { + game_file_path = *found_path; game_found = true; break; } diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 945210776..aa02d1237 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -747,12 +747,42 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int } std::filesystem::path game_install_dir = last_install_dir; - auto game_folder_path = game_install_dir / pkg.GetTitleID(); QString pkgType = QString::fromStdString(pkg.GetPkgFlags()); bool use_game_update = pkgType.contains("PATCH") && Config::getSeparateUpdateEnabled(); - auto game_update_path = use_game_update - ? game_install_dir / (std::string(pkg.GetTitleID()) + "-UPDATE") - : game_folder_path; + + // Default paths + auto game_folder_path = game_install_dir / pkg.GetTitleID(); + auto game_update_path = use_game_update ? game_folder_path.parent_path() / + (std::string{pkg.GetTitleID()} + "-UPDATE") + : game_folder_path; + const int max_depth = 5; + + if (pkgType.contains("PATCH")) { + // For patches, try to find the game recursively + auto found_game = Common::FS::FindGameByID(game_install_dir, + std::string{pkg.GetTitleID()}, max_depth); + if (found_game.has_value()) { + game_folder_path = found_game.value().parent_path(); + game_update_path = use_game_update ? game_folder_path.parent_path() / + (std::string{pkg.GetTitleID()} + "-UPDATE") + : game_folder_path; + } + } else { + // For base games, we check if the game is already installed + auto found_game = Common::FS::FindGameByID(game_install_dir, + std::string{pkg.GetTitleID()}, max_depth); + if (found_game.has_value()) { + game_folder_path = found_game.value().parent_path(); + } + // If the game is not found, we install it in the game install directory + else { + game_folder_path = game_install_dir / pkg.GetTitleID(); + } + game_update_path = use_game_update ? game_folder_path.parent_path() / + (std::string{pkg.GetTitleID()} + "-UPDATE") + : game_folder_path; + } + QString gameDirPath; Common::FS::PathToQString(gameDirPath, game_folder_path); QDir game_dir(gameDirPath); @@ -897,10 +927,13 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int connect(&futureWatcher, &QFutureWatcher::finished, this, [=, this]() { if (pkgNum == nPkg) { QString path; - Common::FS::PathToQString(path, game_install_dir); + + // We want to show the parent path instead of the full path + Common::FS::PathToQString(path, game_folder_path.parent_path()); QIcon windowIcon( Common::FS::PathToUTF8String(game_folder_path / "sce_sys/icon0.png") .c_str()); + QMessageBox extractMsgBox(this); extractMsgBox.setWindowTitle(tr("Extraction Finished")); if (!windowIcon.isNull()) { From 49fc210833e0cb80f87980556256e03e5cd6f57e Mon Sep 17 00:00:00 2001 From: Daniel Nylander Date: Fri, 31 Jan 2025 09:50:40 +0100 Subject: [PATCH 191/455] Updated Swedish translation (#2270) * Adding Swedish translation * Updated Swedish translation with additional strings Updated the Swedish translations using lupdate to found additional strings cd src/qt_gui/treanslations lupdate ../../../../shadPS4/ -tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS -no-obsolete -locations none -source-language en -ts sv.ts * Update sv.ts * Updated Swedish translation * Adding copyright boilerplate --- src/qt_gui/translations/sv.ts | 82 +++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index c5fbce991..deefa99d8 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1,9 +1,9 @@ - - + AboutDialog About shadPS4 @@ -252,6 +252,10 @@ ERROR FEL + + Close + Stäng + CheckUpdate @@ -676,6 +680,26 @@ Failed to convert icon. Misslyckades med att konvertera ikon. + + Open Update Folder + Öppna uppdateringsmapp + + + Delete Save Data + Ta bort sparat data + + + This game has no update folder to open! + Detta spel har ingen uppdateringsmapp att öppna! + + + This game has no save data to delete! + Detta spel har inget sparat data att ta bort! + + + Save Data + Sparat data +
InstallDirSelect @@ -687,6 +711,14 @@ Select which directory you want to install to. Välj vilken katalog som du vill installera till. + + Install All Queued to Selected Folder + Installera alla köade till markerad mapp + + + Delete PKG File on Install + Ta bort PKG-fil efter installation + MainWindow @@ -1040,11 +1072,11 @@ Enable Separate Update Folder Aktivera separat uppdateringsmapp - - Default tab when opening settings - Standardflik när inställningar öppnas - - + + Default tab when opening settings + Standardflik när inställningar öppnas + + Show Game Size In List Visa spelstorlek i listan @@ -1142,7 +1174,7 @@ Advanced - Avancerat + Avancerat Enable Shaders Dumping @@ -1322,7 +1354,7 @@ updaterGroupBox - updaterGroupBox + Uppdatering:\nRelease: Officiella versioner som släpps varje månad som kan vara mycket utdaterade, men är mer pålitliga och testade.\nNightly: Utvecklingsversioner som har de senaste funktionerna och fixarna, men kan innehålla fel och är mindre stabila GUIMusicGroupBox @@ -1476,6 +1508,38 @@ Directory to install games Katalog att installera spel till + + Borderless + Fönster utan kanter + + + True + Sant + + + Enable Motion Controls + Aktivera rörelsekontroller + + + Save Data Path + Sökväg för sparat data + + + Browse + Bläddra + + + Directory to save data + Katalog för sparat data + + + saveDataBox + Sökväg för sparat data:\nSökvägen där spelets sparade data kommer att sparas + + + browseButton + Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data + TrophyViewer From ec0cf25097fdd746d220f3035e25e4dee82df778 Mon Sep 17 00:00:00 2001 From: panzone91 <150828896+panzone91@users.noreply.github.com> Date: Fri, 31 Jan 2025 09:51:03 +0100 Subject: [PATCH 192/455] libkernel: handle special case in path for load module (#2269) * libkernel: handle special case for load module * fix linting --- src/core/libraries/kernel/process.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index c21257c50..a904152ff 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -41,8 +41,13 @@ s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, size_t arg return ORBIS_KERNEL_ERROR_EINVAL; } + std::string guest_path(moduleFileName); + if (moduleFileName[0] != '/') { + guest_path = "/app0/" + guest_path; + } + auto* mnt = Common::Singleton::Instance(); - const auto path = mnt->GetHostPath(moduleFileName); + const auto path = mnt->GetHostPath(guest_path); // Load PRX module and relocate any modules that import it. auto* linker = Common::Singleton::Instance(); From 8aea0fc7eeccc2f3a8594634e3539c49e2411ac7 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 31 Jan 2025 12:54:16 +0200 Subject: [PATCH 193/455] Revert "libkernel: handle special case in path for load module (#2269)" (#2298) This reverts commit ec0cf25097fdd746d220f3035e25e4dee82df778. --- src/core/libraries/kernel/process.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index a904152ff..c21257c50 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -41,13 +41,8 @@ s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, size_t arg return ORBIS_KERNEL_ERROR_EINVAL; } - std::string guest_path(moduleFileName); - if (moduleFileName[0] != '/') { - guest_path = "/app0/" + guest_path; - } - auto* mnt = Common::Singleton::Instance(); - const auto path = mnt->GetHostPath(guest_path); + const auto path = mnt->GetHostPath(moduleFileName); // Load PRX module and relocate any modules that import it. auto* linker = Common::Singleton::Instance(); From eed4de1da9c5c76efd982a6172a4dcf68226c4a1 Mon Sep 17 00:00:00 2001 From: poly <47796739+polybiusproxy@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:52:31 +0100 Subject: [PATCH 194/455] renderer_vulkan: use LDS buffer as SSBO on unsupported shared memory size (#2245) * renderer_vulkan: use LDS buffer as SSBO on unsupported shared memory size * shader_recompiler: add `v_trunc_f64` on inst format table --- .../spirv/emit_spirv_shared_memory.cpp | 74 +++++++++++++++---- .../backend/spirv/spirv_emit_context.cpp | 45 ++++++++--- .../backend/spirv/spirv_emit_context.h | 4 +- src/shader_recompiler/frontend/decode.cpp | 4 +- src/shader_recompiler/frontend/format.cpp | 4 +- src/shader_recompiler/info.h | 2 + src/shader_recompiler/profile.h | 1 + src/shader_recompiler/runtime_info.h | 1 - src/shader_recompiler/specialization.h | 9 +++ src/video_core/buffer_cache/buffer_cache.cpp | 6 +- src/video_core/buffer_cache/buffer_cache.h | 6 ++ .../renderer_vulkan/vk_compute_pipeline.cpp | 8 ++ .../renderer_vulkan/vk_pipeline_cache.cpp | 2 +- .../renderer_vulkan/vk_rasterizer.cpp | 17 ++++- 14 files changed, 147 insertions(+), 36 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp index 57ea476f1..6ab213864 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp @@ -9,18 +9,33 @@ namespace Shader::Backend::SPIRV { Id EmitLoadSharedU32(EmitContext& ctx, Id offset) { const Id shift_id{ctx.ConstU32(2U)}; const Id index{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift_id)}; - const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index)}; - return ctx.OpLoad(ctx.U32[1], pointer); + if (ctx.info.has_emulated_shared_memory) { + const Id pointer = + ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, ctx.u32_zero_value, index); + return ctx.OpLoad(ctx.U32[1], pointer); + } else { + const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index); + return ctx.OpLoad(ctx.U32[1], pointer); + } } Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { const Id shift_id{ctx.ConstU32(2U)}; const Id base_index{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift_id)}; const Id next_index{ctx.OpIAdd(ctx.U32[1], base_index, ctx.ConstU32(1U))}; - const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, base_index)}; - const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_index)}; - return ctx.OpCompositeConstruct(ctx.U32[2], ctx.OpLoad(ctx.U32[1], lhs_pointer), - ctx.OpLoad(ctx.U32[1], rhs_pointer)); + if (ctx.info.has_emulated_shared_memory) { + const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, + ctx.u32_zero_value, base_index)}; + const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, + ctx.u32_zero_value, next_index)}; + return ctx.OpCompositeConstruct(ctx.U32[2], ctx.OpLoad(ctx.U32[1], lhs_pointer), + ctx.OpLoad(ctx.U32[1], rhs_pointer)); + } else { + const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, base_index)}; + const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_index)}; + return ctx.OpCompositeConstruct(ctx.U32[2], ctx.OpLoad(ctx.U32[1], lhs_pointer), + ctx.OpLoad(ctx.U32[1], rhs_pointer)); + } } Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { @@ -29,8 +44,14 @@ Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { std::array values{}; for (u32 i = 0; i < 4; ++i) { const Id index{i == 0 ? base_index : ctx.OpIAdd(ctx.U32[1], base_index, ctx.ConstU32(i))}; - const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index)}; - values[i] = ctx.OpLoad(ctx.U32[1], pointer); + if (ctx.info.has_emulated_shared_memory) { + const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, + ctx.u32_zero_value, index)}; + values[i] = ctx.OpLoad(ctx.U32[1], pointer); + } else { + const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index)}; + values[i] = ctx.OpLoad(ctx.U32[1], pointer); + } } return ctx.OpCompositeConstruct(ctx.U32[4], values); } @@ -38,18 +59,33 @@ Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { const Id shift{ctx.ConstU32(2U)}; const Id word_offset{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift)}; - const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset); - ctx.OpStore(pointer, value); + if (ctx.info.has_emulated_shared_memory) { + const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, + ctx.u32_zero_value, word_offset); + ctx.OpStore(pointer, value); + } else { + const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset); + ctx.OpStore(pointer, value); + } } void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { const Id shift{ctx.ConstU32(2U)}; const Id word_offset{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift)}; const Id next_offset{ctx.OpIAdd(ctx.U32[1], word_offset, ctx.ConstU32(1U))}; - const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset)}; - const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_offset)}; - ctx.OpStore(lhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 0U)); - ctx.OpStore(rhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 1U)); + if (ctx.info.has_emulated_shared_memory) { + const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, + ctx.u32_zero_value, word_offset)}; + const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, + ctx.u32_zero_value, next_offset)}; + ctx.OpStore(lhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 0U)); + ctx.OpStore(rhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 1U)); + } else { + const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset)}; + const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_offset)}; + ctx.OpStore(lhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 0U)); + ctx.OpStore(rhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 1U)); + } } void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value) { @@ -57,8 +93,14 @@ void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value) { const Id base_index{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift)}; for (u32 i = 0; i < 4; ++i) { const Id index{i == 0 ? base_index : ctx.OpIAdd(ctx.U32[1], base_index, ctx.ConstU32(i))}; - const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index)}; - ctx.OpStore(pointer, ctx.OpCompositeExtract(ctx.U32[1], value, i)); + if (ctx.info.has_emulated_shared_memory) { + const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, + ctx.u32_zero_value, index)}; + ctx.OpStore(pointer, ctx.OpCompositeExtract(ctx.U32[1], value, i)); + } else { + const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index)}; + ctx.OpStore(pointer, ctx.OpCompositeExtract(ctx.U32[1], value, i)); + } } } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index b0bf5aa0a..2a0c28563 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -65,17 +65,17 @@ void Name(EmitContext& ctx, Id object, std::string_view format_str, Args&&... ar } // Anonymous namespace -EmitContext::EmitContext(const Profile& profile_, const RuntimeInfo& runtime_info_, - const Info& info_, Bindings& binding_) +EmitContext::EmitContext(const Profile& profile_, const RuntimeInfo& runtime_info_, Info& info_, + Bindings& binding_) : Sirit::Module(profile_.supported_spirv), info{info_}, runtime_info{runtime_info_}, profile{profile_}, stage{info.stage}, l_stage{info.l_stage}, binding{binding_} { AddCapability(spv::Capability::Shader); DefineArithmeticTypes(); DefineInterfaces(); + DefineSharedMemory(); DefineBuffers(); DefineTextureBuffers(); DefineImagesAndSamplers(); - DefineSharedMemory(); } EmitContext::~EmitContext() = default; @@ -852,20 +852,45 @@ void EmitContext::DefineSharedMemory() { if (!info.uses_shared) { return; } + const u32 max_shared_memory_size = profile.max_shared_memory_size; u32 shared_memory_size = runtime_info.cs_info.shared_memory_size; if (shared_memory_size == 0) { shared_memory_size = DefaultSharedMemSize; } - const u32 max_shared_memory_size = runtime_info.cs_info.max_shared_memory_size; - ASSERT(shared_memory_size <= max_shared_memory_size); - const u32 num_elements{Common::DivCeil(shared_memory_size, 4U)}; const Id type{TypeArray(U32[1], ConstU32(num_elements))}; - shared_memory_u32_type = TypePointer(spv::StorageClass::Workgroup, type); - shared_u32 = TypePointer(spv::StorageClass::Workgroup, U32[1]); - shared_memory_u32 = AddGlobalVariable(shared_memory_u32_type, spv::StorageClass::Workgroup); - interfaces.push_back(shared_memory_u32); + + if (shared_memory_size <= max_shared_memory_size) { + shared_memory_u32_type = TypePointer(spv::StorageClass::Workgroup, type); + shared_u32 = TypePointer(spv::StorageClass::Workgroup, U32[1]); + shared_memory_u32 = AddGlobalVariable(shared_memory_u32_type, spv::StorageClass::Workgroup); + Name(shared_memory_u32, "shared_mem"); + interfaces.push_back(shared_memory_u32); + } else { + shared_memory_u32_type = TypePointer(spv::StorageClass::StorageBuffer, type); + shared_u32 = TypePointer(spv::StorageClass::StorageBuffer, U32[1]); + + Decorate(type, spv::Decoration::ArrayStride, 4); + + const Id struct_type{TypeStruct(type)}; + Name(struct_type, "shared_memory_buf"); + Decorate(struct_type, spv::Decoration::Block); + MemberName(struct_type, 0, "data"); + MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U); + + const Id struct_pointer_type{TypePointer(spv::StorageClass::StorageBuffer, struct_type)}; + const Id ssbo_id{AddGlobalVariable(struct_pointer_type, spv::StorageClass::StorageBuffer)}; + Decorate(ssbo_id, spv::Decoration::Binding, binding.unified++); + Decorate(ssbo_id, spv::Decoration::DescriptorSet, 0U); + Name(ssbo_id, "shared_mem_ssbo"); + + shared_memory_u32 = ssbo_id; + + info.has_emulated_shared_memory = true; + info.shared_memory_size = shared_memory_size; + interfaces.push_back(ssbo_id); + } } } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index f552055c0..ab42ecc5b 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -37,7 +37,7 @@ struct VectorIds { class EmitContext final : public Sirit::Module { public: - explicit EmitContext(const Profile& profile, const RuntimeInfo& runtime_info, const Info& info, + explicit EmitContext(const Profile& profile, const RuntimeInfo& runtime_info, Info& info, Bindings& binding); ~EmitContext(); @@ -132,7 +132,7 @@ public: return ConstantComposite(type, constituents); } - const Info& info; + Info& info; const RuntimeInfo& runtime_info; const Profile& profile; Stage stage; diff --git a/src/shader_recompiler/frontend/decode.cpp b/src/shader_recompiler/frontend/decode.cpp index a5187aebd..20b78e869 100644 --- a/src/shader_recompiler/frontend/decode.cpp +++ b/src/shader_recompiler/frontend/decode.cpp @@ -259,9 +259,9 @@ void GcnDecodeContext::updateInstructionMeta(InstEncoding encoding) { ASSERT_MSG(instFormat.src_type != ScalarType::Undefined && instFormat.dst_type != ScalarType::Undefined, - "Instruction format table incomplete for opcode {} ({}, encoding = {})", + "Instruction format table incomplete for opcode {} ({}, encoding = 0x{:x})", magic_enum::enum_name(m_instruction.opcode), u32(m_instruction.opcode), - magic_enum::enum_name(encoding)); + u32(encoding)); m_instruction.inst_class = instFormat.inst_class; m_instruction.category = instFormat.inst_category; diff --git a/src/shader_recompiler/frontend/format.cpp b/src/shader_recompiler/frontend/format.cpp index 2fcac7c10..76b1cc818 100644 --- a/src/shader_recompiler/frontend/format.cpp +++ b/src/shader_recompiler/frontend/format.cpp @@ -1836,7 +1836,9 @@ constexpr std::array InstructionFormatVOP1 = {{ {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float64, ScalarType::Uint32}, // 22 = V_CVT_F64_U32 {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Uint32, ScalarType::Float64}, - {}, + // 23 = V_TRUNC_F64 + {InstClass::VectorConv, InstCategory::VectorALU, 1, 1, ScalarType::Float64, + ScalarType::Float64}, {}, {}, {}, diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index 2cde30629..9469eaad7 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -207,7 +207,9 @@ struct Info { bool stores_tess_level_outer{}; bool stores_tess_level_inner{}; bool translation_failed{}; // indicates that shader has unsupported instructions + bool has_emulated_shared_memory{}; bool has_readconst{}; + u32 shared_memory_size{}; u8 mrt_mask{0u}; bool has_fetch_shader{false}; u32 fetch_shader_sgpr_base{0u}; diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index f8b91a283..f359a7dcc 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -32,6 +32,7 @@ struct Profile { u64 min_ssbo_alignment{}; u32 max_viewport_width{}; u32 max_viewport_height{}; + u32 max_shared_memory_size{}; }; } // namespace Shader diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 103c1faa8..138a707b3 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -201,7 +201,6 @@ struct FragmentRuntimeInfo { struct ComputeRuntimeInfo { u32 shared_memory_size; - u32 max_shared_memory_size; std::array workgroup_size; std::array tgid_enable; diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index eb0085965..2083d11a9 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -101,6 +101,9 @@ struct StageSpecialization { }); } u32 binding{}; + if (info->has_emulated_shared_memory) { + binding++; + } if (info->has_readconst) { binding++; } @@ -197,9 +200,15 @@ struct StageSpecialization { } } u32 binding{}; + if (info->has_emulated_shared_memory != other.info->has_emulated_shared_memory) { + return false; + } if (info->has_readconst != other.info->has_readconst) { return false; } + if (info->has_emulated_shared_memory) { + binding++; + } if (info->has_readconst) { binding++; } diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 11ad0e96f..c779c1c45 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -17,7 +17,7 @@ namespace VideoCore { -static constexpr size_t GdsBufferSize = 64_KB; +static constexpr size_t DataShareBufferSize = 64_KB; static constexpr size_t StagingBufferSize = 1_GB; static constexpr size_t UboStreamBufferSize = 64_MB; @@ -28,9 +28,11 @@ BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& s texture_cache{texture_cache_}, tracker{tracker_}, staging_buffer{instance, scheduler, MemoryUsage::Upload, StagingBufferSize}, stream_buffer{instance, scheduler, MemoryUsage::Stream, UboStreamBufferSize}, - gds_buffer{instance, scheduler, MemoryUsage::Stream, 0, AllFlags, GdsBufferSize}, + gds_buffer{instance, scheduler, MemoryUsage::Stream, 0, AllFlags, DataShareBufferSize}, + lds_buffer{instance, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags, DataShareBufferSize}, memory_tracker{&tracker} { Vulkan::SetObjectName(instance.GetDevice(), gds_buffer.Handle(), "GDS Buffer"); + Vulkan::SetObjectName(instance.GetDevice(), lds_buffer.Handle(), "LDS Buffer"); // Ensure the first slot is used for the null buffer const auto null_id = diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 575ee2c60..088c22c12 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -68,6 +68,11 @@ public: return &gds_buffer; } + /// Returns a pointer to LDS device local buffer. + [[nodiscard]] const Buffer* GetLdsBuffer() const noexcept { + return &lds_buffer; + } + /// Retrieves the buffer with the specified id. [[nodiscard]] Buffer& GetBuffer(BufferId id) { return slot_buffers[id]; @@ -154,6 +159,7 @@ private: StreamBuffer staging_buffer; StreamBuffer stream_buffer; Buffer gds_buffer; + Buffer lds_buffer; std::shared_mutex mutex; Common::SlotVector slot_buffers; RangeSet gpu_modified_ranges; diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 23faacfc2..afa598fca 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -29,6 +29,14 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler u32 binding{}; boost::container::small_vector bindings; + if (info->has_emulated_shared_memory) { + bindings.push_back({ + .binding = binding++, + .descriptorType = vk::DescriptorType::eStorageBuffer, + .descriptorCount = 1, + .stageFlags = vk::ShaderStageFlagBits::eCompute, + }); + } if (info->has_readconst) { bindings.push_back({ .binding = binding++, diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 3728a55fb..629899a33 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -180,7 +180,6 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS info.cs_info.tgid_enable = {cs_pgm.IsTgidEnabled(0), cs_pgm.IsTgidEnabled(1), cs_pgm.IsTgidEnabled(2)}; info.cs_info.shared_memory_size = cs_pgm.SharedMemSize(); - info.cs_info.max_shared_memory_size = instance.MaxComputeSharedMemorySize(); break; } default: @@ -209,6 +208,7 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, instance.GetDriverID() == vk::DriverId::eMoltenvk, .max_viewport_width = instance.GetMaxViewportWidth(), .max_viewport_height = instance.GetMaxViewportHeight(), + .max_shared_memory_size = instance.MaxComputeSharedMemorySize(), }; auto [cache_result, cache] = instance.GetDevice().createPipelineCacheUnique({}); ASSERT_MSG(cache_result == vk::Result::eSuccess, "Failed to create pipeline cache: {}", diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index fde87fcfb..1c90c6c27 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -175,7 +175,7 @@ RenderState Rasterizer::PrepareRenderState(u32 mrt_mask) { const bool is_depth_clear = regs.depth_render_control.depth_clear_enable || texture_cache.IsMetaCleared(htile_address, slice); const bool is_stencil_clear = regs.depth_render_control.stencil_clear_enable; - ASSERT(desc.view_info.range.extent.layers == 1); + ASSERT(desc.view_info.range.extent.levels == 1); state.width = std::min(state.width, image.info.size.width); state.height = std::min(state.height, image.info.size.height); @@ -554,6 +554,21 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } } + // Bind a SSBO to act as shared memory in case of not being able to use a workgroup buffer + // (e.g. when the compute shared memory is bigger than the GPU's shared memory) + if (stage.has_emulated_shared_memory) { + const auto* lds_buf = buffer_cache.GetLdsBuffer(); + buffer_infos.emplace_back(lds_buf->Handle(), 0, lds_buf->SizeBytes()); + set_writes.push_back({ + .dstSet = VK_NULL_HANDLE, + .dstBinding = binding.unified++, + .dstArrayElement = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageBuffer, + .pBufferInfo = &buffer_infos.back(), + }); + } + // Bind the flattened user data buffer as a UBO so it's accessible to the shader if (stage.has_readconst) { const auto [vk_buffer, offset] = buffer_cache.ObtainHostUBO(stage.flattened_ud_buf); From fda8f1afa37210861c3684edc4b51c9003b7b89c Mon Sep 17 00:00:00 2001 From: Sn0wCrack <442287+Sn0wCrack@users.noreply.github.com> Date: Fri, 31 Jan 2025 23:22:57 +1100 Subject: [PATCH 195/455] feat: set desktop file name to get icon on wayland (#2299) --- src/qt_gui/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 052f73f25..36dc226ae 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -26,6 +26,8 @@ int main(int argc, char* argv[]) { QApplication a(argc, argv); + QApplication::setDesktopFileName("net.shadps4.shadPS4"); + // Load configurations and initialize Qt application const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); Config::load(user_dir / "config.toml"); From f3810cebeacbf85496b2bb153374d5fcfcdfbedf Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Fri, 31 Jan 2025 06:55:14 -0600 Subject: [PATCH 196/455] add 0.6.0 release to metainfo (#2300) --- dist/net.shadps4.shadPS4.metainfo.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dist/net.shadps4.shadPS4.metainfo.xml b/dist/net.shadps4.shadPS4.metainfo.xml index d8f51baac..c8c9d5c23 100644 --- a/dist/net.shadps4.shadPS4.metainfo.xml +++ b/dist/net.shadps4.shadPS4.metainfo.xml @@ -37,6 +37,9 @@ Game + + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.6.0 + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.5.0 From c4bfaa60312c6e224c26eca9a00b7b573253aa42 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 31 Jan 2025 15:36:14 +0100 Subject: [PATCH 197/455] Added keyboard and mouse input remapping, mouse movement to joystick logic, GUI and more (#1356) * added support for loading keyboard config from file * final minor update before pull request * fix messing up the merge * fix waitEvent to correctly handle mouse inputs * add license * Applied coding style fixes * clang-format fucked up the .ini file * actually fix clang changing ini syntax use relative path for the ini file * remove big commented out code blocks, and fixed platform-dependent code * fix windows hating me * added mouse config option * added toggle for mouse movement input (f7) * fix license and style * add numpad support i accidentally left out * added support for mouse wheel (to buttons only) * if keyboard config doesn't exist, autogenerate it * added keybinds for "walk mode" * Mouse movement input is now off by default * code cleanup and misc fixes * delete config file since it is now autogenerated * F6 = F7 + F9 * added better mouse handling with config options * Added capslock support * fix clang-format * Added support for mod key toggle key * F6 and F7 are removed, F9 captures and enables the mouse * Encapsulated globals and new classes in a new namespace * Added mouse side button support * Added per-game config * relocated input parser to the new namespace * changed parser parameters to make it possible to use it from the gui * added home, end, pgup and pgdown * Resolved merge conflict and refactored code * Updated default keybindings * Changed input handling to be single-threaded * General code cleanup * Start working on new backend * Mouse polling, CMakeLists, and basic framework * Output update handling, and reworked file creating, reading and parsing * Parsing works now * Single key button inputs work now * Axis outputs work now * Wheel works now (for me), l2/r2 handling improvements, and misc bugfixes * Downgraded prints to log_debug, and implemented input hierarchy * Implemented key toggle * Added mouse parameter parsing * clang-format * Fixed clang and added a const keyword for mac * Fix input hierarchy * Fixed joysick halfmodes, and possibly the last update on input hierarchy * clang-format * Rewrote the default config to reflect new changes * clang * Update code style * Updated sorting to accomodate for that one specific edge case * Fix default config and the latest bug with input hiearchy * Fix typo * Temporarily added my GUI * Update cmakelists * Possible fix for Gravity Rush * Update Help text, default config, and clang * Updated README with the new keybind info * okay so maybe the gravity rush fix might have slightly broken the joystick halfmode and key toggle * Fixed mistakenly overwriting the last opened config with the default one if the GUI is opened multiple times in a session * Updated Help descriptions and fixed mouse movement default parameters * Fix crash if the Help dialog was opened a second time If it's closed with the top right close button instead of clicking the Help button again, a required flag wasn't reset, making the next click on Help try to close a nonexistent window and segfault * Added closing the config also closing the Help window, and fixed more segfaults due to mismatched flags * Initial controller support * clang and debug print cleanup * Initial axis-to-button logic * Updated Help text * Added 'Reset to Default' button in GUI * Minor text and description updates + fixed an issue with Help text box rendering * Fix button-to-touchpad logic and l2/r2 handling, as they are both axes and buttons The touchpad's button state was correctly handled, so games that use that were fine, but the touchDown flag was always set to true, so games that use this flag had problems, like Gravity Rush * Fix merge conflict * Clang * Added back back button to touchpad binding * Added touchpad button handling * Added end-of-line comments and fixed some crashes happening with the VS debugger * Apply recent changes from kbm-only * Deadzone + initial directional axis-to-button mapping * Added that one missing space in the README. Are you all happy now? * Fixups from making everything use SDL * Revert directional joystick code and fix a memory leak * Change config directory name again to conform to project standards * Clang * Revert the old deeadzone code and properly add the new one * Clang --- CMakeLists.txt | 8 + README.md | 56 +-- src/common/config.cpp | 121 +++++- src/common/config.h | 5 +- src/core/libraries/pad/pad.cpp | 8 +- src/imgui/renderer/imgui_core.cpp | 2 +- src/input/input_handler.cpp | 676 ++++++++++++++++++++++++++++++ src/input/input_handler.h | 407 ++++++++++++++++++ src/input/input_mouse.cpp | 74 ++++ src/input/input_mouse.h | 18 + src/qt_gui/kbm_config_dialog.cpp | 237 +++++++++++ src/qt_gui/kbm_config_dialog.h | 38 ++ src/qt_gui/kbm_help_dialog.cpp | 112 +++++ src/qt_gui/kbm_help_dialog.h | 169 ++++++++ src/qt_gui/main_window.cpp | 10 + src/sdl_window.cpp | 336 +++++---------- src/sdl_window.h | 5 +- 17 files changed, 1996 insertions(+), 286 deletions(-) create mode 100644 src/input/input_handler.cpp create mode 100644 src/input/input_handler.h create mode 100644 src/input/input_mouse.cpp create mode 100644 src/input/input_mouse.h create mode 100644 src/qt_gui/kbm_config_dialog.cpp create mode 100644 src/qt_gui/kbm_config_dialog.h create mode 100644 src/qt_gui/kbm_help_dialog.cpp create mode 100644 src/qt_gui/kbm_help_dialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e10fcfb98..4822658c6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -854,6 +854,10 @@ set(IMGUI src/imgui/imgui_config.h set(INPUT src/input/controller.cpp src/input/controller.h + src/input/input_handler.cpp + src/input/input_handler.h + src/input/input_mouse.cpp + src/input/input_mouse.h ) set(EMULATOR src/emulator.cpp @@ -903,6 +907,10 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/trophy_viewer.h src/qt_gui/elf_viewer.cpp src/qt_gui/elf_viewer.h + src/qt_gui/kbm_config_dialog.cpp + src/qt_gui/kbm_config_dialog.h + src/qt_gui/kbm_help_dialog.cpp + src/qt_gui/kbm_help_dialog.h src/qt_gui/main_window_themes.cpp src/qt_gui/main_window_themes.h src/qt_gui/settings_dialog.cpp diff --git a/README.md b/README.md index 30efeb263..0e5ba7e39 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Check the build instructions for [**macOS**](https://github.com/shadps4-emu/shad For more information on how to test, debug and report issues with the emulator or games, read the [**Debugging documentation**](https://github.com/shadps4-emu/shadPS4/blob/main/documents/Debugging/Debugging.md). -# Keyboard mapping +# Keyboard and Mouse Mappings > [!NOTE] > Some keyboards may also require you to hold the Fn key to use the F\* keys. Mac users should use the Command key instead of Control, and need to use Command+F11 for full screen to avoid conflicting with system key bindings. @@ -92,32 +92,34 @@ F12 | Trigger RenderDoc Capture > [!NOTE] > Xbox and DualShock controllers work out of the box. -| Controller button | Keyboard equivalent | -|-------------|-------------| -LEFT AXIS UP | W | -LEFT AXIS DOWN | S | -LEFT AXIS LEFT | A | -LEFT AXIS RIGHT | D | -RIGHT AXIS UP | I | -RIGHT AXIS DOWN | K | -RIGHT AXIS LEFT | J | -RIGHT AXIS RIGHT | L | -TRIANGLE | Numpad 8 or C | -CIRCLE | Numpad 6 or B | -CROSS | Numpad 2 or N | -SQUARE | Numpad 4 or V | -PAD UP | UP | -PAD DOWN | DOWN | -PAD LEFT | LEFT | -PAD RIGHT | RIGHT | -OPTIONS | RETURN | -BACK BUTTON / TOUCH PAD | SPACE | -L1 | Q | -R1 | U | -L2 | E | -R2 | O | -L3 | X | -R3 | M | +The default controls are inspired by the *Elden Ring* PC controls. Inputs support up to three keys per binding, mouse buttons, mouse movement mapped to joystick input, and more. + +| Action | Default Key(s) | +|-------------|-----------------------------| +| Triangle | F | +| Circle | Space | +| Cross | E | +| Square | R | +| Pad Up | W, LAlt / Mouse Wheel Up | +| Pad Down | S, LAlt / Mouse Wheel Down | +| Pad Left | A, LAlt / Mouse Wheel Left | +| Pad Right | D, LAlt / Mouse Wheel Right | +| L1 | Right Button, LShift | +| R1 | Left Button | +| L2 | Right Button | +| R2 | Left Button, LShift | +| L3 | X | +| R3 | Q / Middle Button | +| Options | Escape | +| Touchpad | G | + +| Joystick | Default Input | +|--------------------|----------------| +| Left Joystick | WASD | +| Right Joystick | Mouse movement | + +Keyboard and mouse inputs can be customized in the settings menu by clicking the Controller button, and further details and help on controls are also found there. Custom bindings are saved per-game. + # Main team diff --git a/src/common/config.cpp b/src/common/config.cpp index 70b062951..e79a52796 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -46,8 +46,6 @@ static std::string logType = "async"; static std::string userName = "shadPS4"; static std::string updateChannel; static std::string chooseHomeTab; -static u16 deadZoneLeft = 2.0; -static u16 deadZoneRight = 2.0; static std::string backButtonBehavior = "left"; static bool useSpecialPad = false; static int specialPadClass = 1; @@ -151,14 +149,6 @@ bool getEnableDiscordRPC() { return enableDiscordRPC; } -u16 leftDeadZone() { - return deadZoneLeft; -} - -u16 rightDeadZone() { - return deadZoneRight; -} - s16 getCursorState() { return cursorState; } @@ -661,8 +651,6 @@ void load(const std::filesystem::path& path) { if (data.contains("Input")) { const toml::value& input = data.at("Input"); - deadZoneLeft = toml::find_or(input, "deadZoneLeft", 2.0); - deadZoneRight = toml::find_or(input, "deadZoneRight", 2.0); cursorState = toml::find_or(input, "cursorState", HideCursorState::Idle); cursorHideTimeout = toml::find_or(input, "cursorHideTimeout", 5); backButtonBehavior = toml::find_or(input, "backButtonBehavior", "left"); @@ -785,8 +773,6 @@ void save(const std::filesystem::path& path) { data["General"]["separateUpdateEnabled"] = separateupdatefolder; data["General"]["compatibilityEnabled"] = compatibilityData; data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup; - data["Input"]["deadZoneLeft"] = deadZoneLeft; - data["Input"]["deadZoneRight"] = deadZoneRight; data["Input"]["cursorState"] = cursorState; data["Input"]["cursorHideTimeout"] = cursorHideTimeout; data["Input"]["backButtonBehavior"] = backButtonBehavior; @@ -919,4 +905,109 @@ void setDefaultValues() { checkCompatibilityOnStartup = false; } -} // namespace Config \ No newline at end of file +constexpr std::string_view GetDefaultKeyboardConfig() { + return R"(#Feeling lost? Check out the Help section! + +#Keyboard bindings + +triangle = f +circle = space +cross = e +square = r + +pad_up = w, lalt +pad_up = mousewheelup +pad_down = s, lalt +pad_down = mousewheeldown +pad_left = a, lalt +pad_left = mousewheelleft +pad_right = d, lalt +pad_right = mousewheelright + +l1 = rightbutton, lshift +r1 = leftbutton +l2 = rightbutton +r2 = leftbutton, lshift +l3 = x +r3 = q +r3 = middlebutton + +options = escape +touchpad = g + +key_toggle = i, lalt +mouse_to_joystick = right +mouse_movement_params = 0.5, 1, 0.125 +leftjoystick_halfmode = lctrl + +axis_left_x_minus = a +axis_left_x_plus = d +axis_left_y_minus = w +axis_left_y_plus = s + +#Controller bindings + +triangle = triangle +cross = cross +square = square +circle = circle + +l1 = l1 +l2 = l2 +l3 = l3 +r1 = r1 +r2 = r2 +r3 = r3 + +pad_up = pad_up +pad_down = pad_down +pad_left = pad_left +pad_right = pad_right + +options = options +touchpad = back + +axis_left_x = axis_left_x +axis_left_y = axis_left_y + +axis_right_x = axis_right_x +axis_right_y = axis_right_y +)"; +} +std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id) { + // Read configuration file of the game, and if it doesn't exist, generate it from default + // If that doesn't exist either, generate that from getDefaultConfig() and try again + // If even the folder is missing, we start with that. + + const auto config_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "input_config"; + const auto config_file = config_dir / (game_id + ".ini"); + const auto default_config_file = config_dir / "default.ini"; + + // Ensure the config directory exists + if (!std::filesystem::exists(config_dir)) { + std::filesystem::create_directories(config_dir); + } + + // Check if the default config exists + if (!std::filesystem::exists(default_config_file)) { + // If the default config is also missing, create it from getDefaultConfig() + const auto default_config = GetDefaultKeyboardConfig(); + std::ofstream default_config_stream(default_config_file); + if (default_config_stream) { + default_config_stream << default_config; + } + } + + // if empty, we only need to execute the function up until this point + if (game_id.empty()) { + return default_config_file; + } + + // If game-specific config doesn't exist, create it from the default config + if (!std::filesystem::exists(config_file)) { + std::filesystem::copy(default_config_file, config_file); + } + return config_file; +} + +} // namespace Config diff --git a/src/common/config.h b/src/common/config.h index 356cf77fc..f726f840c 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -37,8 +37,6 @@ std::string getUserName(); std::string getUpdateChannel(); std::string getChooseHomeTab(); -u16 leftDeadZone(); -u16 rightDeadZone(); s16 getCursorState(); int getCursorHideTimeout(); std::string getBackButtonBehavior(); @@ -152,6 +150,9 @@ std::string getEmulatorLanguage(); void setDefaultValues(); +// todo: name and function location pending +std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id = ""); + // settings u32 GetLanguage(); }; // namespace Config diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index 18709bcb2..173b78382 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -95,8 +95,8 @@ int PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadControllerIn pInfo->touchPadInfo.pixelDensity = 1; pInfo->touchPadInfo.resolution.x = 1920; pInfo->touchPadInfo.resolution.y = 950; - pInfo->stickInfo.deadZoneLeft = Config::leftDeadZone(); - pInfo->stickInfo.deadZoneRight = Config::rightDeadZone(); + pInfo->stickInfo.deadZoneLeft = 1; + pInfo->stickInfo.deadZoneRight = 1; pInfo->connectionType = ORBIS_PAD_PORT_TYPE_STANDARD; pInfo->connectedCount = 1; pInfo->connected = false; @@ -106,8 +106,8 @@ int PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadControllerIn pInfo->touchPadInfo.pixelDensity = 1; pInfo->touchPadInfo.resolution.x = 1920; pInfo->touchPadInfo.resolution.y = 950; - pInfo->stickInfo.deadZoneLeft = Config::leftDeadZone(); - pInfo->stickInfo.deadZoneRight = Config::rightDeadZone(); + pInfo->stickInfo.deadZoneLeft = 1; + pInfo->stickInfo.deadZoneRight = 1; pInfo->connectionType = ORBIS_PAD_PORT_TYPE_STANDARD; pInfo->connectedCount = 1; pInfo->connected = true; diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index d9530dd70..ab43b281e 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -148,7 +148,7 @@ bool ProcessEvent(SDL_Event* event) { case SDL_EVENT_MOUSE_BUTTON_DOWN: { const auto& io = GetIO(); return io.WantCaptureMouse && io.Ctx->NavWindow != nullptr && - io.Ctx->NavWindow->ID != dock_id; + (io.Ctx->NavWindow->Flags & ImGuiWindowFlags_NoNav) == 0; } case SDL_EVENT_TEXT_INPUT: case SDL_EVENT_KEY_DOWN: { diff --git a/src/input/input_handler.cpp b/src/input/input_handler.cpp new file mode 100644 index 000000000..a78a54131 --- /dev/null +++ b/src/input/input_handler.cpp @@ -0,0 +1,676 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "input_handler.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SDL3/SDL_events.h" +#include "SDL3/SDL_timer.h" + +#include "common/config.h" +#include "common/elf_info.h" +#include "common/io_file.h" +#include "common/path_util.h" +#include "common/version.h" +#include "input/controller.h" +#include "input/input_mouse.h" + +namespace Input { +/* +Project structure: +n to m connection between inputs and outputs +Keyup and keydown events update a dynamic list* of u32 'flags' (what is currently in the list is +'pressed') On every event, after flag updates, we check for every input binding -> controller output +pair if all their flags are 'on' If not, disable; if so, enable them. For axes, we gather their data +into a struct cumulatively from all inputs, then after we checked all of those, we update them all +at once. Wheel inputs generate a timer that doesn't turn off their outputs automatically, but push a +userevent to do so. + +What structs are needed? +InputBinding(key1, key2, key3) +ControllerOutput(button, axis) - we only need a const array of these, and one of the attr-s is +always 0 BindingConnection(inputBinding (member), controllerOutput (ref to the array element)) + +Things to always test before pushing like a dumbass: +Button outputs +Axis outputs +Input hierarchy +Multi key inputs +Mouse to joystick +Key toggle +Joystick halfmode + +Don't be an idiot and test only the changed part expecting everything else to not be broken +*/ + +bool leftjoystick_halfmode = false, rightjoystick_halfmode = false; +int leftjoystick_deadzone, rightjoystick_deadzone, lefttrigger_deadzone, righttrigger_deadzone; + +std::list> pressed_keys; +std::list toggled_keys; +static std::vector connections; + +auto output_array = std::array{ + // Important: these have to be the first, or else they will update in the wrong order + ControllerOutput(LEFTJOYSTICK_HALFMODE), + ControllerOutput(RIGHTJOYSTICK_HALFMODE), + ControllerOutput(KEY_TOGGLE), + + // Button mappings + ControllerOutput(SDL_GAMEPAD_BUTTON_NORTH), // Triangle + ControllerOutput(SDL_GAMEPAD_BUTTON_EAST), // Circle + ControllerOutput(SDL_GAMEPAD_BUTTON_SOUTH), // Cross + ControllerOutput(SDL_GAMEPAD_BUTTON_WEST), // Square + ControllerOutput(SDL_GAMEPAD_BUTTON_LEFT_SHOULDER), // L1 + ControllerOutput(SDL_GAMEPAD_BUTTON_LEFT_STICK), // L3 + ControllerOutput(SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER), // R1 + ControllerOutput(SDL_GAMEPAD_BUTTON_RIGHT_STICK), // R3 + ControllerOutput(SDL_GAMEPAD_BUTTON_START), // Options + ControllerOutput(SDL_GAMEPAD_BUTTON_TOUCHPAD), // TouchPad + ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_UP), // Up + ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_DOWN), // Down + ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_LEFT), // Left + ControllerOutput(SDL_GAMEPAD_BUTTON_DPAD_RIGHT), // Right + + // Axis mappings + // ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_LEFTX, false), + // ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_LEFTY, false), + // ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_RIGHTX, false), + // ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_RIGHTY, false), + ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_LEFTX), + ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_LEFTY), + ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_RIGHTX), + ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_RIGHTY), + + ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_LEFT_TRIGGER), + ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER), + + ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, SDL_GAMEPAD_AXIS_INVALID), +}; + +void ControllerOutput::LinkJoystickAxes() { + // for (int i = 17; i < 23; i += 2) { + // delete output_array[i].new_param; + // output_array[i].new_param = output_array[i + 1].new_param; + // } +} + +static OrbisPadButtonDataOffset SDLGamepadToOrbisButton(u8 button) { + using OPBDO = OrbisPadButtonDataOffset; + + switch (button) { + case SDL_GAMEPAD_BUTTON_DPAD_DOWN: + return OPBDO::Down; + case SDL_GAMEPAD_BUTTON_DPAD_UP: + return OPBDO::Up; + case SDL_GAMEPAD_BUTTON_DPAD_LEFT: + return OPBDO::Left; + case SDL_GAMEPAD_BUTTON_DPAD_RIGHT: + return OPBDO::Right; + case SDL_GAMEPAD_BUTTON_SOUTH: + return OPBDO::Cross; + case SDL_GAMEPAD_BUTTON_NORTH: + return OPBDO::Triangle; + case SDL_GAMEPAD_BUTTON_WEST: + return OPBDO::Square; + case SDL_GAMEPAD_BUTTON_EAST: + return OPBDO::Circle; + case SDL_GAMEPAD_BUTTON_START: + return OPBDO::Options; + case SDL_GAMEPAD_BUTTON_TOUCHPAD: + return OPBDO::TouchPad; + case SDL_GAMEPAD_BUTTON_BACK: + return OPBDO::TouchPad; + case SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: + return OPBDO::L1; + case SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: + return OPBDO::R1; + case SDL_GAMEPAD_BUTTON_LEFT_STICK: + return OPBDO::L3; + case SDL_GAMEPAD_BUTTON_RIGHT_STICK: + return OPBDO::R3; + default: + return OPBDO::None; + } +} + +Axis GetAxisFromSDLAxis(u8 sdl_axis) { + switch (sdl_axis) { + case SDL_GAMEPAD_AXIS_LEFTX: + return Axis::LeftX; + case SDL_GAMEPAD_AXIS_LEFTY: + return Axis::LeftY; + case SDL_GAMEPAD_AXIS_RIGHTX: + return Axis::RightX; + case SDL_GAMEPAD_AXIS_RIGHTY: + return Axis::RightY; + case SDL_GAMEPAD_AXIS_LEFT_TRIGGER: + return Axis::TriggerLeft; + case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: + return Axis::TriggerRight; + default: + return Axis::AxisMax; + } +} + +// syntax: 'name, name,name' or 'name,name' or 'name' +InputBinding GetBindingFromString(std::string& line) { + std::array keys = {InputID(), InputID(), InputID()}; + + // Check and process tokens + for (const auto token : std::views::split(line, ',')) { // Split by comma + const std::string t(token.begin(), token.end()); + InputID input; + + if (string_to_keyboard_key_map.find(t) != string_to_keyboard_key_map.end()) { + input = InputID(InputType::KeyboardMouse, string_to_keyboard_key_map.at(t)); + } else if (string_to_axis_map.find(t) != string_to_axis_map.end()) { + input = InputID(InputType::Axis, (u32)string_to_axis_map.at(t).axis); + } else if (string_to_cbutton_map.find(t) != string_to_cbutton_map.end()) { + input = InputID(InputType::Controller, string_to_cbutton_map.at(t)); + } else { + // Invalid token found; return default binding + LOG_DEBUG(Input, "Invalid token found: {}", t); + return InputBinding(); + } + + // Assign to the first available slot + for (auto& key : keys) { + if (!key.IsValid()) { + key = input; + break; + } + } + } + LOG_DEBUG(Input, "Parsed line: {}", InputBinding(keys[0], keys[1], keys[2]).ToString()); + return InputBinding(keys[0], keys[1], keys[2]); +} + +void ParseInputConfig(const std::string game_id = "") { + const auto config_file = Config::GetFoolproofKbmConfigFile(game_id); + + if (game_id == "") { + return; + } + + // we reset these here so in case the user fucks up or doesn't include some of these, + // we can fall back to default + connections.clear(); + float mouse_deadzone_offset = 0.5; + float mouse_speed = 1; + float mouse_speed_offset = 0.125; + + leftjoystick_deadzone = 1; + rightjoystick_deadzone = 1; + lefttrigger_deadzone = 1; + righttrigger_deadzone = 1; + + int lineCount = 0; + + std::ifstream file(config_file); + std::string line = ""; + while (std::getline(file, line)) { + lineCount++; + + // Strip the ; and whitespace + line.erase(std::remove_if(line.begin(), line.end(), + [](unsigned char c) { return std::isspace(c); }), + line.end()); + + if (line.empty()) { + continue; + } + // Truncate lines starting at # + std::size_t comment_pos = line.find('#'); + if (comment_pos != std::string::npos) { + line = line.substr(0, comment_pos); + } + // Remove trailing semicolon + if (!line.empty() && line[line.length() - 1] == ';') { + line = line.substr(0, line.length() - 1); + } + if (line.empty()) { + continue; + } + + // Split the line by '=' + std::size_t equal_pos = line.find('='); + if (equal_pos == std::string::npos) { + LOG_WARNING(Input, "Invalid format at line: {}, data: \"{}\", skipping line.", + lineCount, line); + continue; + } + + std::string output_string = line.substr(0, equal_pos); + std::string input_string = line.substr(equal_pos + 1); + std::size_t comma_pos = input_string.find(','); + + if (output_string == "mouse_to_joystick") { + if (input_string == "left") { + SetMouseToJoystick(1); + } else if (input_string == "right") { + SetMouseToJoystick(2); + } else { + LOG_WARNING(Input, "Invalid argument for mouse-to-joystick binding"); + SetMouseToJoystick(0); + } + continue; + } else if (output_string == "key_toggle") { + if (comma_pos != std::string::npos) { + // handle key-to-key toggling (separate list?) + InputBinding toggle_keys = GetBindingFromString(input_string); + if (toggle_keys.KeyCount() != 2) { + LOG_WARNING(Input, + "Syntax error: Please provide exactly 2 keys: " + "first is the toggler, the second is the key to toggle: {}", + line); + continue; + } + ControllerOutput* toggle_out = + &*std::ranges::find(output_array, ControllerOutput(KEY_TOGGLE)); + BindingConnection toggle_connection = BindingConnection( + InputBinding(toggle_keys.keys[0]), toggle_out, 0, toggle_keys.keys[1]); + connections.insert(connections.end(), toggle_connection); + continue; + } + LOG_WARNING(Input, "Invalid format at line: {}, data: \"{}\", skipping line.", + lineCount, line); + continue; + } else if (output_string == "mouse_movement_params") { + std::stringstream ss(input_string); + char comma; // To hold the comma separators between the floats + ss >> mouse_deadzone_offset >> comma >> mouse_speed >> comma >> mouse_speed_offset; + + // Check for invalid input (in case there's an unexpected format) + if (ss.fail()) { + LOG_WARNING(Input, "Failed to parse mouse movement parameters from line: {}", line); + continue; + } + SetMouseParams(mouse_deadzone_offset, mouse_speed, mouse_speed_offset); + continue; + } else if (output_string == "analog_deadzone") { + std::stringstream ss(input_string); + std::string device; + int deadzone; + std::getline(ss, device, ','); + ss >> deadzone; + if (ss.fail()) { + LOG_WARNING(Input, "Failed to parse deadzone config from line: {}", line); + continue; + } else { + LOG_DEBUG(Input, "Parsed deadzone: {} {}", device, deadzone); + } + if (device == "leftjoystick") { + leftjoystick_deadzone = deadzone; + } else if (device == "rightjoystick") { + rightjoystick_deadzone = deadzone; + } else if (device == "l2") { + lefttrigger_deadzone = deadzone; + } else if (device == "r2") { + righttrigger_deadzone = deadzone; + } else { + LOG_WARNING(Input, "Invalid axis name at line: {}, data: \"{}\", skipping line.", + lineCount, line); + } + continue; + } + + // normal cases + InputBinding binding = GetBindingFromString(input_string); + BindingConnection connection(InputID(), nullptr); + auto button_it = string_to_cbutton_map.find(output_string); + auto axis_it = string_to_axis_map.find(output_string); + + if (binding.IsEmpty()) { + LOG_WARNING(Input, "Invalid format at line: {}, data: \"{}\", skipping line.", + lineCount, line); + continue; + } + if (button_it != string_to_cbutton_map.end()) { + connection = BindingConnection( + binding, &*std::ranges::find(output_array, ControllerOutput(button_it->second))); + connections.insert(connections.end(), connection); + + } else if (axis_it != string_to_axis_map.end()) { + int value_to_set = binding.keys[2].type == InputType::Axis ? 0 : axis_it->second.value; + connection = BindingConnection( + binding, + &*std::ranges::find(output_array, ControllerOutput(SDL_GAMEPAD_BUTTON_INVALID, + axis_it->second.axis, + axis_it->second.value >= 0)), + value_to_set); + connections.insert(connections.end(), connection); + } else { + LOG_WARNING(Input, "Invalid format at line: {}, data: \"{}\", skipping line.", + lineCount, line); + continue; + } + LOG_DEBUG(Input, "Succesfully parsed line {}", lineCount); + } + file.close(); + std::sort(connections.begin(), connections.end()); + for (auto& c : connections) { + LOG_DEBUG(Input, "Binding: {} : {}", c.output->ToString(), c.binding.ToString()); + } + LOG_DEBUG(Input, "Done parsing the input config!"); +} + +u32 GetMouseWheelEvent(const SDL_Event& event) { + if (event.type != SDL_EVENT_MOUSE_WHEEL && event.type != SDL_EVENT_MOUSE_WHEEL_OFF) { + LOG_WARNING(Input, "Something went wrong with wheel input parsing!"); + return (u32)-1; + } + if (event.wheel.y > 0) { + return SDL_MOUSE_WHEEL_UP; + } else if (event.wheel.y < 0) { + return SDL_MOUSE_WHEEL_DOWN; + } else if (event.wheel.x > 0) { + return SDL_MOUSE_WHEEL_RIGHT; + } else if (event.wheel.x < 0) { + return SDL_MOUSE_WHEEL_LEFT; + } + return (u32)-1; +} + +InputEvent InputBinding::GetInputEventFromSDLEvent(const SDL_Event& e) { + switch (e.type) { + case SDL_EVENT_KEY_DOWN: + case SDL_EVENT_KEY_UP: + return InputEvent(InputType::KeyboardMouse, e.key.key, e.key.down, 0); + case SDL_EVENT_MOUSE_BUTTON_DOWN: + case SDL_EVENT_MOUSE_BUTTON_UP: + return InputEvent(InputType::KeyboardMouse, (u32)e.button.button, e.button.down, 0); + case SDL_EVENT_MOUSE_WHEEL: + case SDL_EVENT_MOUSE_WHEEL_OFF: + return InputEvent(InputType::KeyboardMouse, GetMouseWheelEvent(e), + e.type == SDL_EVENT_MOUSE_WHEEL, 0); + case SDL_EVENT_GAMEPAD_BUTTON_DOWN: + case SDL_EVENT_GAMEPAD_BUTTON_UP: + return InputEvent(InputType::Controller, (u32)e.gbutton.button, e.gbutton.down, 0); + case SDL_EVENT_GAMEPAD_AXIS_MOTION: + return InputEvent(InputType::Axis, (u32)e.gaxis.axis, true, e.gaxis.value / 256); + default: + return InputEvent(); + } +} + +GameController* ControllerOutput::controller = nullptr; +void ControllerOutput::SetControllerOutputController(GameController* c) { + ControllerOutput::controller = c; +} + +void ToggleKeyInList(InputID input) { + if (input.type == InputType::Axis) { + LOG_ERROR(Input, "Toggling analog inputs is not supported!"); + return; + } + auto it = std::find(toggled_keys.begin(), toggled_keys.end(), input); + if (it == toggled_keys.end()) { + toggled_keys.insert(toggled_keys.end(), input); + LOG_DEBUG(Input, "Added {} to toggled keys", input.ToString()); + } else { + toggled_keys.erase(it); + LOG_DEBUG(Input, "Removed {} from toggled keys", input.ToString()); + } +} + +void ControllerOutput::ResetUpdate() { + state_changed = false; + new_button_state = false; + *new_param = 0; // bruh +} +void ControllerOutput::AddUpdate(InputEvent event) { + state_changed = true; + if (button == KEY_TOGGLE) { + if (event.active) { + ToggleKeyInList(event.input); + } + } else if (button != SDL_GAMEPAD_BUTTON_INVALID) { + if (event.input.type == InputType::Axis) { + bool temp = event.axis_value * (positive_axis ? 1 : -1) > 0x40; + new_button_state |= event.active && event.axis_value * (positive_axis ? 1 : -1) > 0x40; + if (temp) { + LOG_DEBUG(Input, "Toggled a button from an axis"); + } + } else { + new_button_state |= event.active; + } + + } else if (axis != SDL_GAMEPAD_AXIS_INVALID) { + switch (axis) { + case SDL_GAMEPAD_AXIS_LEFT_TRIGGER: + case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: + // if it's a button input, then we know the value to set, so the param is 0. + // if it's an analog input, then the param isn't 0 + *new_param = (event.active ? event.axis_value : 0) + *new_param; + break; + default: + *new_param = (event.active ? event.axis_value : 0) + *new_param; + break; + } + } +} +void ControllerOutput::FinalizeUpdate() { + if (!state_changed) { + // return; + } + + old_button_state = new_button_state; + old_param = *new_param; + float touchpad_x = 0; + if (button != SDL_GAMEPAD_BUTTON_INVALID) { + switch (button) { + case SDL_GAMEPAD_BUTTON_TOUCHPAD: + touchpad_x = Config::getBackButtonBehavior() == "left" ? 0.25f + : Config::getBackButtonBehavior() == "right" ? 0.75f + : 0.5f; + controller->SetTouchpadState(0, new_button_state, touchpad_x, 0.5f); + controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state); + break; + case LEFTJOYSTICK_HALFMODE: + leftjoystick_halfmode = new_button_state; + break; + case RIGHTJOYSTICK_HALFMODE: + rightjoystick_halfmode = new_button_state; + break; + // KEY_TOGGLE isn't handled here anymore, as this function doesn't have the necessary data + // to do it, and it would be inconvenient to force it here, when AddUpdate does the job just + // fine, and a toggle doesn't have to checked against every input that's bound to it, it's + // enough that one is pressed + default: // is a normal key (hopefully) + controller->CheckButton(0, SDLGamepadToOrbisButton(button), new_button_state); + break; + } + } else if (axis != SDL_GAMEPAD_AXIS_INVALID && positive_axis) { + // avoid double-updating axes, but don't skip directional button bindings + float multiplier = 1.0; + int deadzone = 0; + auto ApplyDeadzone = [](s16* value, int deadzone) { + if (std::abs(*value) <= deadzone) { + *value = 0; + } + }; + Axis c_axis = GetAxisFromSDLAxis(axis); + switch (c_axis) { + case Axis::LeftX: + case Axis::LeftY: + ApplyDeadzone(new_param, leftjoystick_deadzone); + multiplier = leftjoystick_halfmode ? 0.5 : 1.0; + break; + case Axis::RightX: + case Axis::RightY: + ApplyDeadzone(new_param, rightjoystick_deadzone); + multiplier = rightjoystick_halfmode ? 0.5 : 1.0; + break; + case Axis::TriggerLeft: + ApplyDeadzone(new_param, lefttrigger_deadzone); + controller->Axis(0, c_axis, GetAxis(0x0, 0x80, *new_param)); + controller->CheckButton(0, OrbisPadButtonDataOffset::L2, *new_param > 0x20); + return; + case Axis::TriggerRight: + ApplyDeadzone(new_param, righttrigger_deadzone); + controller->Axis(0, c_axis, GetAxis(0x0, 0x80, *new_param)); + controller->CheckButton(0, OrbisPadButtonDataOffset::R2, *new_param > 0x20); + return; + default: + break; + } + controller->Axis(0, c_axis, GetAxis(-0x80, 0x80, *new_param * multiplier)); + } +} + +// Updates the list of pressed keys with the given input. +// Returns whether the list was updated or not. +bool UpdatePressedKeys(InputEvent event) { + // Skip invalid inputs + InputID input = event.input; + if (input.sdl_id == (u32)-1) { + return false; + } + if (input.type == InputType::Axis) { + // analog input, it gets added when it first sends an event, + // and from there, it only changes the parameter + auto it = std::lower_bound(pressed_keys.begin(), pressed_keys.end(), input, + [](const std::pair& e, InputID i) { + return std::tie(e.first.input.type, e.first.input.sdl_id) < + std::tie(i.type, i.sdl_id); + }); + if (it == pressed_keys.end() || it->first.input != input) { + pressed_keys.insert(it, {event, false}); + LOG_DEBUG(Input, "Added axis {} to the input list", event.input.sdl_id); + } else { + it->first.axis_value = event.axis_value; + } + return true; + } else if (event.active) { + // Find the correct position for insertion to maintain order + auto it = std::lower_bound(pressed_keys.begin(), pressed_keys.end(), input, + [](const std::pair& e, InputID i) { + return std::tie(e.first.input.type, e.first.input.sdl_id) < + std::tie(i.type, i.sdl_id); + }); + + // Insert only if 'value' is not already in the list + if (it == pressed_keys.end() || it->first.input != input) { + pressed_keys.insert(it, {event, false}); + return true; + } + } else { + // Remove 'value' from the list if it's not pressed + auto it = std::find_if( + pressed_keys.begin(), pressed_keys.end(), + [input](const std::pair& e) { return e.first.input == input; }); + if (it != pressed_keys.end()) { + pressed_keys.erase(it); + return true; + } + } + LOG_DEBUG(Input, "No change was made!"); + return false; +} +// Check if the binding's all keys are currently active. +// It also extracts the analog inputs' parameters, and updates the input hierarchy flags. +InputEvent BindingConnection::ProcessBinding() { + // the last key is always set (if the connection isn't empty), + // and the analog inputs are always the last one due to how they are sorted, + // so this signifies whether or not the input is analog + InputEvent event = InputEvent(binding.keys[0]); + if (pressed_keys.empty()) { + return event; + } + if (event.input.type != InputType::Axis) { + // for button inputs + event.axis_value = axis_param; + } + // it's a bit scuffed, but if the output is a toggle, then we put the key here + if (output->button == KEY_TOGGLE) { + event.input = toggle; + } + + // Extract keys from InputBinding and ignore unused or toggled keys + std::list input_keys = {binding.keys[0], binding.keys[1], binding.keys[2]}; + input_keys.remove(InputID()); + for (auto key = input_keys.begin(); key != input_keys.end();) { + if (std::find(toggled_keys.begin(), toggled_keys.end(), *key) != toggled_keys.end()) { + key = input_keys.erase(key); // Use the returned iterator + } else { + ++key; // Increment only if no erase happened + } + } + if (input_keys.empty()) { + LOG_DEBUG(Input, "No actual inputs to check, returning true"); + event.active = true; + return event; + } + + // Iterator for pressed_keys, starting from the beginning + auto pressed_it = pressed_keys.begin(); + + // Store pointers to flags in pressed_keys that need to be set if all keys are active + std::list flags_to_set; + + // Check if all keys in input_keys are active + for (InputID key : input_keys) { + bool key_found = false; + + while (pressed_it != pressed_keys.end()) { + if (pressed_it->first.input == key && (pressed_it->second == false)) { + key_found = true; + if (output->positive_axis) { + flags_to_set.push_back(&pressed_it->second); + } + if (pressed_it->first.input.type == InputType::Axis) { + event.axis_value = pressed_it->first.axis_value; + } + ++pressed_it; + break; + } + ++pressed_it; + } + if (!key_found) { + return event; + } + } + + for (bool* flag : flags_to_set) { + *flag = true; + } + if (binding.keys[0].type != InputType::Axis) { // the axes spam inputs, making this unreadable + LOG_DEBUG(Input, "Input found: {}", binding.ToString()); + } + event.active = true; + return event; // All keys are active +} + +void ActivateOutputsFromInputs() { + // Reset values and flags + for (auto& it : pressed_keys) { + it.second = false; + } + for (auto& it : output_array) { + it.ResetUpdate(); + } + + // Iterate over all inputs, and update their respecive outputs accordingly + for (auto& it : connections) { + it.output->AddUpdate(it.ProcessBinding()); + } + + // Update all outputs + for (auto& it : output_array) { + it.FinalizeUpdate(); + } +} + +} // namespace Input diff --git a/src/input/input_handler.h b/src/input/input_handler.h new file mode 100644 index 000000000..0178e7937 --- /dev/null +++ b/src/input/input_handler.h @@ -0,0 +1,407 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include + +#include "SDL3/SDL_events.h" +#include "SDL3/SDL_timer.h" + +#include "common/logging/log.h" +#include "common/types.h" +#include "core/libraries/pad/pad.h" +#include "fmt/format.h" +#include "input/controller.h" + +// +1 and +2 is taken +#define SDL_MOUSE_WHEEL_UP SDL_EVENT_MOUSE_WHEEL + 3 +#define SDL_MOUSE_WHEEL_DOWN SDL_EVENT_MOUSE_WHEEL + 4 +#define SDL_MOUSE_WHEEL_LEFT SDL_EVENT_MOUSE_WHEEL + 5 +#define SDL_MOUSE_WHEEL_RIGHT SDL_EVENT_MOUSE_WHEEL + 7 + +// idk who already used what where so I just chose a big number +#define SDL_EVENT_MOUSE_WHEEL_OFF SDL_EVENT_USER + 10 + +#define LEFTJOYSTICK_HALFMODE 0x00010000 +#define RIGHTJOYSTICK_HALFMODE 0x00020000 +#define BACK_BUTTON 0x00040000 + +#define KEY_TOGGLE 0x00200000 + +namespace Input { +using Input::Axis; +using Libraries::Pad::OrbisPadButtonDataOffset; + +struct AxisMapping { + u32 axis; + s16 value; + AxisMapping(SDL_GamepadAxis a, s16 v) : axis(a), value(v) {} +}; + +enum class InputType { Axis, KeyboardMouse, Controller, Count }; +const std::array input_type_names = {"Axis", "KBM", "Controller", "Unknown"}; + +class InputID { +public: + InputType type; + u32 sdl_id; + InputID(InputType d = InputType::Count, u32 i = (u32)-1) : type(d), sdl_id(i) {} + bool operator==(const InputID& o) const { + return type == o.type && sdl_id == o.sdl_id; + } + bool operator!=(const InputID& o) const { + return type != o.type || sdl_id != o.sdl_id; + } + bool operator<=(const InputID& o) const { + return type <= o.type && sdl_id <= o.sdl_id; + } + bool IsValid() const { + return *this != InputID(); + } + std::string ToString() { + return fmt::format("({}: {:x})", input_type_names[(u8)type], sdl_id); + } +}; + +class InputEvent { +public: + InputID input; + bool active; + s8 axis_value; + + InputEvent(InputID i = InputID(), bool a = false, s8 v = 0) + : input(i), active(a), axis_value(v) {} + InputEvent(InputType d, u32 i, bool a = false, s8 v = 0) + : input(d, i), active(a), axis_value(v) {} +}; + +// i strongly suggest you collapse these maps +const std::map string_to_cbutton_map = { + {"triangle", SDL_GAMEPAD_BUTTON_NORTH}, + {"circle", SDL_GAMEPAD_BUTTON_EAST}, + {"cross", SDL_GAMEPAD_BUTTON_SOUTH}, + {"square", SDL_GAMEPAD_BUTTON_WEST}, + {"l1", SDL_GAMEPAD_BUTTON_LEFT_SHOULDER}, + {"r1", SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER}, + {"l3", SDL_GAMEPAD_BUTTON_LEFT_STICK}, + {"r3", SDL_GAMEPAD_BUTTON_RIGHT_STICK}, + {"pad_up", SDL_GAMEPAD_BUTTON_DPAD_UP}, + {"pad_down", SDL_GAMEPAD_BUTTON_DPAD_DOWN}, + {"pad_left", SDL_GAMEPAD_BUTTON_DPAD_LEFT}, + {"pad_right", SDL_GAMEPAD_BUTTON_DPAD_RIGHT}, + {"options", SDL_GAMEPAD_BUTTON_START}, + + // these are outputs only (touchpad can only be bound to itself) + {"touchpad", SDL_GAMEPAD_BUTTON_TOUCHPAD}, + {"leftjoystick_halfmode", LEFTJOYSTICK_HALFMODE}, + {"rightjoystick_halfmode", RIGHTJOYSTICK_HALFMODE}, + + // this is only for input + {"back", SDL_GAMEPAD_BUTTON_BACK}, +}; + +const std::map string_to_axis_map = { + {"axis_left_x_plus", {SDL_GAMEPAD_AXIS_LEFTX, 127}}, + {"axis_left_x_minus", {SDL_GAMEPAD_AXIS_LEFTX, -127}}, + {"axis_left_y_plus", {SDL_GAMEPAD_AXIS_LEFTY, 127}}, + {"axis_left_y_minus", {SDL_GAMEPAD_AXIS_LEFTY, -127}}, + {"axis_right_x_plus", {SDL_GAMEPAD_AXIS_RIGHTX, 127}}, + {"axis_right_x_minus", {SDL_GAMEPAD_AXIS_RIGHTX, -127}}, + {"axis_right_y_plus", {SDL_GAMEPAD_AXIS_RIGHTY, 127}}, + {"axis_right_y_minus", {SDL_GAMEPAD_AXIS_RIGHTY, -127}}, + + {"l2", {SDL_GAMEPAD_AXIS_LEFT_TRIGGER, 127}}, + {"r2", {SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, 127}}, + + // should only use these to bind analog inputs to analog outputs + {"axis_left_x", {SDL_GAMEPAD_AXIS_LEFTX, 127}}, + {"axis_left_y", {SDL_GAMEPAD_AXIS_LEFTY, 127}}, + {"axis_right_x", {SDL_GAMEPAD_AXIS_RIGHTX, 127}}, + {"axis_right_y", {SDL_GAMEPAD_AXIS_RIGHTY, 127}}, +}; +const std::map string_to_keyboard_key_map = { + {"a", SDLK_A}, + {"b", SDLK_B}, + {"c", SDLK_C}, + {"d", SDLK_D}, + {"e", SDLK_E}, + {"f", SDLK_F}, + {"g", SDLK_G}, + {"h", SDLK_H}, + {"i", SDLK_I}, + {"j", SDLK_J}, + {"k", SDLK_K}, + {"l", SDLK_L}, + {"m", SDLK_M}, + {"n", SDLK_N}, + {"o", SDLK_O}, + {"p", SDLK_P}, + {"q", SDLK_Q}, + {"r", SDLK_R}, + {"s", SDLK_S}, + {"t", SDLK_T}, + {"u", SDLK_U}, + {"v", SDLK_V}, + {"w", SDLK_W}, + {"x", SDLK_X}, + {"y", SDLK_Y}, + {"z", SDLK_Z}, + {"0", SDLK_0}, + {"1", SDLK_1}, + {"2", SDLK_2}, + {"3", SDLK_3}, + {"4", SDLK_4}, + {"5", SDLK_5}, + {"6", SDLK_6}, + {"7", SDLK_7}, + {"8", SDLK_8}, + {"9", SDLK_9}, + {"kp0", SDLK_KP_0}, + {"kp1", SDLK_KP_1}, + {"kp2", SDLK_KP_2}, + {"kp3", SDLK_KP_3}, + {"kp4", SDLK_KP_4}, + {"kp5", SDLK_KP_5}, + {"kp6", SDLK_KP_6}, + {"kp7", SDLK_KP_7}, + {"kp8", SDLK_KP_8}, + {"kp9", SDLK_KP_9}, + {"comma", SDLK_COMMA}, + {"period", SDLK_PERIOD}, + {"question", SDLK_QUESTION}, + {"semicolon", SDLK_SEMICOLON}, + {"minus", SDLK_MINUS}, + {"underscore", SDLK_UNDERSCORE}, + {"lparenthesis", SDLK_LEFTPAREN}, + {"rparenthesis", SDLK_RIGHTPAREN}, + {"lbracket", SDLK_LEFTBRACKET}, + {"rbracket", SDLK_RIGHTBRACKET}, + {"lbrace", SDLK_LEFTBRACE}, + {"rbrace", SDLK_RIGHTBRACE}, + {"backslash", SDLK_BACKSLASH}, + {"dash", SDLK_SLASH}, + {"enter", SDLK_RETURN}, + {"space", SDLK_SPACE}, + {"tab", SDLK_TAB}, + {"backspace", SDLK_BACKSPACE}, + {"escape", SDLK_ESCAPE}, + {"left", SDLK_LEFT}, + {"right", SDLK_RIGHT}, + {"up", SDLK_UP}, + {"down", SDLK_DOWN}, + {"lctrl", SDLK_LCTRL}, + {"rctrl", SDLK_RCTRL}, + {"lshift", SDLK_LSHIFT}, + {"rshift", SDLK_RSHIFT}, + {"lalt", SDLK_LALT}, + {"ralt", SDLK_RALT}, + {"lmeta", SDLK_LGUI}, + {"rmeta", SDLK_RGUI}, + {"lwin", SDLK_LGUI}, + {"rwin", SDLK_RGUI}, + {"home", SDLK_HOME}, + {"end", SDLK_END}, + {"pgup", SDLK_PAGEUP}, + {"pgdown", SDLK_PAGEDOWN}, + {"leftbutton", SDL_BUTTON_LEFT}, + {"rightbutton", SDL_BUTTON_RIGHT}, + {"middlebutton", SDL_BUTTON_MIDDLE}, + {"sidebuttonback", SDL_BUTTON_X1}, + {"sidebuttonforward", SDL_BUTTON_X2}, + {"mousewheelup", SDL_MOUSE_WHEEL_UP}, + {"mousewheeldown", SDL_MOUSE_WHEEL_DOWN}, + {"mousewheelleft", SDL_MOUSE_WHEEL_LEFT}, + {"mousewheelright", SDL_MOUSE_WHEEL_RIGHT}, + {"kpperiod", SDLK_KP_PERIOD}, + {"kpcomma", SDLK_KP_COMMA}, + {"kpdivide", SDLK_KP_DIVIDE}, + {"kpmultiply", SDLK_KP_MULTIPLY}, + {"kpminus", SDLK_KP_MINUS}, + {"kpplus", SDLK_KP_PLUS}, + {"kpenter", SDLK_KP_ENTER}, + {"kpequals", SDLK_KP_EQUALS}, + {"capslock", SDLK_CAPSLOCK}, +}; + +void ParseInputConfig(const std::string game_id); + +class InputBinding { +public: + InputID keys[3]; + InputBinding(InputID k1 = InputID(), InputID k2 = InputID(), InputID k3 = InputID()) { + // we format the keys so comparing them will be very fast, because we will only have to + // compare 3 sorted elements, where the only possible duplicate item is 0 + + // duplicate entries get changed to one original, one null + if (k1 == k2 && k1 != InputID()) { + k2 = InputID(); + } + if (k1 == k3 && k1 != InputID()) { + k3 = InputID(); + } + if (k3 == k2 && k2 != InputID()) { + k2 = InputID(); + } + // this sorts them + if (k1 <= k2 && k1 <= k3) { + keys[0] = k1; + if (k2 <= k3) { + keys[1] = k2; + keys[2] = k3; + } else { + keys[1] = k3; + keys[2] = k2; + } + } else if (k2 <= k1 && k2 <= k3) { + keys[0] = k2; + if (k1 <= k3) { + keys[1] = k1; + keys[2] = k3; + } else { + keys[1] = k3; + keys[2] = k1; + } + } else { + keys[0] = k3; + if (k1 <= k2) { + keys[1] = k1; + keys[2] = k2; + } else { + keys[1] = k2; + keys[3] = k1; + } + } + } + // copy ctor + InputBinding(const InputBinding& o) { + keys[0] = o.keys[0]; + keys[1] = o.keys[1]; + keys[2] = o.keys[2]; + } + + inline bool operator==(const InputBinding& o) { + // InputID() signifies an unused slot + return (keys[0] == o.keys[0] || keys[0] == InputID() || o.keys[0] == InputID()) && + (keys[1] == o.keys[1] || keys[1] == InputID() || o.keys[1] == InputID()) && + (keys[2] == o.keys[2] || keys[2] == InputID() || o.keys[2] == InputID()); + // it is already very fast, + // but reverse order makes it check the actual keys first instead of possible 0-s, + // potenially skipping the later expressions of the three-way AND + } + inline int KeyCount() const { + return (keys[0].IsValid() ? 1 : 0) + (keys[1].IsValid() ? 1 : 0) + + (keys[2].IsValid() ? 1 : 0); + } + // Sorts by the amount of non zero keys - left side is 'bigger' here + bool operator<(const InputBinding& other) const { + return KeyCount() > other.KeyCount(); + } + inline bool IsEmpty() { + return !(keys[0].IsValid() || keys[1].IsValid() || keys[2].IsValid()); + } + std::string ToString() { // todo add device type + switch (KeyCount()) { + case 1: + return fmt::format("({})", keys[0].ToString()); + case 2: + return fmt::format("({}, {})", keys[0].ToString(), keys[1].ToString()); + case 3: + return fmt::format("({}, {}, {})", keys[0].ToString(), keys[1].ToString(), + keys[2].ToString()); + default: + return "Empty"; + } + } + + // returns an InputEvent based on the event type (keyboard, mouse buttons/wheel, or controller) + static InputEvent GetInputEventFromSDLEvent(const SDL_Event& e); +}; +class ControllerOutput { + static GameController* controller; + +public: + static void SetControllerOutputController(GameController* c); + static void LinkJoystickAxes(); + + u32 button; + u32 axis; + // these are only used as s8, + // but I added some padding to avoid overflow if it's activated by multiple inputs + // axis_plus and axis_minus pairs share a common new_param, the other outputs have their own + s16 old_param; + s16* new_param; + bool old_button_state, new_button_state, state_changed, positive_axis; + + ControllerOutput(const u32 b, u32 a = SDL_GAMEPAD_AXIS_INVALID, bool p = true) { + button = b; + axis = a; + new_param = new s16(0); + old_param = 0; + positive_axis = p; + } + ControllerOutput(const ControllerOutput& o) : button(o.button), axis(o.axis) { + new_param = new s16(*o.new_param); + } + ~ControllerOutput() { + delete new_param; + } + inline bool operator==(const ControllerOutput& o) const { // fucking consts everywhere + return button == o.button && axis == o.axis; + } + inline bool operator!=(const ControllerOutput& o) const { + return button != o.button || axis != o.axis; + } + std::string ToString() const { + return fmt::format("({}, {}, {})", (s32)button, (int)axis, old_param); + } + inline bool IsButton() const { + return axis == SDL_GAMEPAD_AXIS_INVALID && button != SDL_GAMEPAD_BUTTON_INVALID; + } + inline bool IsAxis() const { + return axis != SDL_GAMEPAD_AXIS_INVALID && button == SDL_GAMEPAD_BUTTON_INVALID; + } + + void ResetUpdate(); + void AddUpdate(InputEvent event); + void FinalizeUpdate(); +}; +class BindingConnection { +public: + InputBinding binding; + ControllerOutput* output; + u32 axis_param; + InputID toggle; + + BindingConnection(InputBinding b, ControllerOutput* out, u32 param = 0, InputID t = InputID()) { + binding = b; + axis_param = param; + output = out; + toggle = t; + } + bool operator<(const BindingConnection& other) const { + // a button is a higher priority than an axis, as buttons can influence axes + // (e.g. joystick_halfmode) + if (output->IsButton() && + (other.output->IsAxis() && (other.output->axis != SDL_GAMEPAD_AXIS_LEFT_TRIGGER && + other.output->axis != SDL_GAMEPAD_AXIS_RIGHT_TRIGGER))) { + return true; + } + if (binding < other.binding) { + return true; + } + return false; + } + InputEvent ProcessBinding(); +}; + +// Updates the list of pressed keys with the given input. +// Returns whether the list was updated or not. +bool UpdatePressedKeys(InputEvent event); + +void ActivateOutputsFromInputs(); + +} // namespace Input diff --git a/src/input/input_mouse.cpp b/src/input/input_mouse.cpp new file mode 100644 index 000000000..11feaeebb --- /dev/null +++ b/src/input/input_mouse.cpp @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include "common/types.h" +#include "input/controller.h" +#include "input_mouse.h" + +#include "SDL3/SDL.h" + +namespace Input { + +int mouse_joystick_binding = 0; +float mouse_deadzone_offset = 0.5, mouse_speed = 1, mouse_speed_offset = 0.1250; +Uint32 mouse_polling_id = 0; +bool mouse_enabled = false; + +// We had to go through 3 files of indirection just to update a flag +void ToggleMouseEnabled() { + mouse_enabled = !mouse_enabled; +} + +void SetMouseToJoystick(int joystick) { + mouse_joystick_binding = joystick; +} + +void SetMouseParams(float mdo, float ms, float mso) { + mouse_deadzone_offset = mdo; + mouse_speed = ms; + mouse_speed_offset = mso; +} + +Uint32 MousePolling(void* param, Uint32 id, Uint32 interval) { + auto* controller = (GameController*)param; + if (!mouse_enabled) + return interval; + + Axis axis_x, axis_y; + switch (mouse_joystick_binding) { + case 1: + axis_x = Axis::LeftX; + axis_y = Axis::LeftY; + break; + case 2: + axis_x = Axis::RightX; + axis_y = Axis::RightY; + break; + default: + return interval; // no update needed + } + + float d_x = 0, d_y = 0; + SDL_GetRelativeMouseState(&d_x, &d_y); + + float output_speed = + SDL_clamp((sqrt(d_x * d_x + d_y * d_y) + mouse_speed_offset * 128) * mouse_speed, + mouse_deadzone_offset * 128, 128.0); + + float angle = atan2(d_y, d_x); + float a_x = cos(angle) * output_speed, a_y = sin(angle) * output_speed; + + if (d_x != 0 && d_y != 0) { + controller->Axis(0, axis_x, GetAxis(-0x80, 0x80, a_x)); + controller->Axis(0, axis_y, GetAxis(-0x80, 0x80, a_y)); + } else { + controller->Axis(0, axis_x, GetAxis(-0x80, 0x80, 0)); + controller->Axis(0, axis_y, GetAxis(-0x80, 0x80, 0)); + } + + return interval; +} + +} // namespace Input diff --git a/src/input/input_mouse.h b/src/input/input_mouse.h new file mode 100644 index 000000000..da18ee04e --- /dev/null +++ b/src/input/input_mouse.h @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "SDL3/SDL.h" +#include "common/types.h" + +namespace Input { + +void ToggleMouseEnabled(); +void SetMouseToJoystick(int joystick); +void SetMouseParams(float mouse_deadzone_offset, float mouse_speed, float mouse_speed_offset); + +// Polls the mouse for changes, and simulates joystick movement from it. +Uint32 MousePolling(void* param, Uint32 id, Uint32 interval); + +} // namespace Input diff --git a/src/qt_gui/kbm_config_dialog.cpp b/src/qt_gui/kbm_config_dialog.cpp new file mode 100644 index 000000000..af198f79d --- /dev/null +++ b/src/qt_gui/kbm_config_dialog.cpp @@ -0,0 +1,237 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "kbm_config_dialog.h" +#include "kbm_help_dialog.h" + +#include +#include +#include +#include "common/config.h" +#include "common/path_util.h" +#include "game_info.h" +#include "src/sdl_window.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +QString previous_game = "default"; +bool isHelpOpen = false; +HelpDialog* helpDialog; + +EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) { + + setWindowTitle("Edit Keyboard + Mouse and Controller input bindings"); + resize(600, 400); + + // Create the editor widget + editor = new QPlainTextEdit(this); + editorFont.setPointSize(10); // Set default text size + editor->setFont(editorFont); // Apply font to the editor + + // Create the game selection combo box + gameComboBox = new QComboBox(this); + gameComboBox->addItem("default"); // Add default option + /* + gameComboBox = new QComboBox(this); + layout->addWidget(gameComboBox); // Add the combobox for selecting game configurations + + // Populate the combo box with game configurations + QStringList gameConfigs = GameInfoClass::GetGameInfo(this); + gameComboBox->addItems(gameConfigs); + gameComboBox->setCurrentText("default.ini"); // Set the default selection + */ + // Load all installed games + loadInstalledGames(); + + // Create Save, Cancel, and Help buttons + QPushButton* saveButton = new QPushButton("Save", this); + QPushButton* cancelButton = new QPushButton("Cancel", this); + QPushButton* helpButton = new QPushButton("Help", this); + QPushButton* defaultButton = new QPushButton("Default", this); + + // Layout for the game selection and buttons + QHBoxLayout* topLayout = new QHBoxLayout(); + topLayout->addWidget(gameComboBox); + topLayout->addStretch(); + topLayout->addWidget(saveButton); + topLayout->addWidget(cancelButton); + topLayout->addWidget(defaultButton); + topLayout->addWidget(helpButton); + + // Main layout with editor and buttons + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addLayout(topLayout); + layout->addWidget(editor); + + // Load the default config file content into the editor + loadFile(gameComboBox->currentText()); + + // Connect button and combo box signals + connect(saveButton, &QPushButton::clicked, this, &EditorDialog::onSaveClicked); + connect(cancelButton, &QPushButton::clicked, this, &EditorDialog::onCancelClicked); + connect(helpButton, &QPushButton::clicked, this, &EditorDialog::onHelpClicked); + connect(defaultButton, &QPushButton::clicked, this, &EditorDialog::onResetToDefaultClicked); + connect(gameComboBox, &QComboBox::currentTextChanged, this, + &EditorDialog::onGameSelectionChanged); +} + +void EditorDialog::loadFile(QString game) { + + const auto config_file = Config::GetFoolproofKbmConfigFile(game.toStdString()); + QFile file(config_file); + + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&file); + editor->setPlainText(in.readAll()); + originalConfig = editor->toPlainText(); + file.close(); + } else { + QMessageBox::warning(this, "Error", "Could not open the file for reading"); + } +} + +void EditorDialog::saveFile(QString game) { + + const auto config_file = Config::GetFoolproofKbmConfigFile(game.toStdString()); + QFile file(config_file); + + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&file); + out << editor->toPlainText(); + file.close(); + } else { + QMessageBox::warning(this, "Error", "Could not open the file for writing"); + } +} + +// Override the close event to show the save confirmation dialog only if changes were made +void EditorDialog::closeEvent(QCloseEvent* event) { + if (isHelpOpen) { + helpDialog->close(); + isHelpOpen = false; + // at this point I might have to add this flag and the help dialog to the class itself + } + if (hasUnsavedChanges()) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, "Save Changes", "Do you want to save changes?", + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + + if (reply == QMessageBox::Yes) { + saveFile(gameComboBox->currentText()); + event->accept(); // Close the dialog + } else if (reply == QMessageBox::No) { + event->accept(); // Close the dialog without saving + } else { + event->ignore(); // Cancel the close event + } + } else { + event->accept(); // No changes, close the dialog without prompting + } +} +void EditorDialog::keyPressEvent(QKeyEvent* event) { + if (event->key() == Qt::Key_Escape) { + if (isHelpOpen) { + helpDialog->close(); + isHelpOpen = false; + } + close(); // Trigger the close action, same as pressing the close button + } else { + QDialog::keyPressEvent(event); // Call the base class implementation for other keys + } +} + +void EditorDialog::onSaveClicked() { + if (isHelpOpen) { + helpDialog->close(); + isHelpOpen = false; + } + saveFile(gameComboBox->currentText()); + reject(); // Close the dialog +} + +void EditorDialog::onCancelClicked() { + if (isHelpOpen) { + helpDialog->close(); + isHelpOpen = false; + } + reject(); // Close the dialog +} + +void EditorDialog::onHelpClicked() { + if (!isHelpOpen) { + helpDialog = new HelpDialog(&isHelpOpen, this); + helpDialog->setWindowTitle("Help"); + helpDialog->setAttribute(Qt::WA_DeleteOnClose); // Clean up on close + // Get the position and size of the Config window + QRect configGeometry = this->geometry(); + int helpX = configGeometry.x() + configGeometry.width() + 10; // 10 pixels offset + int helpY = configGeometry.y(); + // Move the Help dialog to the right side of the Config window + helpDialog->move(helpX, helpY); + helpDialog->show(); + isHelpOpen = true; + } else { + helpDialog->close(); + isHelpOpen = false; + } +} + +void EditorDialog::onResetToDefaultClicked() { + bool default_default = gameComboBox->currentText() == "default"; + QString prompt = + default_default + ? "Do you want to reset your custom default config to the original default config?" + : "Do you want to reset this config to your custom default config?"; + QMessageBox::StandardButton reply = + QMessageBox::question(this, "Reset to Default", prompt, QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::Yes) { + if (default_default) { + const auto default_file = Config::GetFoolproofKbmConfigFile("default"); + std::filesystem::remove(default_file); + } + const auto config_file = Config::GetFoolproofKbmConfigFile("default"); + QFile file(config_file); + + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&file); + editor->setPlainText(in.readAll()); + file.close(); + } else { + QMessageBox::warning(this, "Error", "Could not open the file for reading"); + } + // saveFile(gameComboBox->currentText()); + } +} + +bool EditorDialog::hasUnsavedChanges() { + // Compare the current content with the original content to check if there are unsaved changes + return editor->toPlainText() != originalConfig; +} +void EditorDialog::loadInstalledGames() { + previous_game = "default"; + QStringList filePaths; + for (const auto& installLoc : Config::getGameInstallDirs()) { + QString installDir; + Common::FS::PathToQString(installDir, installLoc); + QDir parentFolder(installDir); + QFileInfoList fileList = parentFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + for (const auto& fileInfo : fileList) { + if (fileInfo.isDir() && !fileInfo.filePath().endsWith("-UPDATE")) { + gameComboBox->addItem(fileInfo.fileName()); // Add game name to combo box + } + } + } +} +void EditorDialog::onGameSelectionChanged(const QString& game) { + saveFile(previous_game); + loadFile(gameComboBox->currentText()); // Reload file based on the selected game + previous_game = gameComboBox->currentText(); +} diff --git a/src/qt_gui/kbm_config_dialog.h b/src/qt_gui/kbm_config_dialog.h new file mode 100644 index 000000000..f436b4a71 --- /dev/null +++ b/src/qt_gui/kbm_config_dialog.h @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include "string" + +class EditorDialog : public QDialog { + Q_OBJECT // Necessary for using Qt's meta-object system (signals/slots) + public : explicit EditorDialog(QWidget* parent = nullptr); // Constructor + +protected: + void closeEvent(QCloseEvent* event) override; // Override close event + void keyPressEvent(QKeyEvent* event) override; + +private: + QPlainTextEdit* editor; // Editor widget for the config file + QFont editorFont; // To handle the text size + QString originalConfig; // Starting config string + std::string gameId; + + QComboBox* gameComboBox; // Combo box for selecting game configurations + + void loadFile(QString game); // Function to load the config file + void saveFile(QString game); // Function to save the config file + void loadInstalledGames(); // Helper to populate gameComboBox + bool hasUnsavedChanges(); // Checks for unsaved changes + +private slots: + void onSaveClicked(); // Save button slot + void onCancelClicked(); // Slot for handling cancel button + void onHelpClicked(); // Slot for handling help button + void onResetToDefaultClicked(); + void onGameSelectionChanged(const QString& game); // Slot for game selection changes +}; diff --git a/src/qt_gui/kbm_help_dialog.cpp b/src/qt_gui/kbm_help_dialog.cpp new file mode 100644 index 000000000..44f75f6f8 --- /dev/null +++ b/src/qt_gui/kbm_help_dialog.cpp @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "kbm_help_dialog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ExpandableSection::ExpandableSection(const QString& title, const QString& content, + QWidget* parent = nullptr) + : QWidget(parent) { + QVBoxLayout* layout = new QVBoxLayout(this); + + // Button to toggle visibility of content + toggleButton = new QPushButton(title); + layout->addWidget(toggleButton); + + // QTextBrowser for content (initially hidden) + contentBrowser = new QTextBrowser(); + contentBrowser->setPlainText(content); + contentBrowser->setVisible(false); + + // Remove scrollbars from QTextBrowser + contentBrowser->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + contentBrowser->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + // Set size policy to allow vertical stretching only + contentBrowser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + + // Calculate and set initial height based on content + updateContentHeight(); + + layout->addWidget(contentBrowser); + + // Connect button click to toggle visibility + connect(toggleButton, &QPushButton::clicked, [this]() { + contentBrowser->setVisible(!contentBrowser->isVisible()); + if (contentBrowser->isVisible()) { + updateContentHeight(); // Update height when expanding + } + emit expandedChanged(); // Notify for layout adjustments + }); + + // Connect to update height if content changes + connect(contentBrowser->document(), &QTextDocument::contentsChanged, this, + &ExpandableSection::updateContentHeight); + + // Minimal layout settings for spacing + layout->setSpacing(2); + layout->setContentsMargins(0, 0, 0, 0); +} + +void HelpDialog::closeEvent(QCloseEvent* event) { + *help_open_ptr = false; + close(); +} +void HelpDialog::reject() { + *help_open_ptr = false; + close(); +} + +HelpDialog::HelpDialog(bool* open_flag, QWidget* parent) : QDialog(parent) { + help_open_ptr = open_flag; + // Main layout for the help dialog + QVBoxLayout* mainLayout = new QVBoxLayout(this); + + // Container widget for the scroll area + QWidget* containerWidget = new QWidget; + QVBoxLayout* containerLayout = new QVBoxLayout(containerWidget); + + // Add expandable sections to container layout + auto* quickstartSection = new ExpandableSection("Quickstart", quickstart()); + auto* faqSection = new ExpandableSection("FAQ", faq()); + auto* syntaxSection = new ExpandableSection("Syntax", syntax()); + auto* specialSection = new ExpandableSection("Special Bindings", special()); + auto* bindingsSection = new ExpandableSection("Keybindings", bindings()); + + containerLayout->addWidget(quickstartSection); + containerLayout->addWidget(faqSection); + containerLayout->addWidget(syntaxSection); + containerLayout->addWidget(specialSection); + containerLayout->addWidget(bindingsSection); + containerLayout->addStretch(1); + + // Scroll area wrapping the container + QScrollArea* scrollArea = new QScrollArea; + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + scrollArea->setWidgetResizable(true); + scrollArea->setWidget(containerWidget); + + // Add the scroll area to the main dialog layout + mainLayout->addWidget(scrollArea); + setLayout(mainLayout); + + // Minimum size for the dialog + setMinimumSize(500, 400); + + // Re-adjust dialog layout when any section expands/collapses + connect(quickstartSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); + connect(faqSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); + connect(syntaxSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); + connect(specialSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); + connect(bindingsSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); +} \ No newline at end of file diff --git a/src/qt_gui/kbm_help_dialog.h b/src/qt_gui/kbm_help_dialog.h new file mode 100644 index 000000000..8d543b7e7 --- /dev/null +++ b/src/qt_gui/kbm_help_dialog.h @@ -0,0 +1,169 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include + +class ExpandableSection : public QWidget { + Q_OBJECT +public: + explicit ExpandableSection(const QString& title, const QString& content, QWidget* parent); + +signals: + void expandedChanged(); // Signal to indicate layout size change + +private: + QPushButton* toggleButton; + QTextBrowser* contentBrowser; // Changed from QLabel to QTextBrowser + QPropertyAnimation* animation; + int contentHeight; + void updateContentHeight() { + int contentHeight = contentBrowser->document()->size().height(); + contentBrowser->setMinimumHeight(contentHeight + 5); + contentBrowser->setMaximumHeight(contentHeight + 50); + } +}; + +class HelpDialog : public QDialog { + Q_OBJECT +public: + explicit HelpDialog(bool* open_flag = nullptr, QWidget* parent = nullptr); + +protected: + void closeEvent(QCloseEvent* event) override; + void reject() override; + +private: + bool* help_open_ptr; + + QString quickstart() { + return + R"(The keyboard and controller remapping backend, GUI and documentation have been written by kalaposfos + +In this section, you will find information about the project, its features and help on setting up your ideal setup. +To view the config file's syntax, check out the Syntax tab, for keybind names, visit Normal Keybinds and Special Bindings, and if you are here to view emulator-wide keybinds, you can find it in the FAQ section. +This project started out because I didn't like the original unchangeable keybinds, but rather than waiting for someone else to do it, I implemented this myself. From the default keybinds, you can clearly tell this was a project built for Bloodborne, but ovbiously you can make adjustments however you like. +)"; + } + QString faq() { + return + R"(Q: What are the emulator-wide keybinds? +A: -F12: Triggers Renderdoc capture +-F11: Toggles fullscreen +-F10: Toggles FPS counter +-Ctrl F10: Open the debug menu +-F9: Pauses emultor, if the debug menu is open +-F8: Reparses the config file while in-game +-F7: Toggles mouse capture and mouse input + +Q: How do I change between mouse and controller joystick input, and why is it even required? +A: You can switch between them with F7, and it is required, because mouse input is done with polling, which means mouse movement is checked every frame, and if it didn't move, the code manually sets the emulator's virtual controller to 0 (back to the center), even if other input devices would update it. + +Q: What happens if I accidentally make a typo in the config? +A: The code recognises the line as wrong, and skip it, so the rest of the file will get parsed, but that line in question will be treated like a comment line. You can find these lines in the log, if you search for 'input_handler'. + +Q: I want to bind to , but your code doesn't support ! +A: Some keys are intentionally omitted, but if you read the bindings through, and you're sure it is not there and isn't one of the intentionally disabled ones, open an issue on https://github.com/shadps4-emu/shadPS4. +)"; + } + QString syntax() { + return + R"(This is the full list of currently supported mouse, keyboard and controller inputs, and how to use them. +Emulator-reserved keys: F1 through F12 + +Syntax (aka how a line can look like): +#Comment line + = , , ; + = , ; + = ; + +Examples: +#Interact +cross = e; +#Heavy attack (in BB) +r2 = leftbutton, lshift; +#Move forward +axis_left_y_minus = w; + +You can make a comment line by putting # as the first character. +Whitespace doesn't matter, =; is just as valid as = ; +';' at the ends of lines is also optional. +)"; + } + QString bindings() { + return + R"(The following names should be interpreted without the '' around them, and for inputs that have left and right versions, only the left one is shown, but the right can be inferred from that. +Example: 'lshift', 'rshift' + +Keyboard: +Alphabet: 'a', 'b', ..., 'z' +Numbers: '0', '1', ..., '9' +Keypad: 'kp0', kp1', ..., 'kp9', 'kpperiod', 'kpcomma', + 'kpdivide', 'kpmultiply', 'kpdivide', 'kpplus', 'kpminus', 'kpenter' +Punctuation and misc: + 'space', 'comma', 'period', 'question', 'semicolon', 'minus', 'plus', 'lparenthesis', 'lbracket', 'lbrace', 'backslash', 'dash', + 'enter', 'tab', backspace', 'escape' +Arrow keys: 'up', 'down', 'left', 'right' +Modifier keys: + 'lctrl', 'lshift', 'lalt', 'lwin' = 'lmeta' (same input, different names, so if you are not on Windows and don't like calling this the Windows key, there is an alternative) + +Mouse: + 'leftbutton', 'rightbutton', 'middlebutton', 'sidebuttonforward', 'sidebuttonback' + The following wheel inputs cannot be bound to axis input, only button: + 'mousewheelup', 'mousewheeldown', 'mousewheelleft', 'mousewheelright' + +Controller: + The touchpad currently can't be rebound to anything else, but you can bind buttons to it. + If you have a controller that has different names for buttons, it will still work, just look up what are the equivalent names for that controller + The same left-right rule still applies here. + Buttons: + 'triangle', 'circle', 'cross', 'square', 'l1', 'l3', + 'options', touchpad', 'up', 'down', 'left', 'right' + Axes if you bind them to a button input: + 'axis_left_x_plus', 'axis_left_x_minus', 'axis_left_y_plus', 'axis_left_y_minus', + 'axis_right_x_plus', ..., 'axis_right_y_minus', + 'l2' + Axes if you bind them to another axis input: + 'axis_left_x' 'axis_left_y' 'axis_right_x' 'axis_right_y', + 'l2' +)"; + } + QString special() { + return + R"(There are some extra bindings you can put into the config file, that don't correspond to a controller input, but rather something else. +You can find these here, with detailed comments, examples and suggestions for most of them. + +'leftjoystick_halfmode' and 'rightjoystick_halfmode' = ; + These are a pair of input modifiers, that change the way keyboard button bound axes work. By default, those push the joystick to the max in their respective direction, but if their respective joystick_halfmode modifier value is true, they only push it... halfway. With this, you can change from run to walk in games like Bloodborne. + +'mouse_to_joystick' = 'none', 'left' or 'right'; + This binds the mouse movement to either joystick. If it recieves a value that is not 'left' or 'right', it defaults to 'none'. + +'mouse_movement_params' = float, float, float; + (If you don't know what a float is, it is a data type that stores non-whole numbers.) + Default values: 0.5, 1, 0.125 + Let's break each parameter down: + 1st: mouse_deadzone_offset: this value should have a value between 0 and 1 (It gets clamped to that range anyway), with 0 being no offset and 1 being pushing the joystick to the max in the direction the mouse moved. + This controls the minimum distance the joystick gets moved, when moving the mouse. If set to 0, it will emulate raw mouse input, which doesn't work very well due to deadzones preventing input if the movement is not large enough. + 2nd: mouse_speed: It's just a standard multiplier to the mouse input speed. + If you input a negative number, the axis directions get reversed (Keep in mind that the offset can still push it back to positive, if it's big enough) + 3rd: mouse_speed_offset: This also should be in the 0 to 1 range, with 0 being no offset and 1 being offsetting to the max possible value. + This is best explained through an example: Let's set mouse_deadzone to 0.5, and this to 0: This means that if we move the mousevery slowly, it still inputs a half-strength joystick input, and if we increase the speed, it would stay that way until we move faster than half the max speed. If we instead set this to 0.25, we now only need to move the mouse faster than the 0.5-0.25=0.25=quarter of the max speed, to get an increase in joystick speed. If we set it to 0.5, then even moving the mouse at 1 pixel per frame will result in a faster-than-minimum speed. + +'key_toggle' = , ; + This assigns a key to another key, and if pressed, toggles that key's virtual value. If it's on, then it doesn't matter if the key is pressed or not, the input handler will treat it as if it's pressed. + You can make an input toggleable with this, for example: Let's say we want to be able to toggle l1 with t. You can then bind l1 to a key you won't use, like kpenter, then bind t to toggle that, so you will end up with this: + l1 = kpenter; + key_toggle = t, kpenter; +'analog_deadzone' = , ; + value goes from 1 to 127 (no deadzone to max deadzone) + devices: leftjoystick, rightjoystick, l2, r2 +)"; + } +}; \ No newline at end of file diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index aa02d1237..de3557992 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include "about_dialog.h" @@ -21,6 +22,9 @@ #include "install_dir_select.h" #include "main_window.h" #include "settings_dialog.h" + +#include "kbm_config_dialog.h" + #include "video_core/renderer_vulkan/vk_instance.h" #ifdef ENABLE_DISCORD_RPC #include "common/discord_rpc_handler.h" @@ -291,6 +295,12 @@ void MainWindow::CreateConnects() { settingsDialog->exec(); }); + // this is the editor for kbm keybinds + connect(ui->controllerButton, &QPushButton::clicked, this, [this]() { + EditorDialog* editorWindow = new EditorDialog(this); + editorWindow->exec(); // Show the editor window modally + }); + #ifdef ENABLE_UPDATER connect(ui->updaterAct, &QAction::triggered, this, [this]() { auto checkUpdate = new CheckUpdate(true); diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index 9b7617925..6eaad62e5 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -1,24 +1,27 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include -#include -#include -#include -#include - +#include "SDL3/SDL_events.h" +#include "SDL3/SDL_hints.h" +#include "SDL3/SDL_init.h" +#include "SDL3/SDL_properties.h" +#include "SDL3/SDL_timer.h" +#include "SDL3/SDL_video.h" #include "common/assert.h" #include "common/config.h" +#include "common/elf_info.h" +#include "common/version.h" #include "core/libraries/kernel/time.h" #include "core/libraries/pad/pad.h" #include "imgui/renderer/imgui_core.h" #include "input/controller.h" +#include "input/input_handler.h" +#include "input/input_mouse.h" #include "sdl_window.h" #include "video_core/renderdoc.h" #ifdef __APPLE__ -#include +#include "SDL3/SDL_metal.h" #endif namespace Input { @@ -290,6 +293,10 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_ window_info.type = WindowSystemType::Metal; window_info.render_surface = SDL_Metal_GetLayer(SDL_Metal_CreateView(window)); #endif + // input handler init-s + Input::ControllerOutput::SetControllerOutputController(controller); + Input::ControllerOutput::LinkJoystickAxes(); + Input::ParseInputConfig(std::string(Common::ElfInfo::Instance().GameSerial())); } WindowSDL::~WindowSDL() = default; @@ -317,18 +324,28 @@ void WindowSDL::WaitEvent() { is_shown = event.type == SDL_EVENT_WINDOW_EXPOSED; OnResize(); break; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + case SDL_EVENT_MOUSE_BUTTON_UP: + case SDL_EVENT_MOUSE_WHEEL: + case SDL_EVENT_MOUSE_WHEEL_OFF: case SDL_EVENT_KEY_DOWN: case SDL_EVENT_KEY_UP: - OnKeyPress(&event); + OnKeyboardMouseInput(&event); + break; + case SDL_EVENT_GAMEPAD_ADDED: + case SDL_EVENT_GAMEPAD_REMOVED: + controller->SetEngine(std::make_unique()); + break; + case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: + case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: + case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: + controller->SetTouchpadState(event.gtouchpad.finger, + event.type != SDL_EVENT_GAMEPAD_TOUCHPAD_UP, event.gtouchpad.x, + event.gtouchpad.y); break; case SDL_EVENT_GAMEPAD_BUTTON_DOWN: case SDL_EVENT_GAMEPAD_BUTTON_UP: case SDL_EVENT_GAMEPAD_AXIS_MOTION: - case SDL_EVENT_GAMEPAD_ADDED: - case SDL_EVENT_GAMEPAD_REMOVED: - case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: - case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: - case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: OnGamepadEvent(&event); break; // i really would have appreciated ANY KIND OF DOCUMENTATION ON THIS @@ -355,6 +372,7 @@ void WindowSDL::WaitEvent() { void WindowSDL::InitTimers() { SDL_AddTimer(100, &PollController, controller); + SDL_AddTimer(33, Input::MousePolling, (void*)controller); } void WindowSDL::RequestKeyboard() { @@ -381,239 +399,87 @@ void WindowSDL::OnResize() { ImGui::Core::OnResize(); } -void WindowSDL::OnKeyPress(const SDL_Event* event) { - auto button = OrbisPadButtonDataOffset::None; - Input::Axis axis = Input::Axis::AxisMax; - int axisvalue = 0; - int ax = 0; - std::string backButtonBehavior = Config::getBackButtonBehavior(); - switch (event->key.key) { - case SDLK_UP: - button = OrbisPadButtonDataOffset::Up; - break; - case SDLK_DOWN: - button = OrbisPadButtonDataOffset::Down; - break; - case SDLK_LEFT: - button = OrbisPadButtonDataOffset::Left; - break; - case SDLK_RIGHT: - button = OrbisPadButtonDataOffset::Right; - break; - // Provide alternatives for face buttons for users without a numpad. - case SDLK_KP_8: - case SDLK_C: - button = OrbisPadButtonDataOffset::Triangle; - break; - case SDLK_KP_6: - case SDLK_B: - button = OrbisPadButtonDataOffset::Circle; - break; - case SDLK_KP_2: - case SDLK_N: - button = OrbisPadButtonDataOffset::Cross; - break; - case SDLK_KP_4: - case SDLK_V: - button = OrbisPadButtonDataOffset::Square; - break; - case SDLK_RETURN: - button = OrbisPadButtonDataOffset::Options; - break; - case SDLK_A: - axis = Input::Axis::LeftX; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += -127; - } else { - axisvalue = 0; +Uint32 wheelOffCallback(void* og_event, Uint32 timer_id, Uint32 interval) { + SDL_Event off_event = *(SDL_Event*)og_event; + off_event.type = SDL_EVENT_MOUSE_WHEEL_OFF; + SDL_PushEvent(&off_event); + delete (SDL_Event*)og_event; + return 0; +} + +void WindowSDL::OnKeyboardMouseInput(const SDL_Event* event) { + using Libraries::Pad::OrbisPadButtonDataOffset; + + // get the event's id, if it's keyup or keydown + const bool input_down = event->type == SDL_EVENT_KEY_DOWN || + event->type == SDL_EVENT_MOUSE_BUTTON_DOWN || + event->type == SDL_EVENT_MOUSE_WHEEL; + Input::InputEvent input_event = Input::InputBinding::GetInputEventFromSDLEvent(*event); + + // Handle window controls outside of the input maps + if (event->type == SDL_EVENT_KEY_DOWN) { + u32 input_id = input_event.input.sdl_id; + // Reparse kbm inputs + if (input_id == SDLK_F8) { + Input::ParseInputConfig(std::string(Common::ElfInfo::Instance().GameSerial())); + return; } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_D: - axis = Input::Axis::LeftX; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += 127; - } else { - axisvalue = 0; + // Toggle mouse capture and movement input + else if (input_id == SDLK_F7) { + Input::ToggleMouseEnabled(); + SDL_SetWindowRelativeMouseMode(this->GetSDLWindow(), + !SDL_GetWindowRelativeMouseMode(this->GetSDLWindow())); + return; } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_W: - axis = Input::Axis::LeftY; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += -127; - } else { - axisvalue = 0; + // Toggle fullscreen + else if (input_id == SDLK_F11) { + SDL_WindowFlags flag = SDL_GetWindowFlags(window); + bool is_fullscreen = flag & SDL_WINDOW_FULLSCREEN; + SDL_SetWindowFullscreen(window, !is_fullscreen); + return; } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_S: - axis = Input::Axis::LeftY; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += 127; - } else { - axisvalue = 0; - } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_J: - axis = Input::Axis::RightX; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += -127; - } else { - axisvalue = 0; - } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_L: - axis = Input::Axis::RightX; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += 127; - } else { - axisvalue = 0; - } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_I: - axis = Input::Axis::RightY; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += -127; - } else { - axisvalue = 0; - } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_K: - axis = Input::Axis::RightY; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += 127; - } else { - axisvalue = 0; - } - ax = Input::GetAxis(-0x80, 0x80, axisvalue); - break; - case SDLK_X: - button = OrbisPadButtonDataOffset::L3; - break; - case SDLK_M: - button = OrbisPadButtonDataOffset::R3; - break; - case SDLK_Q: - button = OrbisPadButtonDataOffset::L1; - break; - case SDLK_U: - button = OrbisPadButtonDataOffset::R1; - break; - case SDLK_E: - button = OrbisPadButtonDataOffset::L2; - axis = Input::Axis::TriggerLeft; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += 255; - } else { - axisvalue = 0; - } - ax = Input::GetAxis(0, 0x80, axisvalue); - break; - case SDLK_O: - button = OrbisPadButtonDataOffset::R2; - axis = Input::Axis::TriggerRight; - if (event->type == SDL_EVENT_KEY_DOWN) { - axisvalue += 255; - } else { - axisvalue = 0; - } - ax = Input::GetAxis(0, 0x80, axisvalue); - break; - case SDLK_SPACE: - if (backButtonBehavior != "none") { - float x = backButtonBehavior == "left" ? 0.25f - : (backButtonBehavior == "right" ? 0.75f : 0.5f); - // trigger a touchpad event so that the touchpad emulation for back button works - controller->SetTouchpadState(0, true, x, 0.5f); - button = OrbisPadButtonDataOffset::TouchPad; - } else { - button = {}; - } - break; - case SDLK_F11: - if (event->type == SDL_EVENT_KEY_DOWN) { - { - SDL_WindowFlags flag = SDL_GetWindowFlags(window); - bool is_fullscreen = flag & SDL_WINDOW_FULLSCREEN; - SDL_SetWindowFullscreen(window, !is_fullscreen); - } - } - break; - case SDLK_F12: - if (event->type == SDL_EVENT_KEY_DOWN) { - // Trigger rdoc capture + // Trigger rdoc capture + else if (input_id == SDLK_F12) { VideoCore::TriggerCapture(); + return; } - break; - default: - break; } - if (button != OrbisPadButtonDataOffset::None) { - controller->CheckButton(0, button, event->type == SDL_EVENT_KEY_DOWN); + + // if it's a wheel event, make a timer that turns it off after a set time + if (event->type == SDL_EVENT_MOUSE_WHEEL) { + const SDL_Event* copy = new SDL_Event(*event); + SDL_AddTimer(33, wheelOffCallback, (void*)copy); } - if (axis != Input::Axis::AxisMax) { - controller->Axis(0, axis, ax); + + // add/remove it from the list + bool inputs_changed = Input::UpdatePressedKeys(input_event); + + // update bindings + if (inputs_changed) { + Input::ActivateOutputsFromInputs(); } } void WindowSDL::OnGamepadEvent(const SDL_Event* event) { - auto button = OrbisPadButtonDataOffset::None; - Input::Axis axis = Input::Axis::AxisMax; - switch (event->type) { - case SDL_EVENT_GAMEPAD_ADDED: - case SDL_EVENT_GAMEPAD_REMOVED: - controller->SetEngine(std::make_unique()); - break; - case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: - case SDL_EVENT_GAMEPAD_TOUCHPAD_UP: - case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: - controller->SetTouchpadState(event->gtouchpad.finger, - event->type != SDL_EVENT_GAMEPAD_TOUCHPAD_UP, - event->gtouchpad.x, event->gtouchpad.y); - break; - case SDL_EVENT_GAMEPAD_BUTTON_DOWN: - case SDL_EVENT_GAMEPAD_BUTTON_UP: { - button = Input::SDLGamepadToOrbisButton(event->gbutton.button); - if (button == OrbisPadButtonDataOffset::None) { - break; - } - if (event->gbutton.button != SDL_GAMEPAD_BUTTON_BACK) { - controller->CheckButton(0, button, event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN); - break; - } - const auto backButtonBehavior = Config::getBackButtonBehavior(); - if (backButtonBehavior != "none") { - float x = backButtonBehavior == "left" ? 0.25f - : (backButtonBehavior == "right" ? 0.75f : 0.5f); - // trigger a touchpad event so that the touchpad emulation for back button works - controller->SetTouchpadState(0, true, x, 0.5f); - controller->CheckButton(0, button, event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN); - } - break; - } - case SDL_EVENT_GAMEPAD_AXIS_MOTION: - axis = event->gaxis.axis == SDL_GAMEPAD_AXIS_LEFTX ? Input::Axis::LeftX - : event->gaxis.axis == SDL_GAMEPAD_AXIS_LEFTY ? Input::Axis::LeftY - : event->gaxis.axis == SDL_GAMEPAD_AXIS_RIGHTX ? Input::Axis::RightX - : event->gaxis.axis == SDL_GAMEPAD_AXIS_RIGHTY ? Input::Axis::RightY - : event->gaxis.axis == SDL_GAMEPAD_AXIS_LEFT_TRIGGER ? Input::Axis::TriggerLeft - : event->gaxis.axis == SDL_GAMEPAD_AXIS_RIGHT_TRIGGER ? Input::Axis::TriggerRight - : Input::Axis::AxisMax; - if (axis != Input::Axis::AxisMax) { - if (event->gaxis.axis == SDL_GAMEPAD_AXIS_LEFT_TRIGGER || - event->gaxis.axis == SDL_GAMEPAD_AXIS_RIGHT_TRIGGER) { - controller->Axis(0, axis, Input::GetAxis(0, 0x8000, event->gaxis.value)); - } else { - controller->Axis(0, axis, Input::GetAxis(-0x8000, 0x8000, event->gaxis.value)); - } - } - break; + bool input_down = event->type == SDL_EVENT_GAMEPAD_AXIS_MOTION || + event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN; + Input::InputEvent input_event = Input::InputBinding::GetInputEventFromSDLEvent(*event); + + // the touchpad button shouldn't be rebound to anything else, + // as it would break the entire touchpad handling + // You can still bind other things to it though + if (event->gbutton.button == SDL_GAMEPAD_BUTTON_TOUCHPAD) { + controller->CheckButton(0, OrbisPadButtonDataOffset::TouchPad, input_down); + return; + } + + // add/remove it from the list + bool inputs_changed = Input::UpdatePressedKeys(input_event); + + // update bindings + if (inputs_changed) { + Input::ActivateOutputsFromInputs(); } } diff --git a/src/sdl_window.h b/src/sdl_window.h index 3ab3c3613..9acd2b16b 100644 --- a/src/sdl_window.h +++ b/src/sdl_window.h @@ -3,9 +3,10 @@ #pragma once -#include #include "common/types.h" +#include "core/libraries/pad/pad.h" #include "input/controller.h" +#include "string" struct SDL_Window; struct SDL_Gamepad; @@ -94,7 +95,7 @@ public: private: void OnResize(); - void OnKeyPress(const SDL_Event* event); + void OnKeyboardMouseInput(const SDL_Event* event); void OnGamepadEvent(const SDL_Event* event); private: From 9aa6c5b9514c9c9c3ce3469790613af987725ec5 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:41:11 +0100 Subject: [PATCH 198/455] Remapping: Documentation and defaults update + add option to use a unified config (#2302) * Add a toggle to use unified or per-game configs, and add a deadzone example to the default config * Add a checkbox to toggle config type * clang --- src/common/config.cpp | 16 +++++++++++++++- src/common/config.h | 2 ++ src/input/input_handler.cpp | 7 ++----- src/qt_gui/kbm_config_dialog.cpp | 11 +++++++++++ src/qt_gui/kbm_help_dialog.h | 6 ++++++ 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index e79a52796..fee0b4ed3 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -68,6 +68,7 @@ static bool vkGuestMarkers = false; static bool rdocEnable = false; static s16 cursorState = HideCursorState::Idle; static int cursorHideTimeout = 5; // 5 seconds (default) +static bool useUnifiedInputConfig = true; static bool separateupdatefolder = false; static bool compatibilityData = false; static bool checkCompatibilityOnStartup = false; @@ -98,6 +99,14 @@ std::string emulator_language = "en"; // Language u32 m_language = 1; // english +bool GetUseUnifiedInputConfig() { + return useUnifiedInputConfig; +} + +void SetUseUnifiedInputConfig(bool use) { + useUnifiedInputConfig = use; +} + std::string getTrophyKey() { return trophyKey; } @@ -657,6 +666,7 @@ void load(const std::filesystem::path& path) { useSpecialPad = toml::find_or(input, "useSpecialPad", false); specialPadClass = toml::find_or(input, "specialPadClass", 1); isMotionControlsEnabled = toml::find_or(input, "isMotionControlsEnabled", true); + useUnifiedInputConfig = toml::find_or(input, "useUnifiedInputConfig", true); } if (data.contains("GPU")) { @@ -779,6 +789,7 @@ void save(const std::filesystem::path& path) { data["Input"]["useSpecialPad"] = useSpecialPad; data["Input"]["specialPadClass"] = specialPadClass; data["Input"]["isMotionControlsEnabled"] = isMotionControlsEnabled; + data["Input"]["useUnifiedInputConfig"] = useUnifiedInputConfig; data["GPU"]["screenWidth"] = screenWidth; data["GPU"]["screenHeight"] = screenHeight; data["GPU"]["nullGpu"] = isNullGpu; @@ -969,9 +980,12 @@ touchpad = back axis_left_x = axis_left_x axis_left_y = axis_left_y - axis_right_x = axis_right_x axis_right_y = axis_right_y + +# Range of deadzones: 1 (almost none) to 127 (max) +analog_deadzone = leftjoystick, 2 +analog_deadzone = rightjoystick, 2 )"; } std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id) { diff --git a/src/common/config.h b/src/common/config.h index f726f840c..77ed69ece 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -43,6 +43,8 @@ std::string getBackButtonBehavior(); bool getUseSpecialPad(); int getSpecialPadClass(); bool getIsMotionControlsEnabled(); +bool GetUseUnifiedInputConfig(); +void SetUseUnifiedInputConfig(bool use); u32 getScreenWidth(); u32 getScreenHeight(); diff --git a/src/input/input_handler.cpp b/src/input/input_handler.cpp index a78a54131..5394e4818 100644 --- a/src/input/input_handler.cpp +++ b/src/input/input_handler.cpp @@ -198,11 +198,8 @@ InputBinding GetBindingFromString(std::string& line) { } void ParseInputConfig(const std::string game_id = "") { - const auto config_file = Config::GetFoolproofKbmConfigFile(game_id); - - if (game_id == "") { - return; - } + std::string config_type = Config::GetUseUnifiedInputConfig() ? "default" : game_id; + const auto config_file = Config::GetFoolproofKbmConfigFile(config_type); // we reset these here so in case the user fucks up or doesn't include some of these, // we can fall back to default diff --git a/src/qt_gui/kbm_config_dialog.cpp b/src/qt_gui/kbm_config_dialog.cpp index af198f79d..74a49034b 100644 --- a/src/qt_gui/kbm_config_dialog.cpp +++ b/src/qt_gui/kbm_config_dialog.cpp @@ -12,6 +12,7 @@ #include "game_info.h" #include "src/sdl_window.h" +#include #include #include #include @@ -50,7 +51,16 @@ EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) { // Load all installed games loadInstalledGames(); + QCheckBox* unifiedInputCheckBox = new QCheckBox("Use Per-Game configs", this); + unifiedInputCheckBox->setChecked(!Config::GetUseUnifiedInputConfig()); + + // Connect checkbox signal + connect(unifiedInputCheckBox, &QCheckBox::toggled, this, [](bool checked) { + Config::SetUseUnifiedInputConfig(!checked); + Config::save(Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "config.toml"); + }); // Create Save, Cancel, and Help buttons + Config::SetUseUnifiedInputConfig(!Config::GetUseUnifiedInputConfig()); QPushButton* saveButton = new QPushButton("Save", this); QPushButton* cancelButton = new QPushButton("Cancel", this); QPushButton* helpButton = new QPushButton("Help", this); @@ -58,6 +68,7 @@ EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) { // Layout for the game selection and buttons QHBoxLayout* topLayout = new QHBoxLayout(); + topLayout->addWidget(unifiedInputCheckBox); topLayout->addWidget(gameComboBox); topLayout->addStretch(); topLayout->addWidget(saveButton); diff --git a/src/qt_gui/kbm_help_dialog.h b/src/qt_gui/kbm_help_dialog.h index 8d543b7e7..c482d2b5c 100644 --- a/src/qt_gui/kbm_help_dialog.h +++ b/src/qt_gui/kbm_help_dialog.h @@ -70,6 +70,12 @@ A: The code recognises the line as wrong, and skip it, so the rest of the file w Q: I want to bind to , but your code doesn't support ! A: Some keys are intentionally omitted, but if you read the bindings through, and you're sure it is not there and isn't one of the intentionally disabled ones, open an issue on https://github.com/shadps4-emu/shadPS4. + +Q: What does default.ini do? +A: If you're using per-game configs, it's the base from which all new games generate their config file. If you use the unified config, then this is used for every game directly instead. + +Q: What does the use Per-game Config checkbox do? +A: It controls whether the config is loaded from CUSAXXXXX.ini for a game, or from default.ini. This way, if you only want to manage one set of bindings, you can do so, but if you want to use a different setup for every game, that's possible as well. )"; } QString syntax() { From 259d5ef60b5cd0aa1474f6c3be757804203890a3 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 1 Feb 2025 00:34:41 -0800 Subject: [PATCH 199/455] config: Restore previous keyboard mapping defaults. (#2313) --- README.md | 53 +++++++++++++++++++------------------- src/common/config.cpp | 60 +++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 0e5ba7e39..97e3ab383 100644 --- a/README.md +++ b/README.md @@ -92,33 +92,34 @@ F12 | Trigger RenderDoc Capture > [!NOTE] > Xbox and DualShock controllers work out of the box. -The default controls are inspired by the *Elden Ring* PC controls. Inputs support up to three keys per binding, mouse buttons, mouse movement mapped to joystick input, and more. +| Controller button | Keyboard equivalent | +|-------------|-------------| +LEFT AXIS UP | W | +LEFT AXIS DOWN | S | +LEFT AXIS LEFT | A | +LEFT AXIS RIGHT | D | +RIGHT AXIS UP | I | +RIGHT AXIS DOWN | K | +RIGHT AXIS LEFT | J | +RIGHT AXIS RIGHT | L | +TRIANGLE | Numpad 8 or C | +CIRCLE | Numpad 6 or B | +CROSS | Numpad 2 or N | +SQUARE | Numpad 4 or V | +PAD UP | UP | +PAD DOWN | DOWN | +PAD LEFT | LEFT | +PAD RIGHT | RIGHT | +OPTIONS | RETURN | +BACK BUTTON / TOUCH PAD | SPACE | +L1 | Q | +R1 | U | +L2 | E | +R2 | O | +L3 | X | +R3 | M | -| Action | Default Key(s) | -|-------------|-----------------------------| -| Triangle | F | -| Circle | Space | -| Cross | E | -| Square | R | -| Pad Up | W, LAlt / Mouse Wheel Up | -| Pad Down | S, LAlt / Mouse Wheel Down | -| Pad Left | A, LAlt / Mouse Wheel Left | -| Pad Right | D, LAlt / Mouse Wheel Right | -| L1 | Right Button, LShift | -| R1 | Left Button | -| L2 | Right Button | -| R2 | Left Button, LShift | -| L3 | X | -| R3 | Q / Middle Button | -| Options | Escape | -| Touchpad | G | - -| Joystick | Default Input | -|--------------------|----------------| -| Left Joystick | WASD | -| Right Joystick | Mouse movement | - -Keyboard and mouse inputs can be customized in the settings menu by clicking the Controller button, and further details and help on controls are also found there. Custom bindings are saved per-game. +Keyboard and mouse inputs can be customized in the settings menu by clicking the Controller button, and further details and help on controls are also found there. Custom bindings are saved per-game. Inputs support up to three keys per binding, mouse buttons, mouse movement mapped to joystick input, and more. # Main team diff --git a/src/common/config.cpp b/src/common/config.cpp index fee0b4ed3..2059da0b3 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -919,44 +919,44 @@ void setDefaultValues() { constexpr std::string_view GetDefaultKeyboardConfig() { return R"(#Feeling lost? Check out the Help section! -#Keyboard bindings +# Keyboard bindings -triangle = f -circle = space -cross = e -square = r +triangle = kp8 +circle = kp6 +cross = kp2 +square = kp4 +# Alternatives for users without a keypad +triangle = c +circle = b +cross = n +square = v -pad_up = w, lalt -pad_up = mousewheelup -pad_down = s, lalt -pad_down = mousewheeldown -pad_left = a, lalt -pad_left = mousewheelleft -pad_right = d, lalt -pad_right = mousewheelright - -l1 = rightbutton, lshift -r1 = leftbutton -l2 = rightbutton -r2 = leftbutton, lshift +l1 = q +r1 = u +l2 = e +r2 = o l3 = x -r3 = q -r3 = middlebutton +r3 = m -options = escape -touchpad = g +options = enter +touchpad = space -key_toggle = i, lalt -mouse_to_joystick = right -mouse_movement_params = 0.5, 1, 0.125 -leftjoystick_halfmode = lctrl +pad_up = up +pad_down = down +pad_left = left +pad_right = right axis_left_x_minus = a axis_left_x_plus = d axis_left_y_minus = w axis_left_y_plus = s -#Controller bindings +axis_right_x_minus = j +axis_right_x_plus = l +axis_right_y_minus = i +axis_right_y_plus = k + +# Controller bindings triangle = triangle cross = cross @@ -970,14 +970,14 @@ r1 = r1 r2 = r2 r3 = r3 +options = options +touchpad = back + pad_up = pad_up pad_down = pad_down pad_left = pad_left pad_right = pad_right -options = options -touchpad = back - axis_left_x = axis_left_x axis_left_y = axis_left_y axis_right_x = axis_right_x From e1550c9091e2389c09634c56befb6c589703d00c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 1 Feb 2025 00:52:40 -0800 Subject: [PATCH 200/455] audioout: Add error returns when not initialized. (#2309) --- src/core/libraries/audio/audioout.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/core/libraries/audio/audioout.cpp b/src/core/libraries/audio/audioout.cpp index f0ad59c3b..dea8115e9 100644 --- a/src/core/libraries/audio/audioout.cpp +++ b/src/core/libraries/audio/audioout.cpp @@ -89,6 +89,9 @@ int PS4_SYSV_ABI sceAudioOutChangeAppModuleState() { int PS4_SYSV_ABI sceAudioOutClose(s32 handle) { LOG_INFO(Lib_AudioOut, "handle = {}", handle); + if (audio == nullptr) { + return ORBIS_AUDIO_OUT_ERROR_NOT_INIT; + } if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } @@ -171,6 +174,9 @@ int PS4_SYSV_ABI sceAudioOutGetLastOutputTime() { } int PS4_SYSV_ABI sceAudioOutGetPortState(s32 handle, OrbisAudioOutPortState* state) { + if (audio == nullptr) { + return ORBIS_AUDIO_OUT_ERROR_NOT_INIT; + } if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } @@ -305,6 +311,10 @@ s32 PS4_SYSV_ABI sceAudioOutOpen(UserService::OrbisUserServiceUserId user_id, user_id, magic_enum::enum_name(port_type), index, length, sample_rate, magic_enum::enum_name(param_type.data_format.Value()), magic_enum::enum_name(param_type.attributes.Value())); + if (audio == nullptr) { + LOG_ERROR(Lib_AudioOut, "Audio out not initialized"); + return ORBIS_AUDIO_OUT_ERROR_NOT_INIT; + } if ((port_type < OrbisAudioOutPort::Main || port_type > OrbisAudioOutPort::Padspk) && (port_type != OrbisAudioOutPort::Aux)) { LOG_ERROR(Lib_AudioOut, "Invalid port type"); @@ -368,6 +378,9 @@ int PS4_SYSV_ABI sceAudioOutOpenEx() { } s32 PS4_SYSV_ABI sceAudioOutOutput(s32 handle, void* ptr) { + if (audio == nullptr) { + return ORBIS_AUDIO_OUT_ERROR_NOT_INIT; + } if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } @@ -489,6 +502,9 @@ int PS4_SYSV_ABI sceAudioOutSetUsbVolume() { } s32 PS4_SYSV_ABI sceAudioOutSetVolume(s32 handle, s32 flag, s32* vol) { + if (audio == nullptr) { + return ORBIS_AUDIO_OUT_ERROR_NOT_INIT; + } if (handle < 1 || handle > SCE_AUDIO_OUT_NUM_PORTS) { return ORBIS_AUDIO_OUT_ERROR_INVALID_PORT; } From 84c27eea2ae56807a7b178e31363f6ab1c27a9bb Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 1 Feb 2025 01:54:40 -0800 Subject: [PATCH 201/455] texture_cache: Make sure left-overlapped mips get marked for rebind. (#2268) --- .../texture_cache/texture_cache.cpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index e995b10b2..ecac78847 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -240,32 +240,32 @@ std::tuple TextureCache::ResolveOverlap(const ImageInfo& imag return {{}, -1, -1}; } else { // Left overlap, the image from cache is a possible subresource of the image requested - if (!merged_image_id) { - // We need to have a larger, already allocated image to copy this one into - return {{}, -1, -1}; - } - if (auto mip = tex_cache_image.info.IsMipOf(image_info); mip >= 0) { if (tex_cache_image.binding.is_target) { // We have a larger image created and a separate one, representing a subres of it, // bound as render target. In this case we need to rebind render target. tex_cache_image.binding.needs_rebind = 1u; - GetImage(merged_image_id).binding.is_target = 1u; + if (merged_image_id) { + GetImage(merged_image_id).binding.is_target = 1u; + } FreeImage(cache_image_id); return {merged_image_id, -1, -1}; } - tex_cache_image.Transit(vk::ImageLayout::eTransferSrcOptimal, - vk::AccessFlagBits2::eTransferRead, {}); + // We need to have a larger, already allocated image to copy this one into + if (merged_image_id) { + tex_cache_image.Transit(vk::ImageLayout::eTransferSrcOptimal, + vk::AccessFlagBits2::eTransferRead, {}); - const auto num_mips_to_copy = tex_cache_image.info.resources.levels; - ASSERT(num_mips_to_copy == 1); + const auto num_mips_to_copy = tex_cache_image.info.resources.levels; + ASSERT(num_mips_to_copy == 1); - auto& merged_image = slot_images[merged_image_id]; - merged_image.CopyMip(tex_cache_image, mip); + auto& merged_image = slot_images[merged_image_id]; + merged_image.CopyMip(tex_cache_image, mip); - FreeImage(cache_image_id); + FreeImage(cache_image_id); + } } } From 83671ebf763c9e94731b1a0b94626d02a4f1fb27 Mon Sep 17 00:00:00 2001 From: pdaloxd <31321612+pablodrake@users.noreply.github.com> Date: Sat, 1 Feb 2025 10:58:05 +0100 Subject: [PATCH 202/455] Translatable Compatibility Status (#2304) * qt_gui: Made compatibility status translatable * Translations: Added English and Spanish translation for compatibility status --- src/qt_gui/compatibility_info.cpp | 19 +++++++++++++++++++ src/qt_gui/compatibility_info.h | 8 +------- src/qt_gui/game_list_frame.cpp | 2 +- src/qt_gui/translations/en.ts | 27 +++++++++++++++++++++++++++ src/qt_gui/translations/es_ES.ts | 27 +++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 8 deletions(-) diff --git a/src/qt_gui/compatibility_info.cpp b/src/qt_gui/compatibility_info.cpp index 69fb3e377..884387061 100644 --- a/src/qt_gui/compatibility_info.cpp +++ b/src/qt_gui/compatibility_info.cpp @@ -260,3 +260,22 @@ void CompatibilityInfoClass::ExtractCompatibilityInfo(QByteArray response) { return; } + +const QString CompatibilityInfoClass::GetCompatStatusString(const CompatibilityStatus status) { + switch (status) { + case CompatibilityStatus::Unknown: + return tr("Unknown"); + case CompatibilityStatus::Nothing: + return tr("Nothing"); + case CompatibilityStatus::Boots: + return tr("Boots"); + case CompatibilityStatus::Menus: + return tr("Menus"); + case CompatibilityStatus::Ingame: + return tr("Ingame"); + case CompatibilityStatus::Playable: + return tr("Playable"); + default: + return tr("Unknown"); + } +} \ No newline at end of file diff --git a/src/qt_gui/compatibility_info.h b/src/qt_gui/compatibility_info.h index 0c47c27ff..511c106ce 100644 --- a/src/qt_gui/compatibility_info.h +++ b/src/qt_gui/compatibility_info.h @@ -69,13 +69,6 @@ public: {QStringLiteral("os-windows"), OSType::Win32}, }; - inline static const std::unordered_map CompatStatusToString = { - {CompatibilityStatus::Unknown, QStringLiteral("Unknown")}, - {CompatibilityStatus::Nothing, QStringLiteral("Nothing")}, - {CompatibilityStatus::Boots, QStringLiteral("Boots")}, - {CompatibilityStatus::Menus, QStringLiteral("Menus")}, - {CompatibilityStatus::Ingame, QStringLiteral("Ingame")}, - {CompatibilityStatus::Playable, QStringLiteral("Playable")}}; inline static const std::unordered_map OSTypeToString = { {OSType::Linux, QStringLiteral("os-linux")}, {OSType::macOS, QStringLiteral("os-macOS")}, @@ -87,6 +80,7 @@ public: void UpdateCompatibilityDatabase(QWidget* parent = nullptr, bool forced = false); bool LoadCompatibilityFile(); CompatibilityEntry GetCompatibilityInfo(const std::string& serial); + const QString GetCompatStatusString(const CompatibilityStatus status); void ExtractCompatibilityInfo(QByteArray response); static bool WaitForReply(QNetworkReply* reply); QNetworkReply* FetchPage(int page_num); diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index 8255c0daf..f2d08f578 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -289,7 +289,7 @@ void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityEntry QLabel* dotLabel = new QLabel("", widget); dotLabel->setPixmap(circle_pixmap); - QLabel* label = new QLabel(m_compat_info->CompatStatusToString.at(entry.status), widget); + QLabel* label = new QLabel(m_compat_info->GetCompatStatusString(entry.status), widget); label->setStyleSheet("color: white; font-size: 16px; font-weight: bold;"); diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 7ad2f15c0..58d6e9aa8 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -1414,4 +1414,31 @@ TB + + CompatibilityInfoClass + + Unknown + Unknown + + + Nothing + Nothing + + + Boots + Boots + + + Menus + Menus + + + Ingame + Ingame + + + Playable + Playable + + diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 8af34c042..d732e67ea 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1405,4 +1405,31 @@ TB
+ + CompatibilityInfoClass + + Unknown + Desconocido + + + Nothing + Nada + + + Boots + Inicia + + + Menus + Menús + + + Ingame + En el juego + + + Playable + Jugable + + \ No newline at end of file From 1d8c607c1554e308a4f5e9fc5dc0ca7bf821ebff Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Sat, 1 Feb 2025 20:44:10 +0300 Subject: [PATCH 203/455] hotfix: stronger conditions for the vtx offset error message --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 1c90c6c27..7f2db3f8d 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1172,7 +1172,8 @@ void Rasterizer::UpdateViewportScissorState(const GraphicsPipeline& pipeline) { const float reduce_z = regs.clipper_control.clip_space == AmdGpu::Liverpool::ClipSpace::MinusWToW ? 1.0f : 0.0f; - if (regs.polygon_control.enable_window_offset) { + if (regs.polygon_control.enable_window_offset && + (regs.window_offset.window_x_offset != 0 || regs.window_offset.window_y_offset != 0)) { LOG_ERROR(Render_Vulkan, "PA_SU_SC_MODE_CNTL.VTX_WINDOW_OFFSET_ENABLE support is not yet implemented."); } From 831903799b51c675804c50fc0b7d0cd305dda844 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 2 Feb 2025 14:51:45 -0800 Subject: [PATCH 204/455] shader_recompiler: Insert end of divergence scope at last relevant instruction. (#2325) --- src/shader_recompiler/frontend/control_flow_graph.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/shader_recompiler/frontend/control_flow_graph.cpp b/src/shader_recompiler/frontend/control_flow_graph.cpp index ec5c117f7..12d2a2922 100644 --- a/src/shader_recompiler/frontend/control_flow_graph.cpp +++ b/src/shader_recompiler/frontend/control_flow_graph.cpp @@ -161,6 +161,12 @@ void CFG::EmitDivergenceLabels() { // scope. const auto start = inst_list.begin() + curr_begin + 1; if (!std::ranges::all_of(start, inst_list.begin() + index, IgnoresExecMask)) { + // Determine the last instruction affected by the exec mask, so that any + // trailing instructions not affected can be excluded from the scope. + s32 curr_end = index; + while (IgnoresExecMask(inst_list[curr_end - 1])) { + --curr_end; + } // Add a label to the instruction right after the open scope call. // It is the start of a new basic block. const auto& save_inst = inst_list[curr_begin]; @@ -173,8 +179,8 @@ void CFG::EmitDivergenceLabels() { // * Normal instruction at the end of the block // For the last case we must NOT add a label as that would cause // the instruction to be separated into its own basic block. - if (is_close) { - AddLabel(index_to_pc[index]); + if (curr_end != end_index - 1) { + AddLabel(index_to_pc[curr_end]); } } // Reset scope begin. From 460c266e045766e7d6a2c1e7b54a95124d476a62 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 2 Feb 2025 15:37:08 -0800 Subject: [PATCH 205/455] fix: Restore previous version of divergence PR. --- .../frontend/control_flow_graph.cpp | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/src/shader_recompiler/frontend/control_flow_graph.cpp b/src/shader_recompiler/frontend/control_flow_graph.cpp index 12d2a2922..126cb4eb6 100644 --- a/src/shader_recompiler/frontend/control_flow_graph.cpp +++ b/src/shader_recompiler/frontend/control_flow_graph.cpp @@ -148,47 +148,46 @@ void CFG::EmitDivergenceLabels() { const size_t end_index = GetIndex(end); s32 curr_begin = -1; + s32 last_exec_idx = -1; for (size_t index = GetIndex(start); index < end_index; index++) { const auto& inst = inst_list[index]; - const bool is_close = is_close_scope(inst); - if ((is_close || index == end_index - 1) && curr_begin != -1) { - // If there are no instructions inside scope don't do anything. - if (index - curr_begin == 1) { + if (curr_begin != -1) { + // Keep note of the last instruction that does not ignore exec, so we know where + // to end the divergence block without impacting trailing instructions that do. + if (!IgnoresExecMask(inst)) { + last_exec_idx = index; + } + // Consider a close scope on certain instruction types or at the last instruction + // before the next label. + if (is_close_scope(inst) || index == end_index - 1) { + // Only insert a scope if, since the open-scope instruction, there is at least + // one instruction that does not ignore exec. + if (index - curr_begin > 1 && last_exec_idx != -1) { + // Add a label to the instruction right after the open scope call. + // It is the start of a new basic block. + const auto& save_inst = inst_list[curr_begin]; + AddLabel(index_to_pc[curr_begin] + save_inst.length); + // Add a label to the close scope instruction. + // There are 3 cases where we need to close a scope. + // * Close scope instruction inside the block + // * Close scope instruction at the end of the block (cbranch or endpgm) + // * Normal instruction at the end of the block + // If the instruction we want to close the scope at is at the end of the + // block, we do not need to insert a new label. + if (last_exec_idx != end_index - 1) { + // Add the label after the last instruction affected by exec. + const auto& last_exec_inst = inst_list[last_exec_idx]; + AddLabel(index_to_pc[last_exec_idx] + last_exec_inst.length); + } + } + // Reset scope begin. curr_begin = -1; - continue; } - // If all instructions in the scope ignore exec masking, we shouldn't insert a - // scope. - const auto start = inst_list.begin() + curr_begin + 1; - if (!std::ranges::all_of(start, inst_list.begin() + index, IgnoresExecMask)) { - // Determine the last instruction affected by the exec mask, so that any - // trailing instructions not affected can be excluded from the scope. - s32 curr_end = index; - while (IgnoresExecMask(inst_list[curr_end - 1])) { - --curr_end; - } - // Add a label to the instruction right after the open scope call. - // It is the start of a new basic block. - const auto& save_inst = inst_list[curr_begin]; - const Label label = index_to_pc[curr_begin] + save_inst.length; - AddLabel(label); - // Add a label to the close scope instruction. - // There are 3 cases where we need to close a scope. - // * Close scope instruction inside the block - // * Close scope instruction at the end of the block (cbranch or endpgm) - // * Normal instruction at the end of the block - // For the last case we must NOT add a label as that would cause - // the instruction to be separated into its own basic block. - if (curr_end != end_index - 1) { - AddLabel(index_to_pc[curr_end]); - } - } - // Reset scope begin. - curr_begin = -1; } // Mark a potential start of an exec scope. if (is_open_scope(inst)) { curr_begin = index; + last_exec_idx = -1; } } } From c5cd4bc5cfade900bc4853a0e1a57b7032a5afd9 Mon Sep 17 00:00:00 2001 From: hspir404 Date: Mon, 3 Feb 2025 10:37:11 +0000 Subject: [PATCH 206/455] Remove log line that was consuming as much as 0.6ms frame time (#2335) --- src/core/libraries/kernel/process.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index c21257c50..3a747bf16 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -13,7 +13,6 @@ namespace Libraries::Kernel { int PS4_SYSV_ABI sceKernelIsNeoMode() { - LOG_DEBUG(Kernel_Sce, "called"); return Config::isNeoModeConsole() && Common::ElfInfo::Instance().GetPSFAttributes().support_neo_mode; } From 0d65ef6f6e691af3133759e86d55a7cc521a5fa7 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Mon, 3 Feb 2025 11:51:54 +0100 Subject: [PATCH 207/455] Adding french translation to game status and translating a forgotten sentence (#2315) * Add translation to game status and translate a forgotten sentence * menu * vulkan ts --- src/qt_gui/translations/fr.ts | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index f2ea4fcc7..efaaa9ad1 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -742,7 +742,7 @@ Title Music - Title Music + Musique du titre Disable Trophy Pop-ups @@ -958,7 +958,7 @@ crashDiagnosticsCheckBox - Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer le Vulkan Validation Layers ainsi que le Vulkan SDK pour que cela fonctionne. + Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer la couche de validation Vulkan ainsi que le Vulkan SDK pour que cela fonctionne. copyGPUBuffersCheckBox @@ -1405,4 +1405,31 @@ TB
+ + CompatibilityInfoClass + + Unknown + Inconnu + + + Nothing + Rien + + + Boots + Démarre + + + Menus + Menu + + + Ingame + En jeu + + + Playable + Jouable + + From 56b2f6c4cf37aa0a55d2f5dc5a86fe9d1f2a3f30 Mon Sep 17 00:00:00 2001 From: Martin <67326368+Martini-141@users.noreply.github.com> Date: Mon, 3 Feb 2025 11:52:10 +0100 Subject: [PATCH 208/455] add missing translations nb (#2317) * add gamestatus tr nb * add missing compatibilityinfoclass tr nb * add missing GameListFrame tr nb --- src/qt_gui/translations/nb.ts | 49 ++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index bce5791af..b2a355c95 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1298,6 +1298,14 @@ Game can be completed with playable performance and no major glitches Spillet kan fullføres med spillbar ytelse og uten store feil + + Click to go to issue + Klikk for å gå til rapporten + + + Last updated + Sist oppdatert + CheckUpdate @@ -1425,4 +1433,43 @@ TB + + CompatibilityInfoClass + + Unknown + Ukjent + + + Nothing + Ingenting + + + Boots + Starter opp + + + Menus + Meny + + + Ingame + I spill + + + Playable + Spillbar + + + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vennligst vent + + + Cancel + Avbryt + + + Loading... + Laster... + + From 8d4261efba96a7d76b5202cbebc4894fa8340d82 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Mon, 3 Feb 2025 07:52:23 -0300 Subject: [PATCH 209/455] Cheats/Patches: Fix Mask Offset (#2323) --- src/common/memory_patcher.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/common/memory_patcher.cpp b/src/common/memory_patcher.cpp index f81a0ed83..899bb6bf3 100644 --- a/src/common/memory_patcher.cpp +++ b/src/common/memory_patcher.cpp @@ -174,7 +174,7 @@ void OnGameLoaded() { patchMask = MemoryPatcher::PatchMask::Mask_Jump32; MemoryPatcher::PatchMemory(currentPatchName, address, patchValue, false, - littleEndian, patchMask); + littleEndian, patchMask, maskOffsetValue); } } } @@ -278,6 +278,7 @@ void OnGameLoaded() { lineObject["Type"] = attributes.value("Type").toString(); lineObject["Address"] = attributes.value("Address").toString(); lineObject["Value"] = attributes.value("Value").toString(); + lineObject["Offset"] = attributes.value("Offset").toString(); linesArray.append(lineObject); } } @@ -321,7 +322,7 @@ void OnGameLoaded() { MemoryPatcher::PatchMemory(currentPatchName, address.toStdString(), patchValue.toStdString(), false, - littleEndian, patchMask); + littleEndian, patchMask, maskOffsetValue); } } } @@ -447,4 +448,4 @@ uintptr_t PatternScan(const std::string& signature) { return 0; } -} // namespace MemoryPatcher \ No newline at end of file +} // namespace MemoryPatcher From a55acae5ee26db97fede27498f2ac3b630c37742 Mon Sep 17 00:00:00 2001 From: Yury <27062841+f1amy@users.noreply.github.com> Date: Mon, 3 Feb 2025 15:52:41 +0500 Subject: [PATCH 210/455] Update ru_RU translation for 6.0 (#2318) * Update ru translation for 6.0 * Escape special characters for ru * Add and translate new strings for ru_RU * Translate `Auto Select` in GPU selection * Ru translation fixes - added translation for `Auto Select` * Fix typos in ru translation --- src/qt_gui/settings_dialog.cpp | 2 +- src/qt_gui/translations/ru_RU.ts | 3011 ++++++++++++++++-------------- 2 files changed, 1608 insertions(+), 1405 deletions(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 802325126..7505db106 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -72,7 +72,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->buttonBox->button(QDialogButtonBox::StandardButton::Close)->setFocus(); // Add list of available GPUs - ui->graphicsAdapterBox->addItem("Auto Select"); // -1, auto selection + ui->graphicsAdapterBox->addItem(tr("Auto Select")); // -1, auto selection for (const auto& device : physical_devices) { ui->graphicsAdapterBox->addItem(device); } diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 270396a6d..a8b3bacb4 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1,1408 +1,1611 @@ - - - AboutDialog - - About shadPS4 - О shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Это програмное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. - - - - ElfViewer - - Open Folder - Открыть папку - - - - GameInfoClass - - Loading game list, please wait :3 - Загрузка списка игр, пожалуйста подождите :3 - - - Cancel - Отмена - - - Loading... - Загрузка... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Выберите папку - - - Select which directory you want to install to. - Выберите папку, в которую вы хотите установить. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Выберите папку - - - Directory to install games - Папка для установки игр - - - Browse - Обзор - - - Error - Ошибка - - - The value for location to install games is not valid. - Недопустимое значение местоположения для установки игр. - - - - GuiContextMenus - - Create Shortcut - Создать ярлык - - - Cheats / Patches - Читы и патчи - - - SFO Viewer - Просмотр SFO - - - Trophy Viewer - Просмотр трофеев - - - Open Folder... - Открыть папку... - - - Open Game Folder - Открыть папку с игрой - - - Open Save Data Folder - Открыть папку сохранений - - - Open Log Folder - Открыть папку логов - - - Copy info... - Копировать информацию... - - - Copy Name - Копировать имя - - - Copy Serial - Копировать серийный номер - - - Copy All - Копировать всё - - - Delete... - Удалить... - - - Delete Game - Удалить игру - - - Delete Update - Удалить обновление - - - Delete DLC - Удалить DLC - - - Compatibility... - Совместимость... - - - Update database - Обновить базу данных - - - View report - Посмотреть отчет - - - Submit a report - Отправить отчёт - - - Shortcut creation - Создание ярлыка - - - Shortcut created successfully! - Ярлык создан успешно! - - - Error - Ошибка - - - Error creating shortcut! - Ошибка создания ярлыка! - - - Install PKG - Установить PKG - - - Game - Игры - - - requiresEnableSeparateUpdateFolder_MSG - Эта функция требует включения настройки 'Отдельная папка обновлений'. Если вы хотите использовать эту функцию, пожалуйста включите её. - - - This game has no update to delete! - У этой игры нет обновлений для удаления! - - - Update - Обновления - - - This game has no DLC to delete! - У этой игры нет DLC для удаления! - - - DLC - DLC - - - Delete %1 - Удалить %1 - - - Are you sure you want to delete %1's %2 directory? - Вы уверены, что хотите удалить папку %2 %1? - - - - MainWindow - - Open/Add Elf Folder - Открыть/Добавить папку Elf - - - Install Packages (PKG) - Установить пакеты (PKG) - - - Boot Game - Запустить игру - - - Check for Updates - Проверить обновления - - - About shadPS4 - О shadPS4 - - - Configure... - Настроить... - - - Install application from a .pkg file - Установить приложение из файла .pkg - - - Recent Games - Недавние игры - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Выход - - - Exit shadPS4 - Выйти из shadPS4 - - - Exit the application. - Выйти из приложения. - - - Show Game List - Показать список игр - - - Game List Refresh - Обновить список игр - - - Tiny - Крошечный - - - Small - Маленький - - - Medium - Средний - - - Large - Большой - - - List View - Список - - - Grid View - Сетка - - - Elf Viewer - Исполняемый файл - - - Game Install Directory - Каталог установки игры - - - Download Cheats/Patches - Скачать читы или патчи - - - Dump Game List - Дамп списка игр - - - PKG Viewer - Просмотр PKG - - - Search... - Поиск... - - - File - Файл - - - View - Вид - - - Game List Icons - Размер иконок списка игр - - - Game List Mode - Вид списка игр - - - Settings - Настройки - - - Utils - Утилиты - - - Themes - Темы - - - Help - Помощь - - - Dark - Темная - - - Light - Светлая - - - Green - Зеленая - - - Blue - Синяя - - - Violet - Фиолетовая - - - toolBar - Панель инструментов - - - Game List - Список игр - - - * Unsupported Vulkan Version - * Неподдерживаемая версия Vulkan - - - Download Cheats For All Installed Games - Скачать читы для всех установленных игр - - - Download Patches For All Games - Скачать патчи для всех игр - - - Download Complete - Скачивание завершено - - - You have downloaded cheats for all the games you have installed. - Вы скачали читы для всех установленных игр. - - - Patches Downloaded Successfully! - Патчи успешно скачаны! - - - All Patches available for all games have been downloaded. - Все доступные патчи для всех игр были скачаны. - - - Games: - Игры: - - - PKG File (*.PKG) - Файл PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Файлы ELF (*.bin *.elf *.oelf) - - - Game Boot - Запуск игры - - - Only one file can be selected! - Можно выбрать только один файл! - - - PKG Extraction - Извлечение PKG - - - Patch detected! - Обнаружен патч! - - - PKG and Game versions match: - Версии PKG и игры совпадают: - - - Would you like to overwrite? - Хотите перезаписать? - - - PKG Version %1 is older than installed version: - Версия PKG %1 старее установленной версии: - - - Game is installed: - Игра установлена: - - - Would you like to install Patch: - Хотите установить патч: - - - DLC Installation - Установка DLC - - - Would you like to install DLC: %1? - Вы хотите установить DLC: %1? - - - DLC already installed: - DLC уже установлен: - - - Game already installed - Игра уже установлена - - - PKG is a patch, please install the game first! - PKG - это патч, сначала установите игру! - - - PKG ERROR - ОШИБКА PKG - - - Extracting PKG %1/%2 - Извлечение PKG %1/%2 - - - Extraction Finished - Извлечение завершено - - - Game successfully installed at %1 - Игра успешно установлена в %1 - - - File doesn't appear to be a valid PKG file - Файл не является допустимым файлом PKG - - - - PKGViewer - - Open Folder - Открыть папку - - - - TrophyViewer - - Trophy Viewer - Просмотр трофеев - - - - SettingsDialog - - Settings - Настройки - - - General - Общее - - - System - Система - - - Console Language - Язык консоли - - - Emulator Language - Язык эмулятора - - - Emulator - Эмулятор - - - Enable Fullscreen - Полноэкранный режим - - - Fullscreen Mode - Тип полноэкранного режима - - - Enable Separate Update Folder - Отдельная папка обновлений - - - Default tab when opening settings - Вкладка по умолчанию при открытии настроек - - - Show Game Size In List - Показать размер игры в списке - - - Show Splash - Показывать заставку - - - Is PS4 Pro - Режим PS4 Pro - - - Enable Discord Rich Presence - Включить Discord Rich Presence - - - Username - Имя пользователя - - - Trophy Key - Ключ трофеев - - - Trophy - Трофеи - - - Logger - Логирование - - - Log Type - Тип логов - - - Log Filter - Фильтр логов - - - Open Log Location - Открыть местоположение журнала - - - Input - Ввод - - - Cursor - Курсор мыши - - - Hide Cursor - Скрывать курсор - - - Hide Cursor Idle Timeout - Время скрытия курсора при бездействии - - - s - сек - - - Controller - Контроллер - - - Back Button Behavior - Поведение кнопки назад - - - Graphics - Графика - - - Gui - Интерфейс - - - User - Пользователь - - - Graphics Device - Графическое устройство - - - Width - Ширина - - - Height - Высота - - - Vblank Divider - Делитель Vblank - - - Advanced - Продвинутые - - - Enable Shaders Dumping - Включить дамп шейдеров - - - Enable NULL GPU - Включить NULL GPU - - - Paths - Пути - - - Game Folders - Игровые папки - - - Add... - Добавить... - - - Remove - Удалить - - - Debug - Отладка - - - Enable Debug Dumping - Включить отладочные дампы - - - Enable Vulkan Validation Layers - Включить слои валидации Vulkan - - - Enable Vulkan Synchronization Validation - Включить валидацию синхронизации Vulkan - - - Enable RenderDoc Debugging - Включить отладку RenderDoc - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Обновление - - - Check for Updates at Startup - Проверка при запуске - - - Update Channel - Канал обновления - - - Check for Updates - Проверить обновления - - - GUI Settings - Интерфейс - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Отключить уведомления о трофеях - - - Play title music - Играть заглавную музыку - - - Update Compatibility Database On Startup - Обновлять базу совместимости при запуске - - - Game Compatibility - Совместимость игр - - - Display Compatibility Data - Показывать данные совместимости - - - Update Compatibility Database - Обновить базу совместимости - - - Volume - Громкость - - - Audio Backend - Звуковая подсистема - - - Save - Сохранить - - - Apply - Применить - - - Restore Defaults - По умолчанию - - - Close - Закрыть - - - Point your mouse at an option to display its description. - Наведите указатель мыши на опцию, чтобы отобразить ее описание. - - - consoleLanguageGroupBox - Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык который поддерживается игрой, так как он может отличаться в зависимости от региона. - - - emulatorLanguageGroupBox - Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. - - - fullscreenCheckBox - Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nВы можете отключить это, нажав клавишу F11. - - - separateUpdatesCheckBox - Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства. - - - showSplashCheckBox - Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. - - - ps4proCheckBox - Режим PS4 Pro:\nЗаставляет эмулятор работать как PS4 Pro, что может включить специальные функции в играх, поддерживающих это. - - - discordRPCCheckbox - Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. - - - userName - Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. - - - logFilter - Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. - - - updaterGroupBox - Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. - - - GUIMusicGroupBox - Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. - - - disableTrophycheckBox - Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). - - - hideCursorGroupBox - Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. - - - idleTimeoutGroupBox - Установите время, через которое курсор исчезнет при бездействии. - - - backButtonBehaviorGroupBox - Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. - - - enableCompatibilityCheckBox - Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. - - - checkCompatibilityOnStartupCheckBox - Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. - - - updateCompatibilityButton - Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. - - - Never - Никогда - - - Idle - При бездействии - - - Always - Всегда - - - Touchpad Left - Тачпад слева - - - Touchpad Right - Тачпад справа - - - Touchpad Center - Центр тачпада - - - None - Нет - - - graphicsAdapterGroupBox - Графическое устройство:\nВ системах с несколькими GPU выберите GPU, который будет использовать эмулятор.\nВыберите "Auto Select", чтобы определить его автоматически. - - - resolutionLayout - Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. - - - heightDivider - Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! - - - dumpShadersCheckBox - Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. - - - nullGpuCheckBox - Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. - - - gameFoldersBox - Игровые папки:\nСписок папок для проверки установленных игр. - - - addFolderButton - Добавить:\nДобавить папку в список. - - - removeFolderButton - Удалить:\nУдалить папку из списка. - - - debugDump - Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. - - - vkValidationCheckBox - Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. - - - vkSyncValidationCheckBox - Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. - - - rdocCheckBox - Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с Renderdoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Читы и патчи для - - - defaultTextEdit_MSG - Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Изображение недоступно - - - Serial: - Серийный номер: - - - Version: - Версия: - - - Size: - Размер: - - - Select Cheat File: - Выберите файл чита: - - - Repository: - Репозиторий: - - - Download Cheats - Скачать читы - - - Delete File - Удалить файл - - - No files selected. - Файлы не выбраны. - - - You can delete the cheats you don't want after downloading them. - Вы можете удалить ненужные читы после их скачивания. - - - Do you want to delete the selected file?\n%1 - Вы хотите удалить выбранный файл?\n%1 - - - Select Patch File: - Выберите файл патча: - - - Download Patches - Скачать патчи - - - Save - Сохранить - - - Cheats - Читы - - - Patches - Патчи - - - Error - Ошибка - - - No patch selected. - Патч не выбран. - - - Unable to open files.json for reading. - Не удалось открыть файл files.json для чтения. - - - No patch file found for the current serial. - Не найден файл патча для текущего серийного номера. - - - Unable to open the file for reading. - Не удалось открыть файл для чтения. - - - Unable to open the file for writing. - Не удалось открыть файл для записи. - - - Failed to parse XML: - Не удалось разобрать XML: - - - Success - Успех - - - Options saved successfully. - Опции успешно сохранены. - - - Invalid Source - Неверный источник - - - The selected source is invalid. - Выбранный источник недействителен. - - - File Exists - Файл существует - - - File already exists. Do you want to replace it? - Файл уже существует. Хотите заменить его? - - - Failed to save file: - Не удалось сохранить файл: - - - Failed to download file: - Не удалось скачать файл: - - - Cheats Not Found - Читы не найдены - - - CheatsNotFound_MSG - Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. - - - Cheats Downloaded Successfully - Читы успешно скачаны - - - CheatsDownloadedSuccessfully_MSG - Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. - - - Failed to save: - Не удалось сохранить: - - - Failed to download: - Не удалось скачать: - - - Download Complete - Скачивание завершено - - - DownloadComplete_MSG - Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. - - - Failed to parse JSON data from HTML. - Не удалось разобрать данные JSON из HTML. - - - Failed to retrieve HTML page. - Не удалось получить HTML-страницу. - - - The game is in version: %1 - Игра в версии: %1 - - - The downloaded patch only works on version: %1 - Скачанный патч работает только на версии: %1 - - - You may need to update your game. - Вам может понадобиться обновить игру. - - - Incompatibility Notice - Уведомление о несовместимости - - - Failed to open file: - Не удалось открыть файл: - - - XML ERROR: - ОШИБКА XML: - - - Failed to open files.json for writing - Не удалось открыть файл files.json для записи - - - Author: - Автор: - - - Directory does not exist: - Каталог не существует: - - - Failed to open files.json for reading. - Не удалось открыть файл files.json для чтения. - - - Name: - Имя: - - - Can't apply cheats before the game is started - Невозможно применить читы до начала игры - - - - GameListFrame - - Icon - Иконка - - - Name - Название - - - Serial - Серийный номер - - - Compatibility - Совместимость - - - Region - Регион - - - Firmware - Прошивка - - - Size - Размер - - - Version - Версия - - - Path - Путь - - - Play Time - Время в игре - - - Never Played - Нет - - - h - ч - - - m - м - - - s - с - - - Compatibility is untested - Совместимость не проверена - - - Game does not initialize properly / crashes the emulator - Игра не иницализируется правильно / крашит эмулятор - - - Game boots, but only displays a blank screen - Игра запускается, но показывает только пустой экран - - - Game displays an image but does not go past the menu - Игра показывает картинку, но не проходит дальше меню - - - Game has game-breaking glitches or unplayable performance - Игра имеет ломающие игру глюки или плохую производительность - - - Game can be completed with playable performance and no major glitches - Игра может быть пройдена с хорошей производительностью и без серьезных сбоев - - - - CheckUpdate - - Auto Updater - Автообновление - - - Error - Ошибка - - - Network error: - Сетевая ошибка: - - - Failed to parse update information. - Не удалось разобрать информацию об обновлении. - - - No pre-releases found. - Предварительных версий не найдено. - - - Invalid release data. - Недопустимые данные релиза. - - - No download URL found for the specified asset. - Не найден URL для загрузки указанного ресурса. - - - Your version is already up to date! - Ваша версия уже обновлена! - - - Update Available - Доступно обновление - - - Update Channel - Канал обновления - - - Current Version - Текущая версия - - - Latest Version - Последняя версия - - - Do you want to update? - Вы хотите обновиться? - - - Show Changelog - Показать журнал изменений - - - Check for Updates at Startup - Проверка при запуске - - - Update - Обновить - - - No - Нет - - - Hide Changelog - Скрыть журнал изменений - - - Changes - Журнал изменений - - - Network error occurred while trying to access the URL - Произошла сетевая ошибка при попытке доступа к URL - - - Download Complete - Скачивание завершено - - - The update has been downloaded, press OK to install. - Обновление загружено, нажмите OK для установки. - - - Failed to save the update file at - Не удалось сохранить файл обновления в - - - Starting Update... - Начало обновления... - - - Failed to create the update script file - Не удалось создать файл скрипта обновления - - - - GameListUtils - - B - Б - - - KB - КБ - - - MB - МБ - - - GB - ГБ - - - TB - ТБ - - + + + AboutDialog + + About shadPS4 + О shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Это программное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. + + + + ElfViewer + + Open Folder + Открыть папку + + + + GameInfoClass + + Loading game list, please wait :3 + Загрузка списка игр, пожалуйста подождите :3 + + + Cancel + Отмена + + + Loading... + Загрузка... + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Выберите папку + + + Select which directory you want to install to. + Выберите папку, в которую вы хотите установить. + + + Install All Queued to Selected Folder + Установить все из очереди в выбранную папку + + + Delete PKG File on Install + Удалить файл PKG при установке + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Выберите папку + + + Directory to install games + Каталог для установки игр + + + Browse + Обзор + + + Error + Ошибка + + + The value for location to install games is not valid. + Недопустимое значение местоположения для установки игр. + + + Directory to install DLC + Каталог для установки DLC + + + + GuiContextMenus + + Create Shortcut + Создать ярлык + + + Cheats / Patches + Читы и патчи + + + SFO Viewer + Просмотр SFO + + + Trophy Viewer + Просмотр трофеев + + + Open Folder... + Открыть папку... + + + Open Game Folder + Открыть папку с игрой + + + Open Save Data Folder + Открыть папку сохранений + + + Open Log Folder + Открыть папку логов + + + Copy info... + Копировать информацию... + + + Copy Name + Копировать имя + + + Copy Serial + Копировать серийный номер + + + Copy All + Копировать всё + + + Delete... + Удалить... + + + Delete Game + Удалить игру + + + Delete Update + Удалить обновление + + + Delete DLC + Удалить DLC + + + Compatibility... + Совместимость... + + + Update database + Обновить базу данных + + + View report + Посмотреть отчет + + + Submit a report + Отправить отчёт + + + Shortcut creation + Создание ярлыка + + + Shortcut created successfully! + Ярлык создан успешно! + + + Error + Ошибка + + + Error creating shortcut! + Ошибка создания ярлыка! + + + Install PKG + Установить PKG + + + Game + Игры + + + requiresEnableSeparateUpdateFolder_MSG + Эта функция требует включения настройки 'Отдельная папка обновлений'. Если вы хотите использовать эту функцию, пожалуйста включите её. + + + This game has no update to delete! + У этой игры нет обновлений для удаления! + + + Update + Обновления + + + This game has no DLC to delete! + У этой игры нет DLC для удаления! + + + DLC + DLC + + + Delete %1 + Удалить %1 + + + Are you sure you want to delete %1's %2 directory? + Вы уверены, что хотите удалить папку %2 %1? + + + Open Update Folder + Открыть папку обновлений + + + Delete Save Data + Удалить сохранения + + + This game has no update folder to open! + У этой игры нет папки обновлений, которую можно открыть! + + + Failed to convert icon. + Не удалось преобразовать иконку. + + + This game has no save data to delete! + У этой игры нет сохранений, которые можно удалить! + + + Save Data + Сохранения + + + + MainWindow + + Open/Add Elf Folder + Открыть/Добавить папку Elf + + + Install Packages (PKG) + Установить пакеты (PKG) + + + Boot Game + Запустить игру + + + Check for Updates + Проверить обновления + + + About shadPS4 + О shadPS4 + + + Configure... + Настроить... + + + Install application from a .pkg file + Установить приложение из файла .pkg + + + Recent Games + Недавние игры + + + Open shadPS4 Folder + Открыть папку shadPS4 + + + Exit + Выход + + + Exit shadPS4 + Выйти из shadPS4 + + + Exit the application. + Выйти из приложения. + + + Show Game List + Показать список игр + + + Game List Refresh + Обновить список игр + + + Tiny + Крошечный + + + Small + Маленький + + + Medium + Средний + + + Large + Большой + + + List View + Список + + + Grid View + Сетка + + + Elf Viewer + Исполняемый файл + + + Game Install Directory + Каталог установки игры + + + Download Cheats/Patches + Скачать читы или патчи + + + Dump Game List + Дамп списка игр + + + PKG Viewer + Просмотр PKG + + + Search... + Поиск... + + + File + Файл + + + View + Вид + + + Game List Icons + Размер иконок списка игр + + + Game List Mode + Вид списка игр + + + Settings + Настройки + + + Utils + Утилиты + + + Themes + Темы + + + Help + Помощь + + + Dark + Темная + + + Light + Светлая + + + Green + Зеленая + + + Blue + Синяя + + + Violet + Фиолетовая + + + toolBar + Панель инструментов + + + Game List + Список игр + + + * Unsupported Vulkan Version + * Неподдерживаемая версия Vulkan + + + Download Cheats For All Installed Games + Скачать читы для всех установленных игр + + + Download Patches For All Games + Скачать патчи для всех игр + + + Download Complete + Скачивание завершено + + + You have downloaded cheats for all the games you have installed. + Вы скачали читы для всех установленных игр. + + + Patches Downloaded Successfully! + Патчи успешно скачаны! + + + All Patches available for all games have been downloaded. + Все доступные патчи для всех игр были скачаны. + + + Games: + Игры: + + + PKG File (*.PKG) + Файл PKG (*.PKG) + + + ELF files (*.bin *.elf *.oelf) + Файлы ELF (*.bin *.elf *.oelf) + + + Game Boot + Запуск игры + + + Only one file can be selected! + Можно выбрать только один файл! + + + PKG Extraction + Извлечение PKG + + + Patch detected! + Обнаружен патч! + + + PKG and Game versions match: + Версии PKG и игры совпадают: + + + Would you like to overwrite? + Хотите перезаписать? + + + PKG Version %1 is older than installed version: + Версия PKG %1 старше установленной версии: + + + Game is installed: + Игра установлена: + + + Would you like to install Patch: + Хотите установить патч: + + + DLC Installation + Установка DLC + + + Would you like to install DLC: %1? + Вы хотите установить DLC: %1? + + + DLC already installed: + DLC уже установлен: + + + Game already installed + Игра уже установлена + + + PKG is a patch, please install the game first! + PKG - это патч, сначала установите игру! + + + PKG ERROR + ОШИБКА PKG + + + Extracting PKG %1/%2 + Извлечение PKG %1/%2 + + + Extraction Finished + Извлечение завершено + + + Game successfully installed at %1 + Игра успешно установлена в %1 + + + File doesn't appear to be a valid PKG file + Файл не является допустимым файлом PKG + + + Run Game + Запустить игру + + + Eboot.bin file not found + Файл eboot.bin не найден + + + PKG File (*.PKG *.pkg) + Файл PKG (*.PKG *.pkg) + + + PKG is a patch or DLC, please install the game first! + Выбранный PKG является патчем или DLC, пожалуйста, сначала установите игру! + + + Game is already running! + Игра уже запущена! + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Открыть папку + + + &File + Файл + + + PKG ERROR + ОШИБКА PKG + + + + TrophyViewer + + Trophy Viewer + Просмотр трофеев + + + + SettingsDialog + + Settings + Настройки + + + General + Общее + + + System + Система + + + Console Language + Язык консоли + + + Emulator Language + Язык эмулятора + + + Emulator + Эмулятор + + + Enable Fullscreen + Полноэкранный режим + + + Fullscreen Mode + Тип полноэкранного режима + + + Enable Separate Update Folder + Отдельная папка обновлений + + + Default tab when opening settings + Вкладка по умолчанию при открытии настроек + + + Show Game Size In List + Показать размер игры в списке + + + Show Splash + Показывать заставку + + + Is PS4 Pro + Режим PS4 Pro + + + Enable Discord Rich Presence + Включить Discord Rich Presence + + + Username + Имя пользователя + + + Trophy Key + Ключ трофеев + + + Trophy + Трофеи + + + Logger + Логирование + + + Log Type + Тип логов + + + Log Filter + Фильтр логов + + + Open Log Location + Открыть местоположение журнала + + + Input + Ввод + + + Cursor + Курсор мыши + + + Hide Cursor + Скрывать курсор + + + Hide Cursor Idle Timeout + Время скрытия курсора при бездействии + + + s + сек + + + Controller + Контроллер + + + Back Button Behavior + Поведение кнопки назад + + + Graphics + Графика + + + Gui + Интерфейс + + + User + Пользователь + + + Graphics Device + Графическое устройство + + + Width + Ширина + + + Height + Высота + + + Vblank Divider + Делитель Vblank + + + Advanced + Продвинутые + + + Enable Shaders Dumping + Включить дамп шейдеров + + + Enable NULL GPU + Включить NULL GPU + + + Paths + Пути + + + Game Folders + Игровые папки + + + Add... + Добавить... + + + Remove + Удалить + + + Debug + Отладка + + + Enable Debug Dumping + Включить отладочные дампы + + + Enable Vulkan Validation Layers + Включить слои валидации Vulkan + + + Enable Vulkan Synchronization Validation + Включить валидацию синхронизации Vulkan + + + Enable RenderDoc Debugging + Включить отладку RenderDoc + + + Enable Crash Diagnostics + Включить диагностику сбоев + + + Collect Shaders + Собирать шейдеры + + + Copy GPU Buffers + Копировать буферы GPU + + + Host Debug Markers + Маркеры отладки хоста + + + Guest Debug Markers + Маркеры отладки гостя + + + Update + Обновление + + + Check for Updates at Startup + Проверка при запуске + + + Update Channel + Канал обновления + + + Check for Updates + Проверить обновления + + + GUI Settings + Настройки интерфейса + + + Title Music + Заглавная музыка + + + Disable Trophy Pop-ups + Отключить уведомления о трофеях + + + Play title music + Играть заглавную музыку + + + Update Compatibility Database On Startup + Обновлять базу совместимости при запуске + + + Game Compatibility + Совместимость игр + + + Display Compatibility Data + Показывать данные совместимости + + + Update Compatibility Database + Обновить базу совместимости + + + Volume + Громкость + + + Audio Backend + Звуковая подсистема + + + Save + Сохранить + + + Apply + Применить + + + Restore Defaults + По умолчанию + + + Close + Закрыть + + + Point your mouse at an option to display its description. + Наведите указатель мыши на опцию, чтобы отобразить ее описание. + + + consoleLanguageGroupBox + Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. + + + emulatorLanguageGroupBox + Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. + + + fullscreenCheckBox + Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11. + + + separateUpdatesCheckBox + Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем "CUSA00000-UPDATE", где идентификатор CUSA совпадает с идентификатором игры. + + + showSplashCheckBox + Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. + + + ps4proCheckBox + Режим PS4 Pro:\nЗаставляет эмулятор работать как PS4 Pro, что может включить специальные функции в играх, поддерживающих это. + + + discordRPCCheckbox + Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. + + + userName + Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. + + + TrophyKey + Ключ трофеев:\nКлюч, используемый для расшифровки трофеев. Должен быть получен из вашей взломанной консоли.\nДолжен содержать только шестнадцатеричные символы. + + + logTypeGroupBox + Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. + + + logFilter + Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. + + + updaterGroupBox + Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. + + + GUIMusicGroupBox + Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. + + + disableTrophycheckBox + Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по-прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). + + + hideCursorGroupBox + Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. + + + idleTimeoutGroupBox + Время скрытия курсора при бездействии:\nУстановите время, через которое курсор исчезнет при бездействии. + + + backButtonBehaviorGroupBox + Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. + + + enableCompatibilityCheckBox + Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. + + + checkCompatibilityOnStartupCheckBox + Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. + + + updateCompatibilityButton + Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. + + + Never + Никогда + + + Idle + При бездействии + + + Always + Всегда + + + Touchpad Left + Тачпад слева + + + Touchpad Right + Тачпад справа + + + Touchpad Center + Центр тачпада + + + None + Нет + + + graphicsAdapterGroupBox + Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите "Автовыбор", чтобы определить GPU автоматически. + + + resolutionLayout + Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. + + + heightDivider + Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! + + + dumpShadersCheckBox + Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. + + + nullGpuCheckBox + Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. + + + gameFoldersBox + Игровые папки:\nСписок папок для проверки установленных игр. + + + addFolderButton + Добавить:\nДобавить папку в список. + + + removeFolderButton + Удалить:\nУдалить папку из списка. + + + debugDump + Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. + + + vkValidationCheckBox + Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. + + + vkSyncValidationCheckBox + Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. + + + rdocCheckBox + Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с RenderDoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. + + + collectShaderCheckBox + Собирать шейдеры:\nВам необходимо включить эту функцию для редактирования шейдеров с помощью меню отладки (Ctrl + F10). + + + crashDiagnosticsCheckBox + Диагностика сбоев:\nСоздает .yaml файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. + + + copyGPUBuffersCheckBox + Копировать буферы GPU:\nПозволяет обойти состояния гонки, связанные с отправками GPU.\nМожет помочь или не помочь при сбоях PM4 типа 0. + + + hostMarkersCheckBox + Маркеры отладки хоста:\nДобавляет информацию на стороне эмулятора, например маркеры для определенных команд AMDGPU, вокруг команд Vulkan, а также присваивает ресурсам отладочные имена.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. + + + guestMarkersCheckBox + Маркеры отладки гостя:\nДобавляет любые отладочные маркеры, добавленные самой игрой, в буфер команд.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. + + + saveDataBox + Путь сохранений:\nПапка, в которой будут храниться сохранения игр. + + + browseButton + Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений. + + + Borderless + Без полей + + + True + Истинный + + + Release + Release + + + Nightly + Nightly + + + GUI + Интерфейс + + + Set the volume of the background music. + Установите громкость фоновой музыки. + + + Enable Motion Controls + Включить управление движением + + + Save Data Path + Путь сохранений + + + Browse + Обзор + + + async + асинхронный + + + sync + синхронный + + + Directory to install games + Каталог для установки игр + + + Directory to save data + Каталог для сохранений + + + Auto Select + Автовыбор + + + + CheatsPatches + + Cheats / Patches for + Читы и патчи для + + + defaultTextEdit_MSG + Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Изображение недоступно + + + Serial: + Серийный номер: + + + Version: + Версия: + + + Size: + Размер: + + + Select Cheat File: + Выберите файл чита: + + + Repository: + Репозиторий: + + + Download Cheats + Скачать читы + + + Delete File + Удалить файл + + + No files selected. + Файлы не выбраны. + + + You can delete the cheats you don't want after downloading them. + Вы можете удалить ненужные читы после их скачивания. + + + Do you want to delete the selected file?\n%1 + Вы хотите удалить выбранный файл?\n%1 + + + Select Patch File: + Выберите файл патча: + + + Download Patches + Скачать патчи + + + Save + Сохранить + + + Cheats + Читы + + + Patches + Патчи + + + Error + Ошибка + + + No patch selected. + Патч не выбран. + + + Unable to open files.json for reading. + Не удалось открыть файл files.json для чтения. + + + No patch file found for the current serial. + Не найден файл патча для текущего серийного номера. + + + Unable to open the file for reading. + Не удалось открыть файл для чтения. + + + Unable to open the file for writing. + Не удалось открыть файл для записи. + + + Failed to parse XML: + Не удалось разобрать XML: + + + Success + Успех + + + Options saved successfully. + Опции успешно сохранены. + + + Invalid Source + Неверный источник + + + The selected source is invalid. + Выбранный источник недействителен. + + + File Exists + Файл существует + + + File already exists. Do you want to replace it? + Файл уже существует. Хотите заменить его? + + + Failed to save file: + Не удалось сохранить файл: + + + Failed to download file: + Не удалось скачать файл: + + + Cheats Not Found + Читы не найдены + + + CheatsNotFound_MSG + Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. + + + Cheats Downloaded Successfully + Читы успешно скачаны + + + CheatsDownloadedSuccessfully_MSG + Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. + + + Failed to save: + Не удалось сохранить: + + + Failed to download: + Не удалось скачать: + + + Download Complete + Скачивание завершено + + + DownloadComplete_MSG + Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. + + + Failed to parse JSON data from HTML. + Не удалось разобрать данные JSON из HTML. + + + Failed to retrieve HTML page. + Не удалось получить HTML-страницу. + + + The game is in version: %1 + Игра в версии: %1 + + + The downloaded patch only works on version: %1 + Скачанный патч работает только на версии: %1 + + + You may need to update your game. + Вам может понадобиться обновить игру. + + + Incompatibility Notice + Уведомление о несовместимости + + + Failed to open file: + Не удалось открыть файл: + + + XML ERROR: + ОШИБКА XML: + + + Failed to open files.json for writing + Не удалось открыть файл files.json для записи + + + Author: + Автор: + + + Directory does not exist: + Каталог не существует: + + + Failed to open files.json for reading. + Не удалось открыть файл files.json для чтения. + + + Name: + Имя: + + + Can't apply cheats before the game is started + Невозможно применить читы до начала игры + + + Close + Закрыть + + + Error: + Ошибка: + + + ERROR + ОШИБКА + + + + GameListFrame + + Icon + Иконка + + + Name + Название + + + Serial + Серийный номер + + + Compatibility + Совместимость + + + Region + Регион + + + Firmware + Прошивка + + + Size + Размер + + + Version + Версия + + + Path + Путь + + + Play Time + Время в игре + + + Never Played + Нет + + + h + ч + + + m + м + + + s + с + + + Compatibility is untested + Совместимость не проверена + + + Game does not initialize properly / crashes the emulator + Игра не инициализируется правильно / эмулятор вылетает + + + Game boots, but only displays a blank screen + Игра запускается, но показывает только пустой экран + + + Game displays an image but does not go past the menu + Игра показывает картинку, но не проходит дальше меню + + + Game has game-breaking glitches or unplayable performance + Игра имеет ломающие игру глюки или плохую производительность + + + Game can be completed with playable performance and no major glitches + Игра может быть пройдена с хорошей производительностью и без серьезных сбоев + + + Click to go to issue + Нажмите, чтобы перейти к проблеме + + + Last updated + Последнее обновление + + + + CheckUpdate + + Auto Updater + Автообновление + + + Error + Ошибка + + + Network error: + Сетевая ошибка: + + + Failed to parse update information. + Не удалось разобрать информацию об обновлении. + + + No pre-releases found. + Предварительных версий не найдено. + + + Invalid release data. + Недопустимые данные релиза. + + + No download URL found for the specified asset. + Не найден URL для загрузки указанного ресурса. + + + Your version is already up to date! + Ваша версия уже обновлена! + + + Update Available + Доступно обновление + + + Update Channel + Канал обновления + + + Current Version + Текущая версия + + + Latest Version + Последняя версия + + + Do you want to update? + Вы хотите обновиться? + + + Show Changelog + Показать журнал изменений + + + Check for Updates at Startup + Проверка при запуске + + + Update + Обновить + + + No + Нет + + + Hide Changelog + Скрыть журнал изменений + + + Changes + Журнал изменений + + + Network error occurred while trying to access the URL + Произошла сетевая ошибка при попытке доступа к URL + + + Download Complete + Скачивание завершено + + + The update has been downloaded, press OK to install. + Обновление загружено, нажмите OK для установки. + + + Failed to save the update file at + Не удалось сохранить файл обновления в + + + Starting Update... + Начинаем обновление... + + + Failed to create the update script file + Не удалось создать файл скрипта обновления + + + + GameListUtils + + B + Б + + + KB + КБ + + + MB + МБ + + + GB + ГБ + + + TB + ТБ + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Загрузка данных о совместимости, пожалуйста, подождите + + + Cancel + Отмена + + + Loading... + Загрузка... + + + Error + Ошибка + + + Unable to update compatibility data! Try again later. + Не удалось обновить данные совместимости! Повторите попытку позже. + + + Unable to open compatibility.json for writing. + Не удалось открыть файл compatibility.json для записи. + + + Unknown + Неизвестно + + + Nothing + Ничего + + + Boots + Запускается + + + Menus + В меню + + + Ingame + В игре + + + Playable + Играбельно + + From 83abaafdfad7685f62a97e0610b169ab713d7320 Mon Sep 17 00:00:00 2001 From: C4ndyF1sh <128715345+C4ndyF1sh@users.noreply.github.com> Date: Mon, 3 Feb 2025 11:53:26 +0100 Subject: [PATCH 211/455] qt: Add more options to the "Copy info..." section + update en.ts/de.ts (#2322) * Update gui_context_menus.h * Update gui_context_menus.h * Update en.ts * Update de.ts * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update gui_context_menus.h * Update en.ts * Update de.ts * Update gui_context_menus.h (last one) * very small fix en.ts * remove empty line * merge https://github.com/shadps4-emu/shadPS4/pull/2316 Adds german translations to compatibility status --- src/qt_gui/gui_context_menus.h | 14 ++++++++++++++ src/qt_gui/translations/de.ts | 35 ++++++++++++++++++++++++++++++++++ src/qt_gui/translations/en.ts | 8 ++++++++ 3 files changed, 57 insertions(+) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index bdc2aec0c..262a1d733 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -77,10 +77,14 @@ public: QMenu* copyMenu = new QMenu(tr("Copy info..."), widget); QAction* copyName = new QAction(tr("Copy Name"), widget); QAction* copySerial = new QAction(tr("Copy Serial"), widget); + QAction* copyVersion = new QAction(tr("Copy Version"), widget); + QAction* copySize = new QAction(tr("Copy Size"), widget); QAction* copyNameAll = new QAction(tr("Copy All"), widget); copyMenu->addAction(copyName); copyMenu->addAction(copySerial); + copyMenu->addAction(copyVersion); + copyMenu->addAction(copySize); copyMenu->addAction(copyNameAll); menu.addMenu(copyMenu); @@ -346,6 +350,16 @@ public: clipboard->setText(QString::fromStdString(m_games[itemID].serial)); } + if (selected == copyVersion) { + QClipboard* clipboard = QGuiApplication::clipboard(); + clipboard->setText(QString::fromStdString(m_games[itemID].version)); + } + + if (selected == copySize) { + QClipboard* clipboard = QGuiApplication::clipboard(); + clipboard->setText(QString::fromStdString(m_games[itemID].size)); + } + if (selected == copyNameAll) { QClipboard* clipboard = QGuiApplication::clipboard(); QString combinedText = QString("Name:%1 | Serial:%2 | Version:%3 | Size:%4") diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 71ee066c1..4985160ff 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -128,6 +128,14 @@ Copy Serial Seriennummer kopieren + + Copy Version + Version kopieren + + + Copy Size + Größe kopieren + Copy All Alles kopieren @@ -1421,4 +1429,31 @@ TB
+ + CompatibilityInfoClass + + Unknown + Unbekannt + + + Nothing + Nichts + + + Boots + Startet + + + Menus + Menüs + + + Ingame + ImSpiel + + + Playable + Spielbar + + diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 58d6e9aa8..afaa17520 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -124,6 +124,14 @@ Copy Serial Copy Serial + + Copy Version + Copy Version + + + Copy Size + Copy Size + Copy All Copy All From cef7edaea9799122f4dd3787015e15367c13562e Mon Sep 17 00:00:00 2001 From: DemoJameson Date: Mon, 3 Feb 2025 18:53:40 +0800 Subject: [PATCH 212/455] Update zh_CN translation (#2328) --- src/qt_gui/translations/zh_CN.ts | 56 ++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 00f4337c0..1e6124c85 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -52,7 +52,7 @@ Select which directory you want to install to. - 选择你想要安装到的目录。 + 选择您想要安装到的目录。
@@ -186,7 +186,7 @@ requiresEnableSeparateUpdateFolder_MSG - 这个功能需要“启用单独的更新目录”配置选项才能正常运行,如果你想要使用这个功能,请启用它。 + 这个功能需要“启用单独的更新目录”配置选项才能正常运行,如果您想要使用这个功能,请启用它。 This game has no update to delete! @@ -210,7 +210,7 @@ Are you sure you want to delete %1's %2 directory? - 你确定要删除 %1 的%2目录? + 您确定要删除 %1 的%2目录? @@ -702,24 +702,25 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + 启用崩溃诊断 Collect Shaders - Collect Shaders + 收集着色器 Copy GPU Buffers - Copy GPU Buffers + 复制 GPU 缓冲区 Host Debug Markers - Host Debug Markers + Host 调试标记 Guest Debug Markers - Guest Debug Markers + Geust 调试标记 + Update 更新 @@ -954,23 +955,23 @@ collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + 收集着色器:\n您需要启用此功能才能使用调试菜单(Ctrl + F10)编辑着色器。 crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + 崩溃诊断:\n创建一个包含崩溃时 Vulkan 状态的 .yaml 文件。\n对于调试“Device lost”错误很有用。如果您启用了此功能,您应该同时启用 Host 和 Guest 调试标记。\n此功能在 Intel 显卡上不可用。\n您需要启用 Vulkan 验证层并安装 Vulkan SDK 才能使用此功能。 copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + 复制 GPU 缓冲区:\n绕过涉及 GPU 提交的竞态条件。\n对于 PM4 type 0 崩溃可能有帮助,也可能没有帮助。 hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host 调试标记:\n在 Vulkan 命令周围插入模拟器端信息,如特定 AMD GPU 命令的标记,以及为资源提供调试名称。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest 调试标记:\n在命令缓冲区中插入游戏本身添加的任何调试标记。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 saveDataBox @@ -1284,7 +1285,7 @@ Game can be completed with playable performance and no major glitches - 游戏能在可玩的性能下完成且没有重大 Bug + 游戏能在可玩的性能下通关且没有重大 Bug @@ -1413,4 +1414,31 @@ TB + + CompatibilityInfoClass + + Unknown + 未知 + + + Nothing + 无法启动 + + + Boots + 可启动 + + + Menus + 可进入菜单 + + + Ingame + 可进入游戏内 + + + Playable + 可通关 + + From 02ad2b78faf190fb9bc545ccdfadb091913c17c1 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Mon, 3 Feb 2025 11:53:57 +0100 Subject: [PATCH 213/455] Fork detection: Fix Windows naming + add a new check for fork detection (#2321) * Possible fix for Windows * Check if remote.pushDefault is set when generating the remote link * Remove left-in lines I missed before --- CMakeLists.txt | 15 +++++++++++++-- src/emulator.cpp | 10 +++++++--- src/qt_gui/main_window.cpp | 10 +++++++--- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4822658c6..b0e1115b3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,9 +115,20 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -# Default to origin if there's no upstream set or if the command failed +# If there's no upstream set or the command failed, check remote.pushDefault if (GIT_BRANCH_RESULT OR GIT_REMOTE_NAME STREQUAL "") - set(GIT_REMOTE_NAME "origin") + execute_process( + COMMAND git config --get remote.pushDefault + OUTPUT_VARIABLE GIT_REMOTE_NAME + RESULT_VARIABLE GIT_PUSH_DEFAULT_RESULT + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + # If remote.pushDefault is not set or fails, default to origin + if (GIT_PUSH_DEFAULT_RESULT OR GIT_REMOTE_NAME STREQUAL "") + set(GIT_REMOTE_NAME "origin") + endif() else() # Extract remote name if the output contains a remote/branch format string(FIND "${GIT_REMOTE_NAME}" "/" INDEX) diff --git a/src/emulator.cpp b/src/emulator.cpp index ba8d8917c..cd981add2 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -201,12 +201,16 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector Date: Mon, 3 Feb 2025 09:37:28 -0600 Subject: [PATCH 214/455] Fix VideoOut events (#2330) * Fix event data for VideoOut events Fix is based on some decompilation work shared by red_prig. * Cleanup * Oops * Style fixes * Clang * Fix libSceVideoOut event idents Based on some decompilation work, events coming from libSceVideoOut use a separate set of values for identifiers. These values are only converted to OrbisVideoOutEventId values during calls to sceVideoOutGetEventId. For convenience, I've placed all relevant identifiers into a enum called OrbisVideoOutInternalEventId. Thanks to @red_prig for the tips. * Fix? Seems like `static_cast(hint) & 0xFF == event.ident` here, and doing those right shifts on the event.ident winds up breaking stuff. Without this change, the if always fails because event_id was getting set to 0 instead. * Clang --- src/core/libraries/kernel/equeue.cpp | 6 +++++- src/core/libraries/kernel/equeue.h | 20 +++++++++++++++++ src/core/libraries/videoout/driver.cpp | 10 +++++---- src/core/libraries/videoout/video_out.cpp | 26 +++++++++++++++++++---- src/core/libraries/videoout/video_out.h | 17 ++++++++++++++- 5 files changed, 69 insertions(+), 10 deletions(-) diff --git a/src/core/libraries/kernel/equeue.cpp b/src/core/libraries/kernel/equeue.cpp index 64d4966c0..a4916208a 100644 --- a/src/core/libraries/kernel/equeue.cpp +++ b/src/core/libraries/kernel/equeue.cpp @@ -84,7 +84,11 @@ bool EqueueInternal::TriggerEvent(u64 ident, s16 filter, void* trigger_data) { std::scoped_lock lock{m_mutex}; for (auto& event : m_events) { if (event.event.ident == ident && event.event.filter == filter) { - event.Trigger(trigger_data); + if (filter == SceKernelEvent::Filter::VideoOut) { + event.TriggerDisplay(trigger_data); + } else { + event.Trigger(trigger_data); + } has_found = true; } } diff --git a/src/core/libraries/kernel/equeue.h b/src/core/libraries/kernel/equeue.h index 2db5e6ca7..11c09bb37 100644 --- a/src/core/libraries/kernel/equeue.h +++ b/src/core/libraries/kernel/equeue.h @@ -9,6 +9,7 @@ #include #include +#include "common/rdtsc.h" #include "common/types.h" namespace Core::Loader { @@ -81,6 +82,25 @@ struct EqueueEvent { event.data = reinterpret_cast(data); } + void TriggerDisplay(void* data) { + is_triggered = true; + auto hint = reinterpret_cast(data); + if (hint != 0) { + auto hint_h = static_cast(hint >> 8) & 0xFFFFFF; + auto ident_h = static_cast(event.ident >> 40); + if ((static_cast(hint) & 0xFF) == event.ident && event.ident != 0xFE && + ((hint_h ^ ident_h) & 0xFF) == 0) { + auto time = Common::FencedRDTSC(); + auto mask = 0xF000; + if ((static_cast(event.data) & 0xF000) != 0xF000) { + mask = (static_cast(event.data) + 0x1000) & 0xF000; + } + event.data = (mask | static_cast(static_cast(time) & 0xFFF) | + (hint & 0xFFFFFFFFFFFF0000)); + } + } + } + bool IsTriggered() const { return is_triggered; } diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index de5421fd7..0f832910c 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -185,9 +185,11 @@ void VideoOutDriver::Flip(const Request& req) { // Trigger flip events for the port. for (auto& event : port->flip_events) { if (event != nullptr) { - event->TriggerEvent(u64(OrbisVideoOutEventId::Flip), - Kernel::SceKernelEvent::Filter::VideoOut, - reinterpret_cast(req.flip_arg)); + event->TriggerEvent( + static_cast(OrbisVideoOutInternalEventId::Flip), + Kernel::SceKernelEvent::Filter::VideoOut, + reinterpret_cast(static_cast(OrbisVideoOutInternalEventId::Flip) | + (req.flip_arg << 16))); } } @@ -323,7 +325,7 @@ void VideoOutDriver::PresentThread(std::stop_token token) { // Trigger flip events for the port. for (auto& event : main_port.vblank_events) { if (event != nullptr) { - event->TriggerEvent(u64(OrbisVideoOutEventId::Vblank), + event->TriggerEvent(static_cast(OrbisVideoOutInternalEventId::Vblank), Kernel::SceKernelEvent::Filter::VideoOut, nullptr); } } diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 78a2b11a4..27a3fe082 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -50,7 +50,7 @@ s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(Kernel::SceKernelEqueue eq, s32 handle, } Kernel::EqueueEvent event{}; - event.event.ident = u64(OrbisVideoOutEventId::Flip); + event.event.ident = static_cast(OrbisVideoOutInternalEventId::Flip); event.event.filter = Kernel::SceKernelEvent::Filter::VideoOut; event.event.flags = Kernel::SceKernelEvent::Flags::Add; event.event.udata = udata; @@ -76,7 +76,7 @@ s32 PS4_SYSV_ABI sceVideoOutAddVblankEvent(Kernel::SceKernelEqueue eq, s32 handl } Kernel::EqueueEvent event{}; - event.event.ident = u64(OrbisVideoOutEventId::Vblank); + event.event.ident = static_cast(OrbisVideoOutInternalEventId::Vblank); event.event.filter = Kernel::SceKernelEvent::Filter::VideoOut; event.event.flags = Kernel::SceKernelEvent::Flags::Add; event.event.udata = udata; @@ -156,9 +156,27 @@ int PS4_SYSV_ABI sceVideoOutGetEventId(const Kernel::SceKernelEvent* ev) { return ORBIS_VIDEO_OUT_ERROR_INVALID_ADDRESS; } if (ev->filter != Kernel::SceKernelEvent::Filter::VideoOut) { - return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT_QUEUE; + return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT; + } + + OrbisVideoOutInternalEventId internal_event_id = + static_cast(ev->ident); + switch (internal_event_id) { + case OrbisVideoOutInternalEventId::Flip: + return static_cast(OrbisVideoOutEventId::Flip); + case OrbisVideoOutInternalEventId::Vblank: + case OrbisVideoOutInternalEventId::SysVblank: + return static_cast(OrbisVideoOutEventId::Vblank); + case OrbisVideoOutInternalEventId::PreVblankStart: + return static_cast(OrbisVideoOutEventId::PreVblankStart); + case OrbisVideoOutInternalEventId::SetMode: + return static_cast(OrbisVideoOutEventId::SetMode); + case OrbisVideoOutInternalEventId::Position: + return static_cast(OrbisVideoOutEventId::Position); + default: { + return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT; + } } - return ev->ident; } int PS4_SYSV_ABI sceVideoOutGetEventData(const Kernel::SceKernelEvent* ev, int64_t* data) { diff --git a/src/core/libraries/videoout/video_out.h b/src/core/libraries/videoout/video_out.h index 5af9d550d..2918fac30 100644 --- a/src/core/libraries/videoout/video_out.h +++ b/src/core/libraries/videoout/video_out.h @@ -40,7 +40,22 @@ constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_NONE = 0; constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_VR = 7; constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_STRICT_COLORIMETRY = 8; -enum class OrbisVideoOutEventId : s16 { Flip = 0, Vblank = 1, PreVblankStart = 2 }; +enum class OrbisVideoOutEventId : s16 { + Flip = 0, + Vblank = 1, + PreVblankStart = 2, + SetMode = 8, + Position = 12, +}; + +enum class OrbisVideoOutInternalEventId : s16 { + Flip = 0x6, + Vblank = 0x7, + SetMode = 0x51, + Position = 0x58, + PreVblankStart = 0x59, + SysVblank = 0x63, +}; enum class AspectRatioMode : s32 { Ratio16_9 = 0, From 97441b62d1749b0ddeaf20dc8639a1c942d6941a Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Tue, 4 Feb 2025 03:49:16 -0300 Subject: [PATCH 215/455] Fix game title sorting - Grid view (#2341) --- src/qt_gui/game_info.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/game_info.h b/src/qt_gui/game_info.h index 99805cd52..380c79e70 100644 --- a/src/qt_gui/game_info.h +++ b/src/qt_gui/game_info.h @@ -19,7 +19,10 @@ public: QVector m_games; static bool CompareStrings(GameInfo& a, GameInfo& b) { - return a.name < b.name; + std::string name_a = a.name, name_b = b.name; + std::transform(name_a.begin(), name_a.end(), name_a.begin(), ::tolower); + std::transform(name_b.begin(), name_b.end(), name_b.begin(), ::tolower); + return name_a < name_b; } static GameInfo readGameInfo(const std::filesystem::path& filePath) { @@ -72,4 +75,4 @@ public: } return game; } -}; \ No newline at end of file +}; From e0d85a7e58f56c67a5e2d621738afa12b0436ee7 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Tue, 4 Feb 2025 14:50:32 +0800 Subject: [PATCH 216/455] add controller remapping GUI (#2311) * Initial Version - controller remapping GUI * rework saving to allow for multiple outputs to an input * License header * Remove PS logo from image * Add per game checkbox, fix filename, better whitespace deletion * Reorganize variables, correctly set common config label when selected * Add option to unmap, set mapping to unmapped when config entry is absent * Add XBox labels * Remove parsing from save function, make window more compact * Fix typo * Code cleanup * Additional cleanup --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- CMakeLists.txt | 3 + REUSE.toml | 1 + src/images/ps4_controller.png | Bin 0 -> 93841 bytes src/qt_gui/control_settings.cpp | 498 +++++++++++ src/qt_gui/control_settings.h | 52 ++ src/qt_gui/control_settings.ui | 1379 +++++++++++++++++++++++++++++++ src/qt_gui/main_window.cpp | 5 +- src/shadps4.qrc | 1 + 8 files changed, 1937 insertions(+), 2 deletions(-) create mode 100644 src/images/ps4_controller.png create mode 100644 src/qt_gui/control_settings.cpp create mode 100644 src/qt_gui/control_settings.h create mode 100644 src/qt_gui/control_settings.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index b0e1115b3..8ecbbf0d6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -897,6 +897,9 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/cheats_patches.h src/qt_gui/compatibility_info.cpp src/qt_gui/compatibility_info.h + src/qt_gui/control_settings.cpp + src/qt_gui/control_settings.h + src/qt_gui/control_settings.ui src/qt_gui/main_window_ui.h src/qt_gui/main_window.cpp src/qt_gui/main_window.h diff --git a/REUSE.toml b/REUSE.toml index a62974bcd..63242edb2 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -38,6 +38,7 @@ path = [ "src/images/list_mode_icon.png", "src/images/pause_icon.png", "src/images/play_icon.png", + "src/images/ps4_controller.png", "src/images/refresh_icon.png", "src/images/settings_icon.png", "src/images/stop_icon.png", diff --git a/src/images/ps4_controller.png b/src/images/ps4_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2c1d4f1a18ad2af8146e9f08fb0b63687b2018 GIT binary patch literal 93841 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 +#include +#include "common/path_util.h" +#include "control_settings.h" +#include "kbm_config_dialog.h" +#include "ui_control_settings.h" + +ControlSettings::ControlSettings(std::shared_ptr game_info_get, QWidget* parent) + : QDialog(parent), m_game_info(game_info_get), ui(new Ui::ControlSettings) { + + ui->setupUi(this); + ui->PerGameCheckBox->setChecked(!Config::GetUseUnifiedInputConfig()); + + AddBoxItems(); + SetUIValuestoMappings(); + + connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton* button) { + if (button == ui->buttonBox->button(QDialogButtonBox::Save)) { + SaveControllerConfig(true); + } else if (button == ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)) { + SetDefault(); + } else if (button == ui->buttonBox->button(QDialogButtonBox::Apply)) { + SaveControllerConfig(false); + } + }); + + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close); + connect(ui->KBMButton, &QPushButton::clicked, this, [this] { + auto KBMWindow = new EditorDialog(this); + KBMWindow->exec(); + }); + connect(ui->ProfileComboBox, &QComboBox::currentTextChanged, this, [this] { + GetGameTitle(); + SetUIValuestoMappings(); + }); + + connect(ui->LeftDeadzoneSlider, &QSlider::valueChanged, this, + [this](int value) { ui->LeftDeadzoneValue->setText(QString::number(value)); }); + connect(ui->RightDeadzoneSlider, &QSlider::valueChanged, this, + [this](int value) { ui->RightDeadzoneValue->setText(QString::number(value)); }); + + connect(ui->LStickUpBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->LStickDownBox->setCurrentIndex(value); }); + connect(ui->LStickDownBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->LStickUpBox->setCurrentIndex(value); }); + connect(ui->LStickRightBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->LStickLeftBox->setCurrentIndex(value); }); + connect(ui->LStickLeftBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->LStickRightBox->setCurrentIndex(value); }); + + connect(ui->RStickUpBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->RStickDownBox->setCurrentIndex(value); }); + connect(ui->RStickDownBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->RStickUpBox->setCurrentIndex(value); }); + connect(ui->RStickRightBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->RStickLeftBox->setCurrentIndex(value); }); + connect(ui->RStickLeftBox, &QComboBox::currentIndexChanged, this, + [this](int value) { ui->RStickRightBox->setCurrentIndex(value); }); +} + +void ControlSettings::SaveControllerConfig(bool CloseOnSave) { + QList list; + list << ui->RStickUpBox << ui->RStickRightBox << ui->LStickUpBox << ui->LStickRightBox; + int count_axis_left_x = 0, count_axis_left_y = 0, count_axis_right_x = 0, + count_axis_right_y = 0; + for (const auto& i : list) { + if (i->currentText() == "axis_left_x") { + count_axis_left_x = count_axis_left_x + 1; + } else if (i->currentText() == "axis_left_y") { + count_axis_left_y = count_axis_left_y + 1; + } else if (i->currentText() == "axis_right_x") { + count_axis_right_x = count_axis_right_x + 1; + } else if (i->currentText() == "axis_right_y") { + count_axis_right_y = count_axis_right_y + 1; + } + } + + if (count_axis_left_x > 1 | count_axis_left_y > 1 | count_axis_right_x > 1 | + count_axis_right_y > 1) { + QMessageBox::StandardButton nosave; + nosave = QMessageBox::information(this, "Unable to Save", + "Cannot bind axis values more than once"); + return; + } + + std::string config_id; + config_id = (ui->ProfileComboBox->currentText() == "Common Config") + ? "default" + : ui->ProfileComboBox->currentText().toStdString(); + const auto config_file = Config::GetFoolproofKbmConfigFile(config_id); + + int lineCount = 0; + std::string line; + std::vector lines; + std::string output_string = "", input_string = ""; + std::fstream file(config_file); + + while (std::getline(file, line)) { + lineCount++; + + std::size_t comment_pos = line.find('#'); + if (comment_pos != std::string::npos) { + if (!line.contains("Range of deadzones")) + lines.push_back(line); + continue; + } + + std::size_t equal_pos = line.find('='); + if (equal_pos == std::string::npos) { + lines.push_back(line); + continue; + } + + output_string = line.substr(0, equal_pos - 1); + input_string = line.substr(equal_pos + 2); + + if (std::find(ControllerInputs.begin(), ControllerInputs.end(), input_string) != + ControllerInputs.end() || + output_string == "analog_deadzone") { + line.erase(); + continue; + } + lines.push_back(line); + } + + file.close(); + + input_string = "cross"; + output_string = ui->ABox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "circle"; + output_string = ui->BBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "square"; + output_string = ui->XBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "triangle"; + output_string = ui->YBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + lines.push_back(""); + + input_string = "l1"; + output_string = ui->LBBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "r1"; + output_string = ui->RBBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "l2"; + output_string = ui->LTBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "r2"; + output_string = ui->RTBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "l3"; + output_string = ui->LClickBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "r3"; + output_string = ui->RClickBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + lines.push_back(""); + + input_string = "back"; + output_string = ui->BackBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "options"; + output_string = ui->StartBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + lines.push_back(""); + + input_string = "pad_up"; + output_string = ui->DpadUpBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "pad_down"; + output_string = ui->DpadDownBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "pad_left"; + output_string = ui->DpadLeftBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "pad_right"; + output_string = ui->DpadRightBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + lines.push_back(""); + + input_string = "axis_left_x"; + output_string = ui->LStickRightBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "axis_left_y"; + output_string = ui->LStickUpBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "axis_right_x"; + output_string = ui->RStickRightBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + input_string = "axis_right_y"; + output_string = ui->RStickUpBox->currentText().toStdString(); + lines.push_back(output_string + " = " + input_string); + + lines.push_back(""); + lines.push_back("# Range of deadzones: 1 (almost none) to 127 (max)"); + + std::string deadzonevalue = std::to_string(ui->LeftDeadzoneSlider->value()); + lines.push_back("analog_deadzone = leftjoystick, " + deadzonevalue); + + deadzonevalue = std::to_string(ui->RightDeadzoneSlider->value()); + lines.push_back("analog_deadzone = rightjoystick, " + deadzonevalue); + + std::vector save; + bool CurrentLineEmpty = false, LastLineEmpty = false; + for (auto const& line : lines) { + LastLineEmpty = CurrentLineEmpty ? true : false; + CurrentLineEmpty = line.empty() ? true : false; + if (!CurrentLineEmpty || !LastLineEmpty) + save.push_back(line); + } + + std::ofstream output_file(config_file); + for (auto const& line : save) { + output_file << line << '\n'; + } + output_file.close(); + + Config::SetUseUnifiedInputConfig(!ui->PerGameCheckBox->isChecked()); + Config::save(Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "config.toml"); + + if (CloseOnSave) + QWidget::close(); +} + +void ControlSettings::SetDefault() { + ui->ABox->setCurrentIndex(0); + ui->BBox->setCurrentIndex(1); + ui->XBox->setCurrentIndex(2); + ui->YBox->setCurrentIndex(3); + ui->DpadUpBox->setCurrentIndex(11); + ui->DpadDownBox->setCurrentIndex(12); + ui->DpadLeftBox->setCurrentIndex(13); + ui->DpadRightBox->setCurrentIndex(14); + ui->LClickBox->setCurrentIndex(8); + ui->RClickBox->setCurrentIndex(9); + ui->LBBox->setCurrentIndex(4); + ui->RBBox->setCurrentIndex(5); + ui->LTBox->setCurrentIndex(6); + ui->RTBox->setCurrentIndex(7); + ui->StartBox->setCurrentIndex(10); + ui->BackBox->setCurrentIndex(15); + + ui->LStickUpBox->setCurrentIndex(1); + ui->LStickDownBox->setCurrentIndex(1); + ui->LStickLeftBox->setCurrentIndex(0); + ui->LStickRightBox->setCurrentIndex(0); + ui->RStickUpBox->setCurrentIndex(3); + ui->RStickDownBox->setCurrentIndex(3); + ui->RStickLeftBox->setCurrentIndex(2); + ui->RStickRightBox->setCurrentIndex(2); + + ui->LeftDeadzoneSlider->setValue(2); + ui->RightDeadzoneSlider->setValue(2); +} + +void ControlSettings::AddBoxItems() { + ui->DpadUpBox->addItems(ButtonOutputs); + ui->DpadDownBox->addItems(ButtonOutputs); + ui->DpadLeftBox->addItems(ButtonOutputs); + ui->DpadRightBox->addItems(ButtonOutputs); + ui->LBBox->addItems(ButtonOutputs); + ui->RBBox->addItems(ButtonOutputs); + ui->LTBox->addItems(ButtonOutputs); + ui->RTBox->addItems(ButtonOutputs); + ui->RClickBox->addItems(ButtonOutputs); + ui->LClickBox->addItems(ButtonOutputs); + ui->StartBox->addItems(ButtonOutputs); + ui->ABox->addItems(ButtonOutputs); + ui->BBox->addItems(ButtonOutputs); + ui->XBox->addItems(ButtonOutputs); + ui->YBox->addItems(ButtonOutputs); + ui->BackBox->addItems(ButtonOutputs); + + ui->LStickUpBox->addItems(StickOutputs); + ui->LStickDownBox->addItems(StickOutputs); + ui->LStickLeftBox->addItems(StickOutputs); + ui->LStickRightBox->addItems(StickOutputs); + ui->RStickUpBox->addItems(StickOutputs); + ui->RStickDownBox->addItems(StickOutputs); + ui->RStickLeftBox->addItems(StickOutputs); + ui->RStickRightBox->addItems(StickOutputs); + + ui->ProfileComboBox->addItem("Common Config"); + for (int i = 0; i < m_game_info->m_games.size(); i++) { + ui->ProfileComboBox->addItem(QString::fromStdString(m_game_info->m_games[i].serial)); + } + ui->ProfileComboBox->setCurrentText("Common Config"); + ui->TitleLabel->setText("Common Config"); +} + +void ControlSettings::SetUIValuestoMappings() { + std::string config_id; + config_id = (ui->ProfileComboBox->currentText() == "Common Config") + ? "default" + : ui->ProfileComboBox->currentText().toStdString(); + + const auto config_file = Config::GetFoolproofKbmConfigFile(config_id); + std::ifstream file(config_file); + + bool CrossExists = false, CircleExists = false, SquareExists = false, TriangleExists = false, + L1Exists = false, L2Exists = false, L3Exists = false, R1Exists = false, R2Exists = false, + R3Exists = false, DPadUpExists = false, DPadDownExists = false, DPadLeftExists = false, + DPadRightExists = false, StartExists = false, BackExists = false, LStickXExists = false, + LStickYExists = false, RStickXExists = false, RStickYExists = false; + int lineCount = 0; + std::string line = ""; + while (std::getline(file, line)) { + lineCount++; + + line.erase(std::remove(line.begin(), line.end(), ' '), line.end()); + if (line.empty()) + continue; + + std::size_t comment_pos = line.find('#'); + if (comment_pos != std::string::npos) + line = line.substr(0, comment_pos); + + std::size_t equal_pos = line.find('='); + if (equal_pos == std::string::npos) + continue; + + std::string output_string = line.substr(0, equal_pos); + std::string input_string = line.substr(equal_pos + 1); + + if (std::find(ControllerInputs.begin(), ControllerInputs.end(), input_string) != + ControllerInputs.end() || + output_string == "analog_deadzone") { + if (input_string == "cross") { + ui->ABox->setCurrentText(QString::fromStdString(output_string)); + CrossExists = true; + } else if (input_string == "circle") { + ui->BBox->setCurrentText(QString::fromStdString(output_string)); + CircleExists = true; + } else if (input_string == "square") { + ui->XBox->setCurrentText(QString::fromStdString(output_string)); + SquareExists = true; + } else if (input_string == "triangle") { + ui->YBox->setCurrentText(QString::fromStdString(output_string)); + TriangleExists = true; + } else if (input_string == "l1") { + ui->LBBox->setCurrentText(QString::fromStdString(output_string)); + L1Exists = true; + } else if (input_string == "l2") { + ui->LTBox->setCurrentText(QString::fromStdString(output_string)); + L2Exists = true; + } else if (input_string == "r1") { + ui->RBBox->setCurrentText(QString::fromStdString(output_string)); + R1Exists = true; + } else if (input_string == "r2") { + ui->RTBox->setCurrentText(QString::fromStdString(output_string)); + R2Exists = true; + } else if (input_string == "l3") { + ui->LClickBox->setCurrentText(QString::fromStdString(output_string)); + L3Exists = true; + } else if (input_string == "r3") { + ui->RClickBox->setCurrentText(QString::fromStdString(output_string)); + R3Exists = true; + } else if (input_string == "pad_up") { + ui->DpadUpBox->setCurrentText(QString::fromStdString(output_string)); + DPadUpExists = true; + } else if (input_string == "pad_down") { + ui->DpadDownBox->setCurrentText(QString::fromStdString(output_string)); + DPadDownExists = true; + } else if (input_string == "pad_left") { + ui->DpadLeftBox->setCurrentText(QString::fromStdString(output_string)); + DPadLeftExists = true; + } else if (input_string == "pad_right") { + ui->DpadRightBox->setCurrentText(QString::fromStdString(output_string)); + DPadRightExists = true; + } else if (input_string == "options") { + ui->StartBox->setCurrentText(QString::fromStdString(output_string)); + StartExists = true; + } else if (input_string == "back") { + ui->BackBox->setCurrentText(QString::fromStdString(output_string)); + BackExists = true; + } else if (input_string == "axis_left_x") { + ui->LStickRightBox->setCurrentText(QString::fromStdString(output_string)); + ui->LStickLeftBox->setCurrentText(QString::fromStdString(output_string)); + LStickXExists = true; + } else if (input_string == "axis_left_y") { + ui->LStickUpBox->setCurrentText(QString::fromStdString(output_string)); + ui->LStickDownBox->setCurrentText(QString::fromStdString(output_string)); + LStickYExists = true; + } else if (input_string == "axis_right_x") { + ui->RStickRightBox->setCurrentText(QString::fromStdString(output_string)); + ui->RStickLeftBox->setCurrentText(QString::fromStdString(output_string)); + RStickXExists = true; + } else if (input_string == "axis_right_y") { + ui->RStickUpBox->setCurrentText(QString::fromStdString(output_string)); + ui->RStickDownBox->setCurrentText(QString::fromStdString(output_string)); + RStickYExists = true; + } else if (input_string.contains("leftjoystick")) { + std::size_t comma_pos = line.find(','); + int deadzonevalue = std::stoi(line.substr(comma_pos + 1)); + ui->LeftDeadzoneSlider->setValue(deadzonevalue); + ui->LeftDeadzoneValue->setText(QString::number(deadzonevalue)); + } else if (input_string.contains("rightjoystick")) { + std::size_t comma_pos = line.find(','); + int deadzonevalue = std::stoi(line.substr(comma_pos + 1)); + ui->RightDeadzoneSlider->setValue(deadzonevalue); + ui->RightDeadzoneValue->setText(QString::number(deadzonevalue)); + } + } + } + + // If an entry does not exist in the config file, we assume the user wants it unmapped + if (!CrossExists) + ui->ABox->setCurrentText("unmapped"); + if (!CircleExists) + ui->BBox->setCurrentText("unmapped"); + if (!SquareExists) + ui->XBox->setCurrentText("unmapped"); + if (!TriangleExists) + ui->YBox->setCurrentText("unmapped"); + if (!L1Exists) + ui->LBBox->setCurrentText("unmapped"); + if (!L2Exists) + ui->LTBox->setCurrentText("unmapped"); + if (!L3Exists) + ui->LClickBox->setCurrentText("unmapped"); + if (!R1Exists) + ui->RBBox->setCurrentText("unmapped"); + if (!R2Exists) + ui->RTBox->setCurrentText("unmapped"); + if (!R3Exists) + ui->RClickBox->setCurrentText("unmapped"); + if (!DPadUpExists) + ui->DpadUpBox->setCurrentText("unmapped"); + if (!DPadDownExists) + ui->DpadDownBox->setCurrentText("unmapped"); + if (!DPadLeftExists) + ui->DpadLeftBox->setCurrentText("unmapped"); + if (!DPadRightExists) + ui->DpadRightBox->setCurrentText("unmapped"); + if (!BackExists) + ui->BackBox->setCurrentText("unmapped"); + if (!StartExists) + ui->StartBox->setCurrentText("unmapped"); + + if (!LStickXExists) { + ui->LStickRightBox->setCurrentText("unmapped"); + ui->LStickLeftBox->setCurrentText("unmapped"); + } + if (!LStickYExists) { + ui->LStickUpBox->setCurrentText("unmapped"); + ui->LStickDownBox->setCurrentText("unmapped"); + } + if (!RStickXExists) { + ui->RStickRightBox->setCurrentText("unmapped"); + ui->RStickLeftBox->setCurrentText("unmapped"); + } + if (!RStickYExists) { + ui->RStickUpBox->setCurrentText("unmapped"); + ui->RStickDownBox->setCurrentText("unmapped"); + } + + file.close(); +} + +void ControlSettings::GetGameTitle() { + if (ui->ProfileComboBox->currentText() == "Common Config") { + ui->TitleLabel->setText("Common Config"); + } else { + for (int i = 0; i < m_game_info->m_games.size(); i++) { + if (m_game_info->m_games[i].serial == + ui->ProfileComboBox->currentText().toStdString()) { + ui->TitleLabel->setText(QString::fromStdString(m_game_info->m_games[i].name)); + } + } + } +} + +ControlSettings::~ControlSettings() {} diff --git a/src/qt_gui/control_settings.h b/src/qt_gui/control_settings.h new file mode 100644 index 000000000..04227f3a8 --- /dev/null +++ b/src/qt_gui/control_settings.h @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include "game_info.h" + +namespace Ui { +class ControlSettings; +} + +class ControlSettings : public QDialog { + Q_OBJECT +public: + explicit ControlSettings(std::shared_ptr game_info_get, + QWidget* parent = nullptr); + ~ControlSettings(); + +private Q_SLOTS: + void SaveControllerConfig(bool CloseOnSave); + void SetDefault(); + +private: + std::unique_ptr ui; + std::shared_ptr m_game_info; + + void AddBoxItems(); + void SetUIValuestoMappings(); + void GetGameTitle(); + + const std::vector ControllerInputs = { + "cross", "circle", "square", "triangle", "l1", + "r1", "l2", "r2", "l3", + + "r3", "options", "pad_up", + + "pad_down", + + "pad_left", "pad_right", "axis_left_x", "axis_left_y", "axis_right_x", + "axis_right_y", "back"}; + + const QStringList ButtonOutputs = {"cross", "circle", "square", "triangle", "l1", + "r1", "l2", "r2", "l3", + + "r3", "options", "pad_up", + + "pad_down", + + "pad_left", "pad_right", "touchpad", "unmapped"}; + + const QStringList StickOutputs = {"axis_left_x", "axis_left_y", "axis_right_x", "axis_right_y", + "unmapped"}; +}; diff --git a/src/qt_gui/control_settings.ui b/src/qt_gui/control_settings.ui new file mode 100644 index 000000000..b6acb5ca9 --- /dev/null +++ b/src/qt_gui/control_settings.ui @@ -0,0 +1,1379 @@ + + + + ControlSettings + + + Qt::WindowModality::WindowModal + + + + 0 + 0 + 1012 + 721 + + + + Configure Controls + + + + :/rpcs3.ico:/rpcs3.ico + + + + + + QFrame::Shape::NoFrame + + + 0 + + + true + + + + + 0 + 0 + 994 + 673 + + + + + Control Settings + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + 5 + + + + + true + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + D-Pad + + + + 6 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + + 0 + 16777215 + + + + Up + + + + + + false + + + QComboBox::SizeAdjustPolicy::AdjustToContents + + + + + + + + + + + + + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + false + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 16777215 + + + + Down + + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Maximum + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Left Stick Deadzone (def:2 max:127) + + + + + + + 0 + 0 + + + + Left Deadzone + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + + 0 + 0 + + + + 1 + + + 127 + + + Qt::Orientation::Horizontal + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Left Stick + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 16777215 + 2121 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 124 + 16777215 + + + + Up + + + + + + true + + + + + + + + + + + + + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + true + + + + + + + + + + + 179 + 16777215 + + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + true + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + + 124 + 21212 + + + + Down + + + + + + true + + + false + + + false + + + + + + + + + + + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 12 + true + + + + Config Selection + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + + 9 + false + + + + + + + -1 + + + Common Config + + + + + + + + 10 + true + + + + Common Config + + + Qt::AlignmentFlag::AlignCenter + + + true + + + + + + + + + + 0 + 0 + + + + + 9 + false + + + + Use per-game configs + + + + + + + + + + 0 + + + + + + + L1 / LB + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + L2 / LT + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + + + 10 + + + + + + true + + + + KBM Controls + + + + + + + true + + + + KBM Editor + + + + + + + + + + Back + + + + + + + + + + + + + + + + + + R1 / RB + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + R2 / RT + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + + + + 0 + 200 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 415 + 256 + + + + :/images/ps4_controller.png + + + true + + + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter + + + + + + + + + + 10 + + + QLayout::SizeConstraint::SetDefaultConstraint + + + + + L3 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + Options / Start + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + R3 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + + + 5 + + + + + + 0 + 0 + + + + Face Buttons + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 124 + 0 + + + + + 0 + 16777215 + + + + Triangle / Y + + + + + + true + + + + 0 + 0 + + + + + + + + + + + + + + + + Square / X + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + Circle / B + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + + 124 + 16777215 + + + + Cross / A + + + + + + + + + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Maximum + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Right Stick Deadzone (def:2, max:127) + + + + + + + 0 + 0 + + + + Right Deadzone + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + + 0 + 0 + + + + 1 + + + 127 + + + Qt::Orientation::Horizontal + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Right Stick + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 124 + 1231321 + + + + Up + + + + + + true + + + + + + + + + + + + + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + true + + + + + + + + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + + 124 + 2121 + + + + Down + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save + + + false + + + + + + + + + + diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 4a6cb9103..0ab9d3a42 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -16,6 +16,7 @@ #include "common/scm_rev.h" #include "common/string_util.h" #include "common/version.h" +#include "control_settings.h" #include "core/file_format/pkg.h" #include "core/loader.h" #include "game_install_dialog.h" @@ -301,8 +302,8 @@ void MainWindow::CreateConnects() { // this is the editor for kbm keybinds connect(ui->controllerButton, &QPushButton::clicked, this, [this]() { - EditorDialog* editorWindow = new EditorDialog(this); - editorWindow->exec(); // Show the editor window modally + auto configWindow = new ControlSettings(m_game_info, this); + configWindow->exec(); }); #ifdef ENABLE_UPDATER diff --git a/src/shadps4.qrc b/src/shadps4.qrc index 30f234ed8..40aeb9fb9 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -30,5 +30,6 @@ images/ko-fi.png images/youtube.png images/website.png + images/ps4_controller.png From f8f732e78cd73899580c0b393c347e97a43bfa3b Mon Sep 17 00:00:00 2001 From: makigumo Date: Tue, 4 Feb 2025 07:51:07 +0100 Subject: [PATCH 217/455] fix ASSERT_MSG arguments (#2337) --- .../ir/passes/flatten_extended_userdata_pass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp b/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp index ef9319891..bbf3fe8fb 100644 --- a/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp +++ b/src/shader_recompiler/ir/passes/flatten_extended_userdata_pass.cpp @@ -219,7 +219,7 @@ void FlattenExtendedUserdataPass(IR::Program& program) { }; auto base0 = IR::BreadthFirstSearch(ptr_composite->Arg(0), pred); auto base1 = IR::BreadthFirstSearch(ptr_composite->Arg(1), pred); - ASSERT_MSG(base0 && base1 && "ReadConst not from constant memory"); + ASSERT_MSG(base0 && base1, "ReadConst not from constant memory"); IR::Inst* ptr_lo = base0.value(); ptr_lo = pass_info.DeduplicateInstruction(ptr_lo); @@ -250,4 +250,4 @@ void FlattenExtendedUserdataPass(IR::Program& program) { info.RefreshFlatBuf(); } -} // namespace Shader::Optimization \ No newline at end of file +} // namespace Shader::Optimization From fffd3736529578eea87cf756ba01afc90c52f5f9 Mon Sep 17 00:00:00 2001 From: makigumo Date: Tue, 4 Feb 2025 08:24:56 +0100 Subject: [PATCH 218/455] Fix shader type names (#2336) Names didn't match definition in type.h --- src/shader_recompiler/ir/type.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/shader_recompiler/ir/type.cpp b/src/shader_recompiler/ir/type.cpp index 08157f108..74c56740c 100644 --- a/src/shader_recompiler/ir/type.cpp +++ b/src/shader_recompiler/ir/type.cpp @@ -9,9 +9,10 @@ namespace Shader::IR { std::string NameOf(Type type) { static constexpr std::array names{ - "Opaque", "Label", "Reg", "Pred", "Attribute", "U1", "U8", "U16", "U32", - "U64", "F16", "F32", "F64", "U32x2", "U32x3", "U32x4", "F16x2", "F16x3", - "F16x4", "F32x2", "F32x3", "F32x4", "F64x2", "F64x3", "F64x4", "StringLiteral"}; + "Opaque", "ScalarReg", "VectorReg", "Attribute", "Patch", "U1", "U8", + "U16", "U32", "U64", "F16", "F32", "F64", "U32x2", + "U32x3", "U32x4", "F16x2", "F16x3", "F16x4", "F32x2", "F32x3", + "F32x4", "F64x2", "F64x3", "F64x4", "StringLiteral"}; const size_t bits{static_cast(type)}; if (bits == 0) { return "Void"; From e4598e882116a9f8c06ce4a32cb2689ea08e4b16 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 4 Feb 2025 09:27:48 +0200 Subject: [PATCH 219/455] sceVideoOutDeleteFlipEvent (#2339) --- src/core/libraries/videoout/video_out.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 27a3fe082..65713019c 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -63,6 +63,20 @@ s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(Kernel::SceKernelEqueue eq, s32 handle, return ORBIS_OK; } +s32 PS4_SYSV_ABI sceVideoOutDeleteFlipEvent(Kernel::SceKernelEqueue eq, s32 handle) { + auto* port = driver->GetPort(handle); + if (port == nullptr) { + return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE; + } + + if (eq == nullptr) { + return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT_QUEUE; + } + eq->RemoveEvent(handle, Kernel::SceKernelEvent::Filter::VideoOut); + port->flip_events.erase(find(port->flip_events.begin(), port->flip_events.end(), eq)); + return ORBIS_OK; +} + s32 PS4_SYSV_ABI sceVideoOutAddVblankEvent(Kernel::SceKernelEqueue eq, s32 handle, void* udata) { LOG_INFO(Lib_VideoOut, "handle = {}", handle); @@ -374,6 +388,8 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { sceVideoOutColorSettingsSetGamma); LIB_FUNCTION("pv9CI5VC+R0", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutAdjustColor); + LIB_FUNCTION("-Ozn0F1AFRg", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, + sceVideoOutDeleteFlipEvent); // openOrbis appears to have libSceVideoOut_v1 module libSceVideoOut_v1.1 LIB_FUNCTION("Up36PTk687E", "libSceVideoOut", 1, "libSceVideoOut", 1, 1, sceVideoOutOpen); From 363604c6f0c4429877a8c1a55e88eb98538930ed Mon Sep 17 00:00:00 2001 From: Kolja Date: Tue, 4 Feb 2025 08:28:25 +0100 Subject: [PATCH 220/455] Add emulator category (#2320) --- dist/net.shadps4.shadPS4.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/net.shadps4.shadPS4.desktop b/dist/net.shadps4.shadPS4.desktop index fbefa0566..a87829e7b 100644 --- a/dist/net.shadps4.shadPS4.desktop +++ b/dist/net.shadps4.shadPS4.desktop @@ -5,5 +5,5 @@ Terminal=false Type=Application Icon=net.shadps4.shadPS4 Comment=PlayStation 4 emulator -Categories=Game; +Categories=Game;Emulator; StartupWMClass=shadps4; From b6ad512e344c5de064d630691436548a402a37c0 Mon Sep 17 00:00:00 2001 From: pdaloxd <31321612+pablodrake@users.noreply.github.com> Date: Tue, 4 Feb 2025 08:33:38 +0100 Subject: [PATCH 221/455] Change Background Image for games (#2334) * Added opacity change instead of blur for background image * Fixed integer overflow when refreshing grid list * Added slider to control background image opacity * Added show background image button * Added UI code for checkbox and English and Spanish translations for new UI elements * Removed background image caching * Background image update on apply/save * Only recompute image if opacity or game changes * Fixed segfault when trying to change opacity after table refresh * Placed background image settings under GUI in settings file --- src/common/config.cpp | 24 +++++++++ src/common/config.h | 4 ++ src/qt_gui/game_grid_frame.cpp | 92 ++++++++++++++++++++------------ src/qt_gui/game_grid_frame.h | 2 + src/qt_gui/game_list_frame.cpp | 51 ++++++++++-------- src/qt_gui/game_list_frame.h | 5 +- src/qt_gui/game_list_utils.h | 26 +++++++++ src/qt_gui/main_window.cpp | 17 ++++++ src/qt_gui/settings_dialog.cpp | 11 ++++ src/qt_gui/settings_dialog.h | 1 + src/qt_gui/settings_dialog.ui | 70 ++++++++++++++++++++++++ src/qt_gui/translations/en.ts | 16 ++++++ src/qt_gui/translations/es_ES.ts | 16 ++++++ 13 files changed, 279 insertions(+), 56 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 2059da0b3..d9dfb861f 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -95,6 +95,8 @@ std::vector m_pkg_viewer; std::vector m_elf_viewer; std::vector m_recent_files; std::string emulator_language = "en"; +static int backgroundImageOpacity = 50; +static bool showBackgroundImage = true; // Language u32 m_language = 1; // english @@ -611,6 +613,22 @@ u32 GetLanguage() { return m_language; } +int getBackgroundImageOpacity() { + return backgroundImageOpacity; +} + +void setBackgroundImageOpacity(int opacity) { + backgroundImageOpacity = std::clamp(opacity, 0, 100); +} + +bool getShowBackgroundImage() { + return showBackgroundImage; +} + +void setShowBackgroundImage(bool show) { + showBackgroundImage = show; +} + void load(const std::filesystem::path& path) { // If the configuration file does not exist, create it and return std::error_code error; @@ -731,6 +749,8 @@ void load(const std::filesystem::path& path) { m_recent_files = toml::find_or>(gui, "recentFiles", {}); m_table_mode = toml::find_or(gui, "gameTableMode", 0); emulator_language = toml::find_or(gui, "emulatorLanguage", "en"); + backgroundImageOpacity = toml::find_or(gui, "backgroundImageOpacity", 50); + showBackgroundImage = toml::find_or(gui, "showBackgroundImage", true); } if (data.contains("Settings")) { @@ -821,6 +841,8 @@ void save(const std::filesystem::path& path) { data["GUI"]["addonInstallDir"] = std::string{fmt::UTF(settings_addon_install_dir.u8string()).data}; data["GUI"]["emulatorLanguage"] = emulator_language; + data["GUI"]["backgroundImageOpacity"] = backgroundImageOpacity; + data["GUI"]["showBackgroundImage"] = showBackgroundImage; data["Settings"]["consoleLanguage"] = m_language; std::ofstream file(path, std::ios::binary); @@ -914,6 +936,8 @@ void setDefaultValues() { separateupdatefolder = false; compatibilityData = false; checkCompatibilityOnStartup = false; + backgroundImageOpacity = 50; + showBackgroundImage = true; } constexpr std::string_view GetDefaultKeyboardConfig() { diff --git a/src/common/config.h b/src/common/config.h index 77ed69ece..69e497527 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -30,6 +30,8 @@ bool getEnableDiscordRPC(); bool getSeparateUpdateEnabled(); bool getCompatibilityEnabled(); bool getCheckCompatibilityOnStartup(); +int getBackgroundImageOpacity(); +bool getShowBackgroundImage(); std::string getLogFilter(); std::string getLogType(); @@ -88,6 +90,8 @@ void setGameInstallDirs(const std::vector& settings_insta void setSaveDataPath(const std::filesystem::path& path); void setCompatibilityEnabled(bool use); void setCheckCompatibilityOnStartup(bool use); +void setBackgroundImageOpacity(int opacity); +void setShowBackgroundImage(bool show); void setCursorState(s16 cursorState); void setCursorHideTimeout(int newcursorHideTimeout); diff --git a/src/qt_gui/game_grid_frame.cpp b/src/qt_gui/game_grid_frame.cpp index d719ac878..2db4b7e4e 100644 --- a/src/qt_gui/game_grid_frame.cpp +++ b/src/qt_gui/game_grid_frame.cpp @@ -38,17 +38,34 @@ GameGridFrame::GameGridFrame(std::shared_ptr game_info_get, void GameGridFrame::onCurrentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) { - crtRow = currentRow; - crtColumn = currentColumn; - columnCnt = this->columnCount(); - - auto itemID = (crtRow * columnCnt) + currentColumn; - if (itemID > m_game_info->m_games.count() - 1) { + // Early exit for invalid indices + if (currentRow < 0 || currentColumn < 0) { cellClicked = false; validCellSelected = false; BackgroundMusicPlayer::getInstance().stopMusic(); return; } + + crtRow = currentRow; + crtColumn = currentColumn; + columnCnt = this->columnCount(); + + // Prevent integer overflow + if (columnCnt <= 0 || crtRow > (std::numeric_limits::max() / columnCnt)) { + cellClicked = false; + validCellSelected = false; + BackgroundMusicPlayer::getInstance().stopMusic(); + return; + } + + auto itemID = (crtRow * columnCnt) + currentColumn; + if (itemID < 0 || itemID > m_game_info->m_games.count() - 1) { + cellClicked = false; + validCellSelected = false; + BackgroundMusicPlayer::getInstance().stopMusic(); + return; + } + cellClicked = true; validCellSelected = true; SetGridBackgroundImage(crtRow, crtColumn); @@ -65,6 +82,8 @@ void GameGridFrame::PlayBackgroundMusic(QString path) { } void GameGridFrame::PopulateGameGrid(QVector m_games_search, bool fromSearch) { + this->crtRow = -1; + this->crtColumn = -1; QVector m_games_; this->clearContents(); if (fromSearch) @@ -136,43 +155,48 @@ void GameGridFrame::PopulateGameGrid(QVector m_games_search, bool from } void GameGridFrame::SetGridBackgroundImage(int row, int column) { - int itemID = (row * this->columnCount()) + column; QWidget* item = this->cellWidget(row, column); - if (item) { - QString pic1Path; - Common::FS::PathToQString(pic1Path, (*m_games_shared)[itemID].pic_path); - const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / - (*m_games_shared)[itemID].serial / "pic1.png"; - QString blurredPic1PathQt; - Common::FS::PathToQString(blurredPic1PathQt, blurredPic1Path); - - backgroundImage = QImage(blurredPic1PathQt); - if (backgroundImage.isNull()) { - QImage image(pic1Path); - backgroundImage = m_game_list_utils.BlurImage(image, image.rect(), 16); - - std::filesystem::path img_path = - Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / - (*m_games_shared)[itemID].serial; - std::filesystem::create_directories(img_path); - if (!backgroundImage.save(blurredPic1PathQt, "PNG")) { - // qDebug() << "Error: Unable to save image."; - } - } - RefreshGridBackgroundImage(); + if (!item) { + // handle case where no item was clicked + return; } + + // If background images are hidden, clear the background image + if (!Config::getShowBackgroundImage()) { + backgroundImage = QImage(); + m_last_opacity = -1; // Reset opacity tracking when disabled + m_current_game_path.clear(); // Reset current game path + RefreshGridBackgroundImage(); + return; + } + + const auto& game = (*m_games_shared)[itemID]; + const int opacity = Config::getBackgroundImageOpacity(); + + // Recompute if opacity changed or we switched to a different game + if (opacity != m_last_opacity || game.pic_path != m_current_game_path) { + QImage original_image(QString::fromStdString(game.pic_path.string())); + if (!original_image.isNull()) { + backgroundImage = m_game_list_utils.ChangeImageOpacity( + original_image, original_image.rect(), opacity / 100.0f); + m_last_opacity = opacity; + m_current_game_path = game.pic_path; + } + } + + RefreshGridBackgroundImage(); } void GameGridFrame::RefreshGridBackgroundImage() { - if (!backgroundImage.isNull()) { - QPalette palette; + QPalette palette; + if (!backgroundImage.isNull() && Config::getShowBackgroundImage()) { palette.setBrush(QPalette::Base, QBrush(backgroundImage.scaled(size(), Qt::IgnoreAspectRatio))); - QColor transparentColor = QColor(135, 206, 235, 40); - palette.setColor(QPalette::Highlight, transparentColor); - this->setPalette(palette); } + QColor transparentColor = QColor(135, 206, 235, 40); + palette.setColor(QPalette::Highlight, transparentColor); + this->setPalette(palette); } bool GameGridFrame::IsValidCellSelected() { diff --git a/src/qt_gui/game_grid_frame.h b/src/qt_gui/game_grid_frame.h index 4825d6daf..370b71dcb 100644 --- a/src/qt_gui/game_grid_frame.h +++ b/src/qt_gui/game_grid_frame.h @@ -33,6 +33,8 @@ private: std::shared_ptr m_compat_info; std::shared_ptr> m_games_shared; bool validCellSelected = false; + int m_last_opacity = -1; // Track last opacity to avoid unnecessary recomputation + std::filesystem::path m_current_game_path; // Track current game path to detect changes public: explicit GameGridFrame(std::shared_ptr game_info_get, diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index f2d08f578..64c0f17ba 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -89,6 +89,7 @@ void GameListFrame::onCurrentCellChanged(int currentRow, int currentColumn, int if (!item) { return; } + m_current_item = item; // Store current item SetListBackgroundImage(item); PlayBackgroundMusic(item); } @@ -104,6 +105,7 @@ void GameListFrame::PlayBackgroundMusic(QTableWidgetItem* item) { } void GameListFrame::PopulateGameList(bool isInitialPopulation) { + this->m_current_item = nullptr; // Do not show status column if it is not enabled this->setColumnHidden(2, !Config::getCompatibilityEnabled()); this->setColumnHidden(6, !Config::GetLoadGameSizeEnabled()); @@ -167,38 +169,41 @@ void GameListFrame::SetListBackgroundImage(QTableWidgetItem* item) { return; } - QString pic1Path; - Common::FS::PathToQString(pic1Path, m_game_info->m_games[item->row()].pic_path); - const auto blurredPic1Path = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / - m_game_info->m_games[item->row()].serial / "pic1.png"; - QString blurredPic1PathQt; - Common::FS::PathToQString(blurredPic1PathQt, blurredPic1Path); + // If background images are hidden, clear the background image + if (!Config::getShowBackgroundImage()) { + backgroundImage = QImage(); + m_last_opacity = -1; // Reset opacity tracking when disabled + m_current_game_path.clear(); // Reset current game path + RefreshListBackgroundImage(); + return; + } - backgroundImage = QImage(blurredPic1PathQt); - if (backgroundImage.isNull()) { - QImage image(pic1Path); - backgroundImage = m_game_list_utils.BlurImage(image, image.rect(), 16); + const auto& game = m_game_info->m_games[item->row()]; + const int opacity = Config::getBackgroundImageOpacity(); - std::filesystem::path img_path = - Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / - m_game_info->m_games[item->row()].serial; - std::filesystem::create_directories(img_path); - if (!backgroundImage.save(blurredPic1PathQt, "PNG")) { - // qDebug() << "Error: Unable to save image."; + // Recompute if opacity changed or we switched to a different game + if (opacity != m_last_opacity || game.pic_path != m_current_game_path) { + QImage original_image(QString::fromStdString(game.pic_path.string())); + if (!original_image.isNull()) { + backgroundImage = m_game_list_utils.ChangeImageOpacity( + original_image, original_image.rect(), opacity / 100.0f); + m_last_opacity = opacity; + m_current_game_path = game.pic_path; } } + RefreshListBackgroundImage(); } void GameListFrame::RefreshListBackgroundImage() { - if (!backgroundImage.isNull()) { - QPalette palette; + QPalette palette; + if (!backgroundImage.isNull() && Config::getShowBackgroundImage()) { palette.setBrush(QPalette::Base, QBrush(backgroundImage.scaled(size(), Qt::IgnoreAspectRatio))); - QColor transparentColor = QColor(135, 206, 235, 40); - palette.setColor(QPalette::Highlight, transparentColor); - this->setPalette(palette); } + QColor transparentColor = QColor(135, 206, 235, 40); + palette.setColor(QPalette::Highlight, transparentColor); + this->setPalette(palette); } void GameListFrame::SortNameAscending(int columnIndex) { @@ -392,3 +397,7 @@ QString GameListFrame::GetPlayTime(const std::string& serial) { file.close(); return playTime; } + +QTableWidgetItem* GameListFrame::GetCurrentItem() { + return m_current_item; +} \ No newline at end of file diff --git a/src/qt_gui/game_list_frame.h b/src/qt_gui/game_list_frame.h index 7e37c4ea7..b2e5f1e2f 100644 --- a/src/qt_gui/game_list_frame.h +++ b/src/qt_gui/game_list_frame.h @@ -44,11 +44,14 @@ private: QList m_columnActs; GameInfoClass* game_inf_get = nullptr; bool ListSortedAsc = true; + QTableWidgetItem* m_current_item = nullptr; + int m_last_opacity = -1; // Track last opacity to avoid unnecessary recomputation + std::filesystem::path m_current_game_path; // Track current game path to detect changes public: void PopulateGameList(bool isInitialPopulation = true); void ResizeIcons(int iconSize); - + QTableWidgetItem* GetCurrentItem(); QImage backgroundImage; GameListUtils m_game_list_utils; GuiContextMenus m_gui_context_menus; diff --git a/src/qt_gui/game_list_utils.h b/src/qt_gui/game_list_utils.h index 581a8a55f..c6b69e70e 100644 --- a/src/qt_gui/game_list_utils.h +++ b/src/qt_gui/game_list_utils.h @@ -201,4 +201,30 @@ public: return result; } + + // Opacity is a float between 0 and 1 + static QImage ChangeImageOpacity(const QImage& image, const QRect& rect, float opacity) { + // Convert to ARGB32 format to ensure alpha channel support + QImage result = image.convertToFormat(QImage::Format_ARGB32); + + // Ensure opacity is between 0 and 1 + opacity = std::clamp(opacity, 0.0f, 1.0f); + + // Convert opacity to integer alpha value (0-255) + int alpha = static_cast(opacity * 255); + + // Process only the specified rectangle area + for (int y = rect.top(); y <= rect.bottom(); ++y) { + QRgb* line = reinterpret_cast(result.scanLine(y)); + for (int x = rect.left(); x <= rect.right(); ++x) { + // Get current pixel + QRgb pixel = line[x]; + // Keep RGB values, but modify alpha while preserving relative transparency + int newAlpha = (qAlpha(pixel) * alpha) / 255; + line[x] = qRgba(qRed(pixel), qGreen(pixel), qBlue(pixel), newAlpha); + } + } + + return result; + } }; diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 0ab9d3a42..67615a1b6 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -297,6 +297,23 @@ void MainWindow::CreateConnects() { connect(settingsDialog, &SettingsDialog::CompatibilityChanged, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::BackgroundOpacityChanged, this, + [this](int opacity) { + Config::setBackgroundImageOpacity(opacity); + if (m_game_list_frame) { + QTableWidgetItem* current = m_game_list_frame->GetCurrentItem(); + if (current) { + m_game_list_frame->SetListBackgroundImage(current); + } + } + if (m_game_grid_frame) { + if (m_game_grid_frame->IsValidCellSelected()) { + m_game_grid_frame->SetGridBackgroundImage(m_game_grid_frame->crtRow, + m_game_grid_frame->crtColumn); + } + } + }); + settingsDialog->exec(); }); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 7505db106..8f4b22c6d 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -173,6 +173,9 @@ SettingsDialog::SettingsDialog(std::span physical_devices, { connect(ui->chooseHomeTabComboBox, &QComboBox::currentTextChanged, this, [](const QString& hometab) { Config::setChooseHomeTab(hometab.toStdString()); }); + + connect(ui->showBackgroundImageCheckBox, &QCheckBox::stateChanged, this, + [](int state) { Config::setShowBackgroundImage(state == Qt::Checked); }); } // Input TAB { @@ -251,6 +254,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, #ifdef ENABLE_UPDATER ui->updaterGroupBox->installEventFilter(this); #endif + ui->GUIBackgroundImageGroupBox->installEventFilter(this); ui->GUIMusicGroupBox->installEventFilter(this); ui->disableTrophycheckBox->installEventFilter(this); ui->enableCompatibilityCheckBox->installEventFilter(this); @@ -410,6 +414,8 @@ void SettingsDialog::LoadValuesFromConfig() { ui->removeFolderButton->setEnabled(!ui->gameFoldersListWidget->selectedItems().isEmpty()); ResetInstallFolders(); + ui->backgroundImageOpacitySlider->setValue(Config::getBackgroundImageOpacity()); + ui->showBackgroundImageCheckBox->setChecked(Config::getShowBackgroundImage()); } void SettingsDialog::InitializeEmulatorLanguages() { @@ -504,6 +510,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { } else if (elementName == "updaterGroupBox") { text = tr("updaterGroupBox"); #endif + } else if (elementName == "GUIBackgroundImageGroupBox") { + text = tr("GUIBackgroundImageGroupBox"); } else if (elementName == "GUIMusicGroupBox") { text = tr("GUIMusicGroupBox"); } else if (elementName == "disableTrophycheckBox") { @@ -638,6 +646,9 @@ void SettingsDialog::UpdateSettings() { Config::setChooseHomeTab(ui->chooseHomeTabComboBox->currentText().toStdString()); Config::setCompatibilityEnabled(ui->enableCompatibilityCheckBox->isChecked()); Config::setCheckCompatibilityOnStartup(ui->checkCompatibilityOnStartupCheckBox->isChecked()); + Config::setBackgroundImageOpacity(ui->backgroundImageOpacitySlider->value()); + emit BackgroundOpacityChanged(ui->backgroundImageOpacitySlider->value()); + Config::setShowBackgroundImage(ui->showBackgroundImageCheckBox->isChecked()); #ifdef ENABLE_DISCORD_RPC auto* rpc = Common::Singleton::Instance(); diff --git a/src/qt_gui/settings_dialog.h b/src/qt_gui/settings_dialog.h index 892e67671..c440351f6 100644 --- a/src/qt_gui/settings_dialog.h +++ b/src/qt_gui/settings_dialog.h @@ -33,6 +33,7 @@ public: signals: void LanguageChanged(const std::string& locale); void CompatibilityChanged(); + void BackgroundOpacityChanged(int opacity); private: void LoadValuesFromConfig(); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index d15f49efe..80f7a117e 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -583,6 +583,76 @@ + + + + Background Image + + + + 0 + 0 + + + + + + + + 0 + 0 + + + + Show Background Image + + + + + + + 9 + + + + + + 0 + 0 + + + + Opacity + + + + + + + + 0 + 0 + + + + 0 + + + 100 + + + 50 + + + Qt::Orientation::Horizontal + + + + + + + + diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index afaa17520..d0540d7cd 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -757,6 +757,18 @@ Disable Trophy Pop-ups Disable Trophy Pop-ups + + Background Image + Background Image + + + Show Background Image + Show Background Image + + + Opacity + Opacity + Play title music Play title music @@ -853,6 +865,10 @@ updaterGroupBox Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + + GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + GUIMusicGroupBox Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index d732e67ea..772980994 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -748,6 +748,18 @@ Disable Trophy Pop-ups Disable Trophy Pop-ups + + Background Image + Imagen de fondo + + + Show Background Image + Mostrar Imagen de Fondo + + + Opacity + Opacidad + Play title music Reproducir la música de apertura @@ -844,6 +856,10 @@ updaterGroupBox Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. + + GUIBackgroundImageGroupBox + Imagen de fondo:\nControle la opacidad de la imagen de fondo del juego. + GUIMusicGroupBox Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. From b879dd59c674b9dae0bf1c4c090cabdce4521d05 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:01:59 -0800 Subject: [PATCH 222/455] shader_recompiler: Add workaround for drivers with unexpected unorm rounding behavior. (#2310) --- src/shader_recompiler/frontend/translate/export.cpp | 6 +++++- src/shader_recompiler/runtime_info.h | 1 + src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 11 +++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/frontend/translate/export.cpp b/src/shader_recompiler/frontend/translate/export.cpp index 84c2ee658..28c4685db 100644 --- a/src/shader_recompiler/frontend/translate/export.cpp +++ b/src/shader_recompiler/frontend/translate/export.cpp @@ -17,7 +17,11 @@ u32 SwizzleMrtComponent(const FragmentRuntimeInfo::PsColorBuffer& color_buffer, void Translator::ExportMrtValue(IR::Attribute attribute, u32 comp, const IR::F32& value, const FragmentRuntimeInfo::PsColorBuffer& color_buffer) { - const auto converted = ApplyWriteNumberConversion(ir, value, color_buffer.num_conversion); + auto converted = ApplyWriteNumberConversion(ir, value, color_buffer.num_conversion); + if (color_buffer.needs_unorm_fixup) { + // FIXME: Fix-up for GPUs where float-to-unorm rounding is off from expected. + converted = ir.FPSub(converted, ir.Imm32(1.f / 127500.f)); + } ir.SetAttribute(attribute, converted, comp); } diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 138a707b3..d1ae2c09d 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -185,6 +185,7 @@ struct FragmentRuntimeInfo { AmdGpu::NumberConversion num_conversion; AmdGpu::CompMapping swizzle; AmdGpu::Liverpool::ShaderExportFormat export_format; + bool needs_unorm_fixup; auto operator<=>(const PsColorBuffer&) const noexcept = default; }; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 629899a33..d8f6a08d0 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -330,6 +330,16 @@ bool PipelineCache::RefreshGraphicsKey() { continue; } + // Metal seems to have an issue where 8-bit unorm/snorm/sRGB outputs to render target + // need a bias applied to round correctly; detect and set the flag for that here. + const auto needs_unorm_fixup = instance.GetDriverID() == vk::DriverId::eMoltenvk && + (col_buf.GetNumberFmt() == AmdGpu::NumberFormat::Unorm || + col_buf.GetNumberFmt() == AmdGpu::NumberFormat::Snorm || + col_buf.GetNumberFmt() == AmdGpu::NumberFormat::Srgb) && + (col_buf.GetDataFmt() == AmdGpu::DataFormat::Format8 || + col_buf.GetDataFmt() == AmdGpu::DataFormat::Format8_8 || + col_buf.GetDataFmt() == AmdGpu::DataFormat::Format8_8_8_8); + key.color_formats[remapped_cb] = LiverpoolToVK::SurfaceFormat(col_buf.GetDataFmt(), col_buf.GetNumberFmt()); key.color_buffers[remapped_cb] = { @@ -337,6 +347,7 @@ bool PipelineCache::RefreshGraphicsKey() { .num_conversion = col_buf.GetNumberConversion(), .swizzle = col_buf.Swizzle(), .export_format = regs.color_export_format.GetFormat(cb), + .needs_unorm_fixup = needs_unorm_fixup, }; } From 131b6f90e0a15ace346dcfe64189cb4e2363c5f5 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Tue, 4 Feb 2025 12:37:23 +0100 Subject: [PATCH 223/455] Format log lines to make it possible to ctrl click on them and go to the log location (#2345) --- src/common/logging/text_formatter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp index 5f6c2172d..b4fa204bc 100644 --- a/src/common/logging/text_formatter.cpp +++ b/src/common/logging/text_formatter.cpp @@ -23,8 +23,8 @@ std::string FormatLogMessage(const Entry& entry) { const char* class_name = GetLogClassName(entry.log_class); const char* level_name = GetLevelName(entry.log_level); - return fmt::format("[{}] <{}> {}:{}:{}: {}", class_name, level_name, entry.filename, - entry.function, entry.line_num, entry.message); + return fmt::format("[{}] <{}> {}:{} {}: {}", class_name, level_name, entry.filename, + entry.line_num, entry.function, entry.message); } void PrintMessage(const Entry& entry) { From e757063d3120e68fe53b9c888bc6c5fe7372b406 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:21:05 -0600 Subject: [PATCH 224/455] Improved error handling in sceKernelAllocateDirectMemory (#2037) * Handle errors in sceKernelAllocateDirectMemory * Improve accuracy of error cases Some of our existing cases are normally EAGAIN returns. * Improve logging on errors * Clang * TEMPORARY HACK FOR NBA TESTS This will be removed before this PR is marked as ready, and is only here to make sure the other NBA games (and perhaps DOA3) work if some missing init behavior is handled. * Revert "TEMPORARY HACK FOR NBA TESTS" This reverts commit a0e27b0229811778c8390066d00b5221aa5d54a6. * Change error message --- src/core/libraries/kernel/memory.cpp | 28 ++++++++++++++++++++++------ src/core/memory.cpp | 5 ++++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/core/libraries/kernel/memory.cpp b/src/core/libraries/kernel/memory.cpp index 8deefb496..551fd8e3e 100644 --- a/src/core/libraries/kernel/memory.cpp +++ b/src/core/libraries/kernel/memory.cpp @@ -26,17 +26,20 @@ u64 PS4_SYSV_ABI sceKernelGetDirectMemorySize() { int PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u64 len, u64 alignment, int memoryType, s64* physAddrOut) { - if (searchStart < 0 || searchEnd <= searchStart) { - LOG_ERROR(Kernel_Vmm, "Provided address range is invalid!"); + if (searchStart < 0 || searchEnd < 0) { + LOG_ERROR(Kernel_Vmm, "Invalid parameters!"); return ORBIS_KERNEL_ERROR_EINVAL; } - const bool is_in_range = searchEnd - searchStart >= len; - if (len <= 0 || !Common::Is16KBAligned(len) || !is_in_range) { - LOG_ERROR(Kernel_Vmm, "Provided address range is invalid!"); + if (len <= 0 || !Common::Is16KBAligned(len)) { + LOG_ERROR(Kernel_Vmm, "Length {:#x} is invalid!", len); return ORBIS_KERNEL_ERROR_EINVAL; } if (alignment != 0 && !Common::Is16KBAligned(alignment)) { - LOG_ERROR(Kernel_Vmm, "Alignment value is invalid!"); + LOG_ERROR(Kernel_Vmm, "Alignment {:#x} is invalid!", alignment); + return ORBIS_KERNEL_ERROR_EINVAL; + } + if (memoryType > 10) { + LOG_ERROR(Kernel_Vmm, "Memory type {:#x} is invalid!", memoryType); return ORBIS_KERNEL_ERROR_EINVAL; } if (physAddrOut == nullptr) { @@ -44,8 +47,21 @@ int PS4_SYSV_ABI sceKernelAllocateDirectMemory(s64 searchStart, s64 searchEnd, u return ORBIS_KERNEL_ERROR_EINVAL; } + const bool is_in_range = searchEnd - searchStart >= len; + if (searchEnd <= searchStart || searchEnd < len || !is_in_range) { + LOG_ERROR(Kernel_Vmm, + "Provided address range is too small!" + " searchStart = {:#x}, searchEnd = {:#x}, length = {:#x}", + searchStart, searchEnd, len); + return ORBIS_KERNEL_ERROR_EAGAIN; + } + auto* memory = Core::Memory::Instance(); PAddr phys_addr = memory->Allocate(searchStart, searchEnd, len, alignment, memoryType); + if (phys_addr == -1) { + return ORBIS_KERNEL_ERROR_EAGAIN; + } + *physAddrOut = static_cast(phys_addr); LOG_INFO(Kernel_Vmm, diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 271092eaf..4717b3a74 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -117,7 +117,10 @@ PAddr MemoryManager::Allocate(PAddr search_start, PAddr search_end, size_t size, dmem_area->second.GetEnd() <= search_end) { ++dmem_area; } - ASSERT_MSG(is_suitable(), "Unable to find free direct memory area: size = {:#x}", size); + if (!is_suitable()) { + LOG_ERROR(Kernel_Vmm, "Unable to find free direct memory area: size = {:#x}", size); + return -1; + } // Align free position PAddr free_addr = dmem_area->second.base; From ecfc940381a752a7a5ef728ad50826e643b671ee Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:24:53 -0600 Subject: [PATCH 225/455] libSceHmd Stubs (#2355) * Add generated libSceHmd stubs * Implement ReprojectionQuery functions These constant returns come from decompiling libSceHmd. * Clang * Clang --- CMakeLists.txt | 5 + src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + src/core/libraries/hmd/hmd.cpp | 1219 ++++++++++++++++++++++++++++++++ src/core/libraries/hmd/hmd.h | 203 ++++++ src/core/libraries/libs.cpp | 2 + 6 files changed, 1431 insertions(+) create mode 100644 src/core/libraries/hmd/hmd.cpp create mode 100644 src/core/libraries/hmd/hmd.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ecbbf0d6..8837a6584 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -486,6 +486,10 @@ set(ZLIB_LIB src/core/libraries/zlib/zlib.cpp src/core/libraries/zlib/zlib_error.h ) +set(VR_LIBS src/core/libraries/hmd/hmd.cpp + src/core/libraries/hmd/hmd.h +) + set(MISC_LIBS src/core/libraries/screenshot/screenshot.cpp src/core/libraries/screenshot/screenshot.h src/core/libraries/move/move.cpp @@ -663,6 +667,7 @@ set(CORE src/core/aerolib/stubs.cpp ${IME_LIB} ${FIBER_LIB} ${VDEC_LIB} + ${VR_LIBS} ${DEV_TOOLS} src/core/debug_state.cpp src/core/debug_state.h diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index dd708c528..1a781cb4c 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -134,6 +134,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Lib, WebBrowserDialog) \ SUB(Lib, NpParty) \ SUB(Lib, Zlib) \ + SUB(Lib, Hmd) \ CLS(Frontend) \ CLS(Render) \ SUB(Render, Vulkan) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 54f8cdd0b..4078afcef 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -101,6 +101,7 @@ enum class Class : u8 { Lib_WebBrowserDialog, ///< The LibSceWebBrowserDialog implementation Lib_NpParty, ///< The LibSceNpParty implementation Lib_Zlib, ///< The LibSceZlib implementation. + Lib_Hmd, ///< The LibSceHmd implementation. Frontend, ///< Emulator UI Render, ///< Video Core Render_Vulkan, ///< Vulkan backend diff --git a/src/core/libraries/hmd/hmd.cpp b/src/core/libraries/hmd/hmd.cpp new file mode 100644 index 000000000..b43789822 --- /dev/null +++ b/src/core/libraries/hmd/hmd.cpp @@ -0,0 +1,1219 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/hmd/hmd.h" +#include "core/libraries/libs.h" + +namespace Libraries::Hmd { + +s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGet2dVrCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetCompoundEyeCorrectionCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetCorrectionCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetWideNearCorrectionCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemoryAlign() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemorySize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionInitialize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdDistortionSetOutputMinColor() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_B26430EA74FC3DC0() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdClose() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGet2DEyeOffset() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGet2dVrCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetAssyError() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetDeviceInformation() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetDeviceInformationByHandle() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetDistortionCorrectionCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetDistortionParams() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemoryAlign() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemorySize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetFieldOfView() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetInertialSensorData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdGetWideNearDistortionCorrectionCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInitialize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInitialize315() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternal3dAudioClose() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternal3dAudioOpen() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternal3dAudioSendData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenClose() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenGetAudioStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenGetFadeState() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenGetVideoStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenOpen() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenSendAudio() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenSendVideo() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenSetFadeAndSwitch() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalBindDeviceWithUserId() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCheckDeviceModelMk3() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCheckS3dPassModeAvailable() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCrashReportCancel() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCrashReportClose() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCrashReportOpen() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCrashReportReadData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCrashReportReadDataSize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalCreateSharedMemory() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuCheckAfterPvt() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuCheckPartialUpdateAvailable() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuClose() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuGetStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuOpen() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuReset() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuSend() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuSendSize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuSetMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalDfuStart() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalEventInitialize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetBrightness() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetCrashDumpInfo() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDebugMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDebugSocialScreenMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDebugTextMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDefaultLedData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDemoMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceInformation() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceInformationByHandle() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetEyeStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetHmuOpticalParam() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetHmuPowerStatusForDebug() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetHmuSerialNumber() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetIPD() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetIpdSettingEnableForSystemService() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetPuBuildNumber() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetPuPositionParam() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetPuRevision() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetPUSerialNumber() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetPUVersion() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetRequiredPUPVersion() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetStatusReport() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetTv4kCapability() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetVirtualDisplayDepth() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetVirtualDisplayHeight() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetVirtualDisplaySize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalGetVr2dData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalIsCommonDlgMiniAppVr2d() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalIsCommonDlgVr2d() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalIsGameVr2d() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalIsMiniAppVr2d() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalMapSharedMemory() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalMirroringModeSetAspect() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalMirroringModeSetAspectDebug() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalMmapGetCount() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalMmapGetModeId() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalMmapGetSensorCalibrationData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalMmapIsConnect() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalPushVr2dData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalRegisterEventCallback() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalResetInertialSensor() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalResetLedForVrTracker() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalResetLedForVsh() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeClose() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeGetAudioStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeGetVideoStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeOpen() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeSendAudio() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeSendVideo() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetBrightness() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetCrashReportCommand() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetDebugGpo() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetDebugMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetDebugSocialScreenMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetDebugTextMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetDefaultLedData() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetDemoMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetDeviceConnection() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetForcedCrash() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetHmuPowerControl() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetHmuPowerControlForDebug() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetIPD() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetIpdSettingEnableForSystemService() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetLedOn() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetM2LedBrightness() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetM2LedOn() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetPortConnection() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetPortStatus() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetS3dPassMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetSidetone() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetUserType() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetVirtualDisplayDepth() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetVirtualDisplayHeight() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetVirtualDisplaySize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSetVRMode() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSocialScreenGetFadeState() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSocialScreenSetFadeAndSwitch() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdInternalSocialScreenSetOutput() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdOpen() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionAddDisplayBuffer() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventEnd() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventStart() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfo() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfoMultilayer() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionFinalize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionFinalizeCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionInitialize() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionInitializeCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffAlign() { + return 0x100; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffSize() { + return 0x100000; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffAlign() { + return 0x100; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffSize() { + return 0x810; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetCallback() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetDisplayBuffers() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetOutputMinColor() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventEnd() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventStart() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStart() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStart2dVr() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartLiveCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer2() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNear() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNearWithOverlay() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStartWithOverlay() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStop() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStopCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionStopLiveCapture() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetCallback() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetDisplayBuffers() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceHmdTerminate() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_202D0D1A687FCD2F() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_358DBF818A3D8A12() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_5CCBADA76FE8F40E() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_63D403167DC08CF0() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_69383B2B4E3AEABF() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_791560C32F4F6D68() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_7C955961EA85B6D3() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_9952277839236BA7() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_9A276E739E54EEAF() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_9E501994E289CBE7() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_A31A0320D80EAD99() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_A31F4DA8B3BD2E12() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_A92D7C23AC364993() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_ADCCC25CB876FDBE() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_B16652641FE69F0E() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_B614F290B67FB59B() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_B9A6FA0735EC7E49() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_FC193BD653F2AF2E() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI Func_FF2E0E53015FE231() { + LOG_ERROR(Lib_Hmd, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceHmd(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("8gH1aLgty5I", "libsceHmdReprojectionMultilayer", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartMultilayer); + LIB_FUNCTION("gEokC+OGI8g", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGet2dVrCommand); + LIB_FUNCTION("ER2ar8yUmbk", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetCompoundEyeCorrectionCommand); + LIB_FUNCTION("HT8qWOTOGmo", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetCorrectionCommand); + LIB_FUNCTION("Vkkhy8RFIuk", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWideNearCorrectionCommand); + LIB_FUNCTION("1cS7W5J-v3k", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWorkMemoryAlign); + LIB_FUNCTION("36xDKk+Hw7o", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionGetWorkMemorySize); + LIB_FUNCTION("ao8NZ+FRYJE", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionInitialize); + LIB_FUNCTION("8A4T5ahi790", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, + sceHmdDistortionSetOutputMinColor); + LIB_FUNCTION("smQw6nT8PcA", "libSceHmdDistortion", 1, "libSceHmd", 1, 1, Func_B26430EA74FC3DC0); + LIB_FUNCTION("6biw1XHTSqQ", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdClose); + LIB_FUNCTION("BWY-qKM5hxE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGet2DEyeOffset); + LIB_FUNCTION("za4xJfzCBcM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGet2dVrCommand); + LIB_FUNCTION("Yx+CuF11D3Q", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetAssyError); + LIB_FUNCTION("thDt9upZlp8", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetDeviceInformation); + LIB_FUNCTION("1pxQfif1rkE", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdGetDeviceInformationByHandle); + LIB_FUNCTION("grCYks4m8Jw", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdGetDistortionCorrectionCommand); + LIB_FUNCTION("mP2ZcYmDg-o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetDistortionParams); + LIB_FUNCTION("8Ick-e6cDVY", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdGetDistortionWorkMemoryAlign); + LIB_FUNCTION("D5JfdpJKvXk", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdGetDistortionWorkMemorySize); + LIB_FUNCTION("NPQwYFqi0bs", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetFieldOfView); + LIB_FUNCTION("rU3HK9Q0r8o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdGetInertialSensorData); + LIB_FUNCTION("goi5ASvH-V8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdGetWideNearDistortionCorrectionCommand); + LIB_FUNCTION("K4KnH0QkT2c", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInitialize); + LIB_FUNCTION("s-J66ar9g50", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInitialize315); + LIB_FUNCTION("riPQfAdebHk", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternal3dAudioClose); + LIB_FUNCTION("wHnZU1qtiqw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternal3dAudioOpen); + LIB_FUNCTION("NuEjeN8WCBA", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternal3dAudioSendData); + LIB_FUNCTION("QasPTUPWVZE", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalAnotherScreenClose); + LIB_FUNCTION("Wr5KVtyVDG0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalAnotherScreenGetAudioStatus); + LIB_FUNCTION("whRxl6Hhrzg", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalAnotherScreenGetFadeState); + LIB_FUNCTION("w8BEUsIYn8w", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalAnotherScreenGetVideoStatus); + LIB_FUNCTION("0cQDAbkOt2A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalAnotherScreenOpen); + LIB_FUNCTION("Asczi8gw1NM", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalAnotherScreenSendAudio); + LIB_FUNCTION("6+v7m1vwE+0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalAnotherScreenSendVideo); + LIB_FUNCTION("E0BLvy57IiQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalAnotherScreenSetFadeAndSwitch); + LIB_FUNCTION("UTqrWB+1+SU", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalBindDeviceWithUserId); + LIB_FUNCTION("ego1YdqNGpI", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalCheckDeviceModelMk3); + LIB_FUNCTION("WR7XsLdjcqQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalCheckS3dPassModeAvailable); + LIB_FUNCTION("eMI1Hq+NEwY", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalCrashReportCancel); + LIB_FUNCTION("dI3StPLQlMM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalCrashReportClose); + LIB_FUNCTION("lqPT-Bf1s4I", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalCrashReportOpen); + LIB_FUNCTION("QxhJs6zHUmU", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalCrashReportReadData); + LIB_FUNCTION("A2jWOLPzHHE", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalCrashReportReadDataSize); + LIB_FUNCTION("E9scVxt0DNg", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalCreateSharedMemory); + LIB_FUNCTION("6RclvsKxr3I", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuCheckAfterPvt); + LIB_FUNCTION("cE99PJR6b8w", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalDfuCheckPartialUpdateAvailable); + LIB_FUNCTION("SuE90Qscg0s", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuClose); + LIB_FUNCTION("5f-6lp7L5cY", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuGetStatus); + LIB_FUNCTION("dv2RqD7ZBd4", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuOpen); + LIB_FUNCTION("pN0HjRU86Jo", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuReset); + LIB_FUNCTION("mdc++HCXSsQ", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuSend); + LIB_FUNCTION("gjyqnphjGZE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuSendSize); + LIB_FUNCTION("bl4MkWNLxKs", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuSetMode); + LIB_FUNCTION("a1LmvXhZ6TM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalDfuStart); + LIB_FUNCTION("+UzzSnc0z9A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalEventInitialize); + LIB_FUNCTION("uQc9P8Hrr6U", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetBrightness); + LIB_FUNCTION("nK1g+MwMV10", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetCrashDumpInfo); + LIB_FUNCTION("L5WZgOTw41Y", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetDebugMode); + LIB_FUNCTION("3w8SkMfCHY0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetDebugSocialScreenMode); + LIB_FUNCTION("1Xmb76MHXug", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetDebugTextMode); + LIB_FUNCTION("S0ITgPRkfUg", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetDefaultLedData); + LIB_FUNCTION("mxjolbeBa78", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetDemoMode); + LIB_FUNCTION("RFIi20Wp9j0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetDeviceInformation); + LIB_FUNCTION("P04LQJQZ43Y", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetDeviceInformationByHandle); + LIB_FUNCTION("PPCqsD8B5uM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetDeviceStatus); + LIB_FUNCTION("-u82z1UhOq4", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetEyeStatus); + LIB_FUNCTION("iINSFzCIaB8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetHmuOpticalParam); + LIB_FUNCTION("Csuvq2MMXHU", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetHmuPowerStatusForDebug); + LIB_FUNCTION("UhFPniZvm8U", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetHmuSerialNumber); + LIB_FUNCTION("9exeDpk7JU8", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetIPD); + LIB_FUNCTION("yNtYRsxZ6-A", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetIpdSettingEnableForSystemService); + LIB_FUNCTION("EKn+IFVsz0M", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetPuBuildNumber); + LIB_FUNCTION("AxQ6HtktYfQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetPuPositionParam); + LIB_FUNCTION("ynKv9QCSbto", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetPuRevision); + LIB_FUNCTION("3jcyx7XOm7A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetPUSerialNumber); + LIB_FUNCTION("+PDyXnclP5w", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetPUVersion); + LIB_FUNCTION("67q17ERGBuw", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetRequiredPUPVersion); + LIB_FUNCTION("uGyN1CkvwYU", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetStatusReport); + LIB_FUNCTION("p9lSvZujLuo", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetTv4kCapability); + LIB_FUNCTION("-Z+-9u98m9o", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetVirtualDisplayDepth); + LIB_FUNCTION("df+b0FQnnVQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetVirtualDisplayHeight); + LIB_FUNCTION("i6yROd9ygJs", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalGetVirtualDisplaySize); + LIB_FUNCTION("Aajiktl6JXU", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalGetVr2dData); + LIB_FUNCTION("GwFVF2KkIT4", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalIsCommonDlgMiniAppVr2d); + LIB_FUNCTION("LWQpWHOSUvk", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalIsCommonDlgVr2d); + LIB_FUNCTION("YiIVBPLxmfE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalIsGameVr2d); + LIB_FUNCTION("LMlWs+oKHTg", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalIsMiniAppVr2d); + LIB_FUNCTION("nBv4CKUGX0Y", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalMapSharedMemory); + LIB_FUNCTION("4hTD8I3CyAk", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalMirroringModeSetAspect); + LIB_FUNCTION("EJwPtSSZykY", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalMirroringModeSetAspectDebug); + LIB_FUNCTION("r7f7M5q3snU", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalMmapGetCount); + LIB_FUNCTION("gCjTEtEsOOw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalMmapGetModeId); + LIB_FUNCTION("HAr740Mt9Hs", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalMmapGetSensorCalibrationData); + LIB_FUNCTION("1PNiQR-7L6k", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalMmapIsConnect); + LIB_FUNCTION("9-jaAXUNG-A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalPushVr2dData); + LIB_FUNCTION("1gkbLH5+kxU", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalRegisterEventCallback); + LIB_FUNCTION("6kHBllapJas", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalResetInertialSensor); + LIB_FUNCTION("k1W6RPkd0mc", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalResetLedForVrTracker); + LIB_FUNCTION("dp1wu22jSGc", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalResetLedForVsh); + LIB_FUNCTION("d2TeoKeqM5U", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSeparateModeClose); + LIB_FUNCTION("WxsnAsjPF7Q", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSeparateModeGetAudioStatus); + LIB_FUNCTION("eOOeG9SpEuc", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSeparateModeGetVideoStatus); + LIB_FUNCTION("gA4Xnn+NSGk", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSeparateModeOpen); + LIB_FUNCTION("stQ7AsondmE", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSeparateModeSendAudio); + LIB_FUNCTION("jfnS-OoDayM", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSeparateModeSendVideo); + LIB_FUNCTION("roHN4ml+tB8", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetBrightness); + LIB_FUNCTION("0z2qLqedQH0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetCrashReportCommand); + LIB_FUNCTION("xhx5rVZEpnw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetDebugGpo); + LIB_FUNCTION("e7laRxRGCHc", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetDebugMode); + LIB_FUNCTION("CRyJ7Q-ap3g", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetDebugSocialScreenMode); + LIB_FUNCTION("dG4XPW4juU4", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetDebugTextMode); + LIB_FUNCTION("rAXmGoO-VmE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetDefaultLedData); + LIB_FUNCTION("lu9I7jnUvWQ", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetDemoMode); + LIB_FUNCTION("hyATMTuQSoQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetDeviceConnection); + LIB_FUNCTION("c4mSi64bXUw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetForcedCrash); + LIB_FUNCTION("U9kPT4g1mFE", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetHmuPowerControl); + LIB_FUNCTION("dX-MVpXIPwQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetHmuPowerControlForDebug); + LIB_FUNCTION("4KIjvAf8PCA", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetIPD); + LIB_FUNCTION("NbxTfUKO184", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetIpdSettingEnableForSystemService); + LIB_FUNCTION("NnRKjf+hxW4", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetLedOn); + LIB_FUNCTION("4AP0X9qGhqw", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetM2LedBrightness); + LIB_FUNCTION("Mzzz2HPWM+8", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetM2LedOn); + LIB_FUNCTION("LkBkse9Pit0", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetPortConnection); + LIB_FUNCTION("v243mvYg0Y0", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetPortStatus); + LIB_FUNCTION("EwXvkZpo9Go", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetS3dPassMode); + LIB_FUNCTION("g3DKNOy1tYw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetSidetone); + LIB_FUNCTION("mjMsl838XM8", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetUserType); + LIB_FUNCTION("8IS0KLkDNQY", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetVirtualDisplayDepth); + LIB_FUNCTION("afhK5KcJOJY", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetVirtualDisplayHeight); + LIB_FUNCTION("+zPvzIiB+BU", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSetVirtualDisplaySize); + LIB_FUNCTION("9z8Lc64NF1c", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdInternalSetVRMode); + LIB_FUNCTION("s5EqYh5kbwM", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSocialScreenGetFadeState); + LIB_FUNCTION("a1LMFZtK9b0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSocialScreenSetFadeAndSwitch); + LIB_FUNCTION("-6FjKlMA+Yc", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdInternalSocialScreenSetOutput); + LIB_FUNCTION("d2g5Ij7EUzo", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdOpen); + LIB_FUNCTION("NTIbBpSH9ik", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionAddDisplayBuffer); + LIB_FUNCTION("94+Ggm38KCg", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionClearUserEventEnd); + LIB_FUNCTION("mdyFbaJj66M", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionClearUserEventStart); + LIB_FUNCTION("MdV0akauNow", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionDebugGetLastInfo); + LIB_FUNCTION("ymiwVjPB5+k", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionDebugGetLastInfoMultilayer); + LIB_FUNCTION("ZrV5YIqD09I", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionFinalize); + LIB_FUNCTION("utHD2Ab-Ixo", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionFinalizeCapture); + LIB_FUNCTION("OuygGEWkins", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionInitialize); + LIB_FUNCTION("BTrQnC6fcAk", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionInitializeCapture); + LIB_FUNCTION("TkcANcGM0s8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryGarlicBuffAlign); + LIB_FUNCTION("z0KtN1vqF2E", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryGarlicBuffSize); + LIB_FUNCTION("IWybWbR-xvA", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryOnionBuffAlign); + LIB_FUNCTION("kLUAkN6a1e8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionQueryOnionBuffSize); + LIB_FUNCTION("6CRWGc-evO4", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionSetCallback); + LIB_FUNCTION("E+dPfjeQLHI", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetDisplayBuffers); + LIB_FUNCTION("LjdLRysHU6Y", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetOutputMinColor); + LIB_FUNCTION("knyIhlkpLgE", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetUserEventEnd); + LIB_FUNCTION("7as0CjXW1B8", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionSetUserEventStart); + LIB_FUNCTION("dntZTJ7meIU", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStart); + LIB_FUNCTION("q3e8+nEguyE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStart2dVr); + LIB_FUNCTION("RrvyU1pjb9A", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStartCapture); + LIB_FUNCTION("XZ5QUzb4ae0", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartLiveCapture); + LIB_FUNCTION("8gH1aLgty5I", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartMultilayer); + LIB_FUNCTION("gqAG7JYeE7A", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartMultilayer2); + LIB_FUNCTION("3JyuejcNhC0", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStartWideNear); + LIB_FUNCTION("mKa8scOc4-k", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartWideNearWithOverlay); + LIB_FUNCTION("kcldQ7zLYQQ", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStartWithOverlay); + LIB_FUNCTION("vzMEkwBQciM", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStop); + LIB_FUNCTION("F7Sndm5teWw", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionStopCapture); + LIB_FUNCTION("PAa6cUL5bR4", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionStopLiveCapture); + LIB_FUNCTION("0wnZViigP9o", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdReprojectionUnsetCallback); + LIB_FUNCTION("iGNNpDDjcwo", "libSceHmd", 1, "libSceHmd", 1, 1, + sceHmdReprojectionUnsetDisplayBuffers); + LIB_FUNCTION("z-RMILqP6tE", "libSceHmd", 1, "libSceHmd", 1, 1, sceHmdTerminate); + LIB_FUNCTION("IC0NGmh-zS8", "libSceHmd", 1, "libSceHmd", 1, 1, Func_202D0D1A687FCD2F); + LIB_FUNCTION("NY2-gYo9ihI", "libSceHmd", 1, "libSceHmd", 1, 1, Func_358DBF818A3D8A12); + LIB_FUNCTION("XMutp2-o9A4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_5CCBADA76FE8F40E); + LIB_FUNCTION("Y9QDFn3AjPA", "libSceHmd", 1, "libSceHmd", 1, 1, Func_63D403167DC08CF0); + LIB_FUNCTION("aTg7K0466r8", "libSceHmd", 1, "libSceHmd", 1, 1, Func_69383B2B4E3AEABF); + LIB_FUNCTION("eRVgwy9PbWg", "libSceHmd", 1, "libSceHmd", 1, 1, Func_791560C32F4F6D68); + LIB_FUNCTION("fJVZYeqFttM", "libSceHmd", 1, "libSceHmd", 1, 1, Func_7C955961EA85B6D3); + LIB_FUNCTION("mVIneDkja6c", "libSceHmd", 1, "libSceHmd", 1, 1, Func_9952277839236BA7); + LIB_FUNCTION("miduc55U7q8", "libSceHmd", 1, "libSceHmd", 1, 1, Func_9A276E739E54EEAF); + LIB_FUNCTION("nlAZlOKJy+c", "libSceHmd", 1, "libSceHmd", 1, 1, Func_9E501994E289CBE7); + LIB_FUNCTION("oxoDINgOrZk", "libSceHmd", 1, "libSceHmd", 1, 1, Func_A31A0320D80EAD99); + LIB_FUNCTION("ox9NqLO9LhI", "libSceHmd", 1, "libSceHmd", 1, 1, Func_A31F4DA8B3BD2E12); + LIB_FUNCTION("qS18I6w2SZM", "libSceHmd", 1, "libSceHmd", 1, 1, Func_A92D7C23AC364993); + LIB_FUNCTION("rczCXLh2-b4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_ADCCC25CB876FDBE); + LIB_FUNCTION("sWZSZB-mnw4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B16652641FE69F0E); + LIB_FUNCTION("thTykLZ-tZs", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B614F290B67FB59B); + LIB_FUNCTION("uab6BzXsfkk", "libSceHmd", 1, "libSceHmd", 1, 1, Func_B9A6FA0735EC7E49); + LIB_FUNCTION("-Bk71lPyry4", "libSceHmd", 1, "libSceHmd", 1, 1, Func_FC193BD653F2AF2E); + LIB_FUNCTION("-y4OUwFf4jE", "libSceHmd", 1, "libSceHmd", 1, 1, Func_FF2E0E53015FE231); +}; + +} // namespace Libraries::Hmd \ No newline at end of file diff --git a/src/core/libraries/hmd/hmd.h b/src/core/libraries/hmd/hmd.h new file mode 100644 index 000000000..12f1ac70a --- /dev/null +++ b/src/core/libraries/hmd/hmd.h @@ -0,0 +1,203 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::Hmd { + +s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer(); +s32 PS4_SYSV_ABI sceHmdDistortionGet2dVrCommand(); +s32 PS4_SYSV_ABI sceHmdDistortionGetCompoundEyeCorrectionCommand(); +s32 PS4_SYSV_ABI sceHmdDistortionGetCorrectionCommand(); +s32 PS4_SYSV_ABI sceHmdDistortionGetWideNearCorrectionCommand(); +s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemoryAlign(); +s32 PS4_SYSV_ABI sceHmdDistortionGetWorkMemorySize(); +s32 PS4_SYSV_ABI sceHmdDistortionInitialize(); +s32 PS4_SYSV_ABI sceHmdDistortionSetOutputMinColor(); +s32 PS4_SYSV_ABI Func_B26430EA74FC3DC0(); +s32 PS4_SYSV_ABI sceHmdClose(); +s32 PS4_SYSV_ABI sceHmdGet2DEyeOffset(); +s32 PS4_SYSV_ABI sceHmdGet2dVrCommand(); +s32 PS4_SYSV_ABI sceHmdGetAssyError(); +s32 PS4_SYSV_ABI sceHmdGetDeviceInformation(); +s32 PS4_SYSV_ABI sceHmdGetDeviceInformationByHandle(); +s32 PS4_SYSV_ABI sceHmdGetDistortionCorrectionCommand(); +s32 PS4_SYSV_ABI sceHmdGetDistortionParams(); +s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemoryAlign(); +s32 PS4_SYSV_ABI sceHmdGetDistortionWorkMemorySize(); +s32 PS4_SYSV_ABI sceHmdGetFieldOfView(); +s32 PS4_SYSV_ABI sceHmdGetInertialSensorData(); +s32 PS4_SYSV_ABI sceHmdGetWideNearDistortionCorrectionCommand(); +s32 PS4_SYSV_ABI sceHmdInitialize(); +s32 PS4_SYSV_ABI sceHmdInitialize315(); +s32 PS4_SYSV_ABI sceHmdInternal3dAudioClose(); +s32 PS4_SYSV_ABI sceHmdInternal3dAudioOpen(); +s32 PS4_SYSV_ABI sceHmdInternal3dAudioSendData(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenClose(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenGetAudioStatus(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenGetFadeState(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenGetVideoStatus(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenOpen(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenSendAudio(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenSendVideo(); +s32 PS4_SYSV_ABI sceHmdInternalAnotherScreenSetFadeAndSwitch(); +s32 PS4_SYSV_ABI sceHmdInternalBindDeviceWithUserId(); +s32 PS4_SYSV_ABI sceHmdInternalCheckDeviceModelMk3(); +s32 PS4_SYSV_ABI sceHmdInternalCheckS3dPassModeAvailable(); +s32 PS4_SYSV_ABI sceHmdInternalCrashReportCancel(); +s32 PS4_SYSV_ABI sceHmdInternalCrashReportClose(); +s32 PS4_SYSV_ABI sceHmdInternalCrashReportOpen(); +s32 PS4_SYSV_ABI sceHmdInternalCrashReportReadData(); +s32 PS4_SYSV_ABI sceHmdInternalCrashReportReadDataSize(); +s32 PS4_SYSV_ABI sceHmdInternalCreateSharedMemory(); +s32 PS4_SYSV_ABI sceHmdInternalDfuCheckAfterPvt(); +s32 PS4_SYSV_ABI sceHmdInternalDfuCheckPartialUpdateAvailable(); +s32 PS4_SYSV_ABI sceHmdInternalDfuClose(); +s32 PS4_SYSV_ABI sceHmdInternalDfuGetStatus(); +s32 PS4_SYSV_ABI sceHmdInternalDfuOpen(); +s32 PS4_SYSV_ABI sceHmdInternalDfuReset(); +s32 PS4_SYSV_ABI sceHmdInternalDfuSend(); +s32 PS4_SYSV_ABI sceHmdInternalDfuSendSize(); +s32 PS4_SYSV_ABI sceHmdInternalDfuSetMode(); +s32 PS4_SYSV_ABI sceHmdInternalDfuStart(); +s32 PS4_SYSV_ABI sceHmdInternalEventInitialize(); +s32 PS4_SYSV_ABI sceHmdInternalGetBrightness(); +s32 PS4_SYSV_ABI sceHmdInternalGetCrashDumpInfo(); +s32 PS4_SYSV_ABI sceHmdInternalGetDebugMode(); +s32 PS4_SYSV_ABI sceHmdInternalGetDebugSocialScreenMode(); +s32 PS4_SYSV_ABI sceHmdInternalGetDebugTextMode(); +s32 PS4_SYSV_ABI sceHmdInternalGetDefaultLedData(); +s32 PS4_SYSV_ABI sceHmdInternalGetDemoMode(); +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceInformation(); +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceInformationByHandle(); +s32 PS4_SYSV_ABI sceHmdInternalGetDeviceStatus(); +s32 PS4_SYSV_ABI sceHmdInternalGetEyeStatus(); +s32 PS4_SYSV_ABI sceHmdInternalGetHmuOpticalParam(); +s32 PS4_SYSV_ABI sceHmdInternalGetHmuPowerStatusForDebug(); +s32 PS4_SYSV_ABI sceHmdInternalGetHmuSerialNumber(); +s32 PS4_SYSV_ABI sceHmdInternalGetIPD(); +s32 PS4_SYSV_ABI sceHmdInternalGetIpdSettingEnableForSystemService(); +s32 PS4_SYSV_ABI sceHmdInternalGetPuBuildNumber(); +s32 PS4_SYSV_ABI sceHmdInternalGetPuPositionParam(); +s32 PS4_SYSV_ABI sceHmdInternalGetPuRevision(); +s32 PS4_SYSV_ABI sceHmdInternalGetPUSerialNumber(); +s32 PS4_SYSV_ABI sceHmdInternalGetPUVersion(); +s32 PS4_SYSV_ABI sceHmdInternalGetRequiredPUPVersion(); +s32 PS4_SYSV_ABI sceHmdInternalGetStatusReport(); +s32 PS4_SYSV_ABI sceHmdInternalGetTv4kCapability(); +s32 PS4_SYSV_ABI sceHmdInternalGetVirtualDisplayDepth(); +s32 PS4_SYSV_ABI sceHmdInternalGetVirtualDisplayHeight(); +s32 PS4_SYSV_ABI sceHmdInternalGetVirtualDisplaySize(); +s32 PS4_SYSV_ABI sceHmdInternalGetVr2dData(); +s32 PS4_SYSV_ABI sceHmdInternalIsCommonDlgMiniAppVr2d(); +s32 PS4_SYSV_ABI sceHmdInternalIsCommonDlgVr2d(); +s32 PS4_SYSV_ABI sceHmdInternalIsGameVr2d(); +s32 PS4_SYSV_ABI sceHmdInternalIsMiniAppVr2d(); +s32 PS4_SYSV_ABI sceHmdInternalMapSharedMemory(); +s32 PS4_SYSV_ABI sceHmdInternalMirroringModeSetAspect(); +s32 PS4_SYSV_ABI sceHmdInternalMirroringModeSetAspectDebug(); +s32 PS4_SYSV_ABI sceHmdInternalMmapGetCount(); +s32 PS4_SYSV_ABI sceHmdInternalMmapGetModeId(); +s32 PS4_SYSV_ABI sceHmdInternalMmapGetSensorCalibrationData(); +s32 PS4_SYSV_ABI sceHmdInternalMmapIsConnect(); +s32 PS4_SYSV_ABI sceHmdInternalPushVr2dData(); +s32 PS4_SYSV_ABI sceHmdInternalRegisterEventCallback(); +s32 PS4_SYSV_ABI sceHmdInternalResetInertialSensor(); +s32 PS4_SYSV_ABI sceHmdInternalResetLedForVrTracker(); +s32 PS4_SYSV_ABI sceHmdInternalResetLedForVsh(); +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeClose(); +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeGetAudioStatus(); +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeGetVideoStatus(); +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeOpen(); +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeSendAudio(); +s32 PS4_SYSV_ABI sceHmdInternalSeparateModeSendVideo(); +s32 PS4_SYSV_ABI sceHmdInternalSetBrightness(); +s32 PS4_SYSV_ABI sceHmdInternalSetCrashReportCommand(); +s32 PS4_SYSV_ABI sceHmdInternalSetDebugGpo(); +s32 PS4_SYSV_ABI sceHmdInternalSetDebugMode(); +s32 PS4_SYSV_ABI sceHmdInternalSetDebugSocialScreenMode(); +s32 PS4_SYSV_ABI sceHmdInternalSetDebugTextMode(); +s32 PS4_SYSV_ABI sceHmdInternalSetDefaultLedData(); +s32 PS4_SYSV_ABI sceHmdInternalSetDemoMode(); +s32 PS4_SYSV_ABI sceHmdInternalSetDeviceConnection(); +s32 PS4_SYSV_ABI sceHmdInternalSetForcedCrash(); +s32 PS4_SYSV_ABI sceHmdInternalSetHmuPowerControl(); +s32 PS4_SYSV_ABI sceHmdInternalSetHmuPowerControlForDebug(); +s32 PS4_SYSV_ABI sceHmdInternalSetIPD(); +s32 PS4_SYSV_ABI sceHmdInternalSetIpdSettingEnableForSystemService(); +s32 PS4_SYSV_ABI sceHmdInternalSetLedOn(); +s32 PS4_SYSV_ABI sceHmdInternalSetM2LedBrightness(); +s32 PS4_SYSV_ABI sceHmdInternalSetM2LedOn(); +s32 PS4_SYSV_ABI sceHmdInternalSetPortConnection(); +s32 PS4_SYSV_ABI sceHmdInternalSetPortStatus(); +s32 PS4_SYSV_ABI sceHmdInternalSetS3dPassMode(); +s32 PS4_SYSV_ABI sceHmdInternalSetSidetone(); +s32 PS4_SYSV_ABI sceHmdInternalSetUserType(); +s32 PS4_SYSV_ABI sceHmdInternalSetVirtualDisplayDepth(); +s32 PS4_SYSV_ABI sceHmdInternalSetVirtualDisplayHeight(); +s32 PS4_SYSV_ABI sceHmdInternalSetVirtualDisplaySize(); +s32 PS4_SYSV_ABI sceHmdInternalSetVRMode(); +s32 PS4_SYSV_ABI sceHmdInternalSocialScreenGetFadeState(); +s32 PS4_SYSV_ABI sceHmdInternalSocialScreenSetFadeAndSwitch(); +s32 PS4_SYSV_ABI sceHmdInternalSocialScreenSetOutput(); +s32 PS4_SYSV_ABI sceHmdOpen(); +s32 PS4_SYSV_ABI sceHmdReprojectionAddDisplayBuffer(); +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventEnd(); +s32 PS4_SYSV_ABI sceHmdReprojectionClearUserEventStart(); +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfo(); +s32 PS4_SYSV_ABI sceHmdReprojectionDebugGetLastInfoMultilayer(); +s32 PS4_SYSV_ABI sceHmdReprojectionFinalize(); +s32 PS4_SYSV_ABI sceHmdReprojectionFinalizeCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionInitialize(); +s32 PS4_SYSV_ABI sceHmdReprojectionInitializeCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffAlign(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryGarlicBuffSize(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffAlign(); +s32 PS4_SYSV_ABI sceHmdReprojectionQueryOnionBuffSize(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetCallback(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetDisplayBuffers(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetOutputMinColor(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventEnd(); +s32 PS4_SYSV_ABI sceHmdReprojectionSetUserEventStart(); +s32 PS4_SYSV_ABI sceHmdReprojectionStart(); +s32 PS4_SYSV_ABI sceHmdReprojectionStart2dVr(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartLiveCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartMultilayer2(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNear(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartWideNearWithOverlay(); +s32 PS4_SYSV_ABI sceHmdReprojectionStartWithOverlay(); +s32 PS4_SYSV_ABI sceHmdReprojectionStop(); +s32 PS4_SYSV_ABI sceHmdReprojectionStopCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionStopLiveCapture(); +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetCallback(); +s32 PS4_SYSV_ABI sceHmdReprojectionUnsetDisplayBuffers(); +s32 PS4_SYSV_ABI sceHmdTerminate(); +s32 PS4_SYSV_ABI Func_202D0D1A687FCD2F(); +s32 PS4_SYSV_ABI Func_358DBF818A3D8A12(); +s32 PS4_SYSV_ABI Func_5CCBADA76FE8F40E(); +s32 PS4_SYSV_ABI Func_63D403167DC08CF0(); +s32 PS4_SYSV_ABI Func_69383B2B4E3AEABF(); +s32 PS4_SYSV_ABI Func_791560C32F4F6D68(); +s32 PS4_SYSV_ABI Func_7C955961EA85B6D3(); +s32 PS4_SYSV_ABI Func_9952277839236BA7(); +s32 PS4_SYSV_ABI Func_9A276E739E54EEAF(); +s32 PS4_SYSV_ABI Func_9E501994E289CBE7(); +s32 PS4_SYSV_ABI Func_A31A0320D80EAD99(); +s32 PS4_SYSV_ABI Func_A31F4DA8B3BD2E12(); +s32 PS4_SYSV_ABI Func_A92D7C23AC364993(); +s32 PS4_SYSV_ABI Func_ADCCC25CB876FDBE(); +s32 PS4_SYSV_ABI Func_B16652641FE69F0E(); +s32 PS4_SYSV_ABI Func_B614F290B67FB59B(); +s32 PS4_SYSV_ABI Func_B9A6FA0735EC7E49(); +s32 PS4_SYSV_ABI Func_FC193BD653F2AF2E(); +s32 PS4_SYSV_ABI Func_FF2E0E53015FE231(); + +void RegisterlibSceHmd(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::Hmd \ No newline at end of file diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 8cf286d13..074cf524e 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -11,6 +11,7 @@ #include "core/libraries/disc_map/disc_map.h" #include "core/libraries/game_live_streaming/gamelivestreaming.h" #include "core/libraries/gnmdriver/gnmdriver.h" +#include "core/libraries/hmd/hmd.h" #include "core/libraries/ime/error_dialog.h" #include "core/libraries/ime/ime.h" #include "core/libraries/ime/ime_dialog.h" @@ -113,6 +114,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::WebBrowserDialog::RegisterlibSceWebBrowserDialog(sym); Libraries::NpParty::RegisterlibSceNpParty(sym); Libraries::Zlib::RegisterlibSceZlib(sym); + Libraries::Hmd::RegisterlibSceHmd(sym); } } // namespace Libraries From 126cb824eaf914f798b8e9ab6b5bcd5d3e4e9bd1 Mon Sep 17 00:00:00 2001 From: Daniel Nylander Date: Wed, 5 Feb 2025 16:25:15 +0100 Subject: [PATCH 226/455] Updated Swedish translation (#2327) * Adding Swedish translation * Updated Swedish translation with additional strings Updated the Swedish translations using lupdate to found additional strings cd src/qt_gui/treanslations lupdate ../../../../shadPS4/ -tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS -no-obsolete -locations none -source-language en -ts sv.ts * Update sv.ts * Updated Swedish translation * Adding copyright boilerplate * Updated Swedish translation * Updated Swedish translation * Update sv.ts whitespace in boilerplate --- src/qt_gui/translations/sv.ts | 114 ++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 41 deletions(-) diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index deefa99d8..179064ef4 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -210,7 +210,7 @@ Incompatibility Notice - Inkompatibilitetsmeddelande + Meddelande om inkompatibilitet Failed to open file: @@ -386,6 +386,30 @@ Unable to open compatibility.json for writing. Kunde inte öppna compatibility.json för skrivning. + + Unknown + Okänt + + + Nothing + Ingenting + + + Boots + Startar upp + + + Menus + Menyer + + + Ingame + Problem + + + Playable + Spelbart +
ElfViewer @@ -756,7 +780,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Öppna shadPS4-mapp Exit @@ -788,7 +812,7 @@ Medium - Medel + Medelstora Large @@ -828,7 +852,7 @@ File - Arkiv + Fil View @@ -860,19 +884,19 @@ Dark - Mörk + Mörkt Light - Ljus + Ljust Green - Grön + Grönt Blue - Blå + Blått Violet @@ -880,7 +904,7 @@ toolBar - toolBar + Verktygsrad Game List @@ -1084,6 +1108,10 @@ Show Splash Visa startskärm + + ps4proCheckBox + Är PS4 Pro:\nGör att emulatorn agerar som en PS4 PRO, vilket kan aktivera speciella funktioner i spel som har stöd för det + Enable Discord Rich Presence Aktivera Discord Rich Presence @@ -1098,7 +1126,7 @@ Trophy - Trofé + Troféer Logger @@ -1122,15 +1150,15 @@ Cursor - Pekare + Muspekare Hide Cursor - Dölj pekare + Dölj muspekare Hide Cursor Idle Timeout - Dölj pekare vid overksam + Dölj muspekare vid overksam s @@ -1174,7 +1202,7 @@ Advanced - Avancerat + Avancerat Enable Shaders Dumping @@ -1222,23 +1250,23 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Aktivera kraschdiagnostik Collect Shaders - Collect Shaders + Samla shaders Copy GPU Buffers - Copy GPU Buffers + Kopiera GPU-buffertar Host Debug Markers - Host Debug Markers + Felsökningsmarkörer för värd Guest Debug Markers - Guest Debug Markers + Felsökningsmarkörer för gäst Update @@ -1262,7 +1290,7 @@ Title Music - Title Music + Titelmusik Disable Trophy Pop-ups @@ -1310,7 +1338,7 @@ Point your mouse at an option to display its description. - Peka din mus på ett alternativ för att visa dess beskrivning. + Flytta muspekaren till ett alternativ för att visa dess beskrivning. consoleLanguageGroupBox @@ -1465,25 +1493,25 @@ Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - + collectShaderCheckBox + Samla shaders:\nDu behöver aktivera detta för att redigera shaders med felsökningsmenyn (Ctrl + F10) + + + crashDiagnosticsCheckBox + Krashdiagnostik:\nSkapar en .yaml-fil med information om Vulkan-tillståndet vid tid för kraschen.\nAnvändbart för felsökning av 'Device lost'-fel. Om du har aktiverat detta bör du aktivera felsökningsmarkörer för Värd OCH Gäst.\nFungerar inte på Intel GPUer.\nDu behöver aktivera Vulkan Validation Layers och Vulkan SDK för att detta ska fungera + + + copyGPUBuffersCheckBox + Kopiera GPU-buffertar:\nGör att man kan komma runt race conditions som involverar GPU submits.\nKan eller kan inte hjälpa med PM4 type 0-kraschar + + + hostMarkersCheckBox + Felsökningsmarkörer för värd:\nInfogar informationsliknande markörer i emulatorn för specifika AMDGPU-kommandon runt Vulkan-kommandon, så väl som ger resurser felsökningsnamn.\nOm du har detta aktiverat bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc + + + guestMarkersCheckBox + Felsökningsmarkörer för gäst:\nInfogar felsökningsmarkörer som själva spelet har lagt till i kommandobufferten.\nOm du har aktiverat detta bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc + Release Release @@ -1540,6 +1568,10 @@ browseButton Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data + + GUI + Gränssnitt + TrophyViewer From 00465d5e41a29ac0160d8d5400c071f2de7b4a12 Mon Sep 17 00:00:00 2001 From: SAN4EZDREAMS <126363936+SAN4EZDREAMS@users.noreply.github.com> Date: Wed, 5 Feb 2025 17:25:36 +0200 Subject: [PATCH 227/455] Updated uk_UA language to v0.6.1 (#2347) * Add Ukrainian localization * Fixed langIndexes * Fixed langIndexes_2 * Added uk_UA language support * Added uk_UA language support * Updated uk_UA localization to the latest version && corrected lexical mistakes * Added missing lines in the translation and minor edits * Correction * Second Correction * Added missed strings work test * Added more missed strings --------- Co-authored-by: SAN4EZDREAMS --- src/qt_gui/translations/uk_UA.ts | 332 ++++++++++++++++++++++--------- 1 file changed, 240 insertions(+), 92 deletions(-) diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index e80d363d3..3fb26546e 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -54,6 +54,14 @@ Select which directory you want to install to. Виберіть папку, до якої ви хочете встановити. + + Install All Queued to Selected Folder + Встановити все з черги до вибраної папки + + + Delete PKG File on Install + Видалити файл PKG під час встановлення + GameInstallDialog @@ -102,15 +110,19 @@ Open Game Folder - Відкрити папку з грою + Відкрити папку гри + + Open Update Folder + Відкрити папку оновлень + Open Save Data Folder - Відкрити Папку Збережених Даних + Відкрити папку збережень гри Open Log Folder - Відкрити Папку Логів + Відкрити папку логів Copy info... @@ -118,19 +130,27 @@ Copy Name - Копіювати Ім’я + Копіювати назву гри Copy Serial Копіювати серійний номер + + Copy Version + Копіювати версію + + + Copy Size + Копіювати розмір + Copy All Копіювати все Delete... - Видалення... + Видалити... Delete Game @@ -140,25 +160,29 @@ Delete Update Видалити оновлення + + Delete Save Data + Видалити збереження + Delete DLC Видалити DLC Compatibility... - Compatibility... + Сумісність... Update database - Update database + Оновити базу даних View report - View report + Переглянути звіт Submit a report - Submit a report + Створити звіт Shortcut creation @@ -182,7 +206,7 @@ Game - Ігри + гри requiresEnableSeparateUpdateFolder_MSG @@ -192,10 +216,22 @@ This game has no update to delete! Ця гра не має оновлень для видалення! + + This game has no update folder to open! + Ця гра не має папки оновленнь, щоб відкрити її! + Update Оновлення + + This game has no save data to delete! + Ця гра не містить збережень, які можна видалити! + + + Save Data + Збереження + This game has no DLC to delete! Ця гра не має DLC для видалення! @@ -206,11 +242,11 @@ Delete %1 - Видалити %1 + Видалення %1 Are you sure you want to delete %1's %2 directory? - Ви впевнені, що хочете видалити папку %1 з папки %2?? + Ви впевнені, що хочете видалити %1 з папки %2? @@ -229,7 +265,7 @@ Check for Updates - Перевити наявність оновлень + Перевірити наявність оновлень About shadPS4 @@ -249,7 +285,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Відкрити папку shadPS4 Exit @@ -297,15 +333,15 @@ Elf Viewer - Elf + Виконуваний файл Game Install Directory - Каталог встановлення гри + Каталоги встановлення ігор та оновлень Download Cheats/Patches - Завантажити Чити або Патчі + Завантажити Чити/Патчі Dump Game List @@ -329,7 +365,7 @@ Game List Icons - Розмір значків списку игр + Розмір значків списку ігор Game List Mode @@ -385,7 +421,7 @@ Download Cheats For All Installed Games - Завантажити чити для всіх встановлених ігор + Завантажити чити для усіх встановлених ігор Download Patches For All Games @@ -397,7 +433,7 @@ You have downloaded cheats for all the games you have installed. - Ви завантажили чити для всіх встановлених ігор. + Ви завантажили чити для усіх встановлених ігор. Patches Downloaded Successfully! @@ -417,7 +453,7 @@ ELF files (*.bin *.elf *.oelf) - Файл ELF (*.bin *.elf *.oelf) + Файли ELF (*.bin *.elf *.oelf) Game Boot @@ -429,7 +465,7 @@ PKG Extraction - Видобуток PKG + Розпакування PKG Patch detected! @@ -449,7 +485,7 @@ Game is installed: - Гра встановлена: + Встановлена гра: Would you like to install Patch: @@ -461,7 +497,7 @@ Would you like to install DLC: %1? - Ви бажаєте встановити DLC: %1?? + Ви бажаєте встановити DLC: %1? DLC already installed: @@ -481,11 +517,11 @@ Extracting PKG %1/%2 - Вилучення PKG %1/%2 + Витягування PKG %1/%2 Extraction Finished - Вилучення завершено + Розпакування завершено Game successfully installed at %1 @@ -542,8 +578,16 @@ Fullscreen Mode - Режим Повноекранний + Тип повноекранного режиму + + Borderless + Без рамок + + + True + Повний екран + Enable Separate Update Folder Увімкнути окрему папку оновлень @@ -554,7 +598,7 @@ Show Game Size In List - Показати розмір гри в списку + Показати розмір гри у списку Show Splash @@ -574,11 +618,11 @@ Trophy Key - Trophy Key + Ключ трофеїв Trophy - Trophy + Трофеї Logger @@ -588,6 +632,14 @@ Log Type Тип логів + + async + Асинхронний + + + sync + Синхронний + Log Filter Фільтр логів @@ -614,7 +666,7 @@ s - s + сек Controller @@ -622,14 +674,18 @@ Back Button Behavior - Поведінка кнопки назад + Перепризначення кнопки назад + + Enable Motion Controls + Увімкнути керування рухом + Graphics Графіка - Gui + GUI Інтерфейс @@ -660,6 +716,10 @@ Enable Shaders Dumping Увімкнути дамп шейдерів + + Auto Select + Автовибір + Enable NULL GPU Увімкнути NULL GPU @@ -678,8 +738,12 @@ Remove - Видалити + Вилучити + + Save Data Path + Шлях до файлів збережень + Debug Налагодження @@ -702,36 +766,45 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Увімкнути діагностику збоїв Collect Shaders - Collect Shaders + Збирати шейдери Copy GPU Buffers - Copy GPU Buffers + Копіювати буфери GPU Host Debug Markers - Host Debug Markers + Хостові маркери налагодження Guest Debug Markers - Guest Debug Markers + Гостьові маркери налагодження + Update Оновлення Check for Updates at Startup - Перевірка оновлень під час запуску + Перевіряти оновлення під час запуску Update Channel Канал оновлення + + Release + Релізний + + + Nightly + Тестовий + Check for Updates Перевірити оновлення @@ -742,31 +815,43 @@ Title Music - Title Music + Титульна музика Disable Trophy Pop-ups - Disable Trophy Pop-ups + Вимкнути спливаючі вікна трофеїв + + + Background Image + Фонове зображення + + + Show Background Image + Показувати фонове зображення + + + Opacity + Непрозорість Play title music - Програвати заголовну музику + Програвати титульну музику Update Compatibility Database On Startup - Update Compatibility Database On Startup + Оновлення даних ігрової сумісності під час запуску Game Compatibility - Game Compatibility + Сумісність з іграми Display Compatibility Data - Display Compatibility Data + Відображати данні ігрової сумістністі Update Compatibility Database - Update Compatibility Database + Оновити данні ігрової сумістності Volume @@ -774,7 +859,7 @@ Audio Backend - Audio Backend + Аудіосистема Save @@ -826,11 +911,11 @@ userName - Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Це може відображатися в деяких іграх. + Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Воно може відображатися в деяких іграх. TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Ключ трофеїв:\nКлюч для розшифровки трофеїв. Може бути отриманий зі зламаної консолі.\nПовинен містити лише шістнадцяткові символи. logTypeGroupBox @@ -842,19 +927,23 @@ updaterGroupBox - Оновлення:\nRelease: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nNightly: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. + Оновлення:\nРелізний: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nТестовий: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. + + + GUIBackgroundImageGroupBox + Фонове зображення:\nКерує непрозорістю фонового зображення гри. GUIMusicGroupBox - Грати заголовну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. + Грати титульну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Вимкнути спливаючі вікна трофеїв:\nВимикає сповіщення про ігрові трофеї. Прогрес трофея все ще можна відстежувати за допомогою "Перегляд трофеїв" (клацніть правою кнопкою миші на грі у головному вікні). hideCursorGroupBox - Приховувати курсор:\nВиберіть, коли курсор зникне:\nНіколи: Ви завжди будете бачити мишу.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Ви ніколи не будете бачити мишу. + Приховувати курсор:\nВиберіть, коли курсор зникатиме:\nНіколи: Курсор миші завжди буде видимий.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Курсор миші завжди буде прихований. idleTimeoutGroupBox @@ -862,19 +951,19 @@ backButtonBehaviorGroupBox - Поведінка кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. + Перепризначення кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть "Оновлення даних ігрової сумісності під час запуску" для отримання актуальної інформації. checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Оновлення даних ігрової сумісності під час запуску:\nАвтоматично оновлює базу даних ігрової сумісності під час запуску shadPS4. updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. Never @@ -890,23 +979,23 @@ Touchpad Left - Тачпад ліворуч + Ліва сторона тачпаду Touchpad Right - Тачпад праворуч + Права сторона тачпаду Touchpad Center - Тачпад по центру + Середина тачпаду None - Ні + Без змін graphicsAdapterGroupBox - Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Auto Select", щоб визначити його автоматично. + Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Автовибір", щоб визначити його автоматично. resolutionLayout @@ -926,7 +1015,7 @@ gameFoldersBox - Ігрові папки:\nСписок папок для перевірки встановлених ігор. + Ігрові папки:\nСписок папок, що скануватимуться для виявлення ігор. addFolderButton @@ -934,7 +1023,7 @@ removeFolderButton - Видалити:\nВидалити папку зі списку. + Вилучити:\nВилучити папку зі списку. debugDump @@ -954,30 +1043,38 @@ collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Збирати шейдери:\nВам потрібно увімкнути цю опцію, щоб редагувати шейдери за допомогою меню налагодження (Ctrl + F10). crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Діагностика збоїв:\nСтворює .yaml файл з інформацією про стан Vulkan на момент збою.\nКорисно для налагодження помилок 'Device lost'. Якщо у вас увімкнено цей параметр, вам слід увімкнути маркери налагодження Хоста ТА Гостя.\nНе працює на графічних процесорах Intel.\nДля цього вам потрібно увімкнути шари валідації Vulkan і мати Vulkan SDK. copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Копіювати буфери GPU:\nДозволяє обійти проблеми синхронізації, пов'язані з відправленням даних на GPU\nМоже як допомогти, так і не вплинути на збої типу PM4 (тип 0). hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Хостові маркери налагодження:\nДодає інформацію емулятора, наприклад маркери для конкретних команд AMDGPU у Vulkan, також присвоює ресурсам налагоджувані назви.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Гостьові маркери налагодження:\nВставляє налагоджувані маркери, які сама гра додала до командного буфера.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. + + + saveDataBox + Шлях до файлів збережень:\nПапка, де будуть зберігатися ігрові збереження. + + + browseButton + Вибрати:\nВиберіть папку для ігрових збережень. CheatsPatches Cheats / Patches for - Cheats / Patches for + Чити та Патчі для defaultTextEdit_MSG @@ -1149,7 +1246,7 @@ The game is in version: %1 - Гра у версії: %1 + Версія гри: %1 The downloaded patch only works on version: %1 @@ -1189,7 +1286,7 @@ Name: - Ім'я: + Назва: Can't apply cheats before the game is started @@ -1212,7 +1309,7 @@ Compatibility - Compatibility + Сумісність Region @@ -1240,43 +1337,43 @@ Never Played - Never Played + Ніколи не запускалась h - h + год m - m + хв s - s + сек Compatibility is untested - Compatibility is untested + Сумісність не перевірена Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Гра не ініціалізується належним чином або спричиняє збій емулятора. Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Гра запускається, але відображає лише чорний екран. Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Гра відображає зображення, але не проходить далі меню. Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + У грі є критичні баги або погана продуктивність Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Гру можна пройти з хорошою продуктивністю та без серйозних глюків. @@ -1303,7 +1400,7 @@ Invalid release data. - Неприпустимі дані релізу. + Некоректні дані про випуск. No download URL found for the specified asset. @@ -1311,7 +1408,7 @@ Your version is already up to date! - Вашу версію вже оновлено! + У вас актуальна версія! Update Available @@ -1386,23 +1483,74 @@ GameListUtils B - B + Б KB - KB + КБ MB - MB + GB - GB + ГБ TB - TB + ТБ - \ No newline at end of file + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Отримання даних про сумісність. Будь ласка, зачекайте + + + Cancel + Відмінити + + + Loading... + Завантаження... + + + Error + Помилка + + + Unable to update compatibility data! Try again later. + Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. + + + Unable to open compatibility.json for writing. + Не вдалося відкрити файл compatibility.json для запису. + + + Unknown + Невідомо + + + Nothing + Не працює + + + Boots + Запускається + + + Menus + У меню + + + Ingame + У грі + + + Playable + Іграбельно + + + From f5d64239cbc5afa89addc0caa281a50558661865 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 5 Feb 2025 16:26:14 +0100 Subject: [PATCH 228/455] Add outer deadzone config (#2348) * Add outer deadzone * Documentation * Add max outer deadzone to the controller remapping GUI * Fix init values * fix GUI saving syntax --- src/common/config.cpp | 4 +- src/input/input_handler.cpp | 73 ++++++++++++++++++++++----------- src/qt_gui/control_settings.cpp | 4 +- src/qt_gui/kbm_help_dialog.h | 7 ++-- 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index d9dfb861f..86e28285d 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -1008,8 +1008,8 @@ axis_right_x = axis_right_x axis_right_y = axis_right_y # Range of deadzones: 1 (almost none) to 127 (max) -analog_deadzone = leftjoystick, 2 -analog_deadzone = rightjoystick, 2 +analog_deadzone = leftjoystick, 2, 127 +analog_deadzone = rightjoystick, 2, 127 )"; } std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id) { diff --git a/src/input/input_handler.cpp b/src/input/input_handler.cpp index 5394e4818..9c51ec8be 100644 --- a/src/input/input_handler.cpp +++ b/src/input/input_handler.cpp @@ -55,7 +55,8 @@ Don't be an idiot and test only the changed part expecting everything else to no */ bool leftjoystick_halfmode = false, rightjoystick_halfmode = false; -int leftjoystick_deadzone, rightjoystick_deadzone, lefttrigger_deadzone, righttrigger_deadzone; +std::pair leftjoystick_deadzone, rightjoystick_deadzone, lefttrigger_deadzone, + righttrigger_deadzone; std::list> pressed_keys; std::list toggled_keys; @@ -208,10 +209,10 @@ void ParseInputConfig(const std::string game_id = "") { float mouse_speed = 1; float mouse_speed_offset = 0.125; - leftjoystick_deadzone = 1; - rightjoystick_deadzone = 1; - lefttrigger_deadzone = 1; - righttrigger_deadzone = 1; + leftjoystick_deadzone = {1, 127}; + rightjoystick_deadzone = {1, 127}; + lefttrigger_deadzone = {1, 127}; + righttrigger_deadzone = {1, 127}; int lineCount = 0; @@ -298,26 +299,45 @@ void ParseInputConfig(const std::string game_id = "") { continue; } else if (output_string == "analog_deadzone") { std::stringstream ss(input_string); - std::string device; - int deadzone; - std::getline(ss, device, ','); - ss >> deadzone; - if (ss.fail()) { - LOG_WARNING(Input, "Failed to parse deadzone config from line: {}", line); + std::string device, inner_deadzone_str, outer_deadzone_str; + + if (!std::getline(ss, device, ',') || !std::getline(ss, inner_deadzone_str, ',') || + !std::getline(ss, outer_deadzone_str)) { + LOG_WARNING(Input, "Malformed deadzone config at line {}: \"{}\"", lineCount, line); continue; - } else { - LOG_DEBUG(Input, "Parsed deadzone: {} {}", device, deadzone); } - if (device == "leftjoystick") { - leftjoystick_deadzone = deadzone; - } else if (device == "rightjoystick") { - rightjoystick_deadzone = deadzone; - } else if (device == "l2") { - lefttrigger_deadzone = deadzone; - } else if (device == "r2") { - righttrigger_deadzone = deadzone; + + auto parseInt = [](const std::string& s) -> std::optional { + try { + return std::stoi(s); + } catch (...) { + return std::nullopt; + } + }; + + auto inner_deadzone = parseInt(inner_deadzone_str); + auto outer_deadzone = parseInt(outer_deadzone_str); + + if (!inner_deadzone || !outer_deadzone) { + LOG_WARNING(Input, "Invalid deadzone values at line {}: \"{}\"", lineCount, line); + continue; + } + + std::pair deadzone = {*inner_deadzone, *outer_deadzone}; + + static std::unordered_map&> deadzone_map = { + {"leftjoystick", leftjoystick_deadzone}, + {"rightjoystick", rightjoystick_deadzone}, + {"l2", lefttrigger_deadzone}, + {"r2", righttrigger_deadzone}, + }; + + if (auto it = deadzone_map.find(device); it != deadzone_map.end()) { + it->second = deadzone; + LOG_DEBUG(Input, "Parsed deadzone: {} {} {}", device, inner_deadzone_str, + outer_deadzone_str); } else { - LOG_WARNING(Input, "Invalid axis name at line: {}, data: \"{}\", skipping line.", + LOG_WARNING(Input, "Invalid axis name at line {}: \"{}\", skipping line.", lineCount, line); } continue; @@ -493,9 +513,14 @@ void ControllerOutput::FinalizeUpdate() { // avoid double-updating axes, but don't skip directional button bindings float multiplier = 1.0; int deadzone = 0; - auto ApplyDeadzone = [](s16* value, int deadzone) { - if (std::abs(*value) <= deadzone) { + auto ApplyDeadzone = [](s16* value, std::pair deadzone) { + if (std::abs(*value) <= deadzone.first || deadzone.first == deadzone.second) { *value = 0; + } else { + *value = (*value >= 0 ? 1 : -1) * + std::clamp((int)((128.0 * (std::abs(*value) - deadzone.first)) / + (float)(deadzone.second - deadzone.first)), + 0, 128); } }; Axis c_axis = GetAxisFromSDLAxis(axis); diff --git a/src/qt_gui/control_settings.cpp b/src/qt_gui/control_settings.cpp index 0374d2049..a07d36292 100644 --- a/src/qt_gui/control_settings.cpp +++ b/src/qt_gui/control_settings.cpp @@ -220,10 +220,10 @@ void ControlSettings::SaveControllerConfig(bool CloseOnSave) { lines.push_back("# Range of deadzones: 1 (almost none) to 127 (max)"); std::string deadzonevalue = std::to_string(ui->LeftDeadzoneSlider->value()); - lines.push_back("analog_deadzone = leftjoystick, " + deadzonevalue); + lines.push_back("analog_deadzone = leftjoystick, " + deadzonevalue + ", 127"); deadzonevalue = std::to_string(ui->RightDeadzoneSlider->value()); - lines.push_back("analog_deadzone = rightjoystick, " + deadzonevalue); + lines.push_back("analog_deadzone = rightjoystick, " + deadzonevalue + ", 127"); std::vector save; bool CurrentLineEmpty = false, LastLineEmpty = false; diff --git a/src/qt_gui/kbm_help_dialog.h b/src/qt_gui/kbm_help_dialog.h index c482d2b5c..3e39d4397 100644 --- a/src/qt_gui/kbm_help_dialog.h +++ b/src/qt_gui/kbm_help_dialog.h @@ -167,9 +167,10 @@ You can find these here, with detailed comments, examples and suggestions for mo You can make an input toggleable with this, for example: Let's say we want to be able to toggle l1 with t. You can then bind l1 to a key you won't use, like kpenter, then bind t to toggle that, so you will end up with this: l1 = kpenter; key_toggle = t, kpenter; -'analog_deadzone' = , ; - value goes from 1 to 127 (no deadzone to max deadzone) - devices: leftjoystick, rightjoystick, l2, r2 +'analog_deadzone' = , , ; + Values go from 1 to 127 (no deadzone to max deadzone), first is the inner, second is the outer deadzone + If you only want inner or outer deadzone, set the other to 1 or 127, respectively + Devices: leftjoystick, rightjoystick, l2, r2 )"; } }; \ No newline at end of file From e972a8805d97820fccddd840e47ae360d852a09c Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:54:13 -0600 Subject: [PATCH 229/455] Bump size of buffer_views (#2357) Uncharted 4 (and perhaps some other games) fill this up, causing a `Unhandled exception: boost::container::bad_alloc thrown` exception --- src/video_core/renderer_vulkan/vk_rasterizer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index ed6cc7e71..6e1a1d82e 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -111,7 +111,7 @@ private: cb_descs; std::optional> db_desc; boost::container::static_vector image_infos; - boost::container::static_vector buffer_views; + boost::container::static_vector buffer_views; boost::container::static_vector buffer_infos; boost::container::static_vector bound_images; From e1f0cd65af065583fab113acfd824a642eed91a3 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Thu, 6 Feb 2025 01:54:27 +0800 Subject: [PATCH 230/455] Set focus, refresh GUI after closing text editor, prevent no comma crash (#2354) Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/qt_gui/control_settings.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/qt_gui/control_settings.cpp b/src/qt_gui/control_settings.cpp index a07d36292..644576feb 100644 --- a/src/qt_gui/control_settings.cpp +++ b/src/qt_gui/control_settings.cpp @@ -16,6 +16,7 @@ ControlSettings::ControlSettings(std::shared_ptr game_info_get, Q AddBoxItems(); SetUIValuestoMappings(); + ui->KBMButton->setFocus(); connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton* button) { if (button == ui->buttonBox->button(QDialogButtonBox::Save)) { @@ -31,6 +32,7 @@ ControlSettings::ControlSettings(std::shared_ptr game_info_get, Q connect(ui->KBMButton, &QPushButton::clicked, this, [this] { auto KBMWindow = new EditorDialog(this); KBMWindow->exec(); + SetUIValuestoMappings(); }); connect(ui->ProfileComboBox, &QComboBox::currentTextChanged, this, [this] { GetGameTitle(); @@ -416,14 +418,24 @@ void ControlSettings::SetUIValuestoMappings() { RStickYExists = true; } else if (input_string.contains("leftjoystick")) { std::size_t comma_pos = line.find(','); - int deadzonevalue = std::stoi(line.substr(comma_pos + 1)); - ui->LeftDeadzoneSlider->setValue(deadzonevalue); - ui->LeftDeadzoneValue->setText(QString::number(deadzonevalue)); + if (comma_pos != std::string::npos) { + int deadzonevalue = std::stoi(line.substr(comma_pos + 1)); + ui->LeftDeadzoneSlider->setValue(deadzonevalue); + ui->LeftDeadzoneValue->setText(QString::number(deadzonevalue)); + } else { + ui->LeftDeadzoneSlider->setValue(2); + ui->LeftDeadzoneValue->setText("2"); + } } else if (input_string.contains("rightjoystick")) { std::size_t comma_pos = line.find(','); - int deadzonevalue = std::stoi(line.substr(comma_pos + 1)); - ui->RightDeadzoneSlider->setValue(deadzonevalue); - ui->RightDeadzoneValue->setText(QString::number(deadzonevalue)); + if (comma_pos != std::string::npos) { + int deadzonevalue = std::stoi(line.substr(comma_pos + 1)); + ui->RightDeadzoneSlider->setValue(deadzonevalue); + ui->RightDeadzoneValue->setText(QString::number(deadzonevalue)); + } else { + ui->RightDeadzoneSlider->setValue(2); + ui->RightDeadzoneValue->setText("2"); + } } } } From 0c3260b1b4b7f6069e7ca6d884712cbd5d1f35d8 Mon Sep 17 00:00:00 2001 From: Martin <67326368+Martini-141@users.noreply.github.com> Date: Wed, 5 Feb 2025 18:54:39 +0100 Subject: [PATCH 231/455] Update nb.ts (#2353) * add copyinfo and backgroundimage nb tr * better wording and fix spelling mistakes --- src/qt_gui/translations/nb.ts | 54 +++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index b2a355c95..de6341a48 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -15,7 +15,7 @@ shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 er en eksperimentell åpen kildekode-etterligner for PlayStation 4. + shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. This software should not be used to play games you have not legally obtained. @@ -124,6 +124,14 @@ Copy Serial Kopier serienummer + + Copy Version + Kopier versjon + + + Copy Size + Kopier størrelse + Copy All Kopier alt @@ -530,11 +538,11 @@ Emulator Language - Etterlignerspråk + Emulatorspråk Emulator - Etterligner + Emulator Enable Fullscreen @@ -764,6 +772,18 @@ Disable Trophy Pop-ups Deaktiver trofé hurtigmeny + + Background Image + Bakgrunnsbilde + + + Show Background Image + Vis bakgrunnsbilde + + + Opacity + Synlighet + Play title music Spill tittelmusikk @@ -818,7 +838,7 @@ emulatorLanguageGroupBox - Etterlignerspråket:\nAngir språket for etterlignerens brukergrensesnitt. + Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. fullscreenCheckBox @@ -834,11 +854,11 @@ ps4proCheckBox - Er PS4 Pro:\nFår etterligneren til å fungere som en PS4 PRO, noe som kan aktivere spesielle funksjoner i spill som støtter dette. + Er PS4 Pro:\nFår emulatoren til å fungere som en PS4 PRO, noe som kan aktivere spesielle funksjoner i spill som støtter dette. discordRPCCheckbox - Aktiver Discord Rich Presence:\nViser etterlignerikonet og relevant informasjon på Discord-profilen din. + Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. userName @@ -850,7 +870,7 @@ logTypeGroupBox - Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for etterligneren. + Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. logFilter @@ -860,6 +880,10 @@ updaterGroupBox Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. + + GUIBackgroundImageGroupBox + Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. + GUIMusicGroupBox Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. @@ -922,15 +946,15 @@ graphicsAdapterGroupBox - Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en etterligneren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. + Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. resolutionLayout - Bredde/Høyde:\nAngir størrelsen på etterlignerkvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. + Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. heightDivider - Vblank skillelinje:\nBildehastigheten som etterligneren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! + Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! dumpShadersCheckBox @@ -958,15 +982,15 @@ vkValidationCheckBox - Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre etterlignerens atferd. + Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. vkSyncValidationCheckBox - Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre etterlignerens atferd. + Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. rdocCheckBox - Aktiver RenderDoc feilsøking:\nHvis aktivert, vil etterligneren gi kompatibilitet med Renderdoc for å tillate opptak og analyse av det nåværende gjengitte bildet. + Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. collectShaderCheckBox @@ -982,7 +1006,7 @@ hostMarkersCheckBox - Vertsfeilsøkingsmarkører:\nSetter inn etterligner-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. guestMarkersCheckBox @@ -1280,7 +1304,7 @@ Game does not initialize properly / crashes the emulator - Spillet initialiseres ikke riktig / krasjer etterligneren + Spillet initialiseres ikke riktig / krasjer emulatoren Game boots, but only displays a blank screen From f1113950441f88b19d5a6468f1aedb76657a60e4 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:36:16 +0100 Subject: [PATCH 232/455] Fix issues with input detection due to overloaded ring buffer and fix buffer size being incorrect (#2346) * Add axis noise filter + only update outputs if a change happened * Change the ring buffer size to 32 as seen in Ghidra * Fix merge --- src/input/controller.h | 2 +- src/input/input_handler.cpp | 51 +++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/input/controller.h b/src/input/controller.h index a45e71d77..bbaed75ea 100644 --- a/src/input/controller.h +++ b/src/input/controller.h @@ -60,7 +60,7 @@ inline int GetAxis(int min, int max, int value) { return std::clamp((255 * (value - min)) / (max - min), 0, 255); } -constexpr u32 MAX_STATES = 64; +constexpr u32 MAX_STATES = 32; class GameController { public: diff --git a/src/input/input_handler.cpp b/src/input/input_handler.cpp index 9c51ec8be..e2e2e67ab 100644 --- a/src/input/input_handler.cpp +++ b/src/input/input_handler.cpp @@ -448,7 +448,6 @@ void ControllerOutput::ResetUpdate() { *new_param = 0; // bruh } void ControllerOutput::AddUpdate(InputEvent event) { - state_changed = true; if (button == KEY_TOGGLE) { if (event.active) { ToggleKeyInList(event.input); @@ -465,24 +464,43 @@ void ControllerOutput::AddUpdate(InputEvent event) { } } else if (axis != SDL_GAMEPAD_AXIS_INVALID) { + auto ApplyDeadzone = [](s8* value, std::pair deadzone) { + if (std::abs(*value) <= deadzone.first || deadzone.first == deadzone.second) { + *value = 0; + } else { + *value = (*value >= 0 ? 1 : -1) * + std::clamp((int)((128.0 * (std::abs(*value) - deadzone.first)) / + (float)(deadzone.second - deadzone.first)), + 0, 128); + } + }; switch (axis) { + case SDL_GAMEPAD_AXIS_LEFTX: + case SDL_GAMEPAD_AXIS_LEFTY: + ApplyDeadzone(&event.axis_value, leftjoystick_deadzone); + break; + case SDL_GAMEPAD_AXIS_RIGHTX: + case SDL_GAMEPAD_AXIS_RIGHTY: + ApplyDeadzone(&event.axis_value, rightjoystick_deadzone); + break; case SDL_GAMEPAD_AXIS_LEFT_TRIGGER: + ApplyDeadzone(&event.axis_value, lefttrigger_deadzone); + break; case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: - // if it's a button input, then we know the value to set, so the param is 0. - // if it's an analog input, then the param isn't 0 - *new_param = (event.active ? event.axis_value : 0) + *new_param; + ApplyDeadzone(&event.axis_value, righttrigger_deadzone); break; default: - *new_param = (event.active ? event.axis_value : 0) + *new_param; + UNREACHABLE(); break; } + *new_param = (event.active ? event.axis_value : 0) + *new_param; } } void ControllerOutput::FinalizeUpdate() { + state_changed = old_button_state != new_button_state || old_param != *new_param; if (!state_changed) { - // return; + return; } - old_button_state = new_button_state; old_param = *new_param; float touchpad_x = 0; @@ -512,36 +530,21 @@ void ControllerOutput::FinalizeUpdate() { } else if (axis != SDL_GAMEPAD_AXIS_INVALID && positive_axis) { // avoid double-updating axes, but don't skip directional button bindings float multiplier = 1.0; - int deadzone = 0; - auto ApplyDeadzone = [](s16* value, std::pair deadzone) { - if (std::abs(*value) <= deadzone.first || deadzone.first == deadzone.second) { - *value = 0; - } else { - *value = (*value >= 0 ? 1 : -1) * - std::clamp((int)((128.0 * (std::abs(*value) - deadzone.first)) / - (float)(deadzone.second - deadzone.first)), - 0, 128); - } - }; Axis c_axis = GetAxisFromSDLAxis(axis); switch (c_axis) { case Axis::LeftX: case Axis::LeftY: - ApplyDeadzone(new_param, leftjoystick_deadzone); multiplier = leftjoystick_halfmode ? 0.5 : 1.0; break; case Axis::RightX: case Axis::RightY: - ApplyDeadzone(new_param, rightjoystick_deadzone); multiplier = rightjoystick_halfmode ? 0.5 : 1.0; break; case Axis::TriggerLeft: - ApplyDeadzone(new_param, lefttrigger_deadzone); controller->Axis(0, c_axis, GetAxis(0x0, 0x80, *new_param)); controller->CheckButton(0, OrbisPadButtonDataOffset::L2, *new_param > 0x20); return; case Axis::TriggerRight: - ApplyDeadzone(new_param, righttrigger_deadzone); controller->Axis(0, c_axis, GetAxis(0x0, 0x80, *new_param)); controller->CheckButton(0, OrbisPadButtonDataOffset::R2, *new_param > 0x20); return; @@ -572,6 +575,10 @@ bool UpdatePressedKeys(InputEvent event) { pressed_keys.insert(it, {event, false}); LOG_DEBUG(Input, "Added axis {} to the input list", event.input.sdl_id); } else { + // noise filter + if (std::abs(it->first.axis_value - event.axis_value) <= 1) { + return false; + } it->first.axis_value = event.axis_value; } return true; From 0d498f12b9b97a39c59e9f4bd58feba3145f6bfc Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 5 Feb 2025 21:11:07 +0100 Subject: [PATCH 233/455] Fix merge, but for real this time (#2359) --- src/input/input_handler.cpp | 43 ++++++++++++------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/src/input/input_handler.cpp b/src/input/input_handler.cpp index e2e2e67ab..38a310324 100644 --- a/src/input/input_handler.cpp +++ b/src/input/input_handler.cpp @@ -464,35 +464,6 @@ void ControllerOutput::AddUpdate(InputEvent event) { } } else if (axis != SDL_GAMEPAD_AXIS_INVALID) { - auto ApplyDeadzone = [](s8* value, std::pair deadzone) { - if (std::abs(*value) <= deadzone.first || deadzone.first == deadzone.second) { - *value = 0; - } else { - *value = (*value >= 0 ? 1 : -1) * - std::clamp((int)((128.0 * (std::abs(*value) - deadzone.first)) / - (float)(deadzone.second - deadzone.first)), - 0, 128); - } - }; - switch (axis) { - case SDL_GAMEPAD_AXIS_LEFTX: - case SDL_GAMEPAD_AXIS_LEFTY: - ApplyDeadzone(&event.axis_value, leftjoystick_deadzone); - break; - case SDL_GAMEPAD_AXIS_RIGHTX: - case SDL_GAMEPAD_AXIS_RIGHTY: - ApplyDeadzone(&event.axis_value, rightjoystick_deadzone); - break; - case SDL_GAMEPAD_AXIS_LEFT_TRIGGER: - ApplyDeadzone(&event.axis_value, lefttrigger_deadzone); - break; - case SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: - ApplyDeadzone(&event.axis_value, righttrigger_deadzone); - break; - default: - UNREACHABLE(); - break; - } *new_param = (event.active ? event.axis_value : 0) + *new_param; } } @@ -529,22 +500,36 @@ void ControllerOutput::FinalizeUpdate() { } } else if (axis != SDL_GAMEPAD_AXIS_INVALID && positive_axis) { // avoid double-updating axes, but don't skip directional button bindings + auto ApplyDeadzone = [](s16* value, std::pair deadzone) { + if (std::abs(*value) <= deadzone.first || deadzone.first == deadzone.second) { + *value = 0; + } else { + *value = (*value >= 0 ? 1 : -1) * + std::clamp((int)((128.0 * (std::abs(*value) - deadzone.first)) / + (float)(deadzone.second - deadzone.first)), + 0, 128); + } + }; float multiplier = 1.0; Axis c_axis = GetAxisFromSDLAxis(axis); switch (c_axis) { case Axis::LeftX: case Axis::LeftY: + ApplyDeadzone(new_param, leftjoystick_deadzone); multiplier = leftjoystick_halfmode ? 0.5 : 1.0; break; case Axis::RightX: case Axis::RightY: + ApplyDeadzone(new_param, rightjoystick_deadzone); multiplier = rightjoystick_halfmode ? 0.5 : 1.0; break; case Axis::TriggerLeft: + ApplyDeadzone(new_param, lefttrigger_deadzone); controller->Axis(0, c_axis, GetAxis(0x0, 0x80, *new_param)); controller->CheckButton(0, OrbisPadButtonDataOffset::L2, *new_param > 0x20); return; case Axis::TriggerRight: + ApplyDeadzone(new_param, righttrigger_deadzone); controller->Axis(0, c_axis, GetAxis(0x0, 0x80, *new_param)); controller->CheckButton(0, OrbisPadButtonDataOffset::R2, *new_param > 0x20); return; From 1eb0affdea69e9ef10aa84b709afd447642940b2 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 6 Feb 2025 16:38:02 -0800 Subject: [PATCH 234/455] vk_instance: Clean up extension management. (#2342) --- .../renderer_vulkan/vk_graphics_pipeline.cpp | 5 +- .../renderer_vulkan/vk_instance.cpp | 155 ++++++++---------- src/video_core/renderer_vulkan/vk_instance.h | 43 +---- .../renderer_vulkan/vk_rasterizer.cpp | 10 +- 4 files changed, 80 insertions(+), 133 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 4ca3a7f27..330a8ab7f 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -131,8 +131,7 @@ GraphicsPipeline::GraphicsPipeline( vk::DynamicState::eStencilOpEXT, }; - if (instance.IsColorWriteEnableSupported()) { - dynamic_states.push_back(vk::DynamicState::eColorWriteEnableEXT); + if (instance.IsDynamicColorWriteMaskSupported()) { dynamic_states.push_back(vk::DynamicState::eColorWriteMaskEXT); } if (instance.IsVertexInputDynamicState()) { @@ -241,7 +240,7 @@ GraphicsPipeline::GraphicsPipeline( ? LiverpoolToVK::BlendOp(control.alpha_func) : color_blend, .colorWriteMask = - instance.IsColorWriteEnableSupported() + instance.IsDynamicColorWriteMaskSupported() ? vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA : key.write_masks[i], diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index a722b5322..52c67d002 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -206,27 +206,23 @@ std::string Instance::GetDriverVersionName() { } bool Instance::CreateDevice() { - const vk::StructureChain feature_chain = physical_device.getFeatures2< - vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT, - vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, - vk::PhysicalDeviceExtendedDynamicState2FeaturesEXT, - vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT, - vk::PhysicalDeviceCustomBorderColorFeaturesEXT, - vk::PhysicalDeviceColorWriteEnableFeaturesEXT, vk::PhysicalDeviceVulkan12Features, - vk::PhysicalDeviceVulkan13Features, - vk::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR, - vk::PhysicalDeviceDepthClipControlFeaturesEXT, vk::PhysicalDeviceRobustness2FeaturesEXT, - vk::PhysicalDevicePortabilitySubsetFeaturesKHR>(); - const vk::StructureChain properties_chain = physical_device.getProperties2< - vk::PhysicalDeviceProperties2, vk::PhysicalDevicePortabilitySubsetPropertiesKHR, - vk::PhysicalDeviceExternalMemoryHostPropertiesEXT, vk::PhysicalDeviceVulkan11Properties, - vk::PhysicalDevicePushDescriptorPropertiesKHR, vk::PhysicalDeviceVulkan12Properties>(); - subgroup_size = properties_chain.get().subgroupSize; - push_descriptor_props = properties_chain.get(); - vk12_props = properties_chain.get(); - LOG_INFO(Render_Vulkan, "Physical device subgroup size {}", subgroup_size); - + const vk::StructureChain feature_chain = + physical_device + .getFeatures2(); features = feature_chain.get().features; + + const vk::StructureChain properties_chain = physical_device.getProperties2< + vk::PhysicalDeviceProperties2, vk::PhysicalDeviceVulkan11Properties, + vk::PhysicalDeviceVulkan12Properties, vk::PhysicalDevicePushDescriptorPropertiesKHR>(); + vk11_props = properties_chain.get(); + vk12_props = properties_chain.get(); + push_descriptor_props = properties_chain.get(); + LOG_INFO(Render_Vulkan, "Physical device subgroup size {}", vk11_props.subgroupSize); + if (available_extensions.empty()) { LOG_CRITICAL(Render_Vulkan, "No extensions supported by device."); return false; @@ -248,42 +244,43 @@ bool Instance::CreateDevice() { return false; }; - add_extension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); - shader_stencil_export = add_extension(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME); - external_memory_host = add_extension(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME); - custom_border_color = add_extension(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); - add_extension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); - depth_clip_control = add_extension(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); - add_extension(VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME); - workgroup_memory_explicit_layout = - add_extension(VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME); - vertex_input_dynamic_state = add_extension(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); - fragment_shader_barycentric = add_extension(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME); - - // The next two extensions are required to be available together in order to support write masks - color_write_en = add_extension(VK_EXT_COLOR_WRITE_ENABLE_EXTENSION_NAME); - color_write_en &= add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); - const bool calibrated_timestamps = - TRACY_GPU_ENABLED ? add_extension(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME) : false; - const bool robustness = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); - list_restart = add_extension(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME); - maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME); - legacy_vertex_attributes = add_extension(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME); - image_load_store_lod = add_extension(VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME); - amd_gcn_shader = add_extension(VK_AMD_GCN_SHADER_EXTENSION_NAME); - // These extensions are promoted by Vulkan 1.3, but for greater compatibility we use Vulkan 1.2 // with extensions. - if (Config::vkValidationEnabled() || Config::isRdocEnabled()) { - tooling_info = add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME); - } - const bool maintenance4 = add_extension(VK_KHR_MAINTENANCE_4_EXTENSION_NAME); add_extension(VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME); add_extension(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME); add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME); add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); add_extension(VK_EXT_4444_FORMATS_EXTENSION_NAME); + tooling_info = add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME); + const bool maintenance4 = add_extension(VK_KHR_MAINTENANCE_4_EXTENSION_NAME); + + add_extension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + add_extension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); + add_extension(VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME); + dynamic_color_write_mask = add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); + if (dynamic_color_write_mask) { + dynamic_color_write_mask = + feature_chain.get() + .extendedDynamicState3ColorWriteMask; + } + null_descriptor = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); + if (null_descriptor) { + null_descriptor = + feature_chain.get().nullDescriptor; + } + maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME); + custom_border_color = add_extension(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); + depth_clip_control = add_extension(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); + vertex_input_dynamic_state = add_extension(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); + list_restart = add_extension(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME); + fragment_shader_barycentric = add_extension(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME); + legacy_vertex_attributes = add_extension(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME); + shader_stencil_export = add_extension(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME); + image_load_store_lod = add_extension(VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME); + amd_gcn_shader = add_extension(VK_AMD_GCN_SHADER_EXTENSION_NAME); + const bool calibrated_timestamps = + TRACY_GPU_ENABLED ? add_extension(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME) : false; #ifdef __APPLE__ // Required by Vulkan spec if supported. @@ -310,8 +307,7 @@ bool Instance::CreateDevice() { return false; } - static constexpr std::array queue_priorities = {1.0f}; - + static constexpr std::array queue_priorities = {1.0f}; const vk::DeviceQueueCreateInfo queue_info = { .queueFamilyIndex = queue_family_index, .queueCount = static_cast(queue_priorities.size()), @@ -320,7 +316,6 @@ bool Instance::CreateDevice() { const auto topology_list_restart_features = feature_chain.get(); - const auto vk12_features = feature_chain.get(); vk::StructureChain device_chain = { vk::DeviceCreateInfo{ @@ -365,46 +360,42 @@ bool Instance::CreateDevice() { .hostQueryReset = vk12_features.hostQueryReset, .timelineSemaphore = vk12_features.timelineSemaphore, }, - vk::PhysicalDeviceMaintenance4FeaturesKHR{ - .maintenance4 = true, - }, - vk::PhysicalDeviceMaintenance5FeaturesKHR{ - .maintenance5 = true, - }, + // Vulkan 1.3 promoted extensions vk::PhysicalDeviceDynamicRenderingFeaturesKHR{ .dynamicRendering = true, }, vk::PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT{ .shaderDemoteToHelperInvocation = true, }, - vk::PhysicalDeviceCustomBorderColorFeaturesEXT{ - .customBorderColors = true, - .customBorderColorWithoutFormat = true, - }, - vk::PhysicalDeviceColorWriteEnableFeaturesEXT{ - .colorWriteEnable = true, + vk::PhysicalDeviceSynchronization2Features{ + .synchronization2 = true, }, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT{ .extendedDynamicState = true, }, + vk::PhysicalDevice4444FormatsFeaturesEXT{ + .formatA4B4G4R4 = true, + }, + vk::PhysicalDeviceMaintenance4FeaturesKHR{ + .maintenance4 = true, + }, + // Other extensions + vk::PhysicalDeviceMaintenance5FeaturesKHR{ + .maintenance5 = true, + }, + vk::PhysicalDeviceCustomBorderColorFeaturesEXT{ + .customBorderColors = true, + .customBorderColorWithoutFormat = true, + }, vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT{ .extendedDynamicState3ColorWriteMask = true, }, vk::PhysicalDeviceDepthClipControlFeaturesEXT{ .depthClipControl = true, }, - vk::PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR{ - .workgroupMemoryExplicitLayout = true, - .workgroupMemoryExplicitLayoutScalarBlockLayout = true, - .workgroupMemoryExplicitLayout8BitAccess = true, - .workgroupMemoryExplicitLayout16BitAccess = true, - }, vk::PhysicalDeviceRobustness2FeaturesEXT{ .nullDescriptor = true, }, - vk::PhysicalDeviceSynchronization2Features{ - .synchronization2 = true, - }, vk::PhysicalDeviceVertexInputDynamicStateFeaturesEXT{ .vertexInputDynamicState = true, }, @@ -433,31 +424,21 @@ bool Instance::CreateDevice() { if (!custom_border_color) { device_chain.unlink(); } - if (!color_write_en) { - device_chain.unlink(); + if (!dynamic_color_write_mask) { device_chain.unlink(); } if (!depth_clip_control) { device_chain.unlink(); } - if (!workgroup_memory_explicit_layout) { - device_chain.unlink(); - } - if (!list_restart) { - device_chain.unlink(); - } - if (robustness) { - null_descriptor = - feature_chain.get().nullDescriptor; - device_chain.get().nullDescriptor = - null_descriptor; - } else { - null_descriptor = false; + if (!null_descriptor) { device_chain.unlink(); } if (!vertex_input_dynamic_state) { device_chain.unlink(); } + if (!list_restart) { + device_chain.unlink(); + } if (!fragment_shader_barycentric) { device_chain.unlink(); } diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 8c4752c3f..532696f0f 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -89,34 +89,19 @@ public: return custom_border_color; } - /// Returns true when VK_EXT_fragment_shader_interlock is supported - bool IsFragmentShaderInterlockSupported() const { - return fragment_shader_interlock; - } - - /// Returns true when VK_EXT_pipeline_creation_cache_control is supported - bool IsPipelineCreationCacheControlSupported() const { - return pipeline_creation_cache_control; - } - /// Returns true when VK_EXT_shader_stencil_export is supported bool IsShaderStencilExportSupported() const { return shader_stencil_export; } - /// Returns true when VK_EXT_external_memory_host is supported - bool IsExternalMemoryHostSupported() const { - return external_memory_host; - } - /// Returns true when VK_EXT_depth_clip_control is supported bool IsDepthClipControlSupported() const { return depth_clip_control; } - /// Returns true when VK_EXT_color_write_enable is supported - bool IsColorWriteEnableSupported() const { - return color_write_en; + /// Returns true when dynamic color write mask state is supported + bool IsDynamicColorWriteMaskSupported() const { + return dynamic_color_write_mask; } /// Returns true when VK_EXT_vertex_input_dynamic_state is supported. @@ -236,7 +221,7 @@ public: /// Returns the subgroup size of the selected physical device. u32 SubgroupSize() const { - return subgroup_size; + return vk11_props.subgroupSize; } /// Returns the maximum size of compute shared memory. @@ -274,11 +259,6 @@ public: return features.shaderClipDistance; } - /// Returns the minimum imported host pointer alignment - u64 GetMinImportedHostPointerAlignment() const { - return min_imported_host_pointer_alignment; - } - u32 GetMaxViewportWidth() const { return properties.limits.maxViewportDimensions[0]; } @@ -316,8 +296,9 @@ private: vk::PhysicalDevice physical_device; vk::UniqueDevice device; vk::PhysicalDeviceProperties properties; - vk::PhysicalDevicePushDescriptorPropertiesKHR push_descriptor_props; + vk::PhysicalDeviceVulkan11Properties vk11_props; vk::PhysicalDeviceVulkan12Properties vk12_props; + vk::PhysicalDevicePushDescriptorPropertiesKHR push_descriptor_props; vk::PhysicalDeviceFeatures features; vk::DriverIdKHR driver_id; vk::UniqueDebugUtilsMessengerEXT debug_callback{}; @@ -330,27 +311,19 @@ private: std::unordered_map format_properties; TracyVkCtx profiler_context{}; u32 queue_family_index{0}; - bool image_view_reinterpretation{true}; - bool timeline_semaphores{}; bool custom_border_color{}; - bool fragment_shader_interlock{}; - bool pipeline_creation_cache_control{}; bool fragment_shader_barycentric{}; - bool shader_stencil_export{}; - bool external_memory_host{}; bool depth_clip_control{}; - bool workgroup_memory_explicit_layout{}; - bool color_write_en{}; + bool dynamic_color_write_mask{}; bool vertex_input_dynamic_state{}; bool null_descriptor{}; bool maintenance5{}; bool list_restart{}; bool legacy_vertex_attributes{}; + bool shader_stencil_export{}; bool image_load_store_lod{}; bool amd_gcn_shader{}; bool tooling_info{}; - u64 min_imported_host_pointer_alignment{}; - u32 subgroup_size{}; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 7f2db3f8d..8da27de00 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1062,14 +1062,8 @@ void Rasterizer::UpdateDynamicState(const GraphicsPipeline& pipeline) { const auto cmdbuf = scheduler.CommandBuffer(); cmdbuf.setBlendConstants(®s.blend_constants.red); - if (instance.IsColorWriteEnableSupported()) { - const auto& write_masks = pipeline.GetWriteMasks(); - std::array write_ens{}; - std::transform(write_masks.cbegin(), write_masks.cend(), write_ens.begin(), - [](auto in) { return in ? vk::True : vk::False; }); - - cmdbuf.setColorWriteEnableEXT(write_ens); - cmdbuf.setColorWriteMaskEXT(0, write_masks); + if (instance.IsDynamicColorWriteMaskSupported()) { + cmdbuf.setColorWriteMaskEXT(0, pipeline.GetWriteMasks()); } if (regs.depth_control.depth_bounds_enable) { cmdbuf.setDepthBounds(regs.depth_bounds_min, regs.depth_bounds_max); From 1a00b1af24357e3504e1c16370a9851c93d5e687 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:45:47 -0800 Subject: [PATCH 235/455] vulkan: Use more supported 4444 format. (#2366) --- src/video_core/amdgpu/types.h | 9 +++++++++ src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 2 +- src/video_core/renderer_vulkan/vk_instance.cpp | 4 ---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index b442b2f1e..93fcd1823 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -322,6 +322,15 @@ inline CompMapping RemapSwizzle(const DataFormat format, const CompMapping swizz result.a = swizzle.a; return result; } + case DataFormat::Format4_4_4_4: { + // Remap to a more supported component order. + CompMapping result; + result.r = swizzle.a; + result.g = swizzle.r; + result.b = swizzle.g; + result.a = swizzle.b; + return result; + } default: return swizzle; } diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index f2fbc6530..59a0802bb 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -618,7 +618,7 @@ std::span SurfaceFormats() { vk::Format::eR5G5B5A1UnormPack16), // 4_4_4_4 CreateSurfaceFormatInfo(AmdGpu::DataFormat::Format4_4_4_4, AmdGpu::NumberFormat::Unorm, - vk::Format::eA4B4G4R4UnormPack16), + vk::Format::eB4G4R4A4UnormPack16), // 8_24 // 24_8 // X24_8_32 diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 52c67d002..319f10278 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -251,7 +251,6 @@ bool Instance::CreateDevice() { add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME); add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); - add_extension(VK_EXT_4444_FORMATS_EXTENSION_NAME); tooling_info = add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME); const bool maintenance4 = add_extension(VK_KHR_MAINTENANCE_4_EXTENSION_NAME); @@ -373,9 +372,6 @@ bool Instance::CreateDevice() { vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT{ .extendedDynamicState = true, }, - vk::PhysicalDevice4444FormatsFeaturesEXT{ - .formatA4B4G4R4 = true, - }, vk::PhysicalDeviceMaintenance4FeaturesKHR{ .maintenance4 = true, }, From 78ea536c95b6c47a7dbb80e4dde5d99b86d74c64 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:55:46 -0800 Subject: [PATCH 236/455] hotfix: 4444 swizzle order --- src/video_core/amdgpu/types.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index 93fcd1823..cd642508c 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -325,10 +325,10 @@ inline CompMapping RemapSwizzle(const DataFormat format, const CompMapping swizz case DataFormat::Format4_4_4_4: { // Remap to a more supported component order. CompMapping result; - result.r = swizzle.a; - result.g = swizzle.r; - result.b = swizzle.g; - result.a = swizzle.b; + result.r = swizzle.g; + result.g = swizzle.b; + result.b = swizzle.a; + result.a = swizzle.r; return result; } default: From 46cbee158539f6682d9535e889d4ee1e8352b5f6 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Thu, 6 Feb 2025 23:18:02 -0300 Subject: [PATCH 237/455] RemapSwizzle formatting (#2368) This doesn't change anything, it just reduces duplicate information. --- src/video_core/amdgpu/types.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index cd642508c..ee2dda494 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -298,6 +298,7 @@ inline NumberFormat RemapNumberFormat(const NumberFormat format, const DataForma inline CompMapping RemapSwizzle(const DataFormat format, const CompMapping swizzle) { switch (format) { + case DataFormat::Format1_5_5_5: case DataFormat::Format11_11_10: { CompMapping result; result.r = swizzle.b; @@ -314,14 +315,6 @@ inline CompMapping RemapSwizzle(const DataFormat format, const CompMapping swizz result.a = swizzle.r; return result; } - case DataFormat::Format1_5_5_5: { - CompMapping result; - result.r = swizzle.b; - result.g = swizzle.g; - result.b = swizzle.r; - result.a = swizzle.a; - return result; - } case DataFormat::Format4_4_4_4: { // Remap to a more supported component order. CompMapping result; From 78b4f10cc60bf8d8b5da01016707fae4a4c30ccb Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 7 Feb 2025 01:40:13 -0300 Subject: [PATCH 238/455] QT: AutoUpdate - improvement message limit exceeded github (#2365) --- src/qt_gui/check_update.cpp | 16 ++++++++++++++-- src/qt_gui/translations/ar.ts | 4 ++++ src/qt_gui/translations/da_DK.ts | 4 ++++ src/qt_gui/translations/de.ts | 4 ++++ src/qt_gui/translations/el.ts | 4 ++++ src/qt_gui/translations/en.ts | 4 ++++ src/qt_gui/translations/es_ES.ts | 4 ++++ src/qt_gui/translations/fa_IR.ts | 4 ++++ src/qt_gui/translations/fi.ts | 4 ++++ src/qt_gui/translations/fr.ts | 4 ++++ src/qt_gui/translations/hu_HU.ts | 4 ++++ src/qt_gui/translations/id.ts | 4 ++++ src/qt_gui/translations/it.ts | 4 ++++ src/qt_gui/translations/ja_JP.ts | 4 ++++ src/qt_gui/translations/ko_KR.ts | 4 ++++ src/qt_gui/translations/lt_LT.ts | 4 ++++ src/qt_gui/translations/nb.ts | 4 ++++ src/qt_gui/translations/nl.ts | 4 ++++ src/qt_gui/translations/pl_PL.ts | 4 ++++ src/qt_gui/translations/pt_BR.ts | 4 ++++ src/qt_gui/translations/ro_RO.ts | 4 ++++ src/qt_gui/translations/ru_RU.ts | 4 ++++ src/qt_gui/translations/sq.ts | 4 ++++ src/qt_gui/translations/sv.ts | 4 ++++ src/qt_gui/translations/tr_TR.ts | 4 ++++ src/qt_gui/translations/uk_UA.ts | 4 ++++ src/qt_gui/translations/vi_VN.ts | 4 ++++ src/qt_gui/translations/zh_CN.ts | 4 ++++ src/qt_gui/translations/zh_TW.ts | 4 ++++ 29 files changed, 126 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/check_update.cpp b/src/qt_gui/check_update.cpp index 0c1cce5da..37554abfb 100644 --- a/src/qt_gui/check_update.cpp +++ b/src/qt_gui/check_update.cpp @@ -67,8 +67,20 @@ void CheckUpdate::CheckForUpdates(const bool showMessage) { connect(reply, &QNetworkReply::finished, this, [this, reply, showMessage, updateChannel]() { if (reply->error() != QNetworkReply::NoError) { - QMessageBox::warning(this, tr("Error"), - QString(tr("Network error:") + "\n" + reply->errorString())); + if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 403) { + QString response = reply->readAll(); + if (response.startsWith("{\"message\":\"API rate limit exceeded for")) { + QMessageBox::warning(this, tr("Auto Updater"), + tr("Error_Github_limit_MSG").replace("\\n", "\n")); + } else { + QMessageBox::warning( + this, tr("Error"), + QString(tr("Network error:") + "\n" + reply->errorString())); + } + } else { + QMessageBox::warning(this, tr("Error"), + QString(tr("Network error:") + "\n" + reply->errorString())); + } reply->deleteLater(); return; } diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index 617753ab8..209721b7f 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -1293,6 +1293,10 @@ Network error: خطأ في الشبكة: + + Error_Github_limit_MSG + يتيح التحديث التلقائي ما يصل إلى 60 عملية تحقق من التحديث في الساعة.\nلقد وصلت إلى هذا الحد. الرجاء المحاولة مرة أخرى لاحقًا. + Failed to parse update information. فشل في تحليل معلومات التحديث. diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index abde6ff72..3b2bd84fa 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1293,6 +1293,10 @@ Network error: Netsværksfejl: + + Error_Github_limit_MSG + Autoopdateren tillader op til 60 opdateringstjek i timen.\nDu har nået denne grænse. Prøv igen senere. + Failed to parse update information. Kunne ikke analysere opdateringsoplysninger. diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 4985160ff..4dbfecb18 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -1317,6 +1317,10 @@ Network error: Netzwerkfehler: + + Error_Github_limit_MSG + Der Auto-Updater erlaubt bis zu 60 Update-Überprüfungen pro Stunde.\nDu hast dieses Limit erreicht. Bitte versuche es später erneut. + Failed to parse update information. Fehler beim Parsen der Aktualisierungsinformationen. diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 828b99248..dfc13935b 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -1293,6 +1293,10 @@ Network error: Σφάλμα δικτύου: + + Error_Github_limit_MSG + Ο Αυτόματος Ενημερωτής επιτρέπει έως και 60 ελέγχους ενημερώσεων ανά ώρα.\nΈχετε φτάσει αυτό το όριο. Παρακαλώ δοκιμάστε ξανά αργότερα. + Failed to parse update information. Αποτυχία ανάλυσης πληροφοριών ενημέρωσης. diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index d0540d7cd..440059b26 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -1326,6 +1326,10 @@ Network error: Network error: + + Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. + Failed to parse update information. Failed to parse update information. diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 772980994..eb35c523c 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1309,6 +1309,10 @@ Network error: Error de red: + + Error_Github_limit_MSG + El actualizador automático permite hasta 60 comprobaciones de actualización por hora.\nHas alcanzado este límite. Por favor, inténtalo de nuevo más tarde. + Failed to parse update information. Error al analizar la información de actualización. diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 16f6533b6..288b3300e 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1293,6 +1293,10 @@ Network error: خطای شبکه: + + Error_Github_limit_MSG + به‌روزرسانی خودکار حداکثر ۶۰ بررسی به‌روزرسانی در ساعت را مجاز می‌داند.\nشما به این محدودیت رسیده‌اید. لطفاً بعداً دوباره امتحان کنید. + Failed to parse update information. خطا در تجزیه اطلاعات بهروزرسانی. diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 7269b4125..9a5de8016 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -1293,6 +1293,10 @@ Network error: Verkkovirhe: + + Error_Github_limit_MSG + Automaattinen päivitys sallii enintään 60 päivitystarkistusta tunnissa.\nOlet saavuttanut tämän rajan. Yritä myöhemmin uudelleen. + Failed to parse update information. Päivitystietojen jäsentäminen epäonnistui. diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index efaaa9ad1..a8d526353 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -1293,6 +1293,10 @@ Network error: Erreur réseau: + + Error_Github_limit_MSG + Le programme de mise à jour automatique permet jusqu'à 60 vérifications de mise à jour par heure.\nVous avez atteint cette limite. Veuillez réessayer plus tard. + Failed to parse update information. Échec de l'analyse des informations de mise à jour. diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 98491aa87..e7efb77b9 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1293,6 +1293,10 @@ Network error: Hálózati hiba: + + Error_Github_limit_MSG + Az automatikus frissítő óránként legfeljebb 60 frissítésellenőrzést engedélyez.\nElérte ezt a korlátot. Kérjük, próbálja újra később. + Failed to parse update information. A frissítési információk elemzése sikertelen. diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index 931244209..12e80905b 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -1293,6 +1293,10 @@ Network error: Kesalahan jaringan: + + Error_Github_limit_MSG + Pembaruan Otomatis memungkinkan hingga 60 pemeriksaan pembaruan per jam.\nAnda telah mencapai batas ini. Silakan coba lagi nanti. + Failed to parse update information. Gagal memparse informasi pembaruan. diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 106d09de0..0fd06b247 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -1293,6 +1293,10 @@ Network error: Errore di rete: + + Error_Github_limit_MSG + L'Aggiornamento Automatico consente fino a 60 controlli di aggiornamento all'ora.\nHai raggiunto questo limite. Riprova più tardi. + Failed to parse update information. Impossibile analizzare le informazioni di aggiornamento. diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 2aae35987..e063c6ab2 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1293,6 +1293,10 @@ Network error: ネットワークエラー: + + Error_Github_limit_MSG + 自動アップデーターは1時間に最大60回の更新チェックを許可します。\nこの制限に達しました。後でもう一度お試しください。 + Failed to parse update information. アップデート情報の解析に失敗しました。 diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 56e891214..57e0d6c01 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1293,6 +1293,10 @@ Network error: Network error: + + Error_Github_limit_MSG + 자동 업데이트는 시간당 최대 60회의 업데이트 확인을 허용합니다.\n이 제한에 도달했습니다. 나중에 다시 시도해 주세요. + Failed to parse update information. Failed to parse update information. diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index c73a43917..711cb183d 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1293,6 +1293,10 @@ Network error: Tinklo klaida: + + Error_Github_limit_MSG + Automatinis atnaujinimas leidžia iki 60 atnaujinimų patikrinimų per valandą.\nJūs pasiekėte šią ribą. Bandykite dar kartą vėliau. + Failed to parse update information. Nepavyko išanalizuoti atnaujinimo informacijos. diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index de6341a48..7579f7cae 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -1345,6 +1345,10 @@ Network error: Nettverksfeil: + + Error_Github_limit_MSG + Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. + Failed to parse update information. Kunne ikke analysere oppdaterings-informasjonen. diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 95ac19ef3..02596c087 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -1293,6 +1293,10 @@ Network error: Netwerkfout: + + Error_Github_limit_MSG + De automatische updater staat tot 60 updatecontroles per uur toe.\nJe hebt deze limiet bereikt. Probeer het later opnieuw. + Failed to parse update information. Kon update-informatie niet parseren. diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 89f165de2..9ca116994 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1293,6 +1293,10 @@ Network error: Błąd sieci: + + Error_Github_limit_MSG + Automatyczna aktualizacja umożliwia maksymalnie 60 sprawdzeń aktualizacji na godzinę.\nOsiągnąłeś ten limit. Spróbuj ponownie później. + Failed to parse update information. Nie udało się sparsować informacji o aktualizacji. diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 0bce16dcf..11b9e3d48 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1297,6 +1297,10 @@ Network error: Erro de rede: + + Error_Github_limit_MSG + O Atualizador Automático permite até 60 verificações de atualização por hora.\nVocê atingiu esse limite. Por favor, tente novamente mais tarde. + Failed to parse update information. Falha ao analisar as informações de atualização. diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index f60de9823..ebda5eda5 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1293,6 +1293,10 @@ Network error: Eroare de rețea: + + Error_Github_limit_MSG + Actualizatorul automat permite până la 60 de verificări de actualizare pe oră.\nAți atins această limită. Vă rugăm să încercați din nou mai târziu. + Failed to parse update information. Nu s-au putut analiza informațiile de actualizare. diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index a8b3bacb4..589e5814c 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1445,6 +1445,10 @@ Network error: Сетевая ошибка: + + Error_Github_limit_MSG + Автообновление позволяет выполнять до 60 проверок обновлений в час.\nВы достигли этого лимита. Пожалуйста, попробуйте позже. + Failed to parse update information. Не удалось разобрать информацию об обновлении. diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 1d37fa9c3..36d098afb 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -1293,6 +1293,10 @@ Network error: Gabim rrjeti: + + Error_Github_limit_MSG + Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nJu keni arritur këtë kufi. Ju lutemi provoni përsëri më vonë. + Failed to parse update information. Analizimi i informacionit të përditësimit deshtoi. diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 179064ef4..2d3ff877a 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -271,6 +271,10 @@ Network error: Nätverksfel: + + Error_Github_limit_MSG + Den automatiska uppdateraren tillåter upp till 60 uppdateringskontroller per timme.\nDu har nått denna gräns. Försök igen senare. + Failed to parse update information. Misslyckades med att tolka uppdateringsinformationen. diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 12794e088..64807c5a6 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1293,6 +1293,10 @@ Network error: Ağ hatası: + + Error_Github_limit_MSG + Otomatik Güncelleyici, saat başına en fazla 60 güncelleme kontrolüne izin verir.\nBu sınıra ulaştınız. Lütfen daha sonra tekrar deneyin. + Failed to parse update information. Güncelleme bilgilerini ayrıştırma başarısız oldu. diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 3fb26546e..f7e5a7495 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1390,6 +1390,10 @@ Network error: Мережева помилка: + + Error_Github_limit_MSG + Автооновлення дозволяє до 60 перевірок оновлень на годину.\nВи досягли цього ліміту. Будь ласка, спробуйте пізніше. + Failed to parse update information. Не вдалося розібрати інформацію про оновлення. diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 32841af81..b38be2ee1 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1293,6 +1293,10 @@ Network error: Lỗi mạng: + + Error_Github_limit_MSG + Trình cập nhật tự động cho phép tối đa 60 lần kiểm tra cập nhật mỗi giờ.\nBạn đã đạt đến giới hạn này. Vui lòng thử lại sau. + Failed to parse update information. Không thể phân tích thông tin cập nhật. diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 1e6124c85..867b7d860 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1302,6 +1302,10 @@ Network error: 网络错误: + + Error_Github_limit_MSG + 自动更新程序每小时最多允许 60 次更新检查。\n您已达到此限制。请稍后再试。 + Failed to parse update information. 无法解析更新信息。 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index c18e173e4..faed8ae61 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1293,6 +1293,10 @@ Network error: 網路錯誤: + + Error_Github_limit_MSG + 自動更新程式每小時最多允許 60 次更新檢查。\n您已達到此限制。請稍後再試。 + Failed to parse update information. 無法解析更新資訊。 From cfe249debeab6108e95e5b877e139282b37de931 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Thu, 6 Feb 2025 20:40:49 -0800 Subject: [PATCH 239/455] shader_recompiler: Replace texel buffers with in-shader buffer format interpretation (#2363) * shader_recompiler: Replace texel buffers with in-shader buffer format interpretation * shader_recompiler: Move 10/11-bit float conversion to functions and address some comments. * vulkan: Remove VK_KHR_maintenance5 as it is no longer needed for buffer views. * shader_recompiler: Add helpers for composites and bitfields in pack/unpack. * shader_recompiler: Use initializer_list for bitfield insert helper. --- CMakeLists.txt | 1 + externals/sirit | 2 +- .../backend/spirv/emit_spirv.cpp | 8 +- .../spirv/emit_spirv_bitwise_conversion.cpp | 224 +++++++++++++++--- .../backend/spirv/emit_spirv_composite.cpp | 8 + .../spirv/emit_spirv_context_get_set.cpp | 92 +++++-- .../backend/spirv/emit_spirv_instructions.h | 38 ++- .../backend/spirv/spirv_emit_context.cpp | 154 ++++++++---- .../backend/spirv/spirv_emit_context.h | 21 +- .../frontend/translate/export.cpp | 28 +-- .../frontend/translate/vector_alu.cpp | 16 +- .../frontend/translate/vector_memory.cpp | 10 +- src/shader_recompiler/info.h | 26 +- src/shader_recompiler/ir/ir_emitter.cpp | 204 ++++++++++++---- src/shader_recompiler/ir/ir_emitter.h | 41 ++-- src/shader_recompiler/ir/microinstruction.cpp | 6 + src/shader_recompiler/ir/opcodes.inc | 51 +++- .../ir/passes/constant_propagation_pass.cpp | 52 +++- src/shader_recompiler/ir/passes/ir_passes.h | 1 + .../ir/passes/lower_buffer_format_to_raw.cpp | 211 +++++++++++++++++ .../ir/passes/resource_tracking_pass.cpp | 109 ++------- .../ir/passes/shader_info_collection_pass.cpp | 12 +- src/shader_recompiler/recompiler.cpp | 1 + src/shader_recompiler/specialization.h | 47 ++-- src/video_core/buffer_cache/buffer.cpp | 26 +- src/video_core/buffer_cache/buffer.h | 14 +- .../renderer_vulkan/liverpool_to_vk.cpp | 9 +- .../renderer_vulkan/vk_compute_pipeline.cpp | 9 - .../renderer_vulkan/vk_graphics_pipeline.cpp | 9 - .../renderer_vulkan/vk_instance.cpp | 7 - src/video_core/renderer_vulkan/vk_instance.h | 16 -- .../renderer_vulkan/vk_pipeline_cache.cpp | 2 - .../renderer_vulkan/vk_rasterizer.cpp | 126 ++-------- .../renderer_vulkan/vk_rasterizer.h | 2 - .../renderer_vulkan/vk_shader_hle.cpp | 16 +- 35 files changed, 1037 insertions(+), 562 deletions(-) create mode 100644 src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8837a6584..c1ec7b7b9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -753,6 +753,7 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h src/shader_recompiler/ir/passes/hull_shader_transform.cpp src/shader_recompiler/ir/passes/identity_removal_pass.cpp src/shader_recompiler/ir/passes/ir_passes.h + src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp src/shader_recompiler/ir/passes/resource_tracking_pass.cpp src/shader_recompiler/ir/passes/ring_access_elimination.cpp diff --git a/externals/sirit b/externals/sirit index d6f3c0d99..8b9b12c20 160000 --- a/externals/sirit +++ b/externals/sirit @@ -1 +1 @@ -Subproject commit d6f3c0d99862ab2ff8f95e9ac221560f1f97e29a +Subproject commit 8b9b12c2089505ac8b10fa56bf56b3ed49d9d7b0 diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index f0cf15af0..3712380f5 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -250,7 +250,7 @@ void SetupCapabilities(const Info& info, const Profile& profile, EmitContext& ct ctx.AddCapability(spv::Capability::Float64); } ctx.AddCapability(spv::Capability::Int64); - if (info.has_storage_images || info.has_image_buffers) { + if (info.has_storage_images) { ctx.AddCapability(spv::Capability::StorageImageExtendedFormats); ctx.AddCapability(spv::Capability::StorageImageReadWithoutFormat); ctx.AddCapability(spv::Capability::StorageImageWriteWithoutFormat); @@ -259,12 +259,6 @@ void SetupCapabilities(const Info& info, const Profile& profile, EmitContext& ct ctx.AddCapability(spv::Capability::ImageReadWriteLodAMD); } } - if (info.has_texel_buffers) { - ctx.AddCapability(spv::Capability::SampledBuffer); - } - if (info.has_image_buffers) { - ctx.AddCapability(spv::Capability::ImageBuffer); - } if (info.has_image_gather) { ctx.AddCapability(spv::Capability::ImageGatherExtended); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp index 539c6cb81..56a6abc05 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp @@ -6,6 +6,56 @@ namespace Shader::Backend::SPIRV { +struct R { + R(u32 a, u32 b) : offset(a), size(b) {} + u32 offset; + u32 size; +}; +template +static std::array ExtractBitFields(EmitContext& ctx, const Id value, + const Args... args) { + const auto op_func = + is_signed ? &EmitContext::OpBitFieldSExtract : &EmitContext::OpBitFieldUExtract; + std::array result{}; + u32 i = 0; + ( + [&] { + result[i++] = (ctx.*op_func)(ctx.U32[1], value, ctx.ConstU32(args.offset), + ctx.ConstU32(args.size)); + }(), + ...); + return result; +} + +template +static Id InsertBitFields(EmitContext& ctx, const std::initializer_list values, + const Args... args) { + Id result{}; + auto it = values.begin(); + ( + [&] { + if (it == values.begin()) { + result = *it; + } else { + result = ctx.OpBitFieldInsert(ctx.U32[1], result, *it, ctx.ConstU32(args.offset), + ctx.ConstU32(args.size)); + } + ++it; + }(), + ...); + return result; +} + +template +static std::array ExtractComposite(EmitContext& ctx, const VectorIds type, + const Id value) { + std::array result{}; + for (u32 i = 0; i < num_components; i++) { + result[i] = ctx.OpCompositeExtract(type[1], value, i); + } + return result; +} + Id EmitBitCastU16F16(EmitContext& ctx, Id value) { return ctx.OpBitcast(ctx.U16, value); } @@ -42,22 +92,6 @@ Id EmitPackFloat2x32(EmitContext& ctx, Id value) { return ctx.OpBitcast(ctx.F64[1], value); } -Id EmitPackFloat2x16(EmitContext& ctx, Id value) { - return ctx.OpBitcast(ctx.U32[1], value); -} - -Id EmitUnpackFloat2x16(EmitContext& ctx, Id value) { - return ctx.OpBitcast(ctx.F16[2], value); -} - -Id EmitPackHalf2x16(EmitContext& ctx, Id value) { - return ctx.OpPackHalf2x16(ctx.U32[1], value); -} - -Id EmitUnpackHalf2x16(EmitContext& ctx, Id value) { - return ctx.OpUnpackHalf2x16(ctx.F32[2], value); -} - Id EmitPackUnorm2x16(EmitContext& ctx, Id value) { return ctx.OpPackUnorm2x16(ctx.U32[1], value); } @@ -75,31 +109,157 @@ Id EmitUnpackSnorm2x16(EmitContext& ctx, Id value) { } Id EmitPackUint2x16(EmitContext& ctx, Id value) { - // No SPIR-V instruction for this, do it manually. - const auto x{ctx.OpCompositeExtract(ctx.U32[1], value, 0)}; - const auto y{ctx.OpCompositeExtract(ctx.U32[1], value, 1)}; - return ctx.OpBitFieldInsert(ctx.U32[1], x, y, ctx.ConstU32(16U), ctx.ConstU32(16U)); + const auto unpacked{ctx.OpBitcast(ctx.U32[2], value)}; + const auto [x, y] = ExtractComposite<2>(ctx, ctx.U32, unpacked); + return InsertBitFields(ctx, {x, y}, R(0, 16), R(16, 16)); } Id EmitUnpackUint2x16(EmitContext& ctx, Id value) { - // No SPIR-V instruction for this, do it manually. - const auto x{ctx.OpBitFieldUExtract(ctx.U32[1], value, ctx.ConstU32(0U), ctx.ConstU32(16U))}; - const auto y{ctx.OpBitFieldUExtract(ctx.U32[1], value, ctx.ConstU32(16U), ctx.ConstU32(16U))}; - return ctx.OpCompositeConstruct(ctx.U32[2], x, y); + const auto [x, y] = ExtractBitFields(ctx, value, R(0, 16), R(16, 16)); + const auto unpacked{ctx.OpCompositeConstruct(ctx.U32[2], x, y)}; + return ctx.OpBitcast(ctx.F32[2], unpacked); } Id EmitPackSint2x16(EmitContext& ctx, Id value) { - // No SPIR-V instruction for this, do it manually. - const auto x{ctx.OpCompositeExtract(ctx.U32[1], value, 0)}; - const auto y{ctx.OpCompositeExtract(ctx.U32[1], value, 1)}; - return ctx.OpBitFieldInsert(ctx.U32[1], x, y, ctx.ConstU32(16U), ctx.ConstU32(16U)); + return EmitPackUint2x16(ctx, value); } Id EmitUnpackSint2x16(EmitContext& ctx, Id value) { - // No SPIR-V instruction for this, do it manually. - const auto x{ctx.OpBitFieldSExtract(ctx.U32[1], value, ctx.ConstU32(0U), ctx.ConstU32(16U))}; - const auto y{ctx.OpBitFieldSExtract(ctx.U32[1], value, ctx.ConstU32(16U), ctx.ConstU32(16U))}; - return ctx.OpCompositeConstruct(ctx.U32[2], x, y); + const auto [x, y] = ExtractBitFields(ctx, value, R(0, 16), R(16, 16)); + const auto unpacked{ctx.OpCompositeConstruct(ctx.U32[2], x, y)}; + return ctx.OpBitcast(ctx.F32[2], unpacked); +} + +Id EmitPackHalf2x16(EmitContext& ctx, Id value) { + return ctx.OpPackHalf2x16(ctx.U32[1], value); +} + +Id EmitUnpackHalf2x16(EmitContext& ctx, Id value) { + return ctx.OpUnpackHalf2x16(ctx.F32[2], value); +} + +Id EmitPackUnorm4x8(EmitContext& ctx, Id value) { + return ctx.OpPackUnorm4x8(ctx.U32[1], value); +} + +Id EmitUnpackUnorm4x8(EmitContext& ctx, Id value) { + return ctx.OpUnpackUnorm4x8(ctx.F32[4], value); +} + +Id EmitPackSnorm4x8(EmitContext& ctx, Id value) { + return ctx.OpPackSnorm4x8(ctx.U32[1], value); +} + +Id EmitUnpackSnorm4x8(EmitContext& ctx, Id value) { + return ctx.OpUnpackSnorm4x8(ctx.F32[4], value); +} + +Id EmitPackUint4x8(EmitContext& ctx, Id value) { + const auto unpacked{ctx.OpBitcast(ctx.U32[4], value)}; + const auto [x, y, z, w] = ExtractComposite<4>(ctx, ctx.U32, unpacked); + return InsertBitFields(ctx, {x, y, z, w}, R(0, 8), R(8, 8), R(16, 8), R(24, 8)); +} + +Id EmitUnpackUint4x8(EmitContext& ctx, Id value) { + const auto [x, y, z, w] = + ExtractBitFields(ctx, value, R(0, 8), R(8, 8), R(16, 8), R(24, 8)); + const auto unpacked{ctx.OpCompositeConstruct(ctx.U32[4], x, y, z, w)}; + return ctx.OpBitcast(ctx.F32[4], unpacked); +} + +Id EmitPackSint4x8(EmitContext& ctx, Id value) { + return EmitPackUint4x8(ctx, value); +} + +Id EmitUnpackSint4x8(EmitContext& ctx, Id value) { + const auto [x, y, z, w] = + ExtractBitFields(ctx, value, R(0, 8), R(8, 8), R(16, 8), R(24, 8)); + const auto unpacked{ctx.OpCompositeConstruct(ctx.U32[4], x, y, z, w)}; + return ctx.OpBitcast(ctx.F32[4], unpacked); +} + +Id EmitPackUfloat10_11_11(EmitContext& ctx, Id value) { + const auto [x, y, z] = ExtractComposite<3>(ctx, ctx.F32, value); + const auto cvt_x{ctx.OpFunctionCall(ctx.U32[1], ctx.f32_to_uf11, x)}; + const auto cvt_y{ctx.OpFunctionCall(ctx.U32[1], ctx.f32_to_uf11, y)}; + const auto cvt_z{ctx.OpFunctionCall(ctx.U32[1], ctx.f32_to_uf10, z)}; + return InsertBitFields(ctx, {cvt_x, cvt_y, cvt_z}, R(0, 11), R(11, 11), R(22, 10)); +} + +Id EmitUnpackUfloat10_11_11(EmitContext& ctx, Id value) { + const auto [x, y, z] = ExtractBitFields(ctx, value, R(0, 11), R(11, 11), R(22, 10)); + const auto cvt_x{ctx.OpFunctionCall(ctx.F32[1], ctx.uf11_to_f32, x)}; + const auto cvt_y{ctx.OpFunctionCall(ctx.F32[1], ctx.uf11_to_f32, y)}; + const auto cvt_z{ctx.OpFunctionCall(ctx.F32[1], ctx.uf10_to_f32, z)}; + return ctx.OpCompositeConstruct(ctx.F32[3], cvt_x, cvt_y, cvt_z); +} + +Id EmitPackUnorm2_10_10_10(EmitContext& ctx, Id value) { + const auto unorm_min{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(0.f), ctx.ConstF32(0.f), + ctx.ConstF32(0.f), ctx.ConstF32(0.f))}; + const auto unorm_max{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(1.f), ctx.ConstF32(1.f), + ctx.ConstF32(1.f), ctx.ConstF32(1.f))}; + const auto clamped{ctx.OpFClamp(ctx.F32[4], value, unorm_min, unorm_max)}; + const auto unorm_mul{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(1023.f), + ctx.ConstF32(1023.f), ctx.ConstF32(1023.f), + ctx.ConstF32(3.f))}; + const auto as_float{ctx.OpFMul(ctx.F32[4], clamped, unorm_mul)}; + const auto as_uint{ctx.OpConvertFToU(ctx.U32[4], ctx.OpRoundEven(ctx.F32[4], as_float))}; + return EmitPackUint2_10_10_10(ctx, ctx.OpBitcast(ctx.F32[4], as_uint)); +} + +Id EmitUnpackUnorm2_10_10_10(EmitContext& ctx, Id value) { + const auto unpacked{ctx.OpBitcast(ctx.U32[4], EmitUnpackUint2_10_10_10(ctx, value))}; + const auto as_float{ctx.OpConvertUToF(ctx.F32[4], unpacked)}; + const auto unorm_div{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(1023.f), + ctx.ConstF32(1023.f), ctx.ConstF32(1023.f), + ctx.ConstF32(3.f))}; + return ctx.OpFDiv(ctx.F32[4], as_float, unorm_div); +} + +Id EmitPackSnorm2_10_10_10(EmitContext& ctx, Id value) { + const auto snorm_min{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(-1.f), ctx.ConstF32(-1.f), + ctx.ConstF32(-1.f), ctx.ConstF32(-1.f))}; + const auto snorm_max{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(1.f), ctx.ConstF32(1.f), + ctx.ConstF32(1.f), ctx.ConstF32(1.f))}; + const auto clamped{ctx.OpFClamp(ctx.F32[4], value, snorm_min, snorm_max)}; + const auto snorm_mul{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(511.f), ctx.ConstF32(511.f), + ctx.ConstF32(511.f), ctx.ConstF32(1.f))}; + const auto as_float{ctx.OpFMul(ctx.F32[4], clamped, snorm_mul)}; + const auto as_sint{ctx.OpConvertFToS(ctx.U32[4], ctx.OpRoundEven(ctx.F32[4], as_float))}; + return EmitPackSint2_10_10_10(ctx, ctx.OpBitcast(ctx.F32[4], as_sint)); +} + +Id EmitUnpackSnorm2_10_10_10(EmitContext& ctx, Id value) { + const auto unpacked{ctx.OpBitcast(ctx.U32[4], EmitUnpackSint2_10_10_10(ctx, value))}; + const auto as_float{ctx.OpConvertSToF(ctx.F32[4], unpacked)}; + const auto snorm_div{ctx.ConstantComposite(ctx.F32[4], ctx.ConstF32(511.f), ctx.ConstF32(511.f), + ctx.ConstF32(511.f), ctx.ConstF32(1.f))}; + return ctx.OpFDiv(ctx.F32[4], as_float, snorm_div); +} + +Id EmitPackUint2_10_10_10(EmitContext& ctx, Id value) { + const auto unpacked{ctx.OpBitcast(ctx.U32[4], value)}; + const auto [x, y, z, w] = ExtractComposite<4>(ctx, ctx.U32, unpacked); + return InsertBitFields(ctx, {x, y, z, w}, R(0, 10), R(10, 10), R(20, 10), R(30, 2)); +} + +Id EmitUnpackUint2_10_10_10(EmitContext& ctx, Id value) { + const auto [x, y, z, w] = + ExtractBitFields(ctx, value, R(0, 10), R(10, 10), R(20, 10), R(30, 2)); + const auto unpacked{ctx.OpCompositeConstruct(ctx.U32[4], x, y, z, w)}; + return ctx.OpBitcast(ctx.F32[4], unpacked); +} + +Id EmitPackSint2_10_10_10(EmitContext& ctx, Id value) { + return EmitPackUint2_10_10_10(ctx, value); +} + +Id EmitUnpackSint2_10_10_10(EmitContext& ctx, Id value) { + const auto [x, y, z, w] = + ExtractBitFields(ctx, value, R(0, 10), R(10, 10), R(20, 10), R(30, 2)); + const auto unpacked{ctx.OpCompositeConstruct(ctx.U32[4], x, y, z, w)}; + return ctx.OpBitcast(ctx.F32[4], unpacked); } } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp index d064b5d05..4f9e6040e 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp @@ -24,6 +24,10 @@ Id EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, I return EmitCompositeConstruct(ctx, inst, ctx.U32[4], e1, e2, e3, e4); } +Id EmitCompositeConstructU32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { + return EmitCompositeConstruct(ctx, inst, ctx.U32[4], e1, e2); +} + Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index) { return ctx.OpCompositeExtract(ctx.U32[1], composite, index); } @@ -124,6 +128,10 @@ Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, I return EmitCompositeConstruct(ctx, inst, ctx.F32[4], e1, e2, e3, e4); } +Id EmitCompositeConstructF32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { + return EmitCompositeConstruct(ctx, inst, ctx.F32[4], e1, e2); +} + Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index) { return ctx.OpCompositeExtract(ctx.F32[1], composite, index); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 4550440bb..ae77ed413 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -416,6 +416,20 @@ static Id EmitLoadBufferU32xN(EmitContext& ctx, u32 handle, Id address) { } } +Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { + const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(3u))}; + const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; + const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; + return ctx.OpBitFieldUExtract(ctx.U32[1], dword, bit_offset, ctx.ConstU32(8u)); +} + +Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { + const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(2u))}; + const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; + const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; + return ctx.OpBitFieldUExtract(ctx.U32[1], dword, bit_offset, ctx.ConstU32(16u)); +} + Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { return EmitLoadBufferU32xN<1>(ctx, handle, address); } @@ -432,18 +446,24 @@ Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { return EmitLoadBufferU32xN<4>(ctx, handle, address); } +Id EmitLoadBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return ctx.OpBitcast(ctx.F32[1], EmitLoadBufferU32(ctx, inst, handle, address)); +} + +Id EmitLoadBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return ctx.OpBitcast(ctx.F32[2], EmitLoadBufferU32x2(ctx, inst, handle, address)); +} + +Id EmitLoadBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return ctx.OpBitcast(ctx.F32[3], EmitLoadBufferU32x3(ctx, inst, handle, address)); +} + +Id EmitLoadBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return ctx.OpBitcast(ctx.F32[4], EmitLoadBufferU32x4(ctx, inst, handle, address)); +} + Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - const auto& buffer = ctx.texture_buffers[handle]; - const Id tex_buffer = ctx.OpLoad(buffer.image_type, buffer.id); - const Id coord = - ctx.OpIAdd(ctx.U32[1], ctx.OpShiftLeftLogical(ctx.U32[1], address, buffer.coord_shift), - buffer.coord_offset); - Id texel = buffer.is_storage ? ctx.OpImageRead(buffer.result_type, tex_buffer, coord) - : ctx.OpImageFetch(buffer.result_type, tex_buffer, coord); - if (buffer.is_integer) { - texel = ctx.OpBitcast(ctx.F32[4], texel); - } - return texel; + UNREACHABLE_MSG("SPIR-V instruction"); } template @@ -464,32 +484,56 @@ static void EmitStoreBufferU32xN(EmitContext& ctx, u32 handle, Id address, Id va } } -void EmitStoreBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { +void EmitStoreBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { + const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(3u))}; + const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; + const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; + const Id new_val{ctx.OpBitFieldInsert(ctx.U32[1], dword, value, bit_offset, ctx.ConstU32(8u))}; + EmitStoreBufferU32xN<1>(ctx, handle, address, new_val); +} + +void EmitStoreBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { + const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(2u))}; + const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; + const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; + const Id new_val{ctx.OpBitFieldInsert(ctx.U32[1], dword, value, bit_offset, ctx.ConstU32(16u))}; + EmitStoreBufferU32xN<1>(ctx, handle, address, new_val); +} + +void EmitStoreBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { EmitStoreBufferU32xN<1>(ctx, handle, address, value); } -void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { +void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { EmitStoreBufferU32xN<2>(ctx, handle, address, value); } -void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { +void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { EmitStoreBufferU32xN<3>(ctx, handle, address, value); } -void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { +void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { EmitStoreBufferU32xN<4>(ctx, handle, address, value); } +void EmitStoreBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferU32(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[1], value)); +} + +void EmitStoreBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferU32x2(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[2], value)); +} + +void EmitStoreBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferU32x3(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[3], value)); +} + +void EmitStoreBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferU32x4(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[4], value)); +} + void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - const auto& buffer = ctx.texture_buffers[handle]; - const Id tex_buffer = ctx.OpLoad(buffer.image_type, buffer.id); - const Id coord = - ctx.OpIAdd(ctx.U32[1], ctx.OpShiftLeftLogical(ctx.U32[1], address, buffer.coord_shift), - buffer.coord_offset); - if (buffer.is_integer) { - value = ctx.OpBitcast(buffer.result_type, value); - } - ctx.OpImageWrite(tex_buffer, coord, value); + UNREACHABLE_MSG("SPIR-V instruction"); } } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 842b13207..3e2cea9e5 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -63,15 +63,27 @@ void EmitGetGotoVariable(EmitContext& ctx); void EmitSetScc(EmitContext& ctx); Id EmitReadConst(EmitContext& ctx, IR::Inst* inst); Id EmitReadConstBuffer(EmitContext& ctx, u32 handle, Id index); +Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); +Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); Id EmitLoadBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); Id EmitLoadBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); +Id EmitLoadBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); +Id EmitLoadBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); +Id EmitLoadBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); +Id EmitLoadBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address); +void EmitStoreBufferU8(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); +void EmitStoreBufferU16(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); void EmitStoreBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); +void EmitStoreBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); +void EmitStoreBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); +void EmitStoreBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); +void EmitStoreBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); Id EmitBufferAtomicIAdd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); Id EmitBufferAtomicSMin32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value); @@ -123,6 +135,7 @@ Id EmitSharedAtomicXor32(EmitContext& ctx, Id offset, Id value); Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); Id EmitCompositeConstructU32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); Id EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); +Id EmitCompositeConstructU32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index); Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index); Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index); @@ -151,6 +164,7 @@ Id EmitCompositeShuffleF16x4(EmitContext& ctx, Id composite1, Id composite2, u32 Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); Id EmitCompositeConstructF32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); +Id EmitCompositeConstructF32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index); Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index); Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index); @@ -193,10 +207,6 @@ void EmitBitCastF64U64(EmitContext& ctx); Id EmitPackUint2x32(EmitContext& ctx, Id value); Id EmitUnpackUint2x32(EmitContext& ctx, Id value); Id EmitPackFloat2x32(EmitContext& ctx, Id value); -Id EmitPackFloat2x16(EmitContext& ctx, Id value); -Id EmitUnpackFloat2x16(EmitContext& ctx, Id value); -Id EmitPackHalf2x16(EmitContext& ctx, Id value); -Id EmitUnpackHalf2x16(EmitContext& ctx, Id value); Id EmitPackUnorm2x16(EmitContext& ctx, Id value); Id EmitUnpackUnorm2x16(EmitContext& ctx, Id value); Id EmitPackSnorm2x16(EmitContext& ctx, Id value); @@ -205,6 +215,26 @@ Id EmitPackUint2x16(EmitContext& ctx, Id value); Id EmitUnpackUint2x16(EmitContext& ctx, Id value); Id EmitPackSint2x16(EmitContext& ctx, Id value); Id EmitUnpackSint2x16(EmitContext& ctx, Id value); +Id EmitPackHalf2x16(EmitContext& ctx, Id value); +Id EmitUnpackHalf2x16(EmitContext& ctx, Id value); +Id EmitPackUnorm4x8(EmitContext& ctx, Id value); +Id EmitUnpackUnorm4x8(EmitContext& ctx, Id value); +Id EmitPackSnorm4x8(EmitContext& ctx, Id value); +Id EmitUnpackSnorm4x8(EmitContext& ctx, Id value); +Id EmitPackUint4x8(EmitContext& ctx, Id value); +Id EmitUnpackUint4x8(EmitContext& ctx, Id value); +Id EmitPackSint4x8(EmitContext& ctx, Id value); +Id EmitUnpackSint4x8(EmitContext& ctx, Id value); +Id EmitPackUfloat10_11_11(EmitContext& ctx, Id value); +Id EmitUnpackUfloat10_11_11(EmitContext& ctx, Id value); +Id EmitPackUnorm2_10_10_10(EmitContext& ctx, Id value); +Id EmitUnpackUnorm2_10_10_10(EmitContext& ctx, Id value); +Id EmitPackSnorm2_10_10_10(EmitContext& ctx, Id value); +Id EmitUnpackSnorm2_10_10_10(EmitContext& ctx, Id value); +Id EmitPackUint2_10_10_10(EmitContext& ctx, Id value); +Id EmitUnpackUint2_10_10_10(EmitContext& ctx, Id value); +Id EmitPackSint2_10_10_10(EmitContext& ctx, Id value); +Id EmitUnpackSint2_10_10_10(EmitContext& ctx, Id value); Id EmitFPAbs16(EmitContext& ctx, Id value); Id EmitFPAbs32(EmitContext& ctx, Id value); Id EmitFPAbs64(EmitContext& ctx, Id value); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 2a0c28563..13d727c72 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -74,8 +74,8 @@ EmitContext::EmitContext(const Profile& profile_, const RuntimeInfo& runtime_inf DefineInterfaces(); DefineSharedMemory(); DefineBuffers(); - DefineTextureBuffers(); DefineImagesAndSamplers(); + DefineFunctions(); } EmitContext::~EmitContext() = default; @@ -205,19 +205,6 @@ void EmitContext::DefineBufferOffsets() { buffer.offset_dwords = OpShiftRightLogical(U32[1], buffer.offset, ConstU32(2U)); Name(buffer.offset_dwords, fmt::format("buf{}_dword_off", binding)); } - for (TextureBufferDefinition& tex_buffer : texture_buffers) { - const u32 binding = tex_buffer.binding; - const u32 half = PushData::BufOffsetIndex + (binding >> 4); - const u32 comp = (binding & 0xf) >> 2; - const u32 offset = (binding & 0x3) << 3; - const Id ptr{OpAccessChain(TypePointer(spv::StorageClass::PushConstant, U32[1]), - push_data_block, ConstU32(half), ConstU32(comp))}; - const Id value{OpLoad(U32[1], ptr)}; - tex_buffer.coord_offset = OpBitFieldUExtract(U32[1], value, ConstU32(offset), ConstU32(6U)); - tex_buffer.coord_shift = - OpBitFieldUExtract(U32[1], value, ConstU32(offset + 6U), ConstU32(2U)); - Name(tex_buffer.coord_offset, fmt::format("texbuf{}_off", binding)); - } } void EmitContext::DefineInterpolatedAttribs() { @@ -676,32 +663,6 @@ void EmitContext::DefineBuffers() { } } -void EmitContext::DefineTextureBuffers() { - for (const auto& desc : info.texture_buffers) { - const auto sharp = desc.GetSharp(info); - const auto nfmt = sharp.GetNumberFmt(); - const bool is_integer = AmdGpu::IsInteger(nfmt); - const VectorIds& sampled_type{GetAttributeType(*this, nfmt)}; - const u32 sampled = desc.is_written ? 2 : 1; - const Id image_type{TypeImage(sampled_type[1], spv::Dim::Buffer, false, false, false, - sampled, spv::ImageFormat::Unknown)}; - const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)}; - const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)}; - Decorate(id, spv::Decoration::Binding, binding.unified++); - Decorate(id, spv::Decoration::DescriptorSet, 0U); - Name(id, fmt::format("{}_{}", desc.is_written ? "imgbuf" : "texbuf", desc.sharp_idx)); - texture_buffers.push_back({ - .id = id, - .binding = binding.buffer++, - .image_type = image_type, - .result_type = sampled_type[4], - .is_integer = is_integer, - .is_storage = desc.is_written, - }); - interfaces.push_back(id); - } -} - spv::ImageFormat GetFormat(const AmdGpu::Image& image) { if (image.GetDataFmt() == AmdGpu::DataFormat::Format32 && image.GetNumberFmt() == AmdGpu::NumberFormat::Uint) { @@ -893,4 +854,117 @@ void EmitContext::DefineSharedMemory() { } } +Id EmitContext::DefineFloat32ToUfloatM5(u32 mantissa_bits, const std::string_view name) { + // https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/util/format_r11g11b10f.h + const auto func_type{TypeFunction(U32[1], F32[1])}; + const auto func{OpFunction(U32[1], spv::FunctionControlMask::MaskNone, func_type)}; + const auto value{OpFunctionParameter(F32[1])}; + Name(func, name); + AddLabel(); + + const auto raw_value{OpBitcast(U32[1], value)}; + const auto exponent{ + OpBitcast(S32[1], OpBitFieldSExtract(U32[1], raw_value, ConstU32(23U), ConstU32(8U)))}; + const auto sign{OpBitFieldUExtract(U32[1], raw_value, ConstU32(31U), ConstU32(1U))}; + + const auto is_zero{OpLogicalOr(U1[1], OpIEqual(U1[1], raw_value, ConstU32(0U)), + OpIEqual(U1[1], sign, ConstU32(1U)))}; + const auto is_nan{OpIsNan(U1[1], value)}; + const auto is_inf{OpIsInf(U1[1], value)}; + const auto is_denorm{OpSLessThanEqual(U1[1], exponent, ConstS32(-15))}; + + const auto denorm_mantissa{OpConvertFToU( + U32[1], + OpRoundEven(F32[1], OpFMul(F32[1], value, + ConstF32(static_cast(1 << (mantissa_bits + 14))))))}; + const auto denorm_overflow{ + OpINotEqual(U1[1], OpShiftRightLogical(U32[1], denorm_mantissa, ConstU32(mantissa_bits)), + ConstU32(0U))}; + const auto denorm{ + OpSelect(U32[1], denorm_overflow, ConstU32(1U << mantissa_bits), denorm_mantissa)}; + + const auto norm_mantissa{OpConvertFToU( + U32[1], + OpRoundEven(F32[1], + OpLdexp(F32[1], value, + OpISub(S32[1], ConstS32(static_cast(mantissa_bits)), exponent))))}; + const auto norm_overflow{ + OpUGreaterThanEqual(U1[1], norm_mantissa, ConstU32(2U << mantissa_bits))}; + const auto norm_final_mantissa{OpBitwiseAnd( + U32[1], + OpSelect(U32[1], norm_overflow, OpShiftRightLogical(U32[1], norm_mantissa, ConstU32(1U)), + norm_mantissa), + ConstU32((1U << mantissa_bits) - 1))}; + const auto norm_final_exponent{OpBitcast( + U32[1], + OpIAdd(S32[1], + OpSelect(S32[1], norm_overflow, OpIAdd(S32[1], exponent, ConstS32(1)), exponent), + ConstS32(15)))}; + const auto norm{OpBitFieldInsert(U32[1], norm_final_mantissa, norm_final_exponent, + ConstU32(mantissa_bits), ConstU32(5U))}; + + const auto result{OpSelect(U32[1], is_zero, ConstU32(0U), + OpSelect(U32[1], is_nan, ConstU32(31u << mantissa_bits | 1U), + OpSelect(U32[1], is_inf, ConstU32(31U << mantissa_bits), + OpSelect(U32[1], is_denorm, denorm, norm))))}; + + OpReturnValue(result); + OpFunctionEnd(); + return func; +} + +Id EmitContext::DefineUfloatM5ToFloat32(u32 mantissa_bits, const std::string_view name) { + // https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/util/format_r11g11b10f.h + const auto func_type{TypeFunction(F32[1], U32[1])}; + const auto func{OpFunction(F32[1], spv::FunctionControlMask::MaskNone, func_type)}; + const auto value{OpFunctionParameter(U32[1])}; + Name(func, name); + AddLabel(); + + const auto raw_mantissa{ + OpBitFieldUExtract(U32[1], value, ConstU32(0U), ConstU32(mantissa_bits))}; + const auto mantissa{OpConvertUToF(F32[1], raw_mantissa)}; + const auto exponent{OpBitcast( + S32[1], OpBitFieldSExtract(U32[1], value, ConstU32(mantissa_bits), ConstU32(5U)))}; + + const auto is_exp_neg_one{OpIEqual(U1[1], exponent, ConstS32(-1))}; + const auto is_exp_zero{OpIEqual(U1[1], exponent, ConstS32(0))}; + + const auto is_zero{OpIEqual(U1[1], value, ConstU32(0u))}; + const auto is_nan{ + OpLogicalAnd(U1[1], is_exp_neg_one, OpINotEqual(U1[1], raw_mantissa, ConstU32(0u)))}; + const auto is_inf{ + OpLogicalAnd(U1[1], is_exp_neg_one, OpIEqual(U1[1], raw_mantissa, ConstU32(0u)))}; + const auto is_denorm{ + OpLogicalAnd(U1[1], is_exp_zero, OpINotEqual(U1[1], raw_mantissa, ConstU32(0u)))}; + + const auto denorm{OpFMul(F32[1], mantissa, ConstF32(1.f / (1 << 20)))}; + const auto norm{OpLdexp( + F32[1], + OpFAdd(F32[1], + OpFMul(F32[1], mantissa, ConstF32(1.f / static_cast(1 << mantissa_bits))), + ConstF32(1.f)), + exponent)}; + + const auto result{OpSelect(F32[1], is_zero, ConstF32(0.f), + OpSelect(F32[1], is_nan, ConstF32(NAN), + OpSelect(F32[1], is_inf, ConstF32(INFINITY), + OpSelect(F32[1], is_denorm, denorm, norm))))}; + + OpReturnValue(result); + OpFunctionEnd(); + return func; +} + +void EmitContext::DefineFunctions() { + if (info.uses_pack_10_11_11) { + f32_to_uf11 = DefineFloat32ToUfloatM5(6, "f32_to_uf11"); + f32_to_uf10 = DefineFloat32ToUfloatM5(5, "f32_to_uf10"); + } + if (info.uses_unpack_10_11_11) { + uf11_to_f32 = DefineUfloatM5ToFloat32(6, "uf11_to_f32"); + uf10_to_f32 = DefineUfloatM5ToFloat32(5, "uf10_to_f32"); + } +} + } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index ab42ecc5b..23fca4212 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -235,20 +235,9 @@ public: const VectorIds* data_types; Id pointer_type; }; - struct TextureBufferDefinition { - Id id; - Id coord_offset; - Id coord_shift; - u32 binding; - Id image_type; - Id result_type; - bool is_integer = false; - bool is_storage = false; - }; Bindings& binding; boost::container::small_vector buffers; - boost::container::small_vector texture_buffers; BufferDefinition srt_flatbuf; boost::container::small_vector images; boost::container::small_vector samplers; @@ -271,6 +260,11 @@ public: std::array output_params{}; std::array frag_outputs{}; + Id uf11_to_f32{}; + Id f32_to_uf11{}; + Id uf10_to_f32{}; + Id f32_to_uf10{}; + private: void DefineArithmeticTypes(); void DefineInterfaces(); @@ -278,12 +272,15 @@ private: void DefineOutputs(); void DefinePushDataBlock(); void DefineBuffers(); - void DefineTextureBuffers(); void DefineImagesAndSamplers(); void DefineSharedMemory(); + void DefineFunctions(); SpirvAttribute GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id, u32 num_components, bool output); + + Id DefineFloat32ToUfloatM5(u32 mantissa_bits, std::string_view name); + Id DefineUfloatM5ToFloat32(u32 mantissa_bits, std::string_view name); }; } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/frontend/translate/export.cpp b/src/shader_recompiler/frontend/translate/export.cpp index 28c4685db..ece35093a 100644 --- a/src/shader_recompiler/frontend/translate/export.cpp +++ b/src/shader_recompiler/frontend/translate/export.cpp @@ -30,28 +30,25 @@ void Translator::ExportMrtCompressed(IR::Attribute attribute, u32 idx, const IR: static_cast(attribute) - static_cast(IR::Attribute::RenderTarget0); const auto color_buffer = runtime_info.fs_info.color_buffers[color_buffer_idx]; - IR::Value unpacked_value; - bool is_integer = false; + AmdGpu::NumberFormat num_format; switch (color_buffer.export_format) { case AmdGpu::Liverpool::ShaderExportFormat::Zero: // No export return; case AmdGpu::Liverpool::ShaderExportFormat::ABGR_FP16: - unpacked_value = ir.UnpackHalf2x16(value); + num_format = AmdGpu::NumberFormat::Float; break; case AmdGpu::Liverpool::ShaderExportFormat::ABGR_UNORM16: - unpacked_value = ir.UnpackUnorm2x16(value); + num_format = AmdGpu::NumberFormat::Unorm; break; case AmdGpu::Liverpool::ShaderExportFormat::ABGR_SNORM16: - unpacked_value = ir.UnpackSnorm2x16(value); + num_format = AmdGpu::NumberFormat::Snorm; break; case AmdGpu::Liverpool::ShaderExportFormat::ABGR_UINT16: - unpacked_value = ir.UnpackUint2x16(value); - is_integer = true; + num_format = AmdGpu::NumberFormat::Uint; break; case AmdGpu::Liverpool::ShaderExportFormat::ABGR_SINT16: - unpacked_value = ir.UnpackSint2x16(value); - is_integer = true; + num_format = AmdGpu::NumberFormat::Sint; break; default: UNREACHABLE_MSG("Unimplemented compressed MRT export format {}", @@ -59,16 +56,15 @@ void Translator::ExportMrtCompressed(IR::Attribute attribute, u32 idx, const IR: break; } - const auto r = ir.CompositeExtract(unpacked_value, 0); - const auto g = ir.CompositeExtract(unpacked_value, 1); - const IR::F32 float_r = is_integer ? ir.BitCast(IR::U32{r}) : IR::F32{r}; - const IR::F32 float_g = is_integer ? ir.BitCast(IR::U32{g}) : IR::F32{g}; + const auto unpacked_value = ir.Unpack2x16(num_format, value); + const IR::F32 r = IR::F32{ir.CompositeExtract(unpacked_value, 0)}; + const IR::F32 g = IR::F32{ir.CompositeExtract(unpacked_value, 1)}; const auto swizzled_r = SwizzleMrtComponent(color_buffer, idx * 2); const auto swizzled_g = SwizzleMrtComponent(color_buffer, idx * 2 + 1); - ExportMrtValue(attribute, swizzled_r, float_r, color_buffer); - ExportMrtValue(attribute, swizzled_g, float_g, color_buffer); + ExportMrtValue(attribute, swizzled_r, r, color_buffer); + ExportMrtValue(attribute, swizzled_g, g, color_buffer); } void Translator::ExportMrtUncompressed(IR::Attribute attribute, u32 comp, const IR::F32& value) { @@ -115,7 +111,7 @@ void Translator::ExportCompressed(IR::Attribute attribute, u32 idx, const IR::U3 ExportMrtCompressed(attribute, idx, value); return; } - const IR::Value unpacked_value = ir.UnpackHalf2x16(value); + const IR::Value unpacked_value = ir.Unpack2x16(AmdGpu::NumberFormat::Float, value); const IR::F32 r = IR::F32{ir.CompositeExtract(unpacked_value, 0)}; const IR::F32 g = IR::F32{ir.CompositeExtract(unpacked_value, 1)}; ir.SetAttribute(attribute, r, idx * 2); diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index f73618dbe..56e903052 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -651,19 +651,19 @@ void Translator::V_LDEXP_F32(const GcnInst& inst) { void Translator::V_CVT_PKNORM_U16_F32(const GcnInst& inst) { const IR::Value vec_f32 = ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); - SetDst(inst.dst[0], ir.PackUnorm2x16(vec_f32)); + SetDst(inst.dst[0], ir.Pack2x16(AmdGpu::NumberFormat::Unorm, vec_f32)); } void Translator::V_CVT_PKNORM_I16_F32(const GcnInst& inst) { const IR::Value vec_f32 = ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); - SetDst(inst.dst[0], ir.PackSnorm2x16(vec_f32)); + SetDst(inst.dst[0], ir.Pack2x16(AmdGpu::NumberFormat::Snorm, vec_f32)); } void Translator::V_CVT_PKRTZ_F16_F32(const GcnInst& inst) { const IR::Value vec_f32 = ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); - SetDst(inst.dst[0], ir.PackHalf2x16(vec_f32)); + SetDst(inst.dst[0], ir.Pack2x16(AmdGpu::NumberFormat::Float, vec_f32)); } // VOP1 @@ -1245,14 +1245,16 @@ void Translator::V_SAD_U32(const GcnInst& inst) { void Translator::V_CVT_PK_U16_U32(const GcnInst& inst) { const IR::Value vec_u32 = - ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); - SetDst(inst.dst[0], ir.PackUint2x16(vec_u32)); + ir.CompositeConstruct(ir.BitCast(GetSrc(inst.src[0])), + ir.BitCast(GetSrc(inst.src[1]))); + SetDst(inst.dst[0], ir.Pack2x16(AmdGpu::NumberFormat::Uint, vec_u32)); } void Translator::V_CVT_PK_I16_I32(const GcnInst& inst) { const IR::Value vec_u32 = - ir.CompositeConstruct(GetSrc(inst.src[0]), GetSrc(inst.src[1])); - SetDst(inst.dst[0], ir.PackSint2x16(vec_u32)); + ir.CompositeConstruct(ir.BitCast(GetSrc(inst.src[0])), + ir.BitCast(GetSrc(inst.src[1]))); + SetDst(inst.dst[0], ir.Pack2x16(AmdGpu::NumberFormat::Sint, vec_u32)); } void Translator::V_CVT_PK_U8_F32(const GcnInst& inst) { diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index 685785af1..0b911eb57 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -208,7 +208,7 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - const IR::Value value = ir.LoadBuffer(num_dwords, handle, address, buffer_info); + const IR::Value value = ir.LoadBufferU32(num_dwords, handle, address, buffer_info); const IR::VectorReg dst_reg{inst.src[1].code}; if (num_dwords == 1) { ir.SetVectorReg(dst_reg, IR::U32{value}); @@ -314,16 +314,18 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - ir.StoreBuffer(num_dwords, handle, address, value, buffer_info); + ir.StoreBufferU32(num_dwords, handle, address, value, buffer_info); } void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) { const auto& mubuf = inst.control.mubuf; const IR::VectorReg vaddr{inst.src[0].code}; const IR::ScalarReg sharp{inst.src[2].code * 4}; - ASSERT_MSG(!mubuf.offen && mubuf.offset == 0, "Offsets for image buffers are not supported"); const IR::Value address = [&] -> IR::Value { - if (mubuf.idxen) { + if (mubuf.idxen && mubuf.offen) { + return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); + } + if (mubuf.idxen || mubuf.offen) { return ir.GetVectorReg(vaddr); } return {}; diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index 9469eaad7..498752607 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -48,6 +48,7 @@ struct BufferResource { bool is_instance_data{}; u8 instance_attrib{}; bool is_written{}; + bool is_formatted{}; [[nodiscard]] bool IsStorage(const AmdGpu::Buffer& buffer) const noexcept { return buffer.GetSize() > MaxUboSize || is_written || is_gds_buffer; @@ -57,14 +58,6 @@ struct BufferResource { }; using BufferResourceList = boost::container::small_vector; -struct TextureBufferResource { - u32 sharp_idx; - bool is_written{}; - - [[nodiscard]] constexpr AmdGpu::Buffer GetSharp(const Info& info) const noexcept; -}; -using TextureBufferResourceList = boost::container::small_vector; - struct ImageResource { u32 sharp_idx; bool is_depth{}; @@ -114,11 +107,6 @@ struct PushData { ASSERT(offset < 256 && binding < buf_offsets.size()); buf_offsets[binding] = offset; } - - void AddTexelOffset(u32 binding, u32 multiplier, u32 texel_offset) { - ASSERT(texel_offset < 64 && multiplier < 16); - buf_offsets[binding] = texel_offset | ((std::bit_width(multiplier) - 1) << 6); - } }; static_assert(sizeof(PushData) <= 128, "PushData size is greater than minimum size guaranteed by Vulkan spec"); @@ -175,7 +163,6 @@ struct Info { u32 uses_patches{}; BufferResourceList buffers; - TextureBufferResourceList texture_buffers; ImageResourceList images; SamplerResourceList samplers; FMaskResourceList fmasks; @@ -193,8 +180,6 @@ struct Info { u64 pgm_hash{}; VAddr pgm_base; bool has_storage_images{}; - bool has_image_buffers{}; - bool has_texel_buffers{}; bool has_discard{}; bool has_image_gather{}; bool has_image_query{}; @@ -204,6 +189,8 @@ struct Info { bool uses_shared{}; bool uses_fp16{}; bool uses_fp64{}; + bool uses_pack_10_11_11{}; + bool uses_unpack_10_11_11{}; bool stores_tess_level_outer{}; bool stores_tess_level_inner{}; bool translation_failed{}; // indicates that shader has unsupported instructions @@ -246,8 +233,7 @@ struct Info { } void AddBindings(Backend::Bindings& bnd) const { - const auto total_buffers = - buffers.size() + texture_buffers.size() + (has_readconst ? 1 : 0); + const auto total_buffers = buffers.size() + (has_readconst ? 1 : 0); bnd.buffer += total_buffers; bnd.unified += total_buffers + images.size() + samplers.size(); bnd.user_data += ud_mask.NumRegs(); @@ -278,10 +264,6 @@ constexpr AmdGpu::Buffer BufferResource::GetSharp(const Info& info) const noexce return inline_cbuf ? inline_cbuf : info.ReadUdSharp(sharp_idx); } -constexpr AmdGpu::Buffer TextureBufferResource::GetSharp(const Info& info) const noexcept { - return info.ReadUdSharp(sharp_idx); -} - constexpr AmdGpu::Image ImageResource::GetSharp(const Info& info) const noexcept { const auto image = info.ReadUdSharp(sharp_idx); if (!image.Valid()) { diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index ecbe1f838..7e3d0f937 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -370,8 +370,16 @@ U32 IREmitter::ReadConstBuffer(const Value& handle, const U32& index) { return Inst(Opcode::ReadConstBuffer, handle, index); } -Value IREmitter::LoadBuffer(int num_dwords, const Value& handle, const Value& address, - BufferInstInfo info) { +U32 IREmitter::LoadBufferU8(const Value& handle, const Value& address, BufferInstInfo info) { + return Inst(Opcode::LoadBufferU8, Flags{info}, handle, address); +} + +U32 IREmitter::LoadBufferU16(const Value& handle, const Value& address, BufferInstInfo info) { + return Inst(Opcode::LoadBufferU16, Flags{info}, handle, address); +} + +Value IREmitter::LoadBufferU32(int num_dwords, const Value& handle, const Value& address, + BufferInstInfo info) { switch (num_dwords) { case 1: return Inst(Opcode::LoadBufferU32, Flags{info}, handle, address); @@ -386,12 +394,38 @@ Value IREmitter::LoadBuffer(int num_dwords, const Value& handle, const Value& ad } } +Value IREmitter::LoadBufferF32(int num_dwords, const Value& handle, const Value& address, + BufferInstInfo info) { + switch (num_dwords) { + case 1: + return Inst(Opcode::LoadBufferF32, Flags{info}, handle, address); + case 2: + return Inst(Opcode::LoadBufferF32x2, Flags{info}, handle, address); + case 3: + return Inst(Opcode::LoadBufferF32x3, Flags{info}, handle, address); + case 4: + return Inst(Opcode::LoadBufferF32x4, Flags{info}, handle, address); + default: + UNREACHABLE_MSG("Invalid number of dwords {}", num_dwords); + } +} + Value IREmitter::LoadBufferFormat(const Value& handle, const Value& address, BufferInstInfo info) { return Inst(Opcode::LoadBufferFormatF32, Flags{info}, handle, address); } -void IREmitter::StoreBuffer(int num_dwords, const Value& handle, const Value& address, - const Value& data, BufferInstInfo info) { +void IREmitter::StoreBufferU8(const Value& handle, const Value& address, const U32& data, + BufferInstInfo info) { + Inst(Opcode::StoreBufferU8, Flags{info}, handle, address, data); +} + +void IREmitter::StoreBufferU16(const Value& handle, const Value& address, const U32& data, + BufferInstInfo info) { + Inst(Opcode::StoreBufferU16, Flags{info}, handle, address, data); +} + +void IREmitter::StoreBufferU32(int num_dwords, const Value& handle, const Value& address, + const Value& data, BufferInstInfo info) { switch (num_dwords) { case 1: Inst(Opcode::StoreBufferU32, Flags{info}, handle, address, data); @@ -410,6 +444,31 @@ void IREmitter::StoreBuffer(int num_dwords, const Value& handle, const Value& ad } } +void IREmitter::StoreBufferF32(int num_dwords, const Value& handle, const Value& address, + const Value& data, BufferInstInfo info) { + switch (num_dwords) { + case 1: + Inst(Opcode::StoreBufferF32, Flags{info}, handle, address, data); + break; + case 2: + Inst(Opcode::StoreBufferF32x2, Flags{info}, handle, address, data); + break; + case 3: + Inst(Opcode::StoreBufferF32x3, Flags{info}, handle, address, data); + break; + case 4: + Inst(Opcode::StoreBufferF32x4, Flags{info}, handle, address, data); + break; + default: + UNREACHABLE_MSG("Invalid number of dwords {}", num_dwords); + } +} + +void IREmitter::StoreBufferFormat(const Value& handle, const Value& address, const Value& data, + BufferInstInfo info) { + Inst(Opcode::StoreBufferFormatF32, Flags{info}, handle, address, data); +} + Value IREmitter::BufferAtomicIAdd(const Value& handle, const Value& address, const Value& value, BufferInstInfo info) { return Inst(Opcode::BufferAtomicIAdd32, Flags{info}, handle, address, value); @@ -457,11 +516,6 @@ Value IREmitter::BufferAtomicSwap(const Value& handle, const Value& address, con return Inst(Opcode::BufferAtomicSwap32, Flags{info}, handle, address, value); } -void IREmitter::StoreBufferFormat(const Value& handle, const Value& address, const Value& data, - BufferInstInfo info) { - Inst(Opcode::StoreBufferFormatF32, Flags{info}, handle, address, data); -} - U32 IREmitter::DataAppend(const U32& counter) { return Inst(Opcode::DataAppend, counter, Imm32(0)); } @@ -527,10 +581,14 @@ Value IREmitter::CompositeConstruct(const Value& e1, const Value& e2) { switch (e1.Type()) { case Type::U32: return Inst(Opcode::CompositeConstructU32x2, e1, e2); + case Type::U32x2: + return Inst(Opcode::CompositeConstructU32x2x2, e1, e2); case Type::F16: return Inst(Opcode::CompositeConstructF16x2, e1, e2); case Type::F32: return Inst(Opcode::CompositeConstructF32x2, e1, e2); + case Type::F32x2: + return Inst(Opcode::CompositeConstructF32x2x2, e1, e2); case Type::F64: return Inst(Opcode::CompositeConstructF64x2, e1, e2); default: @@ -779,52 +837,116 @@ F64 IREmitter::PackFloat2x32(const Value& vector) { return Inst(Opcode::PackFloat2x32, vector); } -U32 IREmitter::PackFloat2x16(const Value& vector) { - return Inst(Opcode::PackFloat2x16, vector); +U32 IREmitter::Pack2x16(const AmdGpu::NumberFormat number_format, const Value& vector) { + switch (number_format) { + case AmdGpu::NumberFormat::Unorm: + return Inst(Opcode::PackUnorm2x16, vector); + case AmdGpu::NumberFormat::Snorm: + return Inst(Opcode::PackSnorm2x16, vector); + case AmdGpu::NumberFormat::Uint: + return Inst(Opcode::PackUint2x16, vector); + case AmdGpu::NumberFormat::Sint: + return Inst(Opcode::PackSint2x16, vector); + case AmdGpu::NumberFormat::Float: + return Inst(Opcode::PackHalf2x16, vector); + default: + UNREACHABLE_MSG("Unsupported 2x16 number format: {}", number_format); + } } -Value IREmitter::UnpackFloat2x16(const U32& value) { - return Inst(Opcode::UnpackFloat2x16, value); +Value IREmitter::Unpack2x16(const AmdGpu::NumberFormat number_format, const U32& value) { + switch (number_format) { + case AmdGpu::NumberFormat::Unorm: + return Inst(Opcode::UnpackUnorm2x16, value); + case AmdGpu::NumberFormat::Snorm: + return Inst(Opcode::UnpackSnorm2x16, value); + case AmdGpu::NumberFormat::Uint: + return Inst(Opcode::UnpackUint2x16, value); + case AmdGpu::NumberFormat::Sint: + return Inst(Opcode::UnpackSint2x16, value); + case AmdGpu::NumberFormat::Float: + return Inst(Opcode::UnpackHalf2x16, value); + default: + UNREACHABLE_MSG("Unsupported 2x16 number format: {}", number_format); + } } -U32 IREmitter::PackHalf2x16(const Value& vector) { - return Inst(Opcode::PackHalf2x16, vector); +U32 IREmitter::Pack4x8(const AmdGpu::NumberFormat number_format, const Value& vector) { + switch (number_format) { + case AmdGpu::NumberFormat::Unorm: + return Inst(Opcode::PackUnorm4x8, vector); + case AmdGpu::NumberFormat::Snorm: + return Inst(Opcode::PackSnorm4x8, vector); + case AmdGpu::NumberFormat::Uint: + return Inst(Opcode::PackUint4x8, vector); + case AmdGpu::NumberFormat::Sint: + return Inst(Opcode::PackSint4x8, vector); + default: + UNREACHABLE_MSG("Unsupported 4x8 number format: {}", number_format); + } } -Value IREmitter::UnpackHalf2x16(const U32& value) { - return Inst(Opcode::UnpackHalf2x16, value); +Value IREmitter::Unpack4x8(const AmdGpu::NumberFormat number_format, const U32& value) { + switch (number_format) { + case AmdGpu::NumberFormat::Unorm: + return Inst(Opcode::UnpackUnorm4x8, value); + case AmdGpu::NumberFormat::Snorm: + return Inst(Opcode::UnpackSnorm4x8, value); + case AmdGpu::NumberFormat::Uint: + return Inst(Opcode::UnpackUint4x8, value); + case AmdGpu::NumberFormat::Sint: + return Inst(Opcode::UnpackSint4x8, value); + default: + UNREACHABLE_MSG("Unsupported 4x8 number format: {}", number_format); + } } -U32 IREmitter::PackUnorm2x16(const Value& vector) { - return Inst(Opcode::PackUnorm2x16, vector); +U32 IREmitter::Pack10_11_11(const AmdGpu::NumberFormat number_format, const Value& vector) { + switch (number_format) { + case AmdGpu::NumberFormat::Float: + return Inst(Opcode::PackUfloat10_11_11, vector); + default: + UNREACHABLE_MSG("Unsupported 10_11_11 number format: {}", number_format); + } } -Value IREmitter::UnpackUnorm2x16(const U32& value) { - return Inst(Opcode::UnpackUnorm2x16, value); +U32 IREmitter::Pack2_10_10_10(const AmdGpu::NumberFormat number_format, const Value& vector) { + switch (number_format) { + case AmdGpu::NumberFormat::Unorm: + return Inst(Opcode::PackUnorm2_10_10_10, vector); + case AmdGpu::NumberFormat::Snorm: + return Inst(Opcode::PackSnorm2_10_10_10, vector); + case AmdGpu::NumberFormat::Uint: + return Inst(Opcode::PackUint2_10_10_10, vector); + case AmdGpu::NumberFormat::Sint: + return Inst(Opcode::PackSint2_10_10_10, vector); + default: + UNREACHABLE_MSG("Unsupported 2_10_10_10 number format: {}", number_format); + } } -U32 IREmitter::PackSnorm2x16(const Value& vector) { - return Inst(Opcode::PackSnorm2x16, vector); +Value IREmitter::Unpack2_10_10_10(const AmdGpu::NumberFormat number_format, const U32& value) { + switch (number_format) { + case AmdGpu::NumberFormat::Unorm: + return Inst(Opcode::UnpackUnorm2_10_10_10, value); + case AmdGpu::NumberFormat::Snorm: + return Inst(Opcode::UnpackSnorm2_10_10_10, value); + case AmdGpu::NumberFormat::Uint: + return Inst(Opcode::UnpackUint2_10_10_10, value); + case AmdGpu::NumberFormat::Sint: + return Inst(Opcode::UnpackSint2_10_10_10, value); + default: + UNREACHABLE_MSG("Unsupported 2_10_10_10 number format: {}", number_format); + } } -Value IREmitter::UnpackSnorm2x16(const U32& value) { - return Inst(Opcode::UnpackSnorm2x16, value); -} - -U32 IREmitter::PackUint2x16(const Value& value) { - return Inst(Opcode::PackUint2x16, value); -} - -Value IREmitter::UnpackUint2x16(const U32& value) { - return Inst(Opcode::UnpackUint2x16, value); -} - -U32 IREmitter::PackSint2x16(const Value& value) { - return Inst(Opcode::PackSint2x16, value); -} - -Value IREmitter::UnpackSint2x16(const U32& value) { - return Inst(Opcode::UnpackSint2x16, value); +Value IREmitter::Unpack10_11_11(const AmdGpu::NumberFormat number_format, const U32& value) { + switch (number_format) { + case AmdGpu::NumberFormat::Float: + return Inst(Opcode::UnpackUfloat10_11_11, value); + default: + UNREACHABLE_MSG("Unsupported 10_11_11 number format: {}", number_format); + } } F32F64 IREmitter::FPMul(const F32F64& a, const F32F64& b) { diff --git a/src/shader_recompiler/ir/ir_emitter.h b/src/shader_recompiler/ir/ir_emitter.h index 97b94187a..7ac75bf70 100644 --- a/src/shader_recompiler/ir/ir_emitter.h +++ b/src/shader_recompiler/ir/ir_emitter.h @@ -109,12 +109,22 @@ public: [[nodiscard]] U32 ReadConst(const Value& base, const U32& offset); [[nodiscard]] U32 ReadConstBuffer(const Value& handle, const U32& index); - [[nodiscard]] Value LoadBuffer(int num_dwords, const Value& handle, const Value& address, - BufferInstInfo info); + [[nodiscard]] U32 LoadBufferU8(const Value& handle, const Value& address, BufferInstInfo info); + [[nodiscard]] U32 LoadBufferU16(const Value& handle, const Value& address, BufferInstInfo info); + [[nodiscard]] Value LoadBufferU32(int num_dwords, const Value& handle, const Value& address, + BufferInstInfo info); + [[nodiscard]] Value LoadBufferF32(int num_dwords, const Value& handle, const Value& address, + BufferInstInfo info); [[nodiscard]] Value LoadBufferFormat(const Value& handle, const Value& address, BufferInstInfo info); - void StoreBuffer(int num_dwords, const Value& handle, const Value& address, const Value& data, - BufferInstInfo info); + void StoreBufferU8(const Value& handle, const Value& address, const U32& data, + BufferInstInfo info); + void StoreBufferU16(const Value& handle, const Value& address, const U32& data, + BufferInstInfo info); + void StoreBufferU32(int num_dwords, const Value& handle, const Value& address, + const Value& data, BufferInstInfo info); + void StoreBufferF32(int num_dwords, const Value& handle, const Value& address, + const Value& data, BufferInstInfo info); void StoreBufferFormat(const Value& handle, const Value& address, const Value& data, BufferInstInfo info); @@ -167,22 +177,19 @@ public: [[nodiscard]] U64 PackUint2x32(const Value& vector); [[nodiscard]] Value UnpackUint2x32(const U64& value); - [[nodiscard]] F64 PackFloat2x32(const Value& vector); - [[nodiscard]] U32 PackFloat2x16(const Value& vector); - [[nodiscard]] Value UnpackFloat2x16(const U32& value); + [[nodiscard]] U32 Pack2x16(AmdGpu::NumberFormat number_format, const Value& vector); + [[nodiscard]] Value Unpack2x16(AmdGpu::NumberFormat number_format, const U32& value); - [[nodiscard]] U32 PackHalf2x16(const Value& vector); - [[nodiscard]] Value UnpackHalf2x16(const U32& value); - [[nodiscard]] U32 PackUnorm2x16(const Value& vector); - [[nodiscard]] Value UnpackUnorm2x16(const U32& value); - [[nodiscard]] U32 PackSnorm2x16(const Value& vector); - [[nodiscard]] Value UnpackSnorm2x16(const U32& value); - [[nodiscard]] U32 PackUint2x16(const Value& value); - [[nodiscard]] Value UnpackUint2x16(const U32& value); - [[nodiscard]] U32 PackSint2x16(const Value& value); - [[nodiscard]] Value UnpackSint2x16(const U32& value); + [[nodiscard]] U32 Pack4x8(AmdGpu::NumberFormat number_format, const Value& vector); + [[nodiscard]] Value Unpack4x8(AmdGpu::NumberFormat number_format, const U32& value); + + [[nodiscard]] U32 Pack10_11_11(AmdGpu::NumberFormat number_format, const Value& vector); + [[nodiscard]] Value Unpack10_11_11(AmdGpu::NumberFormat number_format, const U32& value); + + [[nodiscard]] U32 Pack2_10_10_10(AmdGpu::NumberFormat number_format, const Value& vector); + [[nodiscard]] Value Unpack2_10_10_10(AmdGpu::NumberFormat number_format, const U32& value); [[nodiscard]] F32F64 FPAdd(const F32F64& a, const F32F64& b); [[nodiscard]] F32F64 FPSub(const F32F64& a, const F32F64& b); diff --git a/src/shader_recompiler/ir/microinstruction.cpp b/src/shader_recompiler/ir/microinstruction.cpp index 6e7bbe661..fdbc019e3 100644 --- a/src/shader_recompiler/ir/microinstruction.cpp +++ b/src/shader_recompiler/ir/microinstruction.cpp @@ -54,10 +54,16 @@ bool Inst::MayHaveSideEffects() const noexcept { case Opcode::SetAttribute: case Opcode::SetTcsGenericAttribute: case Opcode::SetPatch: + case Opcode::StoreBufferU8: + case Opcode::StoreBufferU16: case Opcode::StoreBufferU32: case Opcode::StoreBufferU32x2: case Opcode::StoreBufferU32x3: case Opcode::StoreBufferU32x4: + case Opcode::StoreBufferF32: + case Opcode::StoreBufferF32x2: + case Opcode::StoreBufferF32x3: + case Opcode::StoreBufferF32x4: case Opcode::StoreBufferFormatF32: case Opcode::BufferAtomicIAdd32: case Opcode::BufferAtomicSMin32: diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index 6750be5a6..0d87430d2 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -90,15 +90,27 @@ OPCODE(UndefU32, U32, OPCODE(UndefU64, U64, ) // Buffer operations +OPCODE(LoadBufferU8, U32, Opaque, Opaque, ) +OPCODE(LoadBufferU16, U32, Opaque, Opaque, ) OPCODE(LoadBufferU32, U32, Opaque, Opaque, ) OPCODE(LoadBufferU32x2, U32x2, Opaque, Opaque, ) OPCODE(LoadBufferU32x3, U32x3, Opaque, Opaque, ) OPCODE(LoadBufferU32x4, U32x4, Opaque, Opaque, ) +OPCODE(LoadBufferF32, F32, Opaque, Opaque, ) +OPCODE(LoadBufferF32x2, F32x2, Opaque, Opaque, ) +OPCODE(LoadBufferF32x3, F32x3, Opaque, Opaque, ) +OPCODE(LoadBufferF32x4, F32x4, Opaque, Opaque, ) OPCODE(LoadBufferFormatF32, F32x4, Opaque, Opaque, ) +OPCODE(StoreBufferU8, Void, Opaque, Opaque, U32, ) +OPCODE(StoreBufferU16, Void, Opaque, Opaque, U32, ) OPCODE(StoreBufferU32, Void, Opaque, Opaque, U32, ) OPCODE(StoreBufferU32x2, Void, Opaque, Opaque, U32x2, ) OPCODE(StoreBufferU32x3, Void, Opaque, Opaque, U32x3, ) OPCODE(StoreBufferU32x4, Void, Opaque, Opaque, U32x4, ) +OPCODE(StoreBufferF32, Void, Opaque, Opaque, F32, ) +OPCODE(StoreBufferF32x2, Void, Opaque, Opaque, F32x2, ) +OPCODE(StoreBufferF32x3, Void, Opaque, Opaque, F32x3, ) +OPCODE(StoreBufferF32x4, Void, Opaque, Opaque, F32x4, ) OPCODE(StoreBufferFormatF32, Void, Opaque, Opaque, F32x4, ) // Buffer atomic operations @@ -118,6 +130,7 @@ OPCODE(BufferAtomicSwap32, U32, Opaq OPCODE(CompositeConstructU32x2, U32x2, U32, U32, ) OPCODE(CompositeConstructU32x3, U32x3, U32, U32, U32, ) OPCODE(CompositeConstructU32x4, U32x4, U32, U32, U32, U32, ) +OPCODE(CompositeConstructU32x2x2, U32x4, U32x2, U32x2, ) OPCODE(CompositeExtractU32x2, U32, U32x2, U32, ) OPCODE(CompositeExtractU32x3, U32, U32x3, U32, ) OPCODE(CompositeExtractU32x4, U32, U32x4, U32, ) @@ -142,6 +155,7 @@ OPCODE(CompositeShuffleF16x4, F16x4, F16x OPCODE(CompositeConstructF32x2, F32x2, F32, F32, ) OPCODE(CompositeConstructF32x3, F32x3, F32, F32, F32, ) OPCODE(CompositeConstructF32x4, F32x4, F32, F32, F32, F32, ) +OPCODE(CompositeConstructF32x2x2, F32x4, F32x2, F32x2, ) OPCODE(CompositeExtractF32x2, F32, F32x2, U32, ) OPCODE(CompositeExtractF32x3, F32, F32x3, U32, ) OPCODE(CompositeExtractF32x4, F32, F32x4, U32, ) @@ -180,21 +194,42 @@ OPCODE(BitCastU64F64, U64, F64, OPCODE(BitCastF16U16, F16, U16, ) OPCODE(BitCastF32U32, F32, U32, ) OPCODE(BitCastF64U64, F64, U64, ) + OPCODE(PackUint2x32, U64, U32x2, ) OPCODE(UnpackUint2x32, U32x2, U64, ) OPCODE(PackFloat2x32, F64, F32x2, ) -OPCODE(PackFloat2x16, U32, F16x2, ) -OPCODE(UnpackFloat2x16, F16x2, U32, ) -OPCODE(PackHalf2x16, U32, F32x2, ) -OPCODE(UnpackHalf2x16, F32x2, U32, ) + OPCODE(PackUnorm2x16, U32, F32x2, ) OPCODE(UnpackUnorm2x16, F32x2, U32, ) OPCODE(PackSnorm2x16, U32, F32x2, ) OPCODE(UnpackSnorm2x16, F32x2, U32, ) -OPCODE(PackUint2x16, U32, U32x2, ) -OPCODE(UnpackUint2x16, U32x2, U32, ) -OPCODE(PackSint2x16, U32, U32x2, ) -OPCODE(UnpackSint2x16, U32x2, U32, ) +OPCODE(PackUint2x16, U32, F32x2, ) +OPCODE(UnpackUint2x16, F32x2, U32, ) +OPCODE(PackSint2x16, U32, F32x2, ) +OPCODE(UnpackSint2x16, F32x2, U32, ) +OPCODE(PackHalf2x16, U32, F32x2, ) +OPCODE(UnpackHalf2x16, F32x2, U32, ) + +OPCODE(PackUnorm4x8, U32, F32x4, ) +OPCODE(UnpackUnorm4x8, F32x4, U32, ) +OPCODE(PackSnorm4x8, U32, F32x4, ) +OPCODE(UnpackSnorm4x8, F32x4, U32, ) +OPCODE(PackUint4x8, U32, F32x4, ) +OPCODE(UnpackUint4x8, F32x4, U32, ) +OPCODE(PackSint4x8, U32, F32x4, ) +OPCODE(UnpackSint4x8, F32x4, U32, ) + +OPCODE(PackUfloat10_11_11, U32, F32x3, ) +OPCODE(UnpackUfloat10_11_11, F32x3, U32, ) + +OPCODE(PackUnorm2_10_10_10, U32, F32x4, ) +OPCODE(UnpackUnorm2_10_10_10, F32x4, U32, ) +OPCODE(PackSnorm2_10_10_10, U32, F32x4, ) +OPCODE(UnpackSnorm2_10_10_10, F32x4, U32, ) +OPCODE(PackUint2_10_10_10, U32, F32x4, ) +OPCODE(UnpackUint2_10_10_10, F32x4, U32, ) +OPCODE(PackSint2_10_10_10, U32, F32x4, ) +OPCODE(UnpackSint2_10_10_10, F32x4, U32, ) // Floating-point operations OPCODE(FPAbs32, F32, F32, ) diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp index c72b9e835..c8a4b13cb 100644 --- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp @@ -340,14 +340,7 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { return FoldBitCast(inst, IR::Opcode::BitCastU32F32); case IR::Opcode::BitCastU32F32: return FoldBitCast(inst, IR::Opcode::BitCastF32U32); - case IR::Opcode::PackHalf2x16: - return FoldInverseFunc(inst, IR::Opcode::UnpackHalf2x16); - case IR::Opcode::UnpackHalf2x16: - return FoldInverseFunc(inst, IR::Opcode::PackHalf2x16); - case IR::Opcode::PackFloat2x16: - return FoldInverseFunc(inst, IR::Opcode::UnpackFloat2x16); - case IR::Opcode::UnpackFloat2x16: - return FoldInverseFunc(inst, IR::Opcode::PackFloat2x16); + // 2x16 case IR::Opcode::PackUnorm2x16: return FoldInverseFunc(inst, IR::Opcode::UnpackUnorm2x16); case IR::Opcode::UnpackUnorm2x16: @@ -364,6 +357,49 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { return FoldInverseFunc(inst, IR::Opcode::UnpackSint2x16); case IR::Opcode::UnpackSint2x16: return FoldInverseFunc(inst, IR::Opcode::PackSint2x16); + case IR::Opcode::PackHalf2x16: + return FoldInverseFunc(inst, IR::Opcode::UnpackHalf2x16); + case IR::Opcode::UnpackHalf2x16: + return FoldInverseFunc(inst, IR::Opcode::PackHalf2x16); + // 4x8 + case IR::Opcode::PackUnorm4x8: + return FoldInverseFunc(inst, IR::Opcode::UnpackUnorm4x8); + case IR::Opcode::UnpackUnorm4x8: + return FoldInverseFunc(inst, IR::Opcode::PackUnorm4x8); + case IR::Opcode::PackSnorm4x8: + return FoldInverseFunc(inst, IR::Opcode::UnpackSnorm4x8); + case IR::Opcode::UnpackSnorm4x8: + return FoldInverseFunc(inst, IR::Opcode::PackSnorm4x8); + case IR::Opcode::PackUint4x8: + return FoldInverseFunc(inst, IR::Opcode::UnpackUint4x8); + case IR::Opcode::UnpackUint4x8: + return FoldInverseFunc(inst, IR::Opcode::PackUint4x8); + case IR::Opcode::PackSint4x8: + return FoldInverseFunc(inst, IR::Opcode::UnpackSint4x8); + case IR::Opcode::UnpackSint4x8: + return FoldInverseFunc(inst, IR::Opcode::PackSint4x8); + // 10_11_11 + case IR::Opcode::PackUfloat10_11_11: + return FoldInverseFunc(inst, IR::Opcode::UnpackUfloat10_11_11); + case IR::Opcode::UnpackUfloat10_11_11: + return FoldInverseFunc(inst, IR::Opcode::PackUfloat10_11_11); + // 2_10_10_10 + case IR::Opcode::PackUnorm2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::UnpackUnorm2_10_10_10); + case IR::Opcode::UnpackUnorm2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::PackUnorm2_10_10_10); + case IR::Opcode::PackSnorm2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::UnpackSnorm2_10_10_10); + case IR::Opcode::UnpackSnorm2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::PackSnorm2_10_10_10); + case IR::Opcode::PackUint2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::UnpackUint2_10_10_10); + case IR::Opcode::UnpackUint2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::PackUint2_10_10_10); + case IR::Opcode::PackSint2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::UnpackSint2_10_10_10); + case IR::Opcode::UnpackSint2_10_10_10: + return FoldInverseFunc(inst, IR::Opcode::PackSint2_10_10_10); case IR::Opcode::SelectU1: case IR::Opcode::SelectU8: case IR::Opcode::SelectU16: diff --git a/src/shader_recompiler/ir/passes/ir_passes.h b/src/shader_recompiler/ir/passes/ir_passes.h index 8a71d9e1f..0d6816ae0 100644 --- a/src/shader_recompiler/ir/passes/ir_passes.h +++ b/src/shader_recompiler/ir/passes/ir_passes.h @@ -19,6 +19,7 @@ void ConstantPropagationPass(IR::BlockList& program); void FlattenExtendedUserdataPass(IR::Program& program); void ResourceTrackingPass(IR::Program& program); void CollectShaderInfoPass(IR::Program& program); +void LowerBufferFormatToRaw(IR::Program& program); void LowerSharedMemToRegisters(IR::Program& program); void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info, Stage stage); diff --git a/src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp b/src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp new file mode 100644 index 000000000..b30b022f8 --- /dev/null +++ b/src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp @@ -0,0 +1,211 @@ +// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "shader_recompiler/info.h" +#include "shader_recompiler/ir/basic_block.h" +#include "shader_recompiler/ir/ir_emitter.h" +#include "shader_recompiler/ir/program.h" +#include "shader_recompiler/ir/reinterpret.h" +#include "video_core/amdgpu/resource.h" + +namespace Shader::Optimization { + +static bool IsBufferFormatLoad(const IR::Inst& inst) { + return inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32; +} + +static bool IsBufferFormatStore(const IR::Inst& inst) { + return inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32; +} + +static IR::Value LoadBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer, + const IR::Value handle, const IR::U32 address, + const IR::BufferInstInfo info) { + const auto data_fmt = buffer.GetDataFmt(); + const auto num_fmt = buffer.GetNumberFmt(); + const auto num_conv = buffer.GetNumberConversion(); + const auto num_components = AmdGpu::NumComponents(buffer.GetDataFmt()); + + IR::Value interpreted; + switch (data_fmt) { + case AmdGpu::DataFormat::FormatInvalid: + interpreted = ir.Imm32(0.f); + break; + case AmdGpu::DataFormat::Format8: { + const auto unpacked = ir.Unpack4x8(num_fmt, ir.LoadBufferU8(handle, address, info)); + interpreted = ir.CompositeExtract(unpacked, 0); + break; + } + case AmdGpu::DataFormat::Format8_8: { + const auto raw = ir.LoadBufferU16(handle, address, info); + const auto unpacked = ir.Unpack4x8(num_fmt, raw); + interpreted = ir.CompositeConstruct(ir.CompositeExtract(unpacked, 0), + ir.CompositeExtract(unpacked, 1)); + break; + } + case AmdGpu::DataFormat::Format8_8_8_8: + interpreted = ir.Unpack4x8(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + break; + case AmdGpu::DataFormat::Format16: { + const auto unpacked = ir.Unpack2x16(num_fmt, ir.LoadBufferU16(handle, address, info)); + interpreted = ir.CompositeExtract(unpacked, 0); + break; + } + case AmdGpu::DataFormat::Format16_16: + interpreted = ir.Unpack2x16(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + break; + case AmdGpu::DataFormat::Format10_11_11: + interpreted = + ir.Unpack10_11_11(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + break; + case AmdGpu::DataFormat::Format2_10_10_10: + interpreted = + ir.Unpack2_10_10_10(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + break; + case AmdGpu::DataFormat::Format16_16_16_16: { + const auto raw = ir.LoadBufferU32(2, handle, address, info); + interpreted = + ir.CompositeConstruct(ir.Unpack2x16(num_fmt, IR::U32{ir.CompositeExtract(raw, 0)}), + ir.Unpack2x16(num_fmt, IR::U32{ir.CompositeExtract(raw, 1)})); + break; + } + case AmdGpu::DataFormat::Format32: + case AmdGpu::DataFormat::Format32_32: + case AmdGpu::DataFormat::Format32_32_32: + case AmdGpu::DataFormat::Format32_32_32_32: { + ASSERT(num_fmt == AmdGpu::NumberFormat::Uint || num_fmt == AmdGpu::NumberFormat::Sint || + num_fmt == AmdGpu::NumberFormat::Float); + interpreted = ir.LoadBufferF32(num_components, handle, address, info); + break; + } + default: + UNREACHABLE_MSG("Unsupported buffer data format: {}", data_fmt); + } + + // Pad to 4 components and apply additional modifications. + boost::container::static_vector components; + for (u32 i = 0; i < 4; i++) { + if (i < num_components) { + const auto component = + IR::F32{num_components == 1 ? interpreted : ir.CompositeExtract(interpreted, i)}; + components.push_back(ApplyReadNumberConversion(ir, component, num_conv)); + } else { + components.push_back(ir.Imm32(0.f)); + } + } + const auto swizzled = ApplySwizzle(ir, ir.CompositeConstruct(components), buffer.DstSelect()); + return swizzled; +} + +static void StoreBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer, + const IR::Value handle, const IR::U32 address, const IR::Value& value, + const IR::BufferInstInfo info) { + const auto data_fmt = buffer.GetDataFmt(); + const auto num_fmt = buffer.GetNumberFmt(); + const auto num_conv = buffer.GetNumberConversion(); + const auto num_components = AmdGpu::NumComponents(buffer.GetDataFmt()); + + // Extract actual number of components and apply additional modifications. + const auto swizzled = ApplySwizzle(ir, value, buffer.DstSelect().Inverse()); + boost::container::static_vector components; + for (u32 i = 0; i < num_components; i++) { + const auto component = IR::F32{ir.CompositeExtract(swizzled, i)}; + components.push_back(ApplyWriteNumberConversion(ir, component, num_conv)); + } + const auto real_value = + components.size() == 1 ? components[0] : ir.CompositeConstruct(components); + + switch (data_fmt) { + case AmdGpu::DataFormat::FormatInvalid: + break; + case AmdGpu::DataFormat::Format8: { + const auto packed = + ir.Pack4x8(num_fmt, ir.CompositeConstruct(real_value, ir.Imm32(0.f), ir.Imm32(0.f), + ir.Imm32(0.f))); + ir.StoreBufferU8(handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format8_8: { + const auto packed = + ir.Pack4x8(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 0), + ir.CompositeExtract(real_value, 1), + ir.Imm32(0.f), ir.Imm32(0.f))); + ir.StoreBufferU16(handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format8_8_8_8: { + auto packed = ir.Pack4x8(num_fmt, real_value); + ir.StoreBufferU32(1, handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format16: { + const auto packed = ir.Pack2x16(num_fmt, ir.CompositeConstruct(real_value, ir.Imm32(0.f))); + ir.StoreBufferU16(handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format16_16: { + const auto packed = ir.Pack2x16(num_fmt, real_value); + ir.StoreBufferU32(1, handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format10_11_11: { + const auto packed = ir.Pack10_11_11(num_fmt, real_value); + ir.StoreBufferU32(1, handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format2_10_10_10: { + const auto packed = ir.Pack2_10_10_10(num_fmt, real_value); + ir.StoreBufferU32(1, handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format16_16_16_16: { + const auto packed = ir.CompositeConstruct( + ir.Pack2x16(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 0), + ir.CompositeExtract(real_value, 1))), + ir.Pack2x16(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 2), + ir.CompositeExtract(real_value, 3)))); + ir.StoreBufferU32(2, handle, address, packed, info); + break; + } + case AmdGpu::DataFormat::Format32: + case AmdGpu::DataFormat::Format32_32: + case AmdGpu::DataFormat::Format32_32_32: + case AmdGpu::DataFormat::Format32_32_32_32: { + ASSERT(num_fmt == AmdGpu::NumberFormat::Uint || num_fmt == AmdGpu::NumberFormat::Sint || + num_fmt == AmdGpu::NumberFormat::Float); + ir.StoreBufferF32(num_components, handle, address, real_value, info); + break; + } + default: + UNREACHABLE_MSG("Unsupported buffer data format: {}", data_fmt); + } +} + +static void LowerBufferFormatInst(IR::Block& block, IR::Inst& inst, Info& info) { + IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + const auto desc{info.buffers[inst.Arg(0).U32()]}; + const auto buffer{desc.GetSharp(info)}; + + if (IsBufferFormatLoad(inst)) { + const auto interpreted = LoadBufferFormat(ir, buffer, inst.Arg(0), IR::U32{inst.Arg(1)}, + inst.Flags()); + inst.ReplaceUsesWithAndRemove(interpreted); + } else if (IsBufferFormatStore(inst)) { + StoreBufferFormat(ir, buffer, inst.Arg(0), IR::U32{inst.Arg(1)}, inst.Arg(2), + inst.Flags()); + inst.Invalidate(); + } +} + +void LowerBufferFormatToRaw(IR::Program& program) { + auto& info = program.info; + for (IR::Block* const block : program.blocks) { + for (IR::Inst& inst : block->Instructions()) { + if (IsBufferFormatLoad(inst) || IsBufferFormatStore(inst)) { + LowerBufferFormatInst(*block, inst, info); + } + } + } +} + +} // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index c5f98e5b9..029558d9e 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -1,8 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include #include "shader_recompiler/info.h" #include "shader_recompiler/ir/basic_block.h" #include "shader_recompiler/ir/breadth_first_search.h" @@ -37,10 +35,17 @@ bool IsBufferAtomic(const IR::Inst& inst) { bool IsBufferStore(const IR::Inst& inst) { switch (inst.GetOpcode()) { + case IR::Opcode::StoreBufferU8: + case IR::Opcode::StoreBufferU16: case IR::Opcode::StoreBufferU32: case IR::Opcode::StoreBufferU32x2: case IR::Opcode::StoreBufferU32x3: case IR::Opcode::StoreBufferU32x4: + case IR::Opcode::StoreBufferF32: + case IR::Opcode::StoreBufferF32x2: + case IR::Opcode::StoreBufferF32x3: + case IR::Opcode::StoreBufferF32x4: + case IR::Opcode::StoreBufferFormatF32: return true; default: return IsBufferAtomic(inst); @@ -49,10 +54,17 @@ bool IsBufferStore(const IR::Inst& inst) { bool IsBufferInstruction(const IR::Inst& inst) { switch (inst.GetOpcode()) { + case IR::Opcode::LoadBufferU8: + case IR::Opcode::LoadBufferU16: case IR::Opcode::LoadBufferU32: case IR::Opcode::LoadBufferU32x2: case IR::Opcode::LoadBufferU32x3: case IR::Opcode::LoadBufferU32x4: + case IR::Opcode::LoadBufferF32: + case IR::Opcode::LoadBufferF32x2: + case IR::Opcode::LoadBufferF32x3: + case IR::Opcode::LoadBufferF32x4: + case IR::Opcode::LoadBufferFormatF32: case IR::Opcode::ReadConstBuffer: return true; default: @@ -65,34 +77,6 @@ bool IsDataRingInstruction(const IR::Inst& inst) { inst.GetOpcode() == IR::Opcode::DataConsume; } -bool IsTextureBufferInstruction(const IR::Inst& inst) { - return inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32 || - inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32; -} - -bool UseFP16(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat num_format) { - switch (num_format) { - case AmdGpu::NumberFormat::Float: - switch (data_format) { - case AmdGpu::DataFormat::Format16: - case AmdGpu::DataFormat::Format16_16: - case AmdGpu::DataFormat::Format16_16_16_16: - return true; - default: - return false; - } - case AmdGpu::NumberFormat::Unorm: - case AmdGpu::NumberFormat::Snorm: - case AmdGpu::NumberFormat::Uscaled: - case AmdGpu::NumberFormat::Sscaled: - case AmdGpu::NumberFormat::Uint: - case AmdGpu::NumberFormat::Sint: - case AmdGpu::NumberFormat::SnormNz: - default: - return false; - } -} - IR::Type BufferDataType(const IR::Inst& inst, AmdGpu::NumberFormat num_format) { return IR::Type::U32; } @@ -132,8 +116,7 @@ bool IsImageInstruction(const IR::Inst& inst) { class Descriptors { public: explicit Descriptors(Info& info_) - : info{info_}, buffer_resources{info_.buffers}, - texture_buffer_resources{info_.texture_buffers}, image_resources{info_.images}, + : info{info_}, buffer_resources{info_.buffers}, image_resources{info_.images}, sampler_resources{info_.samplers}, fmask_resources(info_.fmasks) {} u32 Add(const BufferResource& desc) { @@ -147,15 +130,7 @@ public: auto& buffer = buffer_resources[index]; buffer.used_types |= desc.used_types; buffer.is_written |= desc.is_written; - return index; - } - - u32 Add(const TextureBufferResource& desc) { - const u32 index{Add(texture_buffer_resources, desc, [&desc](const auto& existing) { - return desc.sharp_idx == existing.sharp_idx; - })}; - auto& buffer = texture_buffer_resources[index]; - buffer.is_written |= desc.is_written; + buffer.is_formatted |= desc.is_formatted; return index; } @@ -196,7 +171,6 @@ private: const Info& info; BufferResourceList& buffer_resources; - TextureBufferResourceList& texture_buffer_resources; ImageResourceList& image_resources; SamplerResourceList& sampler_resources; FMaskResourceList& fmask_resources; @@ -313,6 +287,8 @@ void PatchBufferSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& .sharp_idx = sharp, .used_types = BufferDataType(inst, buffer.GetNumberFmt()), .is_written = IsBufferStore(inst), + .is_formatted = inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32 || + inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32, }); } @@ -321,21 +297,6 @@ void PatchBufferSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& inst.SetArg(0, ir.Imm32(binding)); } -void PatchTextureBufferSharp(IR::Block& block, IR::Inst& inst, Info& info, - Descriptors& descriptors) { - const IR::Inst* handle = inst.Arg(0).InstRecursive(); - const IR::Inst* producer = handle->Arg(0).InstRecursive(); - const auto sharp = TrackSharp(producer, info); - const s32 binding = descriptors.Add(TextureBufferResource{ - .sharp_idx = sharp, - .is_written = inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32, - }); - - // Replace handle with binding index in texture buffer resource list. - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - inst.SetArg(0, ir.Imm32(binding)); -} - void PatchImageSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& descriptors) { const auto pred = [](const IR::Inst* inst) -> std::optional { const auto opcode = inst->GetOpcode(); @@ -553,36 +514,6 @@ void PatchBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { inst.SetArg(1, CalculateBufferAddress(ir, inst, info, buffer, buffer.stride)); } -void PatchTextureBufferArgs(IR::Block& block, IR::Inst& inst, Info& info) { - const auto handle = inst.Arg(0); - const auto buffer_res = info.texture_buffers[handle.U32()]; - const auto buffer = buffer_res.GetSharp(info); - - // Only linear addressing with index is supported currently, since we cannot yet - // address with sub-texel granularity. - const auto inst_info = inst.Flags(); - ASSERT_MSG(!buffer.swizzle_enable && !inst_info.offset_enable && inst_info.inst_offset == 0, - "Unsupported texture buffer address mode."); - - IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; - // Stride of 1 to get an index into formatted data. See above addressing limitations. - inst.SetArg(1, CalculateBufferAddress(ir, inst, info, buffer, 1U)); - - if (inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32) { - const auto swizzled = ApplySwizzle(ir, inst.Arg(2), buffer.DstSelect().Inverse()); - const auto converted = - ApplyWriteNumberConversionVec4(ir, swizzled, buffer.GetNumberConversion()); - inst.SetArg(2, converted); - } else if (inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32) { - const auto inst_info = inst.Flags(); - const auto texel = ir.LoadBufferFormat(inst.Arg(0), inst.Arg(1), inst_info); - const auto swizzled = ApplySwizzle(ir, texel, buffer.DstSelect()); - const auto converted = - ApplyReadNumberConversionVec4(ir, swizzled, buffer.GetNumberConversion()); - inst.ReplaceUsesWith(converted); - } -} - IR::Value FixCubeCoords(IR::IREmitter& ir, const AmdGpu::Image& image, const IR::Value& x, const IR::Value& y, const IR::Value& face) { if (!image.IsCube()) { @@ -861,8 +792,6 @@ void ResourceTrackingPass(IR::Program& program) { for (IR::Inst& inst : block->Instructions()) { if (IsBufferInstruction(inst)) { PatchBufferSharp(*block, inst, info, descriptors); - } else if (IsTextureBufferInstruction(inst)) { - PatchTextureBufferSharp(*block, inst, info, descriptors); } else if (IsImageInstruction(inst)) { PatchImageSharp(*block, inst, info, descriptors); } else if (IsDataRingInstruction(inst)) { @@ -876,8 +805,6 @@ void ResourceTrackingPass(IR::Program& program) { for (IR::Inst& inst : block->Instructions()) { if (IsBufferInstruction(inst)) { PatchBufferArgs(*block, inst, info); - } else if (IsTextureBufferInstruction(inst)) { - PatchTextureBufferArgs(*block, inst, info); } else if (IsImageInstruction(inst)) { PatchImageArgs(*block, inst, info); } diff --git a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp index 7fd5b75ff..f3a1fc9a8 100644 --- a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp +++ b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp @@ -50,12 +50,6 @@ void Visit(Info& info, const IR::Inst& inst) { case IR::Opcode::ImageWrite: info.has_storage_images = true; break; - case IR::Opcode::LoadBufferFormatF32: - info.has_texel_buffers = true; - break; - case IR::Opcode::StoreBufferFormatF32: - info.has_image_buffers = true; - break; case IR::Opcode::QuadShuffle: info.uses_group_quad = true; break; @@ -82,6 +76,12 @@ void Visit(Info& info, const IR::Inst& inst) { case IR::Opcode::ReadConst: info.has_readconst = true; break; + case IR::Opcode::PackUfloat10_11_11: + info.uses_pack_10_11_11 = true; + break; + case IR::Opcode::UnpackUfloat10_11_11: + info.uses_unpack_10_11_11 = true; + break; default: break; } diff --git a/src/shader_recompiler/recompiler.cpp b/src/shader_recompiler/recompiler.cpp index 01518ab8f..a9f7aeb40 100644 --- a/src/shader_recompiler/recompiler.cpp +++ b/src/shader_recompiler/recompiler.cpp @@ -88,6 +88,7 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::FlattenExtendedUserdataPass(program); Shader::Optimization::ResourceTrackingPass(program); + Shader::Optimization::LowerBufferFormatToRaw(program); Shader::Optimization::IdentityRemovalPass(program.blocks); Shader::Optimization::DeadCodeEliminationPass(program); Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index 2083d11a9..4328193b5 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -19,30 +19,30 @@ struct VsAttribSpecialization { }; struct BufferSpecialization { - u16 stride : 14; - u16 is_storage : 1; - u16 swizzle_enable : 1; - u8 index_stride : 2 = 0; - u8 element_size : 2 = 0; + u32 stride : 14; + u32 is_storage : 1; + u32 is_formatted : 1; + u32 swizzle_enable : 1; + u32 data_format : 6; + u32 num_format : 4; + u32 index_stride : 2; + u32 element_size : 2; u32 size = 0; + AmdGpu::CompMapping dst_select{}; + AmdGpu::NumberConversion num_conversion{}; bool operator==(const BufferSpecialization& other) const { return stride == other.stride && is_storage == other.is_storage && - swizzle_enable == other.swizzle_enable && + is_formatted == other.is_formatted && swizzle_enable == other.swizzle_enable && + (!is_formatted || + (data_format == other.data_format && num_format == other.num_format && + dst_select == other.dst_select && num_conversion == other.num_conversion)) && (!swizzle_enable || (index_stride == other.index_stride && element_size == other.element_size)) && (size >= other.is_storage || is_storage); } }; -struct TextureBufferSpecialization { - bool is_integer = false; - AmdGpu::CompMapping dst_select{}; - AmdGpu::NumberConversion num_conversion{}; - - auto operator<=>(const TextureBufferSpecialization&) const = default; -}; - struct ImageSpecialization { AmdGpu::ImageType type = AmdGpu::ImageType::Color2D; bool is_integer = false; @@ -82,7 +82,6 @@ struct StageSpecialization { boost::container::small_vector vs_attribs; std::bitset bitset{}; boost::container::small_vector buffers; - boost::container::small_vector tex_buffers; boost::container::small_vector images; boost::container::small_vector fmasks; boost::container::small_vector samplers; @@ -111,7 +110,14 @@ struct StageSpecialization { [](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { spec.stride = sharp.GetStride(); spec.is_storage = desc.IsStorage(sharp); + spec.is_formatted = desc.is_formatted; spec.swizzle_enable = sharp.swizzle_enable; + if (spec.is_formatted) { + spec.data_format = static_cast(sharp.GetDataFmt()); + spec.num_format = static_cast(sharp.GetNumberFmt()); + spec.dst_select = sharp.DstSelect(); + spec.num_conversion = sharp.GetNumberConversion(); + } if (spec.swizzle_enable) { spec.index_stride = sharp.index_stride; spec.element_size = sharp.element_size; @@ -120,12 +126,6 @@ struct StageSpecialization { spec.size = sharp.GetSize(); } }); - ForEachSharp(binding, tex_buffers, info->texture_buffers, - [](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { - spec.is_integer = AmdGpu::IsInteger(sharp.GetNumberFmt()); - spec.dst_select = sharp.DstSelect(); - spec.num_conversion = sharp.GetNumberConversion(); - }); ForEachSharp(binding, images, info->images, [](auto& spec, const auto& desc, AmdGpu::Image sharp) { spec.type = sharp.GetViewType(desc.is_array); @@ -217,11 +217,6 @@ struct StageSpecialization { return false; } } - for (u32 i = 0; i < tex_buffers.size(); i++) { - if (other.bitset[binding++] && tex_buffers[i] != other.tex_buffers[i]) { - return false; - } - } for (u32 i = 0; i < images.size(); i++) { if (other.bitset[binding++] && images[i] != other.images[i]) { return false; diff --git a/src/video_core/buffer_cache/buffer.cpp b/src/video_core/buffer_cache/buffer.cpp index a8d1271c6..15ef746cd 100644 --- a/src/video_core/buffer_cache/buffer.cpp +++ b/src/video_core/buffer_cache/buffer.cpp @@ -95,8 +95,7 @@ Buffer::Buffer(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, // Create buffer object. const vk::BufferCreateInfo buffer_ci = { .size = size_bytes, - // When maintenance5 is not supported, use all flags since we can't add flags to views. - .usage = instance->IsMaintenance5Supported() ? flags : AllFlags, + .usage = flags, }; VmaAllocationInfo alloc_info{}; buffer.Create(buffer_ci, usage, &alloc_info); @@ -113,29 +112,6 @@ Buffer::Buffer(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, is_coherent = property_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; } -vk::BufferView Buffer::View(u32 offset, u32 size, bool is_written, AmdGpu::DataFormat dfmt, - AmdGpu::NumberFormat nfmt) { - const vk::BufferUsageFlags2CreateInfoKHR usage_flags = { - .usage = is_written ? vk::BufferUsageFlagBits2KHR::eStorageTexelBuffer - : vk::BufferUsageFlagBits2KHR::eUniformTexelBuffer, - }; - const vk::BufferViewCreateInfo view_ci = { - .pNext = instance->IsMaintenance5Supported() ? &usage_flags : nullptr, - .buffer = buffer.buffer, - .format = Vulkan::LiverpoolToVK::SurfaceFormat(dfmt, nfmt), - .offset = offset, - .range = size, - }; - const auto [view_result, view] = instance->GetDevice().createBufferView(view_ci); - ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create buffer view: {}", - vk::to_string(view_result)); - scheduler->DeferOperation( - [view, device = instance->GetDevice()] { device.destroyBufferView(view); }); - Vulkan::SetObjectName(instance->GetDevice(), view, "BufferView {:#x}:{:#x}", cpu_addr + offset, - size); - return view; -} - constexpr u64 WATCHES_INITIAL_RESERVE = 0x4000; constexpr u64 WATCHES_RESERVE_CHUNK = 0x1000; diff --git a/src/video_core/buffer_cache/buffer.h b/src/video_core/buffer_cache/buffer.h index 63391a180..ec92a0ebf 100644 --- a/src/video_core/buffer_cache/buffer.h +++ b/src/video_core/buffer_cache/buffer.h @@ -32,13 +32,12 @@ enum class MemoryUsage { }; constexpr vk::BufferUsageFlags ReadFlags = - vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eUniformTexelBuffer | - vk::BufferUsageFlagBits::eUniformBuffer | vk::BufferUsageFlagBits::eIndexBuffer | - vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eIndirectBuffer; + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eUniformBuffer | + vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eVertexBuffer | + vk::BufferUsageFlagBits::eIndirectBuffer; -constexpr vk::BufferUsageFlags AllFlags = ReadFlags | vk::BufferUsageFlagBits::eTransferDst | - vk::BufferUsageFlagBits::eStorageTexelBuffer | - vk::BufferUsageFlagBits::eStorageBuffer; +constexpr vk::BufferUsageFlags AllFlags = + ReadFlags | vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eStorageBuffer; struct UniqueBuffer { explicit UniqueBuffer(vk::Device device, VmaAllocator allocator); @@ -83,9 +82,6 @@ public: Buffer& operator=(Buffer&&) = default; Buffer(Buffer&&) = default; - vk::BufferView View(u32 offset, u32 size, bool is_written, AmdGpu::DataFormat dfmt, - AmdGpu::NumberFormat nfmt); - /// Increases the likeliness of this being a stream buffer void IncreaseStreamScore(int score) noexcept { stream_score += score; diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 59a0802bb..5c02ef39f 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -352,12 +352,9 @@ vk::ComponentMapping ComponentMapping(AmdGpu::CompMapping comp_mapping) { }; } -static constexpr vk::FormatFeatureFlags2 BufferRead = - vk::FormatFeatureFlagBits2::eUniformTexelBuffer | vk::FormatFeatureFlagBits2::eVertexBuffer; -static constexpr vk::FormatFeatureFlags2 BufferWrite = - vk::FormatFeatureFlagBits2::eStorageTexelBuffer | - vk::FormatFeatureFlagBits2::eStorageReadWithoutFormat | - vk::FormatFeatureFlagBits2::eStorageWriteWithoutFormat; +// Texel buffer feature flags are not needed as format is interpreted in-shader. +static constexpr vk::FormatFeatureFlags2 BufferRead = vk::FormatFeatureFlagBits2::eVertexBuffer; +static constexpr vk::FormatFeatureFlags2 BufferWrite = static_cast(0); static constexpr vk::FormatFeatureFlags2 ImageRead = vk::FormatFeatureFlagBits2::eTransferSrc | vk::FormatFeatureFlagBits2::eTransferDst | vk::FormatFeatureFlagBits2::eSampledImage; diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index afa598fca..0832f65a2 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -55,15 +55,6 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler .stageFlags = vk::ShaderStageFlagBits::eCompute, }); } - for (const auto& tex_buffer : info->texture_buffers) { - bindings.push_back({ - .binding = binding++, - .descriptorType = tex_buffer.is_written ? vk::DescriptorType::eStorageTexelBuffer - : vk::DescriptorType::eUniformTexelBuffer, - .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eCompute, - }); - } for (const auto& image : info->images) { bindings.push_back({ .binding = binding++, diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 330a8ab7f..588754c00 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -375,15 +375,6 @@ void GraphicsPipeline::BuildDescSetLayout() { .stageFlags = gp_stage_flags, }); } - for (const auto& tex_buffer : stage->texture_buffers) { - bindings.push_back({ - .binding = binding++, - .descriptorType = tex_buffer.is_written ? vk::DescriptorType::eStorageTexelBuffer - : vk::DescriptorType::eUniformTexelBuffer, - .descriptorCount = 1, - .stageFlags = gp_stage_flags, - }); - } for (const auto& image : stage->images) { bindings.push_back({ .binding = binding++, diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 319f10278..e64cae87d 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -268,7 +268,6 @@ bool Instance::CreateDevice() { null_descriptor = feature_chain.get().nullDescriptor; } - maintenance5 = add_extension(VK_KHR_MAINTENANCE_5_EXTENSION_NAME); custom_border_color = add_extension(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); depth_clip_control = add_extension(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); vertex_input_dynamic_state = add_extension(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); @@ -376,9 +375,6 @@ bool Instance::CreateDevice() { .maintenance4 = true, }, // Other extensions - vk::PhysicalDeviceMaintenance5FeaturesKHR{ - .maintenance5 = true, - }, vk::PhysicalDeviceCustomBorderColorFeaturesEXT{ .customBorderColors = true, .customBorderColorWithoutFormat = true, @@ -414,9 +410,6 @@ bool Instance::CreateDevice() { if (!maintenance4) { device_chain.unlink(); } - if (!maintenance5) { - device_chain.unlink(); - } if (!custom_border_color) { device_chain.unlink(); } diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 532696f0f..1748fcd59 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -114,11 +114,6 @@ public: return null_descriptor; } - /// Returns true when VK_KHR_maintenance5 is supported. - bool IsMaintenance5Supported() const { - return maintenance5; - } - /// Returns true when VK_KHR_fragment_shader_barycentric is supported. bool IsFragmentShaderBarycentricSupported() const { return fragment_shader_barycentric; @@ -209,11 +204,6 @@ public: return properties.limits.minStorageBufferOffsetAlignment; } - /// Returns the minimum required alignment for texel buffers - vk::DeviceSize TexelBufferMinAlignment() const { - return properties.limits.minTexelBufferOffsetAlignment; - } - /// Returns the minimum alignemt required for accessing host-mapped device memory vk::DeviceSize NonCoherentAtomSize() const { return properties.limits.nonCoherentAtomSize; @@ -229,11 +219,6 @@ public: return properties.limits.maxComputeSharedMemorySize; } - /// Returns the maximum supported elements in a texel buffer - u32 MaxTexelBufferElements() const { - return properties.limits.maxTexelBufferElements; - } - /// Returns the maximum sampler LOD bias. float MaxSamplerLodBias() const { return properties.limits.maxSamplerLodBias; @@ -317,7 +302,6 @@ private: bool dynamic_color_write_mask{}; bool vertex_input_dynamic_state{}; bool null_descriptor{}; - bool maintenance5{}; bool list_restart{}; bool legacy_vertex_attributes{}; bool shader_stencil_export{}; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index d8f6a08d0..16d2187db 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -29,8 +29,6 @@ using Shader::VsOutput; constexpr static std::array DescriptorHeapSizes = { vk::DescriptorPoolSize{vk::DescriptorType::eUniformBuffer, 8192}, vk::DescriptorPoolSize{vk::DescriptorType::eStorageBuffer, 1024}, - vk::DescriptorPoolSize{vk::DescriptorType::eUniformTexelBuffer, 128}, - vk::DescriptorPoolSize{vk::DescriptorType::eStorageTexelBuffer, 128}, vk::DescriptorPoolSize{vk::DescriptorType::eSampledImage, 8192}, vk::DescriptorPoolSize{vk::DescriptorType::eSampler, 1024}, }; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 8da27de00..6f979a734 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -435,28 +435,6 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) { if (pipeline->IsCompute()) { const auto& info = pipeline->GetStage(Shader::LogicalStage::Compute); - // Most of the time when a metadata is updated with a shader it gets cleared. It means - // we can skip the whole dispatch and update the tracked state instead. Also, it is not - // intended to be consumed and in such rare cases (e.g. HTile introspection, CRAA) we - // will need its full emulation anyways. For cases of metadata read a warning will be - // logged. - const auto IsMetaUpdate = [&](const auto& desc) { - const auto sharp = desc.GetSharp(info); - const VAddr address = sharp.base_address; - if (desc.is_written) { - // Assume all slices were updates - if (texture_cache.ClearMeta(address)) { - LOG_TRACE(Render_Vulkan, "Metadata update skipped"); - return true; - } - } else { - if (texture_cache.IsMeta(address)) { - LOG_WARNING(Render_Vulkan, "Unexpected metadata read by a CS shader (buffer)"); - } - } - return false; - }; - // Assume if a shader reads and writes metas at the same time, it is a copy shader. bool meta_read = false; for (const auto& desc : info.buffers) { @@ -469,23 +447,26 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) { } } - for (const auto& desc : info.texture_buffers) { - if (!desc.is_written) { - const VAddr address = desc.GetSharp(info).base_address; - meta_read = texture_cache.IsMeta(address); - } - } - + // Most of the time when a metadata is updated with a shader it gets cleared. It means + // we can skip the whole dispatch and update the tracked state instead. Also, it is not + // intended to be consumed and in such rare cases (e.g. HTile introspection, CRAA) we + // will need its full emulation anyways. For cases of metadata read a warning will be + // logged. if (!meta_read) { for (const auto& desc : info.buffers) { - if (IsMetaUpdate(desc)) { - return false; - } - } - - for (const auto& desc : info.texture_buffers) { - if (IsMetaUpdate(desc)) { - return false; + const auto sharp = desc.GetSharp(info); + const VAddr address = sharp.base_address; + if (desc.is_written) { + // Assume all slices were updates + if (texture_cache.ClearMeta(address)) { + LOG_TRACE(Render_Vulkan, "Metadata update skipped"); + return false; + } + } else { + if (texture_cache.IsMeta(address)) { + LOG_WARNING(Render_Vulkan, + "Unexpected metadata read by a CS shader (buffer)"); + } } } } @@ -541,19 +522,6 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } } - texbuffer_bindings.clear(); - - for (const auto& desc : stage.texture_buffers) { - const auto vsharp = desc.GetSharp(stage); - if (vsharp.base_address != 0 && vsharp.GetSize() > 0 && - vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid) { - const auto buffer_id = buffer_cache.FindBuffer(vsharp.base_address, vsharp.GetSize()); - texbuffer_bindings.emplace_back(buffer_id, vsharp); - } else { - texbuffer_bindings.emplace_back(VideoCore::BufferId{}, vsharp); - } - } - // Bind a SSBO to act as shared memory in case of not being able to use a workgroup buffer // (e.g. when the compute shared memory is bigger than the GPU's shared memory) if (stage.has_emulated_shared_memory) { @@ -601,8 +569,9 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding buffer_infos.emplace_back(null_buffer.Handle(), 0, VK_WHOLE_SIZE); } } else { - const auto [vk_buffer, offset] = buffer_cache.ObtainBuffer( - vsharp.base_address, vsharp.GetSize(), desc.is_written, false, buffer_id); + const auto [vk_buffer, offset] = + buffer_cache.ObtainBuffer(vsharp.base_address, vsharp.GetSize(), desc.is_written, + desc.is_formatted, buffer_id); const u32 alignment = is_storage ? instance.StorageMinAlignment() : instance.UniformMinAlignment(); const u32 offset_aligned = Common::AlignDown(offset, alignment); @@ -617,6 +586,9 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding vk::PipelineStageFlagBits2::eAllCommands)) { buffer_barriers.emplace_back(*barrier); } + if (desc.is_written && desc.is_formatted) { + texture_cache.InvalidateMemoryFromGPU(vsharp.base_address, vsharp.GetSize()); + } } set_writes.push_back({ @@ -630,56 +602,6 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding }); ++binding.buffer; } - - for (u32 i = 0; i < texbuffer_bindings.size(); i++) { - const auto& [buffer_id, vsharp] = texbuffer_bindings[i]; - const auto& desc = stage.texture_buffers[i]; - // Fallback format for null buffer view; never used in valid buffer case. - const auto data_fmt = vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid - ? vsharp.GetDataFmt() - : AmdGpu::DataFormat::Format8; - const u32 fmt_stride = AmdGpu::NumBits(data_fmt) >> 3; - vk::BufferView buffer_view; - if (buffer_id) { - const u32 alignment = instance.TexelBufferMinAlignment(); - const auto [vk_buffer, offset] = buffer_cache.ObtainBuffer( - vsharp.base_address, vsharp.GetSize(), desc.is_written, true, buffer_id); - const u32 buf_stride = vsharp.GetStride(); - ASSERT_MSG(buf_stride % fmt_stride == 0, - "Texel buffer stride must match format stride"); - const u32 offset_aligned = Common::AlignDown(offset, alignment); - const u32 adjust = offset - offset_aligned; - ASSERT(adjust % fmt_stride == 0); - push_data.AddTexelOffset(binding.buffer, buf_stride / fmt_stride, adjust / fmt_stride); - buffer_view = vk_buffer->View(offset_aligned, vsharp.GetSize() + adjust, - desc.is_written, data_fmt, vsharp.GetNumberFmt()); - if (auto barrier = - vk_buffer->GetBarrier(desc.is_written ? vk::AccessFlagBits2::eShaderWrite - : vk::AccessFlagBits2::eShaderRead, - vk::PipelineStageFlagBits2::eAllCommands)) { - buffer_barriers.emplace_back(*barrier); - } - if (desc.is_written) { - texture_cache.InvalidateMemoryFromGPU(vsharp.base_address, vsharp.GetSize()); - } - } else if (instance.IsNullDescriptorSupported()) { - buffer_view = VK_NULL_HANDLE; - } else { - buffer_view = - null_buffer.View(0, fmt_stride, desc.is_written, data_fmt, vsharp.GetNumberFmt()); - } - - set_writes.push_back({ - .dstSet = VK_NULL_HANDLE, - .dstBinding = binding.unified++, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = desc.is_written ? vk::DescriptorType::eStorageTexelBuffer - : vk::DescriptorType::eUniformTexelBuffer, - .pTexelBufferView = &buffer_views.emplace_back(buffer_view), - }); - ++binding.buffer; - } } void Rasterizer::BindTextures(const Shader::Info& stage, Shader::Backend::Bindings& binding, diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 6e1a1d82e..db458662c 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -120,8 +120,6 @@ private: using BufferBindingInfo = std::pair; boost::container::static_vector buffer_bindings; - using TexBufferBindingInfo = std::pair; - boost::container::static_vector texbuffer_bindings; using ImageBindingInfo = std::pair; boost::container::static_vector image_bindings; }; diff --git a/src/video_core/renderer_vulkan/vk_shader_hle.cpp b/src/video_core/renderer_vulkan/vk_shader_hle.cpp index ff78f5d24..d73fdbeb1 100644 --- a/src/video_core/renderer_vulkan/vk_shader_hle.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_hle.cpp @@ -19,9 +19,9 @@ static bool ExecuteCopyShaderHLE(const Shader::Info& info, auto& buffer_cache = rasterizer.GetBufferCache(); // Copy shader defines three formatted buffers as inputs: control, source, and destination. - const auto ctl_buf_sharp = info.texture_buffers[0].GetSharp(info); - const auto src_buf_sharp = info.texture_buffers[1].GetSharp(info); - const auto dst_buf_sharp = info.texture_buffers[2].GetSharp(info); + const auto ctl_buf_sharp = info.buffers[0].GetSharp(info); + const auto src_buf_sharp = info.buffers[1].GetSharp(info); + const auto dst_buf_sharp = info.buffers[2].GetSharp(info); const auto buf_stride = src_buf_sharp.GetStride(); ASSERT(buf_stride == dst_buf_sharp.GetStride()); @@ -95,12 +95,10 @@ static bool ExecuteCopyShaderHLE(const Shader::Info& info, } // Obtain buffers for the total source and destination ranges. - const auto [src_buf, src_buf_offset] = - buffer_cache.ObtainBuffer(src_buf_sharp.base_address + src_offset_min, - src_offset_max - src_offset_min, false, false); - const auto [dst_buf, dst_buf_offset] = - buffer_cache.ObtainBuffer(dst_buf_sharp.base_address + dst_offset_min, - dst_offset_max - dst_offset_min, true, false); + const auto [src_buf, src_buf_offset] = buffer_cache.ObtainBuffer( + src_buf_sharp.base_address + src_offset_min, src_offset_max - src_offset_min, false); + const auto [dst_buf, dst_buf_offset] = buffer_cache.ObtainBuffer( + dst_buf_sharp.base_address + dst_offset_min, dst_offset_max - dst_offset_min, true); // Apply found buffer base. const auto vk_copies = std::span{copies}.subspan(batch_start, batch_end - batch_start); From 3c5cb093de78be9bf456f078eccdc0a4dabed723 Mon Sep 17 00:00:00 2001 From: DemoJameson Date: Sat, 8 Feb 2025 00:21:24 +0800 Subject: [PATCH 240/455] Update zh_CN translation (#2361) --- src/qt_gui/translations/zh_CN.ts | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 867b7d860..5afc679da 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -124,6 +124,14 @@ Copy Serial 复制序列号 + + Copy Version + 复制版本 + + + Copy Size + 复制大小 + Copy All 复制全部 @@ -554,7 +562,7 @@ Show Game Size In List - 显示游戏大小在列表中 + 在列表中显示游戏大小 Show Splash @@ -743,12 +751,24 @@ Title Music - Title Music + 标题音乐 Disable Trophy Pop-ups 禁止弹出奖杯 + + Background Image + 背景图片 + + + Show Background Image + 显示背景图片 + + + Opacity + 可见度 + Play title music 播放标题音乐 @@ -845,6 +865,10 @@ updaterGroupBox 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 + + GUIBackgroundImageGroupBox + 背景图片:\n控制游戏背景图片的可见度。 + GUIMusicGroupBox 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 From cb14431ee51d7b8eca3946b12037b8fcf8b6f5a2 Mon Sep 17 00:00:00 2001 From: Ivan Kovalev Date: Fri, 7 Feb 2025 18:05:33 +0100 Subject: [PATCH 241/455] Add nix-shell to allow native build on NixOS (#2333) * Add nix-shell to allow native build on NixOS * Remove unnecessary README for nix. Move major comment to shell.nix * Update path in building-linux.md * Use cached nix packages from unstable channel * Add proper license to nix shell --- documents/building-linux.md | 8 ++++- shell.nix | 70 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 shell.nix diff --git a/documents/building-linux.md b/documents/building-linux.md index d9ae2e54c..71e26e792 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -37,6 +37,12 @@ sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declar sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers ``` +#### NixOS + +``` +nix-shell shell.nix +``` + #### Other Linux distributions You can try one of two methods: @@ -49,7 +55,7 @@ distrobox create --name archlinux --init --image archlinux:latest ``` and install the dependencies on that container as cited above. -This option is **highly recommended** for NixOS and distributions with immutable/atomic filesystems (example: Fedora Kinoite, SteamOS). +This option is **highly recommended** for distributions with immutable/atomic filesystems (example: Fedora Kinoite, SteamOS). ### Cloning diff --git a/shell.nix b/shell.nix new file mode 100644 index 000000000..cc9cc1f82 --- /dev/null +++ b/shell.nix @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: 2024 shadPS4 Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +with import (fetchTarball "https://github.com/nixos/nixpkgs/archive/cfd19cdc54680956dc1816ac577abba6b58b901c.tar.gz") { }; + +pkgs.mkShell { + name = "shadps4-build-env"; + + nativeBuildInputs = [ + pkgs.llvmPackages_18.clang + pkgs.cmake + pkgs.pkg-config + pkgs.git + ]; + + buildInputs = [ + pkgs.alsa-lib + pkgs.libpulseaudio + pkgs.openal + pkgs.openssl + pkgs.zlib + pkgs.libedit + pkgs.udev + pkgs.libevdev + pkgs.SDL2 + pkgs.jack2 + pkgs.sndio + pkgs.qt6.qtbase + pkgs.qt6.qttools + pkgs.qt6.qtmultimedia + + pkgs.vulkan-headers + pkgs.vulkan-utility-libraries + pkgs.vulkan-tools + + pkgs.ffmpeg + pkgs.fmt + pkgs.glslang + pkgs.libxkbcommon + pkgs.wayland + pkgs.xorg.libxcb + pkgs.xorg.xcbutil + pkgs.xorg.xcbutilkeysyms + pkgs.xorg.xcbutilwm + pkgs.sdl3 + pkgs.stb + pkgs.qt6.qtwayland + pkgs.wayland-protocols + ]; + + shellHook = '' + echo "Entering shadPS4 dev shell" + export QT_QPA_PLATFORM="wayland" + export QT_PLUGIN_PATH="${pkgs.qt6.qtwayland}/lib/qt-6/plugins:${pkgs.qt6.qtbase}/lib/qt-6/plugins" + export QML2_IMPORT_PATH="${pkgs.qt6.qtbase}/lib/qt-6/qml" + export CMAKE_PREFIX_PATH="${pkgs.vulkan-headers}:$CMAKE_PREFIX_PATH" + + # OpenGL + export LD_LIBRARY_PATH="${ + pkgs.lib.makeLibraryPath [ + pkgs.libglvnd + pkgs.vulkan-tools + ] + }:$LD_LIBRARY_PATH" + + export LDFLAGS="-L${pkgs.llvmPackages_18.libcxx}/lib -lc++" + export LC_ALL="C.UTF-8" + export XAUTHORITY=${builtins.getEnv "XAUTHORITY"} + ''; +} From d98face501a8c4cbee4e966e04d3c1c2e777a464 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sat, 8 Feb 2025 12:25:55 -0300 Subject: [PATCH 242/455] Game-compatibility - improved (#2367) * Game-compatibility - improved * + none of these texts have a translation \o/ * Fix - html_url has been removed, the url is now built dynamically from the issue_number, and the file has decreased in size from 537kb to 355KB; -Fix QProgressDialog - change the correct directory, from my ford to the official one * TR --- src/qt_gui/compatibility_info.cpp | 150 +++++++----------------------- src/qt_gui/compatibility_info.h | 6 +- src/qt_gui/game_list_frame.cpp | 10 +- src/qt_gui/main_window.cpp | 8 +- src/qt_gui/settings_dialog.cpp | 14 ++- src/qt_gui/translations/ar.ts | 65 ++++++++++++- src/qt_gui/translations/da_DK.ts | 65 ++++++++++++- src/qt_gui/translations/de.ts | 67 ++++++++++++- src/qt_gui/translations/el.ts | 65 ++++++++++++- src/qt_gui/translations/en.ts | 40 +++++++- src/qt_gui/translations/es_ES.ts | 65 ++++++++++++- src/qt_gui/translations/fa_IR.ts | 65 ++++++++++++- src/qt_gui/translations/fi.ts | 65 ++++++++++++- src/qt_gui/translations/fr.ts | 65 ++++++++++++- src/qt_gui/translations/hu_HU.ts | 65 ++++++++++++- src/qt_gui/translations/id.ts | 65 ++++++++++++- src/qt_gui/translations/it.ts | 65 ++++++++++++- src/qt_gui/translations/ja_JP.ts | 65 ++++++++++++- src/qt_gui/translations/ko_KR.ts | 65 ++++++++++++- src/qt_gui/translations/lt_LT.ts | 65 ++++++++++++- src/qt_gui/translations/nb.ts | 59 +++++++++++- src/qt_gui/translations/nl.ts | 65 ++++++++++++- src/qt_gui/translations/pl_PL.ts | 65 ++++++++++++- src/qt_gui/translations/pt_BR.ts | 65 ++++++++++++- src/qt_gui/translations/ro_RO.ts | 65 ++++++++++++- src/qt_gui/translations/ru_RU.ts | 77 ++++++++++++--- src/qt_gui/translations/sq.ts | 65 ++++++++++++- src/qt_gui/translations/sv.ts | 77 ++++++++++++--- src/qt_gui/translations/tr_TR.ts | 65 ++++++++++++- src/qt_gui/translations/uk_UA.ts | 67 ++++++++++++- src/qt_gui/translations/vi_VN.ts | 65 ++++++++++++- src/qt_gui/translations/zh_CN.ts | 65 ++++++++++++- src/qt_gui/translations/zh_TW.ts | 65 ++++++++++++- 33 files changed, 1824 insertions(+), 181 deletions(-) diff --git a/src/qt_gui/compatibility_info.cpp b/src/qt_gui/compatibility_info.cpp index 884387061..443d56a20 100644 --- a/src/qt_gui/compatibility_info.cpp +++ b/src/qt_gui/compatibility_info.cpp @@ -19,27 +19,34 @@ CompatibilityInfoClass::CompatibilityInfoClass() CompatibilityInfoClass::~CompatibilityInfoClass() = default; void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent, bool forced) { - if (!forced) - if (LoadCompatibilityFile()) - return; - - QNetworkReply* reply = FetchPage(1); - if (!WaitForReply(reply)) + if (!forced && LoadCompatibilityFile()) return; - QProgressDialog dialog(tr("Fetching compatibility data, please wait"), tr("Cancel"), 0, 0, + QUrl url("https://github.com/shadps4-emu/shadps4-game-compatibility/releases/latest/download/" + "compatibility_data.json"); + QNetworkRequest request(url); + QNetworkReply* reply = m_network_manager->get(request); + + QProgressDialog dialog(tr("Fetching compatibility data, please wait"), tr("Cancel"), 0, 100, parent); dialog.setWindowTitle(tr("Loading...")); + dialog.setWindowModality(Qt::WindowModal); + dialog.setMinimumDuration(0); + dialog.setValue(0); - int remaining_pages = 0; - if (reply->hasRawHeader("link")) { - QRegularExpression last_page_re("(\\d+)(?=>; rel=\"last\")"); - QRegularExpressionMatch last_page_match = - last_page_re.match(QString(reply->rawHeader("link"))); - if (last_page_match.hasMatch()) { - remaining_pages = last_page_match.captured(0).toInt() - 1; - } - } + connect(reply, &QNetworkReply::downloadProgress, + [&dialog](qint64 bytesReceived, qint64 bytesTotal) { + if (bytesTotal > 0) { + dialog.setMaximum(bytesTotal); + dialog.setValue(bytesReceived); + } + }); + + connect(&dialog, &QProgressDialog::canceled, reply, &QNetworkReply::abort); + + QEventLoop loop; + connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + loop.exec(); if (reply->error() != QNetworkReply::NoError) { reply->deleteLater(); @@ -51,100 +58,23 @@ void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent, bool f return; } - ExtractCompatibilityInfo(reply->readAll()); - - QVector replies(remaining_pages); - QFutureWatcher future_watcher; - - for (int i = 0; i < remaining_pages; i++) { - replies[i] = FetchPage(i + 2); + QFile compatibility_file(m_compatibility_filename); + if (!compatibility_file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { + QMessageBox::critical(parent, tr("Error"), + tr("Unable to open compatibility_data.json for writing.")); + reply->deleteLater(); + return; } - future_watcher.setFuture(QtConcurrent::map(replies, WaitForReply)); - connect(&future_watcher, &QFutureWatcher::finished, [&]() { - for (int i = 0; i < remaining_pages; i++) { - if (replies[i]->bytesAvailable()) { - if (replies[i]->error() == QNetworkReply::NoError) { - ExtractCompatibilityInfo(replies[i]->readAll()); - } - replies[i]->deleteLater(); - } else { - // This means the request timed out - return; - } - } + // Writes the received data to the file. + QByteArray json_data = reply->readAll(); + compatibility_file.write(json_data); + compatibility_file.close(); + reply->deleteLater(); - QFile compatibility_file(m_compatibility_filename); - - if (!compatibility_file.open(QIODevice::WriteOnly | QIODevice::Truncate | - QIODevice::Text)) { - QMessageBox::critical(parent, tr("Error"), - tr("Unable to open compatibility.json for writing.")); - return; - } - - QJsonDocument json_doc; - m_compatibility_database["version"] = COMPAT_DB_VERSION; - - json_doc.setObject(m_compatibility_database); - compatibility_file.write(json_doc.toJson()); - compatibility_file.close(); - - dialog.reset(); - }); - connect(&future_watcher, &QFutureWatcher::canceled, [&]() { - // Cleanup if user cancels pulling data - for (int i = 0; i < remaining_pages; i++) { - if (!replies[i]->bytesAvailable()) { - replies[i]->deleteLater(); - } else if (!replies[i]->isFinished()) { - replies[i]->abort(); - } - } - }); - connect(&dialog, &QProgressDialog::canceled, &future_watcher, &QFutureWatcher::cancel); - dialog.setRange(0, remaining_pages); - connect(&future_watcher, &QFutureWatcher::progressValueChanged, &dialog, - &QProgressDialog::setValue); - dialog.exec(); + LoadCompatibilityFile(); } -QNetworkReply* CompatibilityInfoClass::FetchPage(int page_num) { - QUrl url = QUrl("https://api.github.com/repos/shadps4-emu/shadps4-game-compatibility/issues"); - QUrlQuery query; - query.addQueryItem("per_page", QString("100")); - query.addQueryItem( - "tags", QString("status-ingame status-playable status-nothing status-boots status-menus")); - query.addQueryItem("page", QString::number(page_num)); - url.setQuery(query); - - QNetworkRequest request(url); - QNetworkReply* reply = m_network_manager->get(request); - - return reply; -} - -bool CompatibilityInfoClass::WaitForReply(QNetworkReply* reply) { - // Returns true if reply succeeded, false if reply timed out - QTimer timer; - timer.setSingleShot(true); - - QEventLoop loop; - connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); - connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); - timer.start(5000); - loop.exec(); - - if (timer.isActive()) { - timer.stop(); - return true; - } else { - disconnect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - reply->abort(); - return false; - } -}; - CompatibilityEntry CompatibilityInfoClass::GetCompatibilityInfo(const std::string& serial) { QString title_id = QString::fromStdString(serial); if (m_compatibility_database.contains(title_id)) { @@ -160,7 +90,7 @@ CompatibilityEntry CompatibilityInfoClass::GetCompatibilityInfo(const std::strin QDateTime::fromString(compatibility_entry_obj["last_tested"].toString(), Qt::ISODate), compatibility_entry_obj["url"].toString(), - compatibility_entry_obj["issue_number"].toInt()}; + compatibility_entry_obj["issue_number"].toString()}; return compatibility_entry; } } @@ -193,14 +123,6 @@ bool CompatibilityInfoClass::LoadCompatibilityFile() { return false; } - // Check database version - int version_number; - if (json_doc.object()["version"].isDouble()) { - if (json_doc.object()["version"].toInt() < COMPAT_DB_VERSION) - return false; - } else - return false; - m_compatibility_database = json_doc.object(); return true; } diff --git a/src/qt_gui/compatibility_info.h b/src/qt_gui/compatibility_info.h index 511c106ce..7e70e998b 100644 --- a/src/qt_gui/compatibility_info.h +++ b/src/qt_gui/compatibility_info.h @@ -11,8 +11,6 @@ #include "common/config.h" #include "core/file_format/psf.h" -static constexpr int COMPAT_DB_VERSION = 1; - enum class CompatibilityStatus { Unknown, Nothing, @@ -49,7 +47,7 @@ struct CompatibilityEntry { QString version; QDateTime last_tested; QString url; - int issue_number; + QString issue_number; }; class CompatibilityInfoClass : public QObject { @@ -82,8 +80,6 @@ public: CompatibilityEntry GetCompatibilityInfo(const std::string& serial); const QString GetCompatStatusString(const CompatibilityStatus status); void ExtractCompatibilityInfo(QByteArray response); - static bool WaitForReply(QNetworkReply* reply); - QNetworkReply* FetchPage(int page_num); private: QNetworkAccessManager* m_network_manager; diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index 64c0f17ba..2caae35b0 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -77,8 +77,10 @@ GameListFrame::GameListFrame(std::shared_ptr game_info_get, }); connect(this, &QTableWidget::cellClicked, this, [=, this](int row, int column) { - if (column == 2 && !m_game_info->m_games[row].compatibility.url.isEmpty()) { - QDesktopServices::openUrl(QUrl(m_game_info->m_games[row].compatibility.url)); + if (column == 2 && m_game_info->m_games[row].compatibility.issue_number != "") { + auto url_issues = "https://github.com/shadps4-emu/shadps4-game-compatibility/issues/"; + QDesktopServices::openUrl( + QUrl(url_issues + m_game_info->m_games[row].compatibility.issue_number)); } }); } @@ -278,7 +280,8 @@ void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityEntry tooltip_string = status_explanation; } else { tooltip_string = - "

" + tr("Click to go to issue") + "" + "
" + tr("Last updated") + + "

" + tr("Click to see details on github") + "" + "
" + + tr("Last updated") + QString(": %1 (%2)").arg(entry.last_tested.toString("yyyy-MM-dd"), entry.version) + "
" + status_explanation + "

"; } @@ -295,6 +298,7 @@ void GameListFrame::SetCompatibilityItem(int row, int column, CompatibilityEntry dotLabel->setPixmap(circle_pixmap); QLabel* label = new QLabel(m_compat_info->GetCompatStatusString(entry.status), widget); + this->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); label->setStyleSheet("color: white; font-size: 16px; font-weight: bold;"); diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 67615a1b6..556dd0456 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -202,10 +202,14 @@ void MainWindow::CreateDockWindows() { } void MainWindow::LoadGameLists() { + // Load compatibility database + if (Config::getCompatibilityEnabled()) + m_compat_info->LoadCompatibilityFile(); + // Update compatibility database - if (Config::getCheckCompatibilityOnStartup()) { + if (Config::getCheckCompatibilityOnStartup()) m_compat_info->UpdateCompatibilityDatabase(this); - } + // Get game info from game folders. m_game_info->GetGameInfo(this); if (isTableList) { diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 8f4b22c6d..a66781244 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -159,14 +159,18 @@ SettingsDialog::SettingsDialog(std::span physical_devices, }); #if (QT_VERSION < QT_VERSION_CHECK(6, 7, 0)) - connect(ui->enableCompatibilityCheckBox, &QCheckBox::stateChanged, this, [this](int state) { + connect(ui->enableCompatibilityCheckBox, &QCheckBox::stateChanged, this, + [this, m_compat_info](int state) { #else connect(ui->enableCompatibilityCheckBox, &QCheckBox::checkStateChanged, this, - [this](Qt::CheckState state) { + [this, m_compat_info](Qt::CheckState state) { #endif - Config::setCompatibilityEnabled(state); - emit CompatibilityChanged(); - }); + Config::setCompatibilityEnabled(state); + if (state) { + m_compat_info->LoadCompatibilityFile(); + } + emit CompatibilityChanged(); + }); } // Gui TAB diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index 209721b7f..2ffa494ab 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -629,7 +629,7 @@ الرسومات
- Gui + GUI واجهة @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + انقر لرؤية التفاصيل على GitHub + + + Last updated + آخر تحديث +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + جاري جلب بيانات التوافق، يرجى الانتظار + + + Cancel + إلغاء + + + Loading... + جاري التحميل... + + + Error + خطأ + + + Unable to update compatibility data! Try again later. + تعذر تحديث بيانات التوافق! حاول مرة أخرى لاحقاً. + + + Unable to open compatibility_data.json for writing. + تعذر فتح compatibility_data.json للكتابة. + + + Unknown + غير معروف + + + Nothing + لا شيء + + + Boots + أحذية + + + Menus + قوائم + + + Ingame + داخل اللعبة + + + Playable + قابل للعب + + + Unknown + غير معروف + + \ No newline at end of file diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 3b2bd84fa..a9673906e 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI Interface @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Klik for at se detaljer på GitHub + + + Last updated + Sidst opdateret +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vent venligst + + + Cancel + Annuller + + + Loading... + Indlæser... + + + Error + Fejl + + + Unable to update compatibility data! Try again later. + Kan ikke opdatere kompatibilitetsdata! Prøv igen senere. + + + Unable to open compatibility_data.json for writing. + Kan ikke åbne compatibility_data.json til skrivning. + + + Unknown + Ukendt + + + Nothing + Intet + + + Boots + Støvler + + + Menus + Menuer + + + Ingame + I spillet + + + Playable + Spilbar + + + Unknown + Ukendt + + \ No newline at end of file diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 4dbfecb18..dda113dfc 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -653,7 +653,7 @@ Grafik - Gui + GUI Benutzeroberfläche @@ -1302,6 +1302,14 @@ Game can be completed with playable performance and no major glitches Spiel kann mit spielbarer Leistung und keinen großen Störungen abgeschlossen werden + + Click to see details on github + Klicken Sie hier, um Details auf GitHub zu sehen + + + Last updated + Zuletzt aktualisiert +
CheckUpdate @@ -1460,4 +1468,59 @@ Spielbar - + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Lade Kompatibilitätsdaten, bitte warten + + + Cancel + Abbrechen + + + Loading... + Lädt... + + + Error + Fehler + + + Unable to update compatibility data! Try again later. + Kompatibilitätsdaten konnten nicht aktualisiert werden! Versuchen Sie es später erneut. + + + Unable to open compatibility_data.json for writing. + Kann compatibility_data.json nicht zum Schreiben öffnen. + + + Unknown + Unbekannt + + + Nothing + Nichts + + + Boots + Stiefel + + + Menus + Menüs + + + Ingame + Im Spiel + + + Playable + Spielbar + + + Unknown + Unbekannt + + + \ No newline at end of file diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index dfc13935b..7eaee5c4e 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI Διεπαφή @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Κάντε κλικ για να δείτε λεπτομέρειες στο GitHub + + + Last updated + Τελευταία ενημέρωση +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Φόρτωση δεδομένων συμβατότητας, παρακαλώ περιμένετε + + + Cancel + Ακύρωση + + + Loading... + Φόρτωση... + + + Error + Σφάλμα + + + Unable to update compatibility data! Try again later. + Δεν ήταν δυνατή η ενημέρωση των δεδομένων συμβατότητας! Προσπαθήστε αργότερα. + + + Unable to open compatibility_data.json for writing. + Αδύνατο να ανοίξετε το compatibility_data.json για εγγραφή. + + + Unknown + Άγνωστο + + + Nothing + Τίποτα + + + Boots + Μπότες + + + Menus + Μενού + + + Ingame + Εντός παιχνιδιού + + + Playable + Παιχνιδεύσιμο + + + Unknown + Άγνωστο + + \ No newline at end of file diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 440059b26..1fb565198 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -637,7 +637,7 @@ Graphics - Gui + GUI Gui @@ -1311,6 +1311,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Click to see details on GitHub + + + Last updated + Last updated +
CheckUpdate @@ -1444,6 +1452,30 @@ CompatibilityInfoClass + + Fetching compatibility data, please wait + Fetching compatibility data, please wait + + + Cancel + Cancel + + + Loading... + Loading... + + + Error + Error + + + Unable to update compatibility data! Try again later. + Unable to update compatibility data! Try again later. + + + Unable to open compatibility_data.json for writing. + Unable to open compatibility_data.json for writing. + Unknown Unknown @@ -1468,5 +1500,9 @@ Playable Playable + + Unknown + Unknown + - + \ No newline at end of file diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index eb35c523c..0aef0224c 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -629,7 +629,7 @@ Gráficos - Gui + GUI Interfaz @@ -1294,6 +1294,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Haz clic para ver detalles en GitHub + + + Last updated + Última actualización +
CheckUpdate @@ -1452,4 +1460,59 @@ Jugable + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Obteniendo datos de compatibilidad, por favor espera + + + Cancel + Cancelar + + + Loading... + Cargando... + + + Error + Error + + + Unable to update compatibility data! Try again later. + ¡No se pudo actualizar los datos de compatibilidad! Intenta de nuevo más tarde. + + + Unable to open compatibility_data.json for writing. + No se pudo abrir compatibility_data.json para escribir. + + + Unknown + Desconocido + + + Nothing + Nada + + + Boots + Botas + + + Menus + Menús + + + Ingame + En el juego + + + Playable + Jugable + + + Unknown + Desconocido + + \ No newline at end of file diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 288b3300e..799cd71f4 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -629,7 +629,7 @@ گرافیک - Gui + GUI رابط کاربری @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches بازی با عملکرد قابل قبول و بدون اشکالات عمده قابل بازی است. + + Click to see details on github + برای مشاهده جزئیات در GitHub کلیک کنید + + + Last updated + آخرین به‌روزرسانی +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + در حال بارگذاری داده‌های سازگاری، لطفاً صبر کنید + + + Cancel + لغو + + + Loading... + در حال بارگذاری... + + + Error + خطا + + + Unable to update compatibility data! Try again later. + ناتوان از بروزرسانی داده‌های سازگاری! لطفاً بعداً دوباره تلاش کنید. + + + Unable to open compatibility_data.json for writing. + امکان باز کردن compatibility_data.json برای نوشتن وجود ندارد. + + + Unknown + ناشناخته + + + Nothing + هیچ چیز + + + Boots + چکمه‌ها + + + Menus + منوها + + + Ingame + داخل بازی + + + Playable + قابل بازی + + + Unknown + ناشناخته + + \ No newline at end of file diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 9a5de8016..b369e437f 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -629,7 +629,7 @@ Grafiikka - Gui + GUI Rajapinta @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Pelillä on hyväksyttävä suorituskyky, eikä mitään suuria häiriöitä + + Click to see details on github + Napsauta nähdäksesi lisätiedot GitHubissa + + + Last updated + Viimeksi päivitetty +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Haetaan yhteensopivuustietoja, odota + + + Cancel + Peruuta + + + Loading... + Ladataan... + + + Error + Virhe + + + Unable to update compatibility data! Try again later. + Yhteensopivuustietoja ei voitu päivittää! Yritä myöhemmin uudelleen. + + + Unable to open compatibility_data.json for writing. + Ei voitu avata compatibility_data.json-tiedostoa kirjoittamista varten. + + + Unknown + Tuntematon + + + Nothing + Ei mitään + + + Boots + Sahat + + + Menus + Valikot + + + Ingame + Pelin aikana + + + Playable + Pelattava + + + Unknown + Tuntematon + + \ No newline at end of file diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index a8d526353..515c4e77a 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -629,7 +629,7 @@ Graphismes - Gui + GUI Interface @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Le jeu peut être terminé avec des performances acceptables et sans problèmes majeurs + + Click to see details on github + Cliquez pour voir les détails sur GitHub + + + Last updated + Dernière mise à jour +
CheckUpdate @@ -1436,4 +1444,59 @@ Jouable + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Récupération des données de compatibilité, veuillez patienter + + + Cancel + Annuler + + + Loading... + Chargement... + + + Error + Erreur + + + Unable to update compatibility data! Try again later. + Impossible de mettre à jour les données de compatibilité ! Essayez plus tard. + + + Unable to open compatibility_data.json for writing. + Impossible d'ouvrir compatibility_data.json en écriture. + + + Unknown + Inconnu + + + Nothing + Rien + + + Boots + Bottes + + + Menus + Menus + + + Ingame + En jeu + + + Playable + Jouable + + + Unknown + Inconnu + + diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index e7efb77b9..86266757f 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -629,7 +629,7 @@ Grafika - Gui + GUI Felület @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Kattintson a részletek megtekintéséhez a GitHubon + + + Last updated + Utoljára frissítve +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Kompatibilitási adatok betöltése, kérem várjon + + + Cancel + Megszakítás + + + Loading... + Betöltés... + + + Error + Hiba + + + Unable to update compatibility data! Try again later. + Nem sikerült frissíteni a kompatibilitási adatokat! Kérem próbálja újra később. + + + Unable to open compatibility_data.json for writing. + Nem sikerült megnyitni a compatibility_data.json fájlt írásra. + + + Unknown + Ismeretlen + + + Nothing + Semmi + + + Boots + Csizmák + + + Menus + Menük + + + Ingame + Játékban + + + Playable + Játszható + + + Unknown + Ismeretlen + + \ No newline at end of file diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index 12e80905b..ca8305f31 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI Antarmuka @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Klik untuk melihat detail di GitHub + + + Last updated + Terakhir diperbarui +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Memuat data kompatibilitas, harap tunggu + + + Cancel + Batal + + + Loading... + Memuat... + + + Error + Kesalahan + + + Unable to update compatibility data! Try again later. + Tidak dapat memperbarui data kompatibilitas! Coba lagi nanti. + + + Unable to open compatibility_data.json for writing. + Tidak dapat membuka compatibility_data.json untuk menulis. + + + Unknown + Tidak Dikenal + + + Nothing + Tidak ada + + + Boots + Sepatu Bot + + + Menus + Menu + + + Ingame + Dalam Permainan + + + Playable + Playable + + + Unknown + Tidak Dikenal + + \ No newline at end of file diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index 0fd06b247..cdb3c9a25 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -629,7 +629,7 @@ Grafica - Gui + GUI Interfaccia @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Il gioco può essere completato con buone prestazioni e senza problemi gravi + + Click to see details on github + Fai clic per vedere i dettagli su GitHub + + + Last updated + Ultimo aggiornamento +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Recuperando dati di compatibilità, per favore attendere + + + Cancel + Annulla + + + Loading... + Caricamento... + + + Error + Errore + + + Unable to update compatibility data! Try again later. + Impossibile aggiornare i dati di compatibilità! Riprova più tardi. + + + Unable to open compatibility_data.json for writing. + Impossibile aprire compatibility_data.json per la scrittura. + + + Unknown + Sconosciuto + + + Nothing + Niente + + + Boots + Stivali + + + Menus + Menu + + + Ingame + In gioco + + + Playable + Giocabile + + + Unknown + Sconosciuto + + diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index e063c6ab2..472a95d8d 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -629,7 +629,7 @@ グラフィックス - Gui + GUI インターフェース @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches パフォーマンスに問題はなく、大きな不具合なしでゲームをプレイすることができます + + Click to see details on github + 詳細を見るにはGitHubをクリックしてください + + + Last updated + 最終更新 +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 互換性データを取得しています。少々お待ちください。 + + + Cancel + キャンセル + + + Loading... + 読み込み中... + + + Error + エラー + + + Unable to update compatibility data! Try again later. + 互換性データを更新できませんでした!後で再試行してください。 + + + Unable to open compatibility_data.json for writing. + compatibility_data.jsonを開いて書き込むことができませんでした。 + + + Unknown + 不明 + + + Nothing + 何もない + + + Boots + ブーツ + + + Menus + メニュー + + + Ingame + ゲーム内 + + + Playable + プレイ可能 + + + Unknown + 不明 + + \ No newline at end of file diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 57e0d6c01..5d0700da7 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI 인터페이스 @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + GitHub에서 세부 정보를 보려면 클릭하세요 + + + Last updated + 마지막 업데이트 +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 호환성 데이터를 가져오는 중, 잠시만 기다려 주세요 + + + Cancel + 취소 + + + Loading... + 로딩 중... + + + Error + 오류 + + + Unable to update compatibility data! Try again later. + 호환성 데이터를 업데이트할 수 없습니다! 나중에 다시 시도해 주세요. + + + Unable to open compatibility_data.json for writing. + compatibility_data.json을 열어 쓸 수 없습니다. + + + Unknown + 알 수 없음 + + + Nothing + 없음 + + + Boots + 부츠 + + + Menus + 메뉴 + + + Ingame + 게임 내 + + + Playable + 플레이 가능 + + + Unknown + 알 수 없음 + + \ No newline at end of file diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 711cb183d..6ed478ce4 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI Interfeisa @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Spustelėkite, kad pamatytumėte detales GitHub + + + Last updated + Paskutinį kartą atnaujinta +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Naudojamos suderinamumo duomenis, prašome palaukti + + + Cancel + Atšaukti + + + Loading... + Kraunama... + + + Error + Klaida + + + Unable to update compatibility data! Try again later. + Negalima atnaujinti suderinamumo duomenų! Bandykite vėliau. + + + Unable to open compatibility_data.json for writing. + Negalima atidaryti compatibility_data.json failo rašymui. + + + Unknown + Nežinoma + + + Nothing + Nėra + + + Boots + Batai + + + Menus + Meniu + + + Ingame + Žaidime + + + Playable + Žaidžiamas + + + Unknown + Nežinoma + + \ No newline at end of file diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index 7579f7cae..abab0ebd4 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -1323,8 +1323,8 @@ Spillet kan fullføres med spillbar ytelse og uten store feil - Click to go to issue - Klikk for å gå til rapporten + Click to see details on github + Klikk for å se detaljer på GitHub Last updated @@ -1500,4 +1500,59 @@ Laster...
+ + CompatibilityInfoClass + + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vennligst vent + + + Cancel + Avbryt + + + Loading... + Laster... + + + Error + Feil + + + Unable to update compatibility data! Try again later. + Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. + + + Unable to open compatibility_data.json for writing. + Kan ikke åpne compatibility_data.json for skriving. + + + Unknown + Ukendt + + + Nothing + Ingenting + + + Boots + Støvler + + + Menus + Menyene + + + Ingame + I spill + + + Playable + Spillbar + + + Unknown + Ukendt + + diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 02596c087..7f2a49de0 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI Interface @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Klik om details op GitHub te bekijken + + + Last updated + Laatst bijgewerkt +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Compatibiliteitsgegevens ophalen, even geduld + + + Cancel + Annuleren + + + Loading... + Laden... + + + Error + Fout + + + Unable to update compatibility data! Try again later. + Kan compatibiliteitsgegevens niet bijwerken! Probeer het later opnieuw. + + + Unable to open compatibility_data.json for writing. + Kan compatibility_data.json niet openen voor schrijven. + + + Unknown + Onbekend + + + Nothing + Niets + + + Boots + Laarsjes + + + Menus + Menu's + + + Ingame + In het spel + + + Playable + Speelbaar + + + Unknown + Onbekend + + \ No newline at end of file diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 9ca116994..005be6fc9 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -629,7 +629,7 @@ Grafika - Gui + GUI Interfejs @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Grę można ukończyć z grywalną wydajnością i bez większych usterek + + Click to see details on github + Kliknij, aby zobaczyć szczegóły na GitHub + + + Last updated + Ostatnia aktualizacja +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Pobieranie danych o kompatybilności, proszę czekać + + + Cancel + Anuluj + + + Loading... + Ładowanie... + + + Error + Błąd + + + Unable to update compatibility data! Try again later. + Nie można zaktualizować danych o kompatybilności! Spróbuj ponownie później. + + + Unable to open compatibility_data.json for writing. + Nie można otworzyć pliku compatibility_data.json do zapisu. + + + Unknown + Nieznany + + + Nothing + Nic + + + Boots + Buty + + + Menus + Menu + + + Ingame + W grze + + + Playable + Do grania + + + Unknown + Nieznany + + \ No newline at end of file diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 11b9e3d48..c6bc0ffda 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -629,7 +629,7 @@ Gráficos - Gui + GUI Interface @@ -1282,6 +1282,14 @@ Game can be completed with playable performance and no major glitches O jogo pode ser concluído com desempenho jogável e sem grandes falhas + + Click to see details on github + Clique para ver detalhes no github + + + Last updated + Última atualização +
CheckUpdate @@ -1413,4 +1421,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Obtendo dados de compatibilidade, por favor aguarde + + + Cancel + Cancelar + + + Loading... + Carregando... + + + Error + Erro + + + Unable to update compatibility data! Try again later. + Não foi possível atualizar os dados de compatibilidade! Tente novamente mais tarde. + + + Unable to open compatibility_data.json for writing. + Não foi possível abrir o compatibility_data.json para escrita. + + + Unknown + Desconhecido + + + Nothing + Nada + + + Boots + Boot + + + Menus + Menus + + + Ingame + Em jogo + + + Playable + Jogável + + + Unknown + Desconhecido + + diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index ebda5eda5..90e8afb60 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI Interfață @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Faceți clic pentru a vedea detalii pe GitHub + + + Last updated + Ultima actualizare +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Se colectează datele de compatibilitate, vă rugăm să așteptați + + + Cancel + Anulează + + + Loading... + Se încarcă... + + + Error + Eroare + + + Unable to update compatibility data! Try again later. + Nu se poate actualiza datele de compatibilitate! Încercați din nou mai târziu. + + + Unable to open compatibility_data.json for writing. + Nu se poate deschide compatibility_data.json pentru scriere. + + + Unknown + Necunoscut + + + Nothing + Nimic + + + Boots + Botine + + + Menus + Meniuri + + + Ingame + În joc + + + Playable + Jucabil + + + Unknown + Necunoscut + + \ No newline at end of file diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 589e5814c..63dd8c48e 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -697,7 +697,7 @@ Графика - Gui + GUI Интерфейс @@ -1422,14 +1422,14 @@ Game can be completed with playable performance and no major glitches Игра может быть пройдена с хорошей производительностью и без серьезных сбоев - - Click to go to issue - Нажмите, чтобы перейти к проблеме - - - Last updated - Последнее обновление - + + Click to see details on github + Нажмите, чтобы увидеть детали на GitHub + + + Last updated + Последнее обновление +
CheckUpdate @@ -1584,8 +1584,8 @@ Не удалось обновить данные совместимости! Повторите попытку позже. - Unable to open compatibility.json for writing. - Не удалось открыть файл compatibility.json для записи. + Unable to open compatibility_data.json for writing. + Не удалось открыть файл compatibility_data.json для записи. Unknown @@ -1612,4 +1612,59 @@ Играбельно + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Загрузка данных о совместимости, пожалуйста подождите + + + Cancel + Отменить + + + Loading... + Загрузка... + + + Error + Ошибка + + + Unable to update compatibility data! Try again later. + Не удалось обновить данные о совместимости! Попробуйте позже. + + + Unable to open compatibility_data.json for writing. + Не удается открыть compatibility_data.json для записи. + + + Unknown + Неизвестно + + + Nothing + Ничего + + + Boots + Ботинки + + + Menus + Меню + + + Ingame + В игре + + + Playable + Играбельно + + + Unknown + Неизвестно + + diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 36d098afb..e9fcd55e6 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -629,7 +629,7 @@ Grafika - Gui + GUI Ndërfaqja @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Loja mund të përfundohet me performancë të luajtshme dhe pa probleme të mëdha + + Click to see details on github + Kliko për të parë detajet në GitHub + + + Last updated + Përditësimi i fundit +
CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Po merrni të dhënat e pajtueshmërisë, ju lutemi prisni + + + Cancel + Anulo + + + Loading... + Po ngarkohet... + + + Error + Gabim + + + Unable to update compatibility data! Try again later. + Nuk mund të përditësohen të dhënat e pajtueshmërisë! Provoni përsëri më vonë. + + + Unable to open compatibility_data.json for writing. + Nuk mund të hapet compatibility_data.json për të shkruar. + + + Unknown + Jo i njohur + + + Nothing + Asgjë + + + Boots + Çizme + + + Menus + Menutë + + + Ingame + Në lojë + + + Playable + I luajtshëm + + + Unknown + Jo i njohur + + diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 2d3ff877a..8f793bce3 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -387,8 +387,8 @@ Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. - Unable to open compatibility.json for writing. - Kunde inte öppna compatibility.json för skrivning. + Unable to open compatibility_data.json for writing. + Kunde inte öppna compatibility_data.json för skrivning. Unknown @@ -542,14 +542,14 @@ Game can be completed with playable performance and no major glitches Spelet kan spelas klart med spelbar prestanda och utan större problem - - Click to go to issue - Klicka för att gå till problem - - - Last updated - Senast uppdaterad - + + Click to see details on github + Klicka för att se detaljer på GitHub + + + Last updated + Senast uppdaterad +
GameListUtils @@ -1181,7 +1181,7 @@ Grafik - Gui + GUI Gränssnitt @@ -1584,4 +1584,59 @@ Trofé-visare + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Hämtar kompatibilitetsdata, vänligen vänta + + + Cancel + Avbryt + + + Loading... + Laddar... + + + Error + Fel + + + Unable to update compatibility data! Try again later. + Det går inte att uppdatera kompatibilitetsdata! Försök igen senare. + + + Unable to open compatibility_data.json for writing. + Kan inte öppna compatibility_data.json för skrivning. + + + Unknown + Okänt + + + Nothing + Inget + + + Boots + Stövlar + + + Menus + Menyer + + + Ingame + I spelet + + + Playable + Spelbar + + + Unknown + Okänt + + diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 64807c5a6..56fccacdc 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -629,7 +629,7 @@ Grafikler - Gui + GUI Arayüz @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Oyun, oynanabilir performansla tamamlanabilir ve büyük aksaklık yok + + Click to see details on github + Detayları görmek için GitHub’a tıklayın + + + Last updated + Son güncelleme + CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Uyumluluk verileri alınıyor, lütfen bekleyin + + + Cancel + İptal + + + Loading... + Yükleniyor... + + + Error + Hata + + + Unable to update compatibility data! Try again later. + Uyumluluk verileri güncellenemedi! Lütfen daha sonra tekrar deneyin. + + + Unable to open compatibility_data.json for writing. + compatibility_data.json dosyasını yazmak için açamadık. + + + Unknown + Bilinmeyen + + + Nothing + Hiçbir şey + + + Boots + Botlar + + + Menus + Menüler + + + Ingame + Oyunda + + + Playable + Oynanabilir + + + Unknown + Bilinmeyen + + diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index f7e5a7495..682dee9ad 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1375,6 +1375,14 @@ Game can be completed with playable performance and no major glitches Гру можна пройти з хорошою продуктивністю та без серйозних глюків. + + Click to see details on github + Натисніть, щоб переглянути деталі на GitHub + + + Last updated + Останнє оновлення + CheckUpdate @@ -1529,8 +1537,8 @@ Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. - Unable to open compatibility.json for writing. - Не вдалося відкрити файл compatibility.json для запису. + Unable to open compatibility_data.json for writing. + Не вдалося відкрити файл compatibility_data.json для запису. Unknown @@ -1557,4 +1565,59 @@ Іграбельно + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Завантаження даних про сумісність, будь ласка, зачекайте + + + Cancel + Скасувати + + + Loading... + Завантаження... + + + Error + Помилка + + + Unable to update compatibility data! Try again later. + Не вдалося оновити дані про сумісність! Спробуйте пізніше. + + + Unable to open compatibility_data.json for writing. + Не вдалося відкрити compatibility_data.json для запису. + + + Unknown + Невідомо + + + Nothing + Нічого + + + Boots + Чоботи + + + Menus + Меню + + + Ingame + У грі + + + Playable + Іграбельно + + + Unknown + Невідомо + + diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index b38be2ee1..f978b227a 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI Giao diện @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + Nhấp để xem chi tiết trên GitHub + + + Last updated + Cập nhật lần cuối + CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Đang tải dữ liệu tương thích, vui lòng chờ + + + Cancel + Hủy bỏ + + + Loading... + Đang tải... + + + Error + Lỗi + + + Unable to update compatibility data! Try again later. + Không thể cập nhật dữ liệu tương thích! Vui lòng thử lại sau. + + + Unable to open compatibility_data.json for writing. + Không thể mở compatibility_data.json để ghi. + + + Unknown + Không xác định + + + Nothing + Không có gì + + + Boots + Giày ủng + + + Menus + Menu + + + Ingame + Trong game + + + Playable + Có thể chơi + + + Unknown + Không xác định + + \ No newline at end of file diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 5afc679da..dea9c4777 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -637,7 +637,7 @@ 图像 - Gui + GUI 界面 @@ -1311,6 +1311,14 @@ Game can be completed with playable performance and no major glitches 游戏能在可玩的性能下通关且没有重大 Bug + + Click to see details on github + 点击查看 GitHub 上的详细信息 + + + Last updated + 最后更新 + CheckUpdate @@ -1469,4 +1477,59 @@ 可通关 + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 正在获取兼容性数据,请稍等 + + + Cancel + 取消 + + + Loading... + 加载中... + + + Error + 错误 + + + Unable to update compatibility data! Try again later. + 无法更新兼容性数据!稍后再试。 + + + Unable to open compatibility_data.json for writing. + 无法打开 compatibility_data.json 进行写入。 + + + Unknown + 未知 + + + Nothing + 没有 + + + Boots + 靴子 + + + Menus + 菜单 + + + Ingame + 游戏内 + + + Playable + 可玩 + + + Unknown + 未知 + + diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index faed8ae61..4fc10a5c7 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -629,7 +629,7 @@ Graphics - Gui + GUI 介面 @@ -1278,6 +1278,14 @@ Game can be completed with playable performance and no major glitches Game can be completed with playable performance and no major glitches + + Click to see details on github + 點擊查看 GitHub 上的詳細資訊 + + + Last updated + 最後更新 + CheckUpdate @@ -1409,4 +1417,59 @@ TB + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 正在取得相容性資料,請稍候 + + + Cancel + 取消 + + + Loading... + 載入中... + + + Error + 錯誤 + + + Unable to update compatibility data! Try again later. + 無法更新相容性資料!請稍後再試。 + + + Unable to open compatibility_data.json for writing. + 無法開啟 compatibility_data.json 進行寫入。 + + + Unknown + 未知 + + + Nothing + + + + Boots + 靴子 + + + Menus + 選單 + + + Ingame + 遊戲內 + + + Playable + 可玩 + + + Unknown + 未知 + + \ No newline at end of file From a7a8ebcd778a20555e106ae2d145a8a949b07287 Mon Sep 17 00:00:00 2001 From: Martin <67326368+Martini-141@users.noreply.github.com> Date: Sat, 8 Feb 2025 19:49:34 +0100 Subject: [PATCH 243/455] Fix duplicated translations (#2377) * fix spelling and wording mistakes nb.ts * remove second CompatibilityInfoClass * fix duplicate compile warnings --- src/qt_gui/translations/ar.ts | 8 +-- src/qt_gui/translations/da_DK.ts | 8 +-- src/qt_gui/translations/de.ts | 39 ++---------- src/qt_gui/translations/el.ts | 8 +-- src/qt_gui/translations/en.ts | 8 +-- src/qt_gui/translations/es_ES.ts | 37 +---------- src/qt_gui/translations/fa_IR.ts | 8 +-- src/qt_gui/translations/fi.ts | 8 +-- src/qt_gui/translations/fr.ts | 37 +---------- src/qt_gui/translations/hu_HU.ts | 8 +-- src/qt_gui/translations/id.ts | 8 +-- src/qt_gui/translations/it.ts | 6 +- src/qt_gui/translations/ja_JP.ts | 8 +-- src/qt_gui/translations/ko_KR.ts | 8 +-- src/qt_gui/translations/lt_LT.ts | 8 +-- src/qt_gui/translations/nb.ts | 47 +------------- src/qt_gui/translations/nl.ts | 8 +-- src/qt_gui/translations/pl_PL.ts | 8 +-- src/qt_gui/translations/pt_BR.ts | 6 +- src/qt_gui/translations/ro_RO.ts | 8 +-- src/qt_gui/translations/ru_RU.ts | 73 +++------------------- src/qt_gui/translations/sq.ts | 6 +- src/qt_gui/translations/sv.ts | 73 +++------------------- src/qt_gui/translations/tr_TR.ts | 6 +- src/qt_gui/translations/uk_UA.ts | 103 +++++++------------------------ src/qt_gui/translations/vi_VN.ts | 8 +-- src/qt_gui/translations/zh_CN.ts | 43 ++----------- src/qt_gui/translations/zh_TW.ts | 8 +-- 28 files changed, 92 insertions(+), 512 deletions(-) diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts index 2ffa494ab..7a6054025 100644 --- a/src/qt_gui/translations/ar.ts +++ b/src/qt_gui/translations/ar.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable قابل للعب - - Unknown - غير معروف - - \ No newline at end of file + diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index a9673906e..a3f66a8f1 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Spilbar - - Unknown - Ukendt - - \ No newline at end of file + diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index dda113dfc..83b73628b 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1441,33 +1441,6 @@ TB - - CompatibilityInfoClass - - Unknown - Unbekannt - - - Nothing - Nichts - - - Boots - Startet - - - Menus - Menüs - - - Ingame - ImSpiel - - - Playable - Spielbar - - CompatibilityInfoClass @@ -1504,7 +1477,7 @@ Boots - Stiefel + Startet Menus @@ -1512,15 +1485,11 @@ Ingame - Im Spiel + ImSpiel Playable Spielbar - - Unknown - Unbekannt - - \ No newline at end of file + diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 7eaee5c4e..8d6237d9f 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Παιχνιδεύσιμο - - Unknown - Άγνωστο - - \ No newline at end of file + diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 1fb565198..10a4ce247 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1500,9 +1500,5 @@ Playable Playable - - Unknown - Unknown - - \ No newline at end of file + diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 0aef0224c..12a214fa9 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1433,33 +1433,6 @@ TB - - CompatibilityInfoClass - - Unknown - Desconocido - - - Nothing - Nada - - - Boots - Inicia - - - Menus - Menús - - - Ingame - En el juego - - - Playable - Jugable - - CompatibilityInfoClass @@ -1496,7 +1469,7 @@ Boots - Botas + Inicia Menus @@ -1510,9 +1483,5 @@ Playable Jugable - - Unknown - Desconocido - - \ No newline at end of file + diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 799cd71f4..ba937b08f 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable قابل بازی - - Unknown - ناشناخته - - \ No newline at end of file + diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index b369e437f..3ffa5df60 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Pelattava - - Unknown - Tuntematon - - \ No newline at end of file + diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 515c4e77a..97be56eb2 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1417,33 +1417,6 @@ TB - - CompatibilityInfoClass - - Unknown - Inconnu - - - Nothing - Rien - - - Boots - Démarre - - - Menus - Menu - - - Ingame - En jeu - - - Playable - Jouable - - CompatibilityInfoClass @@ -1480,11 +1453,11 @@ Boots - Bottes + Démarre Menus - Menus + Menu Ingame @@ -1494,9 +1467,5 @@ Playable Jouable - - Unknown - Inconnu - diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 86266757f..ced43daa0 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Játszható - - Unknown - Ismeretlen - - \ No newline at end of file + diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index ca8305f31..bc8e8324d 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Playable - - Unknown - Tidak Dikenal - - \ No newline at end of file + diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index cdb3c9a25..c65aef498 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Giocabile - - Unknown - Sconosciuto - diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 472a95d8d..d566b005d 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable プレイ可能 - - Unknown - 不明 - - \ No newline at end of file + diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 5d0700da7..799e706a7 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable 플레이 가능 - - Unknown - 알 수 없음 - - \ No newline at end of file + diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 6ed478ce4..4800ab7bb 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Žaidžiamas - - Unknown - Nežinoma - - \ No newline at end of file + diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts index abab0ebd4..c6e20466d 100644 --- a/src/qt_gui/translations/nb.ts +++ b/src/qt_gui/translations/nb.ts @@ -1461,45 +1461,6 @@ TB - - CompatibilityInfoClass - - Unknown - Ukjent - - - Nothing - Ingenting - - - Boots - Starter opp - - - Menus - Meny - - - Ingame - I spill - - - Playable - Spillbar - - - Fetching compatibility data, please wait - Henter kompatibilitetsdata, vennligst vent - - - Cancel - Avbryt - - - Loading... - Laster... - - CompatibilityInfoClass @@ -1528,7 +1489,7 @@ Unknown - Ukendt + Ukjent Nothing @@ -1536,7 +1497,7 @@ Boots - Støvler + Starter opp Menus @@ -1550,9 +1511,5 @@ Playable Spillbar - - Unknown - Ukendt - diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 7f2a49de0..0975f1b14 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Speelbaar - - Unknown - Onbekend - - \ No newline at end of file + diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 005be6fc9..e90bbef38 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Do grania - - Unknown - Nieznany - - \ No newline at end of file + diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index c6bc0ffda..83dd0a6b7 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1471,9 +1471,5 @@ Playable Jogável - - Unknown - Desconhecido - diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 90e8afb60..ccafb59e4 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Jucabil - - Unknown - Necunoscut - - \ No newline at end of file + diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 63dd8c48e..8ade23e1c 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1064,10 +1064,6 @@ Nightly Nightly - - GUI - Интерфейс - Set the volume of the background music. Установите громкость фоновой музыки. @@ -1561,66 +1557,15 @@ ТБ - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Загрузка данных о совместимости, пожалуйста, подождите - - - Cancel - Отмена - - - Loading... - Загрузка... - - - Error - Ошибка - - - Unable to update compatibility data! Try again later. - Не удалось обновить данные совместимости! Повторите попытку позже. - - - Unable to open compatibility_data.json for writing. - Не удалось открыть файл compatibility_data.json для записи. - - - Unknown - Неизвестно - - - Nothing - Ничего - - - Boots - Запускается - - - Menus - В меню - - - Ingame - В игре - - - Playable - Играбельно - - CompatibilityInfoClass Fetching compatibility data, please wait - Загрузка данных о совместимости, пожалуйста подождите + Загрузка данных о совместимости, пожалуйста, подождите Cancel - Отменить + Отмена Loading... @@ -1632,11 +1577,11 @@ Unable to update compatibility data! Try again later. - Не удалось обновить данные о совместимости! Попробуйте позже. + Не удалось обновить данные совместимости! Повторите попытку позже. Unable to open compatibility_data.json for writing. - Не удается открыть compatibility_data.json для записи. + Не удалось открыть файл compatibility_data.json для записи. Unknown @@ -1648,11 +1593,11 @@ Boots - Ботинки + Запускается Menus - Меню + В меню Ingame @@ -1662,9 +1607,5 @@ Playable Играбельно - - Unknown - Неизвестно - diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index e9fcd55e6..caab33ef0 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable I luajtshëm - - Unknown - Jo i njohur - diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 8f793bce3..ec2515e6d 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -364,57 +364,6 @@ Misslyckades med att skapa uppdateringsskriptfil - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Hämtar kompatibilitetsdata, vänta - - - Cancel - Avbryt - - - Loading... - Läser in... - - - Error - Fel - - - Unable to update compatibility data! Try again later. - Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. - - - Unable to open compatibility_data.json for writing. - Kunde inte öppna compatibility_data.json för skrivning. - - - Unknown - Okänt - - - Nothing - Ingenting - - - Boots - Startar upp - - - Menus - Menyer - - - Ingame - Problem - - - Playable - Spelbart - - ElfViewer @@ -1572,10 +1521,6 @@ browseButton Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data - - GUI - Gränssnitt - TrophyViewer @@ -1596,7 +1541,7 @@ Loading... - Laddar... + Läser in... Error @@ -1604,11 +1549,11 @@ Unable to update compatibility data! Try again later. - Det går inte att uppdatera kompatibilitetsdata! Försök igen senare. + Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. Unable to open compatibility_data.json for writing. - Kan inte öppna compatibility_data.json för skrivning. + Kunde inte öppna compatibility_data.json för skrivning. Unknown @@ -1616,11 +1561,11 @@ Nothing - Inget + Ingenting Boots - Stövlar + Startar upp Menus @@ -1632,11 +1577,7 @@ Playable - Spelbar - - - Unknown - Okänt + Spelbart diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 56fccacdc..cd2b4636c 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Oynanabilir - - Unknown - Bilinmeyen - diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 682dee9ad..3beb07285 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1517,29 +1517,29 @@ CompatibilityInfoClass - Fetching compatibility data, please wait - Отримання даних про сумісність. Будь ласка, зачекайте - - - Cancel - Відмінити - - - Loading... - Завантаження... - - - Error - Помилка - - - Unable to update compatibility data! Try again later. - Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. - - - Unable to open compatibility_data.json for writing. - Не вдалося відкрити файл compatibility_data.json для запису. - + Fetching compatibility data, please wait + Отримання даних про сумісність. Будь ласка, зачекайте + + + Cancel + Відмінити + + + Loading... + Завантаження... + + + Error + Помилка + + + Unable to update compatibility data! Try again later. + Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. + + + Unable to open compatibility_data.json for writing. + Не вдалося відкрити файл compatibility_data.json для запису. + Unknown Невідомо @@ -1565,59 +1565,4 @@ Іграбельно - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Завантаження даних про сумісність, будь ласка, зачекайте - - - Cancel - Скасувати - - - Loading... - Завантаження... - - - Error - Помилка - - - Unable to update compatibility data! Try again later. - Не вдалося оновити дані про сумісність! Спробуйте пізніше. - - - Unable to open compatibility_data.json for writing. - Не вдалося відкрити compatibility_data.json для запису. - - - Unknown - Невідомо - - - Nothing - Нічого - - - Boots - Чоботи - - - Menus - Меню - - - Ingame - У грі - - - Playable - Іграбельно - - - Unknown - Невідомо - - diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index f978b227a..47ef07ace 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable Có thể chơi - - Unknown - Không xác định - - \ No newline at end of file + diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index dea9c4777..00cc9ae92 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1450,33 +1450,6 @@ TB - - CompatibilityInfoClass - - Unknown - 未知 - - - Nothing - 无法启动 - - - Boots - 可启动 - - - Menus - 可进入菜单 - - - Ingame - 可进入游戏内 - - - Playable - 可通关 - - CompatibilityInfoClass @@ -1509,27 +1482,23 @@ Nothing - 没有 + 无法启动 Boots - 靴子 + 可启动 Menus - 菜单 + 可进入菜单 Ingame - 游戏内 + 可进入游戏内 Playable - 可玩 - - - Unknown - 未知 + 可通关 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 4fc10a5c7..e05519d7a 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1,7 +1,7 @@ - AboutDialog @@ -1467,9 +1467,5 @@ Playable 可玩 - - Unknown - 未知 - - \ No newline at end of file + From 9dc3e39fc2c0c02b3b592dddca46035ed918d478 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:21:32 -0800 Subject: [PATCH 244/455] address_space: Split macOS reserved memory region. (#2372) --- CMakeLists.txt | 2 +- src/core/address_space.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1ec7b7b9..506198e1a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1016,7 +1016,7 @@ if (APPLE) if (ARCHITECTURE STREQUAL "x86_64") # Reserve system-managed memory space. - target_link_options(shadps4 PRIVATE -Wl,-no_pie,-no_fixup_chains,-no_huge,-pagezero_size,0x4000,-segaddr,TCB_SPACE,0x4000,-segaddr,GUEST_SYSTEM,0x400000,-image_base,0x20000000000) + target_link_options(shadps4 PRIVATE -Wl,-no_pie,-no_fixup_chains,-no_huge,-pagezero_size,0x4000,-segaddr,TCB_SPACE,0x4000,-segaddr,SYSTEM_MANAGED,0x400000,-segaddr,SYSTEM_RESERVED,0x7FFFFC000,-image_base,0x20000000000) endif() # Replacement for std::chrono::time_zone diff --git a/src/core/address_space.cpp b/src/core/address_space.cpp index e9fb8cfbc..2e66bdf83 100644 --- a/src/core/address_space.cpp +++ b/src/core/address_space.cpp @@ -21,7 +21,8 @@ #if defined(__APPLE__) && defined(ARCH_X86_64) // Reserve space for the system address space using a zerofill section. -asm(".zerofill GUEST_SYSTEM,GUEST_SYSTEM,__guest_system,0xFBFC00000"); +asm(".zerofill SYSTEM_MANAGED,SYSTEM_MANAGED,__SYSTEM_MANAGED,0x7FFBFC000"); +asm(".zerofill SYSTEM_RESERVED,SYSTEM_RESERVED,__SYSTEM_RESERVED,0x7C0004000"); #endif namespace Core { From fb0871dbc80454c7de102f4c39665f11d849959a Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Sun, 9 Feb 2025 16:11:24 +0300 Subject: [PATCH 245/455] ajm: mark empty batches as finished immediately (#2385) --- src/core/libraries/ajm/ajm_context.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/ajm/ajm_context.cpp b/src/core/libraries/ajm/ajm_context.cpp index 8992dd83b..0e2915f32 100644 --- a/src/core/libraries/ajm/ajm_context.cpp +++ b/src/core/libraries/ajm/ajm_context.cpp @@ -141,7 +141,12 @@ int AjmContext::BatchStartBuffer(u8* p_batch, u32 batch_size, const int priority *out_batch_id = batch_id.value(); batch_info->id = *out_batch_id; - batch_queue.EmplaceWait(batch_info); + if (!batch_info->jobs.empty()) { + batch_queue.EmplaceWait(batch_info); + } else { + // Empty batches are not submitted to the processor and are marked as finished + batch_info->finished.release(); + } return ORBIS_OK; } From 8f2883a388febb1222013d666e7401ab1cefcda1 Mon Sep 17 00:00:00 2001 From: psucien <168137814+psucien@users.noreply.github.com> Date: Sun, 9 Feb 2025 15:54:54 +0100 Subject: [PATCH 246/455] video_out: HDR support (#2381) * Initial HDR support * fix for crashes when debug tools used --- src/common/config.cpp | 8 +++ src/common/config.h | 1 + src/core/libraries/videoout/driver.h | 3 +- src/core/libraries/videoout/video_out.cpp | 54 +++++++++++++++++++ src/core/libraries/videoout/video_out.h | 7 +++ src/imgui/renderer/imgui_core.cpp | 4 ++ src/imgui/renderer/imgui_core.h | 2 + src/imgui/renderer/imgui_impl_vulkan.cpp | 16 ++++++ src/imgui/renderer/imgui_impl_vulkan.h | 3 +- src/video_core/host_shaders/post_process.frag | 19 ++++--- .../renderer_vulkan/vk_platform.cpp | 4 ++ .../renderer_vulkan/vk_presenter.cpp | 6 ++- src/video_core/renderer_vulkan/vk_presenter.h | 14 +++++ .../renderer_vulkan/vk_swapchain.cpp | 47 +++++++++++++--- src/video_core/renderer_vulkan/vk_swapchain.h | 13 +++++ src/video_core/texture_cache/image_info.cpp | 1 + 16 files changed, 186 insertions(+), 16 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 86e28285d..ee8da8cc3 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -31,6 +31,7 @@ std::filesystem::path find_fs_path_or(const basic_value& v, const K& ky, namespace Config { +static bool isHDRAllowed = false; static bool isNeo = false; static bool isFullscreen = false; static std::string fullscreenMode = "borderless"; @@ -101,6 +102,10 @@ static bool showBackgroundImage = true; // Language u32 m_language = 1; // english +bool allowHDR() { + return isHDRAllowed; +} + bool GetUseUnifiedInputConfig() { return useUnifiedInputConfig; } @@ -651,6 +656,7 @@ void load(const std::filesystem::path& path) { if (data.contains("General")) { const toml::value& general = data.at("General"); + isHDRAllowed = toml::find_or(general, "allowHDR", false); isNeo = toml::find_or(general, "isPS4Pro", false); isFullscreen = toml::find_or(general, "Fullscreen", false); fullscreenMode = toml::find_or(general, "FullscreenMode", "borderless"); @@ -786,6 +792,7 @@ void save(const std::filesystem::path& path) { fmt::print("Saving new configuration file {}\n", fmt::UTF(path.u8string())); } + data["General"]["allowHDR"] = isHDRAllowed; data["General"]["isPS4Pro"] = isNeo; data["General"]["Fullscreen"] = isFullscreen; data["General"]["FullscreenMode"] = fullscreenMode; @@ -894,6 +901,7 @@ void saveMainWindow(const std::filesystem::path& path) { } void setDefaultValues() { + isHDRAllowed = false; isNeo = false; isFullscreen = false; isTrophyPopupDisabled = false; diff --git a/src/common/config.h b/src/common/config.h index 69e497527..36654f1fa 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -51,6 +51,7 @@ void SetUseUnifiedInputConfig(bool use); u32 getScreenWidth(); u32 getScreenHeight(); s32 getGpuId(); +bool allowHDR(); bool debugDump(); bool collectShadersForDebug(); diff --git a/src/core/libraries/videoout/driver.h b/src/core/libraries/videoout/driver.h index ad7c7bec2..e57b189b5 100644 --- a/src/core/libraries/videoout/driver.h +++ b/src/core/libraries/videoout/driver.h @@ -18,7 +18,6 @@ struct Frame; namespace Libraries::VideoOut { struct VideoOutPort { - bool is_open = false; SceVideoOutResolutionStatus resolution; std::array buffer_slots; std::array buffer_labels; // should be contiguous in memory @@ -33,6 +32,8 @@ struct VideoOutPort { std::condition_variable vo_cv; std::condition_variable vblank_cv; int flip_rate = 0; + bool is_open = false; + bool is_mode_changing = false; // Used to prevent flip during mode change s32 FindFreeGroup() const { s32 index = 0; diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 65713019c..090ed8624 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -3,6 +3,7 @@ #include "common/assert.h" #include "common/config.h" +#include "common/elf_info.h" #include "common/logging/log.h" #include "core/libraries/libs.h" #include "core/libraries/system/userservice.h" @@ -315,6 +316,12 @@ s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** u s32 PS4_SYSV_ABI sceVideoOutGetDeviceCapabilityInfo( s32 handle, SceVideoOutDeviceCapabilityInfo* pDeviceCapabilityInfo) { pDeviceCapabilityInfo->capability = 0; + if (presenter->IsHDRSupported()) { + auto& game_info = Common::ElfInfo::Instance(); + if (game_info.GetPSFAttributes().support_hdr) { + pDeviceCapabilityInfo->capability |= ORBIS_VIDEO_OUT_DEVICE_CAPABILITY_BT2020_PQ; + } + } return ORBIS_OK; } @@ -352,6 +359,49 @@ s32 PS4_SYSV_ABI sceVideoOutAdjustColor(s32 handle, const SceVideoOutColorSettin return ORBIS_OK; } +struct Mode { + u32 size; + u8 encoding; + u8 range; + u8 colorimetry; + u8 depth; + u64 refresh_rate; + u64 resolution; + u8 reserved[8]; +}; + +void PS4_SYSV_ABI sceVideoOutModeSetAny_(Mode* mode, u32 size) { + std::memset(mode, 0xff, size); + mode->size = size; +} + +s32 PS4_SYSV_ABI sceVideoOutConfigureOutputMode_(s32 handle, u32 reserved, const Mode* mode, + const void* options, u32 size_mode, + u32 size_options) { + auto* port = driver->GetPort(handle); + if (!port) { + return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE; + } + + if (reserved != 0) { + return ORBIS_VIDEO_OUT_ERROR_INVALID_VALUE; + } + + if (mode->colorimetry != OrbisVideoOutColorimetry::Any) { + auto& game_info = Common::ElfInfo::Instance(); + if (mode->colorimetry == OrbisVideoOutColorimetry::Bt2020PQ && + game_info.GetPSFAttributes().support_hdr) { + port->is_mode_changing = true; + presenter->SetHDR(true); + port->is_mode_changing = false; + } else { + return ORBIS_VIDEO_OUT_ERROR_INVALID_VALUE; + } + } + + return ORBIS_OK; +} + void RegisterLib(Core::Loader::SymbolsResolver* sym) { driver = std::make_unique(Config::getScreenWidth(), Config::getScreenHeight()); @@ -390,6 +440,10 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { sceVideoOutAdjustColor); LIB_FUNCTION("-Ozn0F1AFRg", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutDeleteFlipEvent); + LIB_FUNCTION("pjkDsgxli6c", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, + sceVideoOutModeSetAny_); + LIB_FUNCTION("N1bEoJ4SRw4", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, + sceVideoOutConfigureOutputMode_); // openOrbis appears to have libSceVideoOut_v1 module libSceVideoOut_v1.1 LIB_FUNCTION("Up36PTk687E", "libSceVideoOut", 1, "libSceVideoOut", 1, 1, sceVideoOutOpen); diff --git a/src/core/libraries/videoout/video_out.h b/src/core/libraries/videoout/video_out.h index 2918fac30..ad8ce9ed2 100644 --- a/src/core/libraries/videoout/video_out.h +++ b/src/core/libraries/videoout/video_out.h @@ -40,6 +40,13 @@ constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_NONE = 0; constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_VR = 7; constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_STRICT_COLORIMETRY = 8; +constexpr int ORBIS_VIDEO_OUT_DEVICE_CAPABILITY_BT2020_PQ = 0x80; + +enum OrbisVideoOutColorimetry : u8 { + Bt2020PQ = 12, + Any = 0xFF, +}; + enum class OrbisVideoOutEventId : s16 { Flip = 0, Vblank = 1, diff --git a/src/imgui/renderer/imgui_core.cpp b/src/imgui/renderer/imgui_core.cpp index ab43b281e..50ce41ebf 100644 --- a/src/imgui/renderer/imgui_core.cpp +++ b/src/imgui/renderer/imgui_core.cpp @@ -118,6 +118,10 @@ void OnResize() { Sdl::OnResize(); } +void OnSurfaceFormatChange(vk::Format surface_format) { + Vulkan::OnSurfaceFormatChange(surface_format); +} + void Shutdown(const vk::Device& device) { auto result = device.waitIdle(); if (result != vk::Result::eSuccess) { diff --git a/src/imgui/renderer/imgui_core.h b/src/imgui/renderer/imgui_core.h index ffee62cf8..36ccff138 100644 --- a/src/imgui/renderer/imgui_core.h +++ b/src/imgui/renderer/imgui_core.h @@ -22,6 +22,8 @@ void Initialize(const Vulkan::Instance& instance, const Frontend::WindowSDL& win void OnResize(); +void OnSurfaceFormatChange(vk::Format surface_format); + void Shutdown(const vk::Device& device); bool ProcessEvent(SDL_Event* event); diff --git a/src/imgui/renderer/imgui_impl_vulkan.cpp b/src/imgui/renderer/imgui_impl_vulkan.cpp index 104ce4b52..af523089d 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.cpp +++ b/src/imgui/renderer/imgui_impl_vulkan.cpp @@ -1265,4 +1265,20 @@ void Shutdown() { IM_DELETE(bd); } +void OnSurfaceFormatChange(vk::Format surface_format) { + VkData* bd = GetBackendData(); + const InitInfo& v = bd->init_info; + auto& pl_format = const_cast( + bd->init_info.pipeline_rendering_create_info.pColorAttachmentFormats[0]); + if (pl_format != surface_format) { + pl_format = surface_format; + if (bd->pipeline) { + v.device.destroyPipeline(bd->pipeline, v.allocator); + bd->pipeline = VK_NULL_HANDLE; + CreatePipeline(v.device, v.allocator, v.pipeline_cache, nullptr, &bd->pipeline, + v.subpass); + } + } +} + } // namespace ImGui::Vulkan diff --git a/src/imgui/renderer/imgui_impl_vulkan.h b/src/imgui/renderer/imgui_impl_vulkan.h index 9b15dcae6..3e77627dd 100644 --- a/src/imgui/renderer/imgui_impl_vulkan.h +++ b/src/imgui/renderer/imgui_impl_vulkan.h @@ -67,5 +67,6 @@ void RenderDrawData(ImDrawData& draw_data, vk::CommandBuffer command_buffer, vk::Pipeline pipeline = VK_NULL_HANDLE); void SetBlendEnabled(bool enabled); +void OnSurfaceFormatChange(vk::Format surface_format); -} // namespace ImGui::Vulkan \ No newline at end of file +} // namespace ImGui::Vulkan diff --git a/src/video_core/host_shaders/post_process.frag b/src/video_core/host_shaders/post_process.frag index d501e9813..d222d070c 100644 --- a/src/video_core/host_shaders/post_process.frag +++ b/src/video_core/host_shaders/post_process.frag @@ -10,16 +10,23 @@ layout (binding = 0) uniform sampler2D texSampler; layout(push_constant) uniform settings { float gamma; + bool hdr; } pp; const float cutoff = 0.0031308, a = 1.055, b = 0.055, d = 12.92; -vec3 gamma(vec3 rgb) -{ - return mix(a * pow(rgb, vec3(1.0 / (2.4 + 1.0 - pp.gamma))) - b, d * rgb / pp.gamma, lessThan(rgb, vec3(cutoff))); +vec3 gamma(vec3 rgb) { + return mix( + a * pow(rgb, vec3(1.0 / (2.4 + 1.0 - pp.gamma))) - b, + d * rgb / pp.gamma, + lessThan(rgb, vec3(cutoff)) + ); } -void main() -{ +void main() { vec4 color_linear = texture(texSampler, uv); - color = vec4(gamma(color_linear.rgb), color_linear.a); + if (pp.hdr) { + color = color_linear; + } else { + color = vec4(gamma(color_linear.rgb), color_linear.a); + } } diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index 07ebfbda6..cb67232d5 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -160,6 +160,10 @@ std::vector GetInstanceExtensions(Frontend::WindowSystemType window extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); } + if (Config::allowHDR()) { + extensions.push_back(VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME); + } + if (enable_debug_utils) { extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); } diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index c2be1c3e8..0fbc17908 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -397,6 +397,7 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { frame->height = height; frame->imgui_texture = ImGui::Vulkan::AddTexture(view, vk::ImageLayout::eShaderReadOnlyOptimal); + frame->is_hdr = swapchain.GetHDR(); } Frame* Presenter::PrepareLastFrame() { @@ -562,7 +563,8 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) if (image_id != VideoCore::NULL_IMAGE_ID) { const auto& image = texture_cache.GetImage(image_id); const auto extent = image.info.size; - if (frame->width != extent.width || frame->height != extent.height) { + if (frame->width != extent.width || frame->height != extent.height || + frame->is_hdr != swapchain.GetHDR()) { RecreateFrame(frame, extent.width, extent.height); } } @@ -913,7 +915,7 @@ Frame* Presenter::GetRenderFrame() { } // Initialize default frame image - if (frame->width == 0 || frame->height == 0) { + if (frame->width == 0 || frame->height == 0 || frame->is_hdr != swapchain.GetHDR()) { RecreateFrame(frame, 1920, 1080); } diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 63cb30834..60b3e4626 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -31,6 +31,7 @@ struct Frame { vk::Fence present_done; vk::Semaphore ready_semaphore; u64 ready_tick; + bool is_hdr{false}; ImTextureID imgui_texture; }; @@ -46,6 +47,7 @@ class Rasterizer; class Presenter { struct PostProcessSettings { float gamma = 1.0f; + bool hdr = false; }; public: @@ -102,6 +104,18 @@ public: return *rasterizer.get(); } + bool IsHDRSupported() const { + return swapchain.HasHDR(); + } + + void SetHDR(bool enable) { + if (!IsHDRSupported()) { + return; + } + swapchain.SetHDR(enable); + pp_settings.hdr = enable; + } + private: void CreatePostProcessPipeline(); Frame* PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop = true); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 5467a5733..de7bec894 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -4,6 +4,7 @@ #include #include #include "common/assert.h" +#include "common/config.h" #include "common/logging/log.h" #include "imgui/renderer/imgui_core.h" #include "sdl_window.h" @@ -12,8 +13,13 @@ namespace Vulkan { -Swapchain::Swapchain(const Instance& instance_, const Frontend::WindowSDL& window) - : instance{instance_}, surface{CreateSurface(instance.GetInstance(), window)} { +static constexpr vk::SurfaceFormatKHR SURFACE_FORMAT_HDR = { + .format = vk::Format::eA2B10G10R10UnormPack32, + .colorSpace = vk::ColorSpaceKHR::eHdr10St2084EXT, +}; + +Swapchain::Swapchain(const Instance& instance_, const Frontend::WindowSDL& window_) + : instance{instance_}, window{window_}, surface{CreateSurface(instance.GetInstance(), window)} { FindPresentFormat(); Create(window.GetWidth(), window.GetHeight()); @@ -57,11 +63,12 @@ void Swapchain::Create(u32 width_, u32 height_) { const u32 queue_family_indices_count = exclusive ? 1u : 2u; const vk::SharingMode sharing_mode = exclusive ? vk::SharingMode::eExclusive : vk::SharingMode::eConcurrent; + const auto format = needs_hdr ? SURFACE_FORMAT_HDR : surface_format; const vk::SwapchainCreateInfoKHR swapchain_info = { .surface = surface, .minImageCount = image_count, - .imageFormat = surface_format.format, - .imageColorSpace = surface_format.colorSpace, + .imageFormat = format.format, + .imageColorSpace = format.colorSpace, .imageExtent = extent, .imageArrayLayers = 1, .imageUsage = vk::ImageUsageFlagBits::eColorAttachment | @@ -86,10 +93,28 @@ void Swapchain::Create(u32 width_, u32 height_) { } void Swapchain::Recreate(u32 width_, u32 height_) { - LOG_DEBUG(Render_Vulkan, "Recreate the swapchain: width={} height={}", width_, height_); + LOG_DEBUG(Render_Vulkan, "Recreate the swapchain: width={} height={} HDR={}", width_, height_, + needs_hdr); Create(width_, height_); } +void Swapchain::SetHDR(bool hdr) { + if (needs_hdr == hdr) { + return; + } + + auto result = instance.GetDevice().waitIdle(); + if (result != vk::Result::eSuccess) { + LOG_WARNING(ImGui, "Failed to wait for Vulkan device idle on mode change: {}", + vk::to_string(result)); + } + + needs_hdr = hdr; + Recreate(width, height); + ImGui::Core::OnSurfaceFormatChange(needs_hdr ? SURFACE_FORMAT_HDR.format + : surface_format.format); +} + bool Swapchain::AcquireNextImage() { vk::Device device = instance.GetDevice(); vk::Result result = @@ -144,6 +169,16 @@ void Swapchain::FindPresentFormat() { ASSERT_MSG(formats_result == vk::Result::eSuccess, "Failed to query surface formats: {}", vk::to_string(formats_result)); + // Check if the device supports HDR formats. Here we care of Rec.2020 PQ only as it is expected + // game output. Other variants as e.g. linear Rec.2020 will require additional color space + // rotation + supports_hdr = + std::find_if(formats.begin(), formats.end(), [](const vk::SurfaceFormatKHR& format) { + return format == SURFACE_FORMAT_HDR; + }) != formats.end(); + // Also make sure that user allowed us to use HDR + supports_hdr &= Config::allowHDR(); + // If there is a single undefined surface format, the device doesn't care, so we'll just use // RGBA sRGB. if (formats[0].format == vk::Format::eUndefined) { @@ -262,7 +297,7 @@ void Swapchain::SetupImages() { auto [im_view_result, im_view] = device.createImageView(vk::ImageViewCreateInfo{ .image = images[i], .viewType = vk::ImageViewType::e2D, - .format = surface_format.format, + .format = needs_hdr ? SURFACE_FORMAT_HDR.format : surface_format.format, .subresourceRange = { .aspectMask = vk::ImageAspectFlagBits::eColor, diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index f5cf9f0d2..7944566fa 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -82,6 +82,16 @@ public: return present_ready[image_index]; } + bool HasHDR() const { + return supports_hdr; + } + + void SetHDR(bool hdr); + + bool GetHDR() const { + return needs_hdr; + } + private: /// Selects the best available swapchain image format void FindPresentFormat(); @@ -100,6 +110,7 @@ private: private: const Instance& instance; + const Frontend::WindowSDL& window; vk::SwapchainKHR swapchain{}; vk::SurfaceKHR surface{}; vk::SurfaceFormatKHR surface_format; @@ -117,6 +128,8 @@ private: u32 image_index = 0; u32 frame_index = 0; bool needs_recreation = true; + bool needs_hdr = false; // The game requested HDR swapchain + bool supports_hdr = false; // SC supports HDR output }; } // namespace Vulkan diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index dd89be8aa..852ade1f0 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -22,6 +22,7 @@ static vk::Format ConvertPixelFormat(const VideoOutFormat format) { return vk::Format::eR8G8B8A8Srgb; case VideoOutFormat::A2R10G10B10: case VideoOutFormat::A2R10G10B10Srgb: + case VideoOutFormat::A2R10G10B10Bt2020Pq: return vk::Format::eA2R10G10B10UnormPack32; default: break; From 214eab2c52cc8adf7e7ace101d8ac2da2b5a2ac5 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 9 Feb 2025 08:57:10 -0800 Subject: [PATCH 247/455] gnmdriver: Fill in functions stubbed on real firmware. (#2379) --- src/core/libraries/gnmdriver/gnmdriver.cpp | 596 ++++++++++++--------- src/core/libraries/gnmdriver/gnmdriver.h | 30 +- 2 files changed, 372 insertions(+), 254 deletions(-) diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index 06124167c..b22dd9893 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -205,48 +205,57 @@ int PS4_SYSV_ABI sceGnmCreateWorkloadStream(u64 param1, u32* workload_stream) { } int PS4_SYSV_ABI sceGnmDebuggerGetAddressWatch() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerHaltWavefront() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerReadGds() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerReadSqIndirectRegister() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerResumeWavefront() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerResumeWavefrontCreation() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerSetAddressWatch() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerWriteGds() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebuggerWriteSqIndirectRegister() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebugHardwareStatus() { @@ -751,57 +760,68 @@ int PS4_SYSV_ABI sceGnmDrawOpaqueAuto() { bool PS4_SYSV_ABI sceGnmDriverCaptureInProgress() { LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return false; } -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterface() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterface() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0x80000000; } -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuDebugger() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuDebugger() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0x80000000; } -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuException() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuException() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0x80000000; } -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForHDRScopes() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForHDRScopes() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0x80000000; } -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForReplay() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForReplay() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0x80000000; } -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForResourceRegistration() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForResourceRegistration() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0x80000000; } -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForValidation() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForValidation() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0x80000000; } int PS4_SYSV_ABI sceGnmDriverInternalVirtualQuery() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } -int PS4_SYSV_ABI sceGnmDriverTraceInProgress() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +bool PS4_SYSV_ABI sceGnmDriverTraceInProgress() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return false; } int PS4_SYSV_ABI sceGnmDriverTriggerCapture() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_CAPTURE_RAZOR_NOT_LOADED; } int PS4_SYSV_ABI sceGnmEndWorkload(u64 workload) { @@ -813,7 +833,8 @@ int PS4_SYSV_ABI sceGnmEndWorkload(u64 workload) { s32 PS4_SYSV_ABI sceGnmFindResourcesPublic() { LOG_TRACE(Lib_GnmDriver, "called"); - return ORBIS_GNM_ERROR_FAILURE; // not available in retail FW + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } void PS4_SYSV_ABI sceGnmFlushGarlic() { @@ -836,8 +857,9 @@ int PS4_SYSV_ABI sceGnmGetCoredumpProtectionFaultTimestamp() { } int PS4_SYSV_ABI sceGnmGetDbgGcHandle() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return -1; } int PS4_SYSV_ABI sceGnmGetDebugTimestamp() { @@ -856,7 +878,8 @@ int PS4_SYSV_ABI sceGnmGetEqTimeStamp() { } int PS4_SYSV_ABI sceGnmGetGpuBlockStatus() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } @@ -867,12 +890,14 @@ u32 PS4_SYSV_ABI sceGnmGetGpuCoreClockFrequency() { } int PS4_SYSV_ABI sceGnmGetGpuInfoStatus() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } int PS4_SYSV_ABI sceGnmGetLastWaitedAddress() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } @@ -887,52 +912,62 @@ int PS4_SYSV_ABI sceGnmGetOffChipTessellationBufferSize() { } int PS4_SYSV_ABI sceGnmGetOwnerName() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmGetPhysicalCounterFromVirtualized() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } -int PS4_SYSV_ABI sceGnmGetProtectionFaultTimeStamp() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +u32 PS4_SYSV_ABI sceGnmGetProtectionFaultTimeStamp() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return 0; } int PS4_SYSV_ABI sceGnmGetResourceBaseAddressAndSizeInBytes() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmGetResourceName() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmGetResourceShaderGuid() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmGetResourceType() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmGetResourceUserData() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmGetShaderProgramBaseAddress() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } int PS4_SYSV_ABI sceGnmGetShaderStatus() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } @@ -941,14 +976,14 @@ VAddr PS4_SYSV_ABI sceGnmGetTheTessellationFactorRingBufferBaseAddress() { return tessellation_factors_ring_addr; } -int PS4_SYSV_ABI sceGnmGpuPaDebugEnter() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +void PS4_SYSV_ABI sceGnmGpuPaDebugEnter() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware } -int PS4_SYSV_ABI sceGnmGpuPaDebugLeave() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +void PS4_SYSV_ABI sceGnmGpuPaDebugLeave() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware } int PS4_SYSV_ABI sceGnmInsertDingDongMarker() { @@ -1039,7 +1074,8 @@ s32 PS4_SYSV_ABI sceGnmInsertSetMarker(u32* cmdbuf, u32 size, const char* marker } int PS4_SYSV_ABI sceGnmInsertThreadTraceMarker() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } @@ -1069,9 +1105,10 @@ int PS4_SYSV_ABI sceGnmIsCoredumpValid() { return ORBIS_OK; } -int PS4_SYSV_ABI sceGnmIsUserPaEnabled() { +bool PS4_SYSV_ABI sceGnmIsUserPaEnabled() { LOG_TRACE(Lib_GnmDriver, "called"); - return 0; // PA Debug is always disabled in retail FW + // Not available in retail firmware + return false; } int PS4_SYSV_ABI sceGnmLogicalCuIndexToPhysicalCuIndex() { @@ -1136,50 +1173,58 @@ int PS4_SYSV_ABI sceGnmMapComputeQueueWithPriority(u32 pipe_id, u32 queue_id, VA } int PS4_SYSV_ABI sceGnmPaDisableFlipCallbacks() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } int PS4_SYSV_ABI sceGnmPaEnableFlipCallbacks() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } int PS4_SYSV_ABI sceGnmPaHeartbeat() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } int PS4_SYSV_ABI sceGnmQueryResourceRegistrationUserMemoryRequirements() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmRaiseUserExceptionEvent() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return ORBIS_OK; } int PS4_SYSV_ABI sceGnmRegisterGdsResource() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } -int PS4_SYSV_ABI sceGnmRegisterGnmLiveCallbackConfig() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +void PS4_SYSV_ABI sceGnmRegisterGnmLiveCallbackConfig() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware } s32 PS4_SYSV_ABI sceGnmRegisterOwner(void* handle, const char* name) { LOG_TRACE(Lib_GnmDriver, "called"); - return ORBIS_GNM_ERROR_FAILURE; // PA Debug is always disabled in retail FW + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } s32 PS4_SYSV_ABI sceGnmRegisterResource(void* res_handle, void* owner_handle, const void* addr, size_t size, const char* name, int res_type, u64 user_data) { LOG_TRACE(Lib_GnmDriver, "called"); - return ORBIS_GNM_ERROR_FAILURE; // PA Debug is always disabled in retail FW + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmRequestFlipAndSubmitDone() { @@ -1215,43 +1260,51 @@ s32 PS4_SYSV_ABI sceGnmResetVgtControl(u32* cmdbuf, u32 size) { } int PS4_SYSV_ABI sceGnmSdmaClose() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSdmaConstFill() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSdmaCopyLinear() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSdmaCopyTiled() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSdmaCopyWindow() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSdmaFlush() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSdmaGetMinCmdSize() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSdmaOpen() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } s32 PS4_SYSV_ABI sceGnmSetCsShader(u32* cmdbuf, u32 size, const u32* cs_regs) { @@ -1638,23 +1691,27 @@ s32 PS4_SYSV_ABI sceGnmSetPsShader350(u32* cmdbuf, u32 size, const u32* ps_regs) } int PS4_SYSV_ABI sceGnmSetResourceRegistrationUserMemory() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSetResourceUserData() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSetSpiEnableSqCounters() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSetSpiEnableSqCountersForUnitInstance() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSetupMipStatsReport() { @@ -1737,188 +1794,225 @@ int PS4_SYSV_ABI sceGnmSetWaveLimitMultipliers() { } int PS4_SYSV_ABI sceGnmSpmEndSpm() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmInit() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmInit2() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmSetDelay() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmSetMuxRam() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmSetMuxRam2() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmSetSelectCounter() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmSetSpmSelects() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmSetSpmSelects2() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSpmStartSpm() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttFini() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttFinishTrace() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetBcInfo() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetGpuClocks() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetHiWater() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetStatus() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetTraceCounter() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetTraceWptr() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetWrapCounts() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetWrapCounts2() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttGetWritebackLabels() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttInit() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSelectMode() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSelectTarget() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSelectTokens() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSetCuPerfMask() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSetDceEventWrite() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSetHiWater() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSetTraceBuffer2() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSetTraceBuffers() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSetUserData() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSetUserdataTimer() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttStartTrace() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttStopTrace() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSwitchTraceBuffer() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttSwitchTraceBuffer2() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmSqttWaitForEvent() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } static inline s32 PatchFlipRequest(u32* cmdbuf, u32 size, u32 vo_handle, u32 buf_idx, u32 flip_mode, @@ -2165,18 +2259,21 @@ int PS4_SYSV_ABI sceGnmUnmapComputeQueue() { } int PS4_SYSV_ABI sceGnmUnregisterAllResourcesForOwner() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmUnregisterOwnerAndResources() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmUnregisterResource() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } s32 PS4_SYSV_ABI sceGnmUpdateGsShader(u32* cmdbuf, u32 size, const u32* gs_regs) { @@ -2343,82 +2440,98 @@ s32 PS4_SYSV_ABI sceGnmUpdateVsShader(u32* cmdbuf, u32 size, const u32* vs_regs, s32 PS4_SYSV_ABI sceGnmValidateCommandBuffers() { LOG_TRACE(Lib_GnmDriver, "called"); - return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; // not available in retail FW; + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidateDisableDiagnostics() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidateDisableDiagnostics2() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidateDispatchCommandBuffers() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidateDrawCommandBuffers() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidateGetDiagnosticInfo() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidateGetDiagnostics() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidateGetVersion() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceGnmValidateOnSubmitEnabled() { LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware return 0; } +bool PS4_SYSV_ABI sceGnmValidateOnSubmitEnabled() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return false; +} + int PS4_SYSV_ABI sceGnmValidateResetState() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceGnmValidationRegisterMemoryCheckCallback() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_VALIDATION_NOT_ENABLED; } int PS4_SYSV_ABI sceRazorCaptureCommandBuffersOnlyImmediate() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_CAPTURE_FAILED_INTERNAL; } int PS4_SYSV_ABI sceRazorCaptureCommandBuffersOnlySinceLastFlip() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_CAPTURE_FAILED_INTERNAL; } int PS4_SYSV_ABI sceRazorCaptureImmediate() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_CAPTURE_FAILED_INTERNAL; } int PS4_SYSV_ABI sceRazorCaptureSinceLastFlip() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_CAPTURE_FAILED_INTERNAL; } -int PS4_SYSV_ABI sceRazorIsLoaded() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; +bool PS4_SYSV_ABI sceRazorIsLoaded() { + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return false; } int PS4_SYSV_ABI Func_063D065A2D6359C3() { @@ -2587,13 +2700,15 @@ int PS4_SYSV_ABI Func_ECB4C6BA41FE3350() { } int PS4_SYSV_ABI sceGnmDebugModuleReset() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmDebugReset() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI Func_C4C328B7CF3B4171() { @@ -2612,18 +2727,21 @@ int PS4_SYSV_ABI sceGnmDrawInitToDefaultContextStateInternalSize() { } int PS4_SYSV_ABI sceGnmFindResources() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmGetResourceRegistrationBuffers() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI sceGnmRegisterOwnerForSystem() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); - return ORBIS_OK; + LOG_TRACE(Lib_GnmDriver, "called"); + // Not available in retail firmware + return ORBIS_GNM_ERROR_FAILURE; } int PS4_SYSV_ABI Func_1C43886B16EE5530() { diff --git a/src/core/libraries/gnmdriver/gnmdriver.h b/src/core/libraries/gnmdriver/gnmdriver.h index 609e26c0d..b4aee12b0 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.h +++ b/src/core/libraries/gnmdriver/gnmdriver.h @@ -67,15 +67,15 @@ u32 PS4_SYSV_ABI sceGnmDrawInitToDefaultContextState(u32* cmdbuf, u32 size); u32 PS4_SYSV_ABI sceGnmDrawInitToDefaultContextState400(u32* cmdbuf, u32 size); int PS4_SYSV_ABI sceGnmDrawOpaqueAuto(); bool PS4_SYSV_ABI sceGnmDriverCaptureInProgress(); -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterface(); -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuDebugger(); -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuException(); -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForHDRScopes(); -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForReplay(); -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForResourceRegistration(); -int PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForValidation(); +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterface(); +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuDebugger(); +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForGpuException(); +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForHDRScopes(); +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForReplay(); +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForResourceRegistration(); +u32 PS4_SYSV_ABI sceGnmDriverInternalRetrieveGnmInterfaceForValidation(); int PS4_SYSV_ABI sceGnmDriverInternalVirtualQuery(); -int PS4_SYSV_ABI sceGnmDriverTraceInProgress(); +bool PS4_SYSV_ABI sceGnmDriverTraceInProgress(); int PS4_SYSV_ABI sceGnmDriverTriggerCapture(); int PS4_SYSV_ABI sceGnmEndWorkload(u64 workload); s32 PS4_SYSV_ABI sceGnmFindResourcesPublic(); @@ -95,7 +95,7 @@ int PS4_SYSV_ABI sceGnmGetNumTcaUnits(); int PS4_SYSV_ABI sceGnmGetOffChipTessellationBufferSize(); int PS4_SYSV_ABI sceGnmGetOwnerName(); int PS4_SYSV_ABI sceGnmGetPhysicalCounterFromVirtualized(); -int PS4_SYSV_ABI sceGnmGetProtectionFaultTimeStamp(); +u32 PS4_SYSV_ABI sceGnmGetProtectionFaultTimeStamp(); int PS4_SYSV_ABI sceGnmGetResourceBaseAddressAndSizeInBytes(); int PS4_SYSV_ABI sceGnmGetResourceName(); int PS4_SYSV_ABI sceGnmGetResourceShaderGuid(); @@ -104,8 +104,8 @@ int PS4_SYSV_ABI sceGnmGetResourceUserData(); int PS4_SYSV_ABI sceGnmGetShaderProgramBaseAddress(); int PS4_SYSV_ABI sceGnmGetShaderStatus(); VAddr PS4_SYSV_ABI sceGnmGetTheTessellationFactorRingBufferBaseAddress(); -int PS4_SYSV_ABI sceGnmGpuPaDebugEnter(); -int PS4_SYSV_ABI sceGnmGpuPaDebugLeave(); +void PS4_SYSV_ABI sceGnmGpuPaDebugEnter(); +void PS4_SYSV_ABI sceGnmGpuPaDebugLeave(); int PS4_SYSV_ABI sceGnmInsertDingDongMarker(); s32 PS4_SYSV_ABI sceGnmInsertPopMarker(u32* cmdbuf, u32 size); s32 PS4_SYSV_ABI sceGnmInsertPushColorMarker(u32* cmdbuf, u32 size, const char* marker, u32 color); @@ -115,7 +115,7 @@ s32 PS4_SYSV_ABI sceGnmInsertSetMarker(u32* cmdbuf, u32 size, const char* marker int PS4_SYSV_ABI sceGnmInsertThreadTraceMarker(); s32 PS4_SYSV_ABI sceGnmInsertWaitFlipDone(u32* cmdbuf, u32 size, s32 vo_handle, u32 buf_idx); int PS4_SYSV_ABI sceGnmIsCoredumpValid(); -int PS4_SYSV_ABI sceGnmIsUserPaEnabled(); +bool PS4_SYSV_ABI sceGnmIsUserPaEnabled(); int PS4_SYSV_ABI sceGnmLogicalCuIndexToPhysicalCuIndex(); int PS4_SYSV_ABI sceGnmLogicalCuMaskToPhysicalCuMask(); int PS4_SYSV_ABI sceGnmLogicalTcaUnitToPhysical(); @@ -130,7 +130,7 @@ int PS4_SYSV_ABI sceGnmPaHeartbeat(); int PS4_SYSV_ABI sceGnmQueryResourceRegistrationUserMemoryRequirements(); int PS4_SYSV_ABI sceGnmRaiseUserExceptionEvent(); int PS4_SYSV_ABI sceGnmRegisterGdsResource(); -int PS4_SYSV_ABI sceGnmRegisterGnmLiveCallbackConfig(); +void PS4_SYSV_ABI sceGnmRegisterGnmLiveCallbackConfig(); s32 PS4_SYSV_ABI sceGnmRegisterOwner(void* handle, const char* name); s32 PS4_SYSV_ABI sceGnmRegisterResource(void* res_handle, void* owner_handle, const void* addr, size_t size, const char* name, int res_type, u64 user_data); @@ -240,14 +240,14 @@ int PS4_SYSV_ABI sceGnmValidateDrawCommandBuffers(); int PS4_SYSV_ABI sceGnmValidateGetDiagnosticInfo(); int PS4_SYSV_ABI sceGnmValidateGetDiagnostics(); int PS4_SYSV_ABI sceGnmValidateGetVersion(); -int PS4_SYSV_ABI sceGnmValidateOnSubmitEnabled(); +bool PS4_SYSV_ABI sceGnmValidateOnSubmitEnabled(); int PS4_SYSV_ABI sceGnmValidateResetState(); int PS4_SYSV_ABI sceGnmValidationRegisterMemoryCheckCallback(); int PS4_SYSV_ABI sceRazorCaptureCommandBuffersOnlyImmediate(); int PS4_SYSV_ABI sceRazorCaptureCommandBuffersOnlySinceLastFlip(); int PS4_SYSV_ABI sceRazorCaptureImmediate(); int PS4_SYSV_ABI sceRazorCaptureSinceLastFlip(); -int PS4_SYSV_ABI sceRazorIsLoaded(); +bool PS4_SYSV_ABI sceRazorIsLoaded(); int PS4_SYSV_ABI Func_063D065A2D6359C3(); int PS4_SYSV_ABI Func_0CABACAFB258429D(); int PS4_SYSV_ABI Func_150CF336FC2E99A3(); From 95d5343eb4ff766d3138a6ed573d496bcf2b5838 Mon Sep 17 00:00:00 2001 From: Daniel Nylander Date: Sun, 9 Feb 2025 17:57:25 +0100 Subject: [PATCH 248/455] Updated Swedish translation (#2380) * Adding Swedish translation * Updated Swedish translation with additional strings Updated the Swedish translations using lupdate to found additional strings cd src/qt_gui/treanslations lupdate ../../../../shadPS4/ -tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS -no-obsolete -locations none -source-language en -ts sv.ts * Update sv.ts * Updated Swedish translation * Adding copyright boilerplate * Updated Swedish translation * Updated Swedish translation * Update sv.ts whitespace in boilerplate * Updated Swedish translation Please do not add or change anything. Always use lupdate to update TS translation files * Update sv.ts * Update sv.ts small typo --- src/qt_gui/translations/sv.ts | 301 ++++++++++++++++++++++++++-------- 1 file changed, 234 insertions(+), 67 deletions(-) diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index ec2515e6d..2a68c3f77 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -271,10 +271,6 @@ Network error: Nätverksfel: - - Error_Github_limit_MSG - Den automatiska uppdateraren tillåter upp till 60 uppdateringskontroller per timme.\nDu har nått denna gräns. Försök igen senare. - Failed to parse update information. Misslyckades med att tolka uppdateringsinformationen. @@ -363,6 +359,192 @@ Failed to create the update script file Misslyckades med att skapa uppdateringsskriptfil + + Error_Github_limit_MSG + Den automatiska uppdateraren tillåter upp till 60 uppdateringskontroller per timme.\nDu har uppnått denna gräns. Försök igen senare + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Hämtar kompatibilitetsdata, vänta + + + Cancel + Avbryt + + + Loading... + Läser in... + + + Error + Fel + + + Unable to update compatibility data! Try again later. + Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. + + + Unable to open compatibility.json for writing. + Kunde inte öppna compatibility.json för skrivning. + + + Unknown + Okänt + + + Nothing + Ingenting + + + Boots + Startar upp + + + Menus + Menyer + + + Ingame + Problem + + + Playable + Spelbart + + + Unable to open compatibility_data.json for writing. + Kunde inte öppna compatibility_data.json för skrivning. + + + + ControlSettings + + Configure Controls + Konfigurera kontroller + + + Control Settings + Kontrollerinställningar + + + D-Pad + Riktningsknappar + + + Up + Upp + + + Left + Vänster + + + Right + Höger + + + Down + Ner + + + Left Stick Deadzone (def:2 max:127) + Dödläge för vänster spak (standard:2 max:127) + + + Left Deadzone + Vänster dödläge + + + Left Stick + Vänster spak + + + Config Selection + Konfigurationsval + + + Common Config + Allmän konfiguration + + + Use per-game configs + Använd konfigurationer per spel + + + L1 / LB + L1 / LB + + + L2 / LT + L2 / LT + + + KBM Controls + + + + KBM Editor + + + + Back + Bakåt + + + R1 / RB + R1 / RB + + + R2 / RT + R2 / RT + + + L3 + L3 + + + Options / Start + Options / Start + + + R3 + R3 + + + Face Buttons + Handlingsknappar + + + Triangle / Y + Triangel / Y + + + Square / X + Fyrkant / X + + + Circle / B + Cirkel / B + + + Cross / A + Kryss / A + + + Right Stick Deadzone (def:2, max:127) + Dödläge för höger spak (standard:2, max:127) + + + Right Deadzone + Höger dödläge + + + Right Stick + Höger spak + ElfViewer @@ -491,14 +673,18 @@ Game can be completed with playable performance and no major glitches Spelet kan spelas klart med spelbar prestanda och utan större problem - - Click to see details on github - Klicka för att se detaljer på GitHub - - - Last updated - Senast uppdaterad - + + Click to go to issue + Klicka för att gå till problem + + + Last updated + Senast uppdaterad + + + Click to see details on github + Klicka för att se detaljer på Github + GameListUtils @@ -677,6 +863,14 @@ Save Data Sparat data + + Copy Version + Kopiera version + + + Copy Size + Kopiera storlek + InstallDirSelect @@ -805,7 +999,7 @@ File - Fil + Arkiv View @@ -1063,7 +1257,7 @@ ps4proCheckBox - Är PS4 Pro:\nGör att emulatorn agerar som en PS4 PRO, vilket kan aktivera speciella funktioner i spel som har stöd för det + Är PS4 Pro:\nGör att emulatorn agerar som en PS4 PRO, vilket kan aktivera speciella funktioner i spel som har stöd för det Enable Discord Rich Presence @@ -1130,8 +1324,8 @@ Grafik - GUI - Gränssnitt + Gui + Gränssnitt User @@ -1521,6 +1715,30 @@ browseButton Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data + + GUI + Gränssnitt + + + Background Image + Bakgrundsbild + + + Show Background Image + Visa bakgrundsbild + + + Opacity + Opacitet + + + Auto Select + Välj automatiskt + + + GUIBackgroundImageGroupBox + Bakgrundsbild:\nKontrollerar opaciteten för spelets bakgrundsbild + TrophyViewer @@ -1529,55 +1747,4 @@ Trofé-visare - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Hämtar kompatibilitetsdata, vänligen vänta - - - Cancel - Avbryt - - - Loading... - Läser in... - - - Error - Fel - - - Unable to update compatibility data! Try again later. - Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. - - - Unable to open compatibility_data.json for writing. - Kunde inte öppna compatibility_data.json för skrivning. - - - Unknown - Okänt - - - Nothing - Ingenting - - - Boots - Startar upp - - - Menus - Menyer - - - Ingame - I spelet - - - Playable - Spelbart - - From 89d349ae1c9eb5afcf4ed8e2edbfb463a0d9f08e Mon Sep 17 00:00:00 2001 From: F1219R <109141852+F1219R@users.noreply.github.com> Date: Sun, 9 Feb 2025 17:58:12 +0100 Subject: [PATCH 249/455] Update SQ translation + fix typo in EN translation (#2382) * Update sq translation * Update sq translation * Fix typo in en translation --- src/qt_gui/translations/en.ts | 3 +- src/qt_gui/translations/sq.ts | 72 +++++++++++++++++++++++++---------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 10a4ce247..8aff13954 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -727,8 +727,7 @@ Guest Debug Markers Guest Debug Markers - - + Update Update diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index caab33ef0..41a941a08 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -124,6 +124,14 @@ Copy Serial Kopjo Serikun + + Copy Version + Kopjo Versionin + + + Copy Size + Kopjo Madhësinë + Copy All Kopjo të Gjitha @@ -702,23 +710,23 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Aktivizo Diagnozën e Rënies Collect Shaders - Collect Shaders + Mblidh Shader-at Copy GPU Buffers - Copy GPU Buffers + Kopjo buffer-ët e GPU-së Host Debug Markers - Host Debug Markers + Shënjuesit e korrigjimit të host-it Guest Debug Markers - Guest Debug Markers + Shënjuesit e korrigjimit të guest-it Update @@ -742,12 +750,24 @@ Title Music - Title Music + Muzika e titullit Disable Trophy Pop-ups Çaktivizo njoftimet për Trofetë + + Background Image + Imazhi i sfondit + + + Show Background Image + Shfaq imazhin e sfondit + + + Opacity + Tejdukshmëria + Play title music Luaj muzikën e titullit @@ -844,6 +864,10 @@ updaterGroupBox Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. + + GUIBackgroundImageGroupBox + Imazhi i Sfondit:\nKontrollo tejdukshmërinë e imazhit të sfondit të lojës. + GUIMusicGroupBox Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në ndërfaqe. @@ -954,23 +978,31 @@ collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Mblidh Shader-at:\nDuhet ta aktivizosh këtë për të redaktuar shader-at me menynë e korrigjimit (Ctrl + F10). crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Diagnoza e rënies:\nKrijon një skedar .yaml me informacion rreth gjendjes së Vulkan-it në momentin e rënies.\nE dobishme për zgjidhjen e gabimeve 'Device lost'. Nëse e ke aktivizuar këtë, duhet të aktivizosh Shënjuesit e korrigjimit të host-it DHE të guest-it.\nNuk punon me GPU-t Intel.\nDuhet të kesh aktivizuar Shtresat e Vlefshmërisë Vulkan dhe Vulkan SDK që kjo të punojë. copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Kopjo buffer-ët e GPU-së:\nShmang kushtet e garës (race conditions) që lidhen me dërgimet e GPU-së.\nMund të ndihmojë, ose jo, në rast rëniesh të llojit PM4 0. hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Shënjuesit e korrigjimit të host-it:\nShton informacion nga ana e emulatorit, si shënjues për komandat specifike AMDGPU rreth komandave Vulkan, si dhe jep burimeve emra korrigjimi.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Shënjuesit e korrigjimit të guest-it:\nShton çdo shënjues për korrigjim që loja vetë ka shtuar në buffer-in e komandave.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. + + + saveDataBox + Shtegu i Ruajtjes së të Dhënave:\nDosja ku do të ruhen të dhënat e ruajtjes së lojës. + + + browseButton + Shfleto:\nShfleto për të vendosur një dosje si shteg të ruajtjes së të dhënave. @@ -1161,7 +1193,7 @@ Incompatibility Notice - Njoftim për papajtueshmëri + Njoftim për mospërputhje Failed to open file: @@ -1284,7 +1316,7 @@ Last updated - Përditësimi i fundit + Përditësuar për herë të fundit @@ -1303,7 +1335,7 @@ Error_Github_limit_MSG - Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nJu keni arritur këtë kufi. Ju lutemi provoni përsëri më vonë. + Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nKe arritur këtë kufi. Të lutem provo përsëri më vonë. Failed to parse update information. @@ -1421,7 +1453,7 @@ CompatibilityInfoClass Fetching compatibility data, please wait - Po merrni të dhënat e pajtueshmërisë, ju lutemi prisni + Duke marrë të dhënat e përputhshmërisë, të lutem prit Cancel @@ -1437,7 +1469,7 @@ Unable to update compatibility data! Try again later. - Nuk mund të përditësohen të dhënat e pajtueshmërisë! Provoni përsëri më vonë. + Nuk mund të përditësohen të dhënat e përputhshmërisë! Provo përsëri më vonë. Unable to open compatibility_data.json for writing. @@ -1445,7 +1477,7 @@ Unknown - Jo i njohur + E panjohur Nothing @@ -1453,11 +1485,11 @@ Boots - Çizme + Niset Menus - Menutë + Meny Ingame @@ -1465,7 +1497,7 @@ Playable - I luajtshëm + E luajtshme From 0e238c87cbd0e6815dea65ad9b06c195e74208a8 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 9 Feb 2025 08:58:48 -0800 Subject: [PATCH 250/455] cpu_patches: Lower extrq/insertq log to trace. (#2386) --- src/core/cpu_patches.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/core/cpu_patches.cpp b/src/core/cpu_patches.cpp index 57d528a81..65cd38b02 100644 --- a/src/core/cpu_patches.cpp +++ b/src/core/cpu_patches.cpp @@ -1041,10 +1041,10 @@ static bool TryExecuteIllegalInstruction(void* ctx, void* code_address) { if (length + index > 64) { // Undefined behavior if length + index is bigger than 64 according to the spec, // we'll warn and continue execution. - LOG_WARNING(Core, - "extrq at {} with length {} and index {} is bigger than 64, " - "undefined behavior", - fmt::ptr(code_address), length, index); + LOG_TRACE(Core, + "extrq at {} with length {} and index {} is bigger than 64, " + "undefined behavior", + fmt::ptr(code_address), length, index); } lowQWordDst >>= index; @@ -1101,10 +1101,10 @@ static bool TryExecuteIllegalInstruction(void* ctx, void* code_address) { if (length + index > 64) { // Undefined behavior if length + index is bigger than 64 according to the spec, // we'll warn and continue execution. - LOG_WARNING(Core, - "insertq at {} with length {} and index {} is bigger than 64, " - "undefined behavior", - fmt::ptr(code_address), length, index); + LOG_TRACE(Core, + "insertq at {} with length {} and index {} is bigger than 64, " + "undefined behavior", + fmt::ptr(code_address), length, index); } lowQWordSrc &= mask; From f3afbfbcecdc79cc4bf89356cb44eb13b6c1629e Mon Sep 17 00:00:00 2001 From: tomboylover93 <95257311+tomboylover93@users.noreply.github.com> Date: Sun, 9 Feb 2025 13:59:09 -0300 Subject: [PATCH 251/455] Add HDR option to settings menu (#2387) --- src/common/config.cpp | 4 ++++ src/common/config.h | 1 + src/qt_gui/settings_dialog.cpp | 5 +++++ src/qt_gui/settings_dialog.ui | 29 ++++++++++++++++++----------- src/qt_gui/translations/en.ts | 8 ++++++++ 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index ee8da8cc3..284407914 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -341,6 +341,10 @@ void setNullGpu(bool enable) { isNullGpu = enable; } +void setAllowHDR(bool enable) { + isHDRAllowed = enable; +} + void setCopyGPUCmdBuffers(bool enable) { shouldCopyGPUBuffers = enable; } diff --git a/src/common/config.h b/src/common/config.h index 36654f1fa..012f9b830 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -69,6 +69,7 @@ void setCollectShaderForDebug(bool enable); void setShowSplash(bool enable); void setAutoUpdate(bool enable); void setNullGpu(bool enable); +void setAllowHDR(bool enable); void setCopyGPUCmdBuffers(bool enable); void setDumpShaders(bool enable); void setVblankDiv(u32 value); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index a66781244..e8fa2f1fd 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -277,6 +277,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->heightDivider->installEventFilter(this); ui->dumpShadersCheckBox->installEventFilter(this); ui->nullGpuCheckBox->installEventFilter(this); + ui->enableHDRCheckBox->installEventFilter(this); // Paths ui->gameFoldersGroupBox->installEventFilter(this); @@ -346,6 +347,7 @@ void SettingsDialog::LoadValuesFromConfig() { ui->vblankSpinBox->setValue(toml::find_or(data, "GPU", "vblankDivider", 1)); ui->dumpShadersCheckBox->setChecked(toml::find_or(data, "GPU", "dumpShaders", false)); ui->nullGpuCheckBox->setChecked(toml::find_or(data, "GPU", "nullGpu", false)); + ui->enableHDRCheckBox->setChecked(toml::find_or(data, "General", "isHDRAllowed", false)); ui->playBGMCheckBox->setChecked(toml::find_or(data, "General", "playBGM", false)); ui->disableTrophycheckBox->setChecked( toml::find_or(data, "General", "isTrophyPopupDisabled", false)); @@ -518,6 +520,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { text = tr("GUIBackgroundImageGroupBox"); } else if (elementName == "GUIMusicGroupBox") { text = tr("GUIMusicGroupBox"); + } else if (elementName == "enableHDRCheckBox") { + text = tr("enableHDRCheckBox"); } else if (elementName == "disableTrophycheckBox") { text = tr("disableTrophycheckBox"); } else if (elementName == "enableCompatibilityCheckBox") { @@ -618,6 +622,7 @@ void SettingsDialog::UpdateSettings() { Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); + Config::setAllowHDR(ui->enableHDRCheckBox->isChecked()); Config::setLogType(ui->logTypeComboBox->currentText().toStdString()); Config::setLogFilter(ui->logFilterLineEdit->text().toStdString()); Config::setUserName(ui->userNameLineEdit->text().toStdString()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 80f7a117e..1b688a9b9 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -74,7 +74,7 @@ 0 0 946 - 536 + 535 @@ -171,6 +171,13 @@ + + + + Enable HDR + + + @@ -417,7 +424,7 @@ - + 0 0 @@ -481,7 +488,7 @@ 0 0 946 - 536 + 535 @@ -585,15 +592,15 @@ - - Background Image - 0 0 + + Background Image + @@ -930,7 +937,7 @@ 0 0 946 - 536 + 535 @@ -1174,7 +1181,7 @@ 0 0 946 - 536 + 535 @@ -1318,7 +1325,7 @@ 0 0 946 - 536 + 535 @@ -1602,7 +1609,7 @@ 0 0 946 - 536 + 535 @@ -1692,7 +1699,7 @@ 0 0 946 - 536 + 535 diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 8aff13954..98711f804 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -672,6 +672,10 @@ Enable NULL GPU Enable NULL GPU + + Enable HDR + Enable HDR + Paths Paths @@ -948,6 +952,10 @@ nullGpuCheckBox Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + gameFoldersBox Game Folders:\nThe list of folders to check for installed games. From 5d4812d1a6a02b1644d2b98a0b85f0619623e949 Mon Sep 17 00:00:00 2001 From: psucien Date: Sun, 9 Feb 2025 18:22:07 +0100 Subject: [PATCH 252/455] hot-fix: fix for unintended gamma correction bypass when HDR is disabled --- src/video_core/renderer_vulkan/vk_presenter.cpp | 2 +- src/video_core/renderer_vulkan/vk_presenter.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 0fbc17908..04d0e7ac9 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -916,7 +916,7 @@ Frame* Presenter::GetRenderFrame() { // Initialize default frame image if (frame->width == 0 || frame->height == 0 || frame->is_hdr != swapchain.GetHDR()) { - RecreateFrame(frame, 1920, 1080); + RecreateFrame(frame, Config::getScreenWidth(), Config::getScreenHeight()); } return frame; diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 60b3e4626..2bfe6e66c 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -47,7 +47,7 @@ class Rasterizer; class Presenter { struct PostProcessSettings { float gamma = 1.0f; - bool hdr = false; + u32 hdr = 0; }; public: @@ -113,7 +113,7 @@ public: return; } swapchain.SetHDR(enable); - pp_settings.hdr = enable; + pp_settings.hdr = enable ? 1 : 0; } private: From 15b520f4a2572cdb96923a72dacffaaa562473b7 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 9 Feb 2025 10:20:13 -0800 Subject: [PATCH 253/455] renderer_vulkan: Skip tessellation isolines if not supported. (#2384) --- src/video_core/renderer_vulkan/vk_instance.cpp | 7 +++++-- src/video_core/renderer_vulkan/vk_instance.h | 12 ++++++++++++ src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 6 ++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index e64cae87d..c712f4e0c 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -214,6 +214,9 @@ bool Instance::CreateDevice() { vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, vk::PhysicalDevicePortabilitySubsetFeaturesKHR>(); features = feature_chain.get().features; +#ifdef __APPLE__ + portability_features = feature_chain.get(); +#endif const vk::StructureChain properties_chain = physical_device.getProperties2< vk::PhysicalDeviceProperties2, vk::PhysicalDeviceVulkan11Properties, @@ -282,7 +285,7 @@ bool Instance::CreateDevice() { #ifdef __APPLE__ // Required by Vulkan spec if supported. - add_extension(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + portability_subset = add_extension(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); #endif const auto family_properties = physical_device.getQueueFamilyProperties(); @@ -403,7 +406,7 @@ bool Instance::CreateDevice() { .legacyVertexAttributes = true, }, #ifdef __APPLE__ - feature_chain.get(), + portability_features, #endif }; diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 1748fcd59..c2322df41 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -149,6 +149,16 @@ public: return features.tessellationShader; } + /// Returns true when tessellation isolines are supported by the device + bool IsTessellationIsolinesSupported() const { + return !portability_subset || portability_features.tessellationIsolines; + } + + /// Returns true when tessellation point mode is supported by the device + bool IsTessellationPointModeSupported() const { + return !portability_subset || portability_features.tessellationPointMode; + } + /// Returns the vendor ID of the physical device u32 GetVendorID() const { return properties.vendorID; @@ -285,6 +295,7 @@ private: vk::PhysicalDeviceVulkan12Properties vk12_props; vk::PhysicalDevicePushDescriptorPropertiesKHR push_descriptor_props; vk::PhysicalDeviceFeatures features; + vk::PhysicalDevicePortabilitySubsetFeaturesKHR portability_features; vk::DriverIdKHR driver_id; vk::UniqueDebugUtilsMessengerEXT debug_callback{}; std::string vendor_name; @@ -308,6 +319,7 @@ private: bool image_load_store_lod{}; bool amd_gcn_shader{}; bool tooling_info{}; + bool portability_subset{}; }; } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 16d2187db..4406be439 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -412,8 +412,10 @@ bool PipelineCache::RefreshGraphicsKey() { break; } case Liverpool::ShaderStageEnable::VgtStages::LsHs: { - if (!instance.IsTessellationSupported()) { - break; + if (!instance.IsTessellationSupported() || + (regs.tess_config.type == AmdGpu::TessellationType::Isoline && + !instance.IsTessellationIsolinesSupported())) { + return false; } if (!TryBindStage(Stage::Hull, LogicalStage::TessellationControl)) { return false; From 34a4f6e60e0bdb394faff04b32968500b13d10d4 Mon Sep 17 00:00:00 2001 From: SaltyBet <66281060+SaltyBet@users.noreply.github.com> Date: Sun, 9 Feb 2025 15:31:32 -0500 Subject: [PATCH 254/455] enableHDRCheckBox fix (#2390) isHDRAllowed -> allowHDR (per TOML). --- src/qt_gui/settings_dialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index e8fa2f1fd..4d9fa1621 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -347,7 +347,7 @@ void SettingsDialog::LoadValuesFromConfig() { ui->vblankSpinBox->setValue(toml::find_or(data, "GPU", "vblankDivider", 1)); ui->dumpShadersCheckBox->setChecked(toml::find_or(data, "GPU", "dumpShaders", false)); ui->nullGpuCheckBox->setChecked(toml::find_or(data, "GPU", "nullGpu", false)); - ui->enableHDRCheckBox->setChecked(toml::find_or(data, "General", "isHDRAllowed", false)); + ui->enableHDRCheckBox->setChecked(toml::find_or(data, "General", "allowHDR", false)); ui->playBGMCheckBox->setChecked(toml::find_or(data, "General", "playBGM", false)); ui->disableTrophycheckBox->setChecked( toml::find_or(data, "General", "isTrophyPopupDisabled", false)); @@ -698,4 +698,4 @@ void SettingsDialog::ResetInstallFolders() { } Config::setGameInstallDirs(settings_install_dirs_config); } -} \ No newline at end of file +} From 04fe3a79b9f1e0fbb21066c61f9b699fe80491a4 Mon Sep 17 00:00:00 2001 From: psucien <168137814+psucien@users.noreply.github.com> Date: Sun, 9 Feb 2025 22:03:20 +0100 Subject: [PATCH 255/455] fix: lower UBO max size to account buffer cache offset (#2388) * fix: lower UBO max size to account buffer cache offset * review comments * remove UBO size from spec and always set it to max on shader side --- .../backend/spirv/spirv_emit_context.cpp | 4 ++-- src/shader_recompiler/info.h | 8 ++++---- src/shader_recompiler/profile.h | 1 + src/shader_recompiler/specialization.h | 15 +++++---------- .../renderer_vulkan/vk_compute_pipeline.cpp | 15 ++++++++------- .../renderer_vulkan/vk_compute_pipeline.h | 5 +++-- .../renderer_vulkan/vk_graphics_pipeline.cpp | 13 +++++++------ .../renderer_vulkan/vk_graphics_pipeline.h | 3 ++- src/video_core/renderer_vulkan/vk_instance.h | 7 +++++++ .../renderer_vulkan/vk_pipeline_cache.cpp | 11 ++++++++--- .../renderer_vulkan/vk_pipeline_cache.h | 4 ++++ .../renderer_vulkan/vk_pipeline_common.cpp | 6 ++++-- .../renderer_vulkan/vk_pipeline_common.h | 5 ++++- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 4 ++-- 14 files changed, 61 insertions(+), 40 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 13d727c72..2ab5ca05d 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -633,8 +633,8 @@ void EmitContext::DefineBuffers() { for (const auto& desc : info.buffers) { const auto sharp = desc.GetSharp(info); - const bool is_storage = desc.IsStorage(sharp); - const u32 array_size = sharp.NumDwords() != 0 ? sharp.NumDwords() : MaxUboDwords; + const bool is_storage = desc.IsStorage(sharp, profile); + const u32 array_size = profile.max_ubo_size >> 2; const auto* data_types = True(desc.used_types & IR::Type::F32) ? &F32 : &U32; const Id data_type = (*data_types)[1]; const Id record_array_type{is_storage ? TypeRuntimeArray(data_type) diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index 498752607..b32eb6833 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -17,6 +17,7 @@ #include "shader_recompiler/ir/reg.h" #include "shader_recompiler/ir/type.h" #include "shader_recompiler/params.h" +#include "shader_recompiler/profile.h" #include "shader_recompiler/runtime_info.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/amdgpu/resource.h" @@ -24,8 +25,6 @@ namespace Shader { static constexpr size_t NumUserDataRegs = 16; -static constexpr size_t MaxUboSize = 65536; -static constexpr size_t MaxUboDwords = MaxUboSize >> 2; enum class TextureType : u32 { Color1D, @@ -50,8 +49,9 @@ struct BufferResource { bool is_written{}; bool is_formatted{}; - [[nodiscard]] bool IsStorage(const AmdGpu::Buffer& buffer) const noexcept { - return buffer.GetSize() > MaxUboSize || is_written || is_gds_buffer; + [[nodiscard]] bool IsStorage(const AmdGpu::Buffer& buffer, + const Profile& profile) const noexcept { + return buffer.GetSize() > profile.max_ubo_size || is_written || is_gds_buffer; } [[nodiscard]] constexpr AmdGpu::Buffer GetSharp(const Info& info) const noexcept; diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index f359a7dcc..53d940b79 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -30,6 +30,7 @@ struct Profile { bool needs_manual_interpolation{}; bool needs_lds_barriers{}; u64 min_ssbo_alignment{}; + u64 max_ubo_size{}; u32 max_viewport_width{}; u32 max_viewport_height{}; u32 max_shared_memory_size{}; diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index 4328193b5..9bf9e71e4 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -27,7 +27,6 @@ struct BufferSpecialization { u32 num_format : 4; u32 index_stride : 2; u32 element_size : 2; - u32 size = 0; AmdGpu::CompMapping dst_select{}; AmdGpu::NumberConversion num_conversion{}; @@ -38,8 +37,7 @@ struct BufferSpecialization { (data_format == other.data_format && num_format == other.num_format && dst_select == other.dst_select && num_conversion == other.num_conversion)) && (!swizzle_enable || - (index_stride == other.index_stride && element_size == other.element_size)) && - (size >= other.is_storage || is_storage); + (index_stride == other.index_stride && element_size == other.element_size)); } }; @@ -87,8 +85,8 @@ struct StageSpecialization { boost::container::small_vector samplers; Backend::Bindings start{}; - explicit StageSpecialization(const Info& info_, RuntimeInfo runtime_info_, - const Profile& profile_, Backend::Bindings start_) + StageSpecialization(const Info& info_, RuntimeInfo runtime_info_, const Profile& profile_, + Backend::Bindings start_) : info{&info_}, runtime_info{runtime_info_}, start{start_} { fetch_shader_data = Gcn::ParseFetchShader(info_); if (info_.stage == Stage::Vertex && fetch_shader_data && @@ -107,9 +105,9 @@ struct StageSpecialization { binding++; } ForEachSharp(binding, buffers, info->buffers, - [](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { + [profile_](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { spec.stride = sharp.GetStride(); - spec.is_storage = desc.IsStorage(sharp); + spec.is_storage = desc.IsStorage(sharp, profile_); spec.is_formatted = desc.is_formatted; spec.swizzle_enable = sharp.swizzle_enable; if (spec.is_formatted) { @@ -122,9 +120,6 @@ struct StageSpecialization { spec.index_stride = sharp.index_stride; spec.element_size = sharp.element_size; } - if (!spec.is_storage) { - spec.size = sharp.GetSize(); - } }); ForEachSharp(binding, images, info->images, [](auto& spec, const auto& desc, AmdGpu::Image sharp) { diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 0832f65a2..f0346559d 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -11,11 +11,12 @@ namespace Vulkan { -ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler_, - DescriptorHeap& desc_heap_, vk::PipelineCache pipeline_cache, - ComputePipelineKey compute_key_, const Shader::Info& info_, - vk::ShaderModule module) - : Pipeline{instance_, scheduler_, desc_heap_, pipeline_cache, true}, compute_key{compute_key_} { +ComputePipeline::ComputePipeline(const Instance& instance, Scheduler& scheduler, + DescriptorHeap& desc_heap, const Shader::Profile& profile, + vk::PipelineCache pipeline_cache, ComputePipelineKey compute_key_, + const Shader::Info& info_, vk::ShaderModule module) + : Pipeline{instance, scheduler, desc_heap, profile, pipeline_cache, true}, + compute_key{compute_key_} { auto& info = stages[int(Shader::LogicalStage::Compute)]; info = &info_; const auto debug_str = GetDebugString(); @@ -49,8 +50,8 @@ ComputePipeline::ComputePipeline(const Instance& instance_, Scheduler& scheduler const auto sharp = buffer.GetSharp(*info); bindings.push_back({ .binding = binding++, - .descriptorType = buffer.IsStorage(sharp) ? vk::DescriptorType::eStorageBuffer - : vk::DescriptorType::eUniformBuffer, + .descriptorType = buffer.IsStorage(sharp, profile) ? vk::DescriptorType::eStorageBuffer + : vk::DescriptorType::eUniformBuffer, .descriptorCount = 1, .stageFlags = vk::ShaderStageFlagBits::eCompute, }); diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.h b/src/video_core/renderer_vulkan/vk_compute_pipeline.h index 1c28e461c..79059b509 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.h @@ -31,8 +31,9 @@ struct ComputePipelineKey { class ComputePipeline : public Pipeline { public: ComputePipeline(const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, - vk::PipelineCache pipeline_cache, ComputePipelineKey compute_key, - const Shader::Info& info, vk::ShaderModule module); + const Shader::Profile& profile, vk::PipelineCache pipeline_cache, + ComputePipelineKey compute_key, const Shader::Info& info, + vk::ShaderModule module); ~ComputePipeline(); private: diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 588754c00..4eecd1edf 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -25,13 +25,13 @@ namespace Vulkan { using Shader::Backend::SPIRV::AuxShaderType; GraphicsPipeline::GraphicsPipeline( - const Instance& instance_, Scheduler& scheduler_, DescriptorHeap& desc_heap_, - const GraphicsPipelineKey& key_, vk::PipelineCache pipeline_cache, - std::span infos, + const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, + const Shader::Profile& profile, const GraphicsPipelineKey& key_, + vk::PipelineCache pipeline_cache, std::span infos, std::span runtime_infos, std::optional fetch_shader_, std::span modules) - : Pipeline{instance_, scheduler_, desc_heap_, pipeline_cache}, key{key_}, + : Pipeline{instance, scheduler, desc_heap, profile, pipeline_cache}, key{key_}, fetch_shader{std::move(fetch_shader_)} { const vk::Device device = instance.GetDevice(); std::ranges::copy(infos, stages.begin()); @@ -369,8 +369,9 @@ void GraphicsPipeline::BuildDescSetLayout() { const auto sharp = buffer.GetSharp(*stage); bindings.push_back({ .binding = binding++, - .descriptorType = buffer.IsStorage(sharp) ? vk::DescriptorType::eStorageBuffer - : vk::DescriptorType::eUniformBuffer, + .descriptorType = buffer.IsStorage(sharp, profile) + ? vk::DescriptorType::eStorageBuffer + : vk::DescriptorType::eUniformBuffer, .descriptorCount = 1, .stageFlags = gp_stage_flags, }); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 8c5cb1f3b..64cc761f4 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -75,7 +75,8 @@ struct GraphicsPipelineKey { class GraphicsPipeline : public Pipeline { public: GraphicsPipeline(const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, - const GraphicsPipelineKey& key, vk::PipelineCache pipeline_cache, + const Shader::Profile& profile, const GraphicsPipelineKey& key, + vk::PipelineCache pipeline_cache, std::span stages, std::span runtime_infos, std::optional fetch_shader, diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index c2322df41..682824044 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -209,6 +209,11 @@ public: return properties.limits.minUniformBufferOffsetAlignment; } + /// Returns the maximum size of uniform buffers. + vk::DeviceSize UniformMaxSize() const { + return properties.limits.maxUniformBufferRange; + } + /// Returns the minimum required alignment for storage buffers vk::DeviceSize StorageMinAlignment() const { return properties.limits.minStorageBufferOffsetAlignment; @@ -254,10 +259,12 @@ public: return features.shaderClipDistance; } + /// Returns the maximim viewport width. u32 GetMaxViewportWidth() const { return properties.limits.maxViewportDimensions[0]; } + /// Returns the maximum viewport height. u32 GetMaxViewportHeight() const { return properties.limits.maxViewportDimensions[1]; } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 4406be439..a936ccf31 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -204,6 +204,10 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, instance.GetDriverID() == vk::DriverId::eNvidiaProprietary, .needs_lds_barriers = instance.GetDriverID() == vk::DriverId::eNvidiaProprietary || instance.GetDriverID() == vk::DriverId::eMoltenvk, + // When binding a UBO, we calculate its size considering the offset in the larger buffer + // cache underlying resource. In some cases, it may produce sizes exceeding the system + // maximum allowed UBO range, so we need to reduce the threshold to prevent issues. + .max_ubo_size = instance.UniformMaxSize() - instance.UniformMinAlignment(), .max_viewport_width = instance.GetMaxViewportWidth(), .max_viewport_height = instance.GetMaxViewportHeight(), .max_shared_memory_size = instance.MaxComputeSharedMemorySize(), @@ -222,7 +226,7 @@ const GraphicsPipeline* PipelineCache::GetGraphicsPipeline() { } const auto [it, is_new] = graphics_pipelines.try_emplace(graphics_key); if (is_new) { - it.value() = std::make_unique(instance, scheduler, desc_heap, + it.value() = std::make_unique(instance, scheduler, desc_heap, profile, graphics_key, *pipeline_cache, infos, runtime_infos, fetch_shader, modules); if (Config::collectShadersForDebug()) { @@ -243,8 +247,9 @@ const ComputePipeline* PipelineCache::GetComputePipeline() { } const auto [it, is_new] = compute_pipelines.try_emplace(compute_key); if (is_new) { - it.value() = std::make_unique( - instance, scheduler, desc_heap, *pipeline_cache, compute_key, *infos[0], modules[0]); + it.value() = + std::make_unique(instance, scheduler, desc_heap, profile, + *pipeline_cache, compute_key, *infos[0], modules[0]); if (Config::collectShadersForDebug()) { auto& m = modules[0]; module_related_pipelines[m].emplace_back(compute_key); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index b3bccd513..ba3407b48 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h @@ -68,6 +68,10 @@ public: static std::string GetShaderName(Shader::Stage stage, u64 hash, std::optional perm = {}); + auto& GetProfile() const { + return profile; + } + private: bool RefreshGraphicsKey(); bool RefreshComputeKey(); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp index 91f53109e..bf43257f8 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp @@ -14,8 +14,10 @@ namespace Vulkan { Pipeline::Pipeline(const Instance& instance_, Scheduler& scheduler_, DescriptorHeap& desc_heap_, - vk::PipelineCache pipeline_cache, bool is_compute_ /*= false*/) - : instance{instance_}, scheduler{scheduler_}, desc_heap{desc_heap_}, is_compute{is_compute_} {} + const Shader::Profile& profile_, vk::PipelineCache pipeline_cache, + bool is_compute_ /*= false*/) + : instance{instance_}, scheduler{scheduler_}, desc_heap{desc_heap_}, profile{profile_}, + is_compute{is_compute_} {} Pipeline::~Pipeline() = default; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.h b/src/video_core/renderer_vulkan/vk_pipeline_common.h index f71631da0..e9e6fed01 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_common.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.h @@ -5,6 +5,7 @@ #include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/info.h" +#include "shader_recompiler/profile.h" #include "video_core/renderer_vulkan/vk_common.h" #include "video_core/texture_cache/texture_cache.h" @@ -26,7 +27,8 @@ class DescriptorHeap; class Pipeline { public: Pipeline(const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, - vk::PipelineCache pipeline_cache, bool is_compute = false); + const Shader::Profile& profile, vk::PipelineCache pipeline_cache, + bool is_compute = false); virtual ~Pipeline(); vk::Pipeline Handle() const noexcept { @@ -66,6 +68,7 @@ protected: const Instance& instance; Scheduler& scheduler; DescriptorHeap& desc_heap; + const Shader::Profile& profile; vk::UniquePipeline pipeline; vk::UniquePipelineLayout pipeline_layout; vk::UniqueDescriptorSetLayout desc_layout; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 6f979a734..8b1d5d8b3 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -554,11 +554,10 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } // Second pass to re-bind buffers that were updated after binding - auto& null_buffer = buffer_cache.GetBuffer(VideoCore::NULL_BUFFER_ID); for (u32 i = 0; i < buffer_bindings.size(); i++) { const auto& [buffer_id, vsharp] = buffer_bindings[i]; const auto& desc = stage.buffers[i]; - const bool is_storage = desc.IsStorage(vsharp); + const bool is_storage = desc.IsStorage(vsharp, pipeline_cache.GetProfile()); if (!buffer_id) { if (desc.is_gds_buffer) { const auto* gds_buf = buffer_cache.GetGdsBuffer(); @@ -566,6 +565,7 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } else if (instance.IsNullDescriptorSupported()) { buffer_infos.emplace_back(VK_NULL_HANDLE, 0, VK_WHOLE_SIZE); } else { + auto& null_buffer = buffer_cache.GetBuffer(VideoCore::NULL_BUFFER_ID); buffer_infos.emplace_back(null_buffer.Handle(), 0, VK_WHOLE_SIZE); } } else { From 22357f70c2ed98f454a49d068676c349e2edf0e0 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 9 Feb 2025 15:50:59 -0600 Subject: [PATCH 256/455] Improve parameter checks for posix_pthread_rename_np (#2391) --- src/core/libraries/kernel/threads/pthread.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/libraries/kernel/threads/pthread.cpp b/src/core/libraries/kernel/threads/pthread.cpp index 641fbe10d..c4127ecf2 100644 --- a/src/core/libraries/kernel/threads/pthread.cpp +++ b/src/core/libraries/kernel/threads/pthread.cpp @@ -389,6 +389,9 @@ int PS4_SYSV_ABI posix_pthread_rename_np(PthreadT thread, const char* name) { if (thread == nullptr) { return POSIX_EINVAL; } + if (name == nullptr) { + return 0; + } LOG_INFO(Kernel_Pthread, "name = {}", name); Common::SetThreadName(reinterpret_cast(thread->native_thr.GetHandle()), name); thread->name = name; From 843cd01308c98a10444beae5ce5a94bdbff26509 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 9 Feb 2025 16:34:20 -0800 Subject: [PATCH 257/455] fix: Disable VK_EXT_tooling_info on AMD proprietary for now. --- src/video_core/renderer_vulkan/vk_instance.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index c712f4e0c..780779c0b 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -254,7 +254,9 @@ bool Instance::CreateDevice() { add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME); add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); - tooling_info = add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME); + // Currently causes issues with Reshade on AMD proprietary, disable until figured out. + tooling_info = GetDriverID() != vk::DriverId::eAmdProprietary && + add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME); const bool maintenance4 = add_extension(VK_KHR_MAINTENANCE_4_EXTENSION_NAME); add_extension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); From b51c767296e38b8fff86fb790fd20c2acdcb3f91 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:31:07 -0600 Subject: [PATCH 258/455] Better bounds checks for sceKernelDlsym (#2394) Unity, being the awful game engine it is, checks for a return value of zero to determine if sceKernelLoadStartModule failed. This results in it throwing an error code into sceKernelDlsym's handle parameter when the module it's searching for doesn't exist. --- src/core/libraries/kernel/process.cpp | 3 +++ src/core/linker.h | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index 3a747bf16..58628867a 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -75,6 +75,9 @@ s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, size_t arg s32 PS4_SYSV_ABI sceKernelDlsym(s32 handle, const char* symbol, void** addrp) { auto* linker = Common::Singleton::Instance(); auto* module = linker->GetModule(handle); + if (module == nullptr) { + return ORBIS_KERNEL_ERROR_ESRCH; + } *addrp = module->FindByName(symbol); if (*addrp == nullptr) { return ORBIS_KERNEL_ERROR_ESRCH; diff --git a/src/core/linker.h b/src/core/linker.h index 357b39664..9c07400c4 100644 --- a/src/core/linker.h +++ b/src/core/linker.h @@ -83,7 +83,10 @@ public: } Module* GetModule(s32 index) const { - return m_modules.at(index).get(); + if (index >= 0 || index < m_modules.size()) { + return m_modules.at(index).get(); + } + return nullptr; } u32 FindByName(const std::filesystem::path& name) const { From 40eef6a066e1bf7ca4868e03c94521b4d8ca6e5c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:33:30 -0800 Subject: [PATCH 259/455] shader_recompiler: Exclude defaulted fragment inputs from quad/rect passthrough. (#2383) --- .../backend/spirv/emit_spirv_quad_rect.cpp | 12 ++++++++++-- .../backend/spirv/spirv_emit_context.cpp | 2 +- src/shader_recompiler/runtime_info.h | 4 ++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp index 74a807c57..e74044f63 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp @@ -254,10 +254,14 @@ private: gl_per_vertex = AddOutput(gl_per_vertex_type); } for (int i = 0; i < fs_info.num_inputs; i++) { + const auto& input = fs_info.inputs[i]; + if (input.IsDefault()) { + continue; + } outputs[i] = AddOutput(model == spv::ExecutionModel::TessellationControl ? TypeArray(vec4_id, Int(4)) : vec4_id); - Decorate(outputs[i], spv::Decoration::Location, fs_info.inputs[i].param_index); + Decorate(outputs[i], spv::Decoration::Location, input.param_index); } } @@ -273,8 +277,12 @@ private: gl_in = AddInput(gl_per_vertex_array); const Id float_arr{TypeArray(vec4_id, Int(32))}; for (int i = 0; i < fs_info.num_inputs; i++) { + const auto& input = fs_info.inputs[i]; + if (input.IsDefault()) { + continue; + } inputs[i] = AddInput(float_arr); - Decorate(inputs[i], spv::Decoration::Location, fs_info.inputs[i].param_index); + Decorate(inputs[i], spv::Decoration::Location, input.param_index); } } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 2ab5ca05d..4d5e817b4 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -316,7 +316,7 @@ void EmitContext::DefineInputs() { const auto& input = runtime_info.fs_info.inputs[i]; const u32 semantic = input.param_index; ASSERT(semantic < IR::NumParams); - if (input.is_default && !input.is_flat) { + if (input.IsDefault()) { input_params[semantic] = { MakeDefaultValue(*this, input.default_value), input_f32, F32[1], 4, false, true, }; diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index d1ae2c09d..78973c2d4 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -174,6 +174,10 @@ struct FragmentRuntimeInfo { bool is_flat; u8 default_value; + [[nodiscard]] bool IsDefault() const { + return is_default && !is_flat; + } + auto operator<=>(const PsInput&) const noexcept = default; }; AmdGpu::Liverpool::PsInput en_flags; From 2188895b4045e8a3f6ab3b0793c8085b649f50f9 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 11 Feb 2025 00:19:38 -0800 Subject: [PATCH 260/455] buffer_cache: Give null buffer full usage flags. (#2400) --- src/video_core/buffer_cache/buffer_cache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index c779c1c45..37af62f30 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -36,7 +36,7 @@ BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& s // Ensure the first slot is used for the null buffer const auto null_id = - slot_buffers.insert(instance, scheduler, MemoryUsage::DeviceLocal, 0, ReadFlags, 16); + slot_buffers.insert(instance, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags, 16); ASSERT(null_id.index == 0); const vk::Buffer& null_buffer = slot_buffers[null_id].buffer; Vulkan::SetObjectName(instance.GetDevice(), null_buffer, "Null Buffer"); From 98eb8cb741e0e30f1bcd6f83513abeb8a9002fb4 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Wed, 12 Feb 2025 11:31:19 -0300 Subject: [PATCH 261/455] Fix S_LSHR_B32 (#2405) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the shift value should be extracted from the 5 least significant bits of the second operand (S1.u[4:0]), to ensure that the shift is limited to values ​​from 0 to 31, suitable for 32-bit operations Instruction S_LSHR_B32 Description D.u = S0.u >> S1.u[4:0]. SCC = 1 if result is non-zero. --- src/shader_recompiler/frontend/translate/scalar_alu.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index b1b260fde..b5c7c98ae 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -435,7 +435,8 @@ void Translator::S_LSHL_B64(const GcnInst& inst) { void Translator::S_LSHR_B32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - const IR::U32 result{ir.ShiftRightLogical(src0, src1)}; + const IR::U32 shift_amt = ir.BitwiseAnd(src1, ir.Imm32(0x1F)); + const IR::U32 result = ir.ShiftRightLogical(src0, shift_amt); SetDst(inst.dst[0], result); ir.SetScc(ir.INotEqual(result, ir.Imm32(0))); } From 642c0bc36742b3d2df986b366b2e9d6c84a34f12 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Wed, 12 Feb 2025 14:04:35 -0300 Subject: [PATCH 262/455] QT: AutoUpdate -Formatting/Always Show Changelog (#2401) * QT: AutoUpdate - Text formatting * + * Always Show Changelog * + update Channel is already called once, it doesn't need to be called again --- src/common/config.cpp | 12 ++++++++ src/common/config.h | 2 ++ src/qt_gui/check_update.cpp | 48 ++++++++++++++++++++++++-------- src/qt_gui/settings_dialog.cpp | 9 ++++++ src/qt_gui/settings_dialog.ui | 23 +++++++++------ src/qt_gui/translations/da_DK.ts | 4 +++ src/qt_gui/translations/de.ts | 4 +++ src/qt_gui/translations/el.ts | 4 +++ src/qt_gui/translations/en.ts | 4 +++ src/qt_gui/translations/es_ES.ts | 4 +++ src/qt_gui/translations/fa_IR.ts | 4 +++ src/qt_gui/translations/fi.ts | 4 +++ src/qt_gui/translations/fr.ts | 4 +++ src/qt_gui/translations/hu_HU.ts | 4 +++ src/qt_gui/translations/id.ts | 4 +++ src/qt_gui/translations/it.ts | 4 +++ src/qt_gui/translations/ja_JP.ts | 4 +++ src/qt_gui/translations/ko_KR.ts | 4 +++ src/qt_gui/translations/lt_LT.ts | 4 +++ src/qt_gui/translations/nl.ts | 4 +++ src/qt_gui/translations/pl_PL.ts | 4 +++ src/qt_gui/translations/pt_BR.ts | 4 +++ src/qt_gui/translations/ro_RO.ts | 4 +++ src/qt_gui/translations/ru_RU.ts | 4 +++ src/qt_gui/translations/sq.ts | 4 +++ src/qt_gui/translations/sv.ts | 4 +++ src/qt_gui/translations/tr_TR.ts | 4 +++ src/qt_gui/translations/uk_UA.ts | 4 +++ src/qt_gui/translations/vi_VN.ts | 4 +++ src/qt_gui/translations/zh_CN.ts | 5 +++- src/qt_gui/translations/zh_TW.ts | 4 +++ 31 files changed, 178 insertions(+), 21 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 284407914..048571a5a 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -55,6 +55,7 @@ static bool isDebugDump = false; static bool isShaderDebug = false; static bool isShowSplash = false; static bool isAutoUpdate = false; +static bool isAlwaysShowChangelog = false; static bool isNullGpu = false; static bool shouldCopyGPUBuffers = false; static bool shouldDumpShaders = false; @@ -237,6 +238,10 @@ bool autoUpdate() { return isAutoUpdate; } +bool alwaysShowChangelog() { + return isAlwaysShowChangelog; +} + bool nullGpu() { return isNullGpu; } @@ -337,6 +342,10 @@ void setAutoUpdate(bool enable) { isAutoUpdate = enable; } +void setAlwaysShowChangelog(bool enable) { + isAlwaysShowChangelog = enable; +} + void setNullGpu(bool enable) { isNullGpu = enable; } @@ -678,6 +687,7 @@ void load(const std::filesystem::path& path) { } isShowSplash = toml::find_or(general, "showSplash", true); isAutoUpdate = toml::find_or(general, "autoUpdate", false); + isAlwaysShowChangelog = toml::find_or(general, "alwaysShowChangelog", false); separateupdatefolder = toml::find_or(general, "separateUpdateEnabled", false); compatibilityData = toml::find_or(general, "compatibilityEnabled", false); checkCompatibilityOnStartup = @@ -811,6 +821,7 @@ void save(const std::filesystem::path& path) { data["General"]["chooseHomeTab"] = chooseHomeTab; data["General"]["showSplash"] = isShowSplash; data["General"]["autoUpdate"] = isAutoUpdate; + data["General"]["alwaysShowChangelog"] = isAlwaysShowChangelog; data["General"]["separateUpdateEnabled"] = separateupdatefolder; data["General"]["compatibilityEnabled"] = compatibilityData; data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup; @@ -932,6 +943,7 @@ void setDefaultValues() { isShaderDebug = false; isShowSplash = false; isAutoUpdate = false; + isAlwaysShowChangelog = false; isNullGpu = false; shouldDumpShaders = false; vblankDivider = 1; diff --git a/src/common/config.h b/src/common/config.h index 012f9b830..3a140c0c8 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -57,6 +57,7 @@ bool debugDump(); bool collectShadersForDebug(); bool showSplash(); bool autoUpdate(); +bool alwaysShowChangelog(); bool nullGpu(); bool copyGPUCmdBuffers(); bool dumpShaders(); @@ -68,6 +69,7 @@ void setDebugDump(bool enable); void setCollectShaderForDebug(bool enable); void setShowSplash(bool enable); void setAutoUpdate(bool enable); +void setAlwaysShowChangelog(bool enable); void setNullGpu(bool enable); void setAllowHDR(bool enable); void setCopyGPUCmdBuffers(bool enable); diff --git a/src/qt_gui/check_update.cpp b/src/qt_gui/check_update.cpp index 37554abfb..ac1aa9279 100644 --- a/src/qt_gui/check_update.cpp +++ b/src/qt_gui/check_update.cpp @@ -198,29 +198,45 @@ void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate, QString updateChannel = QString::fromStdString(Config::getUpdateChannel()); - QString updateText = - QString("


" + tr("Update Channel") + ":
" + updateChannel + "
" + - tr("Current Version") + ": %1 (%2)
" + tr("Latest Version") + - ": %3 (%4)

" + tr("Do you want to update?") + "

") - .arg(currentRev.left(7), currentDate, latestRev, latestDate); + QString updateText = QString("

" + tr("Update Channel") + ": " + updateChannel + + "
" + "" + "" + "" + "" + "" + "" + "" + "" + "
" + + tr("Current Version") + + ":%1(%2)
" + + tr("Latest Version") + + ":%3(%4)

") + .arg(currentRev.left(7), currentDate, latestRev, latestDate); + QLabel* updateLabel = new QLabel(updateText, this); layout->addWidget(updateLabel); // Setup bottom layout with action buttons - QHBoxLayout* bottomLayout = new QHBoxLayout(); autoUpdateCheckBox = new QCheckBox(tr("Check for Updates at Startup"), this); + layout->addWidget(autoUpdateCheckBox); + + QHBoxLayout* updatePromptLayout = new QHBoxLayout(); + QLabel* updatePromptLabel = new QLabel(tr("Do you want to update?"), this); + updatePromptLayout->addWidget(updatePromptLabel); + yesButton = new QPushButton(tr("Update"), this); noButton = new QPushButton(tr("No"), this); yesButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); noButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); - bottomLayout->addWidget(autoUpdateCheckBox); QSpacerItem* spacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - bottomLayout->addItem(spacer); + updatePromptLayout->addItem(spacer); + updatePromptLayout->addWidget(yesButton); + updatePromptLayout->addWidget(noButton); - bottomLayout->addWidget(yesButton); - bottomLayout->addWidget(noButton); - layout->addLayout(bottomLayout); + layout->addLayout(updatePromptLayout); // Don't show changelog button if: // The current version is a pre-release and the version to be downloaded is a release. @@ -241,19 +257,27 @@ void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate, connect(toggleButton, &QPushButton::clicked, [this, textField, toggleButton, currentRev, latestRev, downloadUrl, latestDate, currentDate]() { - QString updateChannel = QString::fromStdString(Config::getUpdateChannel()); if (!textField->isVisible()) { requestChangelog(currentRev, latestRev, downloadUrl, latestDate, currentDate); textField->setVisible(true); toggleButton->setText(tr("Hide Changelog")); adjustSize(); + textField->setFixedWidth(textField->width() + 20); } else { textField->setVisible(false); toggleButton->setText(tr("Show Changelog")); adjustSize(); } }); + + if (Config::alwaysShowChangelog()) { + requestChangelog(currentRev, latestRev, downloadUrl, latestDate, currentDate); + textField->setVisible(true); + toggleButton->setText(tr("Hide Changelog")); + adjustSize(); + textField->setFixedWidth(textField->width() + 20); + } } connect(yesButton, &QPushButton::clicked, this, [this, downloadUrl]() { diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 4d9fa1621..8d69c58cf 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -137,9 +137,15 @@ SettingsDialog::SettingsDialog(std::span physical_devices, #if (QT_VERSION < QT_VERSION_CHECK(6, 7, 0)) connect(ui->updateCheckBox, &QCheckBox::stateChanged, this, [](int state) { Config::setAutoUpdate(state == Qt::Checked); }); + + connect(ui->changelogCheckBox, &QCheckBox::stateChanged, this, + [](int state) { Config::setAlwaysShowChangelog(state == Qt::Checked); }); #else connect(ui->updateCheckBox, &QCheckBox::checkStateChanged, this, [](Qt::CheckState state) { Config::setAutoUpdate(state == Qt::Checked); }); + + connect(ui->changelogCheckBox, &QCheckBox::checkStateChanged, this, + [](Qt::CheckState state) { Config::setAlwaysShowChangelog(state == Qt::Checked); }); #endif connect(ui->updateComboBox, &QComboBox::currentTextChanged, this, @@ -391,6 +397,8 @@ void SettingsDialog::LoadValuesFromConfig() { #ifdef ENABLE_UPDATER ui->updateCheckBox->setChecked(toml::find_or(data, "General", "autoUpdate", false)); + ui->changelogCheckBox->setChecked( + toml::find_or(data, "General", "alwaysShowChangelog", false)); std::string updateChannel = toml::find_or(data, "General", "updateChannel", ""); if (updateChannel != "Release" && updateChannel != "Nightly") { if (Common::isRelease) { @@ -651,6 +659,7 @@ void SettingsDialog::UpdateSettings() { Config::setCollectShaderForDebug(ui->collectShaderCheckBox->isChecked()); Config::setCopyGPUCmdBuffers(ui->copyGPUBuffersCheckBox->isChecked()); Config::setAutoUpdate(ui->updateCheckBox->isChecked()); + Config::setAlwaysShowChangelog(ui->changelogCheckBox->isChecked()); Config::setUpdateChannel(ui->updateComboBox->currentText().toStdString()); Config::setChooseHomeTab(ui->chooseHomeTabComboBox->currentText().toStdString()); Config::setCompatibilityEnabled(ui->enableCompatibilityCheckBox->isChecked()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 1b688a9b9..53bae664f 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -74,7 +74,7 @@ 0 0 946 - 535 + 536 @@ -346,7 +346,7 @@ Update - + 6 @@ -465,6 +465,13 @@
+ + + + Always Show Changelog + + + @@ -488,7 +495,7 @@ 0 0 946 - 535 + 536 @@ -937,7 +944,7 @@ 0 0 946 - 535 + 536 @@ -1181,7 +1188,7 @@ 0 0 946 - 535 + 536 @@ -1325,7 +1332,7 @@ 0 0 946 - 535 + 536 @@ -1609,7 +1616,7 @@ 0 0 946 - 535 + 536 @@ -1699,7 +1706,7 @@ 0 0 946 - 535 + 536 diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index a3f66a8f1..1b1a15a3c 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Tjek for opdateringer ved start + + Always Show Changelog + Vis altid changelog + Update Channel Opdateringskanal diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts index 83b73628b..65cdd5f4a 100644 --- a/src/qt_gui/translations/de.ts +++ b/src/qt_gui/translations/de.ts @@ -752,6 +752,10 @@ Check for Updates at Startup Beim Start nach Updates suchen + + Always Show Changelog + Changelog immer anzeigen + Update Channel Update-Kanal diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts index 8d6237d9f..ad7bed9c1 100644 --- a/src/qt_gui/translations/el.ts +++ b/src/qt_gui/translations/el.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Έλεγχος για ενημερώσεις κατά την εκκίνηση + + Always Show Changelog + Πάντα εμφάνιση ιστορικού αλλαγών + Update Channel Κανάλι Ενημέρωσης diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts index 98711f804..c3de0062a 100644 --- a/src/qt_gui/translations/en.ts +++ b/src/qt_gui/translations/en.ts @@ -740,6 +740,10 @@ Check for Updates at Startup Check for Updates at Startup + + Always Show Changelog + Always Show Changelog + Update Channel Update Channel diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 12a214fa9..2b8405ed1 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Buscar actualizaciones al iniciar + + Always Show Changelog + Mostrar siempre el registro de cambios + Update Channel Canal de Actualización diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index ba937b08f..3569e9adc 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -728,6 +728,10 @@ Check for Updates at Startup بررسی به‌روزرسانی‌ها در زمان راه‌اندازی + + Always Show Changelog + نمایش دائم تاریخچه تغییرات + Update Channel کانال به‌روزرسانی diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts index 3ffa5df60..b2494df2a 100644 --- a/src/qt_gui/translations/fi.ts +++ b/src/qt_gui/translations/fi.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Tarkista Päivitykset Käynnistäessä + + Always Show Changelog + Näytä aina muutoshistoria + Update Channel Päivityskanava diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts index 97be56eb2..0a28c712f 100644 --- a/src/qt_gui/translations/fr.ts +++ b/src/qt_gui/translations/fr.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Vérif. maj au démarrage + + Always Show Changelog + Afficher toujours le changelog + Update Channel Canal de Mise à Jour diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index ced43daa0..0d679cc4c 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Frissítések keresése indításkor + + Always Show Changelog + Mindig mutasd a változásnaplót + Update Channel Frissítési Csatorna diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts index bc8e8324d..1ddd75b45 100644 --- a/src/qt_gui/translations/id.ts +++ b/src/qt_gui/translations/id.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Periksa pembaruan saat mulai + + Always Show Changelog + Selalu Tampilkan Riwayat Perubahan + Update Channel Saluran Pembaruan diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index c65aef498..aec2a818b 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Verifica aggiornamenti all’avvio + + Always Show Changelog + Mostra sempre il changelog + Update Channel Canale di Aggiornamento diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index d566b005d..cca2f1005 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -728,6 +728,10 @@ Check for Updates at Startup 起動時に更新確認 + + Always Show Changelog + 常に変更履歴を表示 + Update Channel アップデートチャネル diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 799e706a7..d297e41a3 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Check for Updates at Startup + + Always Show Changelog + 항상 변경 사항 표시 + Update Channel Update Channel diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 4800ab7bb..e4a2dc5b4 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Tikrinti naujinimus paleidus + + Always Show Changelog + Visada rodyti pakeitimų žurnalą + Update Channel Atnaujinimo Kanalas diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts index 0975f1b14..2b939046d 100644 --- a/src/qt_gui/translations/nl.ts +++ b/src/qt_gui/translations/nl.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Bij opstart op updates controleren + + Always Show Changelog + Altijd changelog tonen + Update Channel Updatekanaal diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index e90bbef38..c9d2daa9a 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Sprawdź aktualizacje przy starcie + + Always Show Changelog + Zawsze pokazuj dziennik zmian + Update Channel Kanał Aktualizacji diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 83dd0a6b7..097d17d70 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Verificar Atualizações ao Iniciar + + Always Show Changelog + Sempre Mostrar o Changelog + Update Channel Canal de Atualização diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index ccafb59e4..1d2741bd4 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Verifică actualizări la pornire + + Always Show Changelog + Arată întotdeauna jurnalul modificărilor + Update Channel Canal de Actualizare diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 8ade23e1c..985e40a49 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -796,6 +796,10 @@ Check for Updates at Startup Проверка при запуске + + Always Show Changelog + Всегда показывать журнал изменений + Update Channel Канал обновления diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts index 41a941a08..20cce6f7d 100644 --- a/src/qt_gui/translations/sq.ts +++ b/src/qt_gui/translations/sq.ts @@ -736,6 +736,10 @@ Check for Updates at Startup Kontrollo për përditësime në nisje + + Always Show Changelog + Shfaq gjithmonë regjistrin e ndryshimeve + Update Channel Kanali i përditësimit diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv.ts index 2a68c3f77..60ebf5432 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv.ts @@ -1423,6 +1423,10 @@ Check for Updates at Startup Leta efter uppdateringar vid uppstart + + Always Show Changelog + Visa alltid ändringsloggen + Update Channel Uppdateringskanal diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index cd2b4636c..25878cb0f 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Başlangıçta güncellemeleri kontrol et + + Always Show Changelog + Her zaman değişiklik günlüğünü göster + Update Channel Güncelleme Kanalı diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 3beb07285..3b880b9ab 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -793,6 +793,10 @@ Check for Updates at Startup Перевіряти оновлення під час запуску + + Always Show Changelog + Завжди показувати журнал змін + Update Channel Канал оновлення diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 47ef07ace..a85f5b2c8 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -728,6 +728,10 @@ Check for Updates at Startup Kiểm tra cập nhật khi khởi động + + Always Show Changelog + Luôn hiển thị nhật ký thay đổi + Update Channel Kênh Cập Nhật diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 00cc9ae92..6d1f52c5d 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -728,7 +728,6 @@ Guest Debug Markers Geust 调试标记 - Update 更新 @@ -737,6 +736,10 @@ Check for Updates at Startup 启动时检查更新 + + Always Show Changelog + 始终显示变更日志 + Update Channel 更新频道 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index e05519d7a..a3a574ea5 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -728,6 +728,10 @@ Check for Updates at Startup 啟動時檢查更新 + + Always Show Changelog + 始終顯示變更紀錄 + Update Channel 更新頻道 From 7624e9482c8749c45fbae8daf9c85dca438dd2c4 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 12 Feb 2025 09:04:58 -0800 Subject: [PATCH 263/455] memory: Log for sceKernelMapNamedDirectMemory in more cases. (#2404) --- src/core/libraries/kernel/memory.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/core/libraries/kernel/memory.cpp b/src/core/libraries/kernel/memory.cpp index 551fd8e3e..82c5115f1 100644 --- a/src/core/libraries/kernel/memory.cpp +++ b/src/core/libraries/kernel/memory.cpp @@ -163,6 +163,11 @@ s32 PS4_SYSV_ABI sceKernelReserveVirtualRange(void** addr, u64 len, int flags, u int PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, int prot, int flags, s64 directMemoryStart, u64 alignment, const char* name) { + LOG_INFO(Kernel_Vmm, + "in_addr = {}, len = {:#x}, prot = {:#x}, flags = {:#x}, " + "directMemoryStart = {:#x}, alignment = {:#x}, name = '{}'", + fmt::ptr(*addr), len, prot, flags, directMemoryStart, alignment, name); + if (len == 0 || !Common::Is16KBAligned(len)) { LOG_ERROR(Kernel_Vmm, "Map size is either zero or not 16KB aligned!"); return ORBIS_KERNEL_ERROR_EINVAL; @@ -181,17 +186,14 @@ int PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, int prot, i const VAddr in_addr = reinterpret_cast(*addr); const auto mem_prot = static_cast(prot); const auto map_flags = static_cast(flags); - SCOPE_EXIT { - LOG_INFO(Kernel_Vmm, - "in_addr = {:#x}, out_addr = {}, len = {:#x}, prot = {:#x}, flags = {:#x}, " - "directMemoryStart = {:#x}, " - "alignment = {:#x}", - in_addr, fmt::ptr(*addr), len, prot, flags, directMemoryStart, alignment); - }; auto* memory = Core::Memory::Instance(); - return memory->MapMemory(addr, in_addr, len, mem_prot, map_flags, Core::VMAType::Direct, "", - false, directMemoryStart, alignment); + const auto ret = + memory->MapMemory(addr, in_addr, len, mem_prot, map_flags, Core::VMAType::Direct, "", false, + directMemoryStart, alignment); + + LOG_INFO(Kernel_Vmm, "out_addr = {}", fmt::ptr(*addr)); + return ret; } int PS4_SYSV_ABI sceKernelMapDirectMemory(void** addr, u64 len, int prot, int flags, From 50b27bebd86ba4532c6304b38661747f6705c8d0 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:05:14 +0100 Subject: [PATCH 264/455] fix deprecation (#2406) --- src/qt_gui/settings_dialog.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 8d69c58cf..e546e0997 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -184,8 +184,14 @@ SettingsDialog::SettingsDialog(std::span physical_devices, connect(ui->chooseHomeTabComboBox, &QComboBox::currentTextChanged, this, [](const QString& hometab) { Config::setChooseHomeTab(hometab.toStdString()); }); - connect(ui->showBackgroundImageCheckBox, &QCheckBox::stateChanged, this, - [](int state) { Config::setShowBackgroundImage(state == Qt::Checked); }); +#if (QT_VERSION < QT_VERSION_CHECK(6, 7, 0)) + connect(ui->showBackgroundImageCheckBox, &QCheckBox::stateChanged, this, [](int state) { +#else + connect(ui->showBackgroundImageCheckBox, &QCheckBox::checkStateChanged, this, + [](Qt::CheckState state) { +#endif + Config::setShowBackgroundImage(state == Qt::Checked); + }); } // Input TAB { From 3b1840b7a9a4eff0a862bb2582ea0574ee0b5aab Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Thu, 13 Feb 2025 01:05:35 +0800 Subject: [PATCH 265/455] Add error message when trophy data extraction fails (#2393) Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/qt_gui/trophy_viewer.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 49fb993eb..4fa5ee5e2 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include "common/path_util.h" #include "trophy_viewer.h" @@ -29,8 +30,13 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { QDir dir(trophyDirQt); if (!dir.exists()) { std::filesystem::path path = Common::FS::PathFromQString(gameTrpPath_); - if (!trp.Extract(path, title.toStdString())) + if (!trp.Extract(path, title.toStdString())) { + QMessageBox::critical(this, "Trophy Data Extraction Error", + "Unable to extract Trophy data, please ensure you have " + "inputted a trophy key in the settings menu."); + QWidget::close(); return; + } } QFileInfoList dirList = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); if (dirList.isEmpty()) From 5f2467b4532a731490a47e69415000a79028d25a Mon Sep 17 00:00:00 2001 From: Missake212 Date: Wed, 12 Feb 2025 18:05:52 +0100 Subject: [PATCH 266/455] change ts it (#2396) --- src/qt_gui/translations/it.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts index aec2a818b..77a87ba82 100644 --- a/src/qt_gui/translations/it.ts +++ b/src/qt_gui/translations/it.ts @@ -1457,7 +1457,7 @@ Boots - Stivali + Si Avvia Menus From c9d425dc08a3b061446986869d256152517c6273 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:53:42 -0800 Subject: [PATCH 267/455] fix: Correct number of allocated VGPRs. --- src/video_core/amdgpu/liverpool.h | 5 +++++ src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 67821b0f2..525a0c9f1 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -143,6 +143,11 @@ struct Liverpool { const u32 num_dwords = bininfo.length / sizeof(u32); return std::span{code, num_dwords}; } + + [[nodiscard]] u32 NumVgprs() const { + // Each increment allocates 4 registers, where 0 = 4 registers. + return (settings.num_vgprs + 1) * 4; + } }; struct HsTessFactorClamp { diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index a936ccf31..f7afd2e75 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -84,7 +84,7 @@ const Shader::RuntimeInfo& PipelineCache::BuildRuntimeInfo(Stage stage, LogicalS const auto BuildCommon = [&](const auto& program) { info.num_user_data = program.settings.num_user_regs; info.num_input_vgprs = program.settings.vgpr_comp_cnt; - info.num_allocated_vgprs = program.settings.num_vgprs * 4; + info.num_allocated_vgprs = program.NumVgprs(); info.fp_denorm_mode32 = program.settings.fp_denorm_mode32; info.fp_round_mode32 = program.settings.fp_round_mode32; }; From ebe2aadb4cf817a73cbb21c693610ba5f11b52db Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:45:42 -0800 Subject: [PATCH 268/455] gnmdriver: Implement sceGnmUpdateHsShader (#2412) --- src/core/libraries/gnmdriver/gnmdriver.cpp | 32 ++++++++++++++++++++-- src/core/libraries/gnmdriver/gnmdriver.h | 2 +- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index b22dd9893..e2e865def 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -2307,8 +2307,36 @@ s32 PS4_SYSV_ABI sceGnmUpdateGsShader(u32* cmdbuf, u32 size, const u32* gs_regs) return ORBIS_OK; } -int PS4_SYSV_ABI sceGnmUpdateHsShader() { - LOG_ERROR(Lib_GnmDriver, "(STUBBED) called"); +int PS4_SYSV_ABI sceGnmUpdateHsShader(u32* cmdbuf, u32 size, const u32* hs_regs, u32 ls_hs_config) { + LOG_TRACE(Lib_GnmDriver, "called"); + + if (!cmdbuf || size <= 0x1c) { + return -1; + } + + if (!hs_regs) { + LOG_ERROR(Lib_GnmDriver, "Null pointer passed as argument"); + return -1; + } + + if (hs_regs[1] != 0) { + LOG_ERROR(Lib_GnmDriver, "Invalid shader address"); + return -1; + } + + cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 0x108u, hs_regs[0], + 0u); // SPI_SHADER_PGM_LO_HS/SPI_SHADER_PGM_HI_HS + cmdbuf = PM4CmdSetData::SetShReg(cmdbuf, 0x10au, hs_regs[2], + hs_regs[3]); // SPI_SHADER_PGM_RSRC1_HS/SPI_SHADER_PGM_RSRC1_LS + cmdbuf = WritePacket( + cmdbuf, PM4ShaderType::ShaderGraphics, 0xc01e0286u, hs_regs[5], + hs_regs[6]); // VGT_HOS_MAX_TESS_LEVEL/VGT_HOS_MIN_TESS_LEVEL update + cmdbuf = WritePacket(cmdbuf, PM4ShaderType::ShaderGraphics, 0xc01e02dbu, + hs_regs[4]); // VGT_TF_PARAM update + cmdbuf = WritePacket(cmdbuf, PM4ShaderType::ShaderGraphics, 0xc01e02d6u, + ls_hs_config); // VGT_LS_HS_CONFIG update + + WriteTrailingNop<11>(cmdbuf); return ORBIS_OK; } diff --git a/src/core/libraries/gnmdriver/gnmdriver.h b/src/core/libraries/gnmdriver/gnmdriver.h index b4aee12b0..94d06c85f 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.h +++ b/src/core/libraries/gnmdriver/gnmdriver.h @@ -227,7 +227,7 @@ int PS4_SYSV_ABI sceGnmUnregisterAllResourcesForOwner(); int PS4_SYSV_ABI sceGnmUnregisterOwnerAndResources(); int PS4_SYSV_ABI sceGnmUnregisterResource(); s32 PS4_SYSV_ABI sceGnmUpdateGsShader(u32* cmdbuf, u32 size, const u32* gs_regs); -int PS4_SYSV_ABI sceGnmUpdateHsShader(); +int PS4_SYSV_ABI sceGnmUpdateHsShader(u32* cmdbuf, u32 size, const u32* ps_regs, u32 ls_hs_config); s32 PS4_SYSV_ABI sceGnmUpdatePsShader(u32* cmdbuf, u32 size, const u32* ps_regs); s32 PS4_SYSV_ABI sceGnmUpdatePsShader350(u32* cmdbuf, u32 size, const u32* ps_regs); s32 PS4_SYSV_ABI sceGnmUpdateVsShader(u32* cmdbuf, u32 size, const u32* vs_regs, From 6e1264215179e24c4e8c58b00df8a9f78da7a2f6 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 12 Feb 2025 20:10:13 -0800 Subject: [PATCH 269/455] shader_recompiler: Lower non-compute shared memory into spare VGPRs. (#2403) --- .../backend/spirv/emit_spirv_instructions.h | 2 - .../spirv/emit_spirv_shared_memory.cpp | 34 -------- .../backend/spirv/spirv_emit_context.cpp | 2 + src/shader_recompiler/info.h | 3 +- src/shader_recompiler/ir/ir_emitter.cpp | 5 -- src/shader_recompiler/ir/microinstruction.cpp | 1 - src/shader_recompiler/ir/opcodes.inc | 2 - .../ir/passes/hull_shader_transform.cpp | 33 +++---- src/shader_recompiler/ir/passes/ir_passes.h | 2 +- .../passes/lower_shared_mem_to_registers.cpp | 87 ++++++++++++++----- src/shader_recompiler/recompiler.cpp | 7 +- .../renderer_vulkan/vk_rasterizer.cpp | 1 + 12 files changed, 85 insertions(+), 94 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 3e2cea9e5..aaa2bb526 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -120,10 +120,8 @@ Id EmitUndefU32(EmitContext& ctx); Id EmitUndefU64(EmitContext& ctx); Id EmitLoadSharedU32(EmitContext& ctx, Id offset); Id EmitLoadSharedU64(EmitContext& ctx, Id offset); -Id EmitLoadSharedU128(EmitContext& ctx, Id offset); void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value); void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value); -void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value); Id EmitSharedAtomicIAdd32(EmitContext& ctx, Id offset, Id value); Id EmitSharedAtomicUMax32(EmitContext& ctx, Id offset, Id value); Id EmitSharedAtomicSMax32(EmitContext& ctx, Id offset, Id value); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp index 6ab213864..550b95f3d 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp @@ -38,24 +38,6 @@ Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { } } -Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { - const Id shift_id{ctx.ConstU32(2U)}; - const Id base_index{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift_id)}; - std::array values{}; - for (u32 i = 0; i < 4; ++i) { - const Id index{i == 0 ? base_index : ctx.OpIAdd(ctx.U32[1], base_index, ctx.ConstU32(i))}; - if (ctx.info.has_emulated_shared_memory) { - const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, - ctx.u32_zero_value, index)}; - values[i] = ctx.OpLoad(ctx.U32[1], pointer); - } else { - const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index)}; - values[i] = ctx.OpLoad(ctx.U32[1], pointer); - } - } - return ctx.OpCompositeConstruct(ctx.U32[4], values); -} - void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { const Id shift{ctx.ConstU32(2U)}; const Id word_offset{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift)}; @@ -88,20 +70,4 @@ void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { } } -void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value) { - const Id shift{ctx.ConstU32(2U)}; - const Id base_index{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift)}; - for (u32 i = 0; i < 4; ++i) { - const Id index{i == 0 ? base_index : ctx.OpIAdd(ctx.U32[1], base_index, ctx.ConstU32(i))}; - if (ctx.info.has_emulated_shared_memory) { - const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, - ctx.u32_zero_value, index)}; - ctx.OpStore(pointer, ctx.OpCompositeExtract(ctx.U32[1], value, i)); - } else { - const Id pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index)}; - ctx.OpStore(pointer, ctx.OpCompositeExtract(ctx.U32[1], value, i)); - } - } -} - } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 4d5e817b4..d676d205d 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -813,6 +813,8 @@ void EmitContext::DefineSharedMemory() { if (!info.uses_shared) { return; } + ASSERT(info.stage == Stage::Compute); + const u32 max_shared_memory_size = profile.max_shared_memory_size; u32 shared_memory_size = runtime_info.cs_info.shared_memory_size; if (shared_memory_size == 0) { diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index b32eb6833..57d428a49 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -233,7 +233,8 @@ struct Info { } void AddBindings(Backend::Bindings& bnd) const { - const auto total_buffers = buffers.size() + (has_readconst ? 1 : 0); + const auto total_buffers = + buffers.size() + (has_readconst ? 1 : 0) + (has_emulated_shared_memory ? 1 : 0); bnd.buffer += total_buffers; bnd.unified += total_buffers + images.size() + samplers.size(); bnd.user_data += ud_mask.NumRegs(); diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index 7e3d0f937..06c01878d 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -308,8 +308,6 @@ Value IREmitter::LoadShared(int bit_size, bool is_signed, const U32& offset) { return Inst(Opcode::LoadSharedU32, offset); case 64: return Inst(Opcode::LoadSharedU64, offset); - case 128: - return Inst(Opcode::LoadSharedU128, offset); default: UNREACHABLE_MSG("Invalid bit size {}", bit_size); } @@ -323,9 +321,6 @@ void IREmitter::WriteShared(int bit_size, const Value& value, const U32& offset) case 64: Inst(Opcode::WriteSharedU64, offset, value); break; - case 128: - Inst(Opcode::WriteSharedU128, offset, value); - break; default: UNREACHABLE_MSG("Invalid bit size {}", bit_size); } diff --git a/src/shader_recompiler/ir/microinstruction.cpp b/src/shader_recompiler/ir/microinstruction.cpp index fdbc019e3..580156f5b 100644 --- a/src/shader_recompiler/ir/microinstruction.cpp +++ b/src/shader_recompiler/ir/microinstruction.cpp @@ -78,7 +78,6 @@ bool Inst::MayHaveSideEffects() const noexcept { case Opcode::BufferAtomicSwap32: case Opcode::DataAppend: case Opcode::DataConsume: - case Opcode::WriteSharedU128: case Opcode::WriteSharedU64: case Opcode::WriteSharedU32: case Opcode::SharedAtomicIAdd32: diff --git a/src/shader_recompiler/ir/opcodes.inc b/src/shader_recompiler/ir/opcodes.inc index 0d87430d2..d5e17631b 100644 --- a/src/shader_recompiler/ir/opcodes.inc +++ b/src/shader_recompiler/ir/opcodes.inc @@ -32,10 +32,8 @@ OPCODE(EmitPrimitive, Void, // Shared memory operations OPCODE(LoadSharedU32, U32, U32, ) OPCODE(LoadSharedU64, U32x2, U32, ) -OPCODE(LoadSharedU128, U32x4, U32, ) OPCODE(WriteSharedU32, Void, U32, U32, ) OPCODE(WriteSharedU64, Void, U32, U32x2, ) -OPCODE(WriteSharedU128, Void, U32, U32x4, ) // Shared atomic operations OPCODE(SharedAtomicIAdd32, U32, U32, U32, ) diff --git a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp index b41e38339..fced4b362 100644 --- a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp +++ b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp @@ -225,10 +225,8 @@ private: switch (use.user->GetOpcode()) { case IR::Opcode::LoadSharedU32: case IR::Opcode::LoadSharedU64: - case IR::Opcode::LoadSharedU128: case IR::Opcode::WriteSharedU32: - case IR::Opcode::WriteSharedU64: - case IR::Opcode::WriteSharedU128: { + case IR::Opcode::WriteSharedU64: { u32 counter = inst->Flags(); inst->SetFlags(counter + inc); // Stop here @@ -435,12 +433,9 @@ void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info) { } case IR::Opcode::WriteSharedU32: - case IR::Opcode::WriteSharedU64: - case IR::Opcode::WriteSharedU128: { + case IR::Opcode::WriteSharedU64: { IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; - const u32 num_dwords = opcode == IR::Opcode::WriteSharedU32 - ? 1 - : (opcode == IR::Opcode::WriteSharedU64 ? 2 : 4); + const u32 num_dwords = opcode == IR::Opcode::WriteSharedU32 ? 1 : 2; const IR::U32 addr{inst.Arg(0)}; const IR::U32 data{inst.Arg(1).Resolve()}; @@ -480,15 +475,12 @@ void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info) { break; } - case IR::Opcode::LoadSharedU32: { - case IR::Opcode::LoadSharedU64: - case IR::Opcode::LoadSharedU128: + case IR::Opcode::LoadSharedU32: + case IR::Opcode::LoadSharedU64: { IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; const IR::U32 addr{inst.Arg(0)}; const AttributeRegion region = GetAttributeRegionKind(&inst, info, runtime_info); - const u32 num_dwords = opcode == IR::Opcode::LoadSharedU32 - ? 1 - : (opcode == IR::Opcode::LoadSharedU64 ? 2 : 4); + const u32 num_dwords = opcode == IR::Opcode::LoadSharedU32 ? 1 : 2; ASSERT_MSG(region == AttributeRegion::InputCP || region == AttributeRegion::OutputCP, "Unhandled read of patchconst attribute in hull shader"); @@ -562,14 +554,11 @@ void DomainShaderTransform(IR::Program& program, RuntimeInfo& runtime_info) { IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; const auto opcode = inst.GetOpcode(); switch (inst.GetOpcode()) { - case IR::Opcode::LoadSharedU32: { - case IR::Opcode::LoadSharedU64: - case IR::Opcode::LoadSharedU128: + case IR::Opcode::LoadSharedU32: + case IR::Opcode::LoadSharedU64: { const IR::U32 addr{inst.Arg(0)}; AttributeRegion region = GetAttributeRegionKind(&inst, info, runtime_info); - const u32 num_dwords = opcode == IR::Opcode::LoadSharedU32 - ? 1 - : (opcode == IR::Opcode::LoadSharedU64 ? 2 : 4); + const u32 num_dwords = opcode == IR::Opcode::LoadSharedU32 ? 1 : 2; const auto GetInput = [&](IR::U32 addr, u32 off_dw) -> IR::F32 { if (region == AttributeRegion::OutputCP) { return ReadTessControlPointAttribute( @@ -611,10 +600,8 @@ void TessellationPreprocess(IR::Program& program, RuntimeInfo& runtime_info) { switch (inst.GetOpcode()) { case IR::Opcode::LoadSharedU32: case IR::Opcode::LoadSharedU64: - case IR::Opcode::LoadSharedU128: case IR::Opcode::WriteSharedU32: - case IR::Opcode::WriteSharedU64: - case IR::Opcode::WriteSharedU128: { + case IR::Opcode::WriteSharedU64: { IR::Value addr = inst.Arg(0); auto read_const_buffer = IR::BreadthFirstSearch( addr, [](IR::Inst* maybe_tess_const) -> std::optional { diff --git a/src/shader_recompiler/ir/passes/ir_passes.h b/src/shader_recompiler/ir/passes/ir_passes.h index 0d6816ae0..3c98579a0 100644 --- a/src/shader_recompiler/ir/passes/ir_passes.h +++ b/src/shader_recompiler/ir/passes/ir_passes.h @@ -20,7 +20,7 @@ void FlattenExtendedUserdataPass(IR::Program& program); void ResourceTrackingPass(IR::Program& program); void CollectShaderInfoPass(IR::Program& program); void LowerBufferFormatToRaw(IR::Program& program); -void LowerSharedMemToRegisters(IR::Program& program); +void LowerSharedMemToRegisters(IR::Program& program, const RuntimeInfo& runtime_info); void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info, Stage stage); void TessellationPreprocess(IR::Program& program, RuntimeInfo& runtime_info); diff --git a/src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp b/src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp index c109f3595..23963a991 100644 --- a/src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp +++ b/src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp @@ -1,38 +1,81 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include +#include + +#include "shader_recompiler/ir/ir_emitter.h" #include "shader_recompiler/ir/program.h" namespace Shader::Optimization { -void LowerSharedMemToRegisters(IR::Program& program) { - boost::container::small_vector ds_writes; - Info& info{program.info}; +static bool IsSharedMemoryInst(const IR::Inst& inst) { + const auto opcode = inst.GetOpcode(); + return opcode == IR::Opcode::LoadSharedU32 || opcode == IR::Opcode::LoadSharedU64 || + opcode == IR::Opcode::WriteSharedU32 || opcode == IR::Opcode::WriteSharedU64; +} + +static u32 GetSharedMemImmOffset(const IR::Inst& inst) { + const auto* address = inst.Arg(0).InstRecursive(); + ASSERT(address->GetOpcode() == IR::Opcode::IAdd32); + const auto ir_offset = address->Arg(1); + ASSERT_MSG(ir_offset.IsImmediate()); + const auto offset = ir_offset.U32(); + // Typical usage is the compiler spilling registers into shared memory, with 256 bytes between + // each register to account for 4 bytes per register times 64 threads per group. Ensure that + // this assumption holds, as if it does not this approach may need to be revised. + ASSERT_MSG(offset % 256 == 0, "Unexpected shared memory offset alignment: {}", offset); + return offset; +} + +static void ConvertSharedMemToVgpr(IR::IREmitter& ir, IR::Inst& inst, const IR::VectorReg vgpr) { + switch (inst.GetOpcode()) { + case IR::Opcode::LoadSharedU32: + inst.ReplaceUsesWithAndRemove(ir.GetVectorReg(vgpr)); + break; + case IR::Opcode::LoadSharedU64: + inst.ReplaceUsesWithAndRemove( + ir.CompositeConstruct(ir.GetVectorReg(vgpr), ir.GetVectorReg(vgpr + 1))); + break; + case IR::Opcode::WriteSharedU32: + ir.SetVectorReg(vgpr, IR::U32{inst.Arg(1)}); + inst.Invalidate(); + break; + case IR::Opcode::WriteSharedU64: { + const auto value = inst.Arg(1); + ir.SetVectorReg(vgpr, IR::U32{ir.CompositeExtract(value, 0)}); + ir.SetVectorReg(vgpr, IR::U32{ir.CompositeExtract(value, 1)}); + inst.Invalidate(); + break; + } + default: + UNREACHABLE_MSG("Unknown shared memory opcode: {}", inst.GetOpcode()); + } +} + +void LowerSharedMemToRegisters(IR::Program& program, const RuntimeInfo& runtime_info) { + u32 next_vgpr_num = runtime_info.num_allocated_vgprs; + std::unordered_map vgpr_map; + const auto get_vgpr = [&next_vgpr_num, &vgpr_map](const u32 offset) { + const auto [it, is_new] = vgpr_map.try_emplace(offset); + if (is_new) { + ASSERT_MSG(next_vgpr_num < 256, "Out of VGPRs"); + const auto new_vgpr = static_cast(next_vgpr_num++); + it->second = new_vgpr; + } + return it->second; + }; + for (IR::Block* const block : program.blocks) { for (IR::Inst& inst : block->Instructions()) { - const auto opcode = inst.GetOpcode(); - if (opcode == IR::Opcode::WriteSharedU32 || opcode == IR::Opcode::WriteSharedU64) { - ds_writes.emplace_back(&inst); + if (!IsSharedMemoryInst(inst)) { continue; } - if (opcode == IR::Opcode::LoadSharedU32 || opcode == IR::Opcode::LoadSharedU64) { - // Search for write instruction with same offset - const IR::Inst* prod = inst.Arg(0).InstRecursive(); - const auto it = std::ranges::find_if(ds_writes, [&](const IR::Inst* write) { - const IR::Inst* write_prod = write->Arg(0).InstRecursive(); - return write_prod->Arg(1).U32() == prod->Arg(1).U32(); - }); - ASSERT(it != ds_writes.end()); - // Replace data read with value written. - inst.ReplaceUsesWithAndRemove((*it)->Arg(1)); - } + const auto offset = GetSharedMemImmOffset(inst); + const auto vgpr = get_vgpr(offset); + IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; + ConvertSharedMemToVgpr(ir, inst, vgpr); } } - // We should have eliminated everything. Invalidate data write instructions. - for (const auto inst : ds_writes) { - inst->Invalidate(); - } } } // namespace Shader::Optimization diff --git a/src/shader_recompiler/recompiler.cpp b/src/shader_recompiler/recompiler.cpp index a9f7aeb40..5a6d1d775 100644 --- a/src/shader_recompiler/recompiler.cpp +++ b/src/shader_recompiler/recompiler.cpp @@ -65,6 +65,10 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info // Run optimization passes const auto stage = program.info.stage; + if (stage == Stage::Fragment) { + // Before SSA pass, as it will rewrite to VGPR load/store. + Shader::Optimization::LowerSharedMemToRegisters(program, runtime_info); + } Shader::Optimization::SsaRewritePass(program.post_order_blocks); Shader::Optimization::IdentityRemovalPass(program.blocks); if (info.l_stage == LogicalStage::TessellationControl) { @@ -82,9 +86,6 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info } Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::RingAccessElimination(program, runtime_info, stage); - if (stage != Stage::Compute) { - Shader::Optimization::LowerSharedMemToRegisters(program); - } Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::FlattenExtendedUserdataPass(program); Shader::Optimization::ResourceTrackingPass(program); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 8b1d5d8b3..ac6aac7b3 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -535,6 +535,7 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding .descriptorType = vk::DescriptorType::eStorageBuffer, .pBufferInfo = &buffer_infos.back(), }); + ++binding.buffer; } // Bind the flattened user data buffer as a UBO so it's accessible to the shader From 7728db0dd3e60369a7ae177a3130717f13c0ad59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:01:14 +0100 Subject: [PATCH 270/455] Qt: Use Qt 6.8.2 (#2409) * Qt: Use Qt 6.8.2 * Update Building Instructions For Windows --- .github/workflows/build.yml | 6 +++--- documents/building-windows.md | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3da7163dd..63074a0a8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -111,10 +111,10 @@ jobs: - name: Setup Qt uses: jurplel/install-qt-action@v4 with: - version: 6.7.3 + version: 6.8.2 host: windows target: desktop - arch: win64_msvc2019_64 + arch: win64_msvc2022_64 archives: qtbase qttools modules: qtmultimedia @@ -228,7 +228,7 @@ jobs: - name: Setup Qt uses: jurplel/install-qt-action@v4 with: - version: 6.7.3 + version: 6.8.2 host: mac target: desktop arch: clang_64 diff --git a/documents/building-windows.md b/documents/building-windows.md index 845cdd10f..a810124d6 100644 --- a/documents/building-windows.md +++ b/documents/building-windows.md @@ -25,7 +25,7 @@ Once you are within the installer: Beware, this requires you to create a Qt account. If you do not want to do this, please follow the MSYS2/MinGW compilation method instead. -1. Under the current, non beta version of Qt (at the time of writing 6.7.3), select the option `MSVC 2022 64-bit` or similar, as well as `QT Multimedia`. +1. Under the current, non beta version of Qt (at the time of writing 6.8.2), select the option `MSVC 2022 64-bit` or similar, as well as `QT Multimedia`. If you are on Windows on ARM / Qualcomm Snapdragon Elite X, select `MSVC 2022 ARM64` instead. Go through the installation normally. If you know what you are doing, you may unselect individual components that eat up too much disk space. @@ -35,7 +35,7 @@ Beware, this requires you to create a Qt account. If you do not want to do this, Once you are finished, you will have to configure Qt within Visual Studio: 1. Tools -> Options -> Qt -> Versions -2. Add a new Qt version and navigate it to the correct folder. Should look like so: `C:\Qt\6.7.3\msvc2022_64` +2. Add a new Qt version and navigate it to the correct folder. Should look like so: `C:\Qt\6.8.2\msvc2022_64` 3. Enable the default checkmark on the new version you just created. ### (Prerequisite) Download [**Git for Windows**](https://git-scm.com/download/win) @@ -55,7 +55,7 @@ Go through the Git for Windows installation as normal 3. If you want to build shadPS4 with the Qt Gui: 1. Click x64-Clang-Release and select "Manage Configurations" 2. Look for "CMake command arguments" and add to the text field - `-DENABLE_QT_GUI=ON -DCMAKE_PREFIX_PATH=C:\Qt\6.7.3\msvc2022_64` + `-DENABLE_QT_GUI=ON -DCMAKE_PREFIX_PATH=C:\Qt\6.8.2\msvc2022_64` (Change Qt path if you've installed it to non-default path) 3. Press CTRL+S to save and wait a moment for CMake generation 4. Change the project to build to shadps4.exe @@ -64,7 +64,7 @@ Go through the Git for Windows installation as normal Your shadps4.exe will be in `C:\path\to\source\Build\x64-Clang-Release\` To automatically populate the necessary files to run shadPS4.exe, run in a command prompt or terminal: -`C:\Qt\6.7.3\msvc2022_64\bin\windeployqt6.exe "C:\path\to\shadps4.exe"` +`C:\Qt\6.8.2\msvc2022_64\bin\windeployqt6.exe "C:\path\to\shadps4.exe"` (Change Qt path if you've installed it to non-default path) ## Option 2: MSYS2/MinGW From 43191ff426358d1e6000d40b60866f5a43e628c6 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Thu, 13 Feb 2025 09:42:40 -0300 Subject: [PATCH 271/455] Formatting for Crowdin (#2413) * Formatting for crowdin * + --- src/qt_gui/cheats_patches.cpp | 20 +- src/qt_gui/pkg_viewer.cpp | 35 +- src/qt_gui/translations/ar.ts | 1471 -------- src/qt_gui/translations/ar_SA.ts | 1790 ++++++++++ src/qt_gui/translations/da_DK.ts | 3257 ++++++++++-------- src/qt_gui/translations/de.ts | 1499 --------- src/qt_gui/translations/de_DE.ts | 1790 ++++++++++ src/qt_gui/translations/el.ts | 1475 -------- src/qt_gui/translations/el_GR.ts | 1790 ++++++++++ src/qt_gui/translations/en.ts | 1515 --------- src/qt_gui/translations/en_US.ts | 1790 ++++++++++ src/qt_gui/translations/es_ES.ts | 3273 ++++++++++-------- src/qt_gui/translations/fa_IR.ts | 3257 ++++++++++-------- src/qt_gui/translations/fi.ts | 1475 -------- src/qt_gui/translations/fi_FI.ts | 1790 ++++++++++ src/qt_gui/translations/fr.ts | 1475 -------- src/qt_gui/translations/fr_FR.ts | 1790 ++++++++++ src/qt_gui/translations/hu_HU.ts | 3257 ++++++++++-------- src/qt_gui/translations/id.ts | 1475 -------- src/qt_gui/translations/id_ID.ts | 1790 ++++++++++ src/qt_gui/translations/it.ts | 1475 -------- src/qt_gui/translations/it_IT.ts | 1790 ++++++++++ src/qt_gui/translations/ja_JP.ts | 3257 ++++++++++-------- src/qt_gui/translations/ko_KR.ts | 3257 ++++++++++-------- src/qt_gui/translations/lt_LT.ts | 3257 ++++++++++-------- src/qt_gui/translations/nb.ts | 1515 --------- src/qt_gui/translations/nl.ts | 1475 -------- src/qt_gui/translations/nl_NL.ts | 1790 ++++++++++ src/qt_gui/translations/no_NO.ts | 1790 ++++++++++ src/qt_gui/translations/pl_PL.ts | 3257 ++++++++++-------- src/qt_gui/translations/pt_BR.ts | 3261 ++++++++++-------- src/qt_gui/translations/ro_RO.ts | 3257 ++++++++++-------- src/qt_gui/translations/ru_RU.ts | 2649 ++++++++------- src/qt_gui/translations/sq.ts | 1507 --------- src/qt_gui/translations/sq_AL.ts | 1790 ++++++++++ src/qt_gui/translations/{sv.ts => sv_SE.ts} | 96 +- src/qt_gui/translations/tr_TR.ts | 3257 ++++++++++-------- src/qt_gui/translations/uk_UA.ts | 3354 ++++++++++--------- src/qt_gui/translations/vi_VN.ts | 3257 ++++++++++-------- src/qt_gui/translations/zh_CN.ts | 3289 +++++++++--------- src/qt_gui/translations/zh_TW.ts | 3257 ++++++++++-------- 41 files changed, 47981 insertions(+), 39870 deletions(-) delete mode 100644 src/qt_gui/translations/ar.ts create mode 100644 src/qt_gui/translations/ar_SA.ts delete mode 100644 src/qt_gui/translations/de.ts create mode 100644 src/qt_gui/translations/de_DE.ts delete mode 100644 src/qt_gui/translations/el.ts create mode 100644 src/qt_gui/translations/el_GR.ts delete mode 100644 src/qt_gui/translations/en.ts create mode 100644 src/qt_gui/translations/en_US.ts delete mode 100644 src/qt_gui/translations/fi.ts create mode 100644 src/qt_gui/translations/fi_FI.ts delete mode 100644 src/qt_gui/translations/fr.ts create mode 100644 src/qt_gui/translations/fr_FR.ts delete mode 100644 src/qt_gui/translations/id.ts create mode 100644 src/qt_gui/translations/id_ID.ts delete mode 100644 src/qt_gui/translations/it.ts create mode 100644 src/qt_gui/translations/it_IT.ts delete mode 100644 src/qt_gui/translations/nb.ts delete mode 100644 src/qt_gui/translations/nl.ts create mode 100644 src/qt_gui/translations/nl_NL.ts create mode 100644 src/qt_gui/translations/no_NO.ts delete mode 100644 src/qt_gui/translations/sq.ts create mode 100644 src/qt_gui/translations/sq_AL.ts rename src/qt_gui/translations/{sv.ts => sv_SE.ts} (97%) diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index 13157aa3a..34a5a6760 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -568,7 +568,7 @@ void CheatsPatches::downloadCheats(const QString& source, const QString& gameSer } else { QMessageBox::warning(this, tr("Error"), QString(tr("Failed to download file:") + - "%1\n\n" + tr("Error:") + "%2") + "%1\n\n" + tr("Error") + ":%2") .arg(fileUrl) .arg(fileReply->errorString())); } @@ -644,7 +644,7 @@ void CheatsPatches::downloadCheats(const QString& source, const QString& gameSer } else { QMessageBox::warning(this, tr("Error"), QString(tr("Failed to download file:") + - "%1\n\n" + tr("Error:") + "%2") + "%1\n\n" + tr("Error") + ":%2") .arg(fileUrl) .arg(fileReply->errorString())); } @@ -843,7 +843,7 @@ void CheatsPatches::compatibleVersionNotice(const QString repository) { foreach (const QString& xmlFile, xmlFiles) { QFile file(dir.filePath(xmlFile)); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QMessageBox::warning(this, tr("ERROR"), + QMessageBox::warning(this, tr("Error"), QString(tr("Failed to open file:") + "\n%1").arg(xmlFile)); continue; } @@ -871,7 +871,7 @@ void CheatsPatches::compatibleVersionNotice(const QString repository) { } if (xmlReader.hasError()) { - QMessageBox::warning(this, tr("ERROR"), + QMessageBox::warning(this, tr("Error"), QString(tr("XML ERROR:") + "\n%1").arg(xmlReader.errorString())); } @@ -926,7 +926,7 @@ void CheatsPatches::createFilesJson(const QString& repository) { foreach (const QString& xmlFile, xmlFiles) { QFile file(dir.filePath(xmlFile)); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QMessageBox::warning(this, tr("ERROR"), + QMessageBox::warning(this, tr("Error"), QString(tr("Failed to open file:") + "\n%1").arg(xmlFile)); continue; } @@ -944,7 +944,7 @@ void CheatsPatches::createFilesJson(const QString& repository) { } if (xmlReader.hasError()) { - QMessageBox::warning(this, tr("ERROR"), + QMessageBox::warning(this, tr("Error"), QString(tr("XML ERROR:") + "\n%1").arg(xmlReader.errorString())); } filesObject[xmlFile] = titleIdsArray; @@ -952,7 +952,7 @@ void CheatsPatches::createFilesJson(const QString& repository) { QFile jsonFile(dir.absolutePath() + "/files.json"); if (!jsonFile.open(QIODevice::WriteOnly)) { - QMessageBox::warning(this, tr("ERROR"), tr("Failed to open files.json for writing")); + QMessageBox::warning(this, tr("Error"), tr("Failed to open files.json for writing")); return; } @@ -1155,7 +1155,7 @@ void CheatsPatches::addPatchesToLayout(const QString& filePath) { QString fullPath = dir.filePath(folderPath); if (!dir.exists(fullPath)) { - QMessageBox::warning(this, tr("ERROR"), + QMessageBox::warning(this, tr("Error"), QString(tr("Directory does not exist:") + "\n%1").arg(fullPath)); return; } @@ -1165,7 +1165,7 @@ void CheatsPatches::addPatchesToLayout(const QString& filePath) { QFile jsonFile(filesJsonPath); if (!jsonFile.open(QIODevice::ReadOnly)) { - QMessageBox::warning(this, tr("ERROR"), tr("Failed to open files.json for reading.")); + QMessageBox::warning(this, tr("Error"), tr("Failed to open files.json for reading.")); return; } @@ -1189,7 +1189,7 @@ void CheatsPatches::addPatchesToLayout(const QString& filePath) { if (!xmlFile.open(QIODevice::ReadOnly)) { QMessageBox::warning( - this, tr("ERROR"), + this, tr("Error"), QString(tr("Failed to open file:") + "\n%1").arg(xmlFile.fileName())); continue; } diff --git a/src/qt_gui/pkg_viewer.cpp b/src/qt_gui/pkg_viewer.cpp index b4dd3afdf..ecbc6312d 100644 --- a/src/qt_gui/pkg_viewer.cpp +++ b/src/qt_gui/pkg_viewer.cpp @@ -18,17 +18,8 @@ PKGViewer::PKGViewer(std::shared_ptr game_info_get, QWidget* pare treeWidget = new QTreeWidget(this); treeWidget->setColumnCount(9); QStringList headers; - headers << "Name" - << "Serial" - << "Installed" - << "Size" - << "Category" - << "Type" - << "App Ver" - << "FW" - << "Region" - << "Flags" - << "Path"; + headers << tr("Name") << tr("Serial") << tr("Installed") << tr("Size") << tr("Category") + << tr("Type") << tr("App Ver") << tr("FW") << tr("Region") << tr("Flags") << tr("Path"); treeWidget->setHeaderLabels(headers); treeWidget->header()->setDefaultAlignment(Qt::AlignCenter); treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); @@ -36,7 +27,7 @@ PKGViewer::PKGViewer(std::shared_ptr game_info_get, QWidget* pare this->setCentralWidget(treeWidget); QMenuBar* menuBar = new QMenuBar(this); menuBar->setContextMenuPolicy(Qt::PreventContextMenu); - QMenu* fileMenu = menuBar->addMenu(tr("&File")); + QMenu* fileMenu = menuBar->addMenu(tr("File")); QAction* openFolderAct = new QAction(tr("Open Folder"), this); fileMenu->addAction(openFolderAct); this->setMenuBar(menuBar); @@ -114,15 +105,15 @@ void PKGViewer::ProcessPKGInfo() { return; } psf.Open(package.sfo); - QString title_name = - QString::fromStdString(std::string{psf.GetString("TITLE").value_or("Unknown")}); - QString title_id = - QString::fromStdString(std::string{psf.GetString("TITLE_ID").value_or("Unknown")}); + QString title_name = QString::fromStdString( + std::string{psf.GetString("TITLE").value_or(std::string{tr("Unknown").toStdString()})}); + QString title_id = QString::fromStdString(std::string{ + psf.GetString("TITLE_ID").value_or(std::string{tr("Unknown").toStdString()})}); QString app_type = GameListUtils::GetAppType(psf.GetInteger("APP_TYPE").value_or(0)); - QString app_version = - QString::fromStdString(std::string{psf.GetString("APP_VER").value_or("Unknown")}); - QString title_category = - QString::fromStdString(std::string{psf.GetString("CATEGORY").value_or("Unknown")}); + QString app_version = QString::fromStdString(std::string{ + psf.GetString("APP_VER").value_or(std::string{tr("Unknown").toStdString()})}); + QString title_category = QString::fromStdString(std::string{ + psf.GetString("CATEGORY").value_or(std::string{tr("Unknown").toStdString()})}); QString pkg_size = GameListUtils::FormatSize(package.GetPkgHeader().pkg_size); pkg_content_flag = package.GetPkgHeader().pkg_content_flags; QString flagss = ""; @@ -134,7 +125,7 @@ void PKGViewer::ProcessPKGInfo() { } } - QString fw_ = "Unknown"; + QString fw_ = tr("Unknown"); if (const auto fw_int_opt = psf.GetInteger("SYSTEM_VER"); fw_int_opt.has_value()) { const u32 fw_int = *fw_int_opt; if (fw_int == 0) { @@ -221,6 +212,6 @@ void PKGViewer::ProcessPKGInfo() { // Update status bar. statusBar->clearMessage(); int numPkgs = m_pkg_list.size(); - QString statusMessage = QString::number(numPkgs) + " Package."; + QString statusMessage = QString::number(numPkgs) + " " + tr("Package"); statusBar->showMessage(statusMessage); } \ No newline at end of file diff --git a/src/qt_gui/translations/ar.ts b/src/qt_gui/translations/ar.ts deleted file mode 100644 index 7a6054025..000000000 --- a/src/qt_gui/translations/ar.ts +++ /dev/null @@ -1,1471 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - حول shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني. - - - - ElfViewer - - Open Folder - فتح المجلد - - - - GameInfoClass - - Loading game list, please wait :3 - جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3 - - - Cancel - إلغاء - - - Loading... - ...جارٍ التحميل - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - اختر المجلد - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - اختر المجلد - - - Directory to install games - مجلد تثبيت الألعاب - - - Browse - تصفح - - - Error - خطأ - - - The value for location to install games is not valid. - قيمة موقع تثبيت الألعاب غير صالحة. - - - - GuiContextMenus - - Create Shortcut - إنشاء اختصار - - - Cheats / Patches - الغش / التصحيحات - - - SFO Viewer - عارض SFO - - - Trophy Viewer - عارض الجوائز - - - Open Folder... - فتح المجلد... - - - Open Game Folder - فتح مجلد اللعبة - - - Open Save Data Folder - فتح مجلد بيانات الحفظ - - - Open Log Folder - فتح مجلد السجل - - - Copy info... - ...نسخ المعلومات - - - Copy Name - نسخ الاسم - - - Copy Serial - نسخ الرقم التسلسلي - - - Copy All - نسخ الكل - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - إنشاء اختصار - - - Shortcut created successfully! - تم إنشاء الاختصار بنجاح! - - - Error - خطأ - - - Error creating shortcut! - خطأ في إنشاء الاختصار - - - Install PKG - PKG تثبيت - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Elf فتح/إضافة مجلد - - - Install Packages (PKG) - (PKG) تثبيت الحزم - - - Boot Game - تشغيل اللعبة - - - Check for Updates - تحقق من التحديثات - - - About shadPS4 - shadPS4 حول - - - Configure... - ...تكوين - - - Install application from a .pkg file - .pkg تثبيت التطبيق من ملف - - - Recent Games - الألعاب الأخيرة - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - خروج - - - Exit shadPS4 - الخروج من shadPS4 - - - Exit the application. - الخروج من التطبيق. - - - Show Game List - إظهار قائمة الألعاب - - - Game List Refresh - تحديث قائمة الألعاب - - - Tiny - صغير جدًا - - - Small - صغير - - - Medium - متوسط - - - Large - كبير - - - List View - عرض القائمة - - - Grid View - عرض الشبكة - - - Elf Viewer - عارض Elf - - - Game Install Directory - دليل تثبيت اللعبة - - - Download Cheats/Patches - تنزيل الغش/التصحيحات - - - Dump Game List - تفريغ قائمة الألعاب - - - PKG Viewer - عارض PKG - - - Search... - ...بحث - - - File - ملف - - - View - عرض - - - Game List Icons - أيقونات قائمة الألعاب - - - Game List Mode - وضع قائمة الألعاب - - - Settings - الإعدادات - - - Utils - الأدوات - - - Themes - السمات - - - Help - مساعدة - - - Dark - داكن - - - Light - فاتح - - - Green - أخضر - - - Blue - أزرق - - - Violet - بنفسجي - - - toolBar - شريط الأدوات - - - Game List - ققائمة الألعاب - - - * Unsupported Vulkan Version - * إصدار Vulkan غير مدعوم - - - Download Cheats For All Installed Games - تنزيل الغش لجميع الألعاب المثبتة - - - Download Patches For All Games - تنزيل التصحيحات لجميع الألعاب - - - Download Complete - اكتمل التنزيل - - - You have downloaded cheats for all the games you have installed. - لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. - - - Patches Downloaded Successfully! - !تم تنزيل التصحيحات بنجاح - - - All Patches available for all games have been downloaded. - .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب - - - Games: - :الألعاب - - - PKG File (*.PKG) - PKG (*.PKG) ملف - - - ELF files (*.bin *.elf *.oelf) - ELF (*.bin *.elf *.oelf) ملفات - - - Game Boot - تشغيل اللعبة - - - Only one file can be selected! - !يمكن تحديد ملف واحد فقط - - - PKG Extraction - PKG استخراج - - - Patch detected! - تم اكتشاف تصحيح! - - - PKG and Game versions match: - :واللعبة تتطابق إصدارات PKG - - - Would you like to overwrite? - هل ترغب في الكتابة فوق الملف الموجود؟ - - - PKG Version %1 is older than installed version: - :أقدم من الإصدار المثبت PKG Version %1 - - - Game is installed: - :اللعبة مثبتة - - - Would you like to install Patch: - :هل ترغب في تثبيت التصحيح - - - DLC Installation - تثبيت المحتوى القابل للتنزيل - - - Would you like to install DLC: %1? - هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ - - - DLC already installed: - :المحتوى القابل للتنزيل مثبت بالفعل - - - Game already installed - اللعبة مثبتة بالفعل - - - PKG is a patch, please install the game first! - !PKG هو تصحيح، يرجى تثبيت اللعبة أولاً - - - PKG ERROR - PKG خطأ في - - - Extracting PKG %1/%2 - PKG %1/%2 جاري استخراج - - - Extraction Finished - اكتمل الاستخراج - - - Game successfully installed at %1 - تم تثبيت اللعبة بنجاح في %1 - - - File doesn't appear to be a valid PKG file - يبدو أن الملف ليس ملف PKG صالحًا - - - - PKGViewer - - Open Folder - فتح المجلد - - - - TrophyViewer - - Trophy Viewer - عارض الجوائز - - - - SettingsDialog - - Settings - الإعدادات - - - General - عام - - - System - النظام - - - Console Language - لغة وحدة التحكم - - - Emulator Language - لغة المحاكي - - - Emulator - المحاكي - - - Enable Fullscreen - تمكين ملء الشاشة - - - Fullscreen Mode - وضع ملء الشاشة - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - علامة التبويب الافتراضية عند فتح الإعدادات - - - Show Game Size In List - عرض حجم اللعبة في القائمة - - - Show Splash - إظهار شاشة البداية - - - Is PS4 Pro - PS4 Pro هل هو - - - Enable Discord Rich Presence - تفعيل حالة الثراء في ديسكورد - - - Username - اسم المستخدم - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - المسجل - - - Log Type - نوع السجل - - - Log Filter - مرشح السجل - - - Open Log Location - افتح موقع السجل - - - Input - إدخال - - - Cursor - مؤشر - - - Hide Cursor - إخفاء المؤشر - - - Hide Cursor Idle Timeout - مهلة إخفاء المؤشر عند الخمول - - - s - s - - - Controller - التحكم - - - Back Button Behavior - سلوك زر العودة - - - Graphics - الرسومات - - - GUI - واجهة - - - User - مستخدم - - - Graphics Device - جهاز الرسومات - - - Width - العرض - - - Height - الارتفاع - - - Vblank Divider - Vblank مقسم - - - Advanced - متقدم - - - Enable Shaders Dumping - تمكين تفريغ الشيدرات - - - Enable NULL GPU - تمكين وحدة معالجة الرسومات الفارغة - - - Paths - المسارات - - - Game Folders - مجلدات اللعبة - - - Add... - إضافة... - - - Remove - إزالة - - - Debug - تصحيح الأخطاء - - - Enable Debug Dumping - تمكين تفريغ التصحيح - - - Enable Vulkan Validation Layers - Vulkan تمكين طبقات التحقق من - - - Enable Vulkan Synchronization Validation - Vulkan تمكين التحقق من تزامن - - - Enable RenderDoc Debugging - RenderDoc تمكين تصحيح أخطاء - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - تحديث - - - Check for Updates at Startup - تحقق من التحديثات عند بدء التشغيل - - - Update Channel - قناة التحديث - - - Check for Updates - التحقق من التحديثات - - - GUI Settings - إعدادات الواجهة - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - تشغيل موسيقى العنوان - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - الصوت - - - Audio Backend - Audio Backend - - - Save - حفظ - - - Apply - تطبيق - - - Restore Defaults - استعادة الإعدادات الافتراضية - - - Close - إغلاق - - - Point your mouse at an option to display its description. - وجّه الماوس نحو خيار لعرض وصفه. - - - consoleLanguageGroupBox - لغة الجهاز:\nتحدد لغة اللعبة التي يستخدمها جهاز PS4.\nيوصى بضبطها على لغة يدعمها الجهاز، والتي قد تختلف حسب المنطقة. - - - emulatorLanguageGroupBox - لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. - - - fullscreenCheckBox - تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - إظهار شاشة البداية:\nيعرض شاشة البداية الخاصة باللعبة (صورة خاصة) أثناء بدء التشغيل. - - - ps4proCheckBox - هل هو PS4 Pro:\nيجعل المحاكي يعمل كـ PS4 PRO، مما قد يتيح ميزات خاصة في الألعاب التي تدعمه. - - - discordRPCCheckbox - تفعيل حالة الثراء في ديسكورد:\nيعرض أيقونة المحاكي ومعلومات ذات صلة على ملفك الشخصي في ديسكورد. - - - userName - اسم المستخدم:\nيضبط اسم حساب PS4، الذي قد يتم عرضه في بعض الألعاب. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - نوع السجل:\nيضبط ما إذا كان سيتم مزامنة مخرجات نافذة السجل للأداء. قد يؤثر سلبًا على المحاكاة. - - - logFilter - فلتر السجل:\nيقوم بتصفية السجل لطباعة معلومات محددة فقط.\nأمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده. - - - updaterGroupBox - تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. - - - GUIMusicGroupBox - تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - إخفاء المؤشر:\nاختر متى سيختفي المؤشر:\nأبداً: سترى الفأرة دائماً.\nعاطل: حدد وقتاً لاختفائه بعد أن يكون غير مستخدم.\nدائماً: لن ترى الفأرة أبداً. - - - idleTimeoutGroupBox - حدد وقتاً لاختفاء الفأرة بعد أن تكون غير مستخدم. - - - backButtonBehaviorGroupBox - سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - أبداً - - - Idle - خامل - - - Always - دائماً - - - Touchpad Left - لوحة اللمس اليسرى - - - Touchpad Right - لوحة اللمس اليمنى - - - Touchpad Center - وسط لوحة اللمس - - - None - لا شيء - - - graphicsAdapterGroupBox - جهاز الرسومات:\nعلى الأنظمة متعددة وحدات معالجة الرسومات، اختر وحدة معالجة الرسومات التي سيستخدمها المحاكي من قائمة منسدلة،\nأو اختر "Auto Select" لتحديدها تلقائيًا. - - - resolutionLayout - العرض / الارتفاع:\nيضبط حجم نافذة المحاكي عند التشغيل، والذي يمكن تغيير حجمه أثناء اللعب.\nهذا يختلف عن دقة اللعبة نفسها. - - - heightDivider - مقسم معدل التحديث:\nيتم مضاعفة معدل الإطارات الذي يتم تحديث المحاكي به بواسطة هذا الرقم. قد يؤدي تغيير هذا إلى آثار سلبية، مثل زيادة سرعة اللعبة أو كسر الوظائف الأساسية التي لا تتوقع هذا التغيير! - - - dumpShadersCheckBox - تمكين تفريغ الـ Shaders:\nلأغراض تصحيح الأخطاء التقنية، يحفظ الـ Shaders الخاصة باللعبة في مجلد أثناء التشغيل. - - - nullGpuCheckBox - تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات. - - - gameFoldersBox - مجلدات اللعبة:\nقائمة بالمجلدات للتحقق من الألعاب المثبتة. - - - addFolderButton - إضافة:\nأضف مجلداً إلى القائمة. - - - removeFolderButton - إزالة:\nأزل مجلداً من القائمة. - - - debugDump - تمكين تفريغ التصحيح:\nيحفظ رموز الاستيراد والتصدير ومعلومات رأس الملف للبرنامج الحالي لجهاز PS4 إلى دليل. - - - vkValidationCheckBox - تمكين طبقات التحقق من Vulkan:\nيتيح نظام يتحقق من حالة مشغل Vulkan ويسجل معلومات حول حالته الداخلية. سيؤدي هذا إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - - - vkSyncValidationCheckBox - تمكين التحقق من تزامن Vulkan:\nيتيح نظام يتحقق من توقيت مهام عرض Vulkan. سيؤدي ذلك إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - - - rdocCheckBox - تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - لا تتوفر صورة - - - Serial: - الرقم التسلسلي: - - - Version: - الإصدار: - - - Size: - الحجم: - - - Select Cheat File: - اختر ملف الغش: - - - Repository: - المستودع: - - - Download Cheats - تنزيل الغش - - - Delete File - حذف الملف - - - No files selected. - لم يتم اختيار أي ملفات. - - - You can delete the cheats you don't want after downloading them. - يمكنك حذف الغش الذي لا تريده بعد تنزيله. - - - Do you want to delete the selected file?\n%1 - هل تريد حذف الملف المحدد؟\n%1 - - - Select Patch File: - اختر ملف التصحيح: - - - Download Patches - تنزيل التصحيحات - - - Save - حفظ - - - Cheats - الغش - - - Patches - التصحيحات - - - Error - خطأ - - - No patch selected. - لم يتم اختيار أي تصحيح. - - - Unable to open files.json for reading. - تعذر فتح files.json للقراءة. - - - No patch file found for the current serial. - لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. - - - Unable to open the file for reading. - تعذر فتح الملف للقراءة. - - - Unable to open the file for writing. - تعذر فتح الملف للكتابة. - - - Failed to parse XML: - :فشل في تحليل XML - - - Success - نجاح - - - Options saved successfully. - تم حفظ الخيارات بنجاح. - - - Invalid Source - مصدر غير صالح - - - The selected source is invalid. - المصدر المحدد غير صالح. - - - File Exists - الملف موجود - - - File already exists. Do you want to replace it? - الملف موجود بالفعل. هل تريد استبداله؟ - - - Failed to save file: - :فشل في حفظ الملف - - - Failed to download file: - :فشل في تنزيل الملف - - - Cheats Not Found - لم يتم العثور على الغش - - - CheatsNotFound_MSG - لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. - - - Cheats Downloaded Successfully - تم تنزيل الغش بنجاح - - - CheatsDownloadedSuccessfully_MSG - لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. - - - Failed to save: - :فشل في الحفظ - - - Failed to download: - :فشل في التنزيل - - - Download Complete - اكتمل التنزيل - - - DownloadComplete_MSG - تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. - - - Failed to parse JSON data from HTML. - فشل في تحليل بيانات JSON من HTML. - - - Failed to retrieve HTML page. - .HTML فشل في استرجاع صفحة - - - The game is in version: %1 - اللعبة في الإصدار: %1 - - - The downloaded patch only works on version: %1 - الباتش الذي تم تنزيله يعمل فقط على الإصدار: %1 - - - You may need to update your game. - قد تحتاج إلى تحديث لعبتك. - - - Incompatibility Notice - إشعار عدم التوافق - - - Failed to open file: - :فشل في فتح الملف - - - XML ERROR: - :خطأ في XML - - - Failed to open files.json for writing - فشل في فتح files.json للكتابة - - - Author: - :المؤلف - - - Directory does not exist: - :المجلد غير موجود - - - Failed to open files.json for reading. - فشل في فتح files.json للقراءة. - - - Name: - :الاسم - - - Can't apply cheats before the game is started - لا يمكن تطبيق الغش قبل بدء اللعبة. - - - - GameListFrame - - Icon - أيقونة - - - Name - اسم - - - Serial - سيريال - - - Compatibility - Compatibility - - - Region - منطقة - - - Firmware - البرمجيات الثابتة - - - Size - حجم - - - Version - إصدار - - - Path - مسار - - - Play Time - وقت اللعب - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - انقر لرؤية التفاصيل على GitHub - - - Last updated - آخر تحديث - - - - CheckUpdate - - Auto Updater - محدث تلقائي - - - Error - خطأ - - - Network error: - خطأ في الشبكة: - - - Error_Github_limit_MSG - يتيح التحديث التلقائي ما يصل إلى 60 عملية تحقق من التحديث في الساعة.\nلقد وصلت إلى هذا الحد. الرجاء المحاولة مرة أخرى لاحقًا. - - - Failed to parse update information. - فشل في تحليل معلومات التحديث. - - - No pre-releases found. - لم يتم العثور على أي إصدارات مسبقة. - - - Invalid release data. - بيانات الإصدار غير صالحة. - - - No download URL found for the specified asset. - لم يتم العثور على عنوان URL للتنزيل للأصل المحدد. - - - Your version is already up to date! - نسختك محدثة بالفعل! - - - Update Available - تحديث متاح - - - Update Channel - قناة التحديث - - - Current Version - الإصدار الحالي - - - Latest Version - آخر إصدار - - - Do you want to update? - هل تريد التحديث؟ - - - Show Changelog - عرض سجل التغييرات - - - Check for Updates at Startup - تحقق من التحديثات عند بدء التشغيل - - - Update - تحديث - - - No - لا - - - Hide Changelog - إخفاء سجل التغييرات - - - Changes - تغييرات - - - Network error occurred while trying to access the URL - حدث خطأ في الشبكة أثناء محاولة الوصول إلى عنوان URL - - - Download Complete - اكتمل التنزيل - - - The update has been downloaded, press OK to install. - تم تنزيل التحديث، اضغط على OK للتثبيت. - - - Failed to save the update file at - فشل في حفظ ملف التحديث في - - - Starting Update... - بدء التحديث... - - - Failed to create the update script file - فشل في إنشاء ملف سكريبت التحديث - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - جاري جلب بيانات التوافق، يرجى الانتظار - - - Cancel - إلغاء - - - Loading... - جاري التحميل... - - - Error - خطأ - - - Unable to update compatibility data! Try again later. - تعذر تحديث بيانات التوافق! حاول مرة أخرى لاحقاً. - - - Unable to open compatibility_data.json for writing. - تعذر فتح compatibility_data.json للكتابة. - - - Unknown - غير معروف - - - Nothing - لا شيء - - - Boots - أحذية - - - Menus - قوائم - - - Ingame - داخل اللعبة - - - Playable - قابل للعب - - - diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts new file mode 100644 index 000000000..275751817 --- /dev/null +++ b/src/qt_gui/translations/ar_SA.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + حول shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + لا تتوفر صورة + + + Serial: + الرقم التسلسلي: + + + Version: + الإصدار: + + + Size: + الحجم: + + + Select Cheat File: + اختر ملف الغش: + + + Repository: + المستودع: + + + Download Cheats + تنزيل الغش + + + Delete File + حذف الملف + + + No files selected. + لم يتم اختيار أي ملفات. + + + You can delete the cheats you don't want after downloading them. + يمكنك حذف الغش الذي لا تريده بعد تنزيله. + + + Do you want to delete the selected file?\n%1 + هل تريد حذف الملف المحدد؟\n%1 + + + Select Patch File: + اختر ملف التصحيح: + + + Download Patches + تنزيل التصحيحات + + + Save + حفظ + + + Cheats + الغش + + + Patches + التصحيحات + + + Error + خطأ + + + No patch selected. + لم يتم اختيار أي تصحيح. + + + Unable to open files.json for reading. + تعذر فتح files.json للقراءة. + + + No patch file found for the current serial. + لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. + + + Unable to open the file for reading. + تعذر فتح الملف للقراءة. + + + Unable to open the file for writing. + تعذر فتح الملف للكتابة. + + + Failed to parse XML: + :فشل في تحليل XML + + + Success + نجاح + + + Options saved successfully. + تم حفظ الخيارات بنجاح. + + + Invalid Source + مصدر غير صالح + + + The selected source is invalid. + المصدر المحدد غير صالح. + + + File Exists + الملف موجود + + + File already exists. Do you want to replace it? + الملف موجود بالفعل. هل تريد استبداله؟ + + + Failed to save file: + :فشل في حفظ الملف + + + Failed to download file: + :فشل في تنزيل الملف + + + Cheats Not Found + لم يتم العثور على الغش + + + CheatsNotFound_MSG + لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. + + + Cheats Downloaded Successfully + تم تنزيل الغش بنجاح + + + CheatsDownloadedSuccessfully_MSG + لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. + + + Failed to save: + :فشل في الحفظ + + + Failed to download: + :فشل في التنزيل + + + Download Complete + اكتمل التنزيل + + + DownloadComplete_MSG + تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. + + + Failed to parse JSON data from HTML. + فشل في تحليل بيانات JSON من HTML. + + + Failed to retrieve HTML page. + .HTML فشل في استرجاع صفحة + + + The game is in version: %1 + اللعبة في الإصدار: %1 + + + The downloaded patch only works on version: %1 + الباتش الذي تم تنزيله يعمل فقط على الإصدار: %1 + + + You may need to update your game. + قد تحتاج إلى تحديث لعبتك. + + + Incompatibility Notice + إشعار عدم التوافق + + + Failed to open file: + :فشل في فتح الملف + + + XML ERROR: + :خطأ في XML + + + Failed to open files.json for writing + فشل في فتح files.json للكتابة + + + Author: + :المؤلف + + + Directory does not exist: + :المجلد غير موجود + + + Failed to open files.json for reading. + فشل في فتح files.json للقراءة. + + + Name: + :الاسم + + + Can't apply cheats before the game is started + لا يمكن تطبيق الغش قبل بدء اللعبة. + + + Close + إغلاق + + + + CheckUpdate + + Auto Updater + محدث تلقائي + + + Error + خطأ + + + Network error: + خطأ في الشبكة: + + + Error_Github_limit_MSG + يتيح التحديث التلقائي ما يصل إلى 60 عملية تحقق من التحديث في الساعة.\nلقد وصلت إلى هذا الحد. الرجاء المحاولة مرة أخرى لاحقًا. + + + Failed to parse update information. + فشل في تحليل معلومات التحديث. + + + No pre-releases found. + لم يتم العثور على أي إصدارات مسبقة. + + + Invalid release data. + بيانات الإصدار غير صالحة. + + + No download URL found for the specified asset. + لم يتم العثور على عنوان URL للتنزيل للأصل المحدد. + + + Your version is already up to date! + نسختك محدثة بالفعل! + + + Update Available + تحديث متاح + + + Update Channel + قناة التحديث + + + Current Version + الإصدار الحالي + + + Latest Version + آخر إصدار + + + Do you want to update? + هل تريد التحديث؟ + + + Show Changelog + عرض سجل التغييرات + + + Check for Updates at Startup + تحقق من التحديثات عند بدء التشغيل + + + Update + تحديث + + + No + لا + + + Hide Changelog + إخفاء سجل التغييرات + + + Changes + تغييرات + + + Network error occurred while trying to access the URL + حدث خطأ في الشبكة أثناء محاولة الوصول إلى عنوان URL + + + Download Complete + اكتمل التنزيل + + + The update has been downloaded, press OK to install. + تم تنزيل التحديث، اضغط على OK للتثبيت. + + + Failed to save the update file at + فشل في حفظ ملف التحديث في + + + Starting Update... + بدء التحديث... + + + Failed to create the update script file + فشل في إنشاء ملف سكريبت التحديث + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + جاري جلب بيانات التوافق، يرجى الانتظار + + + Cancel + إلغاء + + + Loading... + جاري التحميل... + + + Error + خطأ + + + Unable to update compatibility data! Try again later. + تعذر تحديث بيانات التوافق! حاول مرة أخرى لاحقاً. + + + Unable to open compatibility_data.json for writing. + تعذر فتح compatibility_data.json للكتابة. + + + Unknown + غير معروف + + + Nothing + لا شيء + + + Boots + أحذية + + + Menus + قوائم + + + Ingame + داخل اللعبة + + + Playable + قابل للعب + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + فتح المجلد + + + + GameInfoClass + + Loading game list, please wait :3 + جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3 + + + Cancel + إلغاء + + + Loading... + ...جارٍ التحميل + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - اختر المجلد + + + Directory to install games + مجلد تثبيت الألعاب + + + Browse + تصفح + + + Error + خطأ + + + Directory to install DLC + + + + + GameListFrame + + Icon + أيقونة + + + Name + اسم + + + Serial + سيريال + + + Compatibility + Compatibility + + + Region + منطقة + + + Firmware + البرمجيات الثابتة + + + Size + حجم + + + Version + إصدار + + + Path + مسار + + + Play Time + وقت اللعب + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + انقر لرؤية التفاصيل على GitHub + + + Last updated + آخر تحديث + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + إنشاء اختصار + + + Cheats / Patches + الغش / التصحيحات + + + SFO Viewer + عارض SFO + + + Trophy Viewer + عارض الجوائز + + + Open Folder... + فتح المجلد... + + + Open Game Folder + فتح مجلد اللعبة + + + Open Save Data Folder + فتح مجلد بيانات الحفظ + + + Open Log Folder + فتح مجلد السجل + + + Copy info... + ...نسخ المعلومات + + + Copy Name + نسخ الاسم + + + Copy Serial + نسخ الرقم التسلسلي + + + Copy All + نسخ الكل + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + إنشاء اختصار + + + Shortcut created successfully! + تم إنشاء الاختصار بنجاح! + + + Error + خطأ + + + Error creating shortcut! + خطأ في إنشاء الاختصار + + + Install PKG + PKG تثبيت + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - اختر المجلد + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Elf فتح/إضافة مجلد + + + Install Packages (PKG) + (PKG) تثبيت الحزم + + + Boot Game + تشغيل اللعبة + + + Check for Updates + تحقق من التحديثات + + + About shadPS4 + shadPS4 حول + + + Configure... + ...تكوين + + + Install application from a .pkg file + .pkg تثبيت التطبيق من ملف + + + Recent Games + الألعاب الأخيرة + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + خروج + + + Exit shadPS4 + الخروج من shadPS4 + + + Exit the application. + الخروج من التطبيق. + + + Show Game List + إظهار قائمة الألعاب + + + Game List Refresh + تحديث قائمة الألعاب + + + Tiny + صغير جدًا + + + Small + صغير + + + Medium + متوسط + + + Large + كبير + + + List View + عرض القائمة + + + Grid View + عرض الشبكة + + + Elf Viewer + عارض Elf + + + Game Install Directory + دليل تثبيت اللعبة + + + Download Cheats/Patches + تنزيل الغش/التصحيحات + + + Dump Game List + تفريغ قائمة الألعاب + + + PKG Viewer + عارض PKG + + + Search... + ...بحث + + + File + ملف + + + View + عرض + + + Game List Icons + أيقونات قائمة الألعاب + + + Game List Mode + وضع قائمة الألعاب + + + Settings + الإعدادات + + + Utils + الأدوات + + + Themes + السمات + + + Help + مساعدة + + + Dark + داكن + + + Light + فاتح + + + Green + أخضر + + + Blue + أزرق + + + Violet + بنفسجي + + + toolBar + شريط الأدوات + + + Game List + ققائمة الألعاب + + + * Unsupported Vulkan Version + * إصدار Vulkan غير مدعوم + + + Download Cheats For All Installed Games + تنزيل الغش لجميع الألعاب المثبتة + + + Download Patches For All Games + تنزيل التصحيحات لجميع الألعاب + + + Download Complete + اكتمل التنزيل + + + You have downloaded cheats for all the games you have installed. + لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. + + + Patches Downloaded Successfully! + !تم تنزيل التصحيحات بنجاح + + + All Patches available for all games have been downloaded. + .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب + + + Games: + :الألعاب + + + ELF files (*.bin *.elf *.oelf) + ELF (*.bin *.elf *.oelf) ملفات + + + Game Boot + تشغيل اللعبة + + + Only one file can be selected! + !يمكن تحديد ملف واحد فقط + + + PKG Extraction + PKG استخراج + + + Patch detected! + تم اكتشاف تصحيح! + + + PKG and Game versions match: + :واللعبة تتطابق إصدارات PKG + + + Would you like to overwrite? + هل ترغب في الكتابة فوق الملف الموجود؟ + + + PKG Version %1 is older than installed version: + :أقدم من الإصدار المثبت PKG Version %1 + + + Game is installed: + :اللعبة مثبتة + + + Would you like to install Patch: + :هل ترغب في تثبيت التصحيح + + + DLC Installation + تثبيت المحتوى القابل للتنزيل + + + Would you like to install DLC: %1? + هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ + + + DLC already installed: + :المحتوى القابل للتنزيل مثبت بالفعل + + + Game already installed + اللعبة مثبتة بالفعل + + + PKG ERROR + PKG خطأ في + + + Extracting PKG %1/%2 + PKG %1/%2 جاري استخراج + + + Extraction Finished + اكتمل الاستخراج + + + Game successfully installed at %1 + تم تثبيت اللعبة بنجاح في %1 + + + File doesn't appear to be a valid PKG file + يبدو أن الملف ليس ملف PKG صالحًا + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + فتح المجلد + + + Name + اسم + + + Serial + سيريال + + + Installed + + + + Size + حجم + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + منطقة + + + Flags + + + + Path + مسار + + + File + ملف + + + PKG ERROR + PKG خطأ في + + + Unknown + غير معروف + + + Package + + + + + SettingsDialog + + Settings + الإعدادات + + + General + عام + + + System + النظام + + + Console Language + لغة وحدة التحكم + + + Emulator Language + لغة المحاكي + + + Emulator + المحاكي + + + Enable Fullscreen + تمكين ملء الشاشة + + + Fullscreen Mode + وضع ملء الشاشة + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + علامة التبويب الافتراضية عند فتح الإعدادات + + + Show Game Size In List + عرض حجم اللعبة في القائمة + + + Show Splash + إظهار شاشة البداية + + + Enable Discord Rich Presence + تفعيل حالة الثراء في ديسكورد + + + Username + اسم المستخدم + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + المسجل + + + Log Type + نوع السجل + + + Log Filter + مرشح السجل + + + Open Log Location + افتح موقع السجل + + + Input + إدخال + + + Cursor + مؤشر + + + Hide Cursor + إخفاء المؤشر + + + Hide Cursor Idle Timeout + مهلة إخفاء المؤشر عند الخمول + + + s + s + + + Controller + التحكم + + + Back Button Behavior + سلوك زر العودة + + + Graphics + الرسومات + + + GUI + واجهة + + + User + مستخدم + + + Graphics Device + جهاز الرسومات + + + Width + العرض + + + Height + الارتفاع + + + Vblank Divider + Vblank مقسم + + + Advanced + متقدم + + + Enable Shaders Dumping + تمكين تفريغ الشيدرات + + + Enable NULL GPU + تمكين وحدة معالجة الرسومات الفارغة + + + Paths + المسارات + + + Game Folders + مجلدات اللعبة + + + Add... + إضافة... + + + Remove + إزالة + + + Debug + تصحيح الأخطاء + + + Enable Debug Dumping + تمكين تفريغ التصحيح + + + Enable Vulkan Validation Layers + Vulkan تمكين طبقات التحقق من + + + Enable Vulkan Synchronization Validation + Vulkan تمكين التحقق من تزامن + + + Enable RenderDoc Debugging + RenderDoc تمكين تصحيح أخطاء + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + تحديث + + + Check for Updates at Startup + تحقق من التحديثات عند بدء التشغيل + + + Update Channel + قناة التحديث + + + Check for Updates + التحقق من التحديثات + + + GUI Settings + إعدادات الواجهة + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + تشغيل موسيقى العنوان + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + الصوت + + + Save + حفظ + + + Apply + تطبيق + + + Restore Defaults + استعادة الإعدادات الافتراضية + + + Close + إغلاق + + + Point your mouse at an option to display its description. + وجّه الماوس نحو خيار لعرض وصفه. + + + consoleLanguageGroupBox + لغة الجهاز:\nتحدد لغة اللعبة التي يستخدمها جهاز PS4.\nيوصى بضبطها على لغة يدعمها الجهاز، والتي قد تختلف حسب المنطقة. + + + emulatorLanguageGroupBox + لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. + + + fullscreenCheckBox + تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + إظهار شاشة البداية:\nيعرض شاشة البداية الخاصة باللعبة (صورة خاصة) أثناء بدء التشغيل. + + + discordRPCCheckbox + تفعيل حالة الثراء في ديسكورد:\nيعرض أيقونة المحاكي ومعلومات ذات صلة على ملفك الشخصي في ديسكورد. + + + userName + اسم المستخدم:\nيضبط اسم حساب PS4، الذي قد يتم عرضه في بعض الألعاب. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + نوع السجل:\nيضبط ما إذا كان سيتم مزامنة مخرجات نافذة السجل للأداء. قد يؤثر سلبًا على المحاكاة. + + + logFilter + فلتر السجل:\nيقوم بتصفية السجل لطباعة معلومات محددة فقط.\nأمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده. + + + updaterGroupBox + تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. + + + GUIMusicGroupBox + تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + إخفاء المؤشر:\nاختر متى سيختفي المؤشر:\nأبداً: سترى الفأرة دائماً.\nعاطل: حدد وقتاً لاختفائه بعد أن يكون غير مستخدم.\nدائماً: لن ترى الفأرة أبداً. + + + idleTimeoutGroupBox + حدد وقتاً لاختفاء الفأرة بعد أن تكون غير مستخدم. + + + backButtonBehaviorGroupBox + سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + أبداً + + + Idle + خامل + + + Always + دائماً + + + Touchpad Left + لوحة اللمس اليسرى + + + Touchpad Right + لوحة اللمس اليمنى + + + Touchpad Center + وسط لوحة اللمس + + + None + لا شيء + + + graphicsAdapterGroupBox + جهاز الرسومات:\nعلى الأنظمة متعددة وحدات معالجة الرسومات، اختر وحدة معالجة الرسومات التي سيستخدمها المحاكي من قائمة منسدلة،\nأو اختر "Auto Select" لتحديدها تلقائيًا. + + + resolutionLayout + العرض / الارتفاع:\nيضبط حجم نافذة المحاكي عند التشغيل، والذي يمكن تغيير حجمه أثناء اللعب.\nهذا يختلف عن دقة اللعبة نفسها. + + + heightDivider + مقسم معدل التحديث:\nيتم مضاعفة معدل الإطارات الذي يتم تحديث المحاكي به بواسطة هذا الرقم. قد يؤدي تغيير هذا إلى آثار سلبية، مثل زيادة سرعة اللعبة أو كسر الوظائف الأساسية التي لا تتوقع هذا التغيير! + + + dumpShadersCheckBox + تمكين تفريغ الـ Shaders:\nلأغراض تصحيح الأخطاء التقنية، يحفظ الـ Shaders الخاصة باللعبة في مجلد أثناء التشغيل. + + + nullGpuCheckBox + تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات. + + + gameFoldersBox + مجلدات اللعبة:\nقائمة بالمجلدات للتحقق من الألعاب المثبتة. + + + addFolderButton + إضافة:\nأضف مجلداً إلى القائمة. + + + removeFolderButton + إزالة:\nأزل مجلداً من القائمة. + + + debugDump + تمكين تفريغ التصحيح:\nيحفظ رموز الاستيراد والتصدير ومعلومات رأس الملف للبرنامج الحالي لجهاز PS4 إلى دليل. + + + vkValidationCheckBox + تمكين طبقات التحقق من Vulkan:\nيتيح نظام يتحقق من حالة مشغل Vulkan ويسجل معلومات حول حالته الداخلية. سيؤدي هذا إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. + + + vkSyncValidationCheckBox + تمكين التحقق من تزامن Vulkan:\nيتيح نظام يتحقق من توقيت مهام عرض Vulkan. سيؤدي ذلك إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. + + + rdocCheckBox + تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Always Show Changelog + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + تصفح + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + مجلد تثبيت الألعاب + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + عارض الجوائز + + + diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 1b1a15a3c..17d34bc3b 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - Trick / Patches - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Åbn Mappe... - - - Open Game Folder - Åbn Spilmappe - - - Open Save Data Folder - Åbn Gem Data Mappe - - - Open Log Folder - Åbn Log Mappe - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Tjek for opdateringer - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Download Tricks / Patches - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Hjælp - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Spiloversigt - - - * Unsupported Vulkan Version - * Ikke understøttet Vulkan-version - - - Download Cheats For All Installed Games - Hent snyd til alle installerede spil - - - Download Patches For All Games - Hent patches til alle spil - - - Download Complete - Download fuldført - - - You have downloaded cheats for all the games you have installed. - Du har hentet snyd til alle de spil, du har installeret. - - - Patches Downloaded Successfully! - Patcher hentet med succes! - - - All Patches available for all games have been downloaded. - Alle patches til alle spil er blevet hentet. - - - Games: - Spil: - - - PKG File (*.PKG) - PKG-fil (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - Game Boot - Spil-boot - - - Only one file can be selected! - Kun én fil kan vælges! - - - PKG Extraction - PKG-udtrækning - - - Patch detected! - Opdatering detekteret! - - - PKG and Game versions match: - PKG og spilversioner matcher: - - - Would you like to overwrite? - Vil du overskrive? - - - PKG Version %1 is older than installed version: - PKG Version %1 er ældre end den installerede version: - - - Game is installed: - Spillet er installeret: - - - Would you like to install Patch: - Vil du installere opdateringen: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Vil du installere DLC: %1? - - - DLC already installed: - DLC allerede installeret: - - - Game already installed - Spillet er allerede installeret - - - PKG is a patch, please install the game first! - PKG er en patch, venligst installer spillet først! - - - PKG ERROR - PKG FEJL - - - Extracting PKG %1/%2 - Udvinding af PKG %1/%2 - - - Extraction Finished - Udvinding afsluttet - - - Game successfully installed at %1 - Spillet blev installeret succesfuldt på %1 - - - File doesn't appear to be a valid PKG file - Filen ser ikke ud til at være en gyldig PKG-fil - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Fuldskærmstilstand - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Standardfaneblad ved åbning af indstillinger - - - Show Game Size In List - Vis vis spilstørrelse i listen - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Aktiver Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Åbn logplacering - - - Input - Indtastning - - - Cursor - Markør - - - Hide Cursor - Skjul markør - - - Hide Cursor Idle Timeout - Timeout for skjul markør ved inaktivitet - - - s - s - - - Controller - Controller - - - Back Button Behavior - Tilbageknap adfærd - - - Graphics - Graphics - - - GUI - Interface - - - User - Bruger - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Stier - - - Game Folders - Spilmapper - - - Add... - Tilføj... - - - Remove - Fjern - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Opdatering - - - Check for Updates at Startup - Tjek for opdateringer ved start - - - Always Show Changelog - Vis altid changelog - - - Update Channel - Opdateringskanal - - - Check for Updates - Tjek for opdateringer - - - GUI Settings - GUI-Indstillinger - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Afspil titelsang - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Lydstyrke - - - Audio Backend - Audio Backend - - - Save - Gem - - - Apply - Anvend - - - Restore Defaults - Gendan standardindstillinger - - - Close - Luk - - - Point your mouse at an option to display its description. - Peg musen over et valg for at vise dets beskrivelse. - - - consoleLanguageGroupBox - Konsolsprog:\nIndstiller sproget, som PS4-spillet bruger.\nDet anbefales at indstille dette til et sprog, som spillet understøtter, hvilket kan variere efter region. - - - emulatorLanguageGroupBox - Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. - - - fullscreenCheckBox - Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Vis startskærm:\nViser en startskærm (speciel grafik) under opstarten. - - - ps4proCheckBox - Er det en PS4 Pro:\nGør det muligt for emulatoren at fungere som en PS4 PRO, hvilket kan aktivere visse funktioner i spil, der understøtter det. - - - discordRPCCheckbox - Aktiver Discord Rich Presence:\nViser emulatorikonet og relevante oplysninger på din Discord-profil. - - - userName - Brugernavn:\nIndstiller PS4-kontoens navn, som kan blive vist i nogle spil. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Logtype:\nIndstiller, om logvinduets output vil blive synkroniseret for at øge ydeevnen. Dette kan påvirke emulatorens ydeevne negativt. - - - logFilter - Logfilter:\nFiltrerer loggen for kun at udskrive bestemte oplysninger.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer. - - - updaterGroupBox - Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. - - - GUIMusicGroupBox - Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Skjul Cursor:\nVælg hvornår cursoren skal forsvinde:\nAldrig: Du vil altid se musen.\nInaktiv: Indstil en tid for, hvornår den skal forsvinde efter at være inaktiv.\nAltid: du vil aldrig se musen. - - - idleTimeoutGroupBox - Indstil en tid for, at musen skal forsvinde efter at være inaktiv. - - - backButtonBehaviorGroupBox - Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk på den angivne position på PS4 berøringsflade. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Aldrig - - - Idle - Inaktiv - - - Always - Altid - - - Touchpad Left - Berøringsplade Venstre - - - Touchpad Right - Berøringsplade Højre - - - Touchpad Center - Berøringsplade Center - - - None - Ingen - - - graphicsAdapterGroupBox - Grafikadapter:\nPå systemer med flere GPU'er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge "Auto Select" for at vælge den automatisk. - - - resolutionLayout - Skærmopløsning:\nIndstiller emulatorvinduets størrelse under afspilning, som kan ændres under afspilning.\nDette er forskelligt fra selve spillets opløsning. - - - heightDivider - Opdateringshastighedsdeler:\nMultiplicerer den frekvens, som emulatoren opdaterer billedet med, med dette tal. Ændring af dette kan have negative effekter, såsom hurtigere spil eller ødelagte funktioner! - - - dumpShadersCheckBox - Aktiver dumping af Shaders:\nTil teknisk fejlfinding gemmer det spillets shaders i en mappe under afspilning. - - - nullGpuCheckBox - Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort. - - - gameFoldersBox - Spilmappen:\nListen over mapper til at tjekke for installerede spil. - - - addFolderButton - Tilføj:\nTilføj en mappe til listen. - - - removeFolderButton - Fjern:\nFjern en mappe fra listen. - - - debugDump - Aktiver debugging-dump:\nGemmer import/export-symboler og headeroplysninger for det aktuelle PS4-program til en mappe. - - - vkValidationCheckBox - Aktiver Vulkan-valideringslag:\nAktiverer et system, der validerer Vulkan-driverens tilstand og logger oplysninger om dens interne tilstand. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - - - vkSyncValidationCheckBox - Aktiver Vulkan-synkroniseringsvalidering:\nAktiverer et system, der validerer tidspunktet for Vulkan's renderingsopgaver. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - - - rdocCheckBox - Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Ingen billede tilgængelig - - - Serial: - Serienummer: - - - Version: - Version: - - - Size: - Størrelse: - - - Select Cheat File: - Vælg snyd-fil: - - - Repository: - Repository: - - - Download Cheats - Hent snyd - - - Delete File - Slet fil - - - No files selected. - Ingen filer valgt. - - - You can delete the cheats you don't want after downloading them. - Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. - - - Do you want to delete the selected file?\n%1 - Ønsker du at slette den valgte fil?\n%1 - - - Select Patch File: - Vælg patch-fil: - - - Download Patches - Hent patches - - - Save - Gem - - - Cheats - Snyd - - - Patches - Patches - - - Error - Fejl - - - No patch selected. - Ingen patch valgt. - - - Unable to open files.json for reading. - Kan ikke åbne files.json til læsning. - - - No patch file found for the current serial. - Ingen patch-fil fundet for det nuværende serienummer. - - - Unable to open the file for reading. - Kan ikke åbne filen til læsning. - - - Unable to open the file for writing. - Kan ikke åbne filen til skrivning. - - - Failed to parse XML: - Kunne ikke analysere XML: - - - Success - Succes - - - Options saved successfully. - Indstillinger gemt med succes. - - - Invalid Source - Ugyldig kilde - - - The selected source is invalid. - Den valgte kilde er ugyldig. - - - File Exists - Fil findes - - - File already exists. Do you want to replace it? - Filen findes allerede. Vil du erstatte den? - - - Failed to save file: - Kunne ikke gemme fil: - - - Failed to download file: - Kunne ikke hente fil: - - - Cheats Not Found - Snyd ikke fundet - - - CheatsNotFound_MSG - Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. - - - Cheats Downloaded Successfully - Snyd hentet med succes - - - CheatsDownloadedSuccessfully_MSG - Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. - - - Failed to save: - Kunne ikke gemme: - - - Failed to download: - Kunne ikke hente: - - - Download Complete - Download fuldført - - - DownloadComplete_MSG - Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. - - - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. - - - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. - - - The game is in version: %1 - Spillet er i version: %1 - - - The downloaded patch only works on version: %1 - Den downloadede patch fungerer kun på version: %1 - - - You may need to update your game. - Du skal muligvis opdatere dit spil. - - - Incompatibility Notice - Uforenelighedsmeddelelse - - - Failed to open file: - Kunne ikke åbne fil: - - - XML ERROR: - XML FEJL: - - - Failed to open files.json for writing - Kunne ikke åbne files.json til skrivning - - - Author: - Forfatter: - - - Directory does not exist: - Mappe findes ikke: - - - Failed to open files.json for reading. - Kunne ikke åbne files.json til læsning. - - - Name: - Navn: - - - Can't apply cheats before the game is started - Kan ikke anvende snyd før spillet er startet. - - - - GameListFrame - - Icon - Ikon - - - Name - Navn - - - Serial - Seriel - - - Compatibility - Compatibility - - - Region - Region - - - Firmware - Firmware - - - Size - Størrelse - - - Version - Version - - - Path - Sti - - - Play Time - Spilletid - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Klik for at se detaljer på GitHub - - - Last updated - Sidst opdateret - - - - CheckUpdate - - Auto Updater - Automatisk opdatering - - - Error - Fejl - - - Network error: - Netsværksfejl: - - - Error_Github_limit_MSG - Autoopdateren tillader op til 60 opdateringstjek i timen.\nDu har nået denne grænse. Prøv igen senere. - - - Failed to parse update information. - Kunne ikke analysere opdateringsoplysninger. - - - No pre-releases found. - Ingen forhåndsudgivelser fundet. - - - Invalid release data. - Ugyldige udgivelsesdata. - - - No download URL found for the specified asset. - Ingen download-URL fundet for den specificerede aktiver. - - - Your version is already up to date! - Din version er allerede opdateret! - - - Update Available - Opdatering tilgængelig - - - Update Channel - Opdateringskanal - - - Current Version - Nuværende version - - - Latest Version - Nyeste version - - - Do you want to update? - Vil du opdatere? - - - Show Changelog - Vis ændringslog - - - Check for Updates at Startup - Tjek for opdateringer ved start - - - Update - Opdater - - - No - Nej - - - Hide Changelog - Skjul ændringslog - - - Changes - Ændringer - - - Network error occurred while trying to access the URL - Netsværksfejl opstod, mens der blev forsøgt at få adgang til URL'en - - - Download Complete - Download fuldført - - - The update has been downloaded, press OK to install. - Opdateringen er blevet downloadet, tryk på OK for at installere. - - - Failed to save the update file at - Kunne ikke gemme opdateringsfilen på - - - Starting Update... - Starter opdatering... - - - Failed to create the update script file - Kunne ikke oprette opdateringsscriptfilen - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Henter kompatibilitetsdata, vent venligst - - - Cancel - Annuller - - - Loading... - Indlæser... - - - Error - Fejl - - - Unable to update compatibility data! Try again later. - Kan ikke opdatere kompatibilitetsdata! Prøv igen senere. - - - Unable to open compatibility_data.json for writing. - Kan ikke åbne compatibility_data.json til skrivning. - - - Unknown - Ukendt - - - Nothing - Intet - - - Boots - Støvler - - - Menus - Menuer - - - Ingame - I spillet - - - Playable - Spilbar - - + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Ingen billede tilgængelig + + + Serial: + Serienummer: + + + Version: + Version: + + + Size: + Størrelse: + + + Select Cheat File: + Vælg snyd-fil: + + + Repository: + Repository: + + + Download Cheats + Hent snyd + + + Delete File + Slet fil + + + No files selected. + Ingen filer valgt. + + + You can delete the cheats you don't want after downloading them. + Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. + + + Do you want to delete the selected file?\n%1 + Ønsker du at slette den valgte fil?\n%1 + + + Select Patch File: + Vælg patch-fil: + + + Download Patches + Hent patches + + + Save + Gem + + + Cheats + Snyd + + + Patches + Patches + + + Error + Fejl + + + No patch selected. + Ingen patch valgt. + + + Unable to open files.json for reading. + Kan ikke åbne files.json til læsning. + + + No patch file found for the current serial. + Ingen patch-fil fundet for det nuværende serienummer. + + + Unable to open the file for reading. + Kan ikke åbne filen til læsning. + + + Unable to open the file for writing. + Kan ikke åbne filen til skrivning. + + + Failed to parse XML: + Kunne ikke analysere XML: + + + Success + Succes + + + Options saved successfully. + Indstillinger gemt med succes. + + + Invalid Source + Ugyldig kilde + + + The selected source is invalid. + Den valgte kilde er ugyldig. + + + File Exists + Fil findes + + + File already exists. Do you want to replace it? + Filen findes allerede. Vil du erstatte den? + + + Failed to save file: + Kunne ikke gemme fil: + + + Failed to download file: + Kunne ikke hente fil: + + + Cheats Not Found + Snyd ikke fundet + + + CheatsNotFound_MSG + Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. + + + Cheats Downloaded Successfully + Snyd hentet med succes + + + CheatsDownloadedSuccessfully_MSG + Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. + + + Failed to save: + Kunne ikke gemme: + + + Failed to download: + Kunne ikke hente: + + + Download Complete + Download fuldført + + + DownloadComplete_MSG + Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. + + + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. + + + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. + + + The game is in version: %1 + Spillet er i version: %1 + + + The downloaded patch only works on version: %1 + Den downloadede patch fungerer kun på version: %1 + + + You may need to update your game. + Du skal muligvis opdatere dit spil. + + + Incompatibility Notice + Uforenelighedsmeddelelse + + + Failed to open file: + Kunne ikke åbne fil: + + + XML ERROR: + XML FEJL: + + + Failed to open files.json for writing + Kunne ikke åbne files.json til skrivning + + + Author: + Forfatter: + + + Directory does not exist: + Mappe findes ikke: + + + Failed to open files.json for reading. + Kunne ikke åbne files.json til læsning. + + + Name: + Navn: + + + Can't apply cheats before the game is started + Kan ikke anvende snyd før spillet er startet. + + + Close + Luk + + + + CheckUpdate + + Auto Updater + Automatisk opdatering + + + Error + Fejl + + + Network error: + Netsværksfejl: + + + Error_Github_limit_MSG + Autoopdateren tillader op til 60 opdateringstjek i timen.\nDu har nået denne grænse. Prøv igen senere. + + + Failed to parse update information. + Kunne ikke analysere opdateringsoplysninger. + + + No pre-releases found. + Ingen forhåndsudgivelser fundet. + + + Invalid release data. + Ugyldige udgivelsesdata. + + + No download URL found for the specified asset. + Ingen download-URL fundet for den specificerede aktiver. + + + Your version is already up to date! + Din version er allerede opdateret! + + + Update Available + Opdatering tilgængelig + + + Update Channel + Opdateringskanal + + + Current Version + Nuværende version + + + Latest Version + Nyeste version + + + Do you want to update? + Vil du opdatere? + + + Show Changelog + Vis ændringslog + + + Check for Updates at Startup + Tjek for opdateringer ved start + + + Update + Opdater + + + No + Nej + + + Hide Changelog + Skjul ændringslog + + + Changes + Ændringer + + + Network error occurred while trying to access the URL + Netsværksfejl opstod, mens der blev forsøgt at få adgang til URL'en + + + Download Complete + Download fuldført + + + The update has been downloaded, press OK to install. + Opdateringen er blevet downloadet, tryk på OK for at installere. + + + Failed to save the update file at + Kunne ikke gemme opdateringsfilen på + + + Starting Update... + Starter opdatering... + + + Failed to create the update script file + Kunne ikke oprette opdateringsscriptfilen + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vent venligst + + + Cancel + Annuller + + + Loading... + Indlæser... + + + Error + Fejl + + + Unable to update compatibility data! Try again later. + Kan ikke opdatere kompatibilitetsdata! Prøv igen senere. + + + Unable to open compatibility_data.json for writing. + Kan ikke åbne compatibility_data.json til skrivning. + + + Unknown + Ukendt + + + Nothing + Intet + + + Boots + Støvler + + + Menus + Menuer + + + Ingame + I spillet + + + Playable + Spilbar + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikon + + + Name + Navn + + + Serial + Seriel + + + Compatibility + Compatibility + + + Region + Region + + + Firmware + Firmware + + + Size + Størrelse + + + Version + Version + + + Path + Sti + + + Play Time + Spilletid + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Klik for at se detaljer på GitHub + + + Last updated + Sidst opdateret + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Trick / Patches + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Åbn Mappe... + + + Open Game Folder + Åbn Spilmappe + + + Open Save Data Folder + Åbn Gem Data Mappe + + + Open Log Folder + Åbn Log Mappe + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Tjek for opdateringer + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Download Tricks / Patches + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Hjælp + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Spiloversigt + + + * Unsupported Vulkan Version + * Ikke understøttet Vulkan-version + + + Download Cheats For All Installed Games + Hent snyd til alle installerede spil + + + Download Patches For All Games + Hent patches til alle spil + + + Download Complete + Download fuldført + + + You have downloaded cheats for all the games you have installed. + Du har hentet snyd til alle de spil, du har installeret. + + + Patches Downloaded Successfully! + Patcher hentet med succes! + + + All Patches available for all games have been downloaded. + Alle patches til alle spil er blevet hentet. + + + Games: + Spil: + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + Game Boot + Spil-boot + + + Only one file can be selected! + Kun én fil kan vælges! + + + PKG Extraction + PKG-udtrækning + + + Patch detected! + Opdatering detekteret! + + + PKG and Game versions match: + PKG og spilversioner matcher: + + + Would you like to overwrite? + Vil du overskrive? + + + PKG Version %1 is older than installed version: + PKG Version %1 er ældre end den installerede version: + + + Game is installed: + Spillet er installeret: + + + Would you like to install Patch: + Vil du installere opdateringen: + + + DLC Installation + DLC Installation + + + Would you like to install DLC: %1? + Vil du installere DLC: %1? + + + DLC already installed: + DLC allerede installeret: + + + Game already installed + Spillet er allerede installeret + + + PKG ERROR + PKG FEJL + + + Extracting PKG %1/%2 + Udvinding af PKG %1/%2 + + + Extraction Finished + Udvinding afsluttet + + + Game successfully installed at %1 + Spillet blev installeret succesfuldt på %1 + + + File doesn't appear to be a valid PKG file + Filen ser ikke ud til at være en gyldig PKG-fil + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Navn + + + Serial + Seriel + + + Installed + + + + Size + Størrelse + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Region + + + Flags + + + + Path + Sti + + + File + File + + + PKG ERROR + PKG FEJL + + + Unknown + Ukendt + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Fuldskærmstilstand + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Standardfaneblad ved åbning af indstillinger + + + Show Game Size In List + Vis vis spilstørrelse i listen + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Aktiver Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Åbn logplacering + + + Input + Indtastning + + + Cursor + Markør + + + Hide Cursor + Skjul markør + + + Hide Cursor Idle Timeout + Timeout for skjul markør ved inaktivitet + + + s + s + + + Controller + Controller + + + Back Button Behavior + Tilbageknap adfærd + + + Graphics + Graphics + + + GUI + Interface + + + User + Bruger + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Stier + + + Game Folders + Spilmapper + + + Add... + Tilføj... + + + Remove + Fjern + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Opdatering + + + Check for Updates at Startup + Tjek for opdateringer ved start + + + Always Show Changelog + Vis altid changelog + + + Update Channel + Opdateringskanal + + + Check for Updates + Tjek for opdateringer + + + GUI Settings + GUI-Indstillinger + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Afspil titelsang + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Lydstyrke + + + Save + Gem + + + Apply + Anvend + + + Restore Defaults + Gendan standardindstillinger + + + Close + Luk + + + Point your mouse at an option to display its description. + Peg musen over et valg for at vise dets beskrivelse. + + + consoleLanguageGroupBox + Konsolsprog:\nIndstiller sproget, som PS4-spillet bruger.\nDet anbefales at indstille dette til et sprog, som spillet understøtter, hvilket kan variere efter region. + + + emulatorLanguageGroupBox + Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. + + + fullscreenCheckBox + Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Vis startskærm:\nViser en startskærm (speciel grafik) under opstarten. + + + discordRPCCheckbox + Aktiver Discord Rich Presence:\nViser emulatorikonet og relevante oplysninger på din Discord-profil. + + + userName + Brugernavn:\nIndstiller PS4-kontoens navn, som kan blive vist i nogle spil. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Logtype:\nIndstiller, om logvinduets output vil blive synkroniseret for at øge ydeevnen. Dette kan påvirke emulatorens ydeevne negativt. + + + logFilter + Logfilter:\nFiltrerer loggen for kun at udskrive bestemte oplysninger.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer. + + + updaterGroupBox + Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. + + + GUIMusicGroupBox + Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Skjul Cursor:\nVælg hvornår cursoren skal forsvinde:\nAldrig: Du vil altid se musen.\nInaktiv: Indstil en tid for, hvornår den skal forsvinde efter at være inaktiv.\nAltid: du vil aldrig se musen. + + + idleTimeoutGroupBox + Indstil en tid for, at musen skal forsvinde efter at være inaktiv. + + + backButtonBehaviorGroupBox + Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk på den angivne position på PS4 berøringsflade. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Aldrig + + + Idle + Inaktiv + + + Always + Altid + + + Touchpad Left + Berøringsplade Venstre + + + Touchpad Right + Berøringsplade Højre + + + Touchpad Center + Berøringsplade Center + + + None + Ingen + + + graphicsAdapterGroupBox + Grafikadapter:\nPå systemer med flere GPU'er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge "Auto Select" for at vælge den automatisk. + + + resolutionLayout + Skærmopløsning:\nIndstiller emulatorvinduets størrelse under afspilning, som kan ændres under afspilning.\nDette er forskelligt fra selve spillets opløsning. + + + heightDivider + Opdateringshastighedsdeler:\nMultiplicerer den frekvens, som emulatoren opdaterer billedet med, med dette tal. Ændring af dette kan have negative effekter, såsom hurtigere spil eller ødelagte funktioner! + + + dumpShadersCheckBox + Aktiver dumping af Shaders:\nTil teknisk fejlfinding gemmer det spillets shaders i en mappe under afspilning. + + + nullGpuCheckBox + Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort. + + + gameFoldersBox + Spilmappen:\nListen over mapper til at tjekke for installerede spil. + + + addFolderButton + Tilføj:\nTilføj en mappe til listen. + + + removeFolderButton + Fjern:\nFjern en mappe fra listen. + + + debugDump + Aktiver debugging-dump:\nGemmer import/export-symboler og headeroplysninger for det aktuelle PS4-program til en mappe. + + + vkValidationCheckBox + Aktiver Vulkan-valideringslag:\nAktiverer et system, der validerer Vulkan-driverens tilstand og logger oplysninger om dens interne tilstand. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. + + + vkSyncValidationCheckBox + Aktiver Vulkan-synkroniseringsvalidering:\nAktiverer et system, der validerer tidspunktet for Vulkan's renderingsopgaver. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. + + + rdocCheckBox + Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + diff --git a/src/qt_gui/translations/de.ts b/src/qt_gui/translations/de.ts deleted file mode 100644 index 65cdd5f4a..000000000 --- a/src/qt_gui/translations/de.ts +++ /dev/null @@ -1,1499 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - Über shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. - - - This software should not be used to play games you have not legally obtained. - Diese Software soll nicht dazu benutzt werden illegal kopierte Spiele zu spielen. - - - - ElfViewer - - Open Folder - Ordner öffnen - - - - GameInfoClass - - Loading game list, please wait :3 - Lade Spielliste, bitte warten :3 - - - Cancel - Abbrechen - - - Loading... - Lade... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Wähle Ordner - - - Select which directory you want to install to. - Wählen Sie das Verzeichnis aus, in das Sie installieren möchten. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Wähle Ordner - - - Directory to install games - Installationsverzeichnis für Spiele - - - Browse - Durchsuchen - - - Error - Fehler - - - The value for location to install games is not valid. - Der ausgewählte Ordner ist nicht gültig. - - - - GuiContextMenus - - Create Shortcut - Verknüpfung erstellen - - - Cheats / Patches - Cheats / Patches - - - SFO Viewer - SFO anzeigen - - - Trophy Viewer - Trophäen anzeigen - - - Open Folder... - Ordner öffnen... - - - Open Game Folder - Spielordner öffnen - - - Open Update Folder - Öffne Update-Ordner - - - Open Save Data Folder - Speicherordner öffnen - - - Open Log Folder - Protokollordner öffnen - - - Copy info... - Infos kopieren... - - - Copy Name - Namen kopieren - - - Copy Serial - Seriennummer kopieren - - - Copy Version - Version kopieren - - - Copy Size - Größe kopieren - - - Copy All - Alles kopieren - - - Delete... - Löschen... - - - Delete Game - Lösche Spiel - - - Delete Update - Lösche Aktualisierung - - - Delete Save Data - Lösche Speicherdaten - - - Delete DLC - Lösche DLC - - - Compatibility... - Kompatibilität... - - - Update database - Aktualisiere Datenbank - - - View report - Bericht ansehen - - - Submit a report - Einen Bericht einreichen - - - Shortcut creation - Verknüpfungserstellung - - - Shortcut created successfully! - Verknüpfung erfolgreich erstellt! - - - Error - Fehler - - - Error creating shortcut! - Fehler beim Erstellen der Verknüpfung! - - - Install PKG - PKG installieren - - - Game - Spiel - - - requiresEnableSeparateUpdateFolder_MSG - Damit diese Funktion funktioniert, ist die Konfigurationsoption „Separaten Update-Ordner aktivieren“ erforderlich. Wenn Sie diese Funktion nutzen möchten, aktivieren Sie sie bitte. - - - This game has no update to delete! - Dieses Spiel hat keine Aktualisierung zum löschen! - - - Update - Aktualisieren - - - This game has no DLC to delete! - Dieses Spiel hat kein DLC zum aktualisieren! - - - DLC - DLC - - - Delete %1 - Lösche %1 - - - Are you sure you want to delete %1's %2 directory? - Sind Sie sicher dass Sie %1 %2 Ordner löschen wollen? - - - - MainWindow - - Open/Add Elf Folder - Elf-Ordner öffnen/hinzufügen - - - Install Packages (PKG) - Pakete installieren (PKG) - - - Boot Game - Spiel starten - - - Check for Updates - Nach Updates suchen - - - About shadPS4 - Über shadPS4 - - - Configure... - Konfigurieren... - - - Install application from a .pkg file - Installiere Anwendung aus .pkg-Datei - - - Recent Games - Zuletzt gespielt - - - Open shadPS4 Folder - Öffne shadPS4 Ordner - - - Exit - Beenden - - - Exit shadPS4 - shadPS4 beenden - - - Exit the application. - Die Anwendung beenden. - - - Show Game List - Spielliste anzeigen - - - Game List Refresh - Spielliste aktualisieren - - - Tiny - Winzig - - - Small - Klein - - - Medium - Mittel - - - Large - Groß - - - List View - Listenansicht - - - Grid View - Gitteransicht - - - Elf Viewer - Elf-Ansicht - - - Game Install Directory - Installationsverzeichnis für Spiele - - - Download Cheats/Patches - Cheats/Patches herunterladen - - - Dump Game List - Spielliste ausgeben - - - PKG Viewer - PKG-Anschauer - - - Search... - Suchen... - - - File - Datei - - - View - Ansicht - - - Game List Icons - Spiellisten-Symbole - - - Game List Mode - Spiellisten-Modus - - - Settings - Einstellungen - - - Utils - Werkzeuge - - - Themes - Stile - - - Help - Hilfe - - - Dark - Dunkel - - - Light - Hell - - - Green - Grün - - - Blue - Blau - - - Violet - Violett - - - toolBar - Werkzeugleiste - - - Game List - Spieleliste - - - * Unsupported Vulkan Version - * Nicht unterstützte Vulkan-Version - - - Download Cheats For All Installed Games - Cheats für alle installierten Spiele herunterladen - - - Download Patches For All Games - Patches für alle Spiele herunterladen - - - Download Complete - Download abgeschlossen - - - You have downloaded cheats for all the games you have installed. - Sie haben Cheats für alle installierten Spiele heruntergeladen. - - - Patches Downloaded Successfully! - Patches erfolgreich heruntergeladen! - - - All Patches available for all games have been downloaded. - Alle Patches für alle Spiele wurden heruntergeladen. - - - Games: - Spiele: - - - PKG File (*.PKG) - PKG-Datei (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF-Dateien (*.bin *.elf *.oelf) - - - Game Boot - Spiel-Start - - - Only one file can be selected! - Es kann nur eine Datei ausgewählt werden! - - - PKG Extraction - PKG-Extraktion - - - Patch detected! - Patch erkannt! - - - PKG and Game versions match: - PKG- und Spielversionen stimmen überein: - - - Would you like to overwrite? - Willst du überschreiben? - - - PKG Version %1 is older than installed version: - PKG-Version %1 ist älter als die installierte Version: - - - Game is installed: - Spiel ist installiert: - - - Would you like to install Patch: - Willst du den Patch installieren: - - - DLC Installation - DLC-Installation - - - Would you like to install DLC: %1? - Willst du das DLC installieren: %1? - - - DLC already installed: - DLC bereits installiert: - - - Game already installed - Spiel bereits installiert - - - PKG is a patch, please install the game first! - PKG ist ein Patch, bitte installieren Sie zuerst das Spiel! - - - PKG ERROR - PKG-FEHLER - - - Extracting PKG %1/%2 - Extrahiere PKG %1/%2 - - - Extraction Finished - Extraktion abgeschlossen - - - Game successfully installed at %1 - Spiel erfolgreich installiert auf %1 - - - File doesn't appear to be a valid PKG file - Die Datei scheint keine gültige PKG-Datei zu sein - - - - PKGViewer - - Open Folder - Ordner öffnen - - - - TrophyViewer - - Trophy Viewer - Trophäenansicht - - - - SettingsDialog - - Save Data Path - Speicherdaten-Pfad - - - Settings - Einstellungen - - - General - Allgemein - - - System - System - - - Console Language - Konsolensprache - - - Emulator Language - Emulatorsprache - - - Emulator - Emulator - - - Enable Fullscreen - Vollbild aktivieren - - - Fullscreen Mode - Vollbildmodus - - - Enable Separate Update Folder - Separaten Update-Ordner aktivieren - - - Default tab when opening settings - Standardregisterkarte beim Öffnen der Einstellungen - - - Show Game Size In List - Zeige Spielgröße in der Liste - - - Show Splash - Startbildschirm anzeigen - - - Is PS4 Pro - Ist PS4 Pro - - - Enable Discord Rich Presence - Discord Rich Presence aktivieren - - - Username - Benutzername - - - Trophy Key - Trophäenschlüssel - - - Trophy - Trophäe - - - Logger - Logger - - - Log Type - Logtyp - - - Log Filter - Log-Filter - - - Open Log Location - Protokollspeicherort öffnen - - - Input - Eingabe - - - Enable Motion Controls - Aktiviere Bewegungssteuerung - - - Cursor - Cursor - - - Hide Cursor - Cursor ausblenden - - - Hide Cursor Idle Timeout - Inaktivitätszeitüberschreitung zum Ausblenden des Cursors - - - s - s - - - Controller - Controller - - - Back Button Behavior - Verhalten der Zurück-Taste - - - Graphics - Grafik - - - GUI - Benutzeroberfläche - - - User - Benutzer - - - Graphics Device - Grafikgerät - - - Width - Breite - - - Height - Höhe - - - Vblank Divider - Vblank-Teiler - - - Advanced - Erweitert - - - Enable Shaders Dumping - Shader-Dumping aktivieren - - - Enable NULL GPU - NULL GPU aktivieren - - - Paths - Pfad - - - Game Folders - Spieleordner - - - Add... - Hinzufügen... - - - Remove - Entfernen - - - Debug - Debug - - - Enable Debug Dumping - Debug-Dumping aktivieren - - - Enable Vulkan Validation Layers - Vulkan Validations-Ebenen aktivieren - - - Enable Vulkan Synchronization Validation - Vulkan Synchronisations-Validierung aktivieren - - - Enable RenderDoc Debugging - RenderDoc-Debugging aktivieren - - - Enable Crash Diagnostics - Absturz-Diagnostik aktivieren - - - Collect Shaders - Sammle Shader - - - Copy GPU Buffers - Kopiere GPU Puffer - - - Host Debug Markers - Host-Debug-Markierer - - - Guest Debug Markers - Guest-Debug-Markierer - - - Update - Aktualisieren - - - Check for Updates at Startup - Beim Start nach Updates suchen - - - Always Show Changelog - Changelog immer anzeigen - - - Update Channel - Update-Kanal - - - Check for Updates - Nach Updates suchen - - - GUI Settings - GUI-Einstellungen - - - Title Music - Titelmusik - - - Disable Trophy Pop-ups - Deaktiviere Trophäen Pop-ups - - - Play title music - Titelmusik abspielen - - - Update Compatibility Database On Startup - Aktualisiere Kompatibilitätsdatenbank beim Start - - - Game Compatibility - Spielkompatibilität - - - Display Compatibility Data - Zeige Kompatibilitätsdaten - - - Update Compatibility Database - Aktualisiere Kompatibilitätsdatenbank - - - Volume - Lautstärke - - - Audio Backend - Audio Backend - - - Save - Speichern - - - Apply - Übernehmen - - - Restore Defaults - Werkseinstellungen wiederherstellen - - - Close - Schließen - - - Point your mouse at an option to display its description. - Bewege die Maus über eine Option, um deren Beschreibung anzuzeigen. - - - consoleLanguageGroupBox - Konsolensprache:\nLegt die Sprache fest, die das PS4-Spiel verwendet.\nEs wird empfohlen, diese auf eine vom Spiel unterstützte Sprache einzustellen, die je nach Region unterschiedlich sein kann. - - - emulatorLanguageGroupBox - Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. - - - fullscreenCheckBox - Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. - - - separateUpdatesCheckBox - Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung. - - - showSplashCheckBox - Startbildschirm anzeigen:\nZeigt beim Start einen speziellen Bildschirm (Splash) des Spiels an. - - - ps4proCheckBox - Ist es eine PS4 Pro:\nErmöglicht es dem Emulator, als PS4 PRO zu arbeiten, was in Spielen, die dies unterstützen, spezielle Funktionen aktivieren kann. - - - discordRPCCheckbox - Discord Rich Presence aktivieren:\nZeigt das Emulator-Icon und relevante Informationen in deinem Discord-Profil an. - - - userName - Benutzername:\nLegt den Namen des PS4-Kontos fest, der in einigen Spielen angezeigt werden kann. - - - TrophyKey - Trophäenschlüssel:\nSchlüssel zum Entschlüsseln von Trophäen. Muss von Ihrer gejailbreakten Konsole abgerufen werden.\nDarf nur Hex-Zeichen enthalten. - - - logTypeGroupBox - Protokolltyp:\nLegt fest, ob die Ausgabe des Protokollfensters synchronisiert wird, um die Leistung zu verbessern. Dies kann sich negativ auf die Emulation auswirken. - - - logFilter - Protokollfilter:\nFiltert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden.\nBeispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an. - - - updaterGroupBox - Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. - - - GUIMusicGroupBox - Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. - - - disableTrophycheckBox - Trophäen-Popups deaktivieren:\nDeaktivieren Sie Trophäenbenachrichtigungen im Spiel. Der Trophäenfortschritt kann weiterhin mit dem Trophäen-Viewer verfolgt werden (klicken Sie mit der rechten Maustaste auf das Spiel im Hauptfenster).. - - - hideCursorGroupBox - Maus ausblenden:\nWählen Sie, wann der Cursor verschwinden soll:\nNie: Sie sehen die Maus immer.\nInaktiv: Legen Sie eine Zeit fest, nach der sie nach Inaktivität verschwindet.\nImmer: Sie sehen die Maus niemals. - - - idleTimeoutGroupBox - Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll. - - - backButtonBehaviorGroupBox - Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert. - - - enableCompatibilityCheckBox - Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie „Aktualisiere Kompatibilitätsdatenbank beim Start“, um aktuelle Informationen zu erhalten. - - - checkCompatibilityOnStartupCheckBox - Kompatibilität beim Start aktualisieren:\nAktualisiert die Kompatibilitätsdatenbank automatisch, wenn shadPS4 startet. - - - updateCompatibilityButton - Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. - - - Never - Niemals - - - Idle - Im Leerlauf - - - Always - Immer - - - Touchpad Left - Touchpad Links - - - Touchpad Right - Touchpad Rechts - - - Touchpad Center - Touchpad Mitte - - - None - Keine - - - graphicsAdapterGroupBox - Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie "Auto Select", um sie automatisch auszuwählen. - - - resolutionLayout - Auflösung:\nLegt die Größe des Emulator-Fensters während der Wiedergabe fest, die während der Wiedergabe geändert werden kann.\nDies unterscheidet sich von der tatsächlichen Spielauflösung. - - - heightDivider - Framerate-Teiler:\nMultipliziert die Bildrate, mit der der Emulator aktualisiert wird, mit diesem Wert. Dies kann sich negativ auswirken, wie z.B. beschleunigtes Gameplay oder Funktionsstörungen! - - - dumpShadersCheckBox - Shader-Dumping aktivieren:\nZum technischen Debuggen speichert es die Shaders des Spiels in einem Ordner während der Wiedergabe. - - - nullGpuCheckBox - Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre. - - - gameFoldersBox - Spieleordner:\nDie Liste der Ordner, in denen nach installierten Spielen gesucht wird. - - - addFolderButton - Hinzufügen:\nFügen Sie einen Ordner zur Liste hinzu. - - - removeFolderButton - Entfernen:\nEntfernen Sie einen Ordner aus der Liste. - - - debugDump - Debug-Dump aktivieren:\nSpeichert Import-/Exportsymbole und Headerinformationen des aktuellen PS4-Programms in einem Verzeichnis. - - - vkValidationCheckBox - Vulkan-Validierungsebenen aktivieren:\nAktiviert ein System, das den Zustand des Vulkan-Treibers validiert und Informationen über dessen internen Zustand protokolliert. Dies verringert die Leistung und kann möglicherweise das Verhalten der Emulation ändern. - - - vkSyncValidationCheckBox - Vulkan-Synchronisationsvalidierung aktivieren:\nAktiviert ein System, das die Zeitplanung der Rendering-Aufgaben von Vulkan validiert. Dies wird die Leistung verringern und kann möglicherweise das Verhalten der Emulation ändern. - - - rdocCheckBox - RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. - - - collectShaderCheckBox - Shader sammeln:\nSie müssen diese Option aktivieren, um Shader mit dem Debug-Menü (Strg + F10) bearbeiten zu können. - - - crashDiagnosticsCheckBox - Absturzdiagnose:\nErstellt eine .yaml-Datei mit Informationen über den Vulkan-Status zum Zeitpunkt des Absturzes.\nNützlich zum Debuggen von „Gerät verloren“-Fehlern. Wenn Sie dies aktiviert haben, sollten Sie Host- UND Gast-Debug-Markierungen aktivieren.\nFunktioniert nicht auf Intel-GPUs.\nDamit dies funktioniert, müssen Vulkan Validationsschichten aktiviert und das Vulkan SDK installiert sein. - - - copyGPUBuffersCheckBox - GPU-Puffer kopieren:\nUmgeht Race-Bedingungen mit GPU-Übermittlungen.\nKann bei PM4-Abstürzen vom Typ 0 hilfreich sein oder auch nicht. - - - hostMarkersCheckBox - Host-Debug-Marker:\nFügt emulatorseitige Informationen wie Marker für bestimmte AMDGPU-Befehle rund um Vulkan-Befehle ein und gibt Ressourcen-Debug-Namen an.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. - - - guestMarkersCheckBox - Gast-Debug-Markierer:\nFügt alle Debug-Markierer, die das Spiel selbst hinzugefügt hat, in den Befehlspuffer ein.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches für - - - defaultTextEdit_MSG - Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Kein Bild verfügbar - - - Serial: - Seriennummer: - - - Version: - Version: - - - Size: - Größe: - - - Select Cheat File: - Cheat-Datei auswählen: - - - Repository: - Repository: - - - Download Cheats - Cheats herunterladen - - - Delete File - Datei löschen - - - No files selected. - Keine Dateien ausgewählt. - - - You can delete the cheats you don't want after downloading them. - Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. - - - Do you want to delete the selected file?\n%1 - Willst du die ausgewählte Datei löschen?\n%1 - - - Select Patch File: - Patch-Datei auswählen: - - - Download Patches - Patches herunterladen - - - Save - Speichern - - - Cheats - Cheats - - - Patches - Patches - - - Error - Fehler - - - No patch selected. - Kein Patch ausgewählt. - - - Unable to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. - - - No patch file found for the current serial. - Keine Patch-Datei für die aktuelle Seriennummer gefunden. - - - Unable to open the file for reading. - Kann die Datei nicht zum Lesen öffnen. - - - Unable to open the file for writing. - Kann die Datei nicht zum Schreiben öffnen. - - - Failed to parse XML: - Fehler beim Parsen von XML: - - - Success - Erfolg - - - Options saved successfully. - Optionen erfolgreich gespeichert. - - - Invalid Source - Ungültige Quelle - - - The selected source is invalid. - Die ausgewählte Quelle ist ungültig. - - - File Exists - Datei existiert - - - File already exists. Do you want to replace it? - Datei existiert bereits. Möchtest du sie ersetzen? - - - Failed to save file: - Fehler beim Speichern der Datei: - - - Failed to download file: - Fehler beim Herunterladen der Datei: - - - Cheats Not Found - Cheats nicht gefunden - - - CheatsNotFound_MSG - Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. - - - Cheats Downloaded Successfully - Cheats erfolgreich heruntergeladen - - - CheatsDownloadedSuccessfully_MSG - Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. - - - Failed to save: - Speichern fehlgeschlagen: - - - Failed to download: - Herunterladen fehlgeschlagen: - - - Download Complete - Download abgeschlossen - - - DownloadComplete_MSG - Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. - - - Failed to parse JSON data from HTML. - Fehler beim Parsen der JSON-Daten aus HTML. - - - Failed to retrieve HTML page. - Fehler beim Abrufen der HTML-Seite. - - - The game is in version: %1 - Das Spiel ist in der Version: %1 - - - The downloaded patch only works on version: %1 - Der heruntergeladene Patch funktioniert nur in der Version: %1 - - - You may need to update your game. - Sie müssen möglicherweise Ihr Spiel aktualisieren. - - - Incompatibility Notice - Inkompatibilitätsbenachrichtigung - - - Failed to open file: - Öffnung der Datei fehlgeschlagen: - - - XML ERROR: - XML-Fehler: - - - Failed to open files.json for writing - Kann files.json nicht zum Schreiben öffnen - - - Author: - Autor: - - - Directory does not exist: - Verzeichnis existiert nicht: - - - Failed to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. - - - Name: - Name: - - - Can't apply cheats before the game is started - Kann keine Cheats anwenden, bevor das Spiel gestartet ist. - - - - GameListFrame - - Icon - Symbol - - - Name - Name - - - Serial - Seriennummer - - - Compatibility - Kompatibilität - - - Region - Region - - - Firmware - Firmware - - - Size - Größe - - - Version - Version - - - Path - Pfad - - - Play Time - Spielzeit - - - Never Played - Niemals gespielt - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Kompatibilität wurde noch nicht getested - - - Game does not initialize properly / crashes the emulator - Das Spiel wird nicht richtig initialisiert / stürzt den Emulator ab - - - Game boots, but only displays a blank screen - Spiel startet, aber zeigt nur einen blanken Bildschirm - - - Game displays an image but does not go past the menu - Spiel zeigt ein Bild aber geht nicht über das Menü hinaus - - - Game has game-breaking glitches or unplayable performance - Spiel hat spiel-brechende Störungen oder unspielbare Leistung - - - Game can be completed with playable performance and no major glitches - Spiel kann mit spielbarer Leistung und keinen großen Störungen abgeschlossen werden - - - Click to see details on github - Klicken Sie hier, um Details auf GitHub zu sehen - - - Last updated - Zuletzt aktualisiert - - - - CheckUpdate - - Auto Updater - Automatischer Aktualisierer - - - Error - Fehler - - - Network error: - Netzwerkfehler: - - - Error_Github_limit_MSG - Der Auto-Updater erlaubt bis zu 60 Update-Überprüfungen pro Stunde.\nDu hast dieses Limit erreicht. Bitte versuche es später erneut. - - - Failed to parse update information. - Fehler beim Parsen der Aktualisierungsinformationen. - - - No pre-releases found. - Keine Vorabveröffentlichungen gefunden. - - - Invalid release data. - Ungültige Versionsdaten. - - - No download URL found for the specified asset. - Keine Download-URL für das angegebene Asset gefunden. - - - Your version is already up to date! - Ihre Version ist bereits aktuell! - - - Update Available - Aktualisierung verfügbar - - - Update Channel - Update-Kanal - - - Current Version - Aktuelle Version - - - Latest Version - Neueste Version - - - Do you want to update? - Möchten Sie aktualisieren? - - - Show Changelog - Änderungsprotokoll anzeigen - - - Check for Updates at Startup - Beim Start nach Updates suchen - - - Update - Aktualisieren - - - No - Nein - - - Hide Changelog - Änderungsprotokoll ausblenden - - - Changes - Änderungen - - - Network error occurred while trying to access the URL - Beim Zugriff auf die URL ist ein Netzwerkfehler aufgetreten - - - Download Complete - Download abgeschlossen - - - The update has been downloaded, press OK to install. - Die Aktualisierung wurde heruntergeladen, drücken Sie OK, um zu installieren. - - - Failed to save the update file at - Fehler beim Speichern der Aktualisierungsdatei in - - - Starting Update... - Aktualisierung wird gestartet... - - - Failed to create the update script file - Fehler beim Erstellen der Aktualisierungs-Skriptdatei - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Lade Kompatibilitätsdaten, bitte warten - - - Cancel - Abbrechen - - - Loading... - Lädt... - - - Error - Fehler - - - Unable to update compatibility data! Try again later. - Kompatibilitätsdaten konnten nicht aktualisiert werden! Versuchen Sie es später erneut. - - - Unable to open compatibility_data.json for writing. - Kann compatibility_data.json nicht zum Schreiben öffnen. - - - Unknown - Unbekannt - - - Nothing - Nichts - - - Boots - Startet - - - Menus - Menüs - - - Ingame - ImSpiel - - - Playable - Spielbar - - - diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts new file mode 100644 index 000000000..4a9ab1a8d --- /dev/null +++ b/src/qt_gui/translations/de_DE.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + Über shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. + + + This software should not be used to play games you have not legally obtained. + Diese Software soll nicht dazu benutzt werden illegal kopierte Spiele zu spielen. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches für + + + defaultTextEdit_MSG + Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Kein Bild verfügbar + + + Serial: + Seriennummer: + + + Version: + Version: + + + Size: + Größe: + + + Select Cheat File: + Cheat-Datei auswählen: + + + Repository: + Repository: + + + Download Cheats + Cheats herunterladen + + + Delete File + Datei löschen + + + No files selected. + Keine Dateien ausgewählt. + + + You can delete the cheats you don't want after downloading them. + Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. + + + Do you want to delete the selected file?\n%1 + Willst du die ausgewählte Datei löschen?\n%1 + + + Select Patch File: + Patch-Datei auswählen: + + + Download Patches + Patches herunterladen + + + Save + Speichern + + + Cheats + Cheats + + + Patches + Patches + + + Error + Fehler + + + No patch selected. + Kein Patch ausgewählt. + + + Unable to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. + + + No patch file found for the current serial. + Keine Patch-Datei für die aktuelle Seriennummer gefunden. + + + Unable to open the file for reading. + Kann die Datei nicht zum Lesen öffnen. + + + Unable to open the file for writing. + Kann die Datei nicht zum Schreiben öffnen. + + + Failed to parse XML: + Fehler beim Parsen von XML: + + + Success + Erfolg + + + Options saved successfully. + Optionen erfolgreich gespeichert. + + + Invalid Source + Ungültige Quelle + + + The selected source is invalid. + Die ausgewählte Quelle ist ungültig. + + + File Exists + Datei existiert + + + File already exists. Do you want to replace it? + Datei existiert bereits. Möchtest du sie ersetzen? + + + Failed to save file: + Fehler beim Speichern der Datei: + + + Failed to download file: + Fehler beim Herunterladen der Datei: + + + Cheats Not Found + Cheats nicht gefunden + + + CheatsNotFound_MSG + Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. + + + Cheats Downloaded Successfully + Cheats erfolgreich heruntergeladen + + + CheatsDownloadedSuccessfully_MSG + Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. + + + Failed to save: + Speichern fehlgeschlagen: + + + Failed to download: + Herunterladen fehlgeschlagen: + + + Download Complete + Download abgeschlossen + + + DownloadComplete_MSG + Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. + + + Failed to parse JSON data from HTML. + Fehler beim Parsen der JSON-Daten aus HTML. + + + Failed to retrieve HTML page. + Fehler beim Abrufen der HTML-Seite. + + + The game is in version: %1 + Das Spiel ist in der Version: %1 + + + The downloaded patch only works on version: %1 + Der heruntergeladene Patch funktioniert nur in der Version: %1 + + + You may need to update your game. + Sie müssen möglicherweise Ihr Spiel aktualisieren. + + + Incompatibility Notice + Inkompatibilitätsbenachrichtigung + + + Failed to open file: + Öffnung der Datei fehlgeschlagen: + + + XML ERROR: + XML-Fehler: + + + Failed to open files.json for writing + Kann files.json nicht zum Schreiben öffnen + + + Author: + Autor: + + + Directory does not exist: + Verzeichnis existiert nicht: + + + Failed to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. + + + Name: + Name: + + + Can't apply cheats before the game is started + Kann keine Cheats anwenden, bevor das Spiel gestartet ist. + + + Close + Schließen + + + + CheckUpdate + + Auto Updater + Automatischer Aktualisierer + + + Error + Fehler + + + Network error: + Netzwerkfehler: + + + Error_Github_limit_MSG + Der Auto-Updater erlaubt bis zu 60 Update-Überprüfungen pro Stunde.\nDu hast dieses Limit erreicht. Bitte versuche es später erneut. + + + Failed to parse update information. + Fehler beim Parsen der Aktualisierungsinformationen. + + + No pre-releases found. + Keine Vorabveröffentlichungen gefunden. + + + Invalid release data. + Ungültige Versionsdaten. + + + No download URL found for the specified asset. + Keine Download-URL für das angegebene Asset gefunden. + + + Your version is already up to date! + Ihre Version ist bereits aktuell! + + + Update Available + Aktualisierung verfügbar + + + Update Channel + Update-Kanal + + + Current Version + Aktuelle Version + + + Latest Version + Neueste Version + + + Do you want to update? + Möchten Sie aktualisieren? + + + Show Changelog + Änderungsprotokoll anzeigen + + + Check for Updates at Startup + Beim Start nach Updates suchen + + + Update + Aktualisieren + + + No + Nein + + + Hide Changelog + Änderungsprotokoll ausblenden + + + Changes + Änderungen + + + Network error occurred while trying to access the URL + Beim Zugriff auf die URL ist ein Netzwerkfehler aufgetreten + + + Download Complete + Download abgeschlossen + + + The update has been downloaded, press OK to install. + Die Aktualisierung wurde heruntergeladen, drücken Sie OK, um zu installieren. + + + Failed to save the update file at + Fehler beim Speichern der Aktualisierungsdatei in + + + Starting Update... + Aktualisierung wird gestartet... + + + Failed to create the update script file + Fehler beim Erstellen der Aktualisierungs-Skriptdatei + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Lade Kompatibilitätsdaten, bitte warten + + + Cancel + Abbrechen + + + Loading... + Lädt... + + + Error + Fehler + + + Unable to update compatibility data! Try again later. + Kompatibilitätsdaten konnten nicht aktualisiert werden! Versuchen Sie es später erneut. + + + Unable to open compatibility_data.json for writing. + Kann compatibility_data.json nicht zum Schreiben öffnen. + + + Unknown + Unbekannt + + + Nothing + Nichts + + + Boots + Startet + + + Menus + Menüs + + + Ingame + ImSpiel + + + Playable + Spielbar + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Ordner öffnen + + + + GameInfoClass + + Loading game list, please wait :3 + Lade Spielliste, bitte warten :3 + + + Cancel + Abbrechen + + + Loading... + Lade... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Wähle Ordner + + + Directory to install games + Installationsverzeichnis für Spiele + + + Browse + Durchsuchen + + + Error + Fehler + + + Directory to install DLC + + + + + GameListFrame + + Icon + Symbol + + + Name + Name + + + Serial + Seriennummer + + + Compatibility + Kompatibilität + + + Region + Region + + + Firmware + Firmware + + + Size + Größe + + + Version + Version + + + Path + Pfad + + + Play Time + Spielzeit + + + Never Played + Niemals gespielt + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Kompatibilität wurde noch nicht getested + + + Game does not initialize properly / crashes the emulator + Das Spiel wird nicht richtig initialisiert / stürzt den Emulator ab + + + Game boots, but only displays a blank screen + Spiel startet, aber zeigt nur einen blanken Bildschirm + + + Game displays an image but does not go past the menu + Spiel zeigt ein Bild aber geht nicht über das Menü hinaus + + + Game has game-breaking glitches or unplayable performance + Spiel hat spiel-brechende Störungen oder unspielbare Leistung + + + Game can be completed with playable performance and no major glitches + Spiel kann mit spielbarer Leistung und keinen großen Störungen abgeschlossen werden + + + Click to see details on github + Klicken Sie hier, um Details auf GitHub zu sehen + + + Last updated + Zuletzt aktualisiert + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Verknüpfung erstellen + + + Cheats / Patches + Cheats / Patches + + + SFO Viewer + SFO anzeigen + + + Trophy Viewer + Trophäen anzeigen + + + Open Folder... + Ordner öffnen... + + + Open Game Folder + Spielordner öffnen + + + Open Update Folder + Öffne Update-Ordner + + + Open Save Data Folder + Speicherordner öffnen + + + Open Log Folder + Protokollordner öffnen + + + Copy info... + Infos kopieren... + + + Copy Name + Namen kopieren + + + Copy Serial + Seriennummer kopieren + + + Copy Version + Version kopieren + + + Copy Size + Größe kopieren + + + Copy All + Alles kopieren + + + Delete... + Löschen... + + + Delete Game + Lösche Spiel + + + Delete Update + Lösche Aktualisierung + + + Delete Save Data + Lösche Speicherdaten + + + Delete DLC + Lösche DLC + + + Compatibility... + Kompatibilität... + + + Update database + Aktualisiere Datenbank + + + View report + Bericht ansehen + + + Submit a report + Einen Bericht einreichen + + + Shortcut creation + Verknüpfungserstellung + + + Shortcut created successfully! + Verknüpfung erfolgreich erstellt! + + + Error + Fehler + + + Error creating shortcut! + Fehler beim Erstellen der Verknüpfung! + + + Install PKG + PKG installieren + + + Game + Spiel + + + This game has no update to delete! + Dieses Spiel hat keine Aktualisierung zum löschen! + + + Update + Aktualisieren + + + This game has no DLC to delete! + Dieses Spiel hat kein DLC zum aktualisieren! + + + DLC + DLC + + + Delete %1 + Lösche %1 + + + Are you sure you want to delete %1's %2 directory? + Sind Sie sicher dass Sie %1 %2 Ordner löschen wollen? + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Wähle Ordner + + + Select which directory you want to install to. + Wählen Sie das Verzeichnis aus, in das Sie installieren möchten. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Elf-Ordner öffnen/hinzufügen + + + Install Packages (PKG) + Pakete installieren (PKG) + + + Boot Game + Spiel starten + + + Check for Updates + Nach Updates suchen + + + About shadPS4 + Über shadPS4 + + + Configure... + Konfigurieren... + + + Install application from a .pkg file + Installiere Anwendung aus .pkg-Datei + + + Recent Games + Zuletzt gespielt + + + Open shadPS4 Folder + Öffne shadPS4 Ordner + + + Exit + Beenden + + + Exit shadPS4 + shadPS4 beenden + + + Exit the application. + Die Anwendung beenden. + + + Show Game List + Spielliste anzeigen + + + Game List Refresh + Spielliste aktualisieren + + + Tiny + Winzig + + + Small + Klein + + + Medium + Mittel + + + Large + Groß + + + List View + Listenansicht + + + Grid View + Gitteransicht + + + Elf Viewer + Elf-Ansicht + + + Game Install Directory + Installationsverzeichnis für Spiele + + + Download Cheats/Patches + Cheats/Patches herunterladen + + + Dump Game List + Spielliste ausgeben + + + PKG Viewer + PKG-Anschauer + + + Search... + Suchen... + + + File + Datei + + + View + Ansicht + + + Game List Icons + Spiellisten-Symbole + + + Game List Mode + Spiellisten-Modus + + + Settings + Einstellungen + + + Utils + Werkzeuge + + + Themes + Stile + + + Help + Hilfe + + + Dark + Dunkel + + + Light + Hell + + + Green + Grün + + + Blue + Blau + + + Violet + Violett + + + toolBar + Werkzeugleiste + + + Game List + Spieleliste + + + * Unsupported Vulkan Version + * Nicht unterstützte Vulkan-Version + + + Download Cheats For All Installed Games + Cheats für alle installierten Spiele herunterladen + + + Download Patches For All Games + Patches für alle Spiele herunterladen + + + Download Complete + Download abgeschlossen + + + You have downloaded cheats for all the games you have installed. + Sie haben Cheats für alle installierten Spiele heruntergeladen. + + + Patches Downloaded Successfully! + Patches erfolgreich heruntergeladen! + + + All Patches available for all games have been downloaded. + Alle Patches für alle Spiele wurden heruntergeladen. + + + Games: + Spiele: + + + ELF files (*.bin *.elf *.oelf) + ELF-Dateien (*.bin *.elf *.oelf) + + + Game Boot + Spiel-Start + + + Only one file can be selected! + Es kann nur eine Datei ausgewählt werden! + + + PKG Extraction + PKG-Extraktion + + + Patch detected! + Patch erkannt! + + + PKG and Game versions match: + PKG- und Spielversionen stimmen überein: + + + Would you like to overwrite? + Willst du überschreiben? + + + PKG Version %1 is older than installed version: + PKG-Version %1 ist älter als die installierte Version: + + + Game is installed: + Spiel ist installiert: + + + Would you like to install Patch: + Willst du den Patch installieren: + + + DLC Installation + DLC-Installation + + + Would you like to install DLC: %1? + Willst du das DLC installieren: %1? + + + DLC already installed: + DLC bereits installiert: + + + Game already installed + Spiel bereits installiert + + + PKG ERROR + PKG-FEHLER + + + Extracting PKG %1/%2 + Extrahiere PKG %1/%2 + + + Extraction Finished + Extraktion abgeschlossen + + + Game successfully installed at %1 + Spiel erfolgreich installiert auf %1 + + + File doesn't appear to be a valid PKG file + Die Datei scheint keine gültige PKG-Datei zu sein + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Ordner öffnen + + + Name + Name + + + Serial + Seriennummer + + + Installed + + + + Size + Größe + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Region + + + Flags + + + + Path + Pfad + + + File + Datei + + + PKG ERROR + PKG-FEHLER + + + Unknown + Unbekannt + + + Package + + + + + SettingsDialog + + Save Data Path + Speicherdaten-Pfad + + + Settings + Einstellungen + + + General + Allgemein + + + System + System + + + Console Language + Konsolensprache + + + Emulator Language + Emulatorsprache + + + Emulator + Emulator + + + Enable Fullscreen + Vollbild aktivieren + + + Fullscreen Mode + Vollbildmodus + + + Enable Separate Update Folder + Separaten Update-Ordner aktivieren + + + Default tab when opening settings + Standardregisterkarte beim Öffnen der Einstellungen + + + Show Game Size In List + Zeige Spielgröße in der Liste + + + Show Splash + Startbildschirm anzeigen + + + Enable Discord Rich Presence + Discord Rich Presence aktivieren + + + Username + Benutzername + + + Trophy Key + Trophäenschlüssel + + + Trophy + Trophäe + + + Logger + Logger + + + Log Type + Logtyp + + + Log Filter + Log-Filter + + + Open Log Location + Protokollspeicherort öffnen + + + Input + Eingabe + + + Enable Motion Controls + Aktiviere Bewegungssteuerung + + + Cursor + Cursor + + + Hide Cursor + Cursor ausblenden + + + Hide Cursor Idle Timeout + Inaktivitätszeitüberschreitung zum Ausblenden des Cursors + + + s + s + + + Controller + Controller + + + Back Button Behavior + Verhalten der Zurück-Taste + + + Graphics + Grafik + + + GUI + Benutzeroberfläche + + + User + Benutzer + + + Graphics Device + Grafikgerät + + + Width + Breite + + + Height + Höhe + + + Vblank Divider + Vblank-Teiler + + + Advanced + Erweitert + + + Enable Shaders Dumping + Shader-Dumping aktivieren + + + Enable NULL GPU + NULL GPU aktivieren + + + Paths + Pfad + + + Game Folders + Spieleordner + + + Add... + Hinzufügen... + + + Remove + Entfernen + + + Debug + Debug + + + Enable Debug Dumping + Debug-Dumping aktivieren + + + Enable Vulkan Validation Layers + Vulkan Validations-Ebenen aktivieren + + + Enable Vulkan Synchronization Validation + Vulkan Synchronisations-Validierung aktivieren + + + Enable RenderDoc Debugging + RenderDoc-Debugging aktivieren + + + Enable Crash Diagnostics + Absturz-Diagnostik aktivieren + + + Collect Shaders + Sammle Shader + + + Copy GPU Buffers + Kopiere GPU Puffer + + + Host Debug Markers + Host-Debug-Markierer + + + Guest Debug Markers + Guest-Debug-Markierer + + + Update + Aktualisieren + + + Check for Updates at Startup + Beim Start nach Updates suchen + + + Always Show Changelog + Changelog immer anzeigen + + + Update Channel + Update-Kanal + + + Check for Updates + Nach Updates suchen + + + GUI Settings + GUI-Einstellungen + + + Title Music + Titelmusik + + + Disable Trophy Pop-ups + Deaktiviere Trophäen Pop-ups + + + Play title music + Titelmusik abspielen + + + Update Compatibility Database On Startup + Aktualisiere Kompatibilitätsdatenbank beim Start + + + Game Compatibility + Spielkompatibilität + + + Display Compatibility Data + Zeige Kompatibilitätsdaten + + + Update Compatibility Database + Aktualisiere Kompatibilitätsdatenbank + + + Volume + Lautstärke + + + Save + Speichern + + + Apply + Übernehmen + + + Restore Defaults + Werkseinstellungen wiederherstellen + + + Close + Schließen + + + Point your mouse at an option to display its description. + Bewege die Maus über eine Option, um deren Beschreibung anzuzeigen. + + + consoleLanguageGroupBox + Konsolensprache:\nLegt die Sprache fest, die das PS4-Spiel verwendet.\nEs wird empfohlen, diese auf eine vom Spiel unterstützte Sprache einzustellen, die je nach Region unterschiedlich sein kann. + + + emulatorLanguageGroupBox + Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. + + + fullscreenCheckBox + Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. + + + separateUpdatesCheckBox + Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung. + + + showSplashCheckBox + Startbildschirm anzeigen:\nZeigt beim Start einen speziellen Bildschirm (Splash) des Spiels an. + + + discordRPCCheckbox + Discord Rich Presence aktivieren:\nZeigt das Emulator-Icon und relevante Informationen in deinem Discord-Profil an. + + + userName + Benutzername:\nLegt den Namen des PS4-Kontos fest, der in einigen Spielen angezeigt werden kann. + + + TrophyKey + Trophäenschlüssel:\nSchlüssel zum Entschlüsseln von Trophäen. Muss von Ihrer gejailbreakten Konsole abgerufen werden.\nDarf nur Hex-Zeichen enthalten. + + + logTypeGroupBox + Protokolltyp:\nLegt fest, ob die Ausgabe des Protokollfensters synchronisiert wird, um die Leistung zu verbessern. Dies kann sich negativ auf die Emulation auswirken. + + + logFilter + Protokollfilter:\nFiltert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden.\nBeispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an. + + + updaterGroupBox + Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. + + + GUIMusicGroupBox + Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. + + + disableTrophycheckBox + Trophäen-Popups deaktivieren:\nDeaktivieren Sie Trophäenbenachrichtigungen im Spiel. Der Trophäenfortschritt kann weiterhin mit dem Trophäen-Viewer verfolgt werden (klicken Sie mit der rechten Maustaste auf das Spiel im Hauptfenster).. + + + hideCursorGroupBox + Maus ausblenden:\nWählen Sie, wann der Cursor verschwinden soll:\nNie: Sie sehen die Maus immer.\nInaktiv: Legen Sie eine Zeit fest, nach der sie nach Inaktivität verschwindet.\nImmer: Sie sehen die Maus niemals. + + + idleTimeoutGroupBox + Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll. + + + backButtonBehaviorGroupBox + Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert. + + + enableCompatibilityCheckBox + Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie „Aktualisiere Kompatibilitätsdatenbank beim Start“, um aktuelle Informationen zu erhalten. + + + checkCompatibilityOnStartupCheckBox + Kompatibilität beim Start aktualisieren:\nAktualisiert die Kompatibilitätsdatenbank automatisch, wenn shadPS4 startet. + + + updateCompatibilityButton + Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. + + + Never + Niemals + + + Idle + Im Leerlauf + + + Always + Immer + + + Touchpad Left + Touchpad Links + + + Touchpad Right + Touchpad Rechts + + + Touchpad Center + Touchpad Mitte + + + None + Keine + + + graphicsAdapterGroupBox + Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie "Auto Select", um sie automatisch auszuwählen. + + + resolutionLayout + Auflösung:\nLegt die Größe des Emulator-Fensters während der Wiedergabe fest, die während der Wiedergabe geändert werden kann.\nDies unterscheidet sich von der tatsächlichen Spielauflösung. + + + heightDivider + Framerate-Teiler:\nMultipliziert die Bildrate, mit der der Emulator aktualisiert wird, mit diesem Wert. Dies kann sich negativ auswirken, wie z.B. beschleunigtes Gameplay oder Funktionsstörungen! + + + dumpShadersCheckBox + Shader-Dumping aktivieren:\nZum technischen Debuggen speichert es die Shaders des Spiels in einem Ordner während der Wiedergabe. + + + nullGpuCheckBox + Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre. + + + gameFoldersBox + Spieleordner:\nDie Liste der Ordner, in denen nach installierten Spielen gesucht wird. + + + addFolderButton + Hinzufügen:\nFügen Sie einen Ordner zur Liste hinzu. + + + removeFolderButton + Entfernen:\nEntfernen Sie einen Ordner aus der Liste. + + + debugDump + Debug-Dump aktivieren:\nSpeichert Import-/Exportsymbole und Headerinformationen des aktuellen PS4-Programms in einem Verzeichnis. + + + vkValidationCheckBox + Vulkan-Validierungsebenen aktivieren:\nAktiviert ein System, das den Zustand des Vulkan-Treibers validiert und Informationen über dessen internen Zustand protokolliert. Dies verringert die Leistung und kann möglicherweise das Verhalten der Emulation ändern. + + + vkSyncValidationCheckBox + Vulkan-Synchronisationsvalidierung aktivieren:\nAktiviert ein System, das die Zeitplanung der Rendering-Aufgaben von Vulkan validiert. Dies wird die Leistung verringern und kann möglicherweise das Verhalten der Emulation ändern. + + + rdocCheckBox + RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. + + + collectShaderCheckBox + Shader sammeln:\nSie müssen diese Option aktivieren, um Shader mit dem Debug-Menü (Strg + F10) bearbeiten zu können. + + + crashDiagnosticsCheckBox + Absturzdiagnose:\nErstellt eine .yaml-Datei mit Informationen über den Vulkan-Status zum Zeitpunkt des Absturzes.\nNützlich zum Debuggen von „Gerät verloren“-Fehlern. Wenn Sie dies aktiviert haben, sollten Sie Host- UND Gast-Debug-Markierungen aktivieren.\nFunktioniert nicht auf Intel-GPUs.\nDamit dies funktioniert, müssen Vulkan Validationsschichten aktiviert und das Vulkan SDK installiert sein. + + + copyGPUBuffersCheckBox + GPU-Puffer kopieren:\nUmgeht Race-Bedingungen mit GPU-Übermittlungen.\nKann bei PM4-Abstürzen vom Typ 0 hilfreich sein oder auch nicht. + + + hostMarkersCheckBox + Host-Debug-Marker:\nFügt emulatorseitige Informationen wie Marker für bestimmte AMDGPU-Befehle rund um Vulkan-Befehle ein und gibt Ressourcen-Debug-Namen an.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. + + + guestMarkersCheckBox + Gast-Debug-Markierer:\nFügt alle Debug-Markierer, die das Spiel selbst hinzugefügt hat, in den Befehlspuffer ein.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Browse + Durchsuchen + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Installationsverzeichnis für Spiele + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophäenansicht + + + diff --git a/src/qt_gui/translations/el.ts b/src/qt_gui/translations/el.ts deleted file mode 100644 index ad7bed9c1..000000000 --- a/src/qt_gui/translations/el.ts +++ /dev/null @@ -1,1475 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - Kodikí / Enimeróseis - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Άνοιγμα Φακέλου... - - - Open Game Folder - Άνοιγμα Φακέλου Παιχνιδιού - - - Open Save Data Folder - Άνοιγμα Φακέλου Αποθηκευμένων Δεδομένων - - - Open Log Folder - Άνοιγμα Φακέλου Καταγραφής - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Έλεγχος για ενημερώσεις - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Κατεβάστε Κωδικούς / Ενημερώσεις - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Βοήθεια - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Λίστα παιχνιδιών - - - * Unsupported Vulkan Version - * Μη υποστηριζόμενη έκδοση Vulkan - - - Download Cheats For All Installed Games - Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια - - - Download Patches For All Games - Λήψη Patches για όλα τα παιχνίδια - - - Download Complete - Η λήψη ολοκληρώθηκε - - - You have downloaded cheats for all the games you have installed. - Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. - - - Patches Downloaded Successfully! - Τα Patches κατέβηκαν επιτυχώς! - - - All Patches available for all games have been downloaded. - Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. - - - Games: - Παιχνίδια: - - - PKG File (*.PKG) - Αρχείο PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Αρχεία ELF (*.bin *.elf *.oelf) - - - Game Boot - Εκκίνηση παιχνιδιού - - - Only one file can be selected! - Μπορεί να επιλεγεί μόνο ένα αρχείο! - - - PKG Extraction - Εξαγωγή PKG - - - Patch detected! - Αναγνώριση ενημέρωσης! - - - PKG and Game versions match: - Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: - - - Would you like to overwrite? - Θέλετε να αντικαταστήσετε; - - - PKG Version %1 is older than installed version: - Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: - - - Game is installed: - Το παιχνίδι είναι εγκατεστημένο: - - - Would you like to install Patch: - Θέλετε να εγκαταστήσετε την ενημέρωση: - - - DLC Installation - Εγκατάσταση DLC - - - Would you like to install DLC: %1? - Θέλετε να εγκαταστήσετε το DLC: %1; - - - DLC already installed: - DLC ήδη εγκατεστημένο: - - - Game already installed - Παιχνίδι ήδη εγκατεστημένο - - - PKG is a patch, please install the game first! - Το PKG είναι patch, παρακαλώ εγκαταστήστε πρώτα το παιχνίδι! - - - PKG ERROR - ΣΦΑΛΜΑ PKG - - - Extracting PKG %1/%2 - Εξαγωγή PKG %1/%2 - - - Extraction Finished - Η εξαγωγή ολοκληρώθηκε - - - Game successfully installed at %1 - Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 - - - File doesn't appear to be a valid PKG file - Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Λειτουργία Πλήρους Οθόνης - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Προεπιλεγμένη καρτέλα κατά την ανοίγμα των ρυθμίσεων - - - Show Game Size In List - Εμφάνιση Μεγέθους Παιχνιδιού στη Λίστα - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Ενεργοποίηση Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Άνοιγμα τοποθεσίας αρχείου καταγραφής - - - Input - Είσοδος - - - Cursor - Δείκτης - - - Hide Cursor - Απόκρυψη δείκτη - - - Hide Cursor Idle Timeout - Χρόνος αδράνειας απόκρυψης δείκτη - - - s - s - - - Controller - Controller - - - Back Button Behavior - Συμπεριφορά κουμπιού επιστροφής - - - Graphics - Graphics - - - GUI - Διεπαφή - - - User - Χρήστης - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Διαδρομές - - - Game Folders - Φάκελοι παιχνιδιών - - - Add... - Προσθήκη... - - - Remove - Αφαίρεση - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Ενημέρωση - - - Check for Updates at Startup - Έλεγχος για ενημερώσεις κατά την εκκίνηση - - - Always Show Changelog - Πάντα εμφάνιση ιστορικού αλλαγών - - - Update Channel - Κανάλι Ενημέρωσης - - - Check for Updates - Έλεγχος για ενημερώσεις - - - GUI Settings - Ρυθμίσεις GUI - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Αναπαραγωγή μουσικής τίτλου - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - ένταση - - - Audio Backend - Audio Backend - - - Save - Αποθήκευση - - - Apply - Εφαρμογή - - - Restore Defaults - Επαναφορά Προεπιλογών - - - Close - Κλείσιμο - - - Point your mouse at an option to display its description. - Τοποθετήστε το ποντίκι σας πάνω σε μια επιλογή για να εμφανίσετε την περιγραφή της. - - - consoleLanguageGroupBox - Γλώσσα Κονσόλας:\nΡυθμίζει τη γλώσσα που θα χρησιμοποιήσει το παιχνίδι PS4.\nΣυνιστάται να επιλέξετε μία από τις γλώσσες που υποστηρίζονται από το παιχνίδι, η οποία ενδέχεται να διαφέρει ανάλογα με την περιοχή. - - - emulatorLanguageGroupBox - Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. - - - fullscreenCheckBox - Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Εμφάνιση Splash Screen:\nΕμφανίζει ειδική γραφική οθόνη κατά την εκκίνηση. - - - ps4proCheckBox - Είναι PS4 Pro:\nΕπιτρέπει στον εξομοιωτή να λειτουργεί σαν PS4 PRO, κάτι που μπορεί να ενεργοποιήσει συγκεκριμένες λειτουργίες σε παιχνίδια που το υποστηρίζουν. - - - discordRPCCheckbox - Ενεργοποίηση Discord Rich Presence:\nΕμφανίζει το εικονίδιο του emulator και σχετικές πληροφορίες στο προφίλ σας στο Discord. - - - userName - Όνομα Χρήστη:\nΟρίζει το όνομα του λογαριασμού PS4, το οποίο μπορεί να εμφανιστεί σε ορισμένα παιχνίδια. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Τύπος Καταγραφής:\nΚαθορίζει αν η έξοδος του παραθύρου καταγραφής θα συγχρονιστεί για αύξηση της απόδοσης. Αυτό μπορεί να επηρεάσει αρνητικά τις επιδόσεις του εξομοιωτή. - - - logFilter - Φίλτρο Καταγραφής:\nΦιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες.\nΠαραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα. - - - updaterGroupBox - Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. - - - GUIMusicGroupBox - Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Απόκρυψη Κέρσορα:\nΕπιλέξτε πότε θα εξαφανιστεί ο κέρσορας:\nΠοτέ: θα βλέπετε πάντα το ποντίκι.\nΑδρανές: ορίστε έναν χρόνο για να εξαφανιστεί μετά από αδράνεια.\nΠάντα: δεν θα δείτε ποτέ το ποντίκι. - - - idleTimeoutGroupBox - Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια. - - - backButtonBehaviorGroupBox - Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Ποτέ - - - Idle - Αδρανής - - - Always - Πάντα - - - Touchpad Left - Touchpad Αριστερά - - - Touchpad Right - Touchpad Δεξιά - - - Touchpad Center - Κέντρο Touchpad - - - None - Κανένα - - - graphicsAdapterGroupBox - Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\nή επιλέξτε "Auto Select" για αυτόματη επιλογή. - - - resolutionLayout - Ανάλυση Οθόνης:\nΚαθορίζει το μέγεθος του παραθύρου του εξομοιωτή κατά την αναπαραγωγή, το οποίο μπορεί να αλλάξει κατά τη διάρκεια του παιχνιδιού.\nΑυτό είναι διαφορετικό από την ανάλυση του ίδιου του παιχνιδιού. - - - heightDivider - Διαιρέτης Συχνότητας Ανανέωσης:\nΠολλαπλασιάζει τον ρυθμό με τον οποίο ο εξομοιωτής ενημερώνει την εικόνα με αυτόν τον αριθμό. Η αλλαγή αυτής της ρύθμισης μπορεί να έχει αρνητικές επιπτώσεις, όπως ταχύτερο παιχνίδι ή σπασμένες λειτουργίες! - - - dumpShadersCheckBox - Ενεργοποίηση Καταγραφής Σκιάσεων (Shaders):\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις σκιάσεις του παιχνιδιού σε φάκελο κατά τη διάρκεια της αναπαραγωγής. - - - nullGpuCheckBox - Ενεργοποίηση Εικονικής GPU:\nΓια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών. - - - gameFoldersBox - Φάκελοι Παιχνιδιών:\nΗ λίστα των φακέλων για έλεγχο των εγκατεστημένων παιχνιδιών. - - - addFolderButton - Προσθήκη:\nΠροσθέστε έναν φάκελο στη λίστα. - - - removeFolderButton - Αφαίρεση:\nΑφαιρέστε έναν φάκελο από τη λίστα. - - - debugDump - Ενεργοποίηση Καταγραφής Αποσφαλμάτωσης:\nΑποθηκεύει τα σύμβολα εισαγωγής/εξαγωγής και τις κεφαλίδες πληροφοριών του τρέχοντος προγράμματος PS4 σε έναν φάκελο. - - - vkValidationCheckBox - Ενεργοποίηση Επικύρωσης Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει την κατάσταση του προγράμματος οδήγησης Vulkan και καταγράφει πληροφορίες για την εσωτερική του κατάσταση. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - - - vkSyncValidationCheckBox - Ενεργοποίηση Επικύρωσης Συγχρονισμού Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει τον συγχρονισμό των εργασιών απόδοσης του Vulkan. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - - - rdocCheckBox - Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Δεν διατίθεται εικόνα - - - Serial: - Σειριακός αριθμός: - - - Version: - Έκδοση: - - - Size: - Μέγεθος: - - - Select Cheat File: - Επιλέξτε αρχείο Cheat: - - - Repository: - Αποθετήριο: - - - Download Cheats - Λήψη Cheats - - - Delete File - Διαγραφή αρχείου - - - No files selected. - Δεν έχουν επιλεγεί αρχεία. - - - You can delete the cheats you don't want after downloading them. - Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. - - - Do you want to delete the selected file?\n%1 - Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 - - - Select Patch File: - Επιλέξτε αρχείο Patch: - - - Download Patches - Λήψη Patches - - - Save - Αποθήκευση - - - Cheats - Cheats - - - Patches - Patches - - - Error - Σφάλμα - - - No patch selected. - Δεν έχει επιλεγεί κανένα patch. - - - Unable to open files.json for reading. - Αδυναμία ανοίγματος του files.json για ανάγνωση. - - - No patch file found for the current serial. - Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. - - - Unable to open the file for reading. - Αδυναμία ανοίγματος του αρχείου για ανάγνωση. - - - Unable to open the file for writing. - Αδυναμία ανοίγματος του αρχείου για εγγραφή. - - - Failed to parse XML: - Αποτυχία ανάλυσης XML: - - - Success - Επιτυχία - - - Options saved successfully. - Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. - - - Invalid Source - Μη έγκυρη Πηγή - - - The selected source is invalid. - Η επιλεγμένη πηγή είναι μη έγκυρη. - - - File Exists - Η αρχείο υπάρχει - - - File already exists. Do you want to replace it? - Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; - - - Failed to save file: - Αποτυχία αποθήκευσης αρχείου: - - - Failed to download file: - Αποτυχία λήψης αρχείου: - - - Cheats Not Found - Δεν βρέθηκαν Cheats - - - CheatsNotFound_MSG - Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. - - - Cheats Downloaded Successfully - Cheats κατεβάστηκαν επιτυχώς - - - CheatsDownloadedSuccessfully_MSG - Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. - - - Failed to save: - Αποτυχία αποθήκευσης: - - - Failed to download: - Αποτυχία λήψης: - - - Download Complete - Η λήψη ολοκληρώθηκε - - - DownloadComplete_MSG - Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. - - - Failed to parse JSON data from HTML. - Αποτυχία ανάλυσης δεδομένων JSON από HTML. - - - Failed to retrieve HTML page. - Αποτυχία ανάκτησης σελίδας HTML. - - - The game is in version: %1 - Το παιχνίδι είναι στην έκδοση: %1 - - - The downloaded patch only works on version: %1 - Η ληφθείσα ενημέρωση λειτουργεί μόνο στην έκδοση: %1 - - - You may need to update your game. - Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι σας. - - - Incompatibility Notice - Ειδοποίηση ασυμβατότητας - - - Failed to open file: - Αποτυχία ανοίγματος αρχείου: - - - XML ERROR: - ΣΦΑΛΜΑ XML: - - - Failed to open files.json for writing - Αποτυχία ανοίγματος του files.json για εγγραφή - - - Author: - Συγγραφέας: - - - Directory does not exist: - Ο φάκελος δεν υπάρχει: - - - Failed to open files.json for reading. - Αποτυχία ανοίγματος του files.json για ανάγνωση. - - - Name: - Όνομα: - - - Can't apply cheats before the game is started - Δεν μπορείτε να εφαρμόσετε cheats πριν ξεκινήσει το παιχνίδι. - - - - GameListFrame - - Icon - Εικονίδιο - - - Name - Όνομα - - - Serial - Σειριακός αριθμός - - - Compatibility - Compatibility - - - Region - Περιοχή - - - Firmware - Λογισμικό - - - Size - Μέγεθος - - - Version - Έκδοση - - - Path - Διαδρομή - - - Play Time - Χρόνος παιχνιδιού - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Κάντε κλικ για να δείτε λεπτομέρειες στο GitHub - - - Last updated - Τελευταία ενημέρωση - - - - CheckUpdate - - Auto Updater - Αυτόματος Ενημερωτής - - - Error - Σφάλμα - - - Network error: - Σφάλμα δικτύου: - - - Error_Github_limit_MSG - Ο Αυτόματος Ενημερωτής επιτρέπει έως και 60 ελέγχους ενημερώσεων ανά ώρα.\nΈχετε φτάσει αυτό το όριο. Παρακαλώ δοκιμάστε ξανά αργότερα. - - - Failed to parse update information. - Αποτυχία ανάλυσης πληροφοριών ενημέρωσης. - - - No pre-releases found. - Δεν βρέθηκαν προ-κυκλοφορίες. - - - Invalid release data. - Μη έγκυρα δεδομένα έκδοσης. - - - No download URL found for the specified asset. - Δεν βρέθηκε URL λήψης για το συγκεκριμένο στοιχείο. - - - Your version is already up to date! - Η έκδοσή σας είναι ήδη ενημερωμένη! - - - Update Available - Διαθέσιμη Ενημέρωση - - - Update Channel - Κανάλι Ενημέρωσης - - - Current Version - Τρέχουσα Έκδοση - - - Latest Version - Τελευταία Έκδοση - - - Do you want to update? - Θέλετε να ενημερώσετε; - - - Show Changelog - Εμφάνιση Ιστορικού Αλλαγών - - - Check for Updates at Startup - Έλεγχος για ενημερώσεις κατά την εκκίνηση - - - Update - Ενημέρωση - - - No - Όχι - - - Hide Changelog - Απόκρυψη Ιστορικού Αλλαγών - - - Changes - Αλλαγές - - - Network error occurred while trying to access the URL - Σφάλμα δικτύου κατά την προσπάθεια πρόσβασης στη διεύθυνση URL - - - Download Complete - Λήψη ολοκληρώθηκε - - - The update has been downloaded, press OK to install. - Η ενημέρωση έχει ληφθεί, πατήστε OK για να εγκαταστήσετε. - - - Failed to save the update file at - Αποτυχία αποθήκευσης του αρχείου ενημέρωσης στο - - - Starting Update... - Εκκίνηση Ενημέρωσης... - - - Failed to create the update script file - Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Φόρτωση δεδομένων συμβατότητας, παρακαλώ περιμένετε - - - Cancel - Ακύρωση - - - Loading... - Φόρτωση... - - - Error - Σφάλμα - - - Unable to update compatibility data! Try again later. - Δεν ήταν δυνατή η ενημέρωση των δεδομένων συμβατότητας! Προσπαθήστε αργότερα. - - - Unable to open compatibility_data.json for writing. - Αδύνατο να ανοίξετε το compatibility_data.json για εγγραφή. - - - Unknown - Άγνωστο - - - Nothing - Τίποτα - - - Boots - Μπότες - - - Menus - Μενού - - - Ingame - Εντός παιχνιδιού - - - Playable - Παιχνιδεύσιμο - - - diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts new file mode 100644 index 000000000..8c1c9517d --- /dev/null +++ b/src/qt_gui/translations/el_GR.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Δεν διατίθεται εικόνα + + + Serial: + Σειριακός αριθμός: + + + Version: + Έκδοση: + + + Size: + Μέγεθος: + + + Select Cheat File: + Επιλέξτε αρχείο Cheat: + + + Repository: + Αποθετήριο: + + + Download Cheats + Λήψη Cheats + + + Delete File + Διαγραφή αρχείου + + + No files selected. + Δεν έχουν επιλεγεί αρχεία. + + + You can delete the cheats you don't want after downloading them. + Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. + + + Do you want to delete the selected file?\n%1 + Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 + + + Select Patch File: + Επιλέξτε αρχείο Patch: + + + Download Patches + Λήψη Patches + + + Save + Αποθήκευση + + + Cheats + Cheats + + + Patches + Patches + + + Error + Σφάλμα + + + No patch selected. + Δεν έχει επιλεγεί κανένα patch. + + + Unable to open files.json for reading. + Αδυναμία ανοίγματος του files.json για ανάγνωση. + + + No patch file found for the current serial. + Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. + + + Unable to open the file for reading. + Αδυναμία ανοίγματος του αρχείου για ανάγνωση. + + + Unable to open the file for writing. + Αδυναμία ανοίγματος του αρχείου για εγγραφή. + + + Failed to parse XML: + Αποτυχία ανάλυσης XML: + + + Success + Επιτυχία + + + Options saved successfully. + Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. + + + Invalid Source + Μη έγκυρη Πηγή + + + The selected source is invalid. + Η επιλεγμένη πηγή είναι μη έγκυρη. + + + File Exists + Η αρχείο υπάρχει + + + File already exists. Do you want to replace it? + Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; + + + Failed to save file: + Αποτυχία αποθήκευσης αρχείου: + + + Failed to download file: + Αποτυχία λήψης αρχείου: + + + Cheats Not Found + Δεν βρέθηκαν Cheats + + + CheatsNotFound_MSG + Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. + + + Cheats Downloaded Successfully + Cheats κατεβάστηκαν επιτυχώς + + + CheatsDownloadedSuccessfully_MSG + Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. + + + Failed to save: + Αποτυχία αποθήκευσης: + + + Failed to download: + Αποτυχία λήψης: + + + Download Complete + Η λήψη ολοκληρώθηκε + + + DownloadComplete_MSG + Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. + + + Failed to parse JSON data from HTML. + Αποτυχία ανάλυσης δεδομένων JSON από HTML. + + + Failed to retrieve HTML page. + Αποτυχία ανάκτησης σελίδας HTML. + + + The game is in version: %1 + Το παιχνίδι είναι στην έκδοση: %1 + + + The downloaded patch only works on version: %1 + Η ληφθείσα ενημέρωση λειτουργεί μόνο στην έκδοση: %1 + + + You may need to update your game. + Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι σας. + + + Incompatibility Notice + Ειδοποίηση ασυμβατότητας + + + Failed to open file: + Αποτυχία ανοίγματος αρχείου: + + + XML ERROR: + ΣΦΑΛΜΑ XML: + + + Failed to open files.json for writing + Αποτυχία ανοίγματος του files.json για εγγραφή + + + Author: + Συγγραφέας: + + + Directory does not exist: + Ο φάκελος δεν υπάρχει: + + + Failed to open files.json for reading. + Αποτυχία ανοίγματος του files.json για ανάγνωση. + + + Name: + Όνομα: + + + Can't apply cheats before the game is started + Δεν μπορείτε να εφαρμόσετε cheats πριν ξεκινήσει το παιχνίδι. + + + Close + Κλείσιμο + + + + CheckUpdate + + Auto Updater + Αυτόματος Ενημερωτής + + + Error + Σφάλμα + + + Network error: + Σφάλμα δικτύου: + + + Error_Github_limit_MSG + Ο Αυτόματος Ενημερωτής επιτρέπει έως και 60 ελέγχους ενημερώσεων ανά ώρα.\nΈχετε φτάσει αυτό το όριο. Παρακαλώ δοκιμάστε ξανά αργότερα. + + + Failed to parse update information. + Αποτυχία ανάλυσης πληροφοριών ενημέρωσης. + + + No pre-releases found. + Δεν βρέθηκαν προ-κυκλοφορίες. + + + Invalid release data. + Μη έγκυρα δεδομένα έκδοσης. + + + No download URL found for the specified asset. + Δεν βρέθηκε URL λήψης για το συγκεκριμένο στοιχείο. + + + Your version is already up to date! + Η έκδοσή σας είναι ήδη ενημερωμένη! + + + Update Available + Διαθέσιμη Ενημέρωση + + + Update Channel + Κανάλι Ενημέρωσης + + + Current Version + Τρέχουσα Έκδοση + + + Latest Version + Τελευταία Έκδοση + + + Do you want to update? + Θέλετε να ενημερώσετε; + + + Show Changelog + Εμφάνιση Ιστορικού Αλλαγών + + + Check for Updates at Startup + Έλεγχος για ενημερώσεις κατά την εκκίνηση + + + Update + Ενημέρωση + + + No + Όχι + + + Hide Changelog + Απόκρυψη Ιστορικού Αλλαγών + + + Changes + Αλλαγές + + + Network error occurred while trying to access the URL + Σφάλμα δικτύου κατά την προσπάθεια πρόσβασης στη διεύθυνση URL + + + Download Complete + Λήψη ολοκληρώθηκε + + + The update has been downloaded, press OK to install. + Η ενημέρωση έχει ληφθεί, πατήστε OK για να εγκαταστήσετε. + + + Failed to save the update file at + Αποτυχία αποθήκευσης του αρχείου ενημέρωσης στο + + + Starting Update... + Εκκίνηση Ενημέρωσης... + + + Failed to create the update script file + Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Φόρτωση δεδομένων συμβατότητας, παρακαλώ περιμένετε + + + Cancel + Ακύρωση + + + Loading... + Φόρτωση... + + + Error + Σφάλμα + + + Unable to update compatibility data! Try again later. + Δεν ήταν δυνατή η ενημέρωση των δεδομένων συμβατότητας! Προσπαθήστε αργότερα. + + + Unable to open compatibility_data.json for writing. + Αδύνατο να ανοίξετε το compatibility_data.json για εγγραφή. + + + Unknown + Άγνωστο + + + Nothing + Τίποτα + + + Boots + Μπότες + + + Menus + Μενού + + + Ingame + Εντός παιχνιδιού + + + Playable + Παιχνιδεύσιμο + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Εικονίδιο + + + Name + Όνομα + + + Serial + Σειριακός αριθμός + + + Compatibility + Compatibility + + + Region + Περιοχή + + + Firmware + Λογισμικό + + + Size + Μέγεθος + + + Version + Έκδοση + + + Path + Διαδρομή + + + Play Time + Χρόνος παιχνιδιού + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Κάντε κλικ για να δείτε λεπτομέρειες στο GitHub + + + Last updated + Τελευταία ενημέρωση + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Kodikí / Enimeróseis + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Άνοιγμα Φακέλου... + + + Open Game Folder + Άνοιγμα Φακέλου Παιχνιδιού + + + Open Save Data Folder + Άνοιγμα Φακέλου Αποθηκευμένων Δεδομένων + + + Open Log Folder + Άνοιγμα Φακέλου Καταγραφής + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Έλεγχος για ενημερώσεις + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Κατεβάστε Κωδικούς / Ενημερώσεις + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Βοήθεια + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Λίστα παιχνιδιών + + + * Unsupported Vulkan Version + * Μη υποστηριζόμενη έκδοση Vulkan + + + Download Cheats For All Installed Games + Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια + + + Download Patches For All Games + Λήψη Patches για όλα τα παιχνίδια + + + Download Complete + Η λήψη ολοκληρώθηκε + + + You have downloaded cheats for all the games you have installed. + Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. + + + Patches Downloaded Successfully! + Τα Patches κατέβηκαν επιτυχώς! + + + All Patches available for all games have been downloaded. + Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. + + + Games: + Παιχνίδια: + + + ELF files (*.bin *.elf *.oelf) + Αρχεία ELF (*.bin *.elf *.oelf) + + + Game Boot + Εκκίνηση παιχνιδιού + + + Only one file can be selected! + Μπορεί να επιλεγεί μόνο ένα αρχείο! + + + PKG Extraction + Εξαγωγή PKG + + + Patch detected! + Αναγνώριση ενημέρωσης! + + + PKG and Game versions match: + Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: + + + Would you like to overwrite? + Θέλετε να αντικαταστήσετε; + + + PKG Version %1 is older than installed version: + Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: + + + Game is installed: + Το παιχνίδι είναι εγκατεστημένο: + + + Would you like to install Patch: + Θέλετε να εγκαταστήσετε την ενημέρωση: + + + DLC Installation + Εγκατάσταση DLC + + + Would you like to install DLC: %1? + Θέλετε να εγκαταστήσετε το DLC: %1; + + + DLC already installed: + DLC ήδη εγκατεστημένο: + + + Game already installed + Παιχνίδι ήδη εγκατεστημένο + + + PKG ERROR + ΣΦΑΛΜΑ PKG + + + Extracting PKG %1/%2 + Εξαγωγή PKG %1/%2 + + + Extraction Finished + Η εξαγωγή ολοκληρώθηκε + + + Game successfully installed at %1 + Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 + + + File doesn't appear to be a valid PKG file + Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Όνομα + + + Serial + Σειριακός αριθμός + + + Installed + + + + Size + Μέγεθος + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Περιοχή + + + Flags + + + + Path + Διαδρομή + + + File + File + + + PKG ERROR + ΣΦΑΛΜΑ PKG + + + Unknown + Άγνωστο + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Λειτουργία Πλήρους Οθόνης + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Προεπιλεγμένη καρτέλα κατά την ανοίγμα των ρυθμίσεων + + + Show Game Size In List + Εμφάνιση Μεγέθους Παιχνιδιού στη Λίστα + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Ενεργοποίηση Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Άνοιγμα τοποθεσίας αρχείου καταγραφής + + + Input + Είσοδος + + + Cursor + Δείκτης + + + Hide Cursor + Απόκρυψη δείκτη + + + Hide Cursor Idle Timeout + Χρόνος αδράνειας απόκρυψης δείκτη + + + s + s + + + Controller + Controller + + + Back Button Behavior + Συμπεριφορά κουμπιού επιστροφής + + + Graphics + Graphics + + + GUI + Διεπαφή + + + User + Χρήστης + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Διαδρομές + + + Game Folders + Φάκελοι παιχνιδιών + + + Add... + Προσθήκη... + + + Remove + Αφαίρεση + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Ενημέρωση + + + Check for Updates at Startup + Έλεγχος για ενημερώσεις κατά την εκκίνηση + + + Always Show Changelog + Πάντα εμφάνιση ιστορικού αλλαγών + + + Update Channel + Κανάλι Ενημέρωσης + + + Check for Updates + Έλεγχος για ενημερώσεις + + + GUI Settings + Ρυθμίσεις GUI + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Αναπαραγωγή μουσικής τίτλου + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + ένταση + + + Save + Αποθήκευση + + + Apply + Εφαρμογή + + + Restore Defaults + Επαναφορά Προεπιλογών + + + Close + Κλείσιμο + + + Point your mouse at an option to display its description. + Τοποθετήστε το ποντίκι σας πάνω σε μια επιλογή για να εμφανίσετε την περιγραφή της. + + + consoleLanguageGroupBox + Γλώσσα Κονσόλας:\nΡυθμίζει τη γλώσσα που θα χρησιμοποιήσει το παιχνίδι PS4.\nΣυνιστάται να επιλέξετε μία από τις γλώσσες που υποστηρίζονται από το παιχνίδι, η οποία ενδέχεται να διαφέρει ανάλογα με την περιοχή. + + + emulatorLanguageGroupBox + Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. + + + fullscreenCheckBox + Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Εμφάνιση Splash Screen:\nΕμφανίζει ειδική γραφική οθόνη κατά την εκκίνηση. + + + discordRPCCheckbox + Ενεργοποίηση Discord Rich Presence:\nΕμφανίζει το εικονίδιο του emulator και σχετικές πληροφορίες στο προφίλ σας στο Discord. + + + userName + Όνομα Χρήστη:\nΟρίζει το όνομα του λογαριασμού PS4, το οποίο μπορεί να εμφανιστεί σε ορισμένα παιχνίδια. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Τύπος Καταγραφής:\nΚαθορίζει αν η έξοδος του παραθύρου καταγραφής θα συγχρονιστεί για αύξηση της απόδοσης. Αυτό μπορεί να επηρεάσει αρνητικά τις επιδόσεις του εξομοιωτή. + + + logFilter + Φίλτρο Καταγραφής:\nΦιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες.\nΠαραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα. + + + updaterGroupBox + Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. + + + GUIMusicGroupBox + Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Απόκρυψη Κέρσορα:\nΕπιλέξτε πότε θα εξαφανιστεί ο κέρσορας:\nΠοτέ: θα βλέπετε πάντα το ποντίκι.\nΑδρανές: ορίστε έναν χρόνο για να εξαφανιστεί μετά από αδράνεια.\nΠάντα: δεν θα δείτε ποτέ το ποντίκι. + + + idleTimeoutGroupBox + Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια. + + + backButtonBehaviorGroupBox + Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Ποτέ + + + Idle + Αδρανής + + + Always + Πάντα + + + Touchpad Left + Touchpad Αριστερά + + + Touchpad Right + Touchpad Δεξιά + + + Touchpad Center + Κέντρο Touchpad + + + None + Κανένα + + + graphicsAdapterGroupBox + Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\nή επιλέξτε "Auto Select" για αυτόματη επιλογή. + + + resolutionLayout + Ανάλυση Οθόνης:\nΚαθορίζει το μέγεθος του παραθύρου του εξομοιωτή κατά την αναπαραγωγή, το οποίο μπορεί να αλλάξει κατά τη διάρκεια του παιχνιδιού.\nΑυτό είναι διαφορετικό από την ανάλυση του ίδιου του παιχνιδιού. + + + heightDivider + Διαιρέτης Συχνότητας Ανανέωσης:\nΠολλαπλασιάζει τον ρυθμό με τον οποίο ο εξομοιωτής ενημερώνει την εικόνα με αυτόν τον αριθμό. Η αλλαγή αυτής της ρύθμισης μπορεί να έχει αρνητικές επιπτώσεις, όπως ταχύτερο παιχνίδι ή σπασμένες λειτουργίες! + + + dumpShadersCheckBox + Ενεργοποίηση Καταγραφής Σκιάσεων (Shaders):\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις σκιάσεις του παιχνιδιού σε φάκελο κατά τη διάρκεια της αναπαραγωγής. + + + nullGpuCheckBox + Ενεργοποίηση Εικονικής GPU:\nΓια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών. + + + gameFoldersBox + Φάκελοι Παιχνιδιών:\nΗ λίστα των φακέλων για έλεγχο των εγκατεστημένων παιχνιδιών. + + + addFolderButton + Προσθήκη:\nΠροσθέστε έναν φάκελο στη λίστα. + + + removeFolderButton + Αφαίρεση:\nΑφαιρέστε έναν φάκελο από τη λίστα. + + + debugDump + Ενεργοποίηση Καταγραφής Αποσφαλμάτωσης:\nΑποθηκεύει τα σύμβολα εισαγωγής/εξαγωγής και τις κεφαλίδες πληροφοριών του τρέχοντος προγράμματος PS4 σε έναν φάκελο. + + + vkValidationCheckBox + Ενεργοποίηση Επικύρωσης Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει την κατάσταση του προγράμματος οδήγησης Vulkan και καταγράφει πληροφορίες για την εσωτερική του κατάσταση. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. + + + vkSyncValidationCheckBox + Ενεργοποίηση Επικύρωσης Συγχρονισμού Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει τον συγχρονισμό των εργασιών απόδοσης του Vulkan. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. + + + rdocCheckBox + Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + + diff --git a/src/qt_gui/translations/en.ts b/src/qt_gui/translations/en.ts deleted file mode 100644 index c3de0062a..000000000 --- a/src/qt_gui/translations/en.ts +++ /dev/null @@ -1,1515 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - Cheats / Patches - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Open Folder... - - - Open Game Folder - Open Game Folder - - - Open Save Data Folder - Open Save Data Folder - - - Open Log Folder - Open Log Folder - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy Version - Copy Version - - - Copy Size - Copy Size - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Check for Updates - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Download Cheats / Patches - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Help - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Game List - - - * Unsupported Vulkan Version - * Unsupported Vulkan Version - - - Download Cheats For All Installed Games - Download Cheats For All Installed Games - - - Download Patches For All Games - Download Patches For All Games - - - Download Complete - Download Complete - - - You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. - - - Patches Downloaded Successfully! - Patches Downloaded Successfully! - - - All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. - - - Games: - Games: - - - PKG File (*.PKG) - PKG File (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) - - - Game Boot - Game Boot - - - Only one file can be selected! - Only one file can be selected! - - - PKG Extraction - PKG Extraction - - - Patch detected! - Patch detected! - - - PKG and Game versions match: - PKG and Game versions match: - - - Would you like to overwrite? - Would you like to overwrite? - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - Game is installed: - Game is installed: - - - Would you like to install Patch: - Would you like to install Patch: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - DLC already installed: - DLC already installed: - - - Game already installed - Game already installed - - - PKG is a patch, please install the game first! - PKG is a patch, please install the game first! - - - PKG ERROR - PKG ERROR - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - Extraction Finished - Extraction Finished - - - Game successfully installed at %1 - Game successfully installed at %1 - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Fullscreen Mode - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Default tab when opening settings - - - Show Game Size In List - Show Game Size In List - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Enable Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Open Log Location - - - Input - Input - - - Cursor - Cursor - - - Hide Cursor - Hide Cursor - - - Hide Cursor Idle Timeout - Hide Cursor Idle Timeout - - - s - s - - - Controller - Controller - - - Back Button Behavior - Back Button Behavior - - - Graphics - Graphics - - - GUI - Gui - - - User - User - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Enable HDR - Enable HDR - - - Paths - Paths - - - Game Folders - Game Folders - - - Add... - Add... - - - Remove - Remove - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Update - - - Check for Updates at Startup - Check for Updates at Startup - - - Always Show Changelog - Always Show Changelog - - - Update Channel - Update Channel - - - Check for Updates - Check for Updates - - - GUI Settings - GUI Settings - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Background Image - Background Image - - - Show Background Image - Show Background Image - - - Opacity - Opacity - - - Play title music - Play title music - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Volume - - - Audio Backend - Audio Backend - - - Save - Save - - - Apply - Apply - - - Restore Defaults - Restore Defaults - - - Close - Close - - - Point your mouse at an option to display its description. - Point your mouse at an option to display its description. - - - consoleLanguageGroupBox - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - - - emulatorLanguageGroupBox - Emulator Language:\nSets the language of the emulator's user interface. - - - fullscreenCheckBox - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - - - showSplashCheckBox - Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - - - ps4proCheckBox - Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it. - - - discordRPCCheckbox - Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. - - - userName - Username:\nSets the PS4's account username, which may be displayed by some games. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - - - logFilter - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - - - updaterGroupBox - Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - - - GUIBackgroundImageGroupBox - Background Image:\nControl the opacity of the game background image. - - - GUIMusicGroupBox - Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - - - idleTimeoutGroupBox - Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - - - backButtonBehaviorGroupBox - Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Never - - - Idle - Idle - - - Always - Always - - - Touchpad Left - Touchpad Left - - - Touchpad Right - Touchpad Right - - - Touchpad Center - Touchpad Center - - - None - None - - - graphicsAdapterGroupBox - Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - - - resolutionLayout - Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - - - heightDivider - Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - - - dumpShadersCheckBox - Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - - - nullGpuCheckBox - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - - - enableHDRCheckBox - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - - - gameFoldersBox - Game Folders:\nThe list of folders to check for installed games. - - - addFolderButton - Add:\nAdd a folder to the list. - - - removeFolderButton - Remove:\nRemove a folder from the list. - - - debugDump - Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - - - vkValidationCheckBox - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - - - vkSyncValidationCheckBox - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - - - rdocCheckBox - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - saveDataBox - Save Data Path:\nThe folder where game save data will be saved. - - - browseButton - Browse:\nBrowse for a folder to set as the save data path. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - No Image Available - - - Serial: - Serial: - - - Version: - Version: - - - Size: - Size: - - - Select Cheat File: - Select Cheat File: - - - Repository: - Repository: - - - Download Cheats - Download Cheats - - - Delete File - Delete File - - - No files selected. - No files selected. - - - You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. - - - Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 - - - Select Patch File: - Select Patch File: - - - Download Patches - Download Patches - - - Save - Save - - - Cheats - Cheats - - - Patches - Patches - - - Error - Error - - - No patch selected. - No patch selected. - - - Unable to open files.json for reading. - Unable to open files.json for reading. - - - No patch file found for the current serial. - No patch file found for the current serial. - - - Unable to open the file for reading. - Unable to open the file for reading. - - - Unable to open the file for writing. - Unable to open the file for writing. - - - Failed to parse XML: - Failed to parse XML: - - - Success - Success - - - Options saved successfully. - Options saved successfully. - - - Invalid Source - Invalid Source - - - The selected source is invalid. - The selected source is invalid. - - - File Exists - File Exists - - - File already exists. Do you want to replace it? - File already exists. Do you want to replace it? - - - Failed to save file: - Failed to save file: - - - Failed to download file: - Failed to download file: - - - Cheats Not Found - Cheats Not Found - - - CheatsNotFound_MSG - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - - - Cheats Downloaded Successfully - Cheats Downloaded Successfully - - - CheatsDownloadedSuccessfully_MSG - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - - - Failed to save: - Failed to save: - - - Failed to download: - Failed to download: - - - Download Complete - Download Complete - - - DownloadComplete_MSG - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - - - Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. - - - Failed to retrieve HTML page. - Failed to retrieve HTML page. - - - The game is in version: %1 - The game is in version: %1 - - - The downloaded patch only works on version: %1 - The downloaded patch only works on version: %1 - - - You may need to update your game. - You may need to update your game. - - - Incompatibility Notice - Incompatibility Notice - - - Failed to open file: - Failed to open file: - - - XML ERROR: - XML ERROR: - - - Failed to open files.json for writing - Failed to open files.json for writing - - - Author: - Author: - - - Directory does not exist: - Directory does not exist: - - - Failed to open files.json for reading. - Failed to open files.json for reading. - - - Name: - Name: - - - Can't apply cheats before the game is started - Can't apply cheats before the game is started. - - - - GameListFrame - - Icon - Icon - - - Name - Name - - - Serial - Serial - - - Compatibility - Compatibility - - - Region - Region - - - Firmware - Firmware - - - Size - Size - - - Version - Version - - - Path - Path - - - Play Time - Play Time - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Click to see details on GitHub - - - Last updated - Last updated - - - - CheckUpdate - - Auto Updater - Auto Updater - - - Error - Error - - - Network error: - Network error: - - - Error_Github_limit_MSG - The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. - - - Failed to parse update information. - Failed to parse update information. - - - No pre-releases found. - No pre-releases found. - - - Invalid release data. - Invalid release data. - - - No download URL found for the specified asset. - No download URL found for the specified asset. - - - Your version is already up to date! - Your version is already up to date! - - - Update Available - Update Available - - - Update Channel - Update Channel - - - Current Version - Current Version - - - Latest Version - Latest Version - - - Do you want to update? - Do you want to update? - - - Show Changelog - Show Changelog - - - Check for Updates at Startup - Check for Updates at Startup - - - Update - Update - - - No - No - - - Hide Changelog - Hide Changelog - - - Changes - Changes - - - Network error occurred while trying to access the URL - Network error occurred while trying to access the URL - - - Download Complete - Download Complete - - - The update has been downloaded, press OK to install. - The update has been downloaded, press OK to install. - - - Failed to save the update file at - Failed to save the update file at - - - Starting Update... - Starting Update... - - - Failed to create the update script file - Failed to create the update script file - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Fetching compatibility data, please wait - - - Cancel - Cancel - - - Loading... - Loading... - - - Error - Error - - - Unable to update compatibility data! Try again later. - Unable to update compatibility data! Try again later. - - - Unable to open compatibility_data.json for writing. - Unable to open compatibility_data.json for writing. - - - Unknown - Unknown - - - Nothing - Nothing - - - Boots - Boots - - - Menus - Menus - - - Ingame - Ingame - - - Playable - Playable - - - diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts new file mode 100644 index 000000000..db28dc7cb --- /dev/null +++ b/src/qt_gui/translations/en_US.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + No Image Available + + + Serial: + Serial: + + + Version: + Version: + + + Size: + Size: + + + Select Cheat File: + Select Cheat File: + + + Repository: + Repository: + + + Download Cheats + Download Cheats + + + Delete File + Delete File + + + No files selected. + No files selected. + + + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + + + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + + + Select Patch File: + Select Patch File: + + + Download Patches + Download Patches + + + Save + Save + + + Cheats + Cheats + + + Patches + Patches + + + Error + Error + + + No patch selected. + No patch selected. + + + Unable to open files.json for reading. + Unable to open files.json for reading. + + + No patch file found for the current serial. + No patch file found for the current serial. + + + Unable to open the file for reading. + Unable to open the file for reading. + + + Unable to open the file for writing. + Unable to open the file for writing. + + + Failed to parse XML: + Failed to parse XML: + + + Success + Success + + + Options saved successfully. + Options saved successfully. + + + Invalid Source + Invalid Source + + + The selected source is invalid. + The selected source is invalid. + + + File Exists + File Exists + + + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + + + Failed to save file: + Failed to save file: + + + Failed to download file: + Failed to download file: + + + Cheats Not Found + Cheats Not Found + + + CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + + + Cheats Downloaded Successfully + Cheats Downloaded Successfully + + + CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + + + Failed to save: + Failed to save: + + + Failed to download: + Failed to download: + + + Download Complete + Download Complete + + + DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + + + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + + + Failed to retrieve HTML page. + Failed to retrieve HTML page. + + + The game is in version: %1 + The game is in version: %1 + + + The downloaded patch only works on version: %1 + The downloaded patch only works on version: %1 + + + You may need to update your game. + You may need to update your game. + + + Incompatibility Notice + Incompatibility Notice + + + Failed to open file: + Failed to open file: + + + XML ERROR: + XML ERROR: + + + Failed to open files.json for writing + Failed to open files.json for writing + + + Author: + Author: + + + Directory does not exist: + Directory does not exist: + + + Failed to open files.json for reading. + Failed to open files.json for reading. + + + Name: + Name: + + + Can't apply cheats before the game is started + Can't apply cheats before the game is started. + + + Close + Close + + + + CheckUpdate + + Auto Updater + Auto Updater + + + Error + Error + + + Network error: + Network error: + + + Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. + + + Failed to parse update information. + Failed to parse update information. + + + No pre-releases found. + No pre-releases found. + + + Invalid release data. + Invalid release data. + + + No download URL found for the specified asset. + No download URL found for the specified asset. + + + Your version is already up to date! + Your version is already up to date! + + + Update Available + Update Available + + + Update Channel + Update Channel + + + Current Version + Current Version + + + Latest Version + Latest Version + + + Do you want to update? + Do you want to update? + + + Show Changelog + Show Changelog + + + Check for Updates at Startup + Check for Updates at Startup + + + Update + Update + + + No + No + + + Hide Changelog + Hide Changelog + + + Changes + Changes + + + Network error occurred while trying to access the URL + Network error occurred while trying to access the URL + + + Download Complete + Download Complete + + + The update has been downloaded, press OK to install. + The update has been downloaded, press OK to install. + + + Failed to save the update file at + Failed to save the update file at + + + Starting Update... + Starting Update... + + + Failed to create the update script file + Failed to create the update script file + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Fetching compatibility data, please wait + + + Cancel + Cancel + + + Loading... + Loading... + + + Error + Error + + + Unable to update compatibility data! Try again later. + Unable to update compatibility data! Try again later. + + + Unable to open compatibility_data.json for writing. + Unable to open compatibility_data.json for writing. + + + Unknown + Unknown + + + Nothing + Nothing + + + Boots + Boots + + + Menus + Menus + + + Ingame + Ingame + + + Playable + Playable + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Icon + + + Name + Name + + + Serial + Serial + + + Compatibility + Compatibility + + + Region + Region + + + Firmware + Firmware + + + Size + Size + + + Version + Version + + + Path + Path + + + Play Time + Play Time + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Click to see details on GitHub + + + Last updated + Last updated + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Cheats / Patches + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Open Folder... + + + Open Game Folder + Open Game Folder + + + Open Save Data Folder + Open Save Data Folder + + + Open Log Folder + Open Log Folder + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy Version + Copy Version + + + Copy Size + Copy Size + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Check for Updates + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Download Cheats / Patches + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Help + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Game List + + + * Unsupported Vulkan Version + * Unsupported Vulkan Version + + + Download Cheats For All Installed Games + Download Cheats For All Installed Games + + + Download Patches For All Games + Download Patches For All Games + + + Download Complete + Download Complete + + + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + + + Patches Downloaded Successfully! + Patches Downloaded Successfully! + + + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + + + Games: + Games: + + + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + + + Game Boot + Game Boot + + + Only one file can be selected! + Only one file can be selected! + + + PKG Extraction + PKG Extraction + + + Patch detected! + Patch detected! + + + PKG and Game versions match: + PKG and Game versions match: + + + Would you like to overwrite? + Would you like to overwrite? + + + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + + + Game is installed: + Game is installed: + + + Would you like to install Patch: + Would you like to install Patch: + + + DLC Installation + DLC Installation + + + Would you like to install DLC: %1? + Would you like to install DLC: %1? + + + DLC already installed: + DLC already installed: + + + Game already installed + Game already installed + + + PKG ERROR + PKG ERROR + + + Extracting PKG %1/%2 + Extracting PKG %1/%2 + + + Extraction Finished + Extraction Finished + + + Game successfully installed at %1 + Game successfully installed at %1 + + + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + PKG ERROR + PKG ERROR + + + Name + Name + + + Serial + Serial + + + Installed + + + + Size + Size + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Region + + + Flags + + + + Path + Path + + + File + File + + + Unknown + Unknown + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Fullscreen Mode + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Default tab when opening settings + + + Show Game Size In List + Show Game Size In List + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Enable Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Open Log Location + + + Input + Input + + + Cursor + Cursor + + + Hide Cursor + Hide Cursor + + + Hide Cursor Idle Timeout + Hide Cursor Idle Timeout + + + s + s + + + Controller + Controller + + + Back Button Behavior + Back Button Behavior + + + Graphics + Graphics + + + GUI + Gui + + + User + User + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Enable HDR + Enable HDR + + + Paths + Paths + + + Game Folders + Game Folders + + + Add... + Add... + + + Remove + Remove + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Update + + + Check for Updates at Startup + Check for Updates at Startup + + + Always Show Changelog + Always Show Changelog + + + Update Channel + Update Channel + + + Check for Updates + Check for Updates + + + GUI Settings + GUI Settings + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Background Image + Background Image + + + Show Background Image + Show Background Image + + + Opacity + Opacity + + + Play title music + Play title music + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Volume + + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Close + Close + + + Point your mouse at an option to display its description. + Point your mouse at an option to display its description. + + + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + + + emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. + + + fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. + + + showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + + + discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. + + + userName + Username:\nSets the PS4's account username, which may be displayed by some games. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + + + logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + + + updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + + + GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + + + GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + + + idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. + + + backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Never + + + Idle + Idle + + + Always + Always + + + Touchpad Left + Touchpad Left + + + Touchpad Right + Touchpad Right + + + Touchpad Center + Touchpad Center + + + None + None + + + graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + + + resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + + + heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + + + dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + + + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + + enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + + + gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. + + + addFolderButton + Add:\nAdd a folder to the list. + + + removeFolderButton + Remove:\nRemove a folder from the list. + + + debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + + + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. + + + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. + + + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + + + browseButton + Browse:\nBrowse for a folder to set as the save data path. + + + Borderless + + + + True + + + + Release + + + + Nightly + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + + diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 2b8405ed1..c169e68c6 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1,1491 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - Acerca de shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 es un emulador experimental de código abierto para la PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Este software no debe utilizarse para jugar juegos que hayas obtenido ilegalmente. - - - - ElfViewer - - Open Folder - Abrir carpeta - - - - GameInfoClass - - Loading game list, please wait :3 - Cargando lista de juegos, por favor espera :3 - - - Cancel - Cancelar - - - Loading... - Cargando... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Elegir carpeta - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Elegir carpeta - - - Directory to install games - Carpeta para instalar juegos - - - Browse - Buscar - - - Error - Error - - - The value for location to install games is not valid. - El valor para la ubicación de instalación de los juegos no es válido. - - - - GuiContextMenus - - Create Shortcut - Crear acceso directo - - - Cheats / Patches - Trucos / Parches - - - SFO Viewer - Vista SFO - - - Trophy Viewer - Ver trofeos - - - Open Folder... - Abrir Carpeta... - - - Open Game Folder - Abrir Carpeta del Juego - - - Open Save Data Folder - Abrir Carpeta de Datos Guardados - - - Open Log Folder - Abrir Carpeta de Registros - - - Copy info... - Copiar información... - - - Copy Name - Copiar nombre - - - Copy Serial - Copiar número de serie - - - Copy All - Copiar todo - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Acceso directo creado - - - Shortcut created successfully! - ¡Acceso directo creado con éxito! - - - Error - Error - - - Error creating shortcut! - ¡Error al crear el acceso directo! - - - Install PKG - Instalar PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Abrir/Agregar carpeta Elf - - - Install Packages (PKG) - Instalar paquetes (PKG) - - - Boot Game - Iniciar juego - - - Check for Updates - Buscar actualizaciones - - - About shadPS4 - Acerca de shadPS4 - - - Configure... - Configurar... - - - Install application from a .pkg file - Instalar aplicación desde un archivo .pkg - - - Recent Games - Juegos recientes - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Salir - - - Exit shadPS4 - Salir de shadPS4 - - - Exit the application. - Salir de la aplicación. - - - Show Game List - Mostrar lista de juegos - - - Game List Refresh - Actualizar lista de juegos - - - Tiny - Muy pequeño - - - Small - Pequeño - - - Medium - Mediano - - - Large - Grande - - - List View - Vista de lista - - - Grid View - Vista de cuadrícula - - - Elf Viewer - Vista Elf - - - Game Install Directory - Carpeta de instalación de los juegos - - - Download Cheats/Patches - Descargar Trucos / Parches - - - Dump Game List - Volcar lista de juegos - - - PKG Viewer - Vista PKG - - - Search... - Buscar... - - - File - Archivo - - - View - Vista - - - Game List Icons - Iconos de los juegos - - - Game List Mode - Tipo de lista - - - Settings - Configuración - - - Utils - Utilidades - - - Themes - Temas - - - Help - Ayuda - - - Dark - Oscuro - - - Light - Claro - - - Green - Verde - - - Blue - Azul - - - Violet - Violeta - - - toolBar - Barra de herramientas - - - Game List - Lista de juegos - - - * Unsupported Vulkan Version - * Versión de Vulkan no soportada - - - Download Cheats For All Installed Games - Descargar trucos para todos los juegos instalados - - - Download Patches For All Games - Descargar parches para todos los juegos - - - Download Complete - Descarga completa - - - You have downloaded cheats for all the games you have installed. - Has descargado trucos para todos los juegos que tienes instalados. - - - Patches Downloaded Successfully! - ¡Parches descargados exitosamente! - - - All Patches available for all games have been downloaded. - Todos los parches disponibles han sido descargados para todos los juegos. - - - Games: - Juegos: - - - PKG File (*.PKG) - Archivo PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Archivos ELF (*.bin *.elf *.oelf) - - - Game Boot - Inicio del juego - - - Only one file can be selected! - ¡Solo se puede seleccionar un archivo! - - - PKG Extraction - Extracción de PKG - - - Patch detected! - ¡Actualización detectada! - - - PKG and Game versions match: - Las versiones de PKG y del juego coinciden: - - - Would you like to overwrite? - ¿Desea sobrescribir? - - - PKG Version %1 is older than installed version: - La versión de PKG %1 es más antigua que la versión instalada: - - - Game is installed: - El juego está instalado: - - - Would you like to install Patch: - ¿Desea instalar la actualización: - - - DLC Installation - Instalación de DLC - - - Would you like to install DLC: %1? - ¿Desea instalar el DLC: %1? - - - DLC already installed: - DLC ya instalado: - - - Game already installed - Juego ya instalado - - - PKG is a patch, please install the game first! - PKG es un parche, ¡por favor instala el juego primero! - - - PKG ERROR - ERROR PKG - - - Extracting PKG %1/%2 - Extrayendo PKG %1/%2 - - - Extraction Finished - Extracción terminada - - - Game successfully installed at %1 - Juego instalado exitosamente en %1 - - - File doesn't appear to be a valid PKG file - El archivo parece no ser un archivo PKG válido - - - - PKGViewer - - Open Folder - Abrir carpeta - - - - TrophyViewer - - Trophy Viewer - Vista de trofeos - - - - SettingsDialog - - Settings - Configuración - - - General - General - - - System - Sistema - - - Console Language - Idioma de la consola - - - Emulator Language - Idioma del emulador - - - Emulator - Emulador - - - Enable Fullscreen - Habilitar pantalla completa - - - Fullscreen Mode - Modo de Pantalla Completa - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Pestaña predeterminada al abrir la configuración - - - Show Game Size In List - Mostrar Tamaño del Juego en la Lista - - - Show Splash - Mostrar splash - - - Is PS4 Pro - Modo PS4 Pro - - - Enable Discord Rich Presence - Habilitar Discord Rich Presence - - - Username - Nombre de usuario - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Registro - - - Log Type - Tipo de registro - - - Log Filter - Filtro de registro - - - Open Log Location - Abrir ubicación del registro - - - Input - Entrada - - - Cursor - Cursor - - - Hide Cursor - Ocultar cursor - - - Hide Cursor Idle Timeout - Tiempo de espera para ocultar cursor inactivo - - - s - s - - - Controller - Controlador - - - Back Button Behavior - Comportamiento del botón de retroceso - - - Graphics - Gráficos - - - GUI - Interfaz - - - User - Usuario - - - Graphics Device - Dispositivo gráfico - - - Width - Ancho - - - Height - Alto - - - Vblank Divider - Divisor de Vblank - - - Advanced - Avanzado - - - Enable Shaders Dumping - Habilitar volcado de shaders - - - Enable NULL GPU - Habilitar GPU NULL - - - Paths - Rutas - - - Game Folders - Carpetas de juego - - - Add... - Añadir... - - - Remove - Eliminar - - - Debug - Depuración - - - Enable Debug Dumping - Habilitar volcado de depuración - - - Enable Vulkan Validation Layers - Habilitar capas de validación de Vulkan - - - Enable Vulkan Synchronization Validation - Habilitar validación de sincronización de Vulkan - - - Enable RenderDoc Debugging - Habilitar depuración de RenderDoc - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Actualización - - - Check for Updates at Startup - Buscar actualizaciones al iniciar - - - Always Show Changelog - Mostrar siempre el registro de cambios - - - Update Channel - Canal de Actualización - - - Check for Updates - Verificar actualizaciones - - - GUI Settings - Configuraciones de la Interfaz - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Background Image - Imagen de fondo - - - Show Background Image - Mostrar Imagen de Fondo - - - Opacity - Opacidad - - - Play title music - Reproducir la música de apertura - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Volumen - - - Audio Backend - Audio Backend - - - Save - Guardar - - - Apply - Aplicar - - - Restore Defaults - Restaurar Valores Predeterminados - - - Close - Cerrar - - - Point your mouse at an option to display its description. - Coloque el mouse sobre una opción para mostrar su descripción. - - - consoleLanguageGroupBox - Idioma de la Consola:\nEstablece el idioma que utiliza el juego de PS4.\nSe recomienda configurarlo a un idioma que el juego soporte, lo cual varía por región. - - - emulatorLanguageGroupBox - Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. - - - fullscreenCheckBox - Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Mostrar Pantalla de Inicio:\nMuestra la pantalla de inicio del juego (una imagen especial) mientras el juego se está iniciando. - - - ps4proCheckBox - Es PS4 Pro:\nHace que el emulador actúe como una PS4 PRO, lo que puede habilitar funciones especiales en los juegos que lo admitan. - - - discordRPCCheckbox - Habilitar Discord Rich Presence:\nMuestra el ícono del emulador y la información relevante en tu perfil de Discord. - - - userName - Nombre de Usuario:\nEstablece el nombre de usuario de la cuenta de PS4, que puede ser mostrado por algunos juegos. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Tipo de Registro:\nEstablece si sincronizar la salida de la ventana de registro para mejorar el rendimiento. Puede tener efectos adversos en la emulación. - - - logFilter - Filtro de Registro:\nFiltra el registro para imprimir solo información específica.\nEjemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior. - - - updaterGroupBox - Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. - - - GUIBackgroundImageGroupBox - Imagen de fondo:\nControle la opacidad de la imagen de fondo del juego. - - - GUIMusicGroupBox - Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse. - - - idleTimeoutGroupBox - Establezca un tiempo para que el mouse desaparezca después de estar inactivo. - - - backButtonBehaviorGroupBox - Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Nunca - - - Idle - Inactivo - - - Always - Siempre - - - Touchpad Left - Touchpad Izquierda - - - Touchpad Right - Touchpad Derecha - - - Touchpad Center - Centro del Touchpad - - - None - Ninguno - - - graphicsAdapterGroupBox - Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona "Auto Select" para determinarla automáticamente. - - - resolutionLayout - Anchura/Altura:\nEstablece el tamaño de la ventana del emulador al iniciar, que se puede redimensionar durante el juego.\nEsto es diferente de la resolución en el juego. - - - heightDivider - Divisor de Vblank:\nLa tasa de cuadros a la que se refresca el emulador se multiplica por este número. Cambiar esto puede tener efectos adversos, como aumentar la velocidad del juego, o romper la funcionalidad crítica del juego que no espera que esto cambie. - - - dumpShadersCheckBox - Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. - - - nullGpuCheckBox - Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica. - - - gameFoldersBox - Carpetas de Juegos:\nLa lista de carpetas para verificar los juegos instalados. - - - addFolderButton - Añadir:\nAgregar una carpeta a la lista. - - - removeFolderButton - Eliminar:\nEliminar una carpeta de la lista. - - - debugDump - Habilitar la Volcadura de Depuración:\nGuarda los símbolos de importación y exportación y la información del encabezado del archivo del programa de PS4 que se está ejecutando actualmente en un directorio. - - - vkValidationCheckBox - Habilitar Capas de Validación de Vulkan:\nHabilita un sistema que valida el estado del renderizador de Vulkan y registra información sobre su estado interno. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - - - vkSyncValidationCheckBox - Habilitar Validación de Sincronización de Vulkan:\nHabilita un sistema que valida el tiempo de las tareas de renderizado de Vulkan. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - - - rdocCheckBox - Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - No hay imagen disponible - - - Serial: - Número de serie: - - - Version: - Versión: - - - Size: - Tamaño: - - - Select Cheat File: - Seleccionar archivo de trucos: - - - Repository: - Repositorio: - - - Download Cheats - Descargar trucos - - - Delete File - Eliminar archivo - - - No files selected. - No se han seleccionado archivos. - - - You can delete the cheats you don't want after downloading them. - Puedes eliminar los trucos que no quieras una vez descargados. - - - Do you want to delete the selected file?\n%1 - ¿Deseas eliminar el archivo seleccionado?\n%1 - - - Select Patch File: - Seleccionar archivo de parche: - - - Download Patches - Descargar parches - - - Save - Guardar - - - Cheats - Trucos - - - Patches - Parches - - - Error - Error - - - No patch selected. - No se ha seleccionado ningún parche. - - - Unable to open files.json for reading. - No se puede abrir files.json para lectura. - - - No patch file found for the current serial. - No se encontró ningún archivo de parche para el número de serie actual. - - - Unable to open the file for reading. - No se puede abrir el archivo para lectura. - - - Unable to open the file for writing. - No se puede abrir el archivo para escritura. - - - Failed to parse XML: - Error al analizar XML: - - - Success - Éxito - - - Options saved successfully. - Opciones guardadas exitosamente. - - - Invalid Source - Fuente inválida - - - The selected source is invalid. - La fuente seleccionada es inválida. - - - File Exists - El archivo ya existe - - - File already exists. Do you want to replace it? - El archivo ya existe. ¿Deseas reemplazarlo? - - - Failed to save file: - Error al guardar el archivo: - - - Failed to download file: - Error al descargar el archivo: - - - Cheats Not Found - Trucos no encontrados - - - CheatsNotFound_MSG - No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. - - - Cheats Downloaded Successfully - Trucos descargados exitosamente - - - CheatsDownloadedSuccessfully_MSG - Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. - - - Failed to save: - Error al guardar: - - - Failed to download: - Error al descargar: - - - Download Complete - Descarga completa - - - DownloadComplete_MSG - ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. - - - Failed to parse JSON data from HTML. - Error al analizar los datos JSON del HTML. - - - Failed to retrieve HTML page. - Error al recuperar la página HTML. - - - The game is in version: %1 - El juego está en la versión: %1 - - - The downloaded patch only works on version: %1 - El parche descargado solo funciona en la versión: %1 - - - You may need to update your game. - Puede que necesites actualizar tu juego. - - - Incompatibility Notice - Aviso de incompatibilidad - - - Failed to open file: - Error al abrir el archivo: - - - XML ERROR: - ERROR XML: - - - Failed to open files.json for writing - Error al abrir files.json para escritura - - - Author: - Autor: - - - Directory does not exist: - El directorio no existe: - - - Failed to open files.json for reading. - Error al abrir files.json para lectura. - - - Name: - Nombre: - - - Can't apply cheats before the game is started - No se pueden aplicar trucos antes de que se inicie el juego. - - - - GameListFrame - - Icon - Icono - - - Name - Nombre - - - Serial - Numero de serie - - - Compatibility - Compatibility - - - Region - Región - - - Firmware - Firmware - - - Size - Tamaño - - - Version - Versión - - - Path - Ruta - - - Play Time - Tiempo de Juego - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Haz clic para ver detalles en GitHub - - - Last updated - Última actualización - - - - CheckUpdate - - Auto Updater - Actualizador Automático - - - Error - Error - - - Network error: - Error de red: - - - Error_Github_limit_MSG - El actualizador automático permite hasta 60 comprobaciones de actualización por hora.\nHas alcanzado este límite. Por favor, inténtalo de nuevo más tarde. - - - Failed to parse update information. - Error al analizar la información de actualización. - - - No pre-releases found. - No se encontraron prelanzamientos. - - - Invalid release data. - Datos de versión no válidos. - - - No download URL found for the specified asset. - No se encontró URL de descarga para el activo especificado. - - - Your version is already up to date! - ¡Su versión ya está actualizada! - - - Update Available - Actualización disponible - - - Update Channel - Canal de Actualización - - - Current Version - Versión actual - - - Latest Version - Última versión - - - Do you want to update? - ¿Quieres actualizar? - - - Show Changelog - Mostrar registro de cambios - - - Check for Updates at Startup - Buscar actualizaciones al iniciar - - - Update - Actualizar - - - No - No - - - Hide Changelog - Ocultar registro de cambios - - - Changes - Cambios - - - Network error occurred while trying to access the URL - Se produjo un error de red al intentar acceder a la URL - - - Download Complete - Descarga completa - - - The update has been downloaded, press OK to install. - La actualización se ha descargado, presione Aceptar para instalar. - - - Failed to save the update file at - No se pudo guardar el archivo de actualización en - - - Starting Update... - Iniciando actualización... - - - Failed to create the update script file - No se pudo crear el archivo del script de actualización - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Obteniendo datos de compatibilidad, por favor espera - - - Cancel - Cancelar - - - Loading... - Cargando... - - - Error - Error - - - Unable to update compatibility data! Try again later. - ¡No se pudo actualizar los datos de compatibilidad! Intenta de nuevo más tarde. - - - Unable to open compatibility_data.json for writing. - No se pudo abrir compatibility_data.json para escribir. - - - Unknown - Desconocido - - - Nothing - Nada - - - Boots - Inicia - - - Menus - Menús - - - Ingame - En el juego - - - Playable - Jugable - - + + AboutDialog + + About shadPS4 + Acerca de shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 es un emulador experimental de código abierto para la PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Este software no debe utilizarse para jugar juegos que hayas obtenido ilegalmente. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + No hay imagen disponible + + + Serial: + Número de serie: + + + Version: + Versión: + + + Size: + Tamaño: + + + Select Cheat File: + Seleccionar archivo de trucos: + + + Repository: + Repositorio: + + + Download Cheats + Descargar trucos + + + Delete File + Eliminar archivo + + + No files selected. + No se han seleccionado archivos. + + + You can delete the cheats you don't want after downloading them. + Puedes eliminar los trucos que no quieras una vez descargados. + + + Do you want to delete the selected file?\n%1 + ¿Deseas eliminar el archivo seleccionado?\n%1 + + + Select Patch File: + Seleccionar archivo de parche: + + + Download Patches + Descargar parches + + + Save + Guardar + + + Cheats + Trucos + + + Patches + Parches + + + Error + Error + + + No patch selected. + No se ha seleccionado ningún parche. + + + Unable to open files.json for reading. + No se puede abrir files.json para lectura. + + + No patch file found for the current serial. + No se encontró ningún archivo de parche para el número de serie actual. + + + Unable to open the file for reading. + No se puede abrir el archivo para lectura. + + + Unable to open the file for writing. + No se puede abrir el archivo para escritura. + + + Failed to parse XML: + Error al analizar XML: + + + Success + Éxito + + + Options saved successfully. + Opciones guardadas exitosamente. + + + Invalid Source + Fuente inválida + + + The selected source is invalid. + La fuente seleccionada es inválida. + + + File Exists + El archivo ya existe + + + File already exists. Do you want to replace it? + El archivo ya existe. ¿Deseas reemplazarlo? + + + Failed to save file: + Error al guardar el archivo: + + + Failed to download file: + Error al descargar el archivo: + + + Cheats Not Found + Trucos no encontrados + + + CheatsNotFound_MSG + No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. + + + Cheats Downloaded Successfully + Trucos descargados exitosamente + + + CheatsDownloadedSuccessfully_MSG + Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. + + + Failed to save: + Error al guardar: + + + Failed to download: + Error al descargar: + + + Download Complete + Descarga completa + + + DownloadComplete_MSG + ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. + + + Failed to parse JSON data from HTML. + Error al analizar los datos JSON del HTML. + + + Failed to retrieve HTML page. + Error al recuperar la página HTML. + + + The game is in version: %1 + El juego está en la versión: %1 + + + The downloaded patch only works on version: %1 + El parche descargado solo funciona en la versión: %1 + + + You may need to update your game. + Puede que necesites actualizar tu juego. + + + Incompatibility Notice + Aviso de incompatibilidad + + + Failed to open file: + Error al abrir el archivo: + + + XML ERROR: + ERROR XML: + + + Failed to open files.json for writing + Error al abrir files.json para escritura + + + Author: + Autor: + + + Directory does not exist: + El directorio no existe: + + + Failed to open files.json for reading. + Error al abrir files.json para lectura. + + + Name: + Nombre: + + + Can't apply cheats before the game is started + No se pueden aplicar trucos antes de que se inicie el juego. + + + Close + Cerrar + + + + CheckUpdate + + Auto Updater + Actualizador Automático + + + Error + Error + + + Network error: + Error de red: + + + Error_Github_limit_MSG + El actualizador automático permite hasta 60 comprobaciones de actualización por hora.\nHas alcanzado este límite. Por favor, inténtalo de nuevo más tarde. + + + Failed to parse update information. + Error al analizar la información de actualización. + + + No pre-releases found. + No se encontraron prelanzamientos. + + + Invalid release data. + Datos de versión no válidos. + + + No download URL found for the specified asset. + No se encontró URL de descarga para el activo especificado. + + + Your version is already up to date! + ¡Su versión ya está actualizada! + + + Update Available + Actualización disponible + + + Update Channel + Canal de Actualización + + + Current Version + Versión actual + + + Latest Version + Última versión + + + Do you want to update? + ¿Quieres actualizar? + + + Show Changelog + Mostrar registro de cambios + + + Check for Updates at Startup + Buscar actualizaciones al iniciar + + + Update + Actualizar + + + No + No + + + Hide Changelog + Ocultar registro de cambios + + + Changes + Cambios + + + Network error occurred while trying to access the URL + Se produjo un error de red al intentar acceder a la URL + + + Download Complete + Descarga completa + + + The update has been downloaded, press OK to install. + La actualización se ha descargado, presione Aceptar para instalar. + + + Failed to save the update file at + No se pudo guardar el archivo de actualización en + + + Starting Update... + Iniciando actualización... + + + Failed to create the update script file + No se pudo crear el archivo del script de actualización + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Obteniendo datos de compatibilidad, por favor espera + + + Cancel + Cancelar + + + Loading... + Cargando... + + + Error + Error + + + Unable to update compatibility data! Try again later. + ¡No se pudo actualizar los datos de compatibilidad! Intenta de nuevo más tarde. + + + Unable to open compatibility_data.json for writing. + No se pudo abrir compatibility_data.json para escribir. + + + Unknown + Desconocido + + + Nothing + Nada + + + Boots + Inicia + + + Menus + Menús + + + Ingame + En el juego + + + Playable + Jugable + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Abrir carpeta + + + + GameInfoClass + + Loading game list, please wait :3 + Cargando lista de juegos, por favor espera :3 + + + Cancel + Cancelar + + + Loading... + Cargando... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Elegir carpeta + + + Directory to install games + Carpeta para instalar juegos + + + Browse + Buscar + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Icono + + + Name + Nombre + + + Serial + Numero de serie + + + Compatibility + Compatibility + + + Region + Región + + + Firmware + Firmware + + + Size + Tamaño + + + Version + Versión + + + Path + Ruta + + + Play Time + Tiempo de Juego + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Haz clic para ver detalles en GitHub + + + Last updated + Última actualización + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Crear acceso directo + + + Cheats / Patches + Trucos / Parches + + + SFO Viewer + Vista SFO + + + Trophy Viewer + Ver trofeos + + + Open Folder... + Abrir Carpeta... + + + Open Game Folder + Abrir Carpeta del Juego + + + Open Save Data Folder + Abrir Carpeta de Datos Guardados + + + Open Log Folder + Abrir Carpeta de Registros + + + Copy info... + Copiar información... + + + Copy Name + Copiar nombre + + + Copy Serial + Copiar número de serie + + + Copy All + Copiar todo + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Acceso directo creado + + + Shortcut created successfully! + ¡Acceso directo creado con éxito! + + + Error + Error + + + Error creating shortcut! + ¡Error al crear el acceso directo! + + + Install PKG + Instalar PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Elegir carpeta + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Abrir/Agregar carpeta Elf + + + Install Packages (PKG) + Instalar paquetes (PKG) + + + Boot Game + Iniciar juego + + + Check for Updates + Buscar actualizaciones + + + About shadPS4 + Acerca de shadPS4 + + + Configure... + Configurar... + + + Install application from a .pkg file + Instalar aplicación desde un archivo .pkg + + + Recent Games + Juegos recientes + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Salir + + + Exit shadPS4 + Salir de shadPS4 + + + Exit the application. + Salir de la aplicación. + + + Show Game List + Mostrar lista de juegos + + + Game List Refresh + Actualizar lista de juegos + + + Tiny + Muy pequeño + + + Small + Pequeño + + + Medium + Mediano + + + Large + Grande + + + List View + Vista de lista + + + Grid View + Vista de cuadrícula + + + Elf Viewer + Vista Elf + + + Game Install Directory + Carpeta de instalación de los juegos + + + Download Cheats/Patches + Descargar Trucos / Parches + + + Dump Game List + Volcar lista de juegos + + + PKG Viewer + Vista PKG + + + Search... + Buscar... + + + File + Archivo + + + View + Vista + + + Game List Icons + Iconos de los juegos + + + Game List Mode + Tipo de lista + + + Settings + Configuración + + + Utils + Utilidades + + + Themes + Temas + + + Help + Ayuda + + + Dark + Oscuro + + + Light + Claro + + + Green + Verde + + + Blue + Azul + + + Violet + Violeta + + + toolBar + Barra de herramientas + + + Game List + Lista de juegos + + + * Unsupported Vulkan Version + * Versión de Vulkan no soportada + + + Download Cheats For All Installed Games + Descargar trucos para todos los juegos instalados + + + Download Patches For All Games + Descargar parches para todos los juegos + + + Download Complete + Descarga completa + + + You have downloaded cheats for all the games you have installed. + Has descargado trucos para todos los juegos que tienes instalados. + + + Patches Downloaded Successfully! + ¡Parches descargados exitosamente! + + + All Patches available for all games have been downloaded. + Todos los parches disponibles han sido descargados para todos los juegos. + + + Games: + Juegos: + + + ELF files (*.bin *.elf *.oelf) + Archivos ELF (*.bin *.elf *.oelf) + + + Game Boot + Inicio del juego + + + Only one file can be selected! + ¡Solo se puede seleccionar un archivo! + + + PKG Extraction + Extracción de PKG + + + Patch detected! + ¡Actualización detectada! + + + PKG and Game versions match: + Las versiones de PKG y del juego coinciden: + + + Would you like to overwrite? + ¿Desea sobrescribir? + + + PKG Version %1 is older than installed version: + La versión de PKG %1 es más antigua que la versión instalada: + + + Game is installed: + El juego está instalado: + + + Would you like to install Patch: + ¿Desea instalar la actualización: + + + DLC Installation + Instalación de DLC + + + Would you like to install DLC: %1? + ¿Desea instalar el DLC: %1? + + + DLC already installed: + DLC ya instalado: + + + Game already installed + Juego ya instalado + + + PKG ERROR + ERROR PKG + + + Extracting PKG %1/%2 + Extrayendo PKG %1/%2 + + + Extraction Finished + Extracción terminada + + + Game successfully installed at %1 + Juego instalado exitosamente en %1 + + + File doesn't appear to be a valid PKG file + El archivo parece no ser un archivo PKG válido + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Abrir carpeta + + + Name + Nombre + + + Serial + Numero de serie + + + Installed + + + + Size + Tamaño + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Región + + + Flags + + + + Path + Ruta + + + File + Archivo + + + PKG ERROR + ERROR PKG + + + Unknown + Desconocido + + + Package + + + + + SettingsDialog + + Settings + Configuración + + + General + General + + + System + Sistema + + + Console Language + Idioma de la consola + + + Emulator Language + Idioma del emulador + + + Emulator + Emulador + + + Enable Fullscreen + Habilitar pantalla completa + + + Fullscreen Mode + Modo de Pantalla Completa + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Pestaña predeterminada al abrir la configuración + + + Show Game Size In List + Mostrar Tamaño del Juego en la Lista + + + Show Splash + Mostrar splash + + + Enable Discord Rich Presence + Habilitar Discord Rich Presence + + + Username + Nombre de usuario + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Registro + + + Log Type + Tipo de registro + + + Log Filter + Filtro de registro + + + Open Log Location + Abrir ubicación del registro + + + Input + Entrada + + + Cursor + Cursor + + + Hide Cursor + Ocultar cursor + + + Hide Cursor Idle Timeout + Tiempo de espera para ocultar cursor inactivo + + + s + s + + + Controller + Controlador + + + Back Button Behavior + Comportamiento del botón de retroceso + + + Graphics + Gráficos + + + GUI + Interfaz + + + User + Usuario + + + Graphics Device + Dispositivo gráfico + + + Width + Ancho + + + Height + Alto + + + Vblank Divider + Divisor de Vblank + + + Advanced + Avanzado + + + Enable Shaders Dumping + Habilitar volcado de shaders + + + Enable NULL GPU + Habilitar GPU NULL + + + Paths + Rutas + + + Game Folders + Carpetas de juego + + + Add... + Añadir... + + + Remove + Eliminar + + + Debug + Depuración + + + Enable Debug Dumping + Habilitar volcado de depuración + + + Enable Vulkan Validation Layers + Habilitar capas de validación de Vulkan + + + Enable Vulkan Synchronization Validation + Habilitar validación de sincronización de Vulkan + + + Enable RenderDoc Debugging + Habilitar depuración de RenderDoc + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Actualización + + + Check for Updates at Startup + Buscar actualizaciones al iniciar + + + Always Show Changelog + Mostrar siempre el registro de cambios + + + Update Channel + Canal de Actualización + + + Check for Updates + Verificar actualizaciones + + + GUI Settings + Configuraciones de la Interfaz + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Background Image + Imagen de fondo + + + Show Background Image + Mostrar Imagen de Fondo + + + Opacity + Opacidad + + + Play title music + Reproducir la música de apertura + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Volumen + + + Save + Guardar + + + Apply + Aplicar + + + Restore Defaults + Restaurar Valores Predeterminados + + + Close + Cerrar + + + Point your mouse at an option to display its description. + Coloque el mouse sobre una opción para mostrar su descripción. + + + consoleLanguageGroupBox + Idioma de la Consola:\nEstablece el idioma que utiliza el juego de PS4.\nSe recomienda configurarlo a un idioma que el juego soporte, lo cual varía por región. + + + emulatorLanguageGroupBox + Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. + + + fullscreenCheckBox + Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Mostrar Pantalla de Inicio:\nMuestra la pantalla de inicio del juego (una imagen especial) mientras el juego se está iniciando. + + + discordRPCCheckbox + Habilitar Discord Rich Presence:\nMuestra el ícono del emulador y la información relevante en tu perfil de Discord. + + + userName + Nombre de Usuario:\nEstablece el nombre de usuario de la cuenta de PS4, que puede ser mostrado por algunos juegos. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Tipo de Registro:\nEstablece si sincronizar la salida de la ventana de registro para mejorar el rendimiento. Puede tener efectos adversos en la emulación. + + + logFilter + Filtro de Registro:\nFiltra el registro para imprimir solo información específica.\nEjemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior. + + + updaterGroupBox + Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. + + + GUIBackgroundImageGroupBox + Imagen de fondo:\nControle la opacidad de la imagen de fondo del juego. + + + GUIMusicGroupBox + Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse. + + + idleTimeoutGroupBox + Establezca un tiempo para que el mouse desaparezca después de estar inactivo. + + + backButtonBehaviorGroupBox + Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Nunca + + + Idle + Inactivo + + + Always + Siempre + + + Touchpad Left + Touchpad Izquierda + + + Touchpad Right + Touchpad Derecha + + + Touchpad Center + Centro del Touchpad + + + None + Ninguno + + + graphicsAdapterGroupBox + Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona "Auto Select" para determinarla automáticamente. + + + resolutionLayout + Anchura/Altura:\nEstablece el tamaño de la ventana del emulador al iniciar, que se puede redimensionar durante el juego.\nEsto es diferente de la resolución en el juego. + + + heightDivider + Divisor de Vblank:\nLa tasa de cuadros a la que se refresca el emulador se multiplica por este número. Cambiar esto puede tener efectos adversos, como aumentar la velocidad del juego, o romper la funcionalidad crítica del juego que no espera que esto cambie. + + + dumpShadersCheckBox + Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. + + + nullGpuCheckBox + Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica. + + + gameFoldersBox + Carpetas de Juegos:\nLa lista de carpetas para verificar los juegos instalados. + + + addFolderButton + Añadir:\nAgregar una carpeta a la lista. + + + removeFolderButton + Eliminar:\nEliminar una carpeta de la lista. + + + debugDump + Habilitar la Volcadura de Depuración:\nGuarda los símbolos de importación y exportación y la información del encabezado del archivo del programa de PS4 que se está ejecutando actualmente en un directorio. + + + vkValidationCheckBox + Habilitar Capas de Validación de Vulkan:\nHabilita un sistema que valida el estado del renderizador de Vulkan y registra información sobre su estado interno. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. + + + vkSyncValidationCheckBox + Habilitar Validación de Sincronización de Vulkan:\nHabilita un sistema que valida el tiempo de las tareas de renderizado de Vulkan. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. + + + rdocCheckBox + Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Buscar + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Carpeta para instalar juegos + + + Directory to save data + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Vista de trofeos + + diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 3569e9adc..81ff8e901 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - درباره ShadPS4 - - - shadPS4 - ShadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - یک شبیه ساز متن باز برای پلی استیشن 4 است. - - - This software should not be used to play games you have not legally obtained. - این برنامه نباید برای بازی هایی که شما به صورت غیرقانونی به دست آوردید استفاده شود. - - - - ElfViewer - - Open Folder - فولدر را بازکن - - - - GameInfoClass - - Loading game list, please wait :3 - درحال بارگیری لیست بازی ها,لطفا کمی صبرکنید :3 - - - Cancel - لغو - - - Loading... - ...درحال بارگیری - - - - InstallDirSelect - - shadPS4 - Choose directory - ShadPS4 - انتخاب محل نصب بازی - - - Select which directory you want to install to. - محلی را که می‌خواهید در آن نصب شود، انتخاب کنید. - - - - GameInstallDialog - - shadPS4 - Choose directory - ShadPS4 - انتخاب محل نصب بازی - - - Directory to install games - محل نصب بازی ها - - - Browse - انتخاب دستی - - - Error - ارور - - - The value for location to install games is not valid. - .مکان داده شده برای نصب بازی درست نمی باشد - - - - GuiContextMenus - - Create Shortcut - ایجاد میانبر - - - Cheats / Patches - چیت/پچ ها - - - SFO Viewer - SFO مشاهده - - - Trophy Viewer - مشاهده جوایز - - - Open Folder... - باز کردن پوشه... - - - Open Game Folder - باز کردن پوشه بازی - - - Open Save Data Folder - پوشه ذخیره داده را باز کنید - - - Open Log Folder - باز کردن پوشه لاگ - - - Copy info... - ...کپی کردن اطلاعات - - - Copy Name - کپی کردن نام - - - Copy Serial - کپی کردن سریال - - - Copy All - کپی کردن تمامی مقادیر - - - Delete... - حذف... - - - Delete Game - حذف بازی - - - Delete Update - حذف به‌روزرسانی - - - Delete DLC - حذف محتوای اضافی (DLC) - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - ایجاد میانبر - - - Shortcut created successfully! - میانبر با موفقیت ساخته شد! - - - Error - ارور - - - Error creating shortcut! - مشکلی در هنگام ساخت میانبر بوجود آمد! - - - Install PKG - نصب PKG - - - Game - بازی - - - requiresEnableSeparateUpdateFolder_MSG - این قابلیت نیازمند فعال‌سازی گزینه تنظیمات «ایجاد پوشه جداگانه برای به‌روزرسانی» است. در صورت تمایل به استفاده از این قابلیت، لطفاً آن را فعال کنید. - - - This game has no update to delete! - این بازی به‌روزرسانی‌ای برای حذف ندارد! - - - Update - به‌روزرسانی - - - This game has no DLC to delete! - این بازی محتوای اضافی (DLC) برای حذف ندارد! - - - DLC - DLC - - - Delete %1 - حذف %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - ELF بازکردن/ساختن پوشه - - - Install Packages (PKG) - نصب بسته (PKG) - - - Boot Game - اجرای بازی - - - Check for Updates - به روز رسانی را بررسی کنید - - - About shadPS4 - ShadPS4 درباره - - - Configure... - ...تنظیمات - - - Install application from a .pkg file - .PKG نصب بازی از فایل - - - Recent Games - بازی های اخیر - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - خروج - - - Exit shadPS4 - ShadPS4 بستن - - - Exit the application. - بستن برنامه - - - Show Game List - نشان دادن بازی ها - - - Game List Refresh - رفرش لیست بازی ها - - - Tiny - کوچک ترین - - - Small - کوچک - - - Medium - متوسط - - - Large - بزرگ - - - List View - نمایش لیست - - - Grid View - شبکه ای (چهارخونه) - - - Elf Viewer - مشاهده گر Elf - - - Game Install Directory - محل نصب بازی - - - Download Cheats/Patches - دانلود چیت/پچ - - - Dump Game List - استخراج لیست بازی ها - - - PKG Viewer - PKG مشاهده گر - - - Search... - جست و جو... - - - File - فایل - - - View - شخصی سازی - - - Game List Icons - آیکون ها - - - Game List Mode - حالت نمایش لیست بازی ها - - - Settings - تنظیمات - - - Utils - ابزارها - - - Themes - تم ها - - - Help - کمک - - - Dark - تیره - - - Light - روشن - - - Green - سبز - - - Blue - آبی - - - Violet - بنفش - - - toolBar - نوار ابزار - - - Game List - لیست بازی - - - * Unsupported Vulkan Version - شما پشتیبانی نمیشود Vulkan ورژن * - - - Download Cheats For All Installed Games - دانلود چیت برای همه بازی ها - - - Download Patches For All Games - دانلود پچ برای همه بازی ها - - - Download Complete - دانلود کامل شد✅ - - - You have downloaded cheats for all the games you have installed. - چیت برای همه بازی های شما دانلودشد✅ - - - Patches Downloaded Successfully! - پچ ها با موفقیت دانلود شد✅ - - - All Patches available for all games have been downloaded. - ✅تمام پچ های موجود برای همه بازی های شما دانلود شد - - - Games: - بازی ها: - - - PKG File (*.PKG) - PKG فایل (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF فایل های (*.bin *.elf *.oelf) - - - Game Boot - اجرای بازی - - - Only one file can be selected! - فقط یک فایل انتخاب کنید! - - - PKG Extraction - PKG استخراج فایل - - - Patch detected! - پچ شناسایی شد! - - - PKG and Game versions match: - و نسخه بازی همخوانی دارد PKG فایل: - - - Would you like to overwrite? - آیا مایل به جایگزینی فایل هستید؟ - - - PKG Version %1 is older than installed version: - نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: - - - Game is installed: - بازی نصب شد: - - - Would you like to install Patch: - آیا مایل به نصب پچ هستید: - - - DLC Installation - نصب DLC - - - Would you like to install DLC: %1? - آیا مایل به نصب DLC هستید: %1 - - - DLC already installed: - قبلا نصب شده DLC این: - - - Game already installed - این بازی قبلا نصب شده - - - PKG is a patch, please install the game first! - فایل انتخاب شده یک پچ است, لطفا اول بازی را نصب کنید - - - PKG ERROR - PKG ارور فایل - - - Extracting PKG %1/%2 - درحال استخراج PKG %1/%2 - - - Extraction Finished - استخراج به پایان رسید - - - Game successfully installed at %1 - بازی با موفقیت در %1 نصب شد - - - File doesn't appear to be a valid PKG file - این فایل یک PKG درست به نظر نمی آید - - - - PKGViewer - - Open Folder - بازکردن پوشه - - - - TrophyViewer - - Trophy Viewer - مشاهده جوایز - - - - SettingsDialog - - Settings - تنظیمات - - - General - عمومی - - - System - سیستم - - - Console Language - زبان کنسول - - - Emulator Language - زبان شبیه ساز - - - Emulator - شبیه ساز - - - Enable Fullscreen - تمام صفحه - - - Fullscreen Mode - حالت تمام صفحه - - - Enable Separate Update Folder - فعال‌سازی پوشه جداگانه برای به‌روزرسانی - - - Default tab when opening settings - زبان پیش‌فرض هنگام باز کردن تنظیمات - - - Show Game Size In List - نمایش اندازه بازی در لیست - - - Show Splash - Splash نمایش - - - Is PS4 Pro - PS4 Pro حالت - - - Enable Discord Rich Presence - Discord Rich Presence را فعال کنید - - - Username - نام کاربری - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log نوع - - - Log Filter - Log فیلتر - - - Open Log Location - باز کردن مکان گزارش - - - Input - ورودی - - - Cursor - نشانگر - - - Hide Cursor - پنهان کردن نشانگر - - - Hide Cursor Idle Timeout - مخفی کردن زمان توقف مکان نما - - - s - s - - - Controller - دسته بازی - - - Back Button Behavior - رفتار دکمه بازگشت - - - Graphics - گرافیک - - - GUI - رابط کاربری - - - User - کاربر - - - Graphics Device - کارت گرافیک مورداستفاده - - - Width - عرض - - - Height - طول - - - Vblank Divider - تقسیم‌کننده Vblank - - - Advanced - ...بیشتر - - - Enable Shaders Dumping - فعال‌سازی ذخیره‌سازی شیدرها - - - Enable NULL GPU - NULL GPU فعال کردن - - - Paths - مسیرها - - - Game Folders - پوشه های بازی - - - Add... - افزودن... - - - Remove - حذف - - - Debug - دیباگ - - - Enable Debug Dumping - Debug Dumping - - - Enable Vulkan Validation Layers - Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - به‌روزرسانی - - - Check for Updates at Startup - بررسی به‌روزرسانی‌ها در زمان راه‌اندازی - - - Always Show Changelog - نمایش دائم تاریخچه تغییرات - - - Update Channel - کانال به‌روزرسانی - - - Check for Updates - بررسی به‌روزرسانی‌ها - - - GUI Settings - تنظیمات رابط کاربری - - - Title Music - Title Music - - - Disable Trophy Pop-ups - غیرفعال کردن نمایش جوایز - - - Play title music - پخش موسیقی عنوان - - - Update Compatibility Database On Startup - به‌روزرسانی پایگاه داده سازگاری هنگام راه‌اندازی - - - Game Compatibility - سازگاری بازی با سیستم - - - Display Compatibility Data - نمایش داده‌های سازگاری - - - Update Compatibility Database - به‌روزرسانی پایگاه داده سازگاری - - - Volume - صدا - - - Audio Backend - Audio Backend - - - Save - ذخیره - - - Apply - اعمال - - - Restore Defaults - بازیابی پیش فرض ها - - - Close - بستن - - - Point your mouse at an option to display its description. - ماوس خود را بر روی یک گزینه قرار دهید تا توضیحات آن نمایش داده شود. - - - consoleLanguageGroupBox - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - - - emulatorLanguageGroupBox - زبان شبیه‌ساز:\nزبان رابط کاربری شبیه‌ساز را انتخاب می‌کند. - - - fullscreenCheckBox - فعال‌سازی تمام صفحه:\nپنجره بازی را به‌طور خودکار به حالت تمام صفحه در می‌آورد.\nبرای تغییر این حالت می‌توانید کلید F11 را فشار دهید. - - - separateUpdatesCheckBox - فعال‌سازی پوشه جداگانه برای به‌روزرسانی:\nامکان نصب به‌روزرسانی‌های بازی در یک پوشه جداگانه برای مدیریت راحت‌تر را فراهم می‌کند. - - - showSplashCheckBox - نمایش صفحه شروع:\nصفحه شروع بازی (تصویری ویژه) را هنگام بارگذاری بازی نمایش می‌دهد. - - - ps4proCheckBox - حالت PS4 Pro:\nشبیه‌ساز را به‌عنوان PS4 Pro شبیه‌سازی می‌کند که ممکن است ویژگی‌های ویژه‌ای را در بازی‌های پشتیبانی‌شده فعال کند. - - - discordRPCCheckbox - فعال کردن Discord Rich Presence:\nآیکون شبیه ساز و اطلاعات مربوطه را در نمایه Discord شما نمایش می دهد. - - - userName - نام کاربری:\nنام کاربری حساب PS4 را تنظیم می‌کند که ممکن است توسط برخی بازی‌ها نمایش داده شود. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - نوع لاگ:\nتنظیم می‌کند که آیا خروجی پنجره لاگ برای بهبود عملکرد همگام‌سازی شود یا خیر. این ممکن است تأثیر منفی بر شبیه‌سازی داشته باشد. - - - logFilter - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - - - updaterGroupBox - به‌روزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر می‌شوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست‌ شده‌تر هستند.\nشبانه: نسخه‌های توسعه‌ای که شامل جدیدترین ویژگی‌ها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند. - - - GUIMusicGroupBox - پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال می‌کند. - - - disableTrophycheckBox - غیرفعال کردن نمایش جوایز:\nنمایش اعلان‌های جوایز درون بازی را غیرفعال می‌کند. پیشرفت جوایز همچنان از طریق نمایشگر جوایز (کلیک راست روی بازی در پنجره اصلی) قابل پیگیری است.. - - - hideCursorGroupBox - پنهان کردن نشانگر:\nانتخاب کنید که نشانگر چه زمانی ناپدید شود:\nهرگز: شما همیشه ماوس را خواهید دید.\nغیرفعال: زمانی را برای ناپدید شدن بعد از غیرفعالی تعیین کنید.\nهمیشه: شما هرگز ماوس را نخواهید دید. - - - idleTimeoutGroupBox - زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید. - - - backButtonBehaviorGroupBox - رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند. - - - enableCompatibilityCheckBox - نمایش داده‌های سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش می‌دهد. برای دریافت اطلاعات به‌روز، گزینه "به‌روزرسانی سازگاری هنگام راه‌اندازی" را فعال کنید. - - - checkCompatibilityOnStartupCheckBox - به‌روزرسانی سازگاری هنگام راه‌اندازی:\nبه‌طور خودکار پایگاه داده سازگاری را هنگام راه‌اندازی ShadPS4 به‌روزرسانی می‌کند. - - - updateCompatibilityButton - به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. - - - Never - هرگز - - - Idle - بیکار - - - Always - همیشه - - - Touchpad Left - صفحه لمسی سمت چپ - - - Touchpad Right - صفحه لمسی سمت راست - - - Touchpad Center - مرکز صفحه لمسی - - - None - هیچ کدام - - - graphicsAdapterGroupBox - دستگاه گرافیکی:\nدر سیستم‌های با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیه‌ساز از آن استفاده می‌کند را انتخاب کنید، یا گزینه "انتخاب خودکار" را انتخاب کنید تا به طور خودکار تعیین شود. - - - resolutionLayout - عرض/ارتفاع:\nاندازه پنجره شبیه‌ساز را در هنگام راه‌اندازی تنظیم می‌کند، که در حین بازی قابل تغییر اندازه است.\nاین با وضوح داخل بازی متفاوت است. - - - heightDivider - تقسیم‌کننده Vblank:\nمیزان فریم ریت که شبیه‌ساز با آن به‌روزرسانی می‌شود، در این عدد ضرب می‌شود. تغییر این مقدار ممکن است تأثیرات منفی داشته باشد، مانند افزایش سرعت بازی یا خراب شدن عملکردهای حیاتی بازی که انتظار تغییر آن را ندارند! - - - dumpShadersCheckBox - فعال‌سازی ذخیره‌سازی شیدرها:\nبه‌منظور اشکال‌زدایی فنی، شیدرهای بازی را هنگام رندر شدن در یک پوشه ذخیره می‌کند. - - - nullGpuCheckBox - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - - - gameFoldersBox - پوشه های بازی:\nلیست پوشه هایی که باید بازی های نصب شده را بررسی کنید. - - - addFolderButton - اضافه کردن:\nیک پوشه به لیست اضافه کنید. - - - removeFolderButton - حذف:\nیک پوشه را از لیست حذف کنید. - - - debugDump - فعال‌سازی ذخیره‌سازی دیباگ:\nنمادهای import و export و اطلاعات هدر فایل برنامه در حال اجرای PS4 را در یک پوشه ذخیره می‌کند. - - - vkValidationCheckBox - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - - - vkSyncValidationCheckBox - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - - - rdocCheckBox - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - چیت / پچ برای - - - defaultTextEdit_MSG - defaultTextEdit_MSG - - - No Image Available - تصویری موجود نمی باشد - - - Serial: - سریال: - - - Version: - نسخه: - - - Size: - حجم: - - - Select Cheat File: - فایل چیت را انتخاب کنید: - - - Repository: - :منبع - - - Download Cheats - دانلود چیت ها - - - Delete File - حذف فایل - - - No files selected. - فایلی انتخاب نشده. - - - You can delete the cheats you don't want after downloading them. - شما میتوانید بعد از دانلود چیت هایی که نمیخواهید را پاک کنید - - - Do you want to delete the selected file?\n%1 - آیا میخواهید فایل های انتخاب شده را پاک کنید؟ \n%1 - - - Select Patch File: - فایل پچ را انتخاب کنید - - - Download Patches - دانلود کردن پچ ها - - - Save - ذخیره - - - Cheats - چیت ها - - - Patches - پچ ها - - - Error - ارور - - - No patch selected. - هیچ پچ انتخاب نشده - - - Unable to open files.json for reading. - .json مشکل در خواندن فایل - - - No patch file found for the current serial. - هیچ فایل پچ برای سریال بازی شما پیدا نشد. - - - Unable to open the file for reading. - خطا در خواندن فایل - - - Unable to open the file for writing. - خطا در نوشتن فایل - - - Failed to parse XML: - انجام نشد XML تجزیه فایل: - - - Success - عملیات موفق بود - - - Options saved successfully. - تغییرات با موفقیت ذخیره شد✅ - - - Invalid Source - منبع نامعتبر❌ - - - The selected source is invalid. - منبع انتخاب شده نامعتبر است - - - File Exists - فایل وجود دارد - - - File already exists. Do you want to replace it? - فایل از قبل وجود دارد. آیا می خواهید آن را جایگزین کنید؟ - - - Failed to save file: - ذخیره فایل موفقیت آمیز نبود: - - - Failed to download file: - خطا در دانلود فایل: - - - Cheats Not Found - چیت یافت نشد - - - CheatsNotFound_MSG - متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید. - - - Cheats Downloaded Successfully - دانلود چیت ها موفقیت آمیز بود✅ - - - CheatsDownloadedSuccessfully_MSG - تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید. - - - Failed to save: - خطا در ذخیره اطلاعات: - - - Failed to download: - خطا در دانلود❌ - - - Download Complete - دانلود کامل شد - - - DownloadComplete_MSG - پچ ها با موفقیت بارگیری شدند! تمام وصله های موجود برای همه بازی ها دانلود شده اند، نیازی به دانلود جداگانه آنها برای هر بازی نیست، همانطور که در Cheats اتفاق می افتد. اگر پچ ظاهر نشد، ممکن است برای سریال و نسخه خاصی از بازی وجود نداشته باشد. - - - Failed to parse JSON data from HTML. - HTML از JSON خطا در تجزیه اطلاعات. - - - Failed to retrieve HTML page. - HTML خطا دربازیابی صفحه - - - The game is in version: %1 - بازی در نسخه: %1 است - - - The downloaded patch only works on version: %1 - وصله دانلود شده فقط در نسخه: %1 کار می کند - - - You may need to update your game. - شاید لازم باشد بازی خود را به روز کنید. - - - Incompatibility Notice - اطلاعیه عدم سازگاری - - - Failed to open file: - خطا در اجرای فایل: - - - XML ERROR: - XML ERROR: - - - Failed to open files.json for writing - .json خطا در نوشتن فایل - - - Author: - تولید کننده: - - - Directory does not exist: - پوشه وجود ندارد: - - - Failed to open files.json for reading. - .json خطا در خواندن فایل - - - Name: - نام: - - - Can't apply cheats before the game is started - قبل از شروع بازی نمی توانید تقلب ها را اعمال کنید. - - - - GameListFrame - - Icon - آیکون - - - Name - نام - - - Serial - سریال - - - Compatibility - سازگاری - - - Region - منطقه - - - Firmware - فریم‌ور - - - Size - اندازه - - - Version - نسخه - - - Path - مسیر - - - Play Time - زمان بازی - - - Never Played - هرگز بازی نشده - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - سازگاری تست نشده است - - - Game does not initialize properly / crashes the emulator - بازی به درستی راه‌اندازی نمی‌شود / شبیه‌ساز کرش می‌کند - - - Game boots, but only displays a blank screen - بازی اجرا می‌شود، اما فقط یک صفحه خالی نمایش داده می‌شود - - - Game displays an image but does not go past the menu - بازی تصویری نمایش می‌دهد، اما از منو فراتر نمی‌رود - - - Game has game-breaking glitches or unplayable performance - بازی دارای اشکالات بحرانی یا عملکرد غیرقابل بازی است - - - Game can be completed with playable performance and no major glitches - بازی با عملکرد قابل قبول و بدون اشکالات عمده قابل بازی است. - - - Click to see details on github - برای مشاهده جزئیات در GitHub کلیک کنید - - - Last updated - آخرین به‌روزرسانی - - - - CheckUpdate - - Auto Updater - به‌روزرسانی خودکار - - - Error - خطا - - - Network error: - خطای شبکه: - - - Error_Github_limit_MSG - به‌روزرسانی خودکار حداکثر ۶۰ بررسی به‌روزرسانی در ساعت را مجاز می‌داند.\nشما به این محدودیت رسیده‌اید. لطفاً بعداً دوباره امتحان کنید. - - - Failed to parse update information. - خطا در تجزیه اطلاعات بهروزرسانی. - - - No pre-releases found. - هیچ پیش انتشاری یافت نشد. - - - Invalid release data. - داده های نسخه نامعتبر است. - - - No download URL found for the specified asset. - هیچ URL دانلودی برای دارایی مشخص شده پیدا نشد. - - - Your version is already up to date! - نسخه شما اکنون به روز شده است! - - - Update Available - به روز رسانی موجود است - - - Update Channel - کانال به‌روزرسانی - - - Current Version - نسخه فعلی - - - Latest Version - جدیدترین نسخه - - - Do you want to update? - آیا می خواهید به روز رسانی کنید؟ - - - Show Changelog - نمایش تغییرات - - - Check for Updates at Startup - بررسی به‌روزرسانی هنگام شروع - - - Update - به روز رسانی - - - No - خیر - - - Hide Changelog - مخفی کردن تغییرات - - - Changes - تغییرات - - - Network error occurred while trying to access the URL - در حین تلاش برای دسترسی به URL خطای شبکه رخ داد - - - Download Complete - دانلود کامل شد - - - The update has been downloaded, press OK to install. - به روز رسانی دانلود شده است، برای نصب OK را فشار دهید. - - - Failed to save the update file at - فایل به روز رسانی ذخیره نشد - - - Starting Update... - شروع به روز رسانی... - - - Failed to create the update script file - فایل اسکریپت به روز رسانی ایجاد نشد - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - در حال بارگذاری داده‌های سازگاری، لطفاً صبر کنید - - - Cancel - لغو - - - Loading... - در حال بارگذاری... - - - Error - خطا - - - Unable to update compatibility data! Try again later. - ناتوان از بروزرسانی داده‌های سازگاری! لطفاً بعداً دوباره تلاش کنید. - - - Unable to open compatibility_data.json for writing. - امکان باز کردن compatibility_data.json برای نوشتن وجود ندارد. - - - Unknown - ناشناخته - - - Nothing - هیچ چیز - - - Boots - چکمه‌ها - - - Menus - منوها - - - Ingame - داخل بازی - - - Playable - قابل بازی - - + + AboutDialog + + About shadPS4 + درباره ShadPS4 + + + shadPS4 + ShadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + یک شبیه ساز متن باز برای پلی استیشن 4 است. + + + This software should not be used to play games you have not legally obtained. + این برنامه نباید برای بازی هایی که شما به صورت غیرقانونی به دست آوردید استفاده شود. + + + + CheatsPatches + + Cheats / Patches for + چیت / پچ برای + + + defaultTextEdit_MSG + defaultTextEdit_MSG + + + No Image Available + تصویری موجود نمی باشد + + + Serial: + سریال: + + + Version: + نسخه: + + + Size: + حجم: + + + Select Cheat File: + فایل چیت را انتخاب کنید: + + + Repository: + :منبع + + + Download Cheats + دانلود چیت ها + + + Delete File + حذف فایل + + + No files selected. + فایلی انتخاب نشده. + + + You can delete the cheats you don't want after downloading them. + شما میتوانید بعد از دانلود چیت هایی که نمیخواهید را پاک کنید + + + Do you want to delete the selected file?\n%1 + آیا میخواهید فایل های انتخاب شده را پاک کنید؟ \n%1 + + + Select Patch File: + فایل پچ را انتخاب کنید + + + Download Patches + دانلود کردن پچ ها + + + Save + ذخیره + + + Cheats + چیت ها + + + Patches + پچ ها + + + Error + ارور + + + No patch selected. + هیچ پچ انتخاب نشده + + + Unable to open files.json for reading. + .json مشکل در خواندن فایل + + + No patch file found for the current serial. + هیچ فایل پچ برای سریال بازی شما پیدا نشد. + + + Unable to open the file for reading. + خطا در خواندن فایل + + + Unable to open the file for writing. + خطا در نوشتن فایل + + + Failed to parse XML: + انجام نشد XML تجزیه فایل: + + + Success + عملیات موفق بود + + + Options saved successfully. + تغییرات با موفقیت ذخیره شد✅ + + + Invalid Source + منبع نامعتبر❌ + + + The selected source is invalid. + منبع انتخاب شده نامعتبر است + + + File Exists + فایل وجود دارد + + + File already exists. Do you want to replace it? + فایل از قبل وجود دارد. آیا می خواهید آن را جایگزین کنید؟ + + + Failed to save file: + ذخیره فایل موفقیت آمیز نبود: + + + Failed to download file: + خطا در دانلود فایل: + + + Cheats Not Found + چیت یافت نشد + + + CheatsNotFound_MSG + متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید. + + + Cheats Downloaded Successfully + دانلود چیت ها موفقیت آمیز بود✅ + + + CheatsDownloadedSuccessfully_MSG + تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید. + + + Failed to save: + خطا در ذخیره اطلاعات: + + + Failed to download: + خطا در دانلود❌ + + + Download Complete + دانلود کامل شد + + + DownloadComplete_MSG + پچ ها با موفقیت بارگیری شدند! تمام وصله های موجود برای همه بازی ها دانلود شده اند، نیازی به دانلود جداگانه آنها برای هر بازی نیست، همانطور که در Cheats اتفاق می افتد. اگر پچ ظاهر نشد، ممکن است برای سریال و نسخه خاصی از بازی وجود نداشته باشد. + + + Failed to parse JSON data from HTML. + HTML از JSON خطا در تجزیه اطلاعات. + + + Failed to retrieve HTML page. + HTML خطا دربازیابی صفحه + + + The game is in version: %1 + بازی در نسخه: %1 است + + + The downloaded patch only works on version: %1 + وصله دانلود شده فقط در نسخه: %1 کار می کند + + + You may need to update your game. + شاید لازم باشد بازی خود را به روز کنید. + + + Incompatibility Notice + اطلاعیه عدم سازگاری + + + Failed to open file: + خطا در اجرای فایل: + + + XML ERROR: + XML ERROR: + + + Failed to open files.json for writing + .json خطا در نوشتن فایل + + + Author: + تولید کننده: + + + Directory does not exist: + پوشه وجود ندارد: + + + Failed to open files.json for reading. + .json خطا در خواندن فایل + + + Name: + نام: + + + Can't apply cheats before the game is started + قبل از شروع بازی نمی توانید تقلب ها را اعمال کنید. + + + Close + بستن + + + + CheckUpdate + + Auto Updater + به‌روزرسانی خودکار + + + Error + خطا + + + Network error: + خطای شبکه: + + + Error_Github_limit_MSG + به‌روزرسانی خودکار حداکثر ۶۰ بررسی به‌روزرسانی در ساعت را مجاز می‌داند.\nشما به این محدودیت رسیده‌اید. لطفاً بعداً دوباره امتحان کنید. + + + Failed to parse update information. + خطا در تجزیه اطلاعات بهروزرسانی. + + + No pre-releases found. + هیچ پیش انتشاری یافت نشد. + + + Invalid release data. + داده های نسخه نامعتبر است. + + + No download URL found for the specified asset. + هیچ URL دانلودی برای دارایی مشخص شده پیدا نشد. + + + Your version is already up to date! + نسخه شما اکنون به روز شده است! + + + Update Available + به روز رسانی موجود است + + + Update Channel + کانال به‌روزرسانی + + + Current Version + نسخه فعلی + + + Latest Version + جدیدترین نسخه + + + Do you want to update? + آیا می خواهید به روز رسانی کنید؟ + + + Show Changelog + نمایش تغییرات + + + Check for Updates at Startup + بررسی به‌روزرسانی هنگام شروع + + + Update + به روز رسانی + + + No + خیر + + + Hide Changelog + مخفی کردن تغییرات + + + Changes + تغییرات + + + Network error occurred while trying to access the URL + در حین تلاش برای دسترسی به URL خطای شبکه رخ داد + + + Download Complete + دانلود کامل شد + + + The update has been downloaded, press OK to install. + به روز رسانی دانلود شده است، برای نصب OK را فشار دهید. + + + Failed to save the update file at + فایل به روز رسانی ذخیره نشد + + + Starting Update... + شروع به روز رسانی... + + + Failed to create the update script file + فایل اسکریپت به روز رسانی ایجاد نشد + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + در حال بارگذاری داده‌های سازگاری، لطفاً صبر کنید + + + Cancel + لغو + + + Loading... + در حال بارگذاری... + + + Error + خطا + + + Unable to update compatibility data! Try again later. + ناتوان از بروزرسانی داده‌های سازگاری! لطفاً بعداً دوباره تلاش کنید. + + + Unable to open compatibility_data.json for writing. + امکان باز کردن compatibility_data.json برای نوشتن وجود ندارد. + + + Unknown + ناشناخته + + + Nothing + هیچ چیز + + + Boots + چکمه‌ها + + + Menus + منوها + + + Ingame + داخل بازی + + + Playable + قابل بازی + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + فولدر را بازکن + + + + GameInfoClass + + Loading game list, please wait :3 + درحال بارگیری لیست بازی ها,لطفا کمی صبرکنید :3 + + + Cancel + لغو + + + Loading... + ...درحال بارگیری + + + + GameInstallDialog + + shadPS4 - Choose directory + ShadPS4 - انتخاب محل نصب بازی + + + Directory to install games + محل نصب بازی ها + + + Browse + انتخاب دستی + + + Error + ارور + + + Directory to install DLC + + + + + GameListFrame + + Icon + آیکون + + + Name + نام + + + Serial + سریال + + + Compatibility + سازگاری + + + Region + منطقه + + + Firmware + فریم‌ور + + + Size + اندازه + + + Version + نسخه + + + Path + مسیر + + + Play Time + زمان بازی + + + Never Played + هرگز بازی نشده + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + سازگاری تست نشده است + + + Game does not initialize properly / crashes the emulator + بازی به درستی راه‌اندازی نمی‌شود / شبیه‌ساز کرش می‌کند + + + Game boots, but only displays a blank screen + بازی اجرا می‌شود، اما فقط یک صفحه خالی نمایش داده می‌شود + + + Game displays an image but does not go past the menu + بازی تصویری نمایش می‌دهد، اما از منو فراتر نمی‌رود + + + Game has game-breaking glitches or unplayable performance + بازی دارای اشکالات بحرانی یا عملکرد غیرقابل بازی است + + + Game can be completed with playable performance and no major glitches + بازی با عملکرد قابل قبول و بدون اشکالات عمده قابل بازی است. + + + Click to see details on github + برای مشاهده جزئیات در GitHub کلیک کنید + + + Last updated + آخرین به‌روزرسانی + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + ایجاد میانبر + + + Cheats / Patches + چیت/پچ ها + + + SFO Viewer + SFO مشاهده + + + Trophy Viewer + مشاهده جوایز + + + Open Folder... + باز کردن پوشه... + + + Open Game Folder + باز کردن پوشه بازی + + + Open Save Data Folder + پوشه ذخیره داده را باز کنید + + + Open Log Folder + باز کردن پوشه لاگ + + + Copy info... + ...کپی کردن اطلاعات + + + Copy Name + کپی کردن نام + + + Copy Serial + کپی کردن سریال + + + Copy All + کپی کردن تمامی مقادیر + + + Delete... + حذف... + + + Delete Game + حذف بازی + + + Delete Update + حذف به‌روزرسانی + + + Delete DLC + حذف محتوای اضافی (DLC) + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + ایجاد میانبر + + + Shortcut created successfully! + میانبر با موفقیت ساخته شد! + + + Error + ارور + + + Error creating shortcut! + مشکلی در هنگام ساخت میانبر بوجود آمد! + + + Install PKG + نصب PKG + + + Game + بازی + + + This game has no update to delete! + این بازی به‌روزرسانی‌ای برای حذف ندارد! + + + Update + به‌روزرسانی + + + This game has no DLC to delete! + این بازی محتوای اضافی (DLC) برای حذف ندارد! + + + DLC + DLC + + + Delete %1 + حذف %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + ShadPS4 - انتخاب محل نصب بازی + + + Select which directory you want to install to. + محلی را که می‌خواهید در آن نصب شود، انتخاب کنید. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + ELF بازکردن/ساختن پوشه + + + Install Packages (PKG) + نصب بسته (PKG) + + + Boot Game + اجرای بازی + + + Check for Updates + به روز رسانی را بررسی کنید + + + About shadPS4 + ShadPS4 درباره + + + Configure... + ...تنظیمات + + + Install application from a .pkg file + .PKG نصب بازی از فایل + + + Recent Games + بازی های اخیر + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + خروج + + + Exit shadPS4 + ShadPS4 بستن + + + Exit the application. + بستن برنامه + + + Show Game List + نشان دادن بازی ها + + + Game List Refresh + رفرش لیست بازی ها + + + Tiny + کوچک ترین + + + Small + کوچک + + + Medium + متوسط + + + Large + بزرگ + + + List View + نمایش لیست + + + Grid View + شبکه ای (چهارخونه) + + + Elf Viewer + مشاهده گر Elf + + + Game Install Directory + محل نصب بازی + + + Download Cheats/Patches + دانلود چیت/پچ + + + Dump Game List + استخراج لیست بازی ها + + + PKG Viewer + PKG مشاهده گر + + + Search... + جست و جو... + + + File + فایل + + + View + شخصی سازی + + + Game List Icons + آیکون ها + + + Game List Mode + حالت نمایش لیست بازی ها + + + Settings + تنظیمات + + + Utils + ابزارها + + + Themes + تم ها + + + Help + کمک + + + Dark + تیره + + + Light + روشن + + + Green + سبز + + + Blue + آبی + + + Violet + بنفش + + + toolBar + نوار ابزار + + + Game List + لیست بازی + + + * Unsupported Vulkan Version + شما پشتیبانی نمیشود Vulkan ورژن * + + + Download Cheats For All Installed Games + دانلود چیت برای همه بازی ها + + + Download Patches For All Games + دانلود پچ برای همه بازی ها + + + Download Complete + دانلود کامل شد✅ + + + You have downloaded cheats for all the games you have installed. + چیت برای همه بازی های شما دانلودشد✅ + + + Patches Downloaded Successfully! + پچ ها با موفقیت دانلود شد✅ + + + All Patches available for all games have been downloaded. + ✅تمام پچ های موجود برای همه بازی های شما دانلود شد + + + Games: + بازی ها: + + + ELF files (*.bin *.elf *.oelf) + ELF فایل های (*.bin *.elf *.oelf) + + + Game Boot + اجرای بازی + + + Only one file can be selected! + فقط یک فایل انتخاب کنید! + + + PKG Extraction + PKG استخراج فایل + + + Patch detected! + پچ شناسایی شد! + + + PKG and Game versions match: + و نسخه بازی همخوانی دارد PKG فایل: + + + Would you like to overwrite? + آیا مایل به جایگزینی فایل هستید؟ + + + PKG Version %1 is older than installed version: + نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: + + + Game is installed: + بازی نصب شد: + + + Would you like to install Patch: + آیا مایل به نصب پچ هستید: + + + DLC Installation + نصب DLC + + + Would you like to install DLC: %1? + آیا مایل به نصب DLC هستید: %1 + + + DLC already installed: + قبلا نصب شده DLC این: + + + Game already installed + این بازی قبلا نصب شده + + + PKG ERROR + PKG ارور فایل + + + Extracting PKG %1/%2 + درحال استخراج PKG %1/%2 + + + Extraction Finished + استخراج به پایان رسید + + + Game successfully installed at %1 + بازی با موفقیت در %1 نصب شد + + + File doesn't appear to be a valid PKG file + این فایل یک PKG درست به نظر نمی آید + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + ShadPS4 + + + + PKGViewer + + Open Folder + بازکردن پوشه + + + Name + نام + + + Serial + سریال + + + Installed + + + + Size + اندازه + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + منطقه + + + Flags + + + + Path + مسیر + + + File + فایل + + + PKG ERROR + PKG ارور فایل + + + Unknown + ناشناخته + + + Package + + + + + SettingsDialog + + Settings + تنظیمات + + + General + عمومی + + + System + سیستم + + + Console Language + زبان کنسول + + + Emulator Language + زبان شبیه ساز + + + Emulator + شبیه ساز + + + Enable Fullscreen + تمام صفحه + + + Fullscreen Mode + حالت تمام صفحه + + + Enable Separate Update Folder + فعال‌سازی پوشه جداگانه برای به‌روزرسانی + + + Default tab when opening settings + زبان پیش‌فرض هنگام باز کردن تنظیمات + + + Show Game Size In List + نمایش اندازه بازی در لیست + + + Show Splash + Splash نمایش + + + Enable Discord Rich Presence + Discord Rich Presence را فعال کنید + + + Username + نام کاربری + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log نوع + + + Log Filter + Log فیلتر + + + Open Log Location + باز کردن مکان گزارش + + + Input + ورودی + + + Cursor + نشانگر + + + Hide Cursor + پنهان کردن نشانگر + + + Hide Cursor Idle Timeout + مخفی کردن زمان توقف مکان نما + + + s + s + + + Controller + دسته بازی + + + Back Button Behavior + رفتار دکمه بازگشت + + + Graphics + گرافیک + + + GUI + رابط کاربری + + + User + کاربر + + + Graphics Device + کارت گرافیک مورداستفاده + + + Width + عرض + + + Height + طول + + + Vblank Divider + تقسیم‌کننده Vblank + + + Advanced + ...بیشتر + + + Enable Shaders Dumping + فعال‌سازی ذخیره‌سازی شیدرها + + + Enable NULL GPU + NULL GPU فعال کردن + + + Paths + مسیرها + + + Game Folders + پوشه های بازی + + + Add... + افزودن... + + + Remove + حذف + + + Debug + دیباگ + + + Enable Debug Dumping + Debug Dumping + + + Enable Vulkan Validation Layers + Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + به‌روزرسانی + + + Check for Updates at Startup + بررسی به‌روزرسانی‌ها در زمان راه‌اندازی + + + Always Show Changelog + نمایش دائم تاریخچه تغییرات + + + Update Channel + کانال به‌روزرسانی + + + Check for Updates + بررسی به‌روزرسانی‌ها + + + GUI Settings + تنظیمات رابط کاربری + + + Title Music + Title Music + + + Disable Trophy Pop-ups + غیرفعال کردن نمایش جوایز + + + Play title music + پخش موسیقی عنوان + + + Update Compatibility Database On Startup + به‌روزرسانی پایگاه داده سازگاری هنگام راه‌اندازی + + + Game Compatibility + سازگاری بازی با سیستم + + + Display Compatibility Data + نمایش داده‌های سازگاری + + + Update Compatibility Database + به‌روزرسانی پایگاه داده سازگاری + + + Volume + صدا + + + Save + ذخیره + + + Apply + اعمال + + + Restore Defaults + بازیابی پیش فرض ها + + + Close + بستن + + + Point your mouse at an option to display its description. + ماوس خود را بر روی یک گزینه قرار دهید تا توضیحات آن نمایش داده شود. + + + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + + + emulatorLanguageGroupBox + زبان شبیه‌ساز:\nزبان رابط کاربری شبیه‌ساز را انتخاب می‌کند. + + + fullscreenCheckBox + فعال‌سازی تمام صفحه:\nپنجره بازی را به‌طور خودکار به حالت تمام صفحه در می‌آورد.\nبرای تغییر این حالت می‌توانید کلید F11 را فشار دهید. + + + separateUpdatesCheckBox + فعال‌سازی پوشه جداگانه برای به‌روزرسانی:\nامکان نصب به‌روزرسانی‌های بازی در یک پوشه جداگانه برای مدیریت راحت‌تر را فراهم می‌کند. + + + showSplashCheckBox + نمایش صفحه شروع:\nصفحه شروع بازی (تصویری ویژه) را هنگام بارگذاری بازی نمایش می‌دهد. + + + discordRPCCheckbox + فعال کردن Discord Rich Presence:\nآیکون شبیه ساز و اطلاعات مربوطه را در نمایه Discord شما نمایش می دهد. + + + userName + نام کاربری:\nنام کاربری حساب PS4 را تنظیم می‌کند که ممکن است توسط برخی بازی‌ها نمایش داده شود. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + نوع لاگ:\nتنظیم می‌کند که آیا خروجی پنجره لاگ برای بهبود عملکرد همگام‌سازی شود یا خیر. این ممکن است تأثیر منفی بر شبیه‌سازی داشته باشد. + + + logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + + + updaterGroupBox + به‌روزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر می‌شوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست‌ شده‌تر هستند.\nشبانه: نسخه‌های توسعه‌ای که شامل جدیدترین ویژگی‌ها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند. + + + GUIMusicGroupBox + پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال می‌کند. + + + disableTrophycheckBox + غیرفعال کردن نمایش جوایز:\nنمایش اعلان‌های جوایز درون بازی را غیرفعال می‌کند. پیشرفت جوایز همچنان از طریق نمایشگر جوایز (کلیک راست روی بازی در پنجره اصلی) قابل پیگیری است.. + + + hideCursorGroupBox + پنهان کردن نشانگر:\nانتخاب کنید که نشانگر چه زمانی ناپدید شود:\nهرگز: شما همیشه ماوس را خواهید دید.\nغیرفعال: زمانی را برای ناپدید شدن بعد از غیرفعالی تعیین کنید.\nهمیشه: شما هرگز ماوس را نخواهید دید. + + + idleTimeoutGroupBox + زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید. + + + backButtonBehaviorGroupBox + رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند. + + + enableCompatibilityCheckBox + نمایش داده‌های سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش می‌دهد. برای دریافت اطلاعات به‌روز، گزینه "به‌روزرسانی سازگاری هنگام راه‌اندازی" را فعال کنید. + + + checkCompatibilityOnStartupCheckBox + به‌روزرسانی سازگاری هنگام راه‌اندازی:\nبه‌طور خودکار پایگاه داده سازگاری را هنگام راه‌اندازی ShadPS4 به‌روزرسانی می‌کند. + + + updateCompatibilityButton + به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. + + + Never + هرگز + + + Idle + بیکار + + + Always + همیشه + + + Touchpad Left + صفحه لمسی سمت چپ + + + Touchpad Right + صفحه لمسی سمت راست + + + Touchpad Center + مرکز صفحه لمسی + + + None + هیچ کدام + + + graphicsAdapterGroupBox + دستگاه گرافیکی:\nدر سیستم‌های با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیه‌ساز از آن استفاده می‌کند را انتخاب کنید، یا گزینه "انتخاب خودکار" را انتخاب کنید تا به طور خودکار تعیین شود. + + + resolutionLayout + عرض/ارتفاع:\nاندازه پنجره شبیه‌ساز را در هنگام راه‌اندازی تنظیم می‌کند، که در حین بازی قابل تغییر اندازه است.\nاین با وضوح داخل بازی متفاوت است. + + + heightDivider + تقسیم‌کننده Vblank:\nمیزان فریم ریت که شبیه‌ساز با آن به‌روزرسانی می‌شود، در این عدد ضرب می‌شود. تغییر این مقدار ممکن است تأثیرات منفی داشته باشد، مانند افزایش سرعت بازی یا خراب شدن عملکردهای حیاتی بازی که انتظار تغییر آن را ندارند! + + + dumpShadersCheckBox + فعال‌سازی ذخیره‌سازی شیدرها:\nبه‌منظور اشکال‌زدایی فنی، شیدرهای بازی را هنگام رندر شدن در یک پوشه ذخیره می‌کند. + + + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + + gameFoldersBox + پوشه های بازی:\nلیست پوشه هایی که باید بازی های نصب شده را بررسی کنید. + + + addFolderButton + اضافه کردن:\nیک پوشه به لیست اضافه کنید. + + + removeFolderButton + حذف:\nیک پوشه را از لیست حذف کنید. + + + debugDump + فعال‌سازی ذخیره‌سازی دیباگ:\nنمادهای import و export و اطلاعات هدر فایل برنامه در حال اجرای PS4 را در یک پوشه ذخیره می‌کند. + + + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + + + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + + + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + انتخاب دستی + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + محل نصب بازی ها + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + مشاهده جوایز + + diff --git a/src/qt_gui/translations/fi.ts b/src/qt_gui/translations/fi.ts deleted file mode 100644 index b2494df2a..000000000 --- a/src/qt_gui/translations/fi.ts +++ /dev/null @@ -1,1475 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - Tietoa shadPS4:sta - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori. - - - This software should not be used to play games you have not legally obtained. - Tätä ohjelmistoa ei saa käyttää pelien pelaamiseen, joita et ole hankkinut laillisesti. - - - - ElfViewer - - Open Folder - Avaa Hakemisto - - - - GameInfoClass - - Loading game list, please wait :3 - Ole hyvä ja odota, ladataan pelilistaa :3 - - - Cancel - Peruuta - - - Loading... - Ladataan... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Valitse hakemisto - - - Select which directory you want to install to. - Valitse, mihin hakemistoon haluat asentaa. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Valitse hakemisto - - - Directory to install games - Pelien asennushakemisto - - - Browse - Selaa - - - Error - Virhe - - - The value for location to install games is not valid. - Peliasennushakemiston sijainti on virheellinen. - - - - GuiContextMenus - - Create Shortcut - Luo Pikakuvake - - - Cheats / Patches - Huijaukset / Korjaukset - - - SFO Viewer - SFO Selain - - - Trophy Viewer - Trophy Selain - - - Open Folder... - Avaa Hakemisto... - - - Open Game Folder - Avaa Pelihakemisto - - - Open Save Data Folder - Avaa Tallennustiedostohakemisto - - - Open Log Folder - Avaa Lokihakemisto - - - Copy info... - Kopioi tietoja... - - - Copy Name - Kopioi Nimi - - - Copy Serial - Kopioi Sarjanumero - - - Copy All - Kopioi kaikki - - - Delete... - Poista... - - - Delete Game - Poista Peli - - - Delete Update - Poista Päivitys - - - Delete DLC - Poista Lisäsisältö - - - Compatibility... - Yhteensopivuus... - - - Update database - Päivitä tietokanta - - - View report - Näytä raportti - - - Submit a report - Tee raportti - - - Shortcut creation - Pikakuvakkeen luonti - - - Shortcut created successfully! - Pikakuvake luotu onnistuneesti! - - - Error - Virhe - - - Error creating shortcut! - Virhe pikakuvakkeen luonnissa! - - - Install PKG - Asenna PKG - - - Game - Peli - - - requiresEnableSeparateUpdateFolder_MSG - Tämä ominaisuus vaatii, että 'Ota käyttöön erillinen päivityshakemisto' -asetus on päällä. Jos haluat käyttää tätä ominaisuutta, laita se asetus päälle. - - - This game has no update to delete! - Tällä pelillä ei ole poistettavaa päivitystä! - - - Update - Päivitä - - - This game has no DLC to delete! - Tällä pelillä ei ole poistettavaa lisäsisältöä! - - - DLC - Lisäsisältö - - - Delete %1 - Poista %1 - - - Are you sure you want to delete %1's %2 directory? - Haluatko varmasti poistaa %1n %2hakemiston? - - - - MainWindow - - Open/Add Elf Folder - Avaa/Lisää Elf Hakemisto - - - Install Packages (PKG) - Asenna Paketteja (PKG) - - - Boot Game - Käynnistä Peli - - - Check for Updates - Tarkista Päivitykset - - - About shadPS4 - Tietoa shadPS4:sta - - - Configure... - Asetukset... - - - Install application from a .pkg file - Asenna sovellus .pkg tiedostosta - - - Recent Games - Viimeisimmät Pelit - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Sulje - - - Exit shadPS4 - Sulje shadPS4 - - - Exit the application. - Sulje sovellus. - - - Show Game List - Avaa pelilista - - - Game List Refresh - Päivitä pelilista - - - Tiny - Hyvin pieni - - - Small - Pieni - - - Medium - Keskikokoinen - - - Large - Suuri - - - List View - Listanäkymä - - - Grid View - Ruudukkonäkymä - - - Elf Viewer - Elf Selain - - - Game Install Directory - Peliasennushakemisto - - - Download Cheats/Patches - Lataa Huijaukset / Korjaukset - - - Dump Game List - Kirjoita Pelilista Tiedostoon - - - PKG Viewer - PKG Selain - - - Search... - Hae... - - - File - Tiedosto - - - View - Näkymä - - - Game List Icons - Pelilistan Ikonit - - - Game List Mode - Pelilistamuoto - - - Settings - Asetukset - - - Utils - Työkalut - - - Themes - Teemat - - - Help - Apua - - - Dark - Tumma - - - Light - Vaalea - - - Green - Vihreä - - - Blue - Sininen - - - Violet - Violetti - - - toolBar - Työkalupalkki - - - Game List - Pelilista - - - * Unsupported Vulkan Version - * Ei Tuettu Vulkan-versio - - - Download Cheats For All Installed Games - Lataa Huijaukset Kaikille Asennetuille Peleille - - - Download Patches For All Games - Lataa Paikkaukset Kaikille Peleille - - - Download Complete - Lataus Valmis - - - You have downloaded cheats for all the games you have installed. - Olet ladannut huijaukset kaikkiin asennettuihin peleihin. - - - Patches Downloaded Successfully! - Paikkaukset Ladattu Onnistuneesti! - - - All Patches available for all games have been downloaded. - Kaikki saatavilla olevat Paikkaukset kaikille peleille on ladattu. - - - Games: - Pelit: - - - PKG File (*.PKG) - PKG-tiedosto (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF-tiedostot (*.bin *.elf *.oelf) - - - Game Boot - Pelin Käynnistys - - - Only one file can be selected! - Vain yksi tiedosto voi olla valittuna! - - - PKG Extraction - PKG:n purku - - - Patch detected! - Päivitys havaittu! - - - PKG and Game versions match: - PKG- ja peliversiot vastaavat: - - - Would you like to overwrite? - Haluatko korvata? - - - PKG Version %1 is older than installed version: - PKG-versio %1 on vanhempi kuin asennettu versio: - - - Game is installed: - Peli on asennettu: - - - Would you like to install Patch: - Haluatko asentaa päivityksen: - - - DLC Installation - Lisäsisällön asennus - - - Would you like to install DLC: %1? - Haluatko asentaa lisäsisällön: %1? - - - DLC already installed: - Lisäsisältö on jo asennettu: - - - Game already installed - Peli on jo asennettu - - - PKG is a patch, please install the game first! - PKG on päivitys, asenna peli ensin! - - - PKG ERROR - PKG VIRHE - - - Extracting PKG %1/%2 - Purkaminen PKG %1/%2 - - - Extraction Finished - Purku valmis - - - Game successfully installed at %1 - Peli asennettu onnistuneesti kohtaan %1 - - - File doesn't appear to be a valid PKG file - Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto - - - - PKGViewer - - Open Folder - Avaa Hakemisto - - - - TrophyViewer - - Trophy Viewer - Trophy Selain - - - - SettingsDialog - - Settings - Asetukset - - - General - Yleinen - - - System - Järjestelmä - - - Console Language - Konsolin Kieli - - - Emulator Language - Emulaattorin Kieli - - - Emulator - Emulaattori - - - Enable Fullscreen - Ota Käyttöön Koko Ruudun Tila - - - Fullscreen Mode - Koko näytön tila - - - Enable Separate Update Folder - Ota Käyttöön Erillinen Päivityshakemisto - - - Default tab when opening settings - Oletusvälilehti avattaessa asetuksia - - - Show Game Size In List - Näytä pelin koko luettelossa - - - Show Splash - Näytä Aloitusnäyttö - - - Is PS4 Pro - On PS4 Pro - - - Enable Discord Rich Presence - Ota käyttöön Discord Rich Presence - - - Username - Käyttäjänimi - - - Trophy Key - Trophy Avain - - - Trophy - Trophy - - - Logger - Lokinkerääjä - - - Log Type - Lokin Tyyppi - - - Log Filter - Lokisuodatin - - - Open Log Location - Avaa lokin sijainti - - - Input - Syöttö - - - Cursor - Kursori - - - Hide Cursor - Piilota Kursori - - - Hide Cursor Idle Timeout - Inaktiivisuuden Aikaraja Kursorin Piilottamiseen - - - s - s - - - Controller - Ohjain - - - Back Button Behavior - Takaisin-painikkeen Käyttäytyminen - - - Graphics - Grafiikka - - - GUI - Rajapinta - - - User - Käyttäjä - - - Graphics Device - Näytönohjain - - - Width - Leveys - - - Height - Korkeus - - - Vblank Divider - Vblank jakaja - - - Advanced - Lisäasetukset - - - Enable Shaders Dumping - Ota Käyttöön Varjostinvedokset - - - Enable NULL GPU - Ota Käyttöön NULL GPU - - - Paths - Polut - - - Game Folders - Pelihakemistot - - - Add... - Lisää... - - - Remove - Poista - - - Debug - Virheenkorjaus - - - Enable Debug Dumping - Ota Käyttöön Virheenkorjausvedokset - - - Enable Vulkan Validation Layers - Ota Käyttöön Vulkan-validointikerrokset - - - Enable Vulkan Synchronization Validation - Ota Käyttöön Vulkan-synkronointivalidointi - - - Enable RenderDoc Debugging - Ota Käyttöön RenderDoc Virheenkorjaus - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Päivitys - - - Check for Updates at Startup - Tarkista Päivitykset Käynnistäessä - - - Always Show Changelog - Näytä aina muutoshistoria - - - Update Channel - Päivityskanava - - - Check for Updates - Tarkista Päivitykset - - - GUI Settings - GUI-asetukset - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Poista Trophy Pop-upit Käytöstä - - - Play title music - Soita Otsikkomusiikkia - - - Update Compatibility Database On Startup - Päivitä Yhteensopivuustietokanta Käynnistäessä - - - Game Compatibility - Peliyhteensopivuus - - - Display Compatibility Data - Näytä Yhteensopivuustiedot - - - Update Compatibility Database - Päivitä Yhteensopivuustietokanta - - - Volume - Äänenvoimakkuus - - - Audio Backend - Äänijärjestelmä - - - Save - Tallenna - - - Apply - Ota käyttöön - - - Restore Defaults - Palauta Oletukset - - - Close - Sulje - - - Point your mouse at an option to display its description. - Siirrä hiiri vaihtoehdon päälle näyttääksesi sen kuvauksen. - - - consoleLanguageGroupBox - Konsolin Kieli:\nAseta PS4-pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. - - - emulatorLanguageGroupBox - Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. - - - fullscreenCheckBox - Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. - - - separateUpdatesCheckBox - Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. - - - showSplashCheckBox - Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. - - - ps4proCheckBox - On PS4 Pro:\nAsettaa emulaattorin toimimaan PS4 PRO:na, mikä voi mahdollistaa erityisiä ominaisuuksia peleissä, jotka tukevat sitä. - - - discordRPCCheckbox - Ota käyttöön Discord Rich Presence:\nNäyttää emulaattorin kuvakkeen ja asiaankuuluvat tiedot Discord-profiilissasi. - - - userName - Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissain peleissä. - - - TrophyKey - Trophy Avain:\nThrophyjen dekryptoinnissa käytetty avain. Pitää hankkia jailbreakatusta konsolista.\nSaa sisältää vain hex-merkkejä. - - - logTypeGroupBox - Lokityyppi:\nAsettaa, synkronoidaanko loki-ikkunan ulostulo suorituskyvyn vuoksi. Tämä voi vaikuttaa haitallisesti emulointiin. - - - logFilter - Lokisuodatin:\nSuodattaa lokia tulostamaan vain määrättyä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nTasot: Trace, Debug, Info, Warning, Error, Critical - tässä järjestyksessä. Valittu taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. - - - updaterGroupBox - Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. - - - GUIMusicGroupBox - Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. - - - disableTrophycheckBox - Poista Trophy Pop-upit Käytöstä:\nPoista trophy ilmoitukset pelin aikana. Trophyjen edistystä voi silti seurata Trophy Selainta käyttämällä (klikkaa peliä hiiren oikealla emulaattorin pääikkunassa). - - - hideCursorGroupBox - Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nInaktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. - - - idleTimeoutGroupBox - Aseta aika, milloin hiiri häviää oltuaan aktiivinen. - - - backButtonBehaviorGroupBox - Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan. - - - enableCompatibilityCheckBox - Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön "Päivitä Yhteensopivuustietokanta Käynnistäessä" saadaksesi ajantasaista tietoa. - - - checkCompatibilityOnStartupCheckBox - Päivitä Yhteensopivuustiedot Käynnistäessä:\nPäivitä yhteensopivuustiedot automaattisesti shadPS4:n käynnistyessä. - - - updateCompatibilityButton - Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. - - - Never - Ei koskaan - - - Idle - Inaktiivinen - - - Always - Aina - - - Touchpad Left - Kosketuslevyn Vasen Puoli - - - Touchpad Right - Kosketuslevyn Oikea Puoli - - - Touchpad Center - Kosketuslevyn Keskikohta - - - None - Ei mitään - - - graphicsAdapterGroupBox - Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse "Auto Select" automaattiseen määritykseen. - - - resolutionLayout - Leveys/Korkeus:\nAsettaa käynnistetyn emulaattori-ikkunan koon, jota voidaan muuttaa pelin aikana.\nTämä on eri, kuin pelin sisäinen resoluutio. - - - heightDivider - Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten lisätä pelin nopeutta tai rikkoa kriittisiä pelitoimintoja, jotka eivät odota tämän muuttuvan! - - - dumpShadersCheckBox - Ota Käyttöön Varjostinvedokset:\nTeknistä vianetsintää varten. Pelin varjostimia tallennetaan hakemistoon niiden renderöityessä. - - - nullGpuCheckBox - Ota Null GPU käyttöön:\nTeknistä vianetsintää varten. Pelin renderöinti estetään, ikään kuin näytönohjainta ei olisi. - - - gameFoldersBox - Pelihakemistot:\nLista hakemistoista, joista pelejä haetaan. - - - addFolderButton - Lisää:\nLisää hakemisto listalle. - - - removeFolderButton - Poista:\nPoista hakemisto listalta. - - - debugDump - Ota Käyttöön Virheenkorjausvedokset:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. - - - vkValidationCheckBox - Ota Käyttöön Vulkan-validointikerrokset:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - - - vkSyncValidationCheckBox - Ota Käyttöön Vulkan-synkronointivalidointi:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - - - rdocCheckBox - Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Huijaukset / Paikkaukset pelille - - - defaultTextEdit_MSG - Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Kuvaa ei saatavilla - - - Serial: - Sarjanumero: - - - Version: - Versio: - - - Size: - Koko: - - - Select Cheat File: - Valitse Huijaustiedosto: - - - Repository: - Repositorio: - - - Download Cheats - Lataa Huijaukset - - - Delete File - Poista Tiedosto - - - No files selected. - Tiedostoja ei ole valittuna. - - - You can delete the cheats you don't want after downloading them. - Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. - - - Do you want to delete the selected file?\n%1 - Haluatko poistaa valitun tiedoston?\n%1 - - - Select Patch File: - Valitse Paikkaustiedosto: - - - Download Patches - Lataa Paikkaukset - - - Save - Tallenna - - - Cheats - Huijaukset - - - Patches - Paikkaukset - - - Error - Virhe - - - No patch selected. - Paikkausta ei ole valittuna. - - - Unable to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. - - - No patch file found for the current serial. - Nykyiselle sarjanumerolle ei löytynyt paikkaustiedostoa. - - - Unable to open the file for reading. - Tiedostoa ei voitu avata lukemista varten. - - - Unable to open the file for writing. - Tiedostoa ei voitu avata kirjoittamista varten. - - - Failed to parse XML: - XML:n jäsentäminen epäonnistui: - - - Success - Onnistuminen - - - Options saved successfully. - Vaihtoehdot tallennettu onnistuneesti. - - - Invalid Source - Virheellinen Lähde - - - The selected source is invalid. - Valittu lähde on virheellinen. - - - File Exists - Olemassaoleva Tiedosto - - - File already exists. Do you want to replace it? - Tiedosto on jo olemassa. Haluatko korvata sen? - - - Failed to save file: - Tiedoston tallentaminen epäonnistui: - - - Failed to download file: - Tiedoston lataaminen epäonnistui: - - - Cheats Not Found - Huijauksia Ei Löytynyt - - - CheatsNotFound_MSG - Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. - - - Cheats Downloaded Successfully - Huijaukset Ladattu Onnistuneesti - - - CheatsDownloadedSuccessfully_MSG - Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. - - - Failed to save: - Tallentaminen epäonnistui: - - - Failed to download: - Lataus epäonnistui: - - - Download Complete - Lataus valmis - - - DownloadComplete_MSG - Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. - - - Failed to parse JSON data from HTML. - JSON-tietojen jäsentäminen HTML:stä epäonnistui. - - - Failed to retrieve HTML page. - HTML-sivun hakeminen epäonnistui. - - - The game is in version: %1 - Peli on versiossa: %1 - - - The downloaded patch only works on version: %1 - Ladattu paikkaus toimii vain versiossa: %1 - - - You may need to update your game. - Sinun on ehkä päivitettävä pelisi. - - - Incompatibility Notice - Yhteensopivuusilmoitus - - - Failed to open file: - Tiedoston avaaminen epäonnistui: - - - XML ERROR: - XML VIRHE: - - - Failed to open files.json for writing - Tiedostoa files.json ei voitu avata kirjoittamista varten - - - Author: - Tekijä: - - - Directory does not exist: - Hakemistoa ei ole olemassa: - - - Failed to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. - - - Name: - Nimi: - - - Can't apply cheats before the game is started - Huijauksia ei voi käyttää ennen kuin peli on käynnissä. - - - - GameListFrame - - Icon - Ikoni - - - Name - Nimi - - - Serial - Sarjanumero - - - Compatibility - Compatibility - - - Region - Alue - - - Firmware - Ohjelmisto - - - Size - Koko - - - Version - Versio - - - Path - Polku - - - Play Time - Peliaika - - - Never Played - Pelaamaton - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Yhteensopivuutta ei ole testattu - - - Game does not initialize properly / crashes the emulator - Peli ei alustaudu kunnolla / kaataa emulaattorin - - - Game boots, but only displays a blank screen - Peli käynnistyy, mutta näyttää vain tyhjän ruudun - - - Game displays an image but does not go past the menu - Peli näyttää kuvan mutta ei mene valikosta eteenpäin - - - Game has game-breaking glitches or unplayable performance - Pelissä on pelikokemusta rikkovia häiriöitä tai kelvoton suorituskyky - - - Game can be completed with playable performance and no major glitches - Pelillä on hyväksyttävä suorituskyky, eikä mitään suuria häiriöitä - - - Click to see details on github - Napsauta nähdäksesi lisätiedot GitHubissa - - - Last updated - Viimeksi päivitetty - - - - CheckUpdate - - Auto Updater - Automaattinen Päivitys - - - Error - Virhe - - - Network error: - Verkkovirhe: - - - Error_Github_limit_MSG - Automaattinen päivitys sallii enintään 60 päivitystarkistusta tunnissa.\nOlet saavuttanut tämän rajan. Yritä myöhemmin uudelleen. - - - Failed to parse update information. - Päivitystietojen jäsentäminen epäonnistui. - - - No pre-releases found. - Ennakkojulkaisuja ei löytynyt. - - - Invalid release data. - Virheelliset julkaisutiedot. - - - No download URL found for the specified asset. - Lataus-URL:ia ei löytynyt määritetylle omaisuudelle. - - - Your version is already up to date! - Versiosi on jo ajan tasalla! - - - Update Available - Päivitys Saatavilla - - - Update Channel - Päivityskanava - - - Current Version - Nykyinen Versio - - - Latest Version - Uusin Versio - - - Do you want to update? - Haluatko päivittää? - - - Show Changelog - Näytä Muutoshistoria - - - Check for Updates at Startup - Tarkista Päivitykset Käynnistettäessä - - - Update - Päivitä - - - No - Ei - - - Hide Changelog - Piilota Muutoshistoria - - - Changes - Muutokset - - - Network error occurred while trying to access the URL - URL-osoitteeseen yhdistettäessä tapahtui verkkovirhe - - - Download Complete - Lataus Valmis - - - The update has been downloaded, press OK to install. - Päivitys on ladattu, paina OK asentaaksesi. - - - Failed to save the update file at - Päivitystiedoston tallentaminen epäonnistui sijaintiin - - - Starting Update... - Aloitetaan päivitystä... - - - Failed to create the update script file - Päivitysskripttitiedoston luominen epäonnistui - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Haetaan yhteensopivuustietoja, odota - - - Cancel - Peruuta - - - Loading... - Ladataan... - - - Error - Virhe - - - Unable to update compatibility data! Try again later. - Yhteensopivuustietoja ei voitu päivittää! Yritä myöhemmin uudelleen. - - - Unable to open compatibility_data.json for writing. - Ei voitu avata compatibility_data.json-tiedostoa kirjoittamista varten. - - - Unknown - Tuntematon - - - Nothing - Ei mitään - - - Boots - Sahat - - - Menus - Valikot - - - Ingame - Pelin aikana - - - Playable - Pelattava - - - diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts new file mode 100644 index 000000000..cb5962502 --- /dev/null +++ b/src/qt_gui/translations/fi_FI.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + Tietoa shadPS4:sta + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori. + + + This software should not be used to play games you have not legally obtained. + Tätä ohjelmistoa ei saa käyttää pelien pelaamiseen, joita et ole hankkinut laillisesti. + + + + CheatsPatches + + Cheats / Patches for + Huijaukset / Paikkaukset pelille + + + defaultTextEdit_MSG + Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Kuvaa ei saatavilla + + + Serial: + Sarjanumero: + + + Version: + Versio: + + + Size: + Koko: + + + Select Cheat File: + Valitse Huijaustiedosto: + + + Repository: + Repositorio: + + + Download Cheats + Lataa Huijaukset + + + Delete File + Poista Tiedosto + + + No files selected. + Tiedostoja ei ole valittuna. + + + You can delete the cheats you don't want after downloading them. + Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. + + + Do you want to delete the selected file?\n%1 + Haluatko poistaa valitun tiedoston?\n%1 + + + Select Patch File: + Valitse Paikkaustiedosto: + + + Download Patches + Lataa Paikkaukset + + + Save + Tallenna + + + Cheats + Huijaukset + + + Patches + Paikkaukset + + + Error + Virhe + + + No patch selected. + Paikkausta ei ole valittuna. + + + Unable to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. + + + No patch file found for the current serial. + Nykyiselle sarjanumerolle ei löytynyt paikkaustiedostoa. + + + Unable to open the file for reading. + Tiedostoa ei voitu avata lukemista varten. + + + Unable to open the file for writing. + Tiedostoa ei voitu avata kirjoittamista varten. + + + Failed to parse XML: + XML:n jäsentäminen epäonnistui: + + + Success + Onnistuminen + + + Options saved successfully. + Vaihtoehdot tallennettu onnistuneesti. + + + Invalid Source + Virheellinen Lähde + + + The selected source is invalid. + Valittu lähde on virheellinen. + + + File Exists + Olemassaoleva Tiedosto + + + File already exists. Do you want to replace it? + Tiedosto on jo olemassa. Haluatko korvata sen? + + + Failed to save file: + Tiedoston tallentaminen epäonnistui: + + + Failed to download file: + Tiedoston lataaminen epäonnistui: + + + Cheats Not Found + Huijauksia Ei Löytynyt + + + CheatsNotFound_MSG + Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. + + + Cheats Downloaded Successfully + Huijaukset Ladattu Onnistuneesti + + + CheatsDownloadedSuccessfully_MSG + Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. + + + Failed to save: + Tallentaminen epäonnistui: + + + Failed to download: + Lataus epäonnistui: + + + Download Complete + Lataus valmis + + + DownloadComplete_MSG + Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. + + + Failed to parse JSON data from HTML. + JSON-tietojen jäsentäminen HTML:stä epäonnistui. + + + Failed to retrieve HTML page. + HTML-sivun hakeminen epäonnistui. + + + The game is in version: %1 + Peli on versiossa: %1 + + + The downloaded patch only works on version: %1 + Ladattu paikkaus toimii vain versiossa: %1 + + + You may need to update your game. + Sinun on ehkä päivitettävä pelisi. + + + Incompatibility Notice + Yhteensopivuusilmoitus + + + Failed to open file: + Tiedoston avaaminen epäonnistui: + + + XML ERROR: + XML VIRHE: + + + Failed to open files.json for writing + Tiedostoa files.json ei voitu avata kirjoittamista varten + + + Author: + Tekijä: + + + Directory does not exist: + Hakemistoa ei ole olemassa: + + + Failed to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. + + + Name: + Nimi: + + + Can't apply cheats before the game is started + Huijauksia ei voi käyttää ennen kuin peli on käynnissä. + + + Close + Sulje + + + + CheckUpdate + + Auto Updater + Automaattinen Päivitys + + + Error + Virhe + + + Network error: + Verkkovirhe: + + + Error_Github_limit_MSG + Automaattinen päivitys sallii enintään 60 päivitystarkistusta tunnissa.\nOlet saavuttanut tämän rajan. Yritä myöhemmin uudelleen. + + + Failed to parse update information. + Päivitystietojen jäsentäminen epäonnistui. + + + No pre-releases found. + Ennakkojulkaisuja ei löytynyt. + + + Invalid release data. + Virheelliset julkaisutiedot. + + + No download URL found for the specified asset. + Lataus-URL:ia ei löytynyt määritetylle omaisuudelle. + + + Your version is already up to date! + Versiosi on jo ajan tasalla! + + + Update Available + Päivitys Saatavilla + + + Update Channel + Päivityskanava + + + Current Version + Nykyinen Versio + + + Latest Version + Uusin Versio + + + Do you want to update? + Haluatko päivittää? + + + Show Changelog + Näytä Muutoshistoria + + + Check for Updates at Startup + Tarkista Päivitykset Käynnistettäessä + + + Update + Päivitä + + + No + Ei + + + Hide Changelog + Piilota Muutoshistoria + + + Changes + Muutokset + + + Network error occurred while trying to access the URL + URL-osoitteeseen yhdistettäessä tapahtui verkkovirhe + + + Download Complete + Lataus Valmis + + + The update has been downloaded, press OK to install. + Päivitys on ladattu, paina OK asentaaksesi. + + + Failed to save the update file at + Päivitystiedoston tallentaminen epäonnistui sijaintiin + + + Starting Update... + Aloitetaan päivitystä... + + + Failed to create the update script file + Päivitysskripttitiedoston luominen epäonnistui + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Haetaan yhteensopivuustietoja, odota + + + Cancel + Peruuta + + + Loading... + Ladataan... + + + Error + Virhe + + + Unable to update compatibility data! Try again later. + Yhteensopivuustietoja ei voitu päivittää! Yritä myöhemmin uudelleen. + + + Unable to open compatibility_data.json for writing. + Ei voitu avata compatibility_data.json-tiedostoa kirjoittamista varten. + + + Unknown + Tuntematon + + + Nothing + Ei mitään + + + Boots + Sahat + + + Menus + Valikot + + + Ingame + Pelin aikana + + + Playable + Pelattava + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Avaa Hakemisto + + + + GameInfoClass + + Loading game list, please wait :3 + Ole hyvä ja odota, ladataan pelilistaa :3 + + + Cancel + Peruuta + + + Loading... + Ladataan... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Valitse hakemisto + + + Directory to install games + Pelien asennushakemisto + + + Browse + Selaa + + + Error + Virhe + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikoni + + + Name + Nimi + + + Serial + Sarjanumero + + + Compatibility + Compatibility + + + Region + Alue + + + Firmware + Ohjelmisto + + + Size + Koko + + + Version + Versio + + + Path + Polku + + + Play Time + Peliaika + + + Never Played + Pelaamaton + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Yhteensopivuutta ei ole testattu + + + Game does not initialize properly / crashes the emulator + Peli ei alustaudu kunnolla / kaataa emulaattorin + + + Game boots, but only displays a blank screen + Peli käynnistyy, mutta näyttää vain tyhjän ruudun + + + Game displays an image but does not go past the menu + Peli näyttää kuvan mutta ei mene valikosta eteenpäin + + + Game has game-breaking glitches or unplayable performance + Pelissä on pelikokemusta rikkovia häiriöitä tai kelvoton suorituskyky + + + Game can be completed with playable performance and no major glitches + Pelillä on hyväksyttävä suorituskyky, eikä mitään suuria häiriöitä + + + Click to see details on github + Napsauta nähdäksesi lisätiedot GitHubissa + + + Last updated + Viimeksi päivitetty + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Luo Pikakuvake + + + Cheats / Patches + Huijaukset / Korjaukset + + + SFO Viewer + SFO Selain + + + Trophy Viewer + Trophy Selain + + + Open Folder... + Avaa Hakemisto... + + + Open Game Folder + Avaa Pelihakemisto + + + Open Save Data Folder + Avaa Tallennustiedostohakemisto + + + Open Log Folder + Avaa Lokihakemisto + + + Copy info... + Kopioi tietoja... + + + Copy Name + Kopioi Nimi + + + Copy Serial + Kopioi Sarjanumero + + + Copy All + Kopioi kaikki + + + Delete... + Poista... + + + Delete Game + Poista Peli + + + Delete Update + Poista Päivitys + + + Delete DLC + Poista Lisäsisältö + + + Compatibility... + Yhteensopivuus... + + + Update database + Päivitä tietokanta + + + View report + Näytä raportti + + + Submit a report + Tee raportti + + + Shortcut creation + Pikakuvakkeen luonti + + + Shortcut created successfully! + Pikakuvake luotu onnistuneesti! + + + Error + Virhe + + + Error creating shortcut! + Virhe pikakuvakkeen luonnissa! + + + Install PKG + Asenna PKG + + + Game + Peli + + + This game has no update to delete! + Tällä pelillä ei ole poistettavaa päivitystä! + + + Update + Päivitä + + + This game has no DLC to delete! + Tällä pelillä ei ole poistettavaa lisäsisältöä! + + + DLC + Lisäsisältö + + + Delete %1 + Poista %1 + + + Are you sure you want to delete %1's %2 directory? + Haluatko varmasti poistaa %1n %2hakemiston? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Valitse hakemisto + + + Select which directory you want to install to. + Valitse, mihin hakemistoon haluat asentaa. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Avaa/Lisää Elf Hakemisto + + + Install Packages (PKG) + Asenna Paketteja (PKG) + + + Boot Game + Käynnistä Peli + + + Check for Updates + Tarkista Päivitykset + + + About shadPS4 + Tietoa shadPS4:sta + + + Configure... + Asetukset... + + + Install application from a .pkg file + Asenna sovellus .pkg tiedostosta + + + Recent Games + Viimeisimmät Pelit + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Sulje + + + Exit shadPS4 + Sulje shadPS4 + + + Exit the application. + Sulje sovellus. + + + Show Game List + Avaa pelilista + + + Game List Refresh + Päivitä pelilista + + + Tiny + Hyvin pieni + + + Small + Pieni + + + Medium + Keskikokoinen + + + Large + Suuri + + + List View + Listanäkymä + + + Grid View + Ruudukkonäkymä + + + Elf Viewer + Elf Selain + + + Game Install Directory + Peliasennushakemisto + + + Download Cheats/Patches + Lataa Huijaukset / Korjaukset + + + Dump Game List + Kirjoita Pelilista Tiedostoon + + + PKG Viewer + PKG Selain + + + Search... + Hae... + + + File + Tiedosto + + + View + Näkymä + + + Game List Icons + Pelilistan Ikonit + + + Game List Mode + Pelilistamuoto + + + Settings + Asetukset + + + Utils + Työkalut + + + Themes + Teemat + + + Help + Apua + + + Dark + Tumma + + + Light + Vaalea + + + Green + Vihreä + + + Blue + Sininen + + + Violet + Violetti + + + toolBar + Työkalupalkki + + + Game List + Pelilista + + + * Unsupported Vulkan Version + * Ei Tuettu Vulkan-versio + + + Download Cheats For All Installed Games + Lataa Huijaukset Kaikille Asennetuille Peleille + + + Download Patches For All Games + Lataa Paikkaukset Kaikille Peleille + + + Download Complete + Lataus Valmis + + + You have downloaded cheats for all the games you have installed. + Olet ladannut huijaukset kaikkiin asennettuihin peleihin. + + + Patches Downloaded Successfully! + Paikkaukset Ladattu Onnistuneesti! + + + All Patches available for all games have been downloaded. + Kaikki saatavilla olevat Paikkaukset kaikille peleille on ladattu. + + + Games: + Pelit: + + + ELF files (*.bin *.elf *.oelf) + ELF-tiedostot (*.bin *.elf *.oelf) + + + Game Boot + Pelin Käynnistys + + + Only one file can be selected! + Vain yksi tiedosto voi olla valittuna! + + + PKG Extraction + PKG:n purku + + + Patch detected! + Päivitys havaittu! + + + PKG and Game versions match: + PKG- ja peliversiot vastaavat: + + + Would you like to overwrite? + Haluatko korvata? + + + PKG Version %1 is older than installed version: + PKG-versio %1 on vanhempi kuin asennettu versio: + + + Game is installed: + Peli on asennettu: + + + Would you like to install Patch: + Haluatko asentaa päivityksen: + + + DLC Installation + Lisäsisällön asennus + + + Would you like to install DLC: %1? + Haluatko asentaa lisäsisällön: %1? + + + DLC already installed: + Lisäsisältö on jo asennettu: + + + Game already installed + Peli on jo asennettu + + + PKG ERROR + PKG VIRHE + + + Extracting PKG %1/%2 + Purkaminen PKG %1/%2 + + + Extraction Finished + Purku valmis + + + Game successfully installed at %1 + Peli asennettu onnistuneesti kohtaan %1 + + + File doesn't appear to be a valid PKG file + Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Avaa Hakemisto + + + Name + Nimi + + + Serial + Sarjanumero + + + Installed + + + + Size + Koko + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Alue + + + Flags + + + + Path + Polku + + + File + Tiedosto + + + PKG ERROR + PKG VIRHE + + + Unknown + Tuntematon + + + Package + + + + + SettingsDialog + + Settings + Asetukset + + + General + Yleinen + + + System + Järjestelmä + + + Console Language + Konsolin Kieli + + + Emulator Language + Emulaattorin Kieli + + + Emulator + Emulaattori + + + Enable Fullscreen + Ota Käyttöön Koko Ruudun Tila + + + Fullscreen Mode + Koko näytön tila + + + Enable Separate Update Folder + Ota Käyttöön Erillinen Päivityshakemisto + + + Default tab when opening settings + Oletusvälilehti avattaessa asetuksia + + + Show Game Size In List + Näytä pelin koko luettelossa + + + Show Splash + Näytä Aloitusnäyttö + + + Enable Discord Rich Presence + Ota käyttöön Discord Rich Presence + + + Username + Käyttäjänimi + + + Trophy Key + Trophy Avain + + + Trophy + Trophy + + + Logger + Lokinkerääjä + + + Log Type + Lokin Tyyppi + + + Log Filter + Lokisuodatin + + + Open Log Location + Avaa lokin sijainti + + + Input + Syöttö + + + Cursor + Kursori + + + Hide Cursor + Piilota Kursori + + + Hide Cursor Idle Timeout + Inaktiivisuuden Aikaraja Kursorin Piilottamiseen + + + s + s + + + Controller + Ohjain + + + Back Button Behavior + Takaisin-painikkeen Käyttäytyminen + + + Graphics + Grafiikka + + + GUI + Rajapinta + + + User + Käyttäjä + + + Graphics Device + Näytönohjain + + + Width + Leveys + + + Height + Korkeus + + + Vblank Divider + Vblank jakaja + + + Advanced + Lisäasetukset + + + Enable Shaders Dumping + Ota Käyttöön Varjostinvedokset + + + Enable NULL GPU + Ota Käyttöön NULL GPU + + + Paths + Polut + + + Game Folders + Pelihakemistot + + + Add... + Lisää... + + + Remove + Poista + + + Debug + Virheenkorjaus + + + Enable Debug Dumping + Ota Käyttöön Virheenkorjausvedokset + + + Enable Vulkan Validation Layers + Ota Käyttöön Vulkan-validointikerrokset + + + Enable Vulkan Synchronization Validation + Ota Käyttöön Vulkan-synkronointivalidointi + + + Enable RenderDoc Debugging + Ota Käyttöön RenderDoc Virheenkorjaus + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Päivitys + + + Check for Updates at Startup + Tarkista Päivitykset Käynnistäessä + + + Always Show Changelog + Näytä aina muutoshistoria + + + Update Channel + Päivityskanava + + + Check for Updates + Tarkista Päivitykset + + + GUI Settings + GUI-asetukset + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Poista Trophy Pop-upit Käytöstä + + + Play title music + Soita Otsikkomusiikkia + + + Update Compatibility Database On Startup + Päivitä Yhteensopivuustietokanta Käynnistäessä + + + Game Compatibility + Peliyhteensopivuus + + + Display Compatibility Data + Näytä Yhteensopivuustiedot + + + Update Compatibility Database + Päivitä Yhteensopivuustietokanta + + + Volume + Äänenvoimakkuus + + + Save + Tallenna + + + Apply + Ota käyttöön + + + Restore Defaults + Palauta Oletukset + + + Close + Sulje + + + Point your mouse at an option to display its description. + Siirrä hiiri vaihtoehdon päälle näyttääksesi sen kuvauksen. + + + consoleLanguageGroupBox + Konsolin Kieli:\nAseta PS4-pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. + + + emulatorLanguageGroupBox + Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. + + + fullscreenCheckBox + Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. + + + separateUpdatesCheckBox + Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. + + + showSplashCheckBox + Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. + + + discordRPCCheckbox + Ota käyttöön Discord Rich Presence:\nNäyttää emulaattorin kuvakkeen ja asiaankuuluvat tiedot Discord-profiilissasi. + + + userName + Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissain peleissä. + + + TrophyKey + Trophy Avain:\nThrophyjen dekryptoinnissa käytetty avain. Pitää hankkia jailbreakatusta konsolista.\nSaa sisältää vain hex-merkkejä. + + + logTypeGroupBox + Lokityyppi:\nAsettaa, synkronoidaanko loki-ikkunan ulostulo suorituskyvyn vuoksi. Tämä voi vaikuttaa haitallisesti emulointiin. + + + logFilter + Lokisuodatin:\nSuodattaa lokia tulostamaan vain määrättyä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nTasot: Trace, Debug, Info, Warning, Error, Critical - tässä järjestyksessä. Valittu taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. + + + updaterGroupBox + Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. + + + GUIMusicGroupBox + Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. + + + disableTrophycheckBox + Poista Trophy Pop-upit Käytöstä:\nPoista trophy ilmoitukset pelin aikana. Trophyjen edistystä voi silti seurata Trophy Selainta käyttämällä (klikkaa peliä hiiren oikealla emulaattorin pääikkunassa). + + + hideCursorGroupBox + Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nInaktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. + + + idleTimeoutGroupBox + Aseta aika, milloin hiiri häviää oltuaan aktiivinen. + + + backButtonBehaviorGroupBox + Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan. + + + enableCompatibilityCheckBox + Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön "Päivitä Yhteensopivuustietokanta Käynnistäessä" saadaksesi ajantasaista tietoa. + + + checkCompatibilityOnStartupCheckBox + Päivitä Yhteensopivuustiedot Käynnistäessä:\nPäivitä yhteensopivuustiedot automaattisesti shadPS4:n käynnistyessä. + + + updateCompatibilityButton + Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. + + + Never + Ei koskaan + + + Idle + Inaktiivinen + + + Always + Aina + + + Touchpad Left + Kosketuslevyn Vasen Puoli + + + Touchpad Right + Kosketuslevyn Oikea Puoli + + + Touchpad Center + Kosketuslevyn Keskikohta + + + None + Ei mitään + + + graphicsAdapterGroupBox + Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse "Auto Select" automaattiseen määritykseen. + + + resolutionLayout + Leveys/Korkeus:\nAsettaa käynnistetyn emulaattori-ikkunan koon, jota voidaan muuttaa pelin aikana.\nTämä on eri, kuin pelin sisäinen resoluutio. + + + heightDivider + Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten lisätä pelin nopeutta tai rikkoa kriittisiä pelitoimintoja, jotka eivät odota tämän muuttuvan! + + + dumpShadersCheckBox + Ota Käyttöön Varjostinvedokset:\nTeknistä vianetsintää varten. Pelin varjostimia tallennetaan hakemistoon niiden renderöityessä. + + + nullGpuCheckBox + Ota Null GPU käyttöön:\nTeknistä vianetsintää varten. Pelin renderöinti estetään, ikään kuin näytönohjainta ei olisi. + + + gameFoldersBox + Pelihakemistot:\nLista hakemistoista, joista pelejä haetaan. + + + addFolderButton + Lisää:\nLisää hakemisto listalle. + + + removeFolderButton + Poista:\nPoista hakemisto listalta. + + + debugDump + Ota Käyttöön Virheenkorjausvedokset:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. + + + vkValidationCheckBox + Ota Käyttöön Vulkan-validointikerrokset:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + + + vkSyncValidationCheckBox + Ota Käyttöön Vulkan-synkronointivalidointi:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + + + rdocCheckBox + Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Selaa + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Pelien asennushakemisto + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Selain + + + diff --git a/src/qt_gui/translations/fr.ts b/src/qt_gui/translations/fr.ts deleted file mode 100644 index 0a28c712f..000000000 --- a/src/qt_gui/translations/fr.ts +++ /dev/null @@ -1,1475 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - À propos de shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 est un émulateur open-source expérimental de la PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement. - - - - ElfViewer - - Open Folder - Ouvrir un dossier - - - - GameInfoClass - - Loading game list, please wait :3 - Chargement de la liste de jeu, veuillez patienter... - - - Cancel - Annuler - - - Loading... - Chargement... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choisir un répertoire - - - Select which directory you want to install to. - Sélectionnez le répertoire où vous souhaitez effectuer l'installation. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choisir un répertoire - - - Directory to install games - Répertoire d'installation des jeux - - - Browse - Parcourir - - - Error - Erreur - - - The value for location to install games is not valid. - Le répertoire d'installation des jeux n'est pas valide. - - - - GuiContextMenus - - Create Shortcut - Créer un raccourci - - - Cheats / Patches - Cheats/Patchs - - - SFO Viewer - Visionneuse SFO - - - Trophy Viewer - Visionneuse de trophées - - - Open Folder... - Ouvrir le Dossier... - - - Open Game Folder - Ouvrir le Dossier du Jeu - - - Open Save Data Folder - Ouvrir le Dossier des Données de Sauvegarde - - - Open Log Folder - Ouvrir le Dossier des Logs - - - Copy info... - Copier infos... - - - Copy Name - Copier le nom - - - Copy Serial - Copier le N° de série - - - Copy All - Copier tout - - - Delete... - Supprimer... - - - Delete Game - Supprimer jeu - - - Delete Update - Supprimer MÀJ - - - Delete DLC - Supprimer DLC - - - Compatibility... - Compatibilité... - - - Update database - Mettre à jour la base de données - - - View report - Voir rapport - - - Submit a report - Soumettre un rapport - - - Shortcut creation - Création du raccourci - - - Shortcut created successfully! - Raccourci créé avec succès ! - - - Error - Erreur - - - Error creating shortcut! - Erreur lors de la création du raccourci ! - - - Install PKG - Installer un PKG - - - Game - Jeu - - - requiresEnableSeparateUpdateFolder_MSG - Cette fonctionnalité nécessite l'option 'Dossier séparé pour les mises à jour' pour fonctionner. Si vous voulez utiliser cette fonctionnalité, veuillez l'activer. - - - This game has no update to delete! - Ce jeu n'a pas de mise à jour à supprimer! - - - Update - Mise à jour - - - This game has no DLC to delete! - Ce jeu n'a pas de DLC à supprimer! - - - DLC - DLC - - - Delete %1 - Supprime %1 - - - Are you sure you want to delete %1's %2 directory? - Êtes vous sûr de vouloir supprimer le répertoire %1 %2 ? - - - - MainWindow - - Open/Add Elf Folder - Ouvrir/Ajouter un dossier ELF - - - Install Packages (PKG) - Installer des packages (PKG) - - - Boot Game - Démarrer un jeu - - - Check for Updates - Vérifier les mises à jour - - - About shadPS4 - À propos de shadPS4 - - - Configure... - Configurer... - - - Install application from a .pkg file - Installer une application depuis un fichier .pkg - - - Recent Games - Jeux récents - - - Open shadPS4 Folder - Ouvrir le dossier de shadPS4 - - - Exit - Fermer - - - Exit shadPS4 - Fermer shadPS4 - - - Exit the application. - Fermer l'application. - - - Show Game List - Afficher la liste de jeux - - - Game List Refresh - Rafraîchir la liste de jeux - - - Tiny - Très Petit - - - Small - Petit - - - Medium - Moyen - - - Large - Grand - - - List View - Mode liste - - - Grid View - Mode grille - - - Elf Viewer - Visionneuse ELF - - - Game Install Directory - Répertoire des jeux - - - Download Cheats/Patches - Télécharger Cheats/Patchs - - - Dump Game List - Dumper la liste des jeux - - - PKG Viewer - Visionneuse PKG - - - Search... - Chercher... - - - File - Fichier - - - View - Affichage - - - Game List Icons - Icônes des jeux - - - Game List Mode - Mode d'affichage - - - Settings - Paramètres - - - Utils - Utilitaires - - - Themes - Thèmes - - - Help - Aide - - - Dark - Sombre - - - Light - Clair - - - Green - Vert - - - Blue - Bleu - - - Violet - Violet - - - toolBar - Barre d'outils - - - Game List - Liste de jeux - - - * Unsupported Vulkan Version - * Version de Vulkan non prise en charge - - - Download Cheats For All Installed Games - Télécharger les Cheats pour tous les jeux installés - - - Download Patches For All Games - Télécharger les patchs pour tous les jeux - - - Download Complete - Téléchargement terminé - - - You have downloaded cheats for all the games you have installed. - Vous avez téléchargé des Cheats pour tous les jeux installés. - - - Patches Downloaded Successfully! - Patchs téléchargés avec succès ! - - - All Patches available for all games have been downloaded. - Tous les patchs disponibles ont été téléchargés. - - - Games: - Jeux: - - - PKG File (*.PKG) - Fichiers PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Fichiers ELF (*.bin *.elf *.oelf) - - - Game Boot - Démarrer un jeu - - - Only one file can be selected! - Un seul fichier peut être sélectionné ! - - - PKG Extraction - Extraction du PKG - - - Patch detected! - Patch détecté ! - - - PKG and Game versions match: - Les versions PKG et jeu correspondent: - - - Would you like to overwrite? - Souhaitez-vous remplacer ? - - - PKG Version %1 is older than installed version: - La version PKG %1 est plus ancienne que la version installée: - - - Game is installed: - Jeu installé: - - - Would you like to install Patch: - Souhaitez-vous installer le patch: - - - DLC Installation - Installation du DLC - - - Would you like to install DLC: %1? - Souhaitez-vous installer le DLC: %1 ? - - - DLC already installed: - DLC déjà installé: - - - Game already installed - Jeu déjà installé - - - PKG is a patch, please install the game first! - Le PKG est un patch, veuillez d'abord installer le jeu ! - - - PKG ERROR - Erreur PKG - - - Extracting PKG %1/%2 - Extraction PKG %1/%2 - - - Extraction Finished - Extraction terminée - - - Game successfully installed at %1 - Jeu installé avec succès dans %1 - - - File doesn't appear to be a valid PKG file - Le fichier ne semble pas être un PKG valide - - - - PKGViewer - - Open Folder - Ouvrir un dossier - - - - TrophyViewer - - Trophy Viewer - Visionneuse de trophées - - - - SettingsDialog - - Settings - Paramètres - - - General - Général - - - System - Système - - - Console Language - Langage de la console - - - Emulator Language - Langage de l'émulateur - - - Emulator - Émulateur - - - Enable Fullscreen - Plein écran - - - Fullscreen Mode - Mode Plein Écran - - - Enable Separate Update Folder - Dossier séparé pour les mises à jour - - - Default tab when opening settings - Onglet par défaut lors de l'ouverture des paramètres - - - Show Game Size In List - Afficher la taille des jeux dans la liste - - - Show Splash - Afficher l'image du jeu - - - Is PS4 Pro - Mode PS4 Pro - - - Enable Discord Rich Presence - Activer la présence Discord - - - Username - Nom d'utilisateur - - - Trophy Key - Clé de trophée - - - Trophy - Trophée - - - Logger - Journalisation - - - Log Type - Type de journal - - - Log Filter - Filtre du journal - - - Open Log Location - Ouvrir l'emplacement du journal - - - Input - Entrée - - - Cursor - Curseur - - - Hide Cursor - Masquer le curseur - - - Hide Cursor Idle Timeout - Délai d'inactivité pour masquer le curseur - - - s - s - - - Controller - Manette - - - Back Button Behavior - Comportement du bouton retour - - - Graphics - Graphismes - - - GUI - Interface - - - User - Utilisateur - - - Graphics Device - Carte graphique - - - Width - Largeur - - - Height - Hauteur - - - Vblank Divider - Vblank - - - Advanced - Avancé - - - Enable Shaders Dumping - Dumper les shaders - - - Enable NULL GPU - NULL GPU - - - Paths - Chemins - - - Game Folders - Dossiers de jeu - - - Add... - Ajouter... - - - Remove - Supprimer - - - Debug - Débogage - - - Enable Debug Dumping - Activer le débogage - - - Enable Vulkan Validation Layers - Activer la couche de validation Vulkan - - - Enable Vulkan Synchronization Validation - Activer la synchronisation de la validation Vulkan - - - Enable RenderDoc Debugging - Activer le débogage RenderDoc - - - Enable Crash Diagnostics - Activer le diagnostic de crash - - - Collect Shaders - Collecter les shaders - - - Copy GPU Buffers - Copier la mémoire tampon GPU - - - Host Debug Markers - Marqueur de débogage hôte - - - Guest Debug Markers - Marqueur de débogage invité - - - Update - Mise à jour - - - Check for Updates at Startup - Vérif. maj au démarrage - - - Always Show Changelog - Afficher toujours le changelog - - - Update Channel - Canal de Mise à Jour - - - Check for Updates - Vérifier les mises à jour - - - GUI Settings - Paramètres de l'interface - - - Title Music - Musique du titre - - - Disable Trophy Pop-ups - Désactiver les notifications de trophées - - - Play title music - Lire la musique du titre - - - Update Compatibility Database On Startup - Mettre à jour la base de données de compatibilité au lancement - - - Game Compatibility - Compatibilité du jeu - - - Display Compatibility Data - Afficher les données de compatibilité - - - Update Compatibility Database - Mettre à jour la base de données de compatibilité - - - Volume - Volume - - - Audio Backend - Back-end audio - - - Save - Enregistrer - - - Apply - Appliquer - - - Restore Defaults - Restaurer les paramètres par défaut - - - Close - Fermer - - - Point your mouse at an option to display its description. - Pointez votre souris sur une option pour afficher sa description. - - - consoleLanguageGroupBox - Langue de la console:\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région. - - - emulatorLanguageGroupBox - Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur. - - - fullscreenCheckBox - Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. - - - separateUpdatesCheckBox - Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. - - - showSplashCheckBox - Afficher l'écran de démarrage:\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu. - - - ps4proCheckBox - Mode PS4 Pro:\nFait en sorte que l'émulateur se comporte comme un PS4 PRO, ce qui peut activer des fonctionnalités spéciales dans les jeux qui le prennent en charge. - - - discordRPCCheckbox - Activer Discord Rich Presence:\nAffiche l'icône de l'émulateur et les informations pertinentes sur votre profil Discord. - - - userName - Nom d'utilisateur:\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux. - - - TrophyKey - Clé de trophées:\nClé utilisée pour décrypter les trophées. Doit être obtenu à partir de votre console jailbreakée.\nDoit contenir des caractères hexadécimaux uniquement. - - - logTypeGroupBox - Type de journal:\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation. - - - logFilter - Filtre de journal:\n n'imprime que des informations spécifiques.\nExemples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux: Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants. - - - updaterGroupBox - Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. - - - GUIMusicGroupBox - Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. - - - disableTrophycheckBox - Désactiver les notifications de trophées:\nDésactive les notifications de trophées en jeu. La progression des trophées peut toujours être suivie à l'aide de la Visionneuse de trophées (clique droit sur le jeu sur la fenêtre principale). - - - hideCursorGroupBox - Masquer le curseur:\nChoisissez quand le curseur disparaîtra:\nJamais: Vous verrez toujours la souris.\nInactif: Définissez un temps pour qu'il disparaisse après inactivité.\nToujours: vous ne verrez jamais la souris. - - - idleTimeoutGroupBox - Définissez un temps pour que la souris disparaisse après être inactif. - - - backButtonBehaviorGroupBox - Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4. - - - enableCompatibilityCheckBox - Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez "Mettre à jour la compatibilité au démarrage" pour avoir des informations à jour. - - - checkCompatibilityOnStartupCheckBox - Mettre à jour la compatibilité au démarrage:\nMettre à jour automatiquement la base de données de compatibilité au démarrage de shadPS4. - - - updateCompatibilityButton - Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. - - - Never - Jamais - - - Idle - Inactif - - - Always - Toujours - - - Touchpad Left - Pavé Tactile Gauche - - - Touchpad Right - Pavé Tactile Droit - - - Touchpad Center - Centre du Pavé Tactile - - - None - Aucun - - - graphicsAdapterGroupBox - Adaptateur graphique:\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement. - - - resolutionLayout - Largeur/Hauteur:\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu. - - - heightDivider - Diviseur Vblank:\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement ! - - - dumpShadersCheckBox - Activer l'exportation de shaders:\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu. - - - nullGpuCheckBox - Activer le GPU nul:\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique. - - - gameFoldersBox - Dossiers de jeux:\nLa liste des dossiers à vérifier pour les jeux installés. - - - addFolderButton - Ajouter:\nAjouter un dossier à la liste. - - - removeFolderButton - Supprimer:\nSupprimer un dossier de la liste. - - - debugDump - Activer l'exportation de débogage:\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire. - - - vkValidationCheckBox - Activer les couches de validation Vulkan:\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation. - - - vkSyncValidationCheckBox - Activer la validation de synchronisation Vulkan:\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation. - - - rdocCheckBox - Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. - - - collectShaderCheckBox - Collecter les Shaders:\nVous devez activer cette option pour modifier les shaders avec le menu de débogage (Ctrl + F10). - - - crashDiagnosticsCheckBox - Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer la couche de validation Vulkan ainsi que le Vulkan SDK pour que cela fonctionne. - - - copyGPUBuffersCheckBox - Copier la mémoire tampon GPU:\nContourne les conditions de course impliquant des soumissions GPU.\nPeut aider ou non en cas de crash PM4 type 0. - - - hostMarkersCheckBox - Marqueur de débogage hôte:\nInsère des informations côté émulateur telles que des marqueurs pour des commandes spécifiques AMDGPU autour des commandes Vulkan, ainsi que donner les noms de débogages des ressources.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. - - - guestMarkersCheckBox - Marqueur de débogage invité:\nInsère tous les marqueurs de débogage que le jeu a ajouté a la commande mémoire tampon.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patchs pour - - - defaultTextEdit_MSG - Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Aucune image disponible - - - Serial: - Numéro de série: - - - Version: - Version: - - - Size: - Taille: - - - Select Cheat File: - Sélectionner le fichier de Cheat: - - - Repository: - Dépôt: - - - Download Cheats - Télécharger les Cheats - - - Delete File - Supprimer le fichier - - - No files selected. - Aucun fichier sélectionné. - - - You can delete the cheats you don't want after downloading them. - Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. - - - Do you want to delete the selected file?\n%1 - Voulez-vous supprimer le fichier sélectionné ?\n%1 - - - Select Patch File: - Sélectionner le fichier de patch: - - - Download Patches - Télécharger les patchs - - - Save - Enregistrer - - - Cheats - Cheats - - - Patches - Patchs - - - Error - Erreur - - - No patch selected. - Aucun patch sélectionné. - - - Unable to open files.json for reading. - Impossible d'ouvrir files.json pour la lecture. - - - No patch file found for the current serial. - Aucun fichier de patch trouvé pour la série actuelle. - - - Unable to open the file for reading. - Impossible d'ouvrir le fichier pour la lecture. - - - Unable to open the file for writing. - Impossible d'ouvrir le fichier pour l'écriture. - - - Failed to parse XML: - Échec de l'analyse XML: - - - Success - Succès - - - Options saved successfully. - Options enregistrées avec succès. - - - Invalid Source - Source invalide - - - The selected source is invalid. - La source sélectionnée est invalide. - - - File Exists - Le fichier existe - - - File already exists. Do you want to replace it? - Le fichier existe déjà. Voulez-vous le remplacer ? - - - Failed to save file: - Échec de l'enregistrement du fichier: - - - Failed to download file: - Échec du téléchargement du fichier: - - - Cheats Not Found - Cheats non trouvés - - - CheatsNotFound_MSG - Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. - - - Cheats Downloaded Successfully - Cheats téléchargés avec succès - - - CheatsDownloadedSuccessfully_MSG - Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. - - - Failed to save: - Échec de l'enregistrement: - - - Failed to download: - Échec du téléchargement: - - - Download Complete - Téléchargement terminé - - - DownloadComplete_MSG - Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour la série et la version spécifiques du jeu. - - - Failed to parse JSON data from HTML. - Échec de l'analyse des données JSON à partir du HTML. - - - Failed to retrieve HTML page. - Échec de la récupération de la page HTML. - - - The game is in version: %1 - Le jeu est en version: %1 - - - The downloaded patch only works on version: %1 - Le patch téléchargé ne fonctionne que sur la version: %1 - - - You may need to update your game. - Vous devriez peut-être mettre à jour votre jeu. - - - Incompatibility Notice - Avis d'incompatibilité - - - Failed to open file: - Échec de l'ouverture du fichier: - - - XML ERROR: - Erreur XML: - - - Failed to open files.json for writing - Échec de l'ouverture de files.json pour l'écriture - - - Author: - Auteur: - - - Directory does not exist: - Le répertoire n'existe pas: - - - Failed to open files.json for reading. - Échec de l'ouverture de files.json pour la lecture. - - - Name: - Nom: - - - Can't apply cheats before the game is started - Impossible d'appliquer les cheats avant que le jeu ne soit lancé - - - - GameListFrame - - Icon - Icône - - - Name - Nom - - - Serial - Numéro de série - - - Compatibility - Compatibilité - - - Region - Région - - - Firmware - Firmware - - - Size - Taille - - - Version - Version - - - Path - Répertoire - - - Play Time - Temps de jeu - - - Never Played - Jamais joué - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - La compatibilité n'a pas été testé - - - Game does not initialize properly / crashes the emulator - Le jeu ne se lance pas correctement / crash l'émulateur - - - Game boots, but only displays a blank screen - Le jeu démarre, mais n'affiche qu'un écran noir - - - Game displays an image but does not go past the menu - Le jeu affiche une image mais ne dépasse pas le menu - - - Game has game-breaking glitches or unplayable performance - Le jeu a des problèmes majeurs ou des performances qui le rendent injouable - - - Game can be completed with playable performance and no major glitches - Le jeu peut être terminé avec des performances acceptables et sans problèmes majeurs - - - Click to see details on github - Cliquez pour voir les détails sur GitHub - - - Last updated - Dernière mise à jour - - - - CheckUpdate - - Auto Updater - Mise à jour automatique - - - Error - Erreur - - - Network error: - Erreur réseau: - - - Error_Github_limit_MSG - Le programme de mise à jour automatique permet jusqu'à 60 vérifications de mise à jour par heure.\nVous avez atteint cette limite. Veuillez réessayer plus tard. - - - Failed to parse update information. - Échec de l'analyse des informations de mise à jour. - - - No pre-releases found. - Aucune pré-version trouvée. - - - Invalid release data. - Données de version invalides. - - - No download URL found for the specified asset. - Aucune URL de téléchargement trouvée pour l'élément spécifié. - - - Your version is already up to date! - Votre version est déjà à jour ! - - - Update Available - Mise à jour disponible - - - Update Channel - Canal de Mise à Jour - - - Current Version - Version actuelle - - - Latest Version - Dernière version - - - Do you want to update? - Voulez-vous mettre à jour ? - - - Show Changelog - Afficher le journal des modifications - - - Check for Updates at Startup - Vérif. maj au démarrage - - - Update - Mettre à jour - - - No - Non - - - Hide Changelog - Cacher le journal des modifications - - - Changes - Modifications - - - Network error occurred while trying to access the URL - Une erreur réseau s'est produite en essayant d'accéder à l'URL - - - Download Complete - Téléchargement terminé - - - The update has been downloaded, press OK to install. - La mise à jour a été téléchargée, appuyez sur OK pour l'installer. - - - Failed to save the update file at - Échec de la sauvegarde du fichier de mise à jour à - - - Starting Update... - Démarrage de la mise à jour... - - - Failed to create the update script file - Échec de la création du fichier de script de mise à jour - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Récupération des données de compatibilité, veuillez patienter - - - Cancel - Annuler - - - Loading... - Chargement... - - - Error - Erreur - - - Unable to update compatibility data! Try again later. - Impossible de mettre à jour les données de compatibilité ! Essayez plus tard. - - - Unable to open compatibility_data.json for writing. - Impossible d'ouvrir compatibility_data.json en écriture. - - - Unknown - Inconnu - - - Nothing - Rien - - - Boots - Démarre - - - Menus - Menu - - - Ingame - En jeu - - - Playable - Jouable - - - diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts new file mode 100644 index 000000000..c32d6dca3 --- /dev/null +++ b/src/qt_gui/translations/fr_FR.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + À propos de shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 est un émulateur open-source expérimental de la PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patchs pour + + + defaultTextEdit_MSG + Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Aucune image disponible + + + Serial: + Numéro de série: + + + Version: + Version: + + + Size: + Taille: + + + Select Cheat File: + Sélectionner le fichier de Cheat: + + + Repository: + Dépôt: + + + Download Cheats + Télécharger les Cheats + + + Delete File + Supprimer le fichier + + + No files selected. + Aucun fichier sélectionné. + + + You can delete the cheats you don't want after downloading them. + Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. + + + Do you want to delete the selected file?\n%1 + Voulez-vous supprimer le fichier sélectionné ?\n%1 + + + Select Patch File: + Sélectionner le fichier de patch: + + + Download Patches + Télécharger les patchs + + + Save + Enregistrer + + + Cheats + Cheats + + + Patches + Patchs + + + Error + Erreur + + + No patch selected. + Aucun patch sélectionné. + + + Unable to open files.json for reading. + Impossible d'ouvrir files.json pour la lecture. + + + No patch file found for the current serial. + Aucun fichier de patch trouvé pour la série actuelle. + + + Unable to open the file for reading. + Impossible d'ouvrir le fichier pour la lecture. + + + Unable to open the file for writing. + Impossible d'ouvrir le fichier pour l'écriture. + + + Failed to parse XML: + Échec de l'analyse XML: + + + Success + Succès + + + Options saved successfully. + Options enregistrées avec succès. + + + Invalid Source + Source invalide + + + The selected source is invalid. + La source sélectionnée est invalide. + + + File Exists + Le fichier existe + + + File already exists. Do you want to replace it? + Le fichier existe déjà. Voulez-vous le remplacer ? + + + Failed to save file: + Échec de l'enregistrement du fichier: + + + Failed to download file: + Échec du téléchargement du fichier: + + + Cheats Not Found + Cheats non trouvés + + + CheatsNotFound_MSG + Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. + + + Cheats Downloaded Successfully + Cheats téléchargés avec succès + + + CheatsDownloadedSuccessfully_MSG + Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. + + + Failed to save: + Échec de l'enregistrement: + + + Failed to download: + Échec du téléchargement: + + + Download Complete + Téléchargement terminé + + + DownloadComplete_MSG + Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour la série et la version spécifiques du jeu. + + + Failed to parse JSON data from HTML. + Échec de l'analyse des données JSON à partir du HTML. + + + Failed to retrieve HTML page. + Échec de la récupération de la page HTML. + + + The game is in version: %1 + Le jeu est en version: %1 + + + The downloaded patch only works on version: %1 + Le patch téléchargé ne fonctionne que sur la version: %1 + + + You may need to update your game. + Vous devriez peut-être mettre à jour votre jeu. + + + Incompatibility Notice + Avis d'incompatibilité + + + Failed to open file: + Échec de l'ouverture du fichier: + + + XML ERROR: + Erreur XML: + + + Failed to open files.json for writing + Échec de l'ouverture de files.json pour l'écriture + + + Author: + Auteur: + + + Directory does not exist: + Le répertoire n'existe pas: + + + Failed to open files.json for reading. + Échec de l'ouverture de files.json pour la lecture. + + + Name: + Nom: + + + Can't apply cheats before the game is started + Impossible d'appliquer les cheats avant que le jeu ne soit lancé + + + Close + Fermer + + + + CheckUpdate + + Auto Updater + Mise à jour automatique + + + Error + Erreur + + + Network error: + Erreur réseau: + + + Error_Github_limit_MSG + Le programme de mise à jour automatique permet jusqu'à 60 vérifications de mise à jour par heure.\nVous avez atteint cette limite. Veuillez réessayer plus tard. + + + Failed to parse update information. + Échec de l'analyse des informations de mise à jour. + + + No pre-releases found. + Aucune pré-version trouvée. + + + Invalid release data. + Données de version invalides. + + + No download URL found for the specified asset. + Aucune URL de téléchargement trouvée pour l'élément spécifié. + + + Your version is already up to date! + Votre version est déjà à jour ! + + + Update Available + Mise à jour disponible + + + Update Channel + Canal de Mise à Jour + + + Current Version + Version actuelle + + + Latest Version + Dernière version + + + Do you want to update? + Voulez-vous mettre à jour ? + + + Show Changelog + Afficher le journal des modifications + + + Check for Updates at Startup + Vérif. maj au démarrage + + + Update + Mettre à jour + + + No + Non + + + Hide Changelog + Cacher le journal des modifications + + + Changes + Modifications + + + Network error occurred while trying to access the URL + Une erreur réseau s'est produite en essayant d'accéder à l'URL + + + Download Complete + Téléchargement terminé + + + The update has been downloaded, press OK to install. + La mise à jour a été téléchargée, appuyez sur OK pour l'installer. + + + Failed to save the update file at + Échec de la sauvegarde du fichier de mise à jour à + + + Starting Update... + Démarrage de la mise à jour... + + + Failed to create the update script file + Échec de la création du fichier de script de mise à jour + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Récupération des données de compatibilité, veuillez patienter + + + Cancel + Annuler + + + Loading... + Chargement... + + + Error + Erreur + + + Unable to update compatibility data! Try again later. + Impossible de mettre à jour les données de compatibilité ! Essayez plus tard. + + + Unable to open compatibility_data.json for writing. + Impossible d'ouvrir compatibility_data.json en écriture. + + + Unknown + Inconnu + + + Nothing + Rien + + + Boots + Démarre + + + Menus + Menu + + + Ingame + En jeu + + + Playable + Jouable + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Ouvrir un dossier + + + + GameInfoClass + + Loading game list, please wait :3 + Chargement de la liste de jeu, veuillez patienter... + + + Cancel + Annuler + + + Loading... + Chargement... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choisir un répertoire + + + Directory to install games + Répertoire d'installation des jeux + + + Browse + Parcourir + + + Error + Erreur + + + Directory to install DLC + + + + + GameListFrame + + Icon + Icône + + + Name + Nom + + + Serial + Numéro de série + + + Compatibility + Compatibilité + + + Region + Région + + + Firmware + Firmware + + + Size + Taille + + + Version + Version + + + Path + Répertoire + + + Play Time + Temps de jeu + + + Never Played + Jamais joué + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + La compatibilité n'a pas été testé + + + Game does not initialize properly / crashes the emulator + Le jeu ne se lance pas correctement / crash l'émulateur + + + Game boots, but only displays a blank screen + Le jeu démarre, mais n'affiche qu'un écran noir + + + Game displays an image but does not go past the menu + Le jeu affiche une image mais ne dépasse pas le menu + + + Game has game-breaking glitches or unplayable performance + Le jeu a des problèmes majeurs ou des performances qui le rendent injouable + + + Game can be completed with playable performance and no major glitches + Le jeu peut être terminé avec des performances acceptables et sans problèmes majeurs + + + Click to see details on github + Cliquez pour voir les détails sur GitHub + + + Last updated + Dernière mise à jour + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Créer un raccourci + + + Cheats / Patches + Cheats/Patchs + + + SFO Viewer + Visionneuse SFO + + + Trophy Viewer + Visionneuse de trophées + + + Open Folder... + Ouvrir le Dossier... + + + Open Game Folder + Ouvrir le Dossier du Jeu + + + Open Save Data Folder + Ouvrir le Dossier des Données de Sauvegarde + + + Open Log Folder + Ouvrir le Dossier des Logs + + + Copy info... + Copier infos... + + + Copy Name + Copier le nom + + + Copy Serial + Copier le N° de série + + + Copy All + Copier tout + + + Delete... + Supprimer... + + + Delete Game + Supprimer jeu + + + Delete Update + Supprimer MÀJ + + + Delete DLC + Supprimer DLC + + + Compatibility... + Compatibilité... + + + Update database + Mettre à jour la base de données + + + View report + Voir rapport + + + Submit a report + Soumettre un rapport + + + Shortcut creation + Création du raccourci + + + Shortcut created successfully! + Raccourci créé avec succès ! + + + Error + Erreur + + + Error creating shortcut! + Erreur lors de la création du raccourci ! + + + Install PKG + Installer un PKG + + + Game + Jeu + + + This game has no update to delete! + Ce jeu n'a pas de mise à jour à supprimer! + + + Update + Mise à jour + + + This game has no DLC to delete! + Ce jeu n'a pas de DLC à supprimer! + + + DLC + DLC + + + Delete %1 + Supprime %1 + + + Are you sure you want to delete %1's %2 directory? + Êtes vous sûr de vouloir supprimer le répertoire %1 %2 ? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choisir un répertoire + + + Select which directory you want to install to. + Sélectionnez le répertoire où vous souhaitez effectuer l'installation. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Ouvrir/Ajouter un dossier ELF + + + Install Packages (PKG) + Installer des packages (PKG) + + + Boot Game + Démarrer un jeu + + + Check for Updates + Vérifier les mises à jour + + + About shadPS4 + À propos de shadPS4 + + + Configure... + Configurer... + + + Install application from a .pkg file + Installer une application depuis un fichier .pkg + + + Recent Games + Jeux récents + + + Open shadPS4 Folder + Ouvrir le dossier de shadPS4 + + + Exit + Fermer + + + Exit shadPS4 + Fermer shadPS4 + + + Exit the application. + Fermer l'application. + + + Show Game List + Afficher la liste de jeux + + + Game List Refresh + Rafraîchir la liste de jeux + + + Tiny + Très Petit + + + Small + Petit + + + Medium + Moyen + + + Large + Grand + + + List View + Mode liste + + + Grid View + Mode grille + + + Elf Viewer + Visionneuse ELF + + + Game Install Directory + Répertoire des jeux + + + Download Cheats/Patches + Télécharger Cheats/Patchs + + + Dump Game List + Dumper la liste des jeux + + + PKG Viewer + Visionneuse PKG + + + Search... + Chercher... + + + File + Fichier + + + View + Affichage + + + Game List Icons + Icônes des jeux + + + Game List Mode + Mode d'affichage + + + Settings + Paramètres + + + Utils + Utilitaires + + + Themes + Thèmes + + + Help + Aide + + + Dark + Sombre + + + Light + Clair + + + Green + Vert + + + Blue + Bleu + + + Violet + Violet + + + toolBar + Barre d'outils + + + Game List + Liste de jeux + + + * Unsupported Vulkan Version + * Version de Vulkan non prise en charge + + + Download Cheats For All Installed Games + Télécharger les Cheats pour tous les jeux installés + + + Download Patches For All Games + Télécharger les patchs pour tous les jeux + + + Download Complete + Téléchargement terminé + + + You have downloaded cheats for all the games you have installed. + Vous avez téléchargé des Cheats pour tous les jeux installés. + + + Patches Downloaded Successfully! + Patchs téléchargés avec succès ! + + + All Patches available for all games have been downloaded. + Tous les patchs disponibles ont été téléchargés. + + + Games: + Jeux: + + + ELF files (*.bin *.elf *.oelf) + Fichiers ELF (*.bin *.elf *.oelf) + + + Game Boot + Démarrer un jeu + + + Only one file can be selected! + Un seul fichier peut être sélectionné ! + + + PKG Extraction + Extraction du PKG + + + Patch detected! + Patch détecté ! + + + PKG and Game versions match: + Les versions PKG et jeu correspondent: + + + Would you like to overwrite? + Souhaitez-vous remplacer ? + + + PKG Version %1 is older than installed version: + La version PKG %1 est plus ancienne que la version installée: + + + Game is installed: + Jeu installé: + + + Would you like to install Patch: + Souhaitez-vous installer le patch: + + + DLC Installation + Installation du DLC + + + Would you like to install DLC: %1? + Souhaitez-vous installer le DLC: %1 ? + + + DLC already installed: + DLC déjà installé: + + + Game already installed + Jeu déjà installé + + + PKG ERROR + Erreur PKG + + + Extracting PKG %1/%2 + Extraction PKG %1/%2 + + + Extraction Finished + Extraction terminée + + + Game successfully installed at %1 + Jeu installé avec succès dans %1 + + + File doesn't appear to be a valid PKG file + Le fichier ne semble pas être un PKG valide + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Ouvrir un dossier + + + Name + Nom + + + Serial + Numéro de série + + + Installed + + + + Size + Taille + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Région + + + Flags + + + + Path + Répertoire + + + File + Fichier + + + PKG ERROR + Erreur PKG + + + Unknown + Inconnu + + + Package + + + + + SettingsDialog + + Settings + Paramètres + + + General + Général + + + System + Système + + + Console Language + Langage de la console + + + Emulator Language + Langage de l'émulateur + + + Emulator + Émulateur + + + Enable Fullscreen + Plein écran + + + Fullscreen Mode + Mode Plein Écran + + + Enable Separate Update Folder + Dossier séparé pour les mises à jour + + + Default tab when opening settings + Onglet par défaut lors de l'ouverture des paramètres + + + Show Game Size In List + Afficher la taille des jeux dans la liste + + + Show Splash + Afficher l'image du jeu + + + Enable Discord Rich Presence + Activer la présence Discord + + + Username + Nom d'utilisateur + + + Trophy Key + Clé de trophée + + + Trophy + Trophée + + + Logger + Journalisation + + + Log Type + Type de journal + + + Log Filter + Filtre du journal + + + Open Log Location + Ouvrir l'emplacement du journal + + + Input + Entrée + + + Cursor + Curseur + + + Hide Cursor + Masquer le curseur + + + Hide Cursor Idle Timeout + Délai d'inactivité pour masquer le curseur + + + s + s + + + Controller + Manette + + + Back Button Behavior + Comportement du bouton retour + + + Graphics + Graphismes + + + GUI + Interface + + + User + Utilisateur + + + Graphics Device + Carte graphique + + + Width + Largeur + + + Height + Hauteur + + + Vblank Divider + Vblank + + + Advanced + Avancé + + + Enable Shaders Dumping + Dumper les shaders + + + Enable NULL GPU + NULL GPU + + + Paths + Chemins + + + Game Folders + Dossiers de jeu + + + Add... + Ajouter... + + + Remove + Supprimer + + + Debug + Débogage + + + Enable Debug Dumping + Activer le débogage + + + Enable Vulkan Validation Layers + Activer la couche de validation Vulkan + + + Enable Vulkan Synchronization Validation + Activer la synchronisation de la validation Vulkan + + + Enable RenderDoc Debugging + Activer le débogage RenderDoc + + + Enable Crash Diagnostics + Activer le diagnostic de crash + + + Collect Shaders + Collecter les shaders + + + Copy GPU Buffers + Copier la mémoire tampon GPU + + + Host Debug Markers + Marqueur de débogage hôte + + + Guest Debug Markers + Marqueur de débogage invité + + + Update + Mise à jour + + + Check for Updates at Startup + Vérif. maj au démarrage + + + Always Show Changelog + Afficher toujours le changelog + + + Update Channel + Canal de Mise à Jour + + + Check for Updates + Vérifier les mises à jour + + + GUI Settings + Paramètres de l'interface + + + Title Music + Musique du titre + + + Disable Trophy Pop-ups + Désactiver les notifications de trophées + + + Play title music + Lire la musique du titre + + + Update Compatibility Database On Startup + Mettre à jour la base de données de compatibilité au lancement + + + Game Compatibility + Compatibilité du jeu + + + Display Compatibility Data + Afficher les données de compatibilité + + + Update Compatibility Database + Mettre à jour la base de données de compatibilité + + + Volume + Volume + + + Save + Enregistrer + + + Apply + Appliquer + + + Restore Defaults + Restaurer les paramètres par défaut + + + Close + Fermer + + + Point your mouse at an option to display its description. + Pointez votre souris sur une option pour afficher sa description. + + + consoleLanguageGroupBox + Langue de la console:\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région. + + + emulatorLanguageGroupBox + Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur. + + + fullscreenCheckBox + Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. + + + separateUpdatesCheckBox + Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. + + + showSplashCheckBox + Afficher l'écran de démarrage:\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu. + + + discordRPCCheckbox + Activer Discord Rich Presence:\nAffiche l'icône de l'émulateur et les informations pertinentes sur votre profil Discord. + + + userName + Nom d'utilisateur:\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux. + + + TrophyKey + Clé de trophées:\nClé utilisée pour décrypter les trophées. Doit être obtenu à partir de votre console jailbreakée.\nDoit contenir des caractères hexadécimaux uniquement. + + + logTypeGroupBox + Type de journal:\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation. + + + logFilter + Filtre de journal:\n n'imprime que des informations spécifiques.\nExemples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux: Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants. + + + updaterGroupBox + Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. + + + GUIMusicGroupBox + Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. + + + disableTrophycheckBox + Désactiver les notifications de trophées:\nDésactive les notifications de trophées en jeu. La progression des trophées peut toujours être suivie à l'aide de la Visionneuse de trophées (clique droit sur le jeu sur la fenêtre principale). + + + hideCursorGroupBox + Masquer le curseur:\nChoisissez quand le curseur disparaîtra:\nJamais: Vous verrez toujours la souris.\nInactif: Définissez un temps pour qu'il disparaisse après inactivité.\nToujours: vous ne verrez jamais la souris. + + + idleTimeoutGroupBox + Définissez un temps pour que la souris disparaisse après être inactif. + + + backButtonBehaviorGroupBox + Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4. + + + enableCompatibilityCheckBox + Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez "Mettre à jour la compatibilité au démarrage" pour avoir des informations à jour. + + + checkCompatibilityOnStartupCheckBox + Mettre à jour la compatibilité au démarrage:\nMettre à jour automatiquement la base de données de compatibilité au démarrage de shadPS4. + + + updateCompatibilityButton + Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. + + + Never + Jamais + + + Idle + Inactif + + + Always + Toujours + + + Touchpad Left + Pavé Tactile Gauche + + + Touchpad Right + Pavé Tactile Droit + + + Touchpad Center + Centre du Pavé Tactile + + + None + Aucun + + + graphicsAdapterGroupBox + Adaptateur graphique:\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement. + + + resolutionLayout + Largeur/Hauteur:\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu. + + + heightDivider + Diviseur Vblank:\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement ! + + + dumpShadersCheckBox + Activer l'exportation de shaders:\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu. + + + nullGpuCheckBox + Activer le GPU nul:\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique. + + + gameFoldersBox + Dossiers de jeux:\nLa liste des dossiers à vérifier pour les jeux installés. + + + addFolderButton + Ajouter:\nAjouter un dossier à la liste. + + + removeFolderButton + Supprimer:\nSupprimer un dossier de la liste. + + + debugDump + Activer l'exportation de débogage:\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire. + + + vkValidationCheckBox + Activer les couches de validation Vulkan:\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation. + + + vkSyncValidationCheckBox + Activer la validation de synchronisation Vulkan:\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation. + + + rdocCheckBox + Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. + + + collectShaderCheckBox + Collecter les Shaders:\nVous devez activer cette option pour modifier les shaders avec le menu de débogage (Ctrl + F10). + + + crashDiagnosticsCheckBox + Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer la couche de validation Vulkan ainsi que le Vulkan SDK pour que cela fonctionne. + + + copyGPUBuffersCheckBox + Copier la mémoire tampon GPU:\nContourne les conditions de course impliquant des soumissions GPU.\nPeut aider ou non en cas de crash PM4 type 0. + + + hostMarkersCheckBox + Marqueur de débogage hôte:\nInsère des informations côté émulateur telles que des marqueurs pour des commandes spécifiques AMDGPU autour des commandes Vulkan, ainsi que donner les noms de débogages des ressources.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. + + + guestMarkersCheckBox + Marqueur de débogage invité:\nInsère tous les marqueurs de débogage que le jeu a ajouté a la commande mémoire tampon.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Parcourir + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Répertoire d'installation des jeux + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Visionneuse de trophées + + + diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 0d679cc4c..6ef25db33 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - A shadPS4-ről - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. - - - This software should not be used to play games you have not legally obtained. - Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. - - - - ElfViewer - - Open Folder - Mappa megnyitása - - - - GameInfoClass - - Loading game list, please wait :3 - Játék könyvtár betöltése, kérjük várjon :3 - - - Cancel - Megszakítás - - - Loading... - Betöltés.. - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Mappa kiválasztása - - - Select which directory you want to install to. - Válassza ki a mappát a játékok telepítésére. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Mappa kiválasztása - - - Directory to install games - Mappa a játékok telepítésére - - - Browse - Böngészés - - - Error - Hiba - - - The value for location to install games is not valid. - A játékok telepítéséhez megadott útvonal nem érvényes. - - - - GuiContextMenus - - Create Shortcut - Parancsikon Létrehozása - - - Cheats / Patches - Csalások / Javítások - - - SFO Viewer - SFO Nézegető - - - Trophy Viewer - Trófeák Megtekintése - - - Open Folder... - Mappa megnyitása... - - - Open Game Folder - Játék Mappa Megnyitása - - - Open Save Data Folder - Mentési adatok mappa megnyitása - - - Open Log Folder - Napló mappa megnyitása - - - Copy info... - Információ Másolása... - - - Copy Name - Név Másolása - - - Copy Serial - Széria Másolása - - - Copy All - Összes Másolása - - - Delete... - Törlés... - - - Delete Game - Játék törlése - - - Delete Update - Frissítések törlése - - - Delete DLC - DLC-k törlése - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Parancsikon létrehozása - - - Shortcut created successfully! - Parancsikon sikeresen létrehozva! - - - Error - Hiba - - - Error creating shortcut! - Hiba a parancsikon létrehozásával! - - - Install PKG - PKG telepítése - - - Game - Játék - - - requiresEnableSeparateUpdateFolder_MSG - Ehhez a funkcióhoz szükséges a 'Külön Frissítési Mappa Engedélyezése' opció, hogy működjön. Ha használni akarja, először engedélyezze azt. - - - This game has no update to delete! - Ehhez a játékhoz nem tartozik törlendő frissítés! - - - Update - Frissítés - - - This game has no DLC to delete! - Ehhez a játékhoz nem tartozik törlendő DLC! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Biztosan törölni akarja a %1's %2 mappát? - - - - MainWindow - - Open/Add Elf Folder - ELF Mappa Megnyitása/Hozzáadása - - - Install Packages (PKG) - PKG-k Telepítése (PKG) - - - Boot Game - Játék Indítása - - - Check for Updates - Frissítések keresése - - - About shadPS4 - A shadPS4-ről - - - Configure... - Konfigurálás... - - - Install application from a .pkg file - Program telepítése egy .pkg fájlból - - - Recent Games - Legutóbbi Játékok - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Kilépés - - - Exit shadPS4 - Kilépés a shadPS4-ből - - - Exit the application. - Lépjen ki a programból. - - - Show Game List - Játék Könyvtár Megjelenítése - - - Game List Refresh - Játék Könyvtár Újratöltése - - - Tiny - Apró - - - Small - Kicsi - - - Medium - Közepes - - - Large - Nagy - - - List View - Lista Nézet - - - Grid View - Rács Nézet - - - Elf Viewer - Elf Nézegető - - - Game Install Directory - Játék Telepítési Mappa - - - Download Cheats/Patches - Csalások / Javítások letöltése - - - Dump Game List - Játéklista Dumpolása - - - PKG Viewer - PKG Nézegető - - - Search... - Keresés... - - - File - Fájl - - - View - Nézet - - - Game List Icons - Játékkönyvtár Ikonok - - - Game List Mode - Játékkönyvtár Nézet - - - Settings - Beállítások - - - Utils - Segédeszközök - - - Themes - Témák - - - Help - Segítség - - - Dark - Sötét - - - Light - Világos - - - Green - Zöld - - - Blue - Kék - - - Violet - Ibolya - - - toolBar - Eszköztár - - - Game List - Játéklista - - - * Unsupported Vulkan Version - * Nem támogatott Vulkan verzió - - - Download Cheats For All Installed Games - Csalások letöltése minden telepített játékhoz - - - Download Patches For All Games - Javítások letöltése minden játékhoz - - - Download Complete - Letöltés befejezve - - - You have downloaded cheats for all the games you have installed. - Minden elérhető csalás letöltődött az összes telepített játékhoz. - - - Patches Downloaded Successfully! - Javítások sikeresen letöltve! - - - All Patches available for all games have been downloaded. - Az összes játékhoz elérhető javítás letöltésre került. - - - Games: - Játékok: - - - PKG File (*.PKG) - PKG fájl (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF fájlok (*.bin *.elf *.oelf) - - - Game Boot - Játék indító - - - Only one file can be selected! - Csak egy fájl választható ki! - - - PKG Extraction - PKG kicsomagolás - - - Patch detected! - Frissítés észlelve! - - - PKG and Game versions match: - A PKG és a játék verziói egyeznek: - - - Would you like to overwrite? - Szeretné felülírni? - - - PKG Version %1 is older than installed version: - A(z) %1-es PKG verzió régebbi, mint a telepített verzió: - - - Game is installed: - A játék telepítve van: - - - Would you like to install Patch: - Szeretné telepíteni a frissítést: - - - DLC Installation - DLC Telepítés - - - Would you like to install DLC: %1? - Szeretné telepíteni a %1 DLC-t? - - - DLC already installed: - DLC már telepítve: - - - Game already installed - A játék már telepítve van - - - PKG is a patch, please install the game first! - A PKG egy javítás, először telepítsd a játékot! - - - PKG ERROR - PKG HIBA - - - Extracting PKG %1/%2 - PKG kicsomagolása %1/%2 - - - Extraction Finished - Kicsomagolás befejezve - - - Game successfully installed at %1 - A játék sikeresen telepítve itt: %1 - - - File doesn't appear to be a valid PKG file - A fájl nem tűnik érvényes PKG fájlnak - - - - PKGViewer - - Open Folder - Mappa Megnyitása - - - - TrophyViewer - - Trophy Viewer - Trófeák Megtekintése - - - - SettingsDialog - - Settings - Beállítások - - - General - Általános - - - System - Rendszer - - - Console Language - A Konzol Nyelvezete - - - Emulator Language - Az Emulátor Nyelvezete - - - Emulator - Emulátor - - - Enable Fullscreen - Teljes Képernyő Engedélyezése - - - Fullscreen Mode - Teljes képernyős mód - - - Enable Separate Update Folder - Külön Frissítési Mappa Engedélyezése - - - Default tab when opening settings - Alapértelmezett fül a beállítások megnyitásakor - - - Show Game Size In List - Játékméret megjelenítése a listában - - - Show Splash - Indítóképernyő Mutatása - - - Is PS4 Pro - PS4 Pro mód - - - Enable Discord Rich Presence - A Discord Rich Presence engedélyezése - - - Username - Felhasználónév - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Naplózó - - - Log Type - Naplózási Típus - - - Log Filter - Naplózási Filter - - - Open Log Location - Napló helyének megnyitása - - - Input - Bemenet - - - Cursor - Kurzor - - - Hide Cursor - Kurzor elrejtése - - - Hide Cursor Idle Timeout - Kurzor inaktivitási időtúllépés - - - s - s - - - Controller - Kontroller - - - Back Button Behavior - Vissza gomb Viselkedése - - - Graphics - Grafika - - - GUI - Felület - - - User - Felhasználó - - - Graphics Device - Grafikai Eszköz - - - Width - Szélesség - - - Height - Magasság - - - Vblank Divider - Vblank Elosztó - - - Advanced - Haladó - - - Enable Shaders Dumping - Shader Dumpolás Engedélyezése - - - Enable NULL GPU - NULL GPU Engedélyezése - - - Paths - Útvonalak - - - Game Folders - Játékmappák - - - Add... - Hozzáadás... - - - Remove - Eltávolítás - - - Debug - Debugolás - - - Enable Debug Dumping - Debug Dumpolás Engedélyezése - - - Enable Vulkan Validation Layers - Vulkan Validációs Rétegek Engedélyezése - - - Enable Vulkan Synchronization Validation - Vulkan Szinkronizálás Validáció - - - Enable RenderDoc Debugging - RenderDoc Debugolás Engedélyezése - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Frissítés - - - Check for Updates at Startup - Frissítések keresése indításkor - - - Always Show Changelog - Mindig mutasd a változásnaplót - - - Update Channel - Frissítési Csatorna - - - Check for Updates - Frissítések keresése - - - GUI Settings - GUI Beállítások - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Címzene lejátszása - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Hangerő - - - Audio Backend - Audio Backend - - - Save - Mentés - - - Apply - Alkalmaz - - - Restore Defaults - Alapértelmezett értékek visszaállítása - - - Close - Bezárás - - - Point your mouse at an option to display its description. - Helyezze az egérmutatót egy lehetőség fölé, hogy megjelenítse annak leírását. - - - consoleLanguageGroupBox - Konzol nyelve:\nBeállítja a PS4 játék nyelvét.\nAjánlott a játék által támogatott nyelvre állítani, amely régiónként változhat. - - - emulatorLanguageGroupBox - Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. - - - fullscreenCheckBox - Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. - - - separateUpdatesCheckBox - Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében. - - - showSplashCheckBox - Indítóképernyő megjelenítése:\nMegjeleníti a játék indítóképernyőjét (különleges képet) a játék elindításakor. - - - ps4proCheckBox - PS4 Pro:\nAz emulátort PS4 PRO-ként kezeli, ami engedélyezhet speciális funkciókat olyan játékokban, amelyek támogatják azt. - - - discordRPCCheckbox - A Discord Rich Presence engedélyezése:\nMegjeleníti az emulator ikonját és a kapcsolódó információkat a Discord profilján. - - - userName - Felhasználónév:\nBeállítja a PS4 fiók felhasználónevét, amelyet egyes játékok megjeleníthetnek. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Napló típusa:\nBeállítja, hogy szinkronizálja-e a naplóablak kimenetét a teljesítmény érdekében. Ennek kedvezőtlen hatásai lehetnek az emulációra. - - - logFilter - Napló szűrő:\nCsak bizonyos információk megjelenítésére szűri a naplót.\nPéldák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket. - - - updaterGroupBox - Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. - - - GUIMusicGroupBox - Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Kurzor elrejtése:\nVálassza ki, mikor tűnjön el az egérmutató:\nSoha: Az egér mindig látható.\nInaktív: Állítson be egy időt, amennyi idő mozdulatlanság után eltűnik.\nMindig: az egér mindig el lesz rejtve. - - - idleTimeoutGroupBox - Állítson be egy időt, ami után egér inaktív állapotban eltűnik. - - - backButtonBehaviorGroupBox - Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Soha - - - Idle - Inaktív - - - Always - Mindig - - - Touchpad Left - Érintőpad Bal - - - Touchpad Right - Érintőpad Jobb - - - Touchpad Center - Érintőpad Közép - - - None - Semmi - - - graphicsAdapterGroupBox - Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az "Auto Select" lehetőséget, hogy automatikusan kiválassza azt. - - - resolutionLayout - Szélesség/Magasság:\nBeállítja az emulátor ablakának méretét induláskor, amely a játék során átméretezhető.\nEz különbözik a játékbeli felbontástól. - - - heightDivider - Vblank elosztó:\nAz emulátor frissítési sebessége e számot megszorozva működik. Ennek megváltoztatása kedvezőtlen hatásokat okozhat, például növelheti a játék sebességét, vagy megszakíthat kritikus játékfunkciókat, amelyek nem számítanak arra, hogy ez megváltozik! - - - dumpShadersCheckBox - Shader dumping engedélyezése:\nMűszaki hibaelhárítás céljából a játékok shaderjeit elmenti egy mappába, ahogy renderelődnek. - - - nullGpuCheckBox - Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya. - - - gameFoldersBox - Játék mappák:\nA mappák listája, ahol telepített játékok vannak. - - - addFolderButton - Hozzáadás:\nHozzon létre egy mappát a listában. - - - removeFolderButton - Eltávolítás:\nTávolítson el egy mappát a listából. - - - debugDump - Debug dumpolás engedélyezése:\nElmenti a futó PS4 program import- és exportszimbólumait, valamint a fájl fejlécinformációit egy könyvtárba. - - - vkValidationCheckBox - Vulkan validációs rétegek engedélyezése:\nEngedélyezi a Vulkan renderelő állapotának validálását és információk naplózását annak belső állapotáról. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - - - vkSyncValidationCheckBox - Vulkan szinkronizációs validáció engedélyezése:\nEngedélyezi a Vulkan renderelési feladatok időzítésének validálását. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - - - rdocCheckBox - RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Nincs elérhető kép - - - Serial: - Sorozatszám: - - - Version: - Verzió: - - - Size: - Méret: - - - Select Cheat File: - Válaszd ki a csalás fájlt: - - - Repository: - Tároló: - - - Download Cheats - Csalások letöltése - - - Delete File - Fájl törlése - - - No files selected. - Nincsenek kiválasztott fájlok. - - - You can delete the cheats you don't want after downloading them. - Törölheted a nem kívánt csalásokat a letöltés után. - - - Do you want to delete the selected file?\n%1 - Szeretnéd törölni a kiválasztott fájlt?\n%1 - - - Select Patch File: - Válaszd ki a javítás fájlt: - - - Download Patches - Javítások letöltése - - - Save - Mentés - - - Cheats - Csalások - - - Patches - Javítások - - - Error - Hiba - - - No patch selected. - Nincs kiválasztva javítás. - - - Unable to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. - - - No patch file found for the current serial. - Nincs található javítási fájl a jelenlegi sorozatszámhoz. - - - Unable to open the file for reading. - Nem sikerült megnyitni a fájlt olvasásra. - - - Unable to open the file for writing. - Nem sikerült megnyitni a fájlt írásra. - - - Failed to parse XML: - XML elemzési hiba: - - - Success - Siker - - - Options saved successfully. - A beállítások sikeresen elmentve. - - - Invalid Source - Érvénytelen forrás - - - The selected source is invalid. - A kiválasztott forrás érvénytelen. - - - File Exists - A fájl létezik - - - File already exists. Do you want to replace it? - A fájl már létezik. Szeretnéd helyettesíteni? - - - Failed to save file: - Nem sikerült elmenteni a fájlt: - - - Failed to download file: - Nem sikerült letölteni a fájlt: - - - Cheats Not Found - Csalások nem találhatóak - - - CheatsNotFound_MSG - Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban, próbálj meg egy másik tárolót vagy a játék egy másik verzióját. - - - Cheats Downloaded Successfully - Csalások sikeresen letöltve - - - CheatsDownloadedSuccessfully_MSG - Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. - - - Failed to save: - Nem sikerült menteni: - - - Failed to download: - Nem sikerült letölteni: - - - Download Complete - Letöltés befejezve - - - DownloadComplete_MSG - Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítások nem jelennek meg, lehet, hogy nem léteznek a játék adott sorozatszámához és verziójához. - - - Failed to parse JSON data from HTML. - Nem sikerült az JSON adatok elemzése HTML-ből. - - - Failed to retrieve HTML page. - Nem sikerült HTML oldal lekérése. - - - The game is in version: %1 - A játék verziója: %1 - - - The downloaded patch only works on version: %1 - A letöltött javításhoz a(z) %1 verzió működik - - - You may need to update your game. - Lehet, hogy frissítened kell a játékodat. - - - Incompatibility Notice - Inkompatibilitási értesítés - - - Failed to open file: - Nem sikerült megnyitni a fájlt: - - - XML ERROR: - XML HIBA: - - - Failed to open files.json for writing - Nem sikerült megnyitni a files.json fájlt írásra - - - Author: - Szerző: - - - Directory does not exist: - A mappa nem létezik: - - - Failed to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. - - - Name: - Név: - - - Can't apply cheats before the game is started - Nem lehet csalásokat alkalmazni, mielőtt a játék elindul. - - - - GameListFrame - - Icon - Ikon - - - Name - Név - - - Serial - Sorozatszám - - - Compatibility - Compatibility - - - Region - Régió - - - Firmware - Firmware - - - Size - Méret - - - Version - Verzió - - - Path - Útvonal - - - Play Time - Játékidő - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Kattintson a részletek megtekintéséhez a GitHubon - - - Last updated - Utoljára frissítve - - - - CheckUpdate - - Auto Updater - Automatikus frissítő - - - Error - Hiba - - - Network error: - Hálózati hiba: - - - Error_Github_limit_MSG - Az automatikus frissítő óránként legfeljebb 60 frissítésellenőrzést engedélyez.\nElérte ezt a korlátot. Kérjük, próbálja újra később. - - - Failed to parse update information. - A frissítési információk elemzése sikertelen. - - - No pre-releases found. - Nem található előzetes kiadás. - - - Invalid release data. - Érvénytelen kiadási adatok. - - - No download URL found for the specified asset. - Nincs letöltési URL a megadott eszközhöz. - - - Your version is already up to date! - A verziód már naprakész! - - - Update Available - Frissítés elérhető - - - Update Channel - Frissítési Csatorna - - - Current Version - Jelenlegi verzió - - - Latest Version - Új verzió - - - Do you want to update? - Szeretnéd frissíteni? - - - Show Changelog - Változások megjelenítése - - - Check for Updates at Startup - Frissítések keresése indításkor - - - Update - Frissítés - - - No - Mégse - - - Hide Changelog - Változások elrejtése - - - Changes - Változások - - - Network error occurred while trying to access the URL - Hálózati hiba történt az URL elérésekor - - - Download Complete - Letöltés kész - - - The update has been downloaded, press OK to install. - A frissítés letöltődött, nyomja meg az OK gombot az telepítéshez. - - - Failed to save the update file at - A frissítési fájl mentése nem sikerült a következő helyre - - - Starting Update... - Frissítés indítása... - - - Failed to create the update script file - A frissítési szkript fájl létrehozása nem sikerült - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Kompatibilitási adatok betöltése, kérem várjon - - - Cancel - Megszakítás - - - Loading... - Betöltés... - - - Error - Hiba - - - Unable to update compatibility data! Try again later. - Nem sikerült frissíteni a kompatibilitási adatokat! Kérem próbálja újra később. - - - Unable to open compatibility_data.json for writing. - Nem sikerült megnyitni a compatibility_data.json fájlt írásra. - - - Unknown - Ismeretlen - - - Nothing - Semmi - - - Boots - Csizmák - - - Menus - Menük - - - Ingame - Játékban - - - Playable - Játszható - - + + AboutDialog + + About shadPS4 + A shadPS4-ről + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. + + + This software should not be used to play games you have not legally obtained. + Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nincs elérhető kép + + + Serial: + Sorozatszám: + + + Version: + Verzió: + + + Size: + Méret: + + + Select Cheat File: + Válaszd ki a csalás fájlt: + + + Repository: + Tároló: + + + Download Cheats + Csalások letöltése + + + Delete File + Fájl törlése + + + No files selected. + Nincsenek kiválasztott fájlok. + + + You can delete the cheats you don't want after downloading them. + Törölheted a nem kívánt csalásokat a letöltés után. + + + Do you want to delete the selected file?\n%1 + Szeretnéd törölni a kiválasztott fájlt?\n%1 + + + Select Patch File: + Válaszd ki a javítás fájlt: + + + Download Patches + Javítások letöltése + + + Save + Mentés + + + Cheats + Csalások + + + Patches + Javítások + + + Error + Hiba + + + No patch selected. + Nincs kiválasztva javítás. + + + Unable to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. + + + No patch file found for the current serial. + Nincs található javítási fájl a jelenlegi sorozatszámhoz. + + + Unable to open the file for reading. + Nem sikerült megnyitni a fájlt olvasásra. + + + Unable to open the file for writing. + Nem sikerült megnyitni a fájlt írásra. + + + Failed to parse XML: + XML elemzési hiba: + + + Success + Siker + + + Options saved successfully. + A beállítások sikeresen elmentve. + + + Invalid Source + Érvénytelen forrás + + + The selected source is invalid. + A kiválasztott forrás érvénytelen. + + + File Exists + A fájl létezik + + + File already exists. Do you want to replace it? + A fájl már létezik. Szeretnéd helyettesíteni? + + + Failed to save file: + Nem sikerült elmenteni a fájlt: + + + Failed to download file: + Nem sikerült letölteni a fájlt: + + + Cheats Not Found + Csalások nem találhatóak + + + CheatsNotFound_MSG + Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban, próbálj meg egy másik tárolót vagy a játék egy másik verzióját. + + + Cheats Downloaded Successfully + Csalások sikeresen letöltve + + + CheatsDownloadedSuccessfully_MSG + Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. + + + Failed to save: + Nem sikerült menteni: + + + Failed to download: + Nem sikerült letölteni: + + + Download Complete + Letöltés befejezve + + + DownloadComplete_MSG + Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítások nem jelennek meg, lehet, hogy nem léteznek a játék adott sorozatszámához és verziójához. + + + Failed to parse JSON data from HTML. + Nem sikerült az JSON adatok elemzése HTML-ből. + + + Failed to retrieve HTML page. + Nem sikerült HTML oldal lekérése. + + + The game is in version: %1 + A játék verziója: %1 + + + The downloaded patch only works on version: %1 + A letöltött javításhoz a(z) %1 verzió működik + + + You may need to update your game. + Lehet, hogy frissítened kell a játékodat. + + + Incompatibility Notice + Inkompatibilitási értesítés + + + Failed to open file: + Nem sikerült megnyitni a fájlt: + + + XML ERROR: + XML HIBA: + + + Failed to open files.json for writing + Nem sikerült megnyitni a files.json fájlt írásra + + + Author: + Szerző: + + + Directory does not exist: + A mappa nem létezik: + + + Failed to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. + + + Name: + Név: + + + Can't apply cheats before the game is started + Nem lehet csalásokat alkalmazni, mielőtt a játék elindul. + + + Close + Bezárás + + + + CheckUpdate + + Auto Updater + Automatikus frissítő + + + Error + Hiba + + + Network error: + Hálózati hiba: + + + Error_Github_limit_MSG + Az automatikus frissítő óránként legfeljebb 60 frissítésellenőrzést engedélyez.\nElérte ezt a korlátot. Kérjük, próbálja újra később. + + + Failed to parse update information. + A frissítési információk elemzése sikertelen. + + + No pre-releases found. + Nem található előzetes kiadás. + + + Invalid release data. + Érvénytelen kiadási adatok. + + + No download URL found for the specified asset. + Nincs letöltési URL a megadott eszközhöz. + + + Your version is already up to date! + A verziód már naprakész! + + + Update Available + Frissítés elérhető + + + Update Channel + Frissítési Csatorna + + + Current Version + Jelenlegi verzió + + + Latest Version + Új verzió + + + Do you want to update? + Szeretnéd frissíteni? + + + Show Changelog + Változások megjelenítése + + + Check for Updates at Startup + Frissítések keresése indításkor + + + Update + Frissítés + + + No + Mégse + + + Hide Changelog + Változások elrejtése + + + Changes + Változások + + + Network error occurred while trying to access the URL + Hálózati hiba történt az URL elérésekor + + + Download Complete + Letöltés kész + + + The update has been downloaded, press OK to install. + A frissítés letöltődött, nyomja meg az OK gombot az telepítéshez. + + + Failed to save the update file at + A frissítési fájl mentése nem sikerült a következő helyre + + + Starting Update... + Frissítés indítása... + + + Failed to create the update script file + A frissítési szkript fájl létrehozása nem sikerült + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Kompatibilitási adatok betöltése, kérem várjon + + + Cancel + Megszakítás + + + Loading... + Betöltés... + + + Error + Hiba + + + Unable to update compatibility data! Try again later. + Nem sikerült frissíteni a kompatibilitási adatokat! Kérem próbálja újra később. + + + Unable to open compatibility_data.json for writing. + Nem sikerült megnyitni a compatibility_data.json fájlt írásra. + + + Unknown + Ismeretlen + + + Nothing + Semmi + + + Boots + Csizmák + + + Menus + Menük + + + Ingame + Játékban + + + Playable + Játszható + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Mappa megnyitása + + + + GameInfoClass + + Loading game list, please wait :3 + Játék könyvtár betöltése, kérjük várjon :3 + + + Cancel + Megszakítás + + + Loading... + Betöltés.. + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Mappa kiválasztása + + + Directory to install games + Mappa a játékok telepítésére + + + Browse + Böngészés + + + Error + Hiba + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikon + + + Name + Név + + + Serial + Sorozatszám + + + Compatibility + Compatibility + + + Region + Régió + + + Firmware + Firmware + + + Size + Méret + + + Version + Verzió + + + Path + Útvonal + + + Play Time + Játékidő + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Kattintson a részletek megtekintéséhez a GitHubon + + + Last updated + Utoljára frissítve + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Parancsikon Létrehozása + + + Cheats / Patches + Csalások / Javítások + + + SFO Viewer + SFO Nézegető + + + Trophy Viewer + Trófeák Megtekintése + + + Open Folder... + Mappa megnyitása... + + + Open Game Folder + Játék Mappa Megnyitása + + + Open Save Data Folder + Mentési adatok mappa megnyitása + + + Open Log Folder + Napló mappa megnyitása + + + Copy info... + Információ Másolása... + + + Copy Name + Név Másolása + + + Copy Serial + Széria Másolása + + + Copy All + Összes Másolása + + + Delete... + Törlés... + + + Delete Game + Játék törlése + + + Delete Update + Frissítések törlése + + + Delete DLC + DLC-k törlése + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Parancsikon létrehozása + + + Shortcut created successfully! + Parancsikon sikeresen létrehozva! + + + Error + Hiba + + + Error creating shortcut! + Hiba a parancsikon létrehozásával! + + + Install PKG + PKG telepítése + + + Game + Játék + + + This game has no update to delete! + Ehhez a játékhoz nem tartozik törlendő frissítés! + + + Update + Frissítés + + + This game has no DLC to delete! + Ehhez a játékhoz nem tartozik törlendő DLC! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Biztosan törölni akarja a %1's %2 mappát? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Mappa kiválasztása + + + Select which directory you want to install to. + Válassza ki a mappát a játékok telepítésére. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + ELF Mappa Megnyitása/Hozzáadása + + + Install Packages (PKG) + PKG-k Telepítése (PKG) + + + Boot Game + Játék Indítása + + + Check for Updates + Frissítések keresése + + + About shadPS4 + A shadPS4-ről + + + Configure... + Konfigurálás... + + + Install application from a .pkg file + Program telepítése egy .pkg fájlból + + + Recent Games + Legutóbbi Játékok + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Kilépés + + + Exit shadPS4 + Kilépés a shadPS4-ből + + + Exit the application. + Lépjen ki a programból. + + + Show Game List + Játék Könyvtár Megjelenítése + + + Game List Refresh + Játék Könyvtár Újratöltése + + + Tiny + Apró + + + Small + Kicsi + + + Medium + Közepes + + + Large + Nagy + + + List View + Lista Nézet + + + Grid View + Rács Nézet + + + Elf Viewer + Elf Nézegető + + + Game Install Directory + Játék Telepítési Mappa + + + Download Cheats/Patches + Csalások / Javítások letöltése + + + Dump Game List + Játéklista Dumpolása + + + PKG Viewer + PKG Nézegető + + + Search... + Keresés... + + + File + Fájl + + + View + Nézet + + + Game List Icons + Játékkönyvtár Ikonok + + + Game List Mode + Játékkönyvtár Nézet + + + Settings + Beállítások + + + Utils + Segédeszközök + + + Themes + Témák + + + Help + Segítség + + + Dark + Sötét + + + Light + Világos + + + Green + Zöld + + + Blue + Kék + + + Violet + Ibolya + + + toolBar + Eszköztár + + + Game List + Játéklista + + + * Unsupported Vulkan Version + * Nem támogatott Vulkan verzió + + + Download Cheats For All Installed Games + Csalások letöltése minden telepített játékhoz + + + Download Patches For All Games + Javítások letöltése minden játékhoz + + + Download Complete + Letöltés befejezve + + + You have downloaded cheats for all the games you have installed. + Minden elérhető csalás letöltődött az összes telepített játékhoz. + + + Patches Downloaded Successfully! + Javítások sikeresen letöltve! + + + All Patches available for all games have been downloaded. + Az összes játékhoz elérhető javítás letöltésre került. + + + Games: + Játékok: + + + ELF files (*.bin *.elf *.oelf) + ELF fájlok (*.bin *.elf *.oelf) + + + Game Boot + Játék indító + + + Only one file can be selected! + Csak egy fájl választható ki! + + + PKG Extraction + PKG kicsomagolás + + + Patch detected! + Frissítés észlelve! + + + PKG and Game versions match: + A PKG és a játék verziói egyeznek: + + + Would you like to overwrite? + Szeretné felülírni? + + + PKG Version %1 is older than installed version: + A(z) %1-es PKG verzió régebbi, mint a telepített verzió: + + + Game is installed: + A játék telepítve van: + + + Would you like to install Patch: + Szeretné telepíteni a frissítést: + + + DLC Installation + DLC Telepítés + + + Would you like to install DLC: %1? + Szeretné telepíteni a %1 DLC-t? + + + DLC already installed: + DLC már telepítve: + + + Game already installed + A játék már telepítve van + + + PKG ERROR + PKG HIBA + + + Extracting PKG %1/%2 + PKG kicsomagolása %1/%2 + + + Extraction Finished + Kicsomagolás befejezve + + + Game successfully installed at %1 + A játék sikeresen telepítve itt: %1 + + + File doesn't appear to be a valid PKG file + A fájl nem tűnik érvényes PKG fájlnak + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Mappa Megnyitása + + + Name + Név + + + Serial + Sorozatszám + + + Installed + + + + Size + Méret + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Régió + + + Flags + + + + Path + Útvonal + + + File + Fájl + + + PKG ERROR + PKG HIBA + + + Unknown + Ismeretlen + + + Package + + + + + SettingsDialog + + Settings + Beállítások + + + General + Általános + + + System + Rendszer + + + Console Language + A Konzol Nyelvezete + + + Emulator Language + Az Emulátor Nyelvezete + + + Emulator + Emulátor + + + Enable Fullscreen + Teljes Képernyő Engedélyezése + + + Fullscreen Mode + Teljes képernyős mód + + + Enable Separate Update Folder + Külön Frissítési Mappa Engedélyezése + + + Default tab when opening settings + Alapértelmezett fül a beállítások megnyitásakor + + + Show Game Size In List + Játékméret megjelenítése a listában + + + Show Splash + Indítóképernyő Mutatása + + + Enable Discord Rich Presence + A Discord Rich Presence engedélyezése + + + Username + Felhasználónév + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Naplózó + + + Log Type + Naplózási Típus + + + Log Filter + Naplózási Filter + + + Open Log Location + Napló helyének megnyitása + + + Input + Bemenet + + + Cursor + Kurzor + + + Hide Cursor + Kurzor elrejtése + + + Hide Cursor Idle Timeout + Kurzor inaktivitási időtúllépés + + + s + s + + + Controller + Kontroller + + + Back Button Behavior + Vissza gomb Viselkedése + + + Graphics + Grafika + + + GUI + Felület + + + User + Felhasználó + + + Graphics Device + Grafikai Eszköz + + + Width + Szélesség + + + Height + Magasság + + + Vblank Divider + Vblank Elosztó + + + Advanced + Haladó + + + Enable Shaders Dumping + Shader Dumpolás Engedélyezése + + + Enable NULL GPU + NULL GPU Engedélyezése + + + Paths + Útvonalak + + + Game Folders + Játékmappák + + + Add... + Hozzáadás... + + + Remove + Eltávolítás + + + Debug + Debugolás + + + Enable Debug Dumping + Debug Dumpolás Engedélyezése + + + Enable Vulkan Validation Layers + Vulkan Validációs Rétegek Engedélyezése + + + Enable Vulkan Synchronization Validation + Vulkan Szinkronizálás Validáció + + + Enable RenderDoc Debugging + RenderDoc Debugolás Engedélyezése + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Frissítés + + + Check for Updates at Startup + Frissítések keresése indításkor + + + Always Show Changelog + Mindig mutasd a változásnaplót + + + Update Channel + Frissítési Csatorna + + + Check for Updates + Frissítések keresése + + + GUI Settings + GUI Beállítások + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Címzene lejátszása + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Hangerő + + + Save + Mentés + + + Apply + Alkalmaz + + + Restore Defaults + Alapértelmezett értékek visszaállítása + + + Close + Bezárás + + + Point your mouse at an option to display its description. + Helyezze az egérmutatót egy lehetőség fölé, hogy megjelenítse annak leírását. + + + consoleLanguageGroupBox + Konzol nyelve:\nBeállítja a PS4 játék nyelvét.\nAjánlott a játék által támogatott nyelvre állítani, amely régiónként változhat. + + + emulatorLanguageGroupBox + Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. + + + fullscreenCheckBox + Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. + + + separateUpdatesCheckBox + Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében. + + + showSplashCheckBox + Indítóképernyő megjelenítése:\nMegjeleníti a játék indítóképernyőjét (különleges képet) a játék elindításakor. + + + discordRPCCheckbox + A Discord Rich Presence engedélyezése:\nMegjeleníti az emulator ikonját és a kapcsolódó információkat a Discord profilján. + + + userName + Felhasználónév:\nBeállítja a PS4 fiók felhasználónevét, amelyet egyes játékok megjeleníthetnek. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Napló típusa:\nBeállítja, hogy szinkronizálja-e a naplóablak kimenetét a teljesítmény érdekében. Ennek kedvezőtlen hatásai lehetnek az emulációra. + + + logFilter + Napló szűrő:\nCsak bizonyos információk megjelenítésére szűri a naplót.\nPéldák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket. + + + updaterGroupBox + Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. + + + GUIMusicGroupBox + Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Kurzor elrejtése:\nVálassza ki, mikor tűnjön el az egérmutató:\nSoha: Az egér mindig látható.\nInaktív: Állítson be egy időt, amennyi idő mozdulatlanság után eltűnik.\nMindig: az egér mindig el lesz rejtve. + + + idleTimeoutGroupBox + Állítson be egy időt, ami után egér inaktív állapotban eltűnik. + + + backButtonBehaviorGroupBox + Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Soha + + + Idle + Inaktív + + + Always + Mindig + + + Touchpad Left + Érintőpad Bal + + + Touchpad Right + Érintőpad Jobb + + + Touchpad Center + Érintőpad Közép + + + None + Semmi + + + graphicsAdapterGroupBox + Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az "Auto Select" lehetőséget, hogy automatikusan kiválassza azt. + + + resolutionLayout + Szélesség/Magasság:\nBeállítja az emulátor ablakának méretét induláskor, amely a játék során átméretezhető.\nEz különbözik a játékbeli felbontástól. + + + heightDivider + Vblank elosztó:\nAz emulátor frissítési sebessége e számot megszorozva működik. Ennek megváltoztatása kedvezőtlen hatásokat okozhat, például növelheti a játék sebességét, vagy megszakíthat kritikus játékfunkciókat, amelyek nem számítanak arra, hogy ez megváltozik! + + + dumpShadersCheckBox + Shader dumping engedélyezése:\nMűszaki hibaelhárítás céljából a játékok shaderjeit elmenti egy mappába, ahogy renderelődnek. + + + nullGpuCheckBox + Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya. + + + gameFoldersBox + Játék mappák:\nA mappák listája, ahol telepített játékok vannak. + + + addFolderButton + Hozzáadás:\nHozzon létre egy mappát a listában. + + + removeFolderButton + Eltávolítás:\nTávolítson el egy mappát a listából. + + + debugDump + Debug dumpolás engedélyezése:\nElmenti a futó PS4 program import- és exportszimbólumait, valamint a fájl fejlécinformációit egy könyvtárba. + + + vkValidationCheckBox + Vulkan validációs rétegek engedélyezése:\nEngedélyezi a Vulkan renderelő állapotának validálását és információk naplózását annak belső állapotáról. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. + + + vkSyncValidationCheckBox + Vulkan szinkronizációs validáció engedélyezése:\nEngedélyezi a Vulkan renderelési feladatok időzítésének validálását. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. + + + rdocCheckBox + RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Böngészés + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Mappa a játékok telepítésére + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trófeák Megtekintése + + diff --git a/src/qt_gui/translations/id.ts b/src/qt_gui/translations/id.ts deleted file mode 100644 index 1ddd75b45..000000000 --- a/src/qt_gui/translations/id.ts +++ /dev/null @@ -1,1475 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - Cheat / Patch - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Buka Folder... - - - Open Game Folder - Buka Folder Game - - - Open Save Data Folder - Buka Folder Data Simpanan - - - Open Log Folder - Buka Folder Log - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Periksa pembaruan - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Unduh Cheat / Patch - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Bantuan - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Daftar game - - - * Unsupported Vulkan Version - * Versi Vulkan Tidak Didukung - - - Download Cheats For All Installed Games - Unduh Cheat Untuk Semua Game Yang Terpasang - - - Download Patches For All Games - Unduh Patch Untuk Semua Game - - - Download Complete - Unduhan Selesai - - - You have downloaded cheats for all the games you have installed. - Anda telah mengunduh cheat untuk semua game yang terpasang. - - - Patches Downloaded Successfully! - Patch Berhasil Diunduh! - - - All Patches available for all games have been downloaded. - Semua Patch yang tersedia untuk semua game telah diunduh. - - - Games: - Game: - - - PKG File (*.PKG) - File PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) - - - Game Boot - Boot Game - - - Only one file can be selected! - Hanya satu file yang bisa dipilih! - - - PKG Extraction - Ekstraksi PKG - - - Patch detected! - Patch terdeteksi! - - - PKG and Game versions match: - Versi PKG dan Game cocok: - - - Would you like to overwrite? - Apakah Anda ingin menimpa? - - - PKG Version %1 is older than installed version: - Versi PKG %1 lebih lama dari versi yang terpasang: - - - Game is installed: - Game telah terpasang: - - - Would you like to install Patch: - Apakah Anda ingin menginstal patch: - - - DLC Installation - Instalasi DLC - - - Would you like to install DLC: %1? - Apakah Anda ingin menginstal DLC: %1? - - - DLC already installed: - DLC sudah terpasang: - - - Game already installed - Game sudah terpasang - - - PKG is a patch, please install the game first! - PKG adalah patch, harap pasang game terlebih dahulu! - - - PKG ERROR - KESALAHAN PKG - - - Extracting PKG %1/%2 - Mengekstrak PKG %1/%2 - - - Extraction Finished - Ekstraksi Selesai - - - Game successfully installed at %1 - Game berhasil dipasang di %1 - - - File doesn't appear to be a valid PKG file - File tampaknya bukan file PKG yang valid - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Mode Layar Penuh - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Tab default saat membuka pengaturan - - - Show Game Size In List - Tampilkan Ukuran Game di Daftar - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Aktifkan Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Buka Lokasi Log - - - Input - Masukan - - - Cursor - Kursor - - - Hide Cursor - Sembunyikan kursor - - - Hide Cursor Idle Timeout - Batas waktu sembunyikan kursor tidak aktif - - - s - s - - - Controller - Pengontrol - - - Back Button Behavior - Perilaku tombol kembali - - - Graphics - Graphics - - - GUI - Antarmuka - - - User - Pengguna - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Jalur - - - Game Folders - Folder Permainan - - - Add... - Tambah... - - - Remove - Hapus - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Pembaruan - - - Check for Updates at Startup - Periksa pembaruan saat mulai - - - Always Show Changelog - Selalu Tampilkan Riwayat Perubahan - - - Update Channel - Saluran Pembaruan - - - Check for Updates - Periksa pembaruan - - - GUI Settings - Pengaturan GUI - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Putar musik judul - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Volume - - - Audio Backend - Audio Backend - - - Save - Simpan - - - Apply - Terapkan - - - Restore Defaults - Kembalikan Pengaturan Default - - - Close - Tutup - - - Point your mouse at an option to display its description. - Arahkan mouse Anda pada opsi untuk menampilkan deskripsinya. - - - consoleLanguageGroupBox - Bahasa Konsol:\nMenetapkan bahasa yang digunakan oleh permainan PS4.\nDisarankan untuk mengatur ini ke bahasa yang didukung oleh permainan, yang dapat bervariasi berdasarkan wilayah. - - - emulatorLanguageGroupBox - Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. - - - fullscreenCheckBox - Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Tampilkan Layar Pembuka:\nMenampilkan layar pembuka permainan (gambar khusus) saat permainan dimulai. - - - ps4proCheckBox - Adalah PS4 Pro:\nMembuat emulator berfungsi sebagai PS4 PRO, yang mungkin mengaktifkan fitur khusus dalam permainan yang mendukungnya. - - - discordRPCCheckbox - Aktifkan Discord Rich Presence:\nMenampilkan ikon emulator dan informasi relevan di profil Discord Anda. - - - userName - Nama Pengguna:\nMenetapkan nama pengguna akun PS4, yang mungkin ditampilkan oleh beberapa permainan. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Jenis Log:\nMenetapkan apakah untuk menyinkronkan output jendela log untuk kinerja. Dapat memiliki efek buruk pada emulasi. - - - logFilter - Filter Log:\nMenyaring log untuk hanya mencetak informasi tertentu.\nContoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya. - - - updaterGroupBox - Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. - - - GUIMusicGroupBox - Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Sembunyikan Kursor:\nPilih kapan kursor akan menghilang:\nTidak Pernah: Anda akan selalu melihat mouse.\nTidak Aktif: Tetapkan waktu untuk menghilang setelah tidak aktif.\nSelalu: Anda tidak akan pernah melihat mouse. - - - idleTimeoutGroupBox - Tetapkan waktu untuk mouse menghilang setelah tidak aktif. - - - backButtonBehaviorGroupBox - Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Tidak Pernah - - - Idle - Diam - - - Always - Selalu - - - Touchpad Left - Touchpad Kiri - - - Touchpad Right - Touchpad Kanan - - - Touchpad Center - Pusat Touchpad - - - None - Tidak Ada - - - graphicsAdapterGroupBox - Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih "Auto Select" untuk menentukan secara otomatis. - - - resolutionLayout - Lebar/Tinggi:\nMenetapkan ukuran jendela emulator saat diluncurkan, yang dapat diubah ukurannya selama permainan.\nIni berbeda dari resolusi dalam permainan. - - - heightDivider - Pembagi Vblank:\nKecepatan bingkai di mana emulator menyegarkan dikalikan dengan angka ini. Mengubah ini dapat memiliki efek buruk, seperti meningkatkan kecepatan permainan, atau merusak fungsi kritis permainan yang tidak mengharapkan ini berubah! - - - dumpShadersCheckBox - Aktifkan Pembuangan Shader:\nUntuk tujuan debugging teknis, menyimpan shader permainan ke folder saat mereka dirender. - - - nullGpuCheckBox - Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis. - - - gameFoldersBox - Folder Permainan:\nDaftar folder untuk memeriksa permainan yang diinstal. - - - addFolderButton - Tambah:\nTambahkan folder ke daftar. - - - removeFolderButton - Hapus:\nHapus folder dari daftar. - - - debugDump - Aktifkan Pembuangan Debug:\nMenyimpan simbol impor dan ekspor serta informasi header file dari program PS4 yang sedang berjalan ke direktori. - - - vkValidationCheckBox - Aktifkan Vulkan Validation Layers:\nMengaktifkan sistem yang memvalidasi status penggambaran Vulkan dan mencatat informasi tentang status internalnya. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - - - vkSyncValidationCheckBox - Aktifkan Vulkan Synchronization Validation:\nMengaktifkan sistem yang memvalidasi waktu tugas penggambaran Vulkan. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - - - rdocCheckBox - Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Tidak Ada Gambar Tersedia - - - Serial: - Serial: - - - Version: - Versi: - - - Size: - Ukuran: - - - Select Cheat File: - Pilih File Cheat: - - - Repository: - Repositori: - - - Download Cheats - Unduh Cheat - - - Delete File - Hapus File - - - No files selected. - Tidak ada file yang dipilih. - - - You can delete the cheats you don't want after downloading them. - Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. - - - Do you want to delete the selected file?\n%1 - Apakah Anda ingin menghapus berkas yang dipilih?\n%1 - - - Select Patch File: - Pilih File Patch: - - - Download Patches - Unduh Patch - - - Save - Simpan - - - Cheats - Cheat - - - Patches - Patch - - - Error - Kesalahan - - - No patch selected. - Tidak ada patch yang dipilih. - - - Unable to open files.json for reading. - Tidak dapat membuka files.json untuk dibaca. - - - No patch file found for the current serial. - Tidak ada file patch ditemukan untuk serial saat ini. - - - Unable to open the file for reading. - Tidak dapat membuka file untuk dibaca. - - - Unable to open the file for writing. - Tidak dapat membuka file untuk menulis. - - - Failed to parse XML: - Gagal menganalisis XML: - - - Success - Sukses - - - Options saved successfully. - Opsi berhasil disimpan. - - - Invalid Source - Sumber Tidak Valid - - - The selected source is invalid. - Sumber yang dipilih tidak valid. - - - File Exists - File Ada - - - File already exists. Do you want to replace it? - File sudah ada. Apakah Anda ingin menggantinya? - - - Failed to save file: - Gagal menyimpan file: - - - Failed to download file: - Gagal mengunduh file: - - - Cheats Not Found - Cheat Tidak Ditemukan - - - CheatsNotFound_MSG - Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. - - - Cheats Downloaded Successfully - Cheat Berhasil Diunduh - - - CheatsDownloadedSuccessfully_MSG - Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. - - - Failed to save: - Gagal menyimpan: - - - Failed to download: - Gagal mengunduh: - - - Download Complete - Unduhan Selesai - - - DownloadComplete_MSG - Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. - - - Failed to parse JSON data from HTML. - Gagal menganalisis data JSON dari HTML. - - - Failed to retrieve HTML page. - Gagal mengambil halaman HTML. - - - The game is in version: %1 - Permainan berada di versi: %1 - - - The downloaded patch only works on version: %1 - Patch yang diunduh hanya berfungsi pada versi: %1 - - - You may need to update your game. - Anda mungkin perlu memperbarui permainan Anda. - - - Incompatibility Notice - Pemberitahuan Ketidakcocokan - - - Failed to open file: - Gagal membuka file: - - - XML ERROR: - KESALAHAN XML: - - - Failed to open files.json for writing - Gagal membuka files.json untuk menulis - - - Author: - Penulis: - - - Directory does not exist: - Direktori tidak ada: - - - Failed to open files.json for reading. - Gagal membuka files.json untuk dibaca. - - - Name: - Nama: - - - Can't apply cheats before the game is started - Tidak bisa menerapkan cheat sebelum permainan dimulai. - - - - GameListFrame - - Icon - Ikon - - - Name - Nama - - - Serial - Serial - - - Compatibility - Compatibility - - - Region - Wilayah - - - Firmware - Firmware - - - Size - Ukuran - - - Version - Versi - - - Path - Jalur - - - Play Time - Waktu Bermain - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Klik untuk melihat detail di GitHub - - - Last updated - Terakhir diperbarui - - - - CheckUpdate - - Auto Updater - Pembaruan Otomatis - - - Error - Kesalahan - - - Network error: - Kesalahan jaringan: - - - Error_Github_limit_MSG - Pembaruan Otomatis memungkinkan hingga 60 pemeriksaan pembaruan per jam.\nAnda telah mencapai batas ini. Silakan coba lagi nanti. - - - Failed to parse update information. - Gagal memparse informasi pembaruan. - - - No pre-releases found. - Tidak ada pra-rilis yang ditemukan. - - - Invalid release data. - Data rilis tidak valid. - - - No download URL found for the specified asset. - Tidak ada URL unduhan ditemukan untuk aset yang ditentukan. - - - Your version is already up to date! - Versi Anda sudah terbaru! - - - Update Available - Pembaruan Tersedia - - - Update Channel - Saluran Pembaruan - - - Current Version - Versi Saat Ini - - - Latest Version - Versi Terbaru - - - Do you want to update? - Apakah Anda ingin memperbarui? - - - Show Changelog - Tampilkan Catatan Perubahan - - - Check for Updates at Startup - Periksa pembaruan saat mulai - - - Update - Perbarui - - - No - Tidak - - - Hide Changelog - Sembunyikan Catatan Perubahan - - - Changes - Perubahan - - - Network error occurred while trying to access the URL - Kesalahan jaringan terjadi saat mencoba mengakses URL - - - Download Complete - Unduhan Selesai - - - The update has been downloaded, press OK to install. - Pembaruan telah diunduh, tekan OK untuk menginstal. - - - Failed to save the update file at - Gagal menyimpan file pembaruan di - - - Starting Update... - Memulai Pembaruan... - - - Failed to create the update script file - Gagal membuat file skrip pembaruan - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Memuat data kompatibilitas, harap tunggu - - - Cancel - Batal - - - Loading... - Memuat... - - - Error - Kesalahan - - - Unable to update compatibility data! Try again later. - Tidak dapat memperbarui data kompatibilitas! Coba lagi nanti. - - - Unable to open compatibility_data.json for writing. - Tidak dapat membuka compatibility_data.json untuk menulis. - - - Unknown - Tidak Dikenal - - - Nothing - Tidak ada - - - Boots - Sepatu Bot - - - Menus - Menu - - - Ingame - Dalam Permainan - - - Playable - Playable - - - diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts new file mode 100644 index 000000000..6e30ab310 --- /dev/null +++ b/src/qt_gui/translations/id_ID.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Tidak Ada Gambar Tersedia + + + Serial: + Serial: + + + Version: + Versi: + + + Size: + Ukuran: + + + Select Cheat File: + Pilih File Cheat: + + + Repository: + Repositori: + + + Download Cheats + Unduh Cheat + + + Delete File + Hapus File + + + No files selected. + Tidak ada file yang dipilih. + + + You can delete the cheats you don't want after downloading them. + Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. + + + Do you want to delete the selected file?\n%1 + Apakah Anda ingin menghapus berkas yang dipilih?\n%1 + + + Select Patch File: + Pilih File Patch: + + + Download Patches + Unduh Patch + + + Save + Simpan + + + Cheats + Cheat + + + Patches + Patch + + + Error + Kesalahan + + + No patch selected. + Tidak ada patch yang dipilih. + + + Unable to open files.json for reading. + Tidak dapat membuka files.json untuk dibaca. + + + No patch file found for the current serial. + Tidak ada file patch ditemukan untuk serial saat ini. + + + Unable to open the file for reading. + Tidak dapat membuka file untuk dibaca. + + + Unable to open the file for writing. + Tidak dapat membuka file untuk menulis. + + + Failed to parse XML: + Gagal menganalisis XML: + + + Success + Sukses + + + Options saved successfully. + Opsi berhasil disimpan. + + + Invalid Source + Sumber Tidak Valid + + + The selected source is invalid. + Sumber yang dipilih tidak valid. + + + File Exists + File Ada + + + File already exists. Do you want to replace it? + File sudah ada. Apakah Anda ingin menggantinya? + + + Failed to save file: + Gagal menyimpan file: + + + Failed to download file: + Gagal mengunduh file: + + + Cheats Not Found + Cheat Tidak Ditemukan + + + CheatsNotFound_MSG + Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. + + + Cheats Downloaded Successfully + Cheat Berhasil Diunduh + + + CheatsDownloadedSuccessfully_MSG + Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. + + + Failed to save: + Gagal menyimpan: + + + Failed to download: + Gagal mengunduh: + + + Download Complete + Unduhan Selesai + + + DownloadComplete_MSG + Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. + + + Failed to parse JSON data from HTML. + Gagal menganalisis data JSON dari HTML. + + + Failed to retrieve HTML page. + Gagal mengambil halaman HTML. + + + The game is in version: %1 + Permainan berada di versi: %1 + + + The downloaded patch only works on version: %1 + Patch yang diunduh hanya berfungsi pada versi: %1 + + + You may need to update your game. + Anda mungkin perlu memperbarui permainan Anda. + + + Incompatibility Notice + Pemberitahuan Ketidakcocokan + + + Failed to open file: + Gagal membuka file: + + + XML ERROR: + KESALAHAN XML: + + + Failed to open files.json for writing + Gagal membuka files.json untuk menulis + + + Author: + Penulis: + + + Directory does not exist: + Direktori tidak ada: + + + Failed to open files.json for reading. + Gagal membuka files.json untuk dibaca. + + + Name: + Nama: + + + Can't apply cheats before the game is started + Tidak bisa menerapkan cheat sebelum permainan dimulai. + + + Close + Tutup + + + + CheckUpdate + + Auto Updater + Pembaruan Otomatis + + + Error + Kesalahan + + + Network error: + Kesalahan jaringan: + + + Error_Github_limit_MSG + Pembaruan Otomatis memungkinkan hingga 60 pemeriksaan pembaruan per jam.\nAnda telah mencapai batas ini. Silakan coba lagi nanti. + + + Failed to parse update information. + Gagal memparse informasi pembaruan. + + + No pre-releases found. + Tidak ada pra-rilis yang ditemukan. + + + Invalid release data. + Data rilis tidak valid. + + + No download URL found for the specified asset. + Tidak ada URL unduhan ditemukan untuk aset yang ditentukan. + + + Your version is already up to date! + Versi Anda sudah terbaru! + + + Update Available + Pembaruan Tersedia + + + Update Channel + Saluran Pembaruan + + + Current Version + Versi Saat Ini + + + Latest Version + Versi Terbaru + + + Do you want to update? + Apakah Anda ingin memperbarui? + + + Show Changelog + Tampilkan Catatan Perubahan + + + Check for Updates at Startup + Periksa pembaruan saat mulai + + + Update + Perbarui + + + No + Tidak + + + Hide Changelog + Sembunyikan Catatan Perubahan + + + Changes + Perubahan + + + Network error occurred while trying to access the URL + Kesalahan jaringan terjadi saat mencoba mengakses URL + + + Download Complete + Unduhan Selesai + + + The update has been downloaded, press OK to install. + Pembaruan telah diunduh, tekan OK untuk menginstal. + + + Failed to save the update file at + Gagal menyimpan file pembaruan di + + + Starting Update... + Memulai Pembaruan... + + + Failed to create the update script file + Gagal membuat file skrip pembaruan + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Memuat data kompatibilitas, harap tunggu + + + Cancel + Batal + + + Loading... + Memuat... + + + Error + Kesalahan + + + Unable to update compatibility data! Try again later. + Tidak dapat memperbarui data kompatibilitas! Coba lagi nanti. + + + Unable to open compatibility_data.json for writing. + Tidak dapat membuka compatibility_data.json untuk menulis. + + + Unknown + Tidak Dikenal + + + Nothing + Tidak ada + + + Boots + Sepatu Bot + + + Menus + Menu + + + Ingame + Dalam Permainan + + + Playable + Playable + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikon + + + Name + Nama + + + Serial + Serial + + + Compatibility + Compatibility + + + Region + Wilayah + + + Firmware + Firmware + + + Size + Ukuran + + + Version + Versi + + + Path + Jalur + + + Play Time + Waktu Bermain + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Klik untuk melihat detail di GitHub + + + Last updated + Terakhir diperbarui + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Cheat / Patch + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Buka Folder... + + + Open Game Folder + Buka Folder Game + + + Open Save Data Folder + Buka Folder Data Simpanan + + + Open Log Folder + Buka Folder Log + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Periksa pembaruan + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Unduh Cheat / Patch + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Bantuan + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Daftar game + + + * Unsupported Vulkan Version + * Versi Vulkan Tidak Didukung + + + Download Cheats For All Installed Games + Unduh Cheat Untuk Semua Game Yang Terpasang + + + Download Patches For All Games + Unduh Patch Untuk Semua Game + + + Download Complete + Unduhan Selesai + + + You have downloaded cheats for all the games you have installed. + Anda telah mengunduh cheat untuk semua game yang terpasang. + + + Patches Downloaded Successfully! + Patch Berhasil Diunduh! + + + All Patches available for all games have been downloaded. + Semua Patch yang tersedia untuk semua game telah diunduh. + + + Games: + Game: + + + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) + + + Game Boot + Boot Game + + + Only one file can be selected! + Hanya satu file yang bisa dipilih! + + + PKG Extraction + Ekstraksi PKG + + + Patch detected! + Patch terdeteksi! + + + PKG and Game versions match: + Versi PKG dan Game cocok: + + + Would you like to overwrite? + Apakah Anda ingin menimpa? + + + PKG Version %1 is older than installed version: + Versi PKG %1 lebih lama dari versi yang terpasang: + + + Game is installed: + Game telah terpasang: + + + Would you like to install Patch: + Apakah Anda ingin menginstal patch: + + + DLC Installation + Instalasi DLC + + + Would you like to install DLC: %1? + Apakah Anda ingin menginstal DLC: %1? + + + DLC already installed: + DLC sudah terpasang: + + + Game already installed + Game sudah terpasang + + + PKG ERROR + KESALAHAN PKG + + + Extracting PKG %1/%2 + Mengekstrak PKG %1/%2 + + + Extraction Finished + Ekstraksi Selesai + + + Game successfully installed at %1 + Game berhasil dipasang di %1 + + + File doesn't appear to be a valid PKG file + File tampaknya bukan file PKG yang valid + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Nama + + + Serial + Serial + + + Installed + + + + Size + Ukuran + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Wilayah + + + Flags + + + + Path + Jalur + + + File + File + + + PKG ERROR + KESALAHAN PKG + + + Unknown + Tidak Dikenal + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Mode Layar Penuh + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Tab default saat membuka pengaturan + + + Show Game Size In List + Tampilkan Ukuran Game di Daftar + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Aktifkan Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Buka Lokasi Log + + + Input + Masukan + + + Cursor + Kursor + + + Hide Cursor + Sembunyikan kursor + + + Hide Cursor Idle Timeout + Batas waktu sembunyikan kursor tidak aktif + + + s + s + + + Controller + Pengontrol + + + Back Button Behavior + Perilaku tombol kembali + + + Graphics + Graphics + + + GUI + Antarmuka + + + User + Pengguna + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Jalur + + + Game Folders + Folder Permainan + + + Add... + Tambah... + + + Remove + Hapus + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Pembaruan + + + Check for Updates at Startup + Periksa pembaruan saat mulai + + + Always Show Changelog + Selalu Tampilkan Riwayat Perubahan + + + Update Channel + Saluran Pembaruan + + + Check for Updates + Periksa pembaruan + + + GUI Settings + Pengaturan GUI + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Putar musik judul + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Volume + + + Save + Simpan + + + Apply + Terapkan + + + Restore Defaults + Kembalikan Pengaturan Default + + + Close + Tutup + + + Point your mouse at an option to display its description. + Arahkan mouse Anda pada opsi untuk menampilkan deskripsinya. + + + consoleLanguageGroupBox + Bahasa Konsol:\nMenetapkan bahasa yang digunakan oleh permainan PS4.\nDisarankan untuk mengatur ini ke bahasa yang didukung oleh permainan, yang dapat bervariasi berdasarkan wilayah. + + + emulatorLanguageGroupBox + Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. + + + fullscreenCheckBox + Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Tampilkan Layar Pembuka:\nMenampilkan layar pembuka permainan (gambar khusus) saat permainan dimulai. + + + discordRPCCheckbox + Aktifkan Discord Rich Presence:\nMenampilkan ikon emulator dan informasi relevan di profil Discord Anda. + + + userName + Nama Pengguna:\nMenetapkan nama pengguna akun PS4, yang mungkin ditampilkan oleh beberapa permainan. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Jenis Log:\nMenetapkan apakah untuk menyinkronkan output jendela log untuk kinerja. Dapat memiliki efek buruk pada emulasi. + + + logFilter + Filter Log:\nMenyaring log untuk hanya mencetak informasi tertentu.\nContoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya. + + + updaterGroupBox + Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. + + + GUIMusicGroupBox + Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Sembunyikan Kursor:\nPilih kapan kursor akan menghilang:\nTidak Pernah: Anda akan selalu melihat mouse.\nTidak Aktif: Tetapkan waktu untuk menghilang setelah tidak aktif.\nSelalu: Anda tidak akan pernah melihat mouse. + + + idleTimeoutGroupBox + Tetapkan waktu untuk mouse menghilang setelah tidak aktif. + + + backButtonBehaviorGroupBox + Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Tidak Pernah + + + Idle + Diam + + + Always + Selalu + + + Touchpad Left + Touchpad Kiri + + + Touchpad Right + Touchpad Kanan + + + Touchpad Center + Pusat Touchpad + + + None + Tidak Ada + + + graphicsAdapterGroupBox + Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih "Auto Select" untuk menentukan secara otomatis. + + + resolutionLayout + Lebar/Tinggi:\nMenetapkan ukuran jendela emulator saat diluncurkan, yang dapat diubah ukurannya selama permainan.\nIni berbeda dari resolusi dalam permainan. + + + heightDivider + Pembagi Vblank:\nKecepatan bingkai di mana emulator menyegarkan dikalikan dengan angka ini. Mengubah ini dapat memiliki efek buruk, seperti meningkatkan kecepatan permainan, atau merusak fungsi kritis permainan yang tidak mengharapkan ini berubah! + + + dumpShadersCheckBox + Aktifkan Pembuangan Shader:\nUntuk tujuan debugging teknis, menyimpan shader permainan ke folder saat mereka dirender. + + + nullGpuCheckBox + Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis. + + + gameFoldersBox + Folder Permainan:\nDaftar folder untuk memeriksa permainan yang diinstal. + + + addFolderButton + Tambah:\nTambahkan folder ke daftar. + + + removeFolderButton + Hapus:\nHapus folder dari daftar. + + + debugDump + Aktifkan Pembuangan Debug:\nMenyimpan simbol impor dan ekspor serta informasi header file dari program PS4 yang sedang berjalan ke direktori. + + + vkValidationCheckBox + Aktifkan Vulkan Validation Layers:\nMengaktifkan sistem yang memvalidasi status penggambaran Vulkan dan mencatat informasi tentang status internalnya. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. + + + vkSyncValidationCheckBox + Aktifkan Vulkan Synchronization Validation:\nMengaktifkan sistem yang memvalidasi waktu tugas penggambaran Vulkan. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. + + + rdocCheckBox + Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + + diff --git a/src/qt_gui/translations/it.ts b/src/qt_gui/translations/it.ts deleted file mode 100644 index 77a87ba82..000000000 --- a/src/qt_gui/translations/it.ts +++ /dev/null @@ -1,1475 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - Riguardo shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 è un emulatore sperimentale open-source per PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente. - - - - ElfViewer - - Open Folder - Apri Cartella - - - - GameInfoClass - - Loading game list, please wait :3 - Caricamento lista giochi, attendere :3 - - - Cancel - Annulla - - - Loading... - Caricamento... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Scegli cartella - - - Select which directory you want to install to. - Seleziona in quale cartella vuoi effettuare l'installazione. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Scegli cartella - - - Directory to install games - Cartella di installazione dei giochi - - - Browse - Sfoglia - - - Error - Errore - - - The value for location to install games is not valid. - Il valore del percorso di installazione dei giochi non è valido. - - - - GuiContextMenus - - Create Shortcut - Crea scorciatoia - - - Cheats / Patches - Trucchi / Patch - - - SFO Viewer - Visualizzatore SFO - - - Trophy Viewer - Visualizzatore Trofei - - - Open Folder... - Apri Cartella... - - - Open Game Folder - Apri Cartella del Gioco - - - Open Save Data Folder - Apri Cartella dei Dati di Salvataggio - - - Open Log Folder - Apri Cartella dei Log - - - Copy info... - Copia informazioni... - - - Copy Name - Copia Nome - - - Copy Serial - Copia Seriale - - - Copy All - Copia Tutto - - - Delete... - Elimina... - - - Delete Game - Elimina Gioco - - - Delete Update - Elimina Aggiornamento - - - Delete DLC - Elimina DLC - - - Compatibility... - Compatibilità... - - - Update database - Aggiorna database - - - View report - Visualizza rapporto - - - Submit a report - Invia rapporto - - - Shortcut creation - Creazione scorciatoia - - - Shortcut created successfully! - Scorciatoia creata con successo! - - - Error - Errore - - - Error creating shortcut! - Errore nella creazione della scorciatoia! - - - Install PKG - Installa PKG - - - Game - Gioco - - - requiresEnableSeparateUpdateFolder_MSG - Questa feature richiede che venga attivata l'opzione "Abilita Cartella Aggiornamenti Separata" per poter funzionare, per favore abilitala. - - - This game has no update to delete! - Questo gioco non ha alcun aggiornamento da eliminare! - - - Update - Aggiornamento - - - This game has no DLC to delete! - Questo gioco non ha alcun DLC da eliminare! - - - DLC - DLC - - - Delete %1 - Elimina %1 - - - Are you sure you want to delete %1's %2 directory? - Sei sicuro di eliminale la cartella %2 di %1? - - - - MainWindow - - Open/Add Elf Folder - Apri/Aggiungi cartella Elf - - - Install Packages (PKG) - Installa Pacchetti (PKG) - - - Boot Game - Avvia Gioco - - - Check for Updates - Controlla aggiornamenti - - - About shadPS4 - Riguardo a shadPS4 - - - Configure... - Configura... - - - Install application from a .pkg file - Installa applicazione da un file .pkg - - - Recent Games - Giochi Recenti - - - Open shadPS4 Folder - Apri Cartella shadps4 - - - Exit - Uscita - - - Exit shadPS4 - Esci da shadPS4 - - - Exit the application. - Esci dall'applicazione. - - - Show Game List - Mostra Lista Giochi - - - Game List Refresh - Aggiorna Lista Giochi - - - Tiny - Minuscolo - - - Small - Piccolo - - - Medium - Medio - - - Large - Grande - - - List View - Visualizzazione Lista - - - Grid View - Visualizzazione Griglia - - - Elf Viewer - Visualizzatore Elf - - - Game Install Directory - Cartella Installazione Giochi - - - Download Cheats/Patches - Scarica Trucchi/Patch - - - Dump Game List - Scarica Lista Giochi - - - PKG Viewer - Visualizzatore PKG - - - Search... - Cerca... - - - File - File - - - View - Visualizza - - - Game List Icons - Icone Lista Giochi - - - Game List Mode - Modalità Lista Giochi - - - Settings - Impostazioni - - - Utils - Utilità - - - Themes - Temi - - - Help - Aiuto - - - Dark - Scuro - - - Light - Chiaro - - - Green - Verde - - - Blue - Blu - - - Violet - Viola - - - toolBar - Barra strumenti - - - Game List - Elenco giochi - - - * Unsupported Vulkan Version - * Versione Vulkan non supportata - - - Download Cheats For All Installed Games - Scarica Trucchi per tutti i giochi installati - - - Download Patches For All Games - Scarica Patch per tutti i giochi - - - Download Complete - Download completato - - - You have downloaded cheats for all the games you have installed. - Hai scaricato trucchi per tutti i giochi installati. - - - Patches Downloaded Successfully! - Patch scaricate con successo! - - - All Patches available for all games have been downloaded. - Tutte le patch disponibili per tutti i giochi sono state scaricate. - - - Games: - Giochi: - - - PKG File (*.PKG) - File PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) - - - Game Boot - Avvia Gioco - - - Only one file can be selected! - Si può selezionare solo un file! - - - PKG Extraction - Estrazione file PKG - - - Patch detected! - Patch rilevata! - - - PKG and Game versions match: - Le versioni di PKG e del Gioco corrispondono: - - - Would you like to overwrite? - Vuoi sovrascrivere? - - - PKG Version %1 is older than installed version: - La versione PKG %1 è più vecchia rispetto alla versione installata: - - - Game is installed: - Gioco installato: - - - Would you like to install Patch: - Vuoi installare la patch: - - - DLC Installation - Installazione DLC - - - Would you like to install DLC: %1? - Vuoi installare il DLC: %1? - - - DLC already installed: - DLC già installato: - - - Game already installed - Gioco già installato - - - PKG is a patch, please install the game first! - Questo file PKG contiene una patch. Per favore, installa prima il gioco! - - - PKG ERROR - ERRORE PKG - - - Extracting PKG %1/%2 - Estrazione file PKG %1/%2 - - - Extraction Finished - Estrazione Completata - - - Game successfully installed at %1 - Gioco installato correttamente in %1 - - - File doesn't appear to be a valid PKG file - Il file sembra non essere un file PKG valido - - - - PKGViewer - - Open Folder - Apri Cartella - - - - TrophyViewer - - Trophy Viewer - Visualizzatore Trofei - - - - SettingsDialog - - Settings - Impostazioni - - - General - Generale - - - System - Sistema - - - Console Language - Lingua della console - - - Emulator Language - Lingua dell'emulatore - - - Emulator - Emulatore - - - Enable Fullscreen - Abilita Schermo Intero - - - Fullscreen Mode - Modalità Schermo Intero - - - Enable Separate Update Folder - Abilita Cartella Aggiornamenti Separata - - - Default tab when opening settings - Scheda predefinita all'apertura delle impostazioni - - - Show Game Size In List - Mostra la dimensione del gioco nell'elenco - - - Show Splash - Mostra Schermata Iniziale - - - Is PS4 Pro - Modalità Ps4 Pro - - - Enable Discord Rich Presence - Abilita Discord Rich Presence - - - Username - Nome Utente - - - Trophy Key - Chiave Trofei - - - Trophy - Trofei - - - Logger - Logger - - - Log Type - Tipo di Log - - - Log Filter - Filtro Log - - - Open Log Location - Apri posizione del registro - - - Input - Input - - - Cursor - Cursore - - - Hide Cursor - Nascondi Cursore - - - Hide Cursor Idle Timeout - Timeout inattività per nascondere il cursore - - - s - s - - - Controller - Controller - - - Back Button Behavior - Comportamento del pulsante Indietro - - - Graphics - Grafica - - - GUI - Interfaccia - - - User - Utente - - - Graphics Device - Scheda Grafica - - - Width - Larghezza - - - Height - Altezza - - - Vblank Divider - Divisore Vblank - - - Advanced - Avanzate - - - Enable Shaders Dumping - Abilita Dump Shader - - - Enable NULL GPU - Abilita NULL GPU - - - Paths - Percorsi - - - Game Folders - Cartelle di gioco - - - Add... - Aggiungi... - - - Remove - Rimuovi - - - Debug - Debug - - - Enable - Abilita Debug Dumping - - - Enable Vulkan Validation Layers - Abilita Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Abilita Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Abilita RenderDoc Debugging - - - Enable Crash Diagnostics - Abilita Diagnostica Crash - - - Collect Shaders - Raccogli Shaders - - - Copy GPU Buffers - Copia Buffer GPU - - - Host Debug Markers - Marcatori di Debug dell'Host - - - Guest Debug Markers - Marcatori di Debug del Guest - - - Update - Aggiornamento - - - Check for Updates at Startup - Verifica aggiornamenti all’avvio - - - Always Show Changelog - Mostra sempre il changelog - - - Update Channel - Canale di Aggiornamento - - - Check for Updates - Controlla aggiornamenti - - - GUI Settings - Impostazioni GUI - - - Title Music - Musica del Titolo - - - Disable Trophy Pop-ups - Disabilita Notifica Trofei - - - Play title music - Riproduci musica del titolo - - - Update Compatibility Database On Startup - Aggiorna Database Compatibilità all'Avvio - - - Game Compatibility - Compatibilità Gioco - - - Display Compatibility Data - Mostra Dati Compatibilità - - - Update Compatibility Database - Aggiorna Database Compatibilità - - - Volume - Volume - - - Audio Backend - Backend Audio - - - Save - Salva - - - Apply - Applica - - - Restore Defaults - Ripristina Impostazioni Predefinite - - - Close - Chiudi - - - Point your mouse at an option to display its description. - Sposta il mouse su un'opzione per visualizzarne la descrizione. - - - consoleLanguageGroupBox - Lingua della Console:\nImposta la lingua utilizzata dal gioco PS4.\nÈ consigliabile impostare questa su una lingua supportata dal gioco, che può variare a seconda della regione. - - - emulatorLanguageGroupBox - Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. - - - fullscreenCheckBox - Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. - - - separateUpdatesCheckBox - Abilita Cartella Aggiornamenti Separata:\nAbilita l'installazione degli aggiornamenti in una cartella separata per una più facile gestione. - - - showSplashCheckBox - Mostra Schermata di Avvio:\nMostra la schermata di avvio del gioco (un'immagine speciale) mentre il gioco si sta avviando. - - - ps4proCheckBox - È PS4 Pro:\nFa sì che l'emulatore si comporti come una PS4 PRO, il che può abilitare funzionalità speciali in giochi che la supportano. - - - discordRPCCheckbox - Abilita Discord Rich Presence:\nMostra l'icona dell'emulatore e informazioni pertinenti sul tuo profilo Discord. - - - userName - Nome Utente:\nImposta il nome utente dell'account PS4, che potrebbe essere visualizzato da alcuni giochi. - - - TrophyKey - Chiave Trofei:\nChiave utilizzata per la decrittazione dei trofei. Deve essere estratta dalla vostra console con jailbreak.\nDeve contenere solo caratteri esadecimali. - - - logTypeGroupBox - Tipo di Log:\nImposta se sincronizzare l'output della finestra di log per le prestazioni. Potrebbe avere effetti avversi sull'emulazione. - - - logFilter - Filtro Log:\nFiltra il log per stampare solo informazioni specifiche.\nEsempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo. - - - updaterGroupBox - Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. - - - GUIMusicGroupBox - Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. - - - disableTrophycheckBox - Disabilita Notifica Trofei:\nDisabilita notifiche in gioco dei trofei. Il progresso dei Trofei può ancora essere controllato con il Visualizzatore Trofei (clicca tasto destro sul gioco nella finestra principale). - - - hideCursorGroupBox - Nascondi cursore:\nScegli quando il cursore scomparirà:\nMai: Vedrai sempre il mouse.\nInattivo: Imposta un tempo per farlo scomparire dopo essere stato inattivo.\nSempre: non vedrai mai il mouse. - - - idleTimeoutGroupBox - Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo. - - - backButtonBehaviorGroupBox - Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4. - - - enableCompatibilityCheckBox - Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita "Aggiorna Compatiblità all'Avvio" per ottenere informazioni aggiornate. - - - checkCompatibilityOnStartupCheckBox - Aggiorna Compatibilità all'Avvio:\nAggiorna automaticamente il database della compatibilità quando si avvia shadps4. - - - updateCompatibilityButton - Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. - - - Never - Mai - - - Idle - Inattivo - - - Always - Sempre - - - Touchpad Left - Touchpad Sinistra - - - Touchpad Right - Touchpad Destra - - - Touchpad Center - Centro del Touchpad - - - None - Nessuno - - - graphicsAdapterGroupBox - Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. - - - resolutionLayout - Larghezza/Altezza:\nImposta la dimensione della finestra dell'emulatore all'avvio, che può essere ridimensionata durante il gioco.\nQuesto è diverso dalla risoluzione in gioco. - - - heightDivider - Divisore Vblank:\nIl frame rate con cui l'emulatore si aggiorna viene moltiplicato per questo numero. Cambiare questo potrebbe avere effetti avversi, come aumentare la velocità del gioco o rompere funzionalità critiche del gioco che non si aspettano questa modifica! - - - dumpShadersCheckBox - Abilita Pompaggio Shader:\nPer scopi di debug tecnico, salva gli shader dei giochi in una cartella mentre vengono resi. - - - nullGpuCheckBox - Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica. - - - gameFoldersBox - Cartelle di Gioco:\nL'elenco delle cartelle da controllare per i giochi installati. - - - addFolderButton - Aggiungi:\nAggiungi una cartella all'elenco. - - - removeFolderButton - Rimuovi:\nRimuovi una cartella dall'elenco. - - - debugDump - Abilita Pompaggio di Debug:\nSalva i simboli di importazione ed esportazione e le informazioni sull'intestazione del file del programma PS4 attualmente in esecuzione in una directory. - - - vkValidationCheckBox - Abilita Strati di Validazione Vulkan:\nAbilita un sistema che convalida lo stato del renderer Vulkan e registra informazioni sul suo stato interno. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - - - vkSyncValidationCheckBox - Abilita Validazione della Sincronizzazione Vulkan:\nAbilita un sistema che convalida il timing delle attività di rendering Vulkan. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - - - rdocCheckBox - Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. - - - collectShaderCheckBox - Raccogli Shader:\nBisogna attivare questa opzione per poter modificare gli shader nel menu di debug (Ctrl + F10). - - - crashDiagnosticsCheckBox - Diagnostica Crash:\nCrea un file .yaml che contiene informazioni riguardo lo stato del renderer Vulkan nel momento in cui si verifica un crash.\nUtile per poter effettuare il debug degli errori di tipo "Device Lost". Se hai questa opzione attiva dovresti abilitare anche Marcatori di Debug Host e Guest.\nNon è funzionante su GPU Intel.\nVulkan Validation Layers deve essere abilitato e bisogna aver installato l'SDK Vulkan per poter utilizzare questa funzione. - - - copyGPUBuffersCheckBox - Copia Buffer GPU:\nCerca di aggirare le race conditions che riguardano gli invii alla GPU.\nPotrebbe aiutare ad evitare crash che riguardano i PM4 di tipo 0. - - - hostMarkersCheckBox - Marcatori di Debug dell'Host:\nInserisce nel log informazioni ottenute dall'emulatore come ad esempio marcatori per comandi specifici AMDGPU quando si hanno comandi Vulkan e associa nomi di debug per le risorse.\nSe hai questa opzione abilitata dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. - - - guestMarkersCheckBox - Marcatori di Debug del Guest:\nInserisce nel log marcatori di debug che il gioco stesso ha aggiunto al buffer dei comandi.\nSe hai abilitato questa opzione dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patch per - - - defaultTextEdit_MSG - I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Nessuna immagine disponibile - - - Serial: - Seriale: - - - Version: - Versione: - - - Size: - Dimensione: - - - Select Cheat File: - Seleziona File Trucchi: - - - Repository: - Archivio: - - - Download Cheats - Scarica trucchi - - - Delete File - Cancella File - - - No files selected. - Nessun file selezionato. - - - You can delete the cheats you don't want after downloading them. - Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. - - - Do you want to delete the selected file?\n%1 - Vuoi cancellare il file selezionato?\n%1 - - - Select Patch File: - Seleziona File Patch: - - - Download Patches - Scarica Patch - - - Save - Salva - - - Cheats - Trucchi - - - Patches - Patch - - - Error - Errore - - - No patch selected. - Nessuna patch selezionata. - - - Unable to open files.json for reading. - Impossibile aprire il file .json per la lettura. - - - No patch file found for the current serial. - Nessun file patch trovato per il seriale selezionato. - - - Unable to open the file for reading. - Impossibile aprire il file per la lettura. - - - Unable to open the file for writing. - Impossibile aprire il file per la scrittura. - - - Failed to parse XML: - Analisi XML fallita: - - - Success - Successo - - - Options saved successfully. - Opzioni salvate con successo. - - - Invalid Source - Fonte non valida - - - The selected source is invalid. - La fonte selezionata non è valida. - - - File Exists - Il file è presente - - - File already exists. Do you want to replace it? - Il file è già presente. Vuoi sostituirlo? - - - Failed to save file: - Salvataggio file fallito: - - - Failed to download file: - Scaricamento file fallito: - - - Cheats Not Found - Trucchi non trovati - - - CheatsNotFound_MSG - Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. - - - Cheats Downloaded Successfully - Trucchi scaricati con successo! - - - CheatsDownloadedSuccessfully_MSG - Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. - - - Failed to save: - Salvataggio fallito: - - - Failed to download: - Impossibile scaricare: - - - Download Complete - Scaricamento completo - - - DownloadComplete_MSG - Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. - - - Failed to parse JSON data from HTML. - Impossibile analizzare i dati JSON dall'HTML. - - - Failed to retrieve HTML page. - Impossibile recuperare la pagina HTML. - - - The game is in version: %1 - Il gioco è nella versione: %1 - - - The downloaded patch only works on version: %1 - La patch scaricata funziona solo sulla versione: %1 - - - You may need to update your game. - Potresti aver bisogno di aggiornare il tuo gioco. - - - Incompatibility Notice - Avviso di incompatibilità - - - Failed to open file: - Impossibile aprire file: - - - XML ERROR: - ERRORE XML: - - - Failed to open files.json for writing - Impossibile aprire i file .json per la scrittura - - - Author: - Autore: - - - Directory does not exist: - La cartella non esiste: - - - Failed to open files.json for reading. - Impossibile aprire i file .json per la lettura. - - - Name: - Nome: - - - Can't apply cheats before the game is started - Non è possibile applicare i trucchi prima dell'inizio del gioco. - - - - GameListFrame - - Icon - Icona - - - Name - Nome - - - Serial - Seriale - - - Compatibility - Compatibilità - - - Region - Regione - - - Firmware - Firmware - - - Size - Dimensione - - - Version - Versione - - - Path - Percorso - - - Play Time - Tempo di Gioco - - - Never Played - Mai Giocato - - - h - o - - - m - m - - - s - s - - - Compatibility is untested - Nessuna informazione sulla compatibilità - - - Game does not initialize properly / crashes the emulator - Il gioco non si avvia in modo corretto / forza chiusura dell'emulatore - - - Game boots, but only displays a blank screen - Il gioco si avvia, ma mostra solo una schermata nera - - - Game displays an image but does not go past the menu - Il gioco mostra immagini ma non va oltre il menu - - - Game has game-breaking glitches or unplayable performance - Il gioco ha problemi gravi di emulazione oppure framerate troppo basso - - - Game can be completed with playable performance and no major glitches - Il gioco può essere completato con buone prestazioni e senza problemi gravi - - - Click to see details on github - Fai clic per vedere i dettagli su GitHub - - - Last updated - Ultimo aggiornamento - - - - CheckUpdate - - Auto Updater - Aggiornamento automatico - - - Error - Errore - - - Network error: - Errore di rete: - - - Error_Github_limit_MSG - L'Aggiornamento Automatico consente fino a 60 controlli di aggiornamento all'ora.\nHai raggiunto questo limite. Riprova più tardi. - - - Failed to parse update information. - Impossibile analizzare le informazioni di aggiornamento. - - - No pre-releases found. - Nessuna anteprima trovata. - - - Invalid release data. - Dati della release non validi. - - - No download URL found for the specified asset. - Nessun URL di download trovato per l'asset specificato. - - - Your version is already up to date! - La tua versione è già aggiornata! - - - Update Available - Aggiornamento disponibile - - - Update Channel - Canale di Aggiornamento - - - Current Version - Versione attuale - - - Latest Version - Ultima versione - - - Do you want to update? - Vuoi aggiornare? - - - Show Changelog - Mostra il Changelog - - - Check for Updates at Startup - Controlla aggiornamenti all’avvio - - - Update - Aggiorna - - - No - No - - - Hide Changelog - Nascondi il Changelog - - - Changes - Modifiche - - - Network error occurred while trying to access the URL - Si è verificato un errore di rete durante il tentativo di accesso all'URL - - - Download Complete - Download completato - - - The update has been downloaded, press OK to install. - L'aggiornamento è stato scaricato, premi OK per installare. - - - Failed to save the update file at - Impossibile salvare il file di aggiornamento in - - - Starting Update... - Inizio aggiornamento... - - - Failed to create the update script file - Impossibile creare il file di script di aggiornamento - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Recuperando dati di compatibilità, per favore attendere - - - Cancel - Annulla - - - Loading... - Caricamento... - - - Error - Errore - - - Unable to update compatibility data! Try again later. - Impossibile aggiornare i dati di compatibilità! Riprova più tardi. - - - Unable to open compatibility_data.json for writing. - Impossibile aprire compatibility_data.json per la scrittura. - - - Unknown - Sconosciuto - - - Nothing - Niente - - - Boots - Si Avvia - - - Menus - Menu - - - Ingame - In gioco - - - Playable - Giocabile - - - diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts new file mode 100644 index 000000000..4351d1fd8 --- /dev/null +++ b/src/qt_gui/translations/it_IT.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + Riguardo shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 è un emulatore sperimentale open-source per PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patch per + + + defaultTextEdit_MSG + I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nessuna immagine disponibile + + + Serial: + Seriale: + + + Version: + Versione: + + + Size: + Dimensione: + + + Select Cheat File: + Seleziona File Trucchi: + + + Repository: + Archivio: + + + Download Cheats + Scarica trucchi + + + Delete File + Cancella File + + + No files selected. + Nessun file selezionato. + + + You can delete the cheats you don't want after downloading them. + Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. + + + Do you want to delete the selected file?\n%1 + Vuoi cancellare il file selezionato?\n%1 + + + Select Patch File: + Seleziona File Patch: + + + Download Patches + Scarica Patch + + + Save + Salva + + + Cheats + Trucchi + + + Patches + Patch + + + Error + Errore + + + No patch selected. + Nessuna patch selezionata. + + + Unable to open files.json for reading. + Impossibile aprire il file .json per la lettura. + + + No patch file found for the current serial. + Nessun file patch trovato per il seriale selezionato. + + + Unable to open the file for reading. + Impossibile aprire il file per la lettura. + + + Unable to open the file for writing. + Impossibile aprire il file per la scrittura. + + + Failed to parse XML: + Analisi XML fallita: + + + Success + Successo + + + Options saved successfully. + Opzioni salvate con successo. + + + Invalid Source + Fonte non valida + + + The selected source is invalid. + La fonte selezionata non è valida. + + + File Exists + Il file è presente + + + File already exists. Do you want to replace it? + Il file è già presente. Vuoi sostituirlo? + + + Failed to save file: + Salvataggio file fallito: + + + Failed to download file: + Scaricamento file fallito: + + + Cheats Not Found + Trucchi non trovati + + + CheatsNotFound_MSG + Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. + + + Cheats Downloaded Successfully + Trucchi scaricati con successo! + + + CheatsDownloadedSuccessfully_MSG + Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. + + + Failed to save: + Salvataggio fallito: + + + Failed to download: + Impossibile scaricare: + + + Download Complete + Scaricamento completo + + + DownloadComplete_MSG + Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. + + + Failed to parse JSON data from HTML. + Impossibile analizzare i dati JSON dall'HTML. + + + Failed to retrieve HTML page. + Impossibile recuperare la pagina HTML. + + + The game is in version: %1 + Il gioco è nella versione: %1 + + + The downloaded patch only works on version: %1 + La patch scaricata funziona solo sulla versione: %1 + + + You may need to update your game. + Potresti aver bisogno di aggiornare il tuo gioco. + + + Incompatibility Notice + Avviso di incompatibilità + + + Failed to open file: + Impossibile aprire file: + + + XML ERROR: + ERRORE XML: + + + Failed to open files.json for writing + Impossibile aprire i file .json per la scrittura + + + Author: + Autore: + + + Directory does not exist: + La cartella non esiste: + + + Failed to open files.json for reading. + Impossibile aprire i file .json per la lettura. + + + Name: + Nome: + + + Can't apply cheats before the game is started + Non è possibile applicare i trucchi prima dell'inizio del gioco. + + + Close + Chiudi + + + + CheckUpdate + + Auto Updater + Aggiornamento automatico + + + Error + Errore + + + Network error: + Errore di rete: + + + Error_Github_limit_MSG + L'Aggiornamento Automatico consente fino a 60 controlli di aggiornamento all'ora.\nHai raggiunto questo limite. Riprova più tardi. + + + Failed to parse update information. + Impossibile analizzare le informazioni di aggiornamento. + + + No pre-releases found. + Nessuna anteprima trovata. + + + Invalid release data. + Dati della release non validi. + + + No download URL found for the specified asset. + Nessun URL di download trovato per l'asset specificato. + + + Your version is already up to date! + La tua versione è già aggiornata! + + + Update Available + Aggiornamento disponibile + + + Update Channel + Canale di Aggiornamento + + + Current Version + Versione attuale + + + Latest Version + Ultima versione + + + Do you want to update? + Vuoi aggiornare? + + + Show Changelog + Mostra il Changelog + + + Check for Updates at Startup + Controlla aggiornamenti all’avvio + + + Update + Aggiorna + + + No + No + + + Hide Changelog + Nascondi il Changelog + + + Changes + Modifiche + + + Network error occurred while trying to access the URL + Si è verificato un errore di rete durante il tentativo di accesso all'URL + + + Download Complete + Download completato + + + The update has been downloaded, press OK to install. + L'aggiornamento è stato scaricato, premi OK per installare. + + + Failed to save the update file at + Impossibile salvare il file di aggiornamento in + + + Starting Update... + Inizio aggiornamento... + + + Failed to create the update script file + Impossibile creare il file di script di aggiornamento + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Recuperando dati di compatibilità, per favore attendere + + + Cancel + Annulla + + + Loading... + Caricamento... + + + Error + Errore + + + Unable to update compatibility data! Try again later. + Impossibile aggiornare i dati di compatibilità! Riprova più tardi. + + + Unable to open compatibility_data.json for writing. + Impossibile aprire compatibility_data.json per la scrittura. + + + Unknown + Sconosciuto + + + Nothing + Niente + + + Boots + Si Avvia + + + Menus + Menu + + + Ingame + In gioco + + + Playable + Giocabile + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Apri Cartella + + + + GameInfoClass + + Loading game list, please wait :3 + Caricamento lista giochi, attendere :3 + + + Cancel + Annulla + + + Loading... + Caricamento... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Scegli cartella + + + Directory to install games + Cartella di installazione dei giochi + + + Browse + Sfoglia + + + Error + Errore + + + Directory to install DLC + + + + + GameListFrame + + Icon + Icona + + + Name + Nome + + + Serial + Seriale + + + Compatibility + Compatibilità + + + Region + Regione + + + Firmware + Firmware + + + Size + Dimensione + + + Version + Versione + + + Path + Percorso + + + Play Time + Tempo di Gioco + + + Never Played + Mai Giocato + + + h + o + + + m + m + + + s + s + + + Compatibility is untested + Nessuna informazione sulla compatibilità + + + Game does not initialize properly / crashes the emulator + Il gioco non si avvia in modo corretto / forza chiusura dell'emulatore + + + Game boots, but only displays a blank screen + Il gioco si avvia, ma mostra solo una schermata nera + + + Game displays an image but does not go past the menu + Il gioco mostra immagini ma non va oltre il menu + + + Game has game-breaking glitches or unplayable performance + Il gioco ha problemi gravi di emulazione oppure framerate troppo basso + + + Game can be completed with playable performance and no major glitches + Il gioco può essere completato con buone prestazioni e senza problemi gravi + + + Click to see details on github + Fai clic per vedere i dettagli su GitHub + + + Last updated + Ultimo aggiornamento + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Crea scorciatoia + + + Cheats / Patches + Trucchi / Patch + + + SFO Viewer + Visualizzatore SFO + + + Trophy Viewer + Visualizzatore Trofei + + + Open Folder... + Apri Cartella... + + + Open Game Folder + Apri Cartella del Gioco + + + Open Save Data Folder + Apri Cartella dei Dati di Salvataggio + + + Open Log Folder + Apri Cartella dei Log + + + Copy info... + Copia informazioni... + + + Copy Name + Copia Nome + + + Copy Serial + Copia Seriale + + + Copy All + Copia Tutto + + + Delete... + Elimina... + + + Delete Game + Elimina Gioco + + + Delete Update + Elimina Aggiornamento + + + Delete DLC + Elimina DLC + + + Compatibility... + Compatibilità... + + + Update database + Aggiorna database + + + View report + Visualizza rapporto + + + Submit a report + Invia rapporto + + + Shortcut creation + Creazione scorciatoia + + + Shortcut created successfully! + Scorciatoia creata con successo! + + + Error + Errore + + + Error creating shortcut! + Errore nella creazione della scorciatoia! + + + Install PKG + Installa PKG + + + Game + Gioco + + + This game has no update to delete! + Questo gioco non ha alcun aggiornamento da eliminare! + + + Update + Aggiornamento + + + This game has no DLC to delete! + Questo gioco non ha alcun DLC da eliminare! + + + DLC + DLC + + + Delete %1 + Elimina %1 + + + Are you sure you want to delete %1's %2 directory? + Sei sicuro di eliminale la cartella %2 di %1? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Scegli cartella + + + Select which directory you want to install to. + Seleziona in quale cartella vuoi effettuare l'installazione. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Apri/Aggiungi cartella Elf + + + Install Packages (PKG) + Installa Pacchetti (PKG) + + + Boot Game + Avvia Gioco + + + Check for Updates + Controlla aggiornamenti + + + About shadPS4 + Riguardo a shadPS4 + + + Configure... + Configura... + + + Install application from a .pkg file + Installa applicazione da un file .pkg + + + Recent Games + Giochi Recenti + + + Open shadPS4 Folder + Apri Cartella shadps4 + + + Exit + Uscita + + + Exit shadPS4 + Esci da shadPS4 + + + Exit the application. + Esci dall'applicazione. + + + Show Game List + Mostra Lista Giochi + + + Game List Refresh + Aggiorna Lista Giochi + + + Tiny + Minuscolo + + + Small + Piccolo + + + Medium + Medio + + + Large + Grande + + + List View + Visualizzazione Lista + + + Grid View + Visualizzazione Griglia + + + Elf Viewer + Visualizzatore Elf + + + Game Install Directory + Cartella Installazione Giochi + + + Download Cheats/Patches + Scarica Trucchi/Patch + + + Dump Game List + Scarica Lista Giochi + + + PKG Viewer + Visualizzatore PKG + + + Search... + Cerca... + + + File + File + + + View + Visualizza + + + Game List Icons + Icone Lista Giochi + + + Game List Mode + Modalità Lista Giochi + + + Settings + Impostazioni + + + Utils + Utilità + + + Themes + Temi + + + Help + Aiuto + + + Dark + Scuro + + + Light + Chiaro + + + Green + Verde + + + Blue + Blu + + + Violet + Viola + + + toolBar + Barra strumenti + + + Game List + Elenco giochi + + + * Unsupported Vulkan Version + * Versione Vulkan non supportata + + + Download Cheats For All Installed Games + Scarica Trucchi per tutti i giochi installati + + + Download Patches For All Games + Scarica Patch per tutti i giochi + + + Download Complete + Download completato + + + You have downloaded cheats for all the games you have installed. + Hai scaricato trucchi per tutti i giochi installati. + + + Patches Downloaded Successfully! + Patch scaricate con successo! + + + All Patches available for all games have been downloaded. + Tutte le patch disponibili per tutti i giochi sono state scaricate. + + + Games: + Giochi: + + + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) + + + Game Boot + Avvia Gioco + + + Only one file can be selected! + Si può selezionare solo un file! + + + PKG Extraction + Estrazione file PKG + + + Patch detected! + Patch rilevata! + + + PKG and Game versions match: + Le versioni di PKG e del Gioco corrispondono: + + + Would you like to overwrite? + Vuoi sovrascrivere? + + + PKG Version %1 is older than installed version: + La versione PKG %1 è più vecchia rispetto alla versione installata: + + + Game is installed: + Gioco installato: + + + Would you like to install Patch: + Vuoi installare la patch: + + + DLC Installation + Installazione DLC + + + Would you like to install DLC: %1? + Vuoi installare il DLC: %1? + + + DLC already installed: + DLC già installato: + + + Game already installed + Gioco già installato + + + PKG ERROR + ERRORE PKG + + + Extracting PKG %1/%2 + Estrazione file PKG %1/%2 + + + Extraction Finished + Estrazione Completata + + + Game successfully installed at %1 + Gioco installato correttamente in %1 + + + File doesn't appear to be a valid PKG file + Il file sembra non essere un file PKG valido + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Apri Cartella + + + Name + Nome + + + Serial + Seriale + + + Installed + + + + Size + Dimensione + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Regione + + + Flags + + + + Path + Percorso + + + File + File + + + PKG ERROR + ERRORE PKG + + + Unknown + Sconosciuto + + + Package + + + + + SettingsDialog + + Settings + Impostazioni + + + General + Generale + + + System + Sistema + + + Console Language + Lingua della console + + + Emulator Language + Lingua dell'emulatore + + + Emulator + Emulatore + + + Enable Fullscreen + Abilita Schermo Intero + + + Fullscreen Mode + Modalità Schermo Intero + + + Enable Separate Update Folder + Abilita Cartella Aggiornamenti Separata + + + Default tab when opening settings + Scheda predefinita all'apertura delle impostazioni + + + Show Game Size In List + Mostra la dimensione del gioco nell'elenco + + + Show Splash + Mostra Schermata Iniziale + + + Enable Discord Rich Presence + Abilita Discord Rich Presence + + + Username + Nome Utente + + + Trophy Key + Chiave Trofei + + + Trophy + Trofei + + + Logger + Logger + + + Log Type + Tipo di Log + + + Log Filter + Filtro Log + + + Open Log Location + Apri posizione del registro + + + Input + Input + + + Cursor + Cursore + + + Hide Cursor + Nascondi Cursore + + + Hide Cursor Idle Timeout + Timeout inattività per nascondere il cursore + + + s + s + + + Controller + Controller + + + Back Button Behavior + Comportamento del pulsante Indietro + + + Graphics + Grafica + + + GUI + Interfaccia + + + User + Utente + + + Graphics Device + Scheda Grafica + + + Width + Larghezza + + + Height + Altezza + + + Vblank Divider + Divisore Vblank + + + Advanced + Avanzate + + + Enable Shaders Dumping + Abilita Dump Shader + + + Enable NULL GPU + Abilita NULL GPU + + + Paths + Percorsi + + + Game Folders + Cartelle di gioco + + + Add... + Aggiungi... + + + Remove + Rimuovi + + + Debug + Debug + + + Enable Vulkan Validation Layers + Abilita Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Abilita Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Abilita RenderDoc Debugging + + + Enable Crash Diagnostics + Abilita Diagnostica Crash + + + Collect Shaders + Raccogli Shaders + + + Copy GPU Buffers + Copia Buffer GPU + + + Host Debug Markers + Marcatori di Debug dell'Host + + + Guest Debug Markers + Marcatori di Debug del Guest + + + Update + Aggiornamento + + + Check for Updates at Startup + Verifica aggiornamenti all’avvio + + + Always Show Changelog + Mostra sempre il changelog + + + Update Channel + Canale di Aggiornamento + + + Check for Updates + Controlla aggiornamenti + + + GUI Settings + Impostazioni GUI + + + Title Music + Musica del Titolo + + + Disable Trophy Pop-ups + Disabilita Notifica Trofei + + + Play title music + Riproduci musica del titolo + + + Update Compatibility Database On Startup + Aggiorna Database Compatibilità all'Avvio + + + Game Compatibility + Compatibilità Gioco + + + Display Compatibility Data + Mostra Dati Compatibilità + + + Update Compatibility Database + Aggiorna Database Compatibilità + + + Volume + Volume + + + Save + Salva + + + Apply + Applica + + + Restore Defaults + Ripristina Impostazioni Predefinite + + + Close + Chiudi + + + Point your mouse at an option to display its description. + Sposta il mouse su un'opzione per visualizzarne la descrizione. + + + consoleLanguageGroupBox + Lingua della Console:\nImposta la lingua utilizzata dal gioco PS4.\nÈ consigliabile impostare questa su una lingua supportata dal gioco, che può variare a seconda della regione. + + + emulatorLanguageGroupBox + Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. + + + fullscreenCheckBox + Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. + + + separateUpdatesCheckBox + Abilita Cartella Aggiornamenti Separata:\nAbilita l'installazione degli aggiornamenti in una cartella separata per una più facile gestione. + + + showSplashCheckBox + Mostra Schermata di Avvio:\nMostra la schermata di avvio del gioco (un'immagine speciale) mentre il gioco si sta avviando. + + + discordRPCCheckbox + Abilita Discord Rich Presence:\nMostra l'icona dell'emulatore e informazioni pertinenti sul tuo profilo Discord. + + + userName + Nome Utente:\nImposta il nome utente dell'account PS4, che potrebbe essere visualizzato da alcuni giochi. + + + TrophyKey + Chiave Trofei:\nChiave utilizzata per la decrittazione dei trofei. Deve essere estratta dalla vostra console con jailbreak.\nDeve contenere solo caratteri esadecimali. + + + logTypeGroupBox + Tipo di Log:\nImposta se sincronizzare l'output della finestra di log per le prestazioni. Potrebbe avere effetti avversi sull'emulazione. + + + logFilter + Filtro Log:\nFiltra il log per stampare solo informazioni specifiche.\nEsempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo. + + + updaterGroupBox + Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. + + + GUIMusicGroupBox + Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. + + + disableTrophycheckBox + Disabilita Notifica Trofei:\nDisabilita notifiche in gioco dei trofei. Il progresso dei Trofei può ancora essere controllato con il Visualizzatore Trofei (clicca tasto destro sul gioco nella finestra principale). + + + hideCursorGroupBox + Nascondi cursore:\nScegli quando il cursore scomparirà:\nMai: Vedrai sempre il mouse.\nInattivo: Imposta un tempo per farlo scomparire dopo essere stato inattivo.\nSempre: non vedrai mai il mouse. + + + idleTimeoutGroupBox + Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo. + + + backButtonBehaviorGroupBox + Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4. + + + enableCompatibilityCheckBox + Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita "Aggiorna Compatiblità all'Avvio" per ottenere informazioni aggiornate. + + + checkCompatibilityOnStartupCheckBox + Aggiorna Compatibilità all'Avvio:\nAggiorna automaticamente il database della compatibilità quando si avvia shadps4. + + + updateCompatibilityButton + Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. + + + Never + Mai + + + Idle + Inattivo + + + Always + Sempre + + + Touchpad Left + Touchpad Sinistra + + + Touchpad Right + Touchpad Destra + + + Touchpad Center + Centro del Touchpad + + + None + Nessuno + + + graphicsAdapterGroupBox + Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. + + + resolutionLayout + Larghezza/Altezza:\nImposta la dimensione della finestra dell'emulatore all'avvio, che può essere ridimensionata durante il gioco.\nQuesto è diverso dalla risoluzione in gioco. + + + heightDivider + Divisore Vblank:\nIl frame rate con cui l'emulatore si aggiorna viene moltiplicato per questo numero. Cambiare questo potrebbe avere effetti avversi, come aumentare la velocità del gioco o rompere funzionalità critiche del gioco che non si aspettano questa modifica! + + + dumpShadersCheckBox + Abilita Pompaggio Shader:\nPer scopi di debug tecnico, salva gli shader dei giochi in una cartella mentre vengono resi. + + + nullGpuCheckBox + Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica. + + + gameFoldersBox + Cartelle di Gioco:\nL'elenco delle cartelle da controllare per i giochi installati. + + + addFolderButton + Aggiungi:\nAggiungi una cartella all'elenco. + + + removeFolderButton + Rimuovi:\nRimuovi una cartella dall'elenco. + + + debugDump + Abilita Pompaggio di Debug:\nSalva i simboli di importazione ed esportazione e le informazioni sull'intestazione del file del programma PS4 attualmente in esecuzione in una directory. + + + vkValidationCheckBox + Abilita Strati di Validazione Vulkan:\nAbilita un sistema che convalida lo stato del renderer Vulkan e registra informazioni sul suo stato interno. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. + + + vkSyncValidationCheckBox + Abilita Validazione della Sincronizzazione Vulkan:\nAbilita un sistema che convalida il timing delle attività di rendering Vulkan. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. + + + rdocCheckBox + Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. + + + collectShaderCheckBox + Raccogli Shader:\nBisogna attivare questa opzione per poter modificare gli shader nel menu di debug (Ctrl + F10). + + + crashDiagnosticsCheckBox + Diagnostica Crash:\nCrea un file .yaml che contiene informazioni riguardo lo stato del renderer Vulkan nel momento in cui si verifica un crash.\nUtile per poter effettuare il debug degli errori di tipo "Device Lost". Se hai questa opzione attiva dovresti abilitare anche Marcatori di Debug Host e Guest.\nNon è funzionante su GPU Intel.\nVulkan Validation Layers deve essere abilitato e bisogna aver installato l'SDK Vulkan per poter utilizzare questa funzione. + + + copyGPUBuffersCheckBox + Copia Buffer GPU:\nCerca di aggirare le race conditions che riguardano gli invii alla GPU.\nPotrebbe aiutare ad evitare crash che riguardano i PM4 di tipo 0. + + + hostMarkersCheckBox + Marcatori di Debug dell'Host:\nInserisce nel log informazioni ottenute dall'emulatore come ad esempio marcatori per comandi specifici AMDGPU quando si hanno comandi Vulkan e associa nomi di debug per le risorse.\nSe hai questa opzione abilitata dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. + + + guestMarkersCheckBox + Marcatori di Debug del Guest:\nInserisce nel log marcatori di debug che il gioco stesso ha aggiunto al buffer dei comandi.\nSe hai abilitato questa opzione dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Sfoglia + + + Enable Debug Dumping + + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Cartella di installazione dei giochi + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Visualizzatore Trofei + + + diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index cca2f1005..73c9d736c 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - shadPS4について - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 - - - This software should not be used to play games you have not legally obtained. - 非正規、非合法のゲームをプレイするためにこのソフトウェアを使用しないでください。 - - - - ElfViewer - - Open Folder - フォルダを開く - - - - GameInfoClass - - Loading game list, please wait :3 - ゲームリストを読み込み中です。しばらくお待ちください :3 - - - Cancel - キャンセル - - - Loading... - 読み込み中... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - ディレクトリを選択 - - - Select which directory you want to install to. - インストール先のディレクトリを選択してください。 - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - ディレクトリを選択 - - - Directory to install games - ゲームをインストールするディレクトリ - - - Browse - 参照 - - - Error - エラー - - - The value for location to install games is not valid. - ゲームのインストール場所が無効です。 - - - - GuiContextMenus - - Create Shortcut - ショートカットを作成 - - - Cheats / Patches - チート / パッチ - - - SFO Viewer - SFOビューワー - - - Trophy Viewer - トロフィービューワー - - - Open Folder... - フォルダを開く... - - - Open Game Folder - ゲームフォルダを開く - - - Open Save Data Folder - セーブデータフォルダを開く - - - Open Log Folder - ログフォルダを開く - - - Copy info... - 情報をコピー... - - - Copy Name - 名前をコピー - - - Copy Serial - シリアルをコピー - - - Copy All - すべてコピー - - - Delete... - 削除... - - - Delete Game - ゲームを削除 - - - Delete Update - アップデートを削除 - - - Delete DLC - DLCを削除 - - - Compatibility... - 互換性... - - - Update database - データベースを更新 - - - View report - レポートを表示 - - - Submit a report - レポートを送信 - - - Shortcut creation - ショートカットの作成 - - - Shortcut created successfully! - ショートカットが正常に作成されました! - - - Error - エラー - - - Error creating shortcut! - ショートカットの作成に失敗しました! - - - Install PKG - PKGをインストール - - - Game - ゲーム - - - requiresEnableSeparateUpdateFolder_MSG - この機能を利用するには、 'アップデートフォルダの分離を有効化' を有効化する必要があります。 - - - This game has no update to delete! - このゲームにはアップデートがないため削除することができません! - - - Update - アップデート - - - This game has no DLC to delete! - このゲームにはDLCがないため削除することができません! - - - DLC - DLC - - - Delete %1 - %1 を削除 - - - Are you sure you want to delete %1's %2 directory? - %1 の %2 ディレクトリを本当に削除しますか? - - - - MainWindow - - Open/Add Elf Folder - Elfフォルダを開く/追加する - - - Install Packages (PKG) - パッケージをインストール (PKG) - - - Boot Game - ゲームを起動 - - - Check for Updates - 更新を確認する - - - About shadPS4 - shadPS4について - - - Configure... - 設定... - - - Install application from a .pkg file - .pkgファイルからアプリケーションをインストール - - - Recent Games - 最近プレイしたゲーム - - - Open shadPS4 Folder - shadPS4フォルダを開く - - - Exit - 終了 - - - Exit shadPS4 - shadPS4を終了 - - - Exit the application. - アプリケーションを終了します。 - - - Show Game List - ゲームリストを表示 - - - Game List Refresh - ゲームリストの更新 - - - Tiny - 最小 - - - Small - - - - Medium - - - - Large - - - - List View - リストビュー - - - Grid View - グリッドビュー - - - Elf Viewer - Elfビューアー - - - Game Install Directory - ゲームインストールディレクトリ - - - Download Cheats/Patches - チート / パッチをダウンロード - - - Dump Game List - ゲームリストをダンプ - - - PKG Viewer - PKGビューアー - - - Search... - 検索... - - - File - ファイル - - - View - 表示 - - - Game List Icons - ゲームリストアイコン - - - Game List Mode - ゲームリストモード - - - Settings - 設定 - - - Utils - ユーティリティ - - - Themes - テーマ - - - Help - ヘルプ - - - Dark - ダーク - - - Light - ライト - - - Green - グリーン - - - Blue - ブルー - - - Violet - バイオレット - - - toolBar - ツールバー - - - Game List - ゲームリスト - - - * Unsupported Vulkan Version - * サポートされていないVulkanバージョン - - - Download Cheats For All Installed Games - すべてのインストール済みゲームのチートをダウンロード - - - Download Patches For All Games - すべてのゲームのパッチをダウンロード - - - Download Complete - ダウンロード完了 - - - You have downloaded cheats for all the games you have installed. - インストールされているすべてのゲームのチートをダウンロードしました。 - - - Patches Downloaded Successfully! - パッチが正常にダウンロードされました! - - - All Patches available for all games have been downloaded. - すべてのゲームに利用可能なパッチがダウンロードされました。 - - - Games: - ゲーム: - - - PKG File (*.PKG) - PKGファイル (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELFファイル (*.bin *.elf *.oelf) - - - Game Boot - ゲームブート - - - Only one file can be selected! - 1つのファイルしか選択できません! - - - PKG Extraction - PKGの抽出 - - - Patch detected! - パッチが検出されました! - - - PKG and Game versions match: - PKGとゲームのバージョンが一致しています: - - - Would you like to overwrite? - 上書きしてもよろしいですか? - - - PKG Version %1 is older than installed version: - PKGバージョン %1 はインストールされているバージョンよりも古いです: - - - Game is installed: - ゲームはインストール済みです: - - - Would you like to install Patch: - パッチをインストールしてもよろしいですか: - - - DLC Installation - DLCのインストール - - - Would you like to install DLC: %1? - DLCをインストールしてもよろしいですか: %1? - - - DLC already installed: - DLCはすでにインストールされています: - - - Game already installed - ゲームはすでにインストールされています - - - PKG is a patch, please install the game first! - PKGはパッチです。ゲームを先にインストールしてください! - - - PKG ERROR - PKGエラー - - - Extracting PKG %1/%2 - PKGを抽出中 %1/%2 - - - Extraction Finished - 抽出完了 - - - Game successfully installed at %1 - ゲームが %1 に正常にインストールされました - - - File doesn't appear to be a valid PKG file - ファイルが有効なPKGファイルでないようです - - - - PKGViewer - - Open Folder - フォルダーを開く - - - - TrophyViewer - - Trophy Viewer - トロフィービューアー - - - - SettingsDialog - - Settings - 設定 - - - General - 一般 - - - System - システム - - - Console Language - コンソールの言語 - - - Emulator Language - エミュレーターの言語 - - - Emulator - エミュレーター - - - Enable Fullscreen - フルスクリーンを有効にする - - - Fullscreen Mode - 全画面モード - - - Enable Separate Update Folder - アップデートフォルダの分離を有効化 - - - Default tab when opening settings - 設定を開くときのデフォルトタブ - - - Show Game Size In List - ゲームサイズをリストに表示 - - - Show Splash - スプラッシュ画面を表示する - - - Is PS4 Pro - PS4 Proモード - - - Enable Discord Rich Presence - Discord Rich Presenceを有効にする - - - Username - ユーザー名 - - - Trophy Key - トロフィーキー - - - Trophy - トロフィー - - - Logger - ロガー - - - Log Type - ログタイプ - - - Log Filter - ログフィルター - - - Open Log Location - ログの場所を開く - - - Input - 入力 - - - Cursor - カーソル - - - Hide Cursor - カーソルを隠す - - - Hide Cursor Idle Timeout - カーソルを隠すまでの非アクティブ期間 - - - s - s - - - Controller - コントローラー - - - Back Button Behavior - 戻るボタンの動作 - - - Graphics - グラフィックス - - - GUI - インターフェース - - - User - ユーザー - - - Graphics Device - グラフィックスデバイス - - - Width - - - - Height - 高さ - - - Vblank Divider - Vblankディバイダー - - - Advanced - 高度な設定 - - - Enable Shaders Dumping - シェーダーのダンプを有効にする - - - Enable NULL GPU - NULL GPUを有効にする - - - Paths - パス - - - Game Folders - ゲームフォルダ - - - Add... - 追加... - - - Remove - 削除 - - - Debug - デバッグ - - - Enable Debug Dumping - デバッグダンプを有効にする - - - Enable Vulkan Validation Layers - Vulkan検証レイヤーを有効にする - - - Enable Vulkan Synchronization Validation - Vulkan同期検証を有効にする - - - Enable RenderDoc Debugging - RenderDocデバッグを有効にする - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - 更新 - - - Check for Updates at Startup - 起動時に更新確認 - - - Always Show Changelog - 常に変更履歴を表示 - - - Update Channel - アップデートチャネル - - - Check for Updates - 更新を確認 - - - GUI Settings - GUI設定 - - - Title Music - Title Music - - - Disable Trophy Pop-ups - トロフィーのポップアップを無効化 - - - Play title music - タイトル音楽を再生する - - - Update Compatibility Database On Startup - 起動時に互換性データベースを更新する - - - Game Compatibility - ゲームの互換性 - - - Display Compatibility Data - 互換性に関するデータを表示 - - - Update Compatibility Database - 互換性データベースを更新 - - - Volume - 音量 - - - Audio Backend - オーディオ バックエンド - - - Save - 保存 - - - Apply - 適用 - - - Restore Defaults - デフォルトに戻す - - - Close - 閉じる - - - Point your mouse at an option to display its description. - 設定項目にマウスをホバーすると、説明が表示されます。 - - - consoleLanguageGroupBox - コンソールの言語:\nPS4ゲームが使用する言語を設定します。\nゲームでサポートされている言語に設定することをお勧めしますが、地域によって異なる場合があります。 - - - emulatorLanguageGroupBox - エミュレーターの言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 - - - fullscreenCheckBox - 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで、管理が容易になります。 - - - showSplashCheckBox - スプラッシュスクリーンを表示:\nゲーム起動中にゲームのスプラッシュスクリーン(特別な画像)を表示します。 - - - ps4proCheckBox - PS4 Pro モード:\nエミュレーターがPS4 PROとして動作するようになり、PS4 PROをサポートする一部のゲームで特別な機能が有効化される場合があります。 - - - discordRPCCheckbox - Discord Rich Presenceを有効にする:\nエミュレーターのアイコンと関連情報をDiscordプロフィールに表示します。 - - - userName - ユーザー名:\nPS4のアカウントユーザー名を設定します。これは、一部のゲームで表示される場合があります。 - - - TrophyKey - トロフィーキー:\nトロフィーの復号に使用されるキーです。脱獄済みのコンソールから取得することができます。\n16進数のみを受け入れます。 - - - logTypeGroupBox - ログタイプ:\nパフォーマンスのためにログウィンドウの出力を同期させるかどうかを設定します。エミュレーションに悪影響を及ぼす可能性があります。 - - - logFilter - ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" \nレベル: Trace, Debug, Info, Warning, Error, Critical - レベルはこの並び通りに処理され、指定されたレベルより前のレベル ログを抑制し、それ以外のすべてのレベルをログに記録します。 - - - updaterGroupBox - 更新:\nRelease: 最新の機能を利用できない可能性がありますが、より信頼性が高くテストされた公式バージョンが毎月リリースされます。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 - - - GUIMusicGroupBox - タイトルミュージックを再生:\nゲームでサポートされている場合に、GUIでゲームを選択したときに特別な音楽を再生する機能を有効にします。 - - - disableTrophycheckBox - トロフィーのポップアップを無効化:\nゲーム内でのトロフィー通知を無効化します。 トロフィーの進行状況は、トロフィービューアーを使用して確認できます。(メインウィンドウでゲームを右クリック) - - - hideCursorGroupBox - カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n無効: 常にカーソルが表示されます。\n非アクティブ時: カーソルの非アクティブ期間が指定した時間を超えた場合にカーソルを隠します。\n常に: カーソルは常に隠れた状態になります。 - - - idleTimeoutGroupBox - カーソルが非アクティブになってから隠すまでの時間を設定します。 - - - backButtonBehaviorGroupBox - 戻るボタンの動作:\nコントローラーの戻るボタンを、PS4のタッチパッドの指定された位置をタッチするように設定します。 - - - enableCompatibilityCheckBox - 互換性に関するデータを表示:\nゲームの互換性に関する情報を表として表示します。常に最新情報を取得したい場合、"起動時に互換性データベースを更新する" を有効化してください。 - - - checkCompatibilityOnStartupCheckBox - 起動時に互換性データベースを更新する:\nshadPS4の起動時に自動で互換性データベースを更新します。 - - - updateCompatibilityButton - 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 - - - Never - 無効 - - - Idle - 非アクティブ時 - - - Always - 常に - - - Touchpad Left - 左タッチパッド - - - Touchpad Right - 右タッチパッド - - - Touchpad Center - タッチパッド中央 - - - None - なし - - - graphicsAdapterGroupBox - グラフィックデバイス:\nシステムに複数のGPUが搭載されている場合、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 - - - resolutionLayout - 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中でもサイズを変更することができます。\nこれはゲーム内の解像度とは異なります。 - - - heightDivider - Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! - - - dumpShadersCheckBox - シェーダーダンプを有効にする:\n技術的なデバッグの目的で、レンダリング中にゲームのシェーダーをフォルダーに保存します。 - - - nullGpuCheckBox - Null GPUを有効にする:\n技術的なデバッグの目的で、グラフィックスカードがないかのようにゲームのレンダリングを無効にします。 - - - gameFoldersBox - ゲームフォルダ:\nインストールされたゲームを確認するためのフォルダのリスト。 - - - addFolderButton - 追加:\nリストにフォルダを追加します。 - - - removeFolderButton - 削除:\nリストからフォルダを削除します。 - - - debugDump - デバッグダンプを有効にする:\n現在実行中のPS4プログラムのインポートおよびエクスポートシンボルとファイルヘッダー情報をディレクトリに保存します。 - - - vkValidationCheckBox - Vulkanバリデーションレイヤーを有効にする:\nVulkanのレンダリングステータスを検証し、内部状態に関する情報をログに記録するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - - - vkSyncValidationCheckBox - Vulkan同期バリデーションを有効にする:\nVulkanのレンダリングタスクのタイミングを検証するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - - - rdocCheckBox - RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - のチート/パッチ - - - defaultTextEdit_MSG - チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチは開発を行っていないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 - - - No Image Available - 画像は利用できません - - - Serial: - シリアル: - - - Version: - バージョン: - - - Size: - サイズ: - - - Select Cheat File: - チートファイルを選択: - - - Repository: - リポジトリ: - - - Download Cheats - チートをダウンロード - - - Delete File - ファイルを削除 - - - No files selected. - ファイルが選択されていません。 - - - You can delete the cheats you don't want after downloading them. - ダウンロード後に不要なチートを削除できます。 - - - Do you want to delete the selected file?\n%1 - 選択したファイルを削除しますか?\n%1 - - - Select Patch File: - パッチファイルを選択: - - - Download Patches - パッチをダウンロード - - - Save - 保存 - - - Cheats - チート - - - Patches - パッチ - - - Error - エラー - - - No patch selected. - パッチが選択されていません。 - - - Unable to open files.json for reading. - files.jsonを読み取りのために開く事が出来ませんでした。 - - - No patch file found for the current serial. - 現在のシリアルに対するパッチファイルが見つかりません。 - - - Unable to open the file for reading. - ファイルを読み取りのために開く事が出来ませんでした。 - - - Unable to open the file for writing. - ファイルをを書き込みのために開く事が出来ませんでした。 - - - Failed to parse XML: - XMLの解析に失敗しました: - - - Success - 成功 - - - Options saved successfully. - オプションが正常に保存されました。 - - - Invalid Source - 無効なソース - - - The selected source is invalid. - 選択されたソースは無効です。 - - - File Exists - ファイルが存在します - - - File already exists. Do you want to replace it? - ファイルはすでに存在します。置き換えますか? - - - Failed to save file: - ファイルの保存に失敗しました: - - - Failed to download file: - ファイルのダウンロードに失敗しました: - - - Cheats Not Found - チートが見つかりません - - - CheatsNotFound_MSG - このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 - - - Cheats Downloaded Successfully - チートが正常にダウンロードされました - - - CheatsDownloadedSuccessfully_MSG - このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 - - - Failed to save: - 保存に失敗しました: - - - Failed to download: - ダウンロードに失敗しました: - - - Download Complete - ダウンロード完了 - - - DownloadComplete_MSG - パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。 - - - Failed to parse JSON data from HTML. - HTMLからJSONデータの解析に失敗しました。 - - - Failed to retrieve HTML page. - HTMLページの取得に失敗しました。 - - - The game is in version: %1 - ゲームのバージョン: %1 - - - The downloaded patch only works on version: %1 - ダウンロードしたパッチはバージョン: %1 のみ機能します - - - You may need to update your game. - ゲームを更新する必要があるかもしれません。 - - - Incompatibility Notice - 互換性のない通知 - - - Failed to open file: - ファイルを開くのに失敗しました: - - - XML ERROR: - XMLエラー: - - - Failed to open files.json for writing - files.jsonを読み取りのために開く事が出来ませんでした。 - - - Author: - 著者: - - - Directory does not exist: - ディレクトリが存在しません: - - - Failed to open files.json for reading. - files.jsonを読み取りのために開く事が出来ませんでした。 - - - Name: - 名前: - - - Can't apply cheats before the game is started - ゲームが開始される前にチートを適用することはできません。 - - - - GameListFrame - - Icon - アイコン - - - Name - 名前 - - - Serial - シリアル - - - Compatibility - Compatibility - - - Region - 地域 - - - Firmware - ファームウェア - - - Size - サイズ - - - Version - バージョン - - - Path - パス - - - Play Time - プレイ時間 - - - Never Played - 未プレイ - - - h - 時間 - - - m - - - - s - - - - Compatibility is untested - 互換性は未検証です - - - Game does not initialize properly / crashes the emulator - ゲームが正常に初期化されない/エミュレーターがクラッシュする - - - Game boots, but only displays a blank screen - ゲームは起動しますが、空のスクリーンが表示されます - - - Game displays an image but does not go past the menu - 正常にゲーム画面が表示されますが、メニューから先に進むことができません - - - Game has game-breaking glitches or unplayable performance - ゲームを壊すような不具合や、プレイが不可能なほどのパフォーマンスの問題があります - - - Game can be completed with playable performance and no major glitches - パフォーマンスに問題はなく、大きな不具合なしでゲームをプレイすることができます - - - Click to see details on github - 詳細を見るにはGitHubをクリックしてください - - - Last updated - 最終更新 - - - - CheckUpdate - - Auto Updater - 自動アップデーター - - - Error - エラー - - - Network error: - ネットワークエラー: - - - Error_Github_limit_MSG - 自動アップデーターは1時間に最大60回の更新チェックを許可します。\nこの制限に達しました。後でもう一度お試しください。 - - - Failed to parse update information. - アップデート情報の解析に失敗しました。 - - - No pre-releases found. - プレリリースは見つかりませんでした。 - - - Invalid release data. - リリースデータが無効です。 - - - No download URL found for the specified asset. - 指定されたアセットのダウンロードURLが見つかりませんでした。 - - - Your version is already up to date! - あなたのバージョンはすでに最新です! - - - Update Available - アップデートがあります - - - Update Channel - アップデートチャネル - - - Current Version - 現在のバージョン - - - Latest Version - 最新バージョン - - - Do you want to update? - アップデートしますか? - - - Show Changelog - 変更ログを表示 - - - Check for Updates at Startup - 起動時に更新確認 - - - Update - アップデート - - - No - いいえ - - - Hide Changelog - 変更ログを隠す - - - Changes - 変更点 - - - Network error occurred while trying to access the URL - URLにアクセス中にネットワークエラーが発生しました - - - Download Complete - ダウンロード完了 - - - The update has been downloaded, press OK to install. - アップデートがダウンロードされました。インストールするにはOKを押してください。 - - - Failed to save the update file at - 更新ファイルの保存に失敗しました - - - Starting Update... - アップデートを開始しています... - - - Failed to create the update script file - アップデートスクリプトファイルの作成に失敗しました - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - 互換性データを取得しています。少々お待ちください。 - - - Cancel - キャンセル - - - Loading... - 読み込み中... - - - Error - エラー - - - Unable to update compatibility data! Try again later. - 互換性データを更新できませんでした!後で再試行してください。 - - - Unable to open compatibility_data.json for writing. - compatibility_data.jsonを開いて書き込むことができませんでした。 - - - Unknown - 不明 - - - Nothing - 何もない - - - Boots - ブーツ - - - Menus - メニュー - - - Ingame - ゲーム内 - - - Playable - プレイ可能 - - + + AboutDialog + + About shadPS4 + shadPS4について + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 + + + This software should not be used to play games you have not legally obtained. + 非正規、非合法のゲームをプレイするためにこのソフトウェアを使用しないでください。 + + + + CheatsPatches + + Cheats / Patches for + のチート/パッチ + + + defaultTextEdit_MSG + チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチは開発を行っていないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 + + + No Image Available + 画像は利用できません + + + Serial: + シリアル: + + + Version: + バージョン: + + + Size: + サイズ: + + + Select Cheat File: + チートファイルを選択: + + + Repository: + リポジトリ: + + + Download Cheats + チートをダウンロード + + + Delete File + ファイルを削除 + + + No files selected. + ファイルが選択されていません。 + + + You can delete the cheats you don't want after downloading them. + ダウンロード後に不要なチートを削除できます。 + + + Do you want to delete the selected file?\n%1 + 選択したファイルを削除しますか?\n%1 + + + Select Patch File: + パッチファイルを選択: + + + Download Patches + パッチをダウンロード + + + Save + 保存 + + + Cheats + チート + + + Patches + パッチ + + + Error + エラー + + + No patch selected. + パッチが選択されていません。 + + + Unable to open files.json for reading. + files.jsonを読み取りのために開く事が出来ませんでした。 + + + No patch file found for the current serial. + 現在のシリアルに対するパッチファイルが見つかりません。 + + + Unable to open the file for reading. + ファイルを読み取りのために開く事が出来ませんでした。 + + + Unable to open the file for writing. + ファイルをを書き込みのために開く事が出来ませんでした。 + + + Failed to parse XML: + XMLの解析に失敗しました: + + + Success + 成功 + + + Options saved successfully. + オプションが正常に保存されました。 + + + Invalid Source + 無効なソース + + + The selected source is invalid. + 選択されたソースは無効です。 + + + File Exists + ファイルが存在します + + + File already exists. Do you want to replace it? + ファイルはすでに存在します。置き換えますか? + + + Failed to save file: + ファイルの保存に失敗しました: + + + Failed to download file: + ファイルのダウンロードに失敗しました: + + + Cheats Not Found + チートが見つかりません + + + CheatsNotFound_MSG + このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 + + + Cheats Downloaded Successfully + チートが正常にダウンロードされました + + + CheatsDownloadedSuccessfully_MSG + このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 + + + Failed to save: + 保存に失敗しました: + + + Failed to download: + ダウンロードに失敗しました: + + + Download Complete + ダウンロード完了 + + + DownloadComplete_MSG + パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。 + + + Failed to parse JSON data from HTML. + HTMLからJSONデータの解析に失敗しました。 + + + Failed to retrieve HTML page. + HTMLページの取得に失敗しました。 + + + The game is in version: %1 + ゲームのバージョン: %1 + + + The downloaded patch only works on version: %1 + ダウンロードしたパッチはバージョン: %1 のみ機能します + + + You may need to update your game. + ゲームを更新する必要があるかもしれません。 + + + Incompatibility Notice + 互換性のない通知 + + + Failed to open file: + ファイルを開くのに失敗しました: + + + XML ERROR: + XMLエラー: + + + Failed to open files.json for writing + files.jsonを読み取りのために開く事が出来ませんでした。 + + + Author: + 著者: + + + Directory does not exist: + ディレクトリが存在しません: + + + Failed to open files.json for reading. + files.jsonを読み取りのために開く事が出来ませんでした。 + + + Name: + 名前: + + + Can't apply cheats before the game is started + ゲームが開始される前にチートを適用することはできません。 + + + Close + 閉じる + + + + CheckUpdate + + Auto Updater + 自動アップデーター + + + Error + エラー + + + Network error: + ネットワークエラー: + + + Error_Github_limit_MSG + 自動アップデーターは1時間に最大60回の更新チェックを許可します。\nこの制限に達しました。後でもう一度お試しください。 + + + Failed to parse update information. + アップデート情報の解析に失敗しました。 + + + No pre-releases found. + プレリリースは見つかりませんでした。 + + + Invalid release data. + リリースデータが無効です。 + + + No download URL found for the specified asset. + 指定されたアセットのダウンロードURLが見つかりませんでした。 + + + Your version is already up to date! + あなたのバージョンはすでに最新です! + + + Update Available + アップデートがあります + + + Update Channel + アップデートチャネル + + + Current Version + 現在のバージョン + + + Latest Version + 最新バージョン + + + Do you want to update? + アップデートしますか? + + + Show Changelog + 変更ログを表示 + + + Check for Updates at Startup + 起動時に更新確認 + + + Update + アップデート + + + No + いいえ + + + Hide Changelog + 変更ログを隠す + + + Changes + 変更点 + + + Network error occurred while trying to access the URL + URLにアクセス中にネットワークエラーが発生しました + + + Download Complete + ダウンロード完了 + + + The update has been downloaded, press OK to install. + アップデートがダウンロードされました。インストールするにはOKを押してください。 + + + Failed to save the update file at + 更新ファイルの保存に失敗しました + + + Starting Update... + アップデートを開始しています... + + + Failed to create the update script file + アップデートスクリプトファイルの作成に失敗しました + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 互換性データを取得しています。少々お待ちください。 + + + Cancel + キャンセル + + + Loading... + 読み込み中... + + + Error + エラー + + + Unable to update compatibility data! Try again later. + 互換性データを更新できませんでした!後で再試行してください。 + + + Unable to open compatibility_data.json for writing. + compatibility_data.jsonを開いて書き込むことができませんでした。 + + + Unknown + 不明 + + + Nothing + 何もない + + + Boots + ブーツ + + + Menus + メニュー + + + Ingame + ゲーム内 + + + Playable + プレイ可能 + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + フォルダを開く + + + + GameInfoClass + + Loading game list, please wait :3 + ゲームリストを読み込み中です。しばらくお待ちください :3 + + + Cancel + キャンセル + + + Loading... + 読み込み中... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - ディレクトリを選択 + + + Directory to install games + ゲームをインストールするディレクトリ + + + Browse + 参照 + + + Error + エラー + + + Directory to install DLC + + + + + GameListFrame + + Icon + アイコン + + + Name + 名前 + + + Serial + シリアル + + + Compatibility + Compatibility + + + Region + 地域 + + + Firmware + ファームウェア + + + Size + サイズ + + + Version + バージョン + + + Path + パス + + + Play Time + プレイ時間 + + + Never Played + 未プレイ + + + h + 時間 + + + m + + + + s + + + + Compatibility is untested + 互換性は未検証です + + + Game does not initialize properly / crashes the emulator + ゲームが正常に初期化されない/エミュレーターがクラッシュする + + + Game boots, but only displays a blank screen + ゲームは起動しますが、空のスクリーンが表示されます + + + Game displays an image but does not go past the menu + 正常にゲーム画面が表示されますが、メニューから先に進むことができません + + + Game has game-breaking glitches or unplayable performance + ゲームを壊すような不具合や、プレイが不可能なほどのパフォーマンスの問題があります + + + Game can be completed with playable performance and no major glitches + パフォーマンスに問題はなく、大きな不具合なしでゲームをプレイすることができます + + + Click to see details on github + 詳細を見るにはGitHubをクリックしてください + + + Last updated + 最終更新 + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + ショートカットを作成 + + + Cheats / Patches + チート / パッチ + + + SFO Viewer + SFOビューワー + + + Trophy Viewer + トロフィービューワー + + + Open Folder... + フォルダを開く... + + + Open Game Folder + ゲームフォルダを開く + + + Open Save Data Folder + セーブデータフォルダを開く + + + Open Log Folder + ログフォルダを開く + + + Copy info... + 情報をコピー... + + + Copy Name + 名前をコピー + + + Copy Serial + シリアルをコピー + + + Copy All + すべてコピー + + + Delete... + 削除... + + + Delete Game + ゲームを削除 + + + Delete Update + アップデートを削除 + + + Delete DLC + DLCを削除 + + + Compatibility... + 互換性... + + + Update database + データベースを更新 + + + View report + レポートを表示 + + + Submit a report + レポートを送信 + + + Shortcut creation + ショートカットの作成 + + + Shortcut created successfully! + ショートカットが正常に作成されました! + + + Error + エラー + + + Error creating shortcut! + ショートカットの作成に失敗しました! + + + Install PKG + PKGをインストール + + + Game + ゲーム + + + This game has no update to delete! + このゲームにはアップデートがないため削除することができません! + + + Update + アップデート + + + This game has no DLC to delete! + このゲームにはDLCがないため削除することができません! + + + DLC + DLC + + + Delete %1 + %1 を削除 + + + Are you sure you want to delete %1's %2 directory? + %1 の %2 ディレクトリを本当に削除しますか? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - ディレクトリを選択 + + + Select which directory you want to install to. + インストール先のディレクトリを選択してください。 + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Elfフォルダを開く/追加する + + + Install Packages (PKG) + パッケージをインストール (PKG) + + + Boot Game + ゲームを起動 + + + Check for Updates + 更新を確認する + + + About shadPS4 + shadPS4について + + + Configure... + 設定... + + + Install application from a .pkg file + .pkgファイルからアプリケーションをインストール + + + Recent Games + 最近プレイしたゲーム + + + Open shadPS4 Folder + shadPS4フォルダを開く + + + Exit + 終了 + + + Exit shadPS4 + shadPS4を終了 + + + Exit the application. + アプリケーションを終了します。 + + + Show Game List + ゲームリストを表示 + + + Game List Refresh + ゲームリストの更新 + + + Tiny + 最小 + + + Small + + + + Medium + + + + Large + + + + List View + リストビュー + + + Grid View + グリッドビュー + + + Elf Viewer + Elfビューアー + + + Game Install Directory + ゲームインストールディレクトリ + + + Download Cheats/Patches + チート / パッチをダウンロード + + + Dump Game List + ゲームリストをダンプ + + + PKG Viewer + PKGビューアー + + + Search... + 検索... + + + File + ファイル + + + View + 表示 + + + Game List Icons + ゲームリストアイコン + + + Game List Mode + ゲームリストモード + + + Settings + 設定 + + + Utils + ユーティリティ + + + Themes + テーマ + + + Help + ヘルプ + + + Dark + ダーク + + + Light + ライト + + + Green + グリーン + + + Blue + ブルー + + + Violet + バイオレット + + + toolBar + ツールバー + + + Game List + ゲームリスト + + + * Unsupported Vulkan Version + * サポートされていないVulkanバージョン + + + Download Cheats For All Installed Games + すべてのインストール済みゲームのチートをダウンロード + + + Download Patches For All Games + すべてのゲームのパッチをダウンロード + + + Download Complete + ダウンロード完了 + + + You have downloaded cheats for all the games you have installed. + インストールされているすべてのゲームのチートをダウンロードしました。 + + + Patches Downloaded Successfully! + パッチが正常にダウンロードされました! + + + All Patches available for all games have been downloaded. + すべてのゲームに利用可能なパッチがダウンロードされました。 + + + Games: + ゲーム: + + + ELF files (*.bin *.elf *.oelf) + ELFファイル (*.bin *.elf *.oelf) + + + Game Boot + ゲームブート + + + Only one file can be selected! + 1つのファイルしか選択できません! + + + PKG Extraction + PKGの抽出 + + + Patch detected! + パッチが検出されました! + + + PKG and Game versions match: + PKGとゲームのバージョンが一致しています: + + + Would you like to overwrite? + 上書きしてもよろしいですか? + + + PKG Version %1 is older than installed version: + PKGバージョン %1 はインストールされているバージョンよりも古いです: + + + Game is installed: + ゲームはインストール済みです: + + + Would you like to install Patch: + パッチをインストールしてもよろしいですか: + + + DLC Installation + DLCのインストール + + + Would you like to install DLC: %1? + DLCをインストールしてもよろしいですか: %1? + + + DLC already installed: + DLCはすでにインストールされています: + + + Game already installed + ゲームはすでにインストールされています + + + PKG ERROR + PKGエラー + + + Extracting PKG %1/%2 + PKGを抽出中 %1/%2 + + + Extraction Finished + 抽出完了 + + + Game successfully installed at %1 + ゲームが %1 に正常にインストールされました + + + File doesn't appear to be a valid PKG file + ファイルが有効なPKGファイルでないようです + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + フォルダーを開く + + + Name + 名前 + + + Serial + シリアル + + + Installed + + + + Size + サイズ + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + 地域 + + + Flags + + + + Path + パス + + + File + ファイル + + + PKG ERROR + PKGエラー + + + Unknown + 不明 + + + Package + + + + + SettingsDialog + + Settings + 設定 + + + General + 一般 + + + System + システム + + + Console Language + コンソールの言語 + + + Emulator Language + エミュレーターの言語 + + + Emulator + エミュレーター + + + Enable Fullscreen + フルスクリーンを有効にする + + + Fullscreen Mode + 全画面モード + + + Enable Separate Update Folder + アップデートフォルダの分離を有効化 + + + Default tab when opening settings + 設定を開くときのデフォルトタブ + + + Show Game Size In List + ゲームサイズをリストに表示 + + + Show Splash + スプラッシュ画面を表示する + + + Enable Discord Rich Presence + Discord Rich Presenceを有効にする + + + Username + ユーザー名 + + + Trophy Key + トロフィーキー + + + Trophy + トロフィー + + + Logger + ロガー + + + Log Type + ログタイプ + + + Log Filter + ログフィルター + + + Open Log Location + ログの場所を開く + + + Input + 入力 + + + Cursor + カーソル + + + Hide Cursor + カーソルを隠す + + + Hide Cursor Idle Timeout + カーソルを隠すまでの非アクティブ期間 + + + s + s + + + Controller + コントローラー + + + Back Button Behavior + 戻るボタンの動作 + + + Graphics + グラフィックス + + + GUI + インターフェース + + + User + ユーザー + + + Graphics Device + グラフィックスデバイス + + + Width + + + + Height + 高さ + + + Vblank Divider + Vblankディバイダー + + + Advanced + 高度な設定 + + + Enable Shaders Dumping + シェーダーのダンプを有効にする + + + Enable NULL GPU + NULL GPUを有効にする + + + Paths + パス + + + Game Folders + ゲームフォルダ + + + Add... + 追加... + + + Remove + 削除 + + + Debug + デバッグ + + + Enable Debug Dumping + デバッグダンプを有効にする + + + Enable Vulkan Validation Layers + Vulkan検証レイヤーを有効にする + + + Enable Vulkan Synchronization Validation + Vulkan同期検証を有効にする + + + Enable RenderDoc Debugging + RenderDocデバッグを有効にする + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + 更新 + + + Check for Updates at Startup + 起動時に更新確認 + + + Always Show Changelog + 常に変更履歴を表示 + + + Update Channel + アップデートチャネル + + + Check for Updates + 更新を確認 + + + GUI Settings + GUI設定 + + + Title Music + Title Music + + + Disable Trophy Pop-ups + トロフィーのポップアップを無効化 + + + Play title music + タイトル音楽を再生する + + + Update Compatibility Database On Startup + 起動時に互換性データベースを更新する + + + Game Compatibility + ゲームの互換性 + + + Display Compatibility Data + 互換性に関するデータを表示 + + + Update Compatibility Database + 互換性データベースを更新 + + + Volume + 音量 + + + Save + 保存 + + + Apply + 適用 + + + Restore Defaults + デフォルトに戻す + + + Close + 閉じる + + + Point your mouse at an option to display its description. + 設定項目にマウスをホバーすると、説明が表示されます。 + + + consoleLanguageGroupBox + コンソールの言語:\nPS4ゲームが使用する言語を設定します。\nゲームでサポートされている言語に設定することをお勧めしますが、地域によって異なる場合があります。 + + + emulatorLanguageGroupBox + エミュレーターの言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 + + + fullscreenCheckBox + 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで、管理が容易になります。 + + + showSplashCheckBox + スプラッシュスクリーンを表示:\nゲーム起動中にゲームのスプラッシュスクリーン(特別な画像)を表示します。 + + + discordRPCCheckbox + Discord Rich Presenceを有効にする:\nエミュレーターのアイコンと関連情報をDiscordプロフィールに表示します。 + + + userName + ユーザー名:\nPS4のアカウントユーザー名を設定します。これは、一部のゲームで表示される場合があります。 + + + TrophyKey + トロフィーキー:\nトロフィーの復号に使用されるキーです。脱獄済みのコンソールから取得することができます。\n16進数のみを受け入れます。 + + + logTypeGroupBox + ログタイプ:\nパフォーマンスのためにログウィンドウの出力を同期させるかどうかを設定します。エミュレーションに悪影響を及ぼす可能性があります。 + + + logFilter + ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" \nレベル: Trace, Debug, Info, Warning, Error, Critical - レベルはこの並び通りに処理され、指定されたレベルより前のレベル ログを抑制し、それ以外のすべてのレベルをログに記録します。 + + + updaterGroupBox + 更新:\nRelease: 最新の機能を利用できない可能性がありますが、より信頼性が高くテストされた公式バージョンが毎月リリースされます。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 + + + GUIMusicGroupBox + タイトルミュージックを再生:\nゲームでサポートされている場合に、GUIでゲームを選択したときに特別な音楽を再生する機能を有効にします。 + + + disableTrophycheckBox + トロフィーのポップアップを無効化:\nゲーム内でのトロフィー通知を無効化します。 トロフィーの進行状況は、トロフィービューアーを使用して確認できます。(メインウィンドウでゲームを右クリック) + + + hideCursorGroupBox + カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n無効: 常にカーソルが表示されます。\n非アクティブ時: カーソルの非アクティブ期間が指定した時間を超えた場合にカーソルを隠します。\n常に: カーソルは常に隠れた状態になります。 + + + idleTimeoutGroupBox + カーソルが非アクティブになってから隠すまでの時間を設定します。 + + + backButtonBehaviorGroupBox + 戻るボタンの動作:\nコントローラーの戻るボタンを、PS4のタッチパッドの指定された位置をタッチするように設定します。 + + + enableCompatibilityCheckBox + 互換性に関するデータを表示:\nゲームの互換性に関する情報を表として表示します。常に最新情報を取得したい場合、"起動時に互換性データベースを更新する" を有効化してください。 + + + checkCompatibilityOnStartupCheckBox + 起動時に互換性データベースを更新する:\nshadPS4の起動時に自動で互換性データベースを更新します。 + + + updateCompatibilityButton + 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 + + + Never + 無効 + + + Idle + 非アクティブ時 + + + Always + 常に + + + Touchpad Left + 左タッチパッド + + + Touchpad Right + 右タッチパッド + + + Touchpad Center + タッチパッド中央 + + + None + なし + + + graphicsAdapterGroupBox + グラフィックデバイス:\nシステムに複数のGPUが搭載されている場合、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 + + + resolutionLayout + 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中でもサイズを変更することができます。\nこれはゲーム内の解像度とは異なります。 + + + heightDivider + Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! + + + dumpShadersCheckBox + シェーダーダンプを有効にする:\n技術的なデバッグの目的で、レンダリング中にゲームのシェーダーをフォルダーに保存します。 + + + nullGpuCheckBox + Null GPUを有効にする:\n技術的なデバッグの目的で、グラフィックスカードがないかのようにゲームのレンダリングを無効にします。 + + + gameFoldersBox + ゲームフォルダ:\nインストールされたゲームを確認するためのフォルダのリスト。 + + + addFolderButton + 追加:\nリストにフォルダを追加します。 + + + removeFolderButton + 削除:\nリストからフォルダを削除します。 + + + debugDump + デバッグダンプを有効にする:\n現在実行中のPS4プログラムのインポートおよびエクスポートシンボルとファイルヘッダー情報をディレクトリに保存します。 + + + vkValidationCheckBox + Vulkanバリデーションレイヤーを有効にする:\nVulkanのレンダリングステータスを検証し、内部状態に関する情報をログに記録するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 + + + vkSyncValidationCheckBox + Vulkan同期バリデーションを有効にする:\nVulkanのレンダリングタスクのタイミングを検証するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 + + + rdocCheckBox + RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + 参照 + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + ゲームをインストールするディレクトリ + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + トロフィービューアー + + diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index d297e41a3..d7122dbd6 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - 치트 / 패치 - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Open Folder... - - - Open Game Folder - Open Game Folder - - - Open Save Data Folder - Open Save Data Folder - - - Open Log Folder - Open Log Folder - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Check for Updates - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - 치트 / 패치 다운로드 - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Help - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Game List - - - * Unsupported Vulkan Version - * Unsupported Vulkan Version - - - Download Cheats For All Installed Games - Download Cheats For All Installed Games - - - Download Patches For All Games - Download Patches For All Games - - - Download Complete - Download Complete - - - You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. - - - Patches Downloaded Successfully! - Patches Downloaded Successfully! - - - All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. - - - Games: - Games: - - - PKG File (*.PKG) - PKG File (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) - - - Game Boot - Game Boot - - - Only one file can be selected! - Only one file can be selected! - - - PKG Extraction - PKG Extraction - - - Patch detected! - Patch detected! - - - PKG and Game versions match: - PKG and Game versions match: - - - Would you like to overwrite? - Would you like to overwrite? - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - Game is installed: - Game is installed: - - - Would you like to install Patch: - Would you like to install Patch: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - DLC already installed: - DLC already installed: - - - Game already installed - Game already installed - - - PKG is a patch, please install the game first! - PKG is a patch, please install the game first! - - - PKG ERROR - PKG ERROR - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - Extraction Finished - Extraction Finished - - - Game successfully installed at %1 - Game successfully installed at %1 - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - 전체 화면 모드 - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - 설정 열기 시 기본 탭 - - - Show Game Size In List - 게임 크기를 목록에 표시 - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Enable Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - 로그 위치 열기 - - - Input - Input - - - Cursor - Cursor - - - Hide Cursor - Hide Cursor - - - Hide Cursor Idle Timeout - Hide Cursor Idle Timeout - - - s - s - - - Controller - Controller - - - Back Button Behavior - Back Button Behavior - - - Graphics - Graphics - - - GUI - 인터페이스 - - - User - 사용자 - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Paths - - - Game Folders - Game Folders - - - Add... - Add... - - - Remove - Remove - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Update - - - Check for Updates at Startup - Check for Updates at Startup - - - Always Show Changelog - 항상 변경 사항 표시 - - - Update Channel - Update Channel - - - Check for Updates - Check for Updates - - - GUI Settings - GUI Settings - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Play title music - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - 음량 - - - Audio Backend - Audio Backend - - - Save - Save - - - Apply - Apply - - - Restore Defaults - Restore Defaults - - - Close - Close - - - Point your mouse at an option to display its description. - Point your mouse at an option to display its description. - - - consoleLanguageGroupBox - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - - - emulatorLanguageGroupBox - Emulator Language:\nSets the language of the emulator's user interface. - - - fullscreenCheckBox - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - - - ps4proCheckBox - Is PS4 Pro:\nMakes the emulator act as a PS4 PRO, which may enable special features in games that support it. - - - discordRPCCheckbox - Discord Rich Presence 활성화:\nDiscord 프로필에 에뮬레이터 아이콘과 관련 정보를 표시합니다. - - - userName - Username:\nSets the PS4's account username, which may be displayed by some games. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - - - logFilter - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - - - updaterGroupBox - Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - - - GUIMusicGroupBox - Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - - - idleTimeoutGroupBox - Set a time for the mouse to disappear after being after being idle. - - - backButtonBehaviorGroupBox - Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Never - - - Idle - Idle - - - Always - Always - - - Touchpad Left - Touchpad Left - - - Touchpad Right - Touchpad Right - - - Touchpad Center - Touchpad Center - - - None - None - - - graphicsAdapterGroupBox - Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - - - resolutionLayout - Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - - - heightDivider - Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - - - dumpShadersCheckBox - Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - - - nullGpuCheckBox - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - - - gameFoldersBox - Game Folders:\nThe list of folders to check for installed games. - - - addFolderButton - Add:\nAdd a folder to the list. - - - removeFolderButton - Remove:\nRemove a folder from the list. - - - debugDump - Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - - - vkValidationCheckBox - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - - - vkSyncValidationCheckBox - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - - - rdocCheckBox - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - No Image Available - - - Serial: - Serial: - - - Version: - Version: - - - Size: - Size: - - - Select Cheat File: - Select Cheat File: - - - Repository: - Repository: - - - Download Cheats - Download Cheats - - - Delete File - Delete File - - - No files selected. - No files selected. - - - You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. - - - Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 - - - Select Patch File: - Select Patch File: - - - Download Patches - Download Patches - - - Save - Save - - - Cheats - Cheats - - - Patches - Patches - - - Error - Error - - - No patch selected. - No patch selected. - - - Unable to open files.json for reading. - Unable to open files.json for reading. - - - No patch file found for the current serial. - No patch file found for the current serial. - - - Unable to open the file for reading. - Unable to open the file for reading. - - - Unable to open the file for writing. - Unable to open the file for writing. - - - Failed to parse XML: - Failed to parse XML: - - - Success - Success - - - Options saved successfully. - Options saved successfully. - - - Invalid Source - Invalid Source - - - The selected source is invalid. - The selected source is invalid. - - - File Exists - File Exists - - - File already exists. Do you want to replace it? - File already exists. Do you want to replace it? - - - Failed to save file: - Failed to save file: - - - Failed to download file: - Failed to download file: - - - Cheats Not Found - Cheats Not Found - - - CheatsNotFound_MSG - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - - - Cheats Downloaded Successfully - Cheats Downloaded Successfully - - - CheatsDownloadedSuccessfully_MSG - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - - - Failed to save: - Failed to save: - - - Failed to download: - Failed to download: - - - Download Complete - Download Complete - - - DownloadComplete_MSG - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - - - Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. - - - Failed to retrieve HTML page. - Failed to retrieve HTML page. - - - The game is in version: %1 - The game is in version: %1 - - - The downloaded patch only works on version: %1 - The downloaded patch only works on version: %1 - - - You may need to update your game. - You may need to update your game. - - - Incompatibility Notice - Incompatibility Notice - - - Failed to open file: - Failed to open file: - - - XML ERROR: - XML ERROR: - - - Failed to open files.json for writing - Failed to open files.json for writing - - - Author: - Author: - - - Directory does not exist: - Directory does not exist: - - - Failed to open files.json for reading. - Failed to open files.json for reading. - - - Name: - Name: - - - Can't apply cheats before the game is started - Can't apply cheats before the game is started. - - - - GameListFrame - - Icon - Icon - - - Name - Name - - - Serial - Serial - - - Compatibility - Compatibility - - - Region - Region - - - Firmware - Firmware - - - Size - Size - - - Version - Version - - - Path - Path - - - Play Time - Play Time - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - GitHub에서 세부 정보를 보려면 클릭하세요 - - - Last updated - 마지막 업데이트 - - - - CheckUpdate - - Auto Updater - Auto Updater - - - Error - Error - - - Network error: - Network error: - - - Error_Github_limit_MSG - 자동 업데이트는 시간당 최대 60회의 업데이트 확인을 허용합니다.\n이 제한에 도달했습니다. 나중에 다시 시도해 주세요. - - - Failed to parse update information. - Failed to parse update information. - - - No pre-releases found. - No pre-releases found. - - - Invalid release data. - Invalid release data. - - - No download URL found for the specified asset. - No download URL found for the specified asset. - - - Your version is already up to date! - Your version is already up to date! - - - Update Available - Update Available - - - Update Channel - Update Channel - - - Current Version - Current Version - - - Latest Version - Latest Version - - - Do you want to update? - Do you want to update? - - - Show Changelog - Show Changelog - - - Check for Updates at Startup - Check for Updates at Startup - - - Update - Update - - - No - No - - - Hide Changelog - Hide Changelog - - - Changes - Changes - - - Network error occurred while trying to access the URL - Network error occurred while trying to access the URL - - - Download Complete - Download Complete - - - The update has been downloaded, press OK to install. - The update has been downloaded, press OK to install. - - - Failed to save the update file at - Failed to save the update file at - - - Starting Update... - Starting Update... - - - Failed to create the update script file - Failed to create the update script file - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - 호환성 데이터를 가져오는 중, 잠시만 기다려 주세요 - - - Cancel - 취소 - - - Loading... - 로딩 중... - - - Error - 오류 - - - Unable to update compatibility data! Try again later. - 호환성 데이터를 업데이트할 수 없습니다! 나중에 다시 시도해 주세요. - - - Unable to open compatibility_data.json for writing. - compatibility_data.json을 열어 쓸 수 없습니다. - - - Unknown - 알 수 없음 - - - Nothing - 없음 - - - Boots - 부츠 - - - Menus - 메뉴 - - - Ingame - 게임 내 - - - Playable - 플레이 가능 - - + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + No Image Available + + + Serial: + Serial: + + + Version: + Version: + + + Size: + Size: + + + Select Cheat File: + Select Cheat File: + + + Repository: + Repository: + + + Download Cheats + Download Cheats + + + Delete File + Delete File + + + No files selected. + No files selected. + + + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + + + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + + + Select Patch File: + Select Patch File: + + + Download Patches + Download Patches + + + Save + Save + + + Cheats + Cheats + + + Patches + Patches + + + Error + Error + + + No patch selected. + No patch selected. + + + Unable to open files.json for reading. + Unable to open files.json for reading. + + + No patch file found for the current serial. + No patch file found for the current serial. + + + Unable to open the file for reading. + Unable to open the file for reading. + + + Unable to open the file for writing. + Unable to open the file for writing. + + + Failed to parse XML: + Failed to parse XML: + + + Success + Success + + + Options saved successfully. + Options saved successfully. + + + Invalid Source + Invalid Source + + + The selected source is invalid. + The selected source is invalid. + + + File Exists + File Exists + + + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + + + Failed to save file: + Failed to save file: + + + Failed to download file: + Failed to download file: + + + Cheats Not Found + Cheats Not Found + + + CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + + + Cheats Downloaded Successfully + Cheats Downloaded Successfully + + + CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + + + Failed to save: + Failed to save: + + + Failed to download: + Failed to download: + + + Download Complete + Download Complete + + + DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + + + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + + + Failed to retrieve HTML page. + Failed to retrieve HTML page. + + + The game is in version: %1 + The game is in version: %1 + + + The downloaded patch only works on version: %1 + The downloaded patch only works on version: %1 + + + You may need to update your game. + You may need to update your game. + + + Incompatibility Notice + Incompatibility Notice + + + Failed to open file: + Failed to open file: + + + XML ERROR: + XML ERROR: + + + Failed to open files.json for writing + Failed to open files.json for writing + + + Author: + Author: + + + Directory does not exist: + Directory does not exist: + + + Failed to open files.json for reading. + Failed to open files.json for reading. + + + Name: + Name: + + + Can't apply cheats before the game is started + Can't apply cheats before the game is started. + + + Close + Close + + + + CheckUpdate + + Auto Updater + Auto Updater + + + Error + Error + + + Network error: + Network error: + + + Error_Github_limit_MSG + 자동 업데이트는 시간당 최대 60회의 업데이트 확인을 허용합니다.\n이 제한에 도달했습니다. 나중에 다시 시도해 주세요. + + + Failed to parse update information. + Failed to parse update information. + + + No pre-releases found. + No pre-releases found. + + + Invalid release data. + Invalid release data. + + + No download URL found for the specified asset. + No download URL found for the specified asset. + + + Your version is already up to date! + Your version is already up to date! + + + Update Available + Update Available + + + Update Channel + Update Channel + + + Current Version + Current Version + + + Latest Version + Latest Version + + + Do you want to update? + Do you want to update? + + + Show Changelog + Show Changelog + + + Check for Updates at Startup + Check for Updates at Startup + + + Update + Update + + + No + No + + + Hide Changelog + Hide Changelog + + + Changes + Changes + + + Network error occurred while trying to access the URL + Network error occurred while trying to access the URL + + + Download Complete + Download Complete + + + The update has been downloaded, press OK to install. + The update has been downloaded, press OK to install. + + + Failed to save the update file at + Failed to save the update file at + + + Starting Update... + Starting Update... + + + Failed to create the update script file + Failed to create the update script file + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 호환성 데이터를 가져오는 중, 잠시만 기다려 주세요 + + + Cancel + 취소 + + + Loading... + 로딩 중... + + + Error + 오류 + + + Unable to update compatibility data! Try again later. + 호환성 데이터를 업데이트할 수 없습니다! 나중에 다시 시도해 주세요. + + + Unable to open compatibility_data.json for writing. + compatibility_data.json을 열어 쓸 수 없습니다. + + + Unknown + 알 수 없음 + + + Nothing + 없음 + + + Boots + 부츠 + + + Menus + 메뉴 + + + Ingame + 게임 내 + + + Playable + 플레이 가능 + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Icon + + + Name + Name + + + Serial + Serial + + + Compatibility + Compatibility + + + Region + Region + + + Firmware + Firmware + + + Size + Size + + + Version + Version + + + Path + Path + + + Play Time + Play Time + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + GitHub에서 세부 정보를 보려면 클릭하세요 + + + Last updated + 마지막 업데이트 + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + 치트 / 패치 + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Open Folder... + + + Open Game Folder + Open Game Folder + + + Open Save Data Folder + Open Save Data Folder + + + Open Log Folder + Open Log Folder + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Check for Updates + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + 치트 / 패치 다운로드 + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Help + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Game List + + + * Unsupported Vulkan Version + * Unsupported Vulkan Version + + + Download Cheats For All Installed Games + Download Cheats For All Installed Games + + + Download Patches For All Games + Download Patches For All Games + + + Download Complete + Download Complete + + + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + + + Patches Downloaded Successfully! + Patches Downloaded Successfully! + + + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + + + Games: + Games: + + + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + + + Game Boot + Game Boot + + + Only one file can be selected! + Only one file can be selected! + + + PKG Extraction + PKG Extraction + + + Patch detected! + Patch detected! + + + PKG and Game versions match: + PKG and Game versions match: + + + Would you like to overwrite? + Would you like to overwrite? + + + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + + + Game is installed: + Game is installed: + + + Would you like to install Patch: + Would you like to install Patch: + + + DLC Installation + DLC Installation + + + Would you like to install DLC: %1? + Would you like to install DLC: %1? + + + DLC already installed: + DLC already installed: + + + Game already installed + Game already installed + + + PKG ERROR + PKG ERROR + + + Extracting PKG %1/%2 + Extracting PKG %1/%2 + + + Extraction Finished + Extraction Finished + + + Game successfully installed at %1 + Game successfully installed at %1 + + + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Name + + + Serial + Serial + + + Installed + + + + Size + Size + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Region + + + Flags + + + + Path + Path + + + File + File + + + PKG ERROR + PKG ERROR + + + Unknown + 알 수 없음 + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + 전체 화면 모드 + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + 설정 열기 시 기본 탭 + + + Show Game Size In List + 게임 크기를 목록에 표시 + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Enable Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + 로그 위치 열기 + + + Input + Input + + + Cursor + Cursor + + + Hide Cursor + Hide Cursor + + + Hide Cursor Idle Timeout + Hide Cursor Idle Timeout + + + s + s + + + Controller + Controller + + + Back Button Behavior + Back Button Behavior + + + Graphics + Graphics + + + GUI + 인터페이스 + + + User + 사용자 + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Paths + + + Game Folders + Game Folders + + + Add... + Add... + + + Remove + Remove + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Update + + + Check for Updates at Startup + Check for Updates at Startup + + + Always Show Changelog + 항상 변경 사항 표시 + + + Update Channel + Update Channel + + + Check for Updates + Check for Updates + + + GUI Settings + GUI Settings + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Play title music + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + 음량 + + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Close + Close + + + Point your mouse at an option to display its description. + Point your mouse at an option to display its description. + + + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + + + emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. + + + fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + + + discordRPCCheckbox + Discord Rich Presence 활성화:\nDiscord 프로필에 에뮬레이터 아이콘과 관련 정보를 표시합니다. + + + userName + Username:\nSets the PS4's account username, which may be displayed by some games. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + + + logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + + + updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + + + GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + + + idleTimeoutGroupBox + Set a time for the mouse to disappear after being after being idle. + + + backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Never + + + Idle + Idle + + + Always + Always + + + Touchpad Left + Touchpad Left + + + Touchpad Right + Touchpad Right + + + Touchpad Center + Touchpad Center + + + None + None + + + graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + + + resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + + + heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + + + dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + + + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + + gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. + + + addFolderButton + Add:\nAdd a folder to the list. + + + removeFolderButton + Remove:\nRemove a folder from the list. + + + debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + + + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + + + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + + + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index e4a2dc5b4..27587f25e 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Apgaulės / Pleistrai - Cheats / Patches - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Atidaryti Katalogą... - - - Open Game Folder - Atidaryti Žaidimo Katalogą - - - Open Save Data Folder - Atidaryti Išsaugotų Duomenų Katalogą - - - Open Log Folder - Atidaryti Žurnalų Katalogą - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Patikrinti atnaujinimus - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Atsisiųsti Apgaules / Pleistrus - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Pagalba - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Žaidimų sąrašas - - - * Unsupported Vulkan Version - * Nepalaikoma Vulkan versija - - - Download Cheats For All Installed Games - Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams - - - Download Patches For All Games - Atsisiųsti pataisas visiems žaidimams - - - Download Complete - Atsisiuntimas baigtas - - - You have downloaded cheats for all the games you have installed. - Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. - - - Patches Downloaded Successfully! - Pataisos sėkmingai atsisiųstos! - - - All Patches available for all games have been downloaded. - Visos pataisos visiems žaidimams buvo atsisiųstos. - - - Games: - Žaidimai: - - - PKG File (*.PKG) - PKG failas (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF failai (*.bin *.elf *.oelf) - - - Game Boot - Žaidimo paleidimas - - - Only one file can be selected! - Galite pasirinkti tik vieną failą! - - - PKG Extraction - PKG ištraukimas - - - Patch detected! - Rasta atnaujinimą! - - - PKG and Game versions match: - PKG ir žaidimo versijos sutampa: - - - Would you like to overwrite? - Ar norite perrašyti? - - - PKG Version %1 is older than installed version: - PKG versija %1 yra senesnė nei įdiegta versija: - - - Game is installed: - Žaidimas įdiegtas: - - - Would you like to install Patch: - Ar norite įdiegti atnaujinimą: - - - DLC Installation - DLC diegimas - - - Would you like to install DLC: %1? - Ar norite įdiegti DLC: %1? - - - DLC already installed: - DLC jau įdiegtas: - - - Game already installed - Žaidimas jau įdiegtas - - - PKG is a patch, please install the game first! - PKG yra pataisa, prašome pirmiausia įdiegti žaidimą! - - - PKG ERROR - PKG KLAIDA - - - Extracting PKG %1/%2 - Ekstrakcinis PKG %1/%2 - - - Extraction Finished - Ekstrakcija baigta - - - Game successfully installed at %1 - Žaidimas sėkmingai įdiegtas %1 - - - File doesn't appear to be a valid PKG file - Failas atrodo, kad nėra galiojantis PKG failas - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Viso ekranas - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Numatytoji kortelė atidarius nustatymus - - - Show Game Size In List - Rodyti žaidimo dydį sąraše - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Įjungti Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Atidaryti žurnalo vietą - - - Input - Įvestis - - - Cursor - Žymeklis - - - Hide Cursor - Slėpti žymeklį - - - Hide Cursor Idle Timeout - Žymeklio paslėpimo neveikimo laikas - - - s - s - - - Controller - Valdiklis - - - Back Button Behavior - Atgal mygtuko elgsena - - - Graphics - Graphics - - - GUI - Interfeisa - - - User - Naudotojas - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Keliai - - - Game Folders - Žaidimų aplankai - - - Add... - Pridėti... - - - Remove - Pašalinti - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Atnaujinimas - - - Check for Updates at Startup - Tikrinti naujinimus paleidus - - - Always Show Changelog - Visada rodyti pakeitimų žurnalą - - - Update Channel - Atnaujinimo Kanalas - - - Check for Updates - Patikrinkite atnaujinimus - - - GUI Settings - GUI Nustatymai - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Groti antraštės muziką - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Garsumas - - - Audio Backend - Audio Backend - - - Save - Įrašyti - - - Apply - Taikyti - - - Restore Defaults - Atkurti numatytuosius nustatymus - - - Close - Uždaryti - - - Point your mouse at an option to display its description. - Žymeklį nukreipkite ant pasirinkimo, kad pamatytumėte jo aprašymą. - - - consoleLanguageGroupBox - Konsole kalba:\nNustato kalbą, kurią naudoja PS4 žaidimai.\nRekomenduojama nustatyti kalbą, kurią palaiko žaidimas, priklausomai nuo regiono. - - - emulatorLanguageGroupBox - Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. - - - fullscreenCheckBox - Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Rodyti paleidimo ekraną:\nPaleidimo metu rodo žaidimo paleidimo ekraną (ypatingą vaizdą). - - - ps4proCheckBox - Ar PS4 Pro:\nPadaro, kad emuliatorius veiktų kaip PS4 PRO, kas gali įjungti specialias funkcijas žaidimuose, kurie tai palaiko. - - - discordRPCCheckbox - Įjungti Discord Rich Presence:\nRodo emuliatoriaus ikoną ir susijusią informaciją jūsų Discord profilyje. - - - userName - Vartotojo vardas:\nNustato PS4 paskyros vartotojo vardą, kuris gali būti rodomas kai kuriuose žaidimuose. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Žurnalo tipas:\nNustato, ar sinchronizuoti žurnalo lango išvestį našumui. Tai gali turėti neigiamą poveikį emuliacijai. - - - logFilter - Žurnalo filtras:\nFiltruojamas žurnalas, kad būtų spausdinama tik konkreti informacija.\nPavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius. - - - updaterGroupBox - Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. - - - GUIMusicGroupBox - Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Slėpti žymeklį:\nPasirinkite, kada žymeklis dings:\nNiekuomet: Visada matysite pelę.\nNeaktyvus: Nustatykite laiką, po kurio ji dings, kai bus neaktyvi.\nVisada: niekada nematysite pelės. - - - idleTimeoutGroupBox - Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi. - - - backButtonBehaviorGroupBox - Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Niekada - - - Idle - Neaktyvus - - - Always - Visada - - - Touchpad Left - Jutiklinis Paviršius Kairėje - - - Touchpad Right - Jutiklinis Paviršius Dešinėje - - - Touchpad Center - Jutiklinis Paviršius Centre - - - None - Nieko - - - graphicsAdapterGroupBox - Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos iš išskleidžiamojo sąrašo,\n arba pasirinkite "Auto Select", kad jis būtų nustatytas automatiškai. - - - resolutionLayout - Plotis/Aukštis:\nNustato emuliatoriaus lango dydį paleidimo metu, kurį galima keisti žaidimo metu.\nTai skiriasi nuo žaidimo rezoliucijos. - - - heightDivider - Vblank daliklis:\nKadrų dažnis, kuriuo emuliatorius atnaujinamas, dauginamas iš šio skaičiaus. Pakeitus tai gali turėti neigiamą poveikį, pvz., padidinti žaidimo greitį arba sukelti kritinių žaidimo funkcijų sugadinimą, kurios to nesitikėjo! - - - dumpShadersCheckBox - Įjungti šešėlių išmetimą:\nTechninio derinimo tikslais saugo žaidimo šešėlius į aplanką juos renderuojant. - - - nullGpuCheckBox - Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės. - - - gameFoldersBox - Žaidimų aplankai:\nAplankų sąrašas, kurį reikia patikrinti, ar yra įdiegtų žaidimų. - - - addFolderButton - Pridėti:\nPridėti aplanką į sąrašą. - - - removeFolderButton - Pašalinti:\nPašalinti aplanką iš sąrašo. - - - debugDump - Įjungti derinimo išmetimą:\nIšsaugo importo ir eksporto simbolius bei failo antraštės informaciją apie šiuo metu vykdomą PS4 programą į katalogą. - - - vkValidationCheckBox - Įjungti Vulkan patvirtinimo sluoksnius:\nĮjungia sistemą, kuri patvirtina Vulkan renderio būseną ir registruoja informaciją apie jo vidinę būseną. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - - - vkSyncValidationCheckBox - Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - - - rdocCheckBox - Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Nuotrauka neprieinama - - - Serial: - Seriinis numeris: - - - Version: - Versija: - - - Size: - Dydis: - - - Select Cheat File: - Pasirinkite sukčiavimo failą: - - - Repository: - Saugykla: - - - Download Cheats - Atsisiųsti sukčiavimus - - - Delete File - Pašalinti failą - - - No files selected. - Failai nepasirinkti. - - - You can delete the cheats you don't want after downloading them. - Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. - - - Do you want to delete the selected file?\n%1 - Ar norite ištrinti pasirinktą failą?\n%1 - - - Select Patch File: - Pasirinkite pataisos failą: - - - Download Patches - Atsisiųsti pataisas - - - Save - Įrašyti - - - Cheats - Sukčiavimai - - - Patches - Pataisos - - - Error - Klaida - - - No patch selected. - Nieko nepataisyta. - - - Unable to open files.json for reading. - Neįmanoma atidaryti files.json skaitymui. - - - No patch file found for the current serial. - Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. - - - Unable to open the file for reading. - Neįmanoma atidaryti failo skaitymui. - - - Unable to open the file for writing. - Neįmanoma atidaryti failo rašymui. - - - Failed to parse XML: - Nepavyko išanalizuoti XML: - - - Success - Sėkmė - - - Options saved successfully. - Nustatymai sėkmingai išsaugoti. - - - Invalid Source - Netinkamas šaltinis - - - The selected source is invalid. - Pasirinktas šaltinis yra netinkamas. - - - File Exists - Failas egzistuoja - - - File already exists. Do you want to replace it? - Failas jau egzistuoja. Ar norite jį pakeisti? - - - Failed to save file: - Nepavyko išsaugoti failo: - - - Failed to download file: - Nepavyko atsisiųsti failo: - - - Cheats Not Found - Sukčiavimai nerasti - - - CheatsNotFound_MSG - Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. - - - Cheats Downloaded Successfully - Sukčiavimai sėkmingai atsisiųsti - - - CheatsDownloadedSuccessfully_MSG - Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. - - - Failed to save: - Nepavyko išsaugoti: - - - Failed to download: - Nepavyko atsisiųsti: - - - Download Complete - Atsisiuntimas baigtas - - - DownloadComplete_MSG - Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. - - - Failed to parse JSON data from HTML. - Nepavyko išanalizuoti JSON duomenų iš HTML. - - - Failed to retrieve HTML page. - Nepavyko gauti HTML puslapio. - - - The game is in version: %1 - Žaidimas yra versijoje: %1 - - - The downloaded patch only works on version: %1 - Parsisiųstas pataisas veikia tik versijoje: %1 - - - You may need to update your game. - Gali tekti atnaujinti savo žaidimą. - - - Incompatibility Notice - Suderinamumo pranešimas - - - Failed to open file: - Nepavyko atidaryti failo: - - - XML ERROR: - XML KLAIDA: - - - Failed to open files.json for writing - Nepavyko atidaryti files.json rašymui - - - Author: - Autorius: - - - Directory does not exist: - Katalogas neegzistuoja: - - - Failed to open files.json for reading. - Nepavyko atidaryti files.json skaitymui. - - - Name: - Pavadinimas: - - - Can't apply cheats before the game is started - Negalima taikyti sukčiavimų prieš pradedant žaidimą. - - - - GameListFrame - - Icon - Ikona - - - Name - Vardas - - - Serial - Serijinis numeris - - - Compatibility - Compatibility - - - Region - Regionas - - - Firmware - Firmvare - - - Size - Dydis - - - Version - Versija - - - Path - Kelias - - - Play Time - Žaidimo laikas - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Spustelėkite, kad pamatytumėte detales GitHub - - - Last updated - Paskutinį kartą atnaujinta - - - - CheckUpdate - - Auto Updater - Automatinis atnaujinimas - - - Error - Klaida - - - Network error: - Tinklo klaida: - - - Error_Github_limit_MSG - Automatinis atnaujinimas leidžia iki 60 atnaujinimų patikrinimų per valandą.\nJūs pasiekėte šią ribą. Bandykite dar kartą vėliau. - - - Failed to parse update information. - Nepavyko išanalizuoti atnaujinimo informacijos. - - - No pre-releases found. - Išankstinių leidimų nerasta. - - - Invalid release data. - Neteisingi leidimo duomenys. - - - No download URL found for the specified asset. - Nerasta atsisiuntimo URL nurodytam turtui. - - - Your version is already up to date! - Jūsų versija jau atnaujinta! - - - Update Available - Prieinama atnaujinimas - - - Update Channel - Atnaujinimo Kanalas - - - Current Version - Esama versija - - - Latest Version - Paskutinė versija - - - Do you want to update? - Ar norite atnaujinti? - - - Show Changelog - Rodyti pakeitimų sąrašą - - - Check for Updates at Startup - Tikrinti naujinimus paleidus - - - Update - Atnaujinti - - - No - Ne - - - Hide Changelog - Slėpti pakeitimų sąrašą - - - Changes - Pokyčiai - - - Network error occurred while trying to access the URL - Tinklo klaida bandant pasiekti URL - - - Download Complete - Atsisiuntimas baigtas - - - The update has been downloaded, press OK to install. - Atnaujinimas buvo atsisiųstas, paspauskite OK, kad įdiegtumėte. - - - Failed to save the update file at - Nepavyko išsaugoti atnaujinimo failo - - - Starting Update... - Pradedama atnaujinimas... - - - Failed to create the update script file - Nepavyko sukurti atnaujinimo scenarijaus failo - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Naudojamos suderinamumo duomenis, prašome palaukti - - - Cancel - Atšaukti - - - Loading... - Kraunama... - - - Error - Klaida - - - Unable to update compatibility data! Try again later. - Negalima atnaujinti suderinamumo duomenų! Bandykite vėliau. - - - Unable to open compatibility_data.json for writing. - Negalima atidaryti compatibility_data.json failo rašymui. - - - Unknown - Nežinoma - - - Nothing - Nėra - - - Boots - Batai - - - Menus - Meniu - - - Ingame - Žaidime - - - Playable - Žaidžiamas - - + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nuotrauka neprieinama + + + Serial: + Seriinis numeris: + + + Version: + Versija: + + + Size: + Dydis: + + + Select Cheat File: + Pasirinkite sukčiavimo failą: + + + Repository: + Saugykla: + + + Download Cheats + Atsisiųsti sukčiavimus + + + Delete File + Pašalinti failą + + + No files selected. + Failai nepasirinkti. + + + You can delete the cheats you don't want after downloading them. + Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. + + + Do you want to delete the selected file?\n%1 + Ar norite ištrinti pasirinktą failą?\n%1 + + + Select Patch File: + Pasirinkite pataisos failą: + + + Download Patches + Atsisiųsti pataisas + + + Save + Įrašyti + + + Cheats + Sukčiavimai + + + Patches + Pataisos + + + Error + Klaida + + + No patch selected. + Nieko nepataisyta. + + + Unable to open files.json for reading. + Neįmanoma atidaryti files.json skaitymui. + + + No patch file found for the current serial. + Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. + + + Unable to open the file for reading. + Neįmanoma atidaryti failo skaitymui. + + + Unable to open the file for writing. + Neįmanoma atidaryti failo rašymui. + + + Failed to parse XML: + Nepavyko išanalizuoti XML: + + + Success + Sėkmė + + + Options saved successfully. + Nustatymai sėkmingai išsaugoti. + + + Invalid Source + Netinkamas šaltinis + + + The selected source is invalid. + Pasirinktas šaltinis yra netinkamas. + + + File Exists + Failas egzistuoja + + + File already exists. Do you want to replace it? + Failas jau egzistuoja. Ar norite jį pakeisti? + + + Failed to save file: + Nepavyko išsaugoti failo: + + + Failed to download file: + Nepavyko atsisiųsti failo: + + + Cheats Not Found + Sukčiavimai nerasti + + + CheatsNotFound_MSG + Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. + + + Cheats Downloaded Successfully + Sukčiavimai sėkmingai atsisiųsti + + + CheatsDownloadedSuccessfully_MSG + Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. + + + Failed to save: + Nepavyko išsaugoti: + + + Failed to download: + Nepavyko atsisiųsti: + + + Download Complete + Atsisiuntimas baigtas + + + DownloadComplete_MSG + Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. + + + Failed to parse JSON data from HTML. + Nepavyko išanalizuoti JSON duomenų iš HTML. + + + Failed to retrieve HTML page. + Nepavyko gauti HTML puslapio. + + + The game is in version: %1 + Žaidimas yra versijoje: %1 + + + The downloaded patch only works on version: %1 + Parsisiųstas pataisas veikia tik versijoje: %1 + + + You may need to update your game. + Gali tekti atnaujinti savo žaidimą. + + + Incompatibility Notice + Suderinamumo pranešimas + + + Failed to open file: + Nepavyko atidaryti failo: + + + XML ERROR: + XML KLAIDA: + + + Failed to open files.json for writing + Nepavyko atidaryti files.json rašymui + + + Author: + Autorius: + + + Directory does not exist: + Katalogas neegzistuoja: + + + Failed to open files.json for reading. + Nepavyko atidaryti files.json skaitymui. + + + Name: + Pavadinimas: + + + Can't apply cheats before the game is started + Negalima taikyti sukčiavimų prieš pradedant žaidimą. + + + Close + Uždaryti + + + + CheckUpdate + + Auto Updater + Automatinis atnaujinimas + + + Error + Klaida + + + Network error: + Tinklo klaida: + + + Error_Github_limit_MSG + Automatinis atnaujinimas leidžia iki 60 atnaujinimų patikrinimų per valandą.\nJūs pasiekėte šią ribą. Bandykite dar kartą vėliau. + + + Failed to parse update information. + Nepavyko išanalizuoti atnaujinimo informacijos. + + + No pre-releases found. + Išankstinių leidimų nerasta. + + + Invalid release data. + Neteisingi leidimo duomenys. + + + No download URL found for the specified asset. + Nerasta atsisiuntimo URL nurodytam turtui. + + + Your version is already up to date! + Jūsų versija jau atnaujinta! + + + Update Available + Prieinama atnaujinimas + + + Update Channel + Atnaujinimo Kanalas + + + Current Version + Esama versija + + + Latest Version + Paskutinė versija + + + Do you want to update? + Ar norite atnaujinti? + + + Show Changelog + Rodyti pakeitimų sąrašą + + + Check for Updates at Startup + Tikrinti naujinimus paleidus + + + Update + Atnaujinti + + + No + Ne + + + Hide Changelog + Slėpti pakeitimų sąrašą + + + Changes + Pokyčiai + + + Network error occurred while trying to access the URL + Tinklo klaida bandant pasiekti URL + + + Download Complete + Atsisiuntimas baigtas + + + The update has been downloaded, press OK to install. + Atnaujinimas buvo atsisiųstas, paspauskite OK, kad įdiegtumėte. + + + Failed to save the update file at + Nepavyko išsaugoti atnaujinimo failo + + + Starting Update... + Pradedama atnaujinimas... + + + Failed to create the update script file + Nepavyko sukurti atnaujinimo scenarijaus failo + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Naudojamos suderinamumo duomenis, prašome palaukti + + + Cancel + Atšaukti + + + Loading... + Kraunama... + + + Error + Klaida + + + Unable to update compatibility data! Try again later. + Negalima atnaujinti suderinamumo duomenų! Bandykite vėliau. + + + Unable to open compatibility_data.json for writing. + Negalima atidaryti compatibility_data.json failo rašymui. + + + Unknown + Nežinoma + + + Nothing + Nėra + + + Boots + Batai + + + Menus + Meniu + + + Ingame + Žaidime + + + Playable + Žaidžiamas + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikona + + + Name + Vardas + + + Serial + Serijinis numeris + + + Compatibility + Compatibility + + + Region + Regionas + + + Firmware + Firmvare + + + Size + Dydis + + + Version + Versija + + + Path + Kelias + + + Play Time + Žaidimo laikas + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Spustelėkite, kad pamatytumėte detales GitHub + + + Last updated + Paskutinį kartą atnaujinta + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Atidaryti Katalogą... + + + Open Game Folder + Atidaryti Žaidimo Katalogą + + + Open Save Data Folder + Atidaryti Išsaugotų Duomenų Katalogą + + + Open Log Folder + Atidaryti Žurnalų Katalogą + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Cheats / Patches + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Patikrinti atnaujinimus + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Atsisiųsti Apgaules / Pleistrus + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Pagalba + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Žaidimų sąrašas + + + * Unsupported Vulkan Version + * Nepalaikoma Vulkan versija + + + Download Cheats For All Installed Games + Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams + + + Download Patches For All Games + Atsisiųsti pataisas visiems žaidimams + + + Download Complete + Atsisiuntimas baigtas + + + You have downloaded cheats for all the games you have installed. + Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. + + + Patches Downloaded Successfully! + Pataisos sėkmingai atsisiųstos! + + + All Patches available for all games have been downloaded. + Visos pataisos visiems žaidimams buvo atsisiųstos. + + + Games: + Žaidimai: + + + ELF files (*.bin *.elf *.oelf) + ELF failai (*.bin *.elf *.oelf) + + + Game Boot + Žaidimo paleidimas + + + Only one file can be selected! + Galite pasirinkti tik vieną failą! + + + PKG Extraction + PKG ištraukimas + + + Patch detected! + Rasta atnaujinimą! + + + PKG and Game versions match: + PKG ir žaidimo versijos sutampa: + + + Would you like to overwrite? + Ar norite perrašyti? + + + PKG Version %1 is older than installed version: + PKG versija %1 yra senesnė nei įdiegta versija: + + + Game is installed: + Žaidimas įdiegtas: + + + Would you like to install Patch: + Ar norite įdiegti atnaujinimą: + + + DLC Installation + DLC diegimas + + + Would you like to install DLC: %1? + Ar norite įdiegti DLC: %1? + + + DLC already installed: + DLC jau įdiegtas: + + + Game already installed + Žaidimas jau įdiegtas + + + PKG ERROR + PKG KLAIDA + + + Extracting PKG %1/%2 + Ekstrakcinis PKG %1/%2 + + + Extraction Finished + Ekstrakcija baigta + + + Game successfully installed at %1 + Žaidimas sėkmingai įdiegtas %1 + + + File doesn't appear to be a valid PKG file + Failas atrodo, kad nėra galiojantis PKG failas + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Vardas + + + Serial + Serijinis numeris + + + Installed + + + + Size + Dydis + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Regionas + + + Flags + + + + Path + Kelias + + + File + File + + + PKG ERROR + PKG KLAIDA + + + Unknown + Nežinoma + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Viso ekranas + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Numatytoji kortelė atidarius nustatymus + + + Show Game Size In List + Rodyti žaidimo dydį sąraše + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Įjungti Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Atidaryti žurnalo vietą + + + Input + Įvestis + + + Cursor + Žymeklis + + + Hide Cursor + Slėpti žymeklį + + + Hide Cursor Idle Timeout + Žymeklio paslėpimo neveikimo laikas + + + s + s + + + Controller + Valdiklis + + + Back Button Behavior + Atgal mygtuko elgsena + + + Graphics + Graphics + + + GUI + Interfeisa + + + User + Naudotojas + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Keliai + + + Game Folders + Žaidimų aplankai + + + Add... + Pridėti... + + + Remove + Pašalinti + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Atnaujinimas + + + Check for Updates at Startup + Tikrinti naujinimus paleidus + + + Always Show Changelog + Visada rodyti pakeitimų žurnalą + + + Update Channel + Atnaujinimo Kanalas + + + Check for Updates + Patikrinkite atnaujinimus + + + GUI Settings + GUI Nustatymai + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Groti antraštės muziką + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Garsumas + + + Save + Įrašyti + + + Apply + Taikyti + + + Restore Defaults + Atkurti numatytuosius nustatymus + + + Close + Uždaryti + + + Point your mouse at an option to display its description. + Žymeklį nukreipkite ant pasirinkimo, kad pamatytumėte jo aprašymą. + + + consoleLanguageGroupBox + Konsole kalba:\nNustato kalbą, kurią naudoja PS4 žaidimai.\nRekomenduojama nustatyti kalbą, kurią palaiko žaidimas, priklausomai nuo regiono. + + + emulatorLanguageGroupBox + Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. + + + fullscreenCheckBox + Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Rodyti paleidimo ekraną:\nPaleidimo metu rodo žaidimo paleidimo ekraną (ypatingą vaizdą). + + + discordRPCCheckbox + Įjungti Discord Rich Presence:\nRodo emuliatoriaus ikoną ir susijusią informaciją jūsų Discord profilyje. + + + userName + Vartotojo vardas:\nNustato PS4 paskyros vartotojo vardą, kuris gali būti rodomas kai kuriuose žaidimuose. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Žurnalo tipas:\nNustato, ar sinchronizuoti žurnalo lango išvestį našumui. Tai gali turėti neigiamą poveikį emuliacijai. + + + logFilter + Žurnalo filtras:\nFiltruojamas žurnalas, kad būtų spausdinama tik konkreti informacija.\nPavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius. + + + updaterGroupBox + Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. + + + GUIMusicGroupBox + Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Slėpti žymeklį:\nPasirinkite, kada žymeklis dings:\nNiekuomet: Visada matysite pelę.\nNeaktyvus: Nustatykite laiką, po kurio ji dings, kai bus neaktyvi.\nVisada: niekada nematysite pelės. + + + idleTimeoutGroupBox + Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi. + + + backButtonBehaviorGroupBox + Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Niekada + + + Idle + Neaktyvus + + + Always + Visada + + + Touchpad Left + Jutiklinis Paviršius Kairėje + + + Touchpad Right + Jutiklinis Paviršius Dešinėje + + + Touchpad Center + Jutiklinis Paviršius Centre + + + None + Nieko + + + graphicsAdapterGroupBox + Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos iš išskleidžiamojo sąrašo,\n arba pasirinkite "Auto Select", kad jis būtų nustatytas automatiškai. + + + resolutionLayout + Plotis/Aukštis:\nNustato emuliatoriaus lango dydį paleidimo metu, kurį galima keisti žaidimo metu.\nTai skiriasi nuo žaidimo rezoliucijos. + + + heightDivider + Vblank daliklis:\nKadrų dažnis, kuriuo emuliatorius atnaujinamas, dauginamas iš šio skaičiaus. Pakeitus tai gali turėti neigiamą poveikį, pvz., padidinti žaidimo greitį arba sukelti kritinių žaidimo funkcijų sugadinimą, kurios to nesitikėjo! + + + dumpShadersCheckBox + Įjungti šešėlių išmetimą:\nTechninio derinimo tikslais saugo žaidimo šešėlius į aplanką juos renderuojant. + + + nullGpuCheckBox + Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės. + + + gameFoldersBox + Žaidimų aplankai:\nAplankų sąrašas, kurį reikia patikrinti, ar yra įdiegtų žaidimų. + + + addFolderButton + Pridėti:\nPridėti aplanką į sąrašą. + + + removeFolderButton + Pašalinti:\nPašalinti aplanką iš sąrašo. + + + debugDump + Įjungti derinimo išmetimą:\nIšsaugo importo ir eksporto simbolius bei failo antraštės informaciją apie šiuo metu vykdomą PS4 programą į katalogą. + + + vkValidationCheckBox + Įjungti Vulkan patvirtinimo sluoksnius:\nĮjungia sistemą, kuri patvirtina Vulkan renderio būseną ir registruoja informaciją apie jo vidinę būseną. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. + + + vkSyncValidationCheckBox + Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. + + + rdocCheckBox + Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + diff --git a/src/qt_gui/translations/nb.ts b/src/qt_gui/translations/nb.ts deleted file mode 100644 index c6e20466d..000000000 --- a/src/qt_gui/translations/nb.ts +++ /dev/null @@ -1,1515 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - Om shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Denne programvaren skal ikke brukes til å spille spill du ikke har fått lovlig. - - - - ElfViewer - - Open Folder - Åpne mappe - - - - GameInfoClass - - Loading game list, please wait :3 - Laster spill-liste, vennligst vent :3 - - - Cancel - Avbryt - - - Loading... - Laster... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Velg mappe - - - Select which directory you want to install to. - Velg hvilken mappe du vil installere til. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Velg mappe - - - Directory to install games - Mappe for å installere spill - - - Browse - Bla gjennom - - - Error - Feil - - - The value for location to install games is not valid. - Stien for å installere spillet er ikke gyldig. - - - - GuiContextMenus - - Create Shortcut - Lag snarvei - - - Cheats / Patches - Juks / Programrettelse - - - SFO Viewer - SFO viser - - - Trophy Viewer - Trofé viser - - - Open Folder... - Åpne mappe... - - - Open Game Folder - Åpne spillmappen - - - Open Save Data Folder - Åpne lagrede datamappen - - - Open Log Folder - Åpne loggmappen - - - Copy info... - Kopier info... - - - Copy Name - Kopier navn - - - Copy Serial - Kopier serienummer - - - Copy Version - Kopier versjon - - - Copy Size - Kopier størrelse - - - Copy All - Kopier alt - - - Delete... - Slett... - - - Delete Game - Slett spill - - - Delete Update - Slett oppdatering - - - Delete DLC - Slett DLC - - - Compatibility... - Kompatibilitet... - - - Update database - Oppdater database - - - View report - Vis rapport - - - Submit a report - Send inn en rapport - - - Shortcut creation - Snarvei opprettelse - - - Shortcut created successfully! - Snarvei opprettet! - - - Error - Feil - - - Error creating shortcut! - Feil ved opprettelse av snarvei! - - - Install PKG - Installer PKG - - - Game - Spill - - - requiresEnableSeparateUpdateFolder_MSG - Denne funksjonen krever 'Aktiver seperat oppdateringsmappe' konfigurasjonsalternativet. Hvis du vil bruke denne funksjonen, må du aktiver den. - - - This game has no update to delete! - Dette spillet har ingen oppdatering å slette! - - - Update - Oppdater - - - This game has no DLC to delete! - Dette spillet har ingen DLC å slette! - - - DLC - DLC - - - Delete %1 - Slett %1 - - - Are you sure you want to delete %1's %2 directory? - Er du sikker på at du vil slette %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Åpne/Legg til Elf-mappe - - - Install Packages (PKG) - Installer pakker (PKG) - - - Boot Game - Start spill - - - Check for Updates - Se etter oppdateringer - - - About shadPS4 - Om shadPS4 - - - Configure... - Konfigurer... - - - Install application from a .pkg file - Installer fra en .pkg fil - - - Recent Games - Nylige spill - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Avslutt - - - Exit shadPS4 - Avslutt shadPS4 - - - Exit the application. - Avslutt programmet. - - - Show Game List - Vis spill-listen - - - Game List Refresh - Oppdater spill-listen - - - Tiny - Bitteliten - - - Small - Liten - - - Medium - Medium - - - Large - Stor - - - List View - Liste-visning - - - Grid View - Rute-visning - - - Elf Viewer - Elf-visning - - - Game Install Directory - Spillinstallasjons-mappe - - - Download Cheats/Patches - Last ned juks/programrettelse - - - Dump Game List - Dump spill-liste - - - PKG Viewer - PKG viser - - - Search... - Søk... - - - File - Fil - - - View - Oversikt - - - Game List Icons - Spill-liste ikoner - - - Game List Mode - Spill-liste modus - - - Settings - Innstillinger - - - Utils - Verktøy - - - Themes - Tema - - - Help - Hjelp - - - Dark - Mørk - - - Light - Lys - - - Green - Grønn - - - Blue - Blå - - - Violet - Lilla - - - toolBar - Verktøylinje - - - Game List - Spill-liste - - - * Unsupported Vulkan Version - * Ustøttet Vulkan-versjon - - - Download Cheats For All Installed Games - Last ned juks for alle installerte spill - - - Download Patches For All Games - Last ned programrettelser for alle spill - - - Download Complete - Nedlasting fullført - - - You have downloaded cheats for all the games you have installed. - Du har lastet ned juks for alle spillene du har installert. - - - Patches Downloaded Successfully! - Programrettelser ble lastet ned! - - - All Patches available for all games have been downloaded. - Programrettelser tilgjengelige for alle spill har blitt lastet ned. - - - Games: - Spill: - - - PKG File (*.PKG) - PKG-fil (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - Game Boot - Spilloppstart - - - Only one file can be selected! - Kun én fil kan velges! - - - PKG Extraction - PKG-utpakking - - - Patch detected! - Programrettelse oppdaget! - - - PKG and Game versions match: - PKG og spillversjoner stemmer overens: - - - Would you like to overwrite? - Ønsker du å overskrive? - - - PKG Version %1 is older than installed version: - PKG-versjon %1 er eldre enn installert versjon: - - - Game is installed: - Spillet er installert: - - - Would you like to install Patch: - Ønsker du å installere programrettelsen: - - - DLC Installation - DLC installasjon - - - Would you like to install DLC: %1? - Ønsker du å installere DLC: %1? - - - DLC already installed: - DLC allerede installert: - - - Game already installed - Spillet er allerede installert - - - PKG is a patch, please install the game first! - PKG er en programrettelse, vennligst installer spillet først! - - - PKG ERROR - PKG FEIL - - - Extracting PKG %1/%2 - Pakker ut PKG %1/%2 - - - Extraction Finished - Utpakking fullført - - - Game successfully installed at %1 - Spillet ble installert i %1 - - - File doesn't appear to be a valid PKG file - Filen ser ikke ut til å være en gyldig PKG-fil - - - - PKGViewer - - Open Folder - Åpne mappe - - - - TrophyViewer - - Trophy Viewer - Trofé viser - - - - SettingsDialog - - Settings - Innstillinger - - - General - Generell - - - System - System - - - Console Language - Konsollspråk - - - Emulator Language - Emulatorspråk - - - Emulator - Emulator - - - Enable Fullscreen - Aktiver fullskjerm - - - Fullscreen Mode - Fullskjermmodus - - - Enable Separate Update Folder - Aktiver seperat oppdateringsmappe - - - Default tab when opening settings - Standardfanen når innstillingene åpnes - - - Show Game Size In List - Vis spillstørrelse i listen - - - Show Splash - Vis velkomstbilde - - - Is PS4 Pro - Er PS4 Pro - - - Enable Discord Rich Presence - Aktiver Discord Rich Presence - - - Username - Brukernavn - - - Trophy Key - Trofénøkkel - - - Trophy - Trofé - - - Logger - Logger - - - Log Type - Logg type - - - Log Filter - Logg filter - - - Open Log Location - Åpne loggplassering - - - Input - Inndata - - - Cursor - Musepeker - - - Hide Cursor - Skjul musepeker - - - Hide Cursor Idle Timeout - Skjul musepeker ved inaktivitet - - - s - s - - - Controller - Kontroller - - - Back Button Behavior - Tilbakeknapp atferd - - - Graphics - Grafikk - - - GUI - Grensesnitt - - - User - Bruker - - - Graphics Device - Grafikkenhet - - - Width - Bredde - - - Height - Høyde - - - Vblank Divider - Vblank skillelinje - - - Advanced - Avansert - - - Enable Shaders Dumping - Aktiver skyggeleggerdumping - - - Enable NULL GPU - Aktiver NULL GPU - - - Paths - Mapper - - - Game Folders - Spillmapper - - - Add... - Legg til... - - - Remove - Fjern - - - Save Data Path - Lagrede datamappe - - - Browse - Endre mappe - - - saveDataBox - Lagrede datamappe:\nListe over data shadPS4 lagrer. - - - browseButton - Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. - - - Debug - Feilretting - - - Enable Debug Dumping - Aktiver feilrettingsdumping - - - Enable Vulkan Validation Layers - Aktiver Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Aktiver Vulkan synkroniseringslag - - - Enable RenderDoc Debugging - Aktiver RenderDoc feilretting - - - Enable Crash Diagnostics - Aktiver krasjdiagnostikk - - - Collect Shaders - Lagre skyggeleggere - - - Copy GPU Buffers - Kopier GPU-buffere - - - Host Debug Markers - Vertsfeilsøkingsmarkører - - - Guest Debug Markers - Gjestefeilsøkingsmarkører - - - Update - Oppdatering - - - Check for Updates at Startup - Se etter oppdateringer ved oppstart - - - Update Channel - Oppdateringskanal - - - Check for Updates - Se etter oppdateringer - - - GUI Settings - Grensesnitt-innstillinger - - - Title Music - Tittelmusikk - - - Disable Trophy Pop-ups - Deaktiver trofé hurtigmeny - - - Background Image - Bakgrunnsbilde - - - Show Background Image - Vis bakgrunnsbilde - - - Opacity - Synlighet - - - Play title music - Spill tittelmusikk - - - Update Compatibility Database On Startup - Oppdater database ved oppstart - - - Game Compatibility - Spill kompatibilitet - - - Display Compatibility Data - Vis kompatibilitets-data - - - Update Compatibility Database - Oppdater kompatibilitets-database - - - Volume - Volum - - - Audio Backend - Lydsystem - - - Save - Lagre - - - Apply - Bruk - - - Restore Defaults - Gjenopprett standardinnstillinger - - - Close - Lukk - - - Point your mouse at an option to display its description. - Pek musen over et alternativ for å vise beskrivelsen. - - - consoleLanguageGroupBox - Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. - - - emulatorLanguageGroupBox - Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. - - - fullscreenCheckBox - Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. - - - separateUpdatesCheckBox - Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. - - - showSplashCheckBox - Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. - - - ps4proCheckBox - Er PS4 Pro:\nFår emulatoren til å fungere som en PS4 PRO, noe som kan aktivere spesielle funksjoner i spill som støtter dette. - - - discordRPCCheckbox - Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. - - - userName - Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. - - - TrophyKey - Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. - - - logTypeGroupBox - Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. - - - logFilter - Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. - - - updaterGroupBox - Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. - - - GUIBackgroundImageGroupBox - Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. - - - GUIMusicGroupBox - Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. - - - disableTrophycheckBox - Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). - - - hideCursorGroupBox - Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. - - - idleTimeoutGroupBox - Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. - - - backButtonBehaviorGroupBox - Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. - - - enableCompatibilityCheckBox - Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. - - - checkCompatibilityOnStartupCheckBox - Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. - - - updateCompatibilityButton - Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. - - - Never - Aldri - - - Idle - Inaktiv - - - Always - Alltid - - - Touchpad Left - Berøringsplate Venstre - - - Touchpad Right - Berøringsplate Høyre - - - Touchpad Center - Berøringsplate Midt - - - None - Ingen - - - graphicsAdapterGroupBox - Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. - - - resolutionLayout - Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. - - - heightDivider - Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! - - - dumpShadersCheckBox - Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. - - - nullGpuCheckBox - Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. - - - gameFoldersBox - Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. - - - addFolderButton - Legg til:\nLegg til en mappe til listen. - - - removeFolderButton - Fjern:\nFjern en mappe fra listen. - - - debugDump - Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. - - - vkValidationCheckBox - Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - - - vkSyncValidationCheckBox - Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - - - rdocCheckBox - Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. - - - collectShaderCheckBox - Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). - - - crashDiagnosticsCheckBox - Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. - - - copyGPUBuffersCheckBox - Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. - - - hostMarkersCheckBox - Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - - - guestMarkersCheckBox - Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Juks / Programrettelser for - - - defaultTextEdit_MSG - Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Ingen bilde tilgjengelig - - - Serial: - Serienummer: - - - Version: - Versjon: - - - Size: - Størrelse: - - - Select Cheat File: - Velg juksefil: - - - Repository: - Pakkebrønn: - - - Download Cheats - Last ned juks - - - Delete File - Slett fil - - - Close - Lukk - - - No files selected. - Ingen filer valgt. - - - You can delete the cheats you don't want after downloading them. - Du kan slette juks du ikke ønsker etter å ha lastet dem ned. - - - Do you want to delete the selected file?\n%1 - Ønsker du å slette den valgte filen?\n%1 - - - Select Patch File: - Velg programrettelse-filen: - - - Download Patches - Last ned programrettelser - - - Save - Lagre - - - Cheats - Juks - - - Patches - Programrettelse - - - Error - Feil - - - No patch selected. - Ingen programrettelse valgt. - - - Unable to open files.json for reading. - Kan ikke åpne files.json for lesing. - - - No patch file found for the current serial. - Ingen programrettelse-fil funnet for det aktuelle serienummeret. - - - Unable to open the file for reading. - Kan ikke åpne filen for lesing. - - - Unable to open the file for writing. - Kan ikke åpne filen for skriving. - - - Failed to parse XML: - Feil ved tolkning av XML: - - - Success - Vellykket - - - Options saved successfully. - Alternativer ble lagret. - - - Invalid Source - Ugyldig kilde - - - The selected source is invalid. - Den valgte kilden er ugyldig. - - - File Exists - Filen eksisterer - - - File already exists. Do you want to replace it? - Filen eksisterer allerede. Ønsker du å erstatte den? - - - Failed to save file: - Kunne ikke lagre filen: - - - Failed to download file: - Kunne ikke laste ned filen: - - - Cheats Not Found - Fant ikke juks - - - CheatsNotFound_MSG - Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. - - - Cheats Downloaded Successfully - Juks ble lastet ned - - - CheatsDownloadedSuccessfully_MSG - Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. - - - Failed to save: - Kunne ikke lagre: - - - Failed to download: - Kunne ikke laste ned: - - - Download Complete - Nedlasting fullført - - - DownloadComplete_MSG - Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. - - - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. - - - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. - - - The game is in version: %1 - Spillet er i versjon: %1 - - - The downloaded patch only works on version: %1 - Den nedlastede programrettelsen fungerer bare på versjon: %1 - - - You may need to update your game. - Du må kanskje oppdatere spillet ditt. - - - Incompatibility Notice - Inkompatibilitets-varsel - - - Failed to open file: - Kunne ikke åpne filen: - - - XML ERROR: - XML FEIL: - - - Failed to open files.json for writing - Kunne ikke åpne files.json for skriving - - - Author: - Forfatter: - - - Directory does not exist: - Mappen eksisterer ikke: - - - Failed to open files.json for reading. - Kunne ikke åpne files.json for lesing. - - - Name: - Navn: - - - Can't apply cheats before the game is started - Kan ikke bruke juks før spillet er startet. - - - - GameListFrame - - Icon - Ikon - - - Name - Navn - - - Serial - Serienummer - - - Compatibility - Kompatibilitet - - - Region - Region - - - Firmware - Fastvare - - - Size - Størrelse - - - Version - Versjon - - - Path - Adresse - - - Play Time - Spilletid - - - Never Played - Aldri spilt - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - kompatibilitet er utestet - - - Game does not initialize properly / crashes the emulator - Spillet initialiseres ikke riktig / krasjer emulatoren - - - Game boots, but only displays a blank screen - Spillet starter, men viser bare en tom skjerm - - - Game displays an image but does not go past the menu - Spillet viser et bilde, men går ikke forbi menyen - - - Game has game-breaking glitches or unplayable performance - Spillet har spillbrytende feil eller uspillbar ytelse - - - Game can be completed with playable performance and no major glitches - Spillet kan fullføres med spillbar ytelse og uten store feil - - - Click to see details on github - Klikk for å se detaljer på GitHub - - - Last updated - Sist oppdatert - - - - CheckUpdate - - Auto Updater - Automatisk oppdatering - - - Error - Feil - - - Network error: - Nettverksfeil: - - - Error_Github_limit_MSG - Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. - - - Failed to parse update information. - Kunne ikke analysere oppdaterings-informasjonen. - - - No pre-releases found. - Fant ingen forhåndsutgivelser. - - - Invalid release data. - Ugyldige utgivelsesdata. - - - No download URL found for the specified asset. - Ingen nedlastings-URL funnet for den spesifiserte ressursen. - - - Your version is already up to date! - Din versjon er allerede oppdatert! - - - Update Available - Oppdatering tilgjengelig - - - Update Channel - Oppdateringskanal - - - Current Version - Gjeldende versjon - - - Latest Version - Nyeste versjon - - - Do you want to update? - Vil du oppdatere? - - - Show Changelog - Vis endringslogg - - - Check for Updates at Startup - Se etter oppdateringer ved oppstart - - - Update - Oppdater - - - No - Nei - - - Hide Changelog - Skjul endringslogg - - - Changes - Endringer - - - Network error occurred while trying to access the URL - Nettverksfeil oppstod mens vi prøvde å få tilgang til URL - - - Download Complete - Nedlasting fullført - - - The update has been downloaded, press OK to install. - Oppdateringen har blitt lastet ned, trykk OK for å installere. - - - Failed to save the update file at - Kunne ikke lagre oppdateringsfilen på - - - Starting Update... - Starter oppdatering... - - - Failed to create the update script file - Kunne ikke opprette oppdateringsskriptfilen - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Henter kompatibilitetsdata, vennligst vent - - - Cancel - Avbryt - - - Loading... - Laster... - - - Error - Feil - - - Unable to update compatibility data! Try again later. - Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. - - - Unable to open compatibility_data.json for writing. - Kan ikke åpne compatibility_data.json for skriving. - - - Unknown - Ukjent - - - Nothing - Ingenting - - - Boots - Starter opp - - - Menus - Menyene - - - Ingame - I spill - - - Playable - Spillbar - - - diff --git a/src/qt_gui/translations/nl.ts b/src/qt_gui/translations/nl.ts deleted file mode 100644 index 2b939046d..000000000 --- a/src/qt_gui/translations/nl.ts +++ /dev/null @@ -1,1475 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - Cheats / Patches - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Map openen... - - - Open Game Folder - Open Spelmap - - - Open Save Data Folder - Open Map voor Opslagdata - - - Open Log Folder - Open Logmap - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Controleren op updates - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Download Cheats/Patches - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Help - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Lijst met spellen - - - * Unsupported Vulkan Version - * Niet ondersteunde Vulkan-versie - - - Download Cheats For All Installed Games - Download cheats voor alle geïnstalleerde spellen - - - Download Patches For All Games - Download patches voor alle spellen - - - Download Complete - Download voltooid - - - You have downloaded cheats for all the games you have installed. - Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. - - - Patches Downloaded Successfully! - Patches succesvol gedownload! - - - All Patches available for all games have been downloaded. - Alle patches voor alle spellen zijn gedownload. - - - Games: - Spellen: - - - PKG File (*.PKG) - PKG-bestand (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF-bestanden (*.bin *.elf *.oelf) - - - Game Boot - Spelopstart - - - Only one file can be selected! - Je kunt slechts één bestand selecteren! - - - PKG Extraction - PKG-extractie - - - Patch detected! - Patch gedetecteerd! - - - PKG and Game versions match: - PKG- en gameversies komen overeen: - - - Would you like to overwrite? - Wilt u overschrijven? - - - PKG Version %1 is older than installed version: - PKG-versie %1 is ouder dan de geïnstalleerde versie: - - - Game is installed: - Game is geïnstalleerd: - - - Would you like to install Patch: - Wilt u de patch installeren: - - - DLC Installation - DLC-installatie - - - Would you like to install DLC: %1? - Wilt u DLC installeren: %1? - - - DLC already installed: - DLC al geïnstalleerd: - - - Game already installed - Game al geïnstalleerd - - - PKG is a patch, please install the game first! - PKG is een patch, installeer eerst het spel! - - - PKG ERROR - PKG FOUT - - - Extracting PKG %1/%2 - PKG %1/%2 aan het extraheren - - - Extraction Finished - Extractie voltooid - - - Game successfully installed at %1 - Spel succesvol geïnstalleerd op %1 - - - File doesn't appear to be a valid PKG file - Het bestand lijkt geen geldig PKG-bestand te zijn - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Volledig schermmodus - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Standaardtabblad bij het openen van instellingen - - - Show Game Size In List - Toon grootte van het spel in de lijst - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Discord Rich Presence inschakelen - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Loglocatie openen - - - Input - Invoer - - - Cursor - Cursor - - - Hide Cursor - Cursor verbergen - - - Hide Cursor Idle Timeout - Inactiviteit timeout voor het verbergen van de cursor - - - s - s - - - Controller - Controller - - - Back Button Behavior - Achterknop gedrag - - - Graphics - Graphics - - - GUI - Interface - - - User - Gebruiker - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Pad - - - Game Folders - Spelmappen - - - Add... - Toevoegen... - - - Remove - Verwijderen - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Bijwerken - - - Check for Updates at Startup - Bij opstart op updates controleren - - - Always Show Changelog - Altijd changelog tonen - - - Update Channel - Updatekanaal - - - Check for Updates - Controleren op updates - - - GUI Settings - GUI-Instellingen - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Titelmuziek afspelen - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Volume - - - Audio Backend - Audio Backend - - - Save - Opslaan - - - Apply - Toepassen - - - Restore Defaults - Standaardinstellingen herstellen - - - Close - Sluiten - - - Point your mouse at an option to display its description. - Wijzig de muisaanwijzer naar een optie om de beschrijving weer te geven. - - - consoleLanguageGroupBox - Console Taal:\nStelt de taal in die het PS4-spel gebruikt.\nHet wordt aanbevolen om dit in te stellen op een taal die het spel ondersteunt, wat kan variëren per regio. - - - emulatorLanguageGroupBox - Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. - - - fullscreenCheckBox - Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Opstartscherm weergeven:\nToont het opstartscherm van het spel (een speciale afbeelding) tijdens het starten van het spel. - - - ps4proCheckBox - Is PS4 Pro:\nLaat de emulator zich gedragen als een PS4 PRO, wat speciale functies kan inschakelen in games die dit ondersteunen. - - - discordRPCCheckbox - Discord Rich Presence inschakelen:\nToont het emulatoricoon en relevante informatie op je Discord-profiel. - - - userName - Gebruikersnaam:\nStelt de gebruikersnaam van het PS4-account in, die door sommige games kan worden weergegeven. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Logtype:\nStelt in of de uitvoer van het logvenster moet worden gesynchroniseerd voor prestaties. Kan nadelige effecten hebben op emulatie. - - - logFilter - Logfilter:\nFiltert het logboek om alleen specifieke informatie af te drukken.\nVoorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna. - - - updaterGroupBox - Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. - - - GUIMusicGroupBox - Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Verberg cursor:\nKies wanneer de cursor verdwijnt:\nNooit: Je ziet altijd de muis.\nInactief: Stel een tijd in waarna deze verdwijnt na inactiviteit.\nAltijd: je ziet de muis nooit. - - - idleTimeoutGroupBox - Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit. - - - backButtonBehaviorGroupBox - Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Nooit - - - Idle - Inactief - - - Always - Altijd - - - Touchpad Left - Touchpad Links - - - Touchpad Right - Touchpad Rechts - - - Touchpad Center - Touchpad Midden - - - None - Geen - - - graphicsAdapterGroupBox - Grafische adapter:\nIn systemen met meerdere GPU's, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies "Auto Select" om dit automatisch in te stellen. - - - resolutionLayout - Breedte/Hoogte:\nStelt de grootte van het emulatorvenster bij het opstarten in, wat tijdens het spelen kan worden gewijzigd.\nDit is anders dan de resolutie in de game. - - - heightDivider - Vblank deler:\nDe frame-rate waartegen de emulator wordt vernieuwd, vermenigvuldigd met dit getal. Dit veranderen kan nadelige effecten hebben, zoals het versnellen van het spel of het verpesten van kritieke gamefunctionaliteiten die niet verwachtten dat dit zou veranderen! - - - dumpShadersCheckBox - Shaderdump inschakelen:\nVoor technische foutopsporing slaat het de shaders van de game op in een map terwijl ze worden gerenderd. - - - nullGpuCheckBox - Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is. - - - gameFoldersBox - Spelmap:\nDe lijst met mappen om te controleren op geïnstalleerde spellen. - - - addFolderButton - Toevoegen:\nVoeg een map toe aan de lijst. - - - removeFolderButton - Verwijderen:\nVerwijder een map uit de lijst. - - - debugDump - Foutopsporing dump inschakelen:\nSlaat de import- en export-symbolen en de bestandsheaderinformatie van de momenteel draaiende PS4-toepassing op in een map. - - - vkValidationCheckBox - Vulkan validatielaag inschakelen:\nSchakelt een systeem in dat de status van de Vulkan-renderer valideert en informatie over de interne status ervan logt. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - - - vkSyncValidationCheckBox - Vulkan synchronisatievalidatie inschakelen:\nSchakelt een systeem in dat de timing van Vulkan-renderingtaken valideert. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - - - rdocCheckBox - RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Geen afbeelding beschikbaar - - - Serial: - Serie: - - - Version: - Versie: - - - Size: - Grootte: - - - Select Cheat File: - Selecteer cheatbestand: - - - Repository: - Repository: - - - Download Cheats - Download cheats - - - Delete File - Bestand verwijderen - - - No files selected. - Geen bestanden geselecteerd. - - - You can delete the cheats you don't want after downloading them. - Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. - - - Do you want to delete the selected file?\n%1 - Wil je het geselecteerde bestand verwijderen?\n%1 - - - Select Patch File: - Selecteer patchbestand: - - - Download Patches - Download patches - - - Save - Opslaan - - - Cheats - Cheats - - - Patches - Patches - - - Error - Fout - - - No patch selected. - Geen patch geselecteerd. - - - Unable to open files.json for reading. - Kan files.json niet openen voor lezen. - - - No patch file found for the current serial. - Geen patchbestand gevonden voor het huidige serienummer. - - - Unable to open the file for reading. - Kan het bestand niet openen voor lezen. - - - Unable to open the file for writing. - Kan het bestand niet openen voor schrijven. - - - Failed to parse XML: - XML parsing mislukt: - - - Success - Succes - - - Options saved successfully. - Opties succesvol opgeslagen. - - - Invalid Source - Ongeldige bron - - - The selected source is invalid. - De geselecteerde bron is ongeldig. - - - File Exists - Bestand bestaat - - - File already exists. Do you want to replace it? - Bestand bestaat al. Wil je het vervangen? - - - Failed to save file: - Kan bestand niet opslaan: - - - Failed to download file: - Kan bestand niet downloaden: - - - Cheats Not Found - Cheats niet gevonden - - - CheatsNotFound_MSG - Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. - - - Cheats Downloaded Successfully - Cheats succesvol gedownload - - - CheatsDownloadedSuccessfully_MSG - Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. - - - Failed to save: - Opslaan mislukt: - - - Failed to download: - Downloaden mislukt: - - - Download Complete - Download voltooid - - - DownloadComplete_MSG - Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. - - - Failed to parse JSON data from HTML. - Kan JSON-gegevens uit HTML niet parseren. - - - Failed to retrieve HTML page. - Kan HTML-pagina niet ophalen. - - - The game is in version: %1 - Het spel is in versie: %1 - - - The downloaded patch only works on version: %1 - De gedownloade patch werkt alleen op versie: %1 - - - You may need to update your game. - Misschien moet je je spel bijwerken. - - - Incompatibility Notice - Incompatibiliteitsmelding - - - Failed to open file: - Kan bestand niet openen: - - - XML ERROR: - XML FOUT: - - - Failed to open files.json for writing - Kan files.json niet openen voor schrijven - - - Author: - Auteur: - - - Directory does not exist: - Map bestaat niet: - - - Failed to open files.json for reading. - Kan files.json niet openen voor lezen. - - - Name: - Naam: - - - Can't apply cheats before the game is started - Je kunt geen cheats toepassen voordat het spel is gestart. - - - - GameListFrame - - Icon - Pictogram - - - Name - Naam - - - Serial - Serienummer - - - Compatibility - Compatibility - - - Region - Regio - - - Firmware - Firmware - - - Size - Grootte - - - Version - Versie - - - Path - Pad - - - Play Time - Speeltijd - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Klik om details op GitHub te bekijken - - - Last updated - Laatst bijgewerkt - - - - CheckUpdate - - Auto Updater - Automatische updater - - - Error - Fout - - - Network error: - Netwerkfout: - - - Error_Github_limit_MSG - De automatische updater staat tot 60 updatecontroles per uur toe.\nJe hebt deze limiet bereikt. Probeer het later opnieuw. - - - Failed to parse update information. - Kon update-informatie niet parseren. - - - No pre-releases found. - Geen pre-releases gevonden. - - - Invalid release data. - Ongeldige releasegegevens. - - - No download URL found for the specified asset. - Geen download-URL gevonden voor het opgegeven bestand. - - - Your version is already up to date! - Uw versie is al up-to-date! - - - Update Available - Update beschikbaar - - - Update Channel - Updatekanaal - - - Current Version - Huidige versie - - - Latest Version - Laatste versie - - - Do you want to update? - Wilt u updaten? - - - Show Changelog - Toon changelog - - - Check for Updates at Startup - Bij opstart op updates controleren - - - Update - Bijwerken - - - No - Nee - - - Hide Changelog - Verberg changelog - - - Changes - Wijzigingen - - - Network error occurred while trying to access the URL - Netwerkfout opgetreden tijdens toegang tot de URL - - - Download Complete - Download compleet - - - The update has been downloaded, press OK to install. - De update is gedownload, druk op OK om te installeren. - - - Failed to save the update file at - Kon het updatebestand niet opslaan op - - - Starting Update... - Starten van update... - - - Failed to create the update script file - Kon het update-scriptbestand niet maken - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Compatibiliteitsgegevens ophalen, even geduld - - - Cancel - Annuleren - - - Loading... - Laden... - - - Error - Fout - - - Unable to update compatibility data! Try again later. - Kan compatibiliteitsgegevens niet bijwerken! Probeer het later opnieuw. - - - Unable to open compatibility_data.json for writing. - Kan compatibility_data.json niet openen voor schrijven. - - - Unknown - Onbekend - - - Nothing - Niets - - - Boots - Laarsjes - - - Menus - Menu's - - - Ingame - In het spel - - - Playable - Speelbaar - - - diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts new file mode 100644 index 000000000..ce00ca4f8 --- /dev/null +++ b/src/qt_gui/translations/nl_NL.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Geen afbeelding beschikbaar + + + Serial: + Serie: + + + Version: + Versie: + + + Size: + Grootte: + + + Select Cheat File: + Selecteer cheatbestand: + + + Repository: + Repository: + + + Download Cheats + Download cheats + + + Delete File + Bestand verwijderen + + + No files selected. + Geen bestanden geselecteerd. + + + You can delete the cheats you don't want after downloading them. + Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. + + + Do you want to delete the selected file?\n%1 + Wil je het geselecteerde bestand verwijderen?\n%1 + + + Select Patch File: + Selecteer patchbestand: + + + Download Patches + Download patches + + + Save + Opslaan + + + Cheats + Cheats + + + Patches + Patches + + + Error + Fout + + + No patch selected. + Geen patch geselecteerd. + + + Unable to open files.json for reading. + Kan files.json niet openen voor lezen. + + + No patch file found for the current serial. + Geen patchbestand gevonden voor het huidige serienummer. + + + Unable to open the file for reading. + Kan het bestand niet openen voor lezen. + + + Unable to open the file for writing. + Kan het bestand niet openen voor schrijven. + + + Failed to parse XML: + XML parsing mislukt: + + + Success + Succes + + + Options saved successfully. + Opties succesvol opgeslagen. + + + Invalid Source + Ongeldige bron + + + The selected source is invalid. + De geselecteerde bron is ongeldig. + + + File Exists + Bestand bestaat + + + File already exists. Do you want to replace it? + Bestand bestaat al. Wil je het vervangen? + + + Failed to save file: + Kan bestand niet opslaan: + + + Failed to download file: + Kan bestand niet downloaden: + + + Cheats Not Found + Cheats niet gevonden + + + CheatsNotFound_MSG + Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. + + + Cheats Downloaded Successfully + Cheats succesvol gedownload + + + CheatsDownloadedSuccessfully_MSG + Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. + + + Failed to save: + Opslaan mislukt: + + + Failed to download: + Downloaden mislukt: + + + Download Complete + Download voltooid + + + DownloadComplete_MSG + Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. + + + Failed to parse JSON data from HTML. + Kan JSON-gegevens uit HTML niet parseren. + + + Failed to retrieve HTML page. + Kan HTML-pagina niet ophalen. + + + The game is in version: %1 + Het spel is in versie: %1 + + + The downloaded patch only works on version: %1 + De gedownloade patch werkt alleen op versie: %1 + + + You may need to update your game. + Misschien moet je je spel bijwerken. + + + Incompatibility Notice + Incompatibiliteitsmelding + + + Failed to open file: + Kan bestand niet openen: + + + XML ERROR: + XML FOUT: + + + Failed to open files.json for writing + Kan files.json niet openen voor schrijven + + + Author: + Auteur: + + + Directory does not exist: + Map bestaat niet: + + + Failed to open files.json for reading. + Kan files.json niet openen voor lezen. + + + Name: + Naam: + + + Can't apply cheats before the game is started + Je kunt geen cheats toepassen voordat het spel is gestart. + + + Close + Sluiten + + + + CheckUpdate + + Auto Updater + Automatische updater + + + Error + Fout + + + Network error: + Netwerkfout: + + + Error_Github_limit_MSG + De automatische updater staat tot 60 updatecontroles per uur toe.\nJe hebt deze limiet bereikt. Probeer het later opnieuw. + + + Failed to parse update information. + Kon update-informatie niet parseren. + + + No pre-releases found. + Geen pre-releases gevonden. + + + Invalid release data. + Ongeldige releasegegevens. + + + No download URL found for the specified asset. + Geen download-URL gevonden voor het opgegeven bestand. + + + Your version is already up to date! + Uw versie is al up-to-date! + + + Update Available + Update beschikbaar + + + Update Channel + Updatekanaal + + + Current Version + Huidige versie + + + Latest Version + Laatste versie + + + Do you want to update? + Wilt u updaten? + + + Show Changelog + Toon changelog + + + Check for Updates at Startup + Bij opstart op updates controleren + + + Update + Bijwerken + + + No + Nee + + + Hide Changelog + Verberg changelog + + + Changes + Wijzigingen + + + Network error occurred while trying to access the URL + Netwerkfout opgetreden tijdens toegang tot de URL + + + Download Complete + Download compleet + + + The update has been downloaded, press OK to install. + De update is gedownload, druk op OK om te installeren. + + + Failed to save the update file at + Kon het updatebestand niet opslaan op + + + Starting Update... + Starten van update... + + + Failed to create the update script file + Kon het update-scriptbestand niet maken + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Compatibiliteitsgegevens ophalen, even geduld + + + Cancel + Annuleren + + + Loading... + Laden... + + + Error + Fout + + + Unable to update compatibility data! Try again later. + Kan compatibiliteitsgegevens niet bijwerken! Probeer het later opnieuw. + + + Unable to open compatibility_data.json for writing. + Kan compatibility_data.json niet openen voor schrijven. + + + Unknown + Onbekend + + + Nothing + Niets + + + Boots + Laarsjes + + + Menus + Menu's + + + Ingame + In het spel + + + Playable + Speelbaar + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Pictogram + + + Name + Naam + + + Serial + Serienummer + + + Compatibility + Compatibility + + + Region + Regio + + + Firmware + Firmware + + + Size + Grootte + + + Version + Versie + + + Path + Pad + + + Play Time + Speeltijd + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Klik om details op GitHub te bekijken + + + Last updated + Laatst bijgewerkt + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Cheats / Patches + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Map openen... + + + Open Game Folder + Open Spelmap + + + Open Save Data Folder + Open Map voor Opslagdata + + + Open Log Folder + Open Logmap + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Controleren op updates + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Download Cheats/Patches + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Help + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Lijst met spellen + + + * Unsupported Vulkan Version + * Niet ondersteunde Vulkan-versie + + + Download Cheats For All Installed Games + Download cheats voor alle geïnstalleerde spellen + + + Download Patches For All Games + Download patches voor alle spellen + + + Download Complete + Download voltooid + + + You have downloaded cheats for all the games you have installed. + Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. + + + Patches Downloaded Successfully! + Patches succesvol gedownload! + + + All Patches available for all games have been downloaded. + Alle patches voor alle spellen zijn gedownload. + + + Games: + Spellen: + + + ELF files (*.bin *.elf *.oelf) + ELF-bestanden (*.bin *.elf *.oelf) + + + Game Boot + Spelopstart + + + Only one file can be selected! + Je kunt slechts één bestand selecteren! + + + PKG Extraction + PKG-extractie + + + Patch detected! + Patch gedetecteerd! + + + PKG and Game versions match: + PKG- en gameversies komen overeen: + + + Would you like to overwrite? + Wilt u overschrijven? + + + PKG Version %1 is older than installed version: + PKG-versie %1 is ouder dan de geïnstalleerde versie: + + + Game is installed: + Game is geïnstalleerd: + + + Would you like to install Patch: + Wilt u de patch installeren: + + + DLC Installation + DLC-installatie + + + Would you like to install DLC: %1? + Wilt u DLC installeren: %1? + + + DLC already installed: + DLC al geïnstalleerd: + + + Game already installed + Game al geïnstalleerd + + + PKG ERROR + PKG FOUT + + + Extracting PKG %1/%2 + PKG %1/%2 aan het extraheren + + + Extraction Finished + Extractie voltooid + + + Game successfully installed at %1 + Spel succesvol geïnstalleerd op %1 + + + File doesn't appear to be a valid PKG file + Het bestand lijkt geen geldig PKG-bestand te zijn + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Naam + + + Serial + Serienummer + + + Installed + + + + Size + Grootte + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Regio + + + Flags + + + + Path + Pad + + + File + File + + + PKG ERROR + PKG FOUT + + + Unknown + Onbekend + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Volledig schermmodus + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Standaardtabblad bij het openen van instellingen + + + Show Game Size In List + Toon grootte van het spel in de lijst + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Discord Rich Presence inschakelen + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Loglocatie openen + + + Input + Invoer + + + Cursor + Cursor + + + Hide Cursor + Cursor verbergen + + + Hide Cursor Idle Timeout + Inactiviteit timeout voor het verbergen van de cursor + + + s + s + + + Controller + Controller + + + Back Button Behavior + Achterknop gedrag + + + Graphics + Graphics + + + GUI + Interface + + + User + Gebruiker + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Pad + + + Game Folders + Spelmappen + + + Add... + Toevoegen... + + + Remove + Verwijderen + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Bijwerken + + + Check for Updates at Startup + Bij opstart op updates controleren + + + Always Show Changelog + Altijd changelog tonen + + + Update Channel + Updatekanaal + + + Check for Updates + Controleren op updates + + + GUI Settings + GUI-Instellingen + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Titelmuziek afspelen + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Volume + + + Save + Opslaan + + + Apply + Toepassen + + + Restore Defaults + Standaardinstellingen herstellen + + + Close + Sluiten + + + Point your mouse at an option to display its description. + Wijzig de muisaanwijzer naar een optie om de beschrijving weer te geven. + + + consoleLanguageGroupBox + Console Taal:\nStelt de taal in die het PS4-spel gebruikt.\nHet wordt aanbevolen om dit in te stellen op een taal die het spel ondersteunt, wat kan variëren per regio. + + + emulatorLanguageGroupBox + Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. + + + fullscreenCheckBox + Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Opstartscherm weergeven:\nToont het opstartscherm van het spel (een speciale afbeelding) tijdens het starten van het spel. + + + discordRPCCheckbox + Discord Rich Presence inschakelen:\nToont het emulatoricoon en relevante informatie op je Discord-profiel. + + + userName + Gebruikersnaam:\nStelt de gebruikersnaam van het PS4-account in, die door sommige games kan worden weergegeven. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Logtype:\nStelt in of de uitvoer van het logvenster moet worden gesynchroniseerd voor prestaties. Kan nadelige effecten hebben op emulatie. + + + logFilter + Logfilter:\nFiltert het logboek om alleen specifieke informatie af te drukken.\nVoorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna. + + + updaterGroupBox + Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. + + + GUIMusicGroupBox + Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Verberg cursor:\nKies wanneer de cursor verdwijnt:\nNooit: Je ziet altijd de muis.\nInactief: Stel een tijd in waarna deze verdwijnt na inactiviteit.\nAltijd: je ziet de muis nooit. + + + idleTimeoutGroupBox + Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit. + + + backButtonBehaviorGroupBox + Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Nooit + + + Idle + Inactief + + + Always + Altijd + + + Touchpad Left + Touchpad Links + + + Touchpad Right + Touchpad Rechts + + + Touchpad Center + Touchpad Midden + + + None + Geen + + + graphicsAdapterGroupBox + Grafische adapter:\nIn systemen met meerdere GPU's, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies "Auto Select" om dit automatisch in te stellen. + + + resolutionLayout + Breedte/Hoogte:\nStelt de grootte van het emulatorvenster bij het opstarten in, wat tijdens het spelen kan worden gewijzigd.\nDit is anders dan de resolutie in de game. + + + heightDivider + Vblank deler:\nDe frame-rate waartegen de emulator wordt vernieuwd, vermenigvuldigd met dit getal. Dit veranderen kan nadelige effecten hebben, zoals het versnellen van het spel of het verpesten van kritieke gamefunctionaliteiten die niet verwachtten dat dit zou veranderen! + + + dumpShadersCheckBox + Shaderdump inschakelen:\nVoor technische foutopsporing slaat het de shaders van de game op in een map terwijl ze worden gerenderd. + + + nullGpuCheckBox + Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is. + + + gameFoldersBox + Spelmap:\nDe lijst met mappen om te controleren op geïnstalleerde spellen. + + + addFolderButton + Toevoegen:\nVoeg een map toe aan de lijst. + + + removeFolderButton + Verwijderen:\nVerwijder een map uit de lijst. + + + debugDump + Foutopsporing dump inschakelen:\nSlaat de import- en export-symbolen en de bestandsheaderinformatie van de momenteel draaiende PS4-toepassing op in een map. + + + vkValidationCheckBox + Vulkan validatielaag inschakelen:\nSchakelt een systeem in dat de status van de Vulkan-renderer valideert en informatie over de interne status ervan logt. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. + + + vkSyncValidationCheckBox + Vulkan synchronisatievalidatie inschakelen:\nSchakelt een systeem in dat de timing van Vulkan-renderingtaken valideert. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. + + + rdocCheckBox + RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + + diff --git a/src/qt_gui/translations/no_NO.ts b/src/qt_gui/translations/no_NO.ts new file mode 100644 index 000000000..60bc73fd8 --- /dev/null +++ b/src/qt_gui/translations/no_NO.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + Om shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Denne programvaren skal ikke brukes til å spille spill du ikke har fått lovlig. + + + + CheatsPatches + + Cheats / Patches for + Juks / Programrettelser for + + + defaultTextEdit_MSG + Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Ingen bilde tilgjengelig + + + Serial: + Serienummer: + + + Version: + Versjon: + + + Size: + Størrelse: + + + Select Cheat File: + Velg juksefil: + + + Repository: + Pakkebrønn: + + + Download Cheats + Last ned juks + + + Delete File + Slett fil + + + Close + Lukk + + + No files selected. + Ingen filer valgt. + + + You can delete the cheats you don't want after downloading them. + Du kan slette juks du ikke ønsker etter å ha lastet dem ned. + + + Do you want to delete the selected file?\n%1 + Ønsker du å slette den valgte filen?\n%1 + + + Select Patch File: + Velg programrettelse-filen: + + + Download Patches + Last ned programrettelser + + + Save + Lagre + + + Cheats + Juks + + + Patches + Programrettelse + + + Error + Feil + + + No patch selected. + Ingen programrettelse valgt. + + + Unable to open files.json for reading. + Kan ikke åpne files.json for lesing. + + + No patch file found for the current serial. + Ingen programrettelse-fil funnet for det aktuelle serienummeret. + + + Unable to open the file for reading. + Kan ikke åpne filen for lesing. + + + Unable to open the file for writing. + Kan ikke åpne filen for skriving. + + + Failed to parse XML: + Feil ved tolkning av XML: + + + Success + Vellykket + + + Options saved successfully. + Alternativer ble lagret. + + + Invalid Source + Ugyldig kilde + + + The selected source is invalid. + Den valgte kilden er ugyldig. + + + File Exists + Filen eksisterer + + + File already exists. Do you want to replace it? + Filen eksisterer allerede. Ønsker du å erstatte den? + + + Failed to save file: + Kunne ikke lagre filen: + + + Failed to download file: + Kunne ikke laste ned filen: + + + Cheats Not Found + Fant ikke juks + + + CheatsNotFound_MSG + Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. + + + Cheats Downloaded Successfully + Juks ble lastet ned + + + CheatsDownloadedSuccessfully_MSG + Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. + + + Failed to save: + Kunne ikke lagre: + + + Failed to download: + Kunne ikke laste ned: + + + Download Complete + Nedlasting fullført + + + DownloadComplete_MSG + Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. + + + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. + + + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. + + + The game is in version: %1 + Spillet er i versjon: %1 + + + The downloaded patch only works on version: %1 + Den nedlastede programrettelsen fungerer bare på versjon: %1 + + + You may need to update your game. + Du må kanskje oppdatere spillet ditt. + + + Incompatibility Notice + Inkompatibilitets-varsel + + + Failed to open file: + Kunne ikke åpne filen: + + + XML ERROR: + XML FEIL: + + + Failed to open files.json for writing + Kunne ikke åpne files.json for skriving + + + Author: + Forfatter: + + + Directory does not exist: + Mappen eksisterer ikke: + + + Failed to open files.json for reading. + Kunne ikke åpne files.json for lesing. + + + Name: + Navn: + + + Can't apply cheats before the game is started + Kan ikke bruke juks før spillet er startet. + + + + CheckUpdate + + Auto Updater + Automatisk oppdatering + + + Error + Feil + + + Network error: + Nettverksfeil: + + + Error_Github_limit_MSG + Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. + + + Failed to parse update information. + Kunne ikke analysere oppdaterings-informasjonen. + + + No pre-releases found. + Fant ingen forhåndsutgivelser. + + + Invalid release data. + Ugyldige utgivelsesdata. + + + No download URL found for the specified asset. + Ingen nedlastings-URL funnet for den spesifiserte ressursen. + + + Your version is already up to date! + Din versjon er allerede oppdatert! + + + Update Available + Oppdatering tilgjengelig + + + Update Channel + Oppdateringskanal + + + Current Version + Gjeldende versjon + + + Latest Version + Nyeste versjon + + + Do you want to update? + Vil du oppdatere? + + + Show Changelog + Vis endringslogg + + + Check for Updates at Startup + Se etter oppdateringer ved oppstart + + + Update + Oppdater + + + No + Nei + + + Hide Changelog + Skjul endringslogg + + + Changes + Endringer + + + Network error occurred while trying to access the URL + Nettverksfeil oppstod mens vi prøvde å få tilgang til URL + + + Download Complete + Nedlasting fullført + + + The update has been downloaded, press OK to install. + Oppdateringen har blitt lastet ned, trykk OK for å installere. + + + Failed to save the update file at + Kunne ikke lagre oppdateringsfilen på + + + Starting Update... + Starter oppdatering... + + + Failed to create the update script file + Kunne ikke opprette oppdateringsskriptfilen + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vennligst vent + + + Cancel + Avbryt + + + Loading... + Laster... + + + Error + Feil + + + Unable to update compatibility data! Try again later. + Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. + + + Unable to open compatibility_data.json for writing. + Kan ikke åpne compatibility_data.json for skriving. + + + Unknown + Ukjent + + + Nothing + Ingenting + + + Boots + Starter opp + + + Menus + Menyene + + + Ingame + I spill + + + Playable + Spillbar + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Åpne mappe + + + + GameInfoClass + + Loading game list, please wait :3 + Laster spill-liste, vennligst vent :3 + + + Cancel + Avbryt + + + Loading... + Laster... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Velg mappe + + + Directory to install games + Mappe for å installere spill + + + Browse + Bla gjennom + + + Error + Feil + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikon + + + Name + Navn + + + Serial + Serienummer + + + Compatibility + Kompatibilitet + + + Region + Region + + + Firmware + Fastvare + + + Size + Størrelse + + + Version + Versjon + + + Path + Adresse + + + Play Time + Spilletid + + + Never Played + Aldri spilt + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + kompatibilitet er utestet + + + Game does not initialize properly / crashes the emulator + Spillet initialiseres ikke riktig / krasjer emulatoren + + + Game boots, but only displays a blank screen + Spillet starter, men viser bare en tom skjerm + + + Game displays an image but does not go past the menu + Spillet viser et bilde, men går ikke forbi menyen + + + Game has game-breaking glitches or unplayable performance + Spillet har spillbrytende feil eller uspillbar ytelse + + + Game can be completed with playable performance and no major glitches + Spillet kan fullføres med spillbar ytelse og uten store feil + + + Click to see details on github + Klikk for å se detaljer på GitHub + + + Last updated + Sist oppdatert + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Lag snarvei + + + Cheats / Patches + Juks / Programrettelse + + + SFO Viewer + SFO viser + + + Trophy Viewer + Trofé viser + + + Open Folder... + Åpne mappe... + + + Open Game Folder + Åpne spillmappen + + + Open Save Data Folder + Åpne lagrede datamappen + + + Open Log Folder + Åpne loggmappen + + + Copy info... + Kopier info... + + + Copy Name + Kopier navn + + + Copy Serial + Kopier serienummer + + + Copy Version + Kopier versjon + + + Copy Size + Kopier størrelse + + + Copy All + Kopier alt + + + Delete... + Slett... + + + Delete Game + Slett spill + + + Delete Update + Slett oppdatering + + + Delete DLC + Slett DLC + + + Compatibility... + Kompatibilitet... + + + Update database + Oppdater database + + + View report + Vis rapport + + + Submit a report + Send inn en rapport + + + Shortcut creation + Snarvei opprettelse + + + Shortcut created successfully! + Snarvei opprettet! + + + Error + Feil + + + Error creating shortcut! + Feil ved opprettelse av snarvei! + + + Install PKG + Installer PKG + + + Game + Spill + + + This game has no update to delete! + Dette spillet har ingen oppdatering å slette! + + + Update + Oppdater + + + This game has no DLC to delete! + Dette spillet har ingen DLC å slette! + + + DLC + DLC + + + Delete %1 + Slett %1 + + + Are you sure you want to delete %1's %2 directory? + Er du sikker på at du vil slette %1's %2 directory? + + + Open Update Folder + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Velg mappe + + + Select which directory you want to install to. + Velg hvilken mappe du vil installere til. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Åpne/Legg til Elf-mappe + + + Install Packages (PKG) + Installer pakker (PKG) + + + Boot Game + Start spill + + + Check for Updates + Se etter oppdateringer + + + About shadPS4 + Om shadPS4 + + + Configure... + Konfigurer... + + + Install application from a .pkg file + Installer fra en .pkg fil + + + Recent Games + Nylige spill + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Avslutt + + + Exit shadPS4 + Avslutt shadPS4 + + + Exit the application. + Avslutt programmet. + + + Show Game List + Vis spill-listen + + + Game List Refresh + Oppdater spill-listen + + + Tiny + Bitteliten + + + Small + Liten + + + Medium + Medium + + + Large + Stor + + + List View + Liste-visning + + + Grid View + Rute-visning + + + Elf Viewer + Elf-visning + + + Game Install Directory + Spillinstallasjons-mappe + + + Download Cheats/Patches + Last ned juks/programrettelse + + + Dump Game List + Dump spill-liste + + + PKG Viewer + PKG viser + + + Search... + Søk... + + + File + Fil + + + View + Oversikt + + + Game List Icons + Spill-liste ikoner + + + Game List Mode + Spill-liste modus + + + Settings + Innstillinger + + + Utils + Verktøy + + + Themes + Tema + + + Help + Hjelp + + + Dark + Mørk + + + Light + Lys + + + Green + Grønn + + + Blue + Blå + + + Violet + Lilla + + + toolBar + Verktøylinje + + + Game List + Spill-liste + + + * Unsupported Vulkan Version + * Ustøttet Vulkan-versjon + + + Download Cheats For All Installed Games + Last ned juks for alle installerte spill + + + Download Patches For All Games + Last ned programrettelser for alle spill + + + Download Complete + Nedlasting fullført + + + You have downloaded cheats for all the games you have installed. + Du har lastet ned juks for alle spillene du har installert. + + + Patches Downloaded Successfully! + Programrettelser ble lastet ned! + + + All Patches available for all games have been downloaded. + Programrettelser tilgjengelige for alle spill har blitt lastet ned. + + + Games: + Spill: + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + Game Boot + Spilloppstart + + + Only one file can be selected! + Kun én fil kan velges! + + + PKG Extraction + PKG-utpakking + + + Patch detected! + Programrettelse oppdaget! + + + PKG and Game versions match: + PKG og spillversjoner stemmer overens: + + + Would you like to overwrite? + Ønsker du å overskrive? + + + PKG Version %1 is older than installed version: + PKG-versjon %1 er eldre enn installert versjon: + + + Game is installed: + Spillet er installert: + + + Would you like to install Patch: + Ønsker du å installere programrettelsen: + + + DLC Installation + DLC installasjon + + + Would you like to install DLC: %1? + Ønsker du å installere DLC: %1? + + + DLC already installed: + DLC allerede installert: + + + Game already installed + Spillet er allerede installert + + + PKG ERROR + PKG FEIL + + + Extracting PKG %1/%2 + Pakker ut PKG %1/%2 + + + Extraction Finished + Utpakking fullført + + + Game successfully installed at %1 + Spillet ble installert i %1 + + + File doesn't appear to be a valid PKG file + Filen ser ikke ut til å være en gyldig PKG-fil + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Åpne mappe + + + Name + Navn + + + Serial + Serienummer + + + Installed + + + + Size + Størrelse + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Region + + + Flags + + + + Path + Adresse + + + File + Fil + + + PKG ERROR + PKG FEIL + + + Unknown + Ukjent + + + Package + + + + + SettingsDialog + + Settings + Innstillinger + + + General + Generell + + + System + System + + + Console Language + Konsollspråk + + + Emulator Language + Emulatorspråk + + + Emulator + Emulator + + + Enable Fullscreen + Aktiver fullskjerm + + + Fullscreen Mode + Fullskjermmodus + + + Enable Separate Update Folder + Aktiver seperat oppdateringsmappe + + + Default tab when opening settings + Standardfanen når innstillingene åpnes + + + Show Game Size In List + Vis spillstørrelse i listen + + + Show Splash + Vis velkomstbilde + + + Enable Discord Rich Presence + Aktiver Discord Rich Presence + + + Username + Brukernavn + + + Trophy Key + Trofénøkkel + + + Trophy + Trofé + + + Logger + Logger + + + Log Type + Logg type + + + Log Filter + Logg filter + + + Open Log Location + Åpne loggplassering + + + Input + Inndata + + + Cursor + Musepeker + + + Hide Cursor + Skjul musepeker + + + Hide Cursor Idle Timeout + Skjul musepeker ved inaktivitet + + + s + s + + + Controller + Kontroller + + + Back Button Behavior + Tilbakeknapp atferd + + + Graphics + Grafikk + + + GUI + Grensesnitt + + + User + Bruker + + + Graphics Device + Grafikkenhet + + + Width + Bredde + + + Height + Høyde + + + Vblank Divider + Vblank skillelinje + + + Advanced + Avansert + + + Enable Shaders Dumping + Aktiver skyggeleggerdumping + + + Enable NULL GPU + Aktiver NULL GPU + + + Paths + Mapper + + + Game Folders + Spillmapper + + + Add... + Legg til... + + + Remove + Fjern + + + Save Data Path + Lagrede datamappe + + + Browse + Endre mappe + + + saveDataBox + Lagrede datamappe:\nListe over data shadPS4 lagrer. + + + browseButton + Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. + + + Debug + Feilretting + + + Enable Debug Dumping + Aktiver feilrettingsdumping + + + Enable Vulkan Validation Layers + Aktiver Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Aktiver Vulkan synkroniseringslag + + + Enable RenderDoc Debugging + Aktiver RenderDoc feilretting + + + Enable Crash Diagnostics + Aktiver krasjdiagnostikk + + + Collect Shaders + Lagre skyggeleggere + + + Copy GPU Buffers + Kopier GPU-buffere + + + Host Debug Markers + Vertsfeilsøkingsmarkører + + + Guest Debug Markers + Gjestefeilsøkingsmarkører + + + Update + Oppdatering + + + Check for Updates at Startup + Se etter oppdateringer ved oppstart + + + Update Channel + Oppdateringskanal + + + Check for Updates + Se etter oppdateringer + + + GUI Settings + Grensesnitt-innstillinger + + + Title Music + Tittelmusikk + + + Disable Trophy Pop-ups + Deaktiver trofé hurtigmeny + + + Background Image + Bakgrunnsbilde + + + Show Background Image + Vis bakgrunnsbilde + + + Opacity + Synlighet + + + Play title music + Spill tittelmusikk + + + Update Compatibility Database On Startup + Oppdater database ved oppstart + + + Game Compatibility + Spill kompatibilitet + + + Display Compatibility Data + Vis kompatibilitets-data + + + Update Compatibility Database + Oppdater kompatibilitets-database + + + Volume + Volum + + + Save + Lagre + + + Apply + Bruk + + + Restore Defaults + Gjenopprett standardinnstillinger + + + Close + Lukk + + + Point your mouse at an option to display its description. + Pek musen over et alternativ for å vise beskrivelsen. + + + consoleLanguageGroupBox + Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. + + + emulatorLanguageGroupBox + Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. + + + fullscreenCheckBox + Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. + + + separateUpdatesCheckBox + Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. + + + showSplashCheckBox + Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. + + + discordRPCCheckbox + Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. + + + userName + Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. + + + TrophyKey + Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. + + + logTypeGroupBox + Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. + + + logFilter + Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. + + + updaterGroupBox + Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. + + + GUIBackgroundImageGroupBox + Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. + + + GUIMusicGroupBox + Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. + + + disableTrophycheckBox + Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). + + + hideCursorGroupBox + Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. + + + idleTimeoutGroupBox + Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. + + + backButtonBehaviorGroupBox + Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. + + + enableCompatibilityCheckBox + Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. + + + checkCompatibilityOnStartupCheckBox + Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. + + + updateCompatibilityButton + Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. + + + Never + Aldri + + + Idle + Inaktiv + + + Always + Alltid + + + Touchpad Left + Berøringsplate Venstre + + + Touchpad Right + Berøringsplate Høyre + + + Touchpad Center + Berøringsplate Midt + + + None + Ingen + + + graphicsAdapterGroupBox + Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. + + + resolutionLayout + Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. + + + heightDivider + Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! + + + dumpShadersCheckBox + Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. + + + nullGpuCheckBox + Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. + + + gameFoldersBox + Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. + + + addFolderButton + Legg til:\nLegg til en mappe til listen. + + + removeFolderButton + Fjern:\nFjern en mappe fra listen. + + + debugDump + Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. + + + vkValidationCheckBox + Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + + + vkSyncValidationCheckBox + Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + + + rdocCheckBox + Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. + + + collectShaderCheckBox + Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). + + + crashDiagnosticsCheckBox + Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. + + + copyGPUBuffersCheckBox + Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. + + + hostMarkersCheckBox + Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + + + guestMarkersCheckBox + Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Always Show Changelog + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Mappe for å installere spill + + + Directory to save data + + + + enableHDRCheckBox + + + + + TrophyViewer + + Trophy Viewer + Trofé viser + + + diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index c9d2daa9a..99420f89e 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - O programie - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła. - - - - ElfViewer - - Open Folder - Otwórz folder - - - - GameInfoClass - - Loading game list, please wait :3 - Ładowanie listy gier, proszę poczekaj :3 - - - Cancel - Anuluj - - - Loading... - Ładowanie... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Wybierz katalog - - - Select which directory you want to install to. - Wybierz katalog, do którego chcesz zainstalować. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Wybierz katalog - - - Directory to install games - Katalog do instalacji gier - - - Browse - Przeglądaj - - - Error - Błąd - - - The value for location to install games is not valid. - Podana ścieżka do instalacji gier nie jest prawidłowa. - - - - GuiContextMenus - - Create Shortcut - Utwórz skrót - - - Cheats / Patches - Kody / poprawki - - - SFO Viewer - Menedżer plików SFO - - - Trophy Viewer - Menedżer trofeów - - - Open Folder... - Otwórz Folder... - - - Open Game Folder - Otwórz Katalog Gry - - - Open Save Data Folder - Otwórz Folder Danych Zapisów - - - Open Log Folder - Otwórz Folder Dziennika - - - Copy info... - Kopiuj informacje... - - - Copy Name - Kopiuj nazwę - - - Copy Serial - Kopiuj numer seryjny - - - Copy All - Kopiuj wszystko - - - Delete... - Usuń... - - - Delete Game - Usuń Grę - - - Delete Update - Usuń Aktualizację - - - Delete DLC - Usuń DLC - - - Compatibility... - kompatybilność... - - - Update database - Zaktualizuj bazę danych - - - View report - Wyświetl zgłoszenie - - - Submit a report - Wyślij zgłoszenie - - - Shortcut creation - Tworzenie skrótu - - - Shortcut created successfully! - Utworzenie skrótu zakończone pomyślnie! - - - Error - Błąd - - - Error creating shortcut! - Utworzenie skrótu zakończone niepowodzeniem! - - - Install PKG - Zainstaluj PKG - - - Game - Gra - - - requiresEnableSeparateUpdateFolder_MSG - Ta funkcja wymaga do działania opcji „Włącz oddzielny folder aktualizacji”. Jeśli chcesz korzystać z tej funkcji, włącz ją. - - - This game has no update to delete! - Ta gra nie ma aktualizacji do usunięcia! - - - Update - Aktualizacja - - - This game has no DLC to delete! - Ta gra nie ma DLC do usunięcia! - - - DLC - DLC - - - Delete %1 - Usuń %1 - - - Are you sure you want to delete %1's %2 directory? - Czy na pewno chcesz usunąć katalog %1 z %2? - - - - MainWindow - - Open/Add Elf Folder - Otwórz/Dodaj folder Elf - - - Install Packages (PKG) - Zainstaluj paczkę (PKG) - - - Boot Game - Uruchom grę - - - Check for Updates - Sprawdź aktualizacje - - - About shadPS4 - O programie - - - Configure... - Konfiguruj... - - - Install application from a .pkg file - Zainstaluj aplikacje z pliku .pkg - - - Recent Games - Ostatnie gry - - - Open shadPS4 Folder - Otwórz folder shadPS4 - - - Exit - Wyjdź - - - Exit shadPS4 - Wyjdź z shadPS4 - - - Exit the application. - Wyjdź z aplikacji. - - - Show Game List - Pokaż listę gier - - - Game List Refresh - Odśwież listę gier - - - Tiny - Malutkie - - - Small - Małe - - - Medium - Średnie - - - Large - Wielkie - - - List View - Widok listy - - - Grid View - Widok siatki - - - Elf Viewer - Menedżer plików ELF - - - Game Install Directory - Katalog zainstalowanych gier - - - Download Cheats/Patches - Pobierz kody / poprawki - - - Dump Game List - Zgraj listę gier - - - PKG Viewer - Menedżer plików PKG - - - Search... - Szukaj... - - - File - Plik - - - View - Widok - - - Game List Icons - Ikony w widoku listy - - - Game List Mode - Tryb listy gier - - - Settings - Ustawienia - - - Utils - Narzędzia - - - Themes - Motywy - - - Help - Pomoc - - - Dark - Ciemny - - - Light - Jasny - - - Green - Zielony - - - Blue - Niebieski - - - Violet - Fioletowy - - - toolBar - Pasek narzędzi - - - Game List - Lista gier - - - * Unsupported Vulkan Version - * Nieobsługiwana wersja Vulkan - - - Download Cheats For All Installed Games - Pobierz kody do wszystkich zainstalowanych gier - - - Download Patches For All Games - Pobierz poprawki do wszystkich gier - - - Download Complete - Pobieranie zakończone - - - You have downloaded cheats for all the games you have installed. - Pobrałeś kody do wszystkich zainstalowanych gier. - - - Patches Downloaded Successfully! - Poprawki pobrane pomyślnie! - - - All Patches available for all games have been downloaded. - Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. - - - Games: - Gry: - - - PKG File (*.PKG) - Plik PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Pliki ELF (*.bin *.elf *.oelf) - - - Game Boot - Uruchomienie gry - - - Only one file can be selected! - Można wybrać tylko jeden plik! - - - PKG Extraction - Wypakowywanie PKG - - - Patch detected! - Wykryto łatkę! - - - PKG and Game versions match: - Wersje PKG i gry są zgodne: - - - Would you like to overwrite? - Czy chcesz nadpisać? - - - PKG Version %1 is older than installed version: - Wersja PKG %1 jest starsza niż zainstalowana wersja: - - - Game is installed: - Gra jest zainstalowana: - - - Would you like to install Patch: - Czy chcesz zainstalować łatkę: - - - DLC Installation - Instalacja DLC - - - Would you like to install DLC: %1? - Czy chcesz zainstalować DLC: %1? - - - DLC already installed: - DLC już zainstalowane: - - - Game already installed - Gra już zainstalowana - - - PKG is a patch, please install the game first! - PKG jest poprawką, proszę najpierw zainstalować grę! - - - PKG ERROR - BŁĄD PKG - - - Extracting PKG %1/%2 - Wypakowywanie PKG %1/%2 - - - Extraction Finished - Wypakowywanie zakończone - - - Game successfully installed at %1 - Gra pomyślnie zainstalowana w %1 - - - File doesn't appear to be a valid PKG file - Plik nie wydaje się być prawidłowym plikiem PKG - - - - PKGViewer - - Open Folder - Otwórz folder - - - - TrophyViewer - - Trophy Viewer - Menedżer trofeów - - - - SettingsDialog - - Settings - Ustawienia - - - General - Ogólne - - - System - System - - - Console Language - Język konsoli - - - Emulator Language - Język emulatora - - - Emulator - Emulator - - - Enable Fullscreen - Włącz pełny ekran - - - Fullscreen Mode - Tryb Pełnoekranowy - - - Enable Separate Update Folder - Włącz oddzielny folder aktualizacji - - - Default tab when opening settings - Domyślna zakładka podczas otwierania ustawień - - - Show Game Size In List - Pokaż rozmiar gry na liście - - - Show Splash - Pokaż ekran powitania - - - Is PS4 Pro - Emulacja PS4 Pro - - - Enable Discord Rich Presence - Włącz Discord Rich Presence - - - Username - Nazwa użytkownika - - - Trophy Key - Klucz trofeów - - - Trophy - Trofeum - - - Logger - Dziennik zdarzeń - - - Log Type - Typ dziennika - - - Log Filter - Filtrowanie dziennika - - - Open Log Location - Otwórz lokalizację dziennika - - - Input - Wejście - - - Cursor - Kursor - - - Hide Cursor - Ukryj kursor - - - Hide Cursor Idle Timeout - Czas oczekiwania na ukrycie kursora przy bezczynności - - - s - s - - - Controller - Kontroler - - - Back Button Behavior - Zachowanie przycisku wstecz - - - Graphics - Grafika - - - GUI - Interfejs - - - User - Użytkownik - - - Graphics Device - Karta graficzna - - - Width - Szerokość - - - Height - Wysokość - - - Vblank Divider - Dzielnik przerwy pionowej (Vblank) - - - Advanced - Zaawansowane - - - Enable Shaders Dumping - Włącz zgrywanie cieni - - - Enable NULL GPU - Wyłącz kartę graficzną - - - Paths - Ścieżki - - - Game Folders - Foldery gier - - - Add... - Dodaj... - - - Remove - Usuń - - - Debug - Debugowanie - - - Enable Debug Dumping - Włącz zgrywanie debugowania - - - Enable Vulkan Validation Layers - Włącz warstwy walidacji Vulkan - - - Enable Vulkan Synchronization Validation - Włącz walidację synchronizacji Vulkan - - - Enable RenderDoc Debugging - Włącz debugowanie RenderDoc - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Aktualizacja - - - Check for Updates at Startup - Sprawdź aktualizacje przy starcie - - - Always Show Changelog - Zawsze pokazuj dziennik zmian - - - Update Channel - Kanał Aktualizacji - - - Check for Updates - Sprawdź aktualizacje - - - GUI Settings - Ustawienia Interfejsu - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Wyłącz wyskakujące okienka trofeów - - - Play title music - Odtwórz muzykę tytułową - - - Update Compatibility Database On Startup - Aktualizuj bazę danych zgodności podczas uruchamiania - - - Game Compatibility - Kompatybilność gier - - - Display Compatibility Data - Wyświetl dane zgodności - - - Update Compatibility Database - Aktualizuj bazę danych zgodności - - - Volume - Głośność - - - Audio Backend - Zaplecze audio - - - Save - Zapisz - - - Apply - Zastosuj - - - Restore Defaults - Przywróć ustawienia domyślne - - - Close - Zamknij - - - Point your mouse at an option to display its description. - Najedź kursorem na opcję, aby wyświetlić jej opis. - - - consoleLanguageGroupBox - Język konsoli:\nUstala język, który używa gra PS4.\nZaleca się ustawienie tego na język, który obsługuje gra, co może się różnić w zależności od regionu. - - - emulatorLanguageGroupBox - Język emulatora:\nUstala język interfejsu użytkownika emulatora. - - - fullscreenCheckBox - Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. - - - separateUpdatesCheckBox - Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania. - - - showSplashCheckBox - Wyświetl ekran powitalny:\nPodczas uruchamiania gry wyświetla ekran powitalny (specjalny obraz). - - - ps4proCheckBox - Czy PS4 Pro:\nSprawia, że emulator działa jak PS4 PRO, co może aktywować specjalne funkcje w grach, które to obsługują. - - - discordRPCCheckbox - Włącz Discord Rich Presence:\nWyświetla ikonę emulatora i odpowiednie informacje na twoim profilu Discord. - - - userName - Nazwa użytkownika:\nUstala nazwę użytkownika konta PS4, która może być wyświetlana w niektórych grach. - - - TrophyKey - Klucz trofeów:\nKlucz używany do odszyfrowywania trofeów. Musi być uzyskany z konsoli po jailbreaku. Musi zawierać tylko znaki w kodzie szesnastkowym. - - - logTypeGroupBox - Typ logu:\nUstala, czy synchronizować wyjście okna dziennika dla wydajności. Może to mieć negatywny wpływ na emulację. - - - logFilter - Filtr logu:\nFiltruje dziennik, aby drukować tylko określone informacje.\nPrzykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później. - - - updaterGroupBox - Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. - - - GUIMusicGroupBox - Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. - - - disableTrophycheckBox - Wyłącz wyskakujące okienka trofeów:\nWyłącz powiadomienia o trofeach w grze. Postępy w zdobywaniu trofeów można nadal śledzić za pomocą przeglądarki trofeów (kliknij prawym przyciskiem myszy grę w oknie głównym). - - - hideCursorGroupBox - Ukryj kursor:\nWybierz, kiedy kursor zniknie:\nNigdy: Zawsze będziesz widział myszkę.\nNieaktywny: Ustaw czas, po którym zniknie po bezczynności.\nZawsze: nigdy nie zobaczysz myszki. - - - idleTimeoutGroupBox - Ustaw czas, po którym mysz zniknie po bezczynności. - - - backButtonBehaviorGroupBox - Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4. - - - enableCompatibilityCheckBox - Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję „Aktualizuj zgodność przy uruchomieniu”, aby uzyskać aktualne informacje. - - - checkCompatibilityOnStartupCheckBox - Aktualizuj zgodność przy uruchomieniu:\nAutomatycznie aktualizuj bazę danych kompatybilności podczas uruchamiania shadPS4. - - - updateCompatibilityButton - Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. - - - Never - Nigdy - - - Idle - Bezczynny - - - Always - Zawsze - - - Touchpad Left - Touchpad Lewy - - - Touchpad Right - Touchpad Prawy - - - Touchpad Center - Touchpad Środkowy - - - None - Brak - - - graphicsAdapterGroupBox - Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz "Auto Select", aby ustawić go automatycznie. - - - resolutionLayout - Szerokość/Wysokość:\nUstala rozmiar okna emulatora podczas uruchamiania, który może być zmieniany w trakcie gry.\nTo różni się od rozdzielczości w grze. - - - heightDivider - Dzielnik Vblank:\nWskaźnik klatek, z jakim emulator jest odświeżany, pomnożony przez tę liczbę. Zmiana tego może mieć negatywne skutki, takie jak przyspieszenie gry lub zniszczenie krytycznej funkcjonalności gry, która nie spodziewa się, że to zostanie zmienione! - - - dumpShadersCheckBox - Włącz zrzucanie shaderów:\nDla technicznego debugowania zapisuje shadery z gry w folderze podczas renderowania. - - - nullGpuCheckBox - Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej. - - - gameFoldersBox - Foldery gier:\nLista folderów do sprawdzenia zainstalowanych gier. - - - addFolderButton - Dodaj:\nDodaj folder do listy. - - - removeFolderButton - Usuń:\nUsuń folder z listy. - - - debugDump - Włącz zrzut debugowania:\nZapisuje symbole importu i eksportu oraz informacje nagłówkowe pliku dla aktualnie działającej aplikacji PS4 w katalogu. - - - vkValidationCheckBox - Włącz warstwę walidacji Vulkan:\nWłącza system, który waliduje stan renderera Vulkan i loguje informacje o jego wewnętrznym stanie. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - - - vkSyncValidationCheckBox - Włącz walidację synchronizacji Vulkan:\nWłącza system, który waliduje timing zadań renderowania Vulkan. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - - - rdocCheckBox - Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Kody / Łatki dla - - - defaultTextEdit_MSG - Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Brak dostępnego obrazu - - - Serial: - Numer seryjny: - - - Version: - Wersja: - - - Size: - Rozmiar: - - - Select Cheat File: - Wybierz plik kodu: - - - Repository: - Repozytorium: - - - Download Cheats - Pobierz kody - - - Remove Old Files - Usuń stare pliki - - - Do you want to delete the files after downloading them? - Czy chcesz usunąć pliki po ich pobraniu? - - - Do you want to delete the files after downloading them?\n%1 - Czy chcesz usunąć pliki po ich pobraniu?\n%1 - - - Do you want to delete the selected file?\n%1 - Czy chcesz usunąć wybrany plik?\n%1 - - - Select Patch File: - Wybierz plik poprawki: - - - Download Patches - Pobierz poprawki - - - Save - Zapisz - - - Cheats - Kody - - - Patches - Poprawki - - - Error - Błąd - - - No patch selected. - Nie wybrano poprawki. - - - Unable to open files.json for reading. - Nie można otworzyć pliku files.json do odczytu. - - - No patch file found for the current serial. - Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. - - - Unable to open the file for reading. - Nie można otworzyć pliku do odczytu. - - - Unable to open the file for writing. - Nie można otworzyć pliku do zapisu. - - - Failed to parse XML: - Nie udało się przeanalizować XML: - - - Success - Sukces - - - Options saved successfully. - Opcje zostały pomyślnie zapisane. - - - Invalid Source - Nieprawidłowe źródło - - - The selected source is invalid. - Wybrane źródło jest nieprawidłowe. - - - File Exists - Plik istnieje - - - File already exists. Do you want to replace it? - Plik już istnieje. Czy chcesz go zastąpić? - - - Failed to save file: - Nie udało się zapisać pliku: - - - Failed to download file: - Nie udało się pobrać pliku: - - - Cheats Not Found - Nie znaleziono kodów - - - CheatsNotFound_MSG - Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. - - - Cheats Downloaded Successfully - Kody pobrane pomyślnie - - - CheatsDownloadedSuccessfully_MSG - Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. - - - Failed to save: - Nie udało się zapisać: - - - Failed to download: - Nie udało się pobrać: - - - Download Complete - Pobieranie zakończone - - - DownloadComplete_MSG - Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. - - - Failed to parse JSON data from HTML. - Nie udało się przeanalizować danych JSON z HTML. - - - Failed to retrieve HTML page. - Nie udało się pobrać strony HTML. - - - The game is in version: %1 - Gra jest w wersji: %1 - - - The downloaded patch only works on version: %1 - Pobrana łatka działa tylko w wersji: %1 - - - You may need to update your game. - Możesz potrzebować zaktualizować swoją grę. - - - Incompatibility Notice - Powiadomienie o niezgodności - - - Failed to open file: - Nie udało się otworzyć pliku: - - - XML ERROR: - BŁĄD XML: - - - Failed to open files.json for writing - Nie udało się otworzyć pliku files.json do zapisu - - - Author: - Autor: - - - Directory does not exist: - Katalog nie istnieje: - - - Directory does not exist: %1 - Katalog nie istnieje: %1 - - - Failed to parse JSON: - Nie udało się przeanalizować JSON: - - - Can't apply cheats before the game is started - Nie można zastosować kodów przed uruchomieniem gry. - - - - GameListFrame - - Icon - Ikona - - - Name - Nazwa - - - Serial - Numer seryjny - - - Compatibility - Zgodność - - - Region - Region - - - Firmware - Oprogramowanie - - - Size - Rozmiar - - - Version - Wersja - - - Path - Ścieżka - - - Play Time - Czas gry - - - Never Played - Nigdy nie grane - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Kompatybilność nie została przetestowana - - - Game does not initialize properly / crashes the emulator - Gra nie inicjuje się poprawnie / zawiesza się emulator - - - Game boots, but only displays a blank screen - Gra uruchamia się, ale wyświetla tylko pusty ekran - - - Game displays an image but does not go past the menu - Gra wyświetla obraz, ale nie przechodzi do menu - - - Game has game-breaking glitches or unplayable performance - Gra ma usterki przerywające rozgrywkę lub niegrywalną wydajność - - - Game can be completed with playable performance and no major glitches - Grę można ukończyć z grywalną wydajnością i bez większych usterek - - - Click to see details on github - Kliknij, aby zobaczyć szczegóły na GitHub - - - Last updated - Ostatnia aktualizacja - - - - CheckUpdate - - Auto Updater - Automatyczne aktualizacje - - - Error - Błąd - - - Network error: - Błąd sieci: - - - Error_Github_limit_MSG - Automatyczna aktualizacja umożliwia maksymalnie 60 sprawdzeń aktualizacji na godzinę.\nOsiągnąłeś ten limit. Spróbuj ponownie później. - - - Failed to parse update information. - Nie udało się sparsować informacji o aktualizacji. - - - No pre-releases found. - Nie znaleziono wersji przedpremierowych. - - - Invalid release data. - Nieprawidłowe dane wydania. - - - No download URL found for the specified asset. - Nie znaleziono adresu URL do pobrania dla określonego zasobu. - - - Your version is already up to date! - Twoja wersja jest już aktualna! - - - Update Available - Dostępna aktualizacja - - - Update Channel - Kanał Aktualizacji - - - Current Version - Aktualna wersja - - - Latest Version - Ostatnia wersja - - - Do you want to update? - Czy chcesz zaktualizować? - - - Show Changelog - Pokaż zmiany - - - Check for Updates at Startup - Sprawdź aktualizacje przy starcie - - - Update - Aktualizuj - - - No - Nie - - - Hide Changelog - Ukryj zmiany - - - Changes - Zmiany - - - Network error occurred while trying to access the URL - Błąd sieci wystąpił podczas próby uzyskania dostępu do URL - - - Download Complete - Pobieranie zakończone - - - The update has been downloaded, press OK to install. - Aktualizacja została pobrana, naciśnij OK, aby zainstalować. - - - Failed to save the update file at - Nie udało się zapisać pliku aktualizacji w - - - Starting Update... - Rozpoczynanie aktualizacji... - - - Failed to create the update script file - Nie udało się utworzyć pliku skryptu aktualizacji - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Pobieranie danych o kompatybilności, proszę czekać - - - Cancel - Anuluj - - - Loading... - Ładowanie... - - - Error - Błąd - - - Unable to update compatibility data! Try again later. - Nie można zaktualizować danych o kompatybilności! Spróbuj ponownie później. - - - Unable to open compatibility_data.json for writing. - Nie można otworzyć pliku compatibility_data.json do zapisu. - - - Unknown - Nieznany - - - Nothing - Nic - - - Boots - Buty - - - Menus - Menu - - - Ingame - W grze - - - Playable - Do grania - - + + AboutDialog + + About shadPS4 + O programie + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła. + + + + CheatsPatches + + Cheats / Patches for + Kody / Łatki dla + + + defaultTextEdit_MSG + Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Brak dostępnego obrazu + + + Serial: + Numer seryjny: + + + Version: + Wersja: + + + Size: + Rozmiar: + + + Select Cheat File: + Wybierz plik kodu: + + + Repository: + Repozytorium: + + + Download Cheats + Pobierz kody + + + Do you want to delete the selected file?\n%1 + Czy chcesz usunąć wybrany plik?\n%1 + + + Select Patch File: + Wybierz plik poprawki: + + + Download Patches + Pobierz poprawki + + + Save + Zapisz + + + Cheats + Kody + + + Patches + Poprawki + + + Error + Błąd + + + No patch selected. + Nie wybrano poprawki. + + + Unable to open files.json for reading. + Nie można otworzyć pliku files.json do odczytu. + + + No patch file found for the current serial. + Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. + + + Unable to open the file for reading. + Nie można otworzyć pliku do odczytu. + + + Unable to open the file for writing. + Nie można otworzyć pliku do zapisu. + + + Failed to parse XML: + Nie udało się przeanalizować XML: + + + Success + Sukces + + + Options saved successfully. + Opcje zostały pomyślnie zapisane. + + + Invalid Source + Nieprawidłowe źródło + + + The selected source is invalid. + Wybrane źródło jest nieprawidłowe. + + + File Exists + Plik istnieje + + + File already exists. Do you want to replace it? + Plik już istnieje. Czy chcesz go zastąpić? + + + Failed to save file: + Nie udało się zapisać pliku: + + + Failed to download file: + Nie udało się pobrać pliku: + + + Cheats Not Found + Nie znaleziono kodów + + + CheatsNotFound_MSG + Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. + + + Cheats Downloaded Successfully + Kody pobrane pomyślnie + + + CheatsDownloadedSuccessfully_MSG + Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. + + + Failed to save: + Nie udało się zapisać: + + + Failed to download: + Nie udało się pobrać: + + + Download Complete + Pobieranie zakończone + + + DownloadComplete_MSG + Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. + + + Failed to parse JSON data from HTML. + Nie udało się przeanalizować danych JSON z HTML. + + + Failed to retrieve HTML page. + Nie udało się pobrać strony HTML. + + + The game is in version: %1 + Gra jest w wersji: %1 + + + The downloaded patch only works on version: %1 + Pobrana łatka działa tylko w wersji: %1 + + + You may need to update your game. + Możesz potrzebować zaktualizować swoją grę. + + + Incompatibility Notice + Powiadomienie o niezgodności + + + Failed to open file: + Nie udało się otworzyć pliku: + + + XML ERROR: + BŁĄD XML: + + + Failed to open files.json for writing + Nie udało się otworzyć pliku files.json do zapisu + + + Author: + Autor: + + + Directory does not exist: + Katalog nie istnieje: + + + Can't apply cheats before the game is started + Nie można zastosować kodów przed uruchomieniem gry. + + + Delete File + + + + No files selected. + + + + You can delete the cheats you don't want after downloading them. + + + + Close + Zamknij + + + Failed to open files.json for reading. + + + + Name: + + + + + CheckUpdate + + Auto Updater + Automatyczne aktualizacje + + + Error + Błąd + + + Network error: + Błąd sieci: + + + Error_Github_limit_MSG + Automatyczna aktualizacja umożliwia maksymalnie 60 sprawdzeń aktualizacji na godzinę.\nOsiągnąłeś ten limit. Spróbuj ponownie później. + + + Failed to parse update information. + Nie udało się sparsować informacji o aktualizacji. + + + No pre-releases found. + Nie znaleziono wersji przedpremierowych. + + + Invalid release data. + Nieprawidłowe dane wydania. + + + No download URL found for the specified asset. + Nie znaleziono adresu URL do pobrania dla określonego zasobu. + + + Your version is already up to date! + Twoja wersja jest już aktualna! + + + Update Available + Dostępna aktualizacja + + + Update Channel + Kanał Aktualizacji + + + Current Version + Aktualna wersja + + + Latest Version + Ostatnia wersja + + + Do you want to update? + Czy chcesz zaktualizować? + + + Show Changelog + Pokaż zmiany + + + Check for Updates at Startup + Sprawdź aktualizacje przy starcie + + + Update + Aktualizuj + + + No + Nie + + + Hide Changelog + Ukryj zmiany + + + Changes + Zmiany + + + Network error occurred while trying to access the URL + Błąd sieci wystąpił podczas próby uzyskania dostępu do URL + + + Download Complete + Pobieranie zakończone + + + The update has been downloaded, press OK to install. + Aktualizacja została pobrana, naciśnij OK, aby zainstalować. + + + Failed to save the update file at + Nie udało się zapisać pliku aktualizacji w + + + Starting Update... + Rozpoczynanie aktualizacji... + + + Failed to create the update script file + Nie udało się utworzyć pliku skryptu aktualizacji + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Pobieranie danych o kompatybilności, proszę czekać + + + Cancel + Anuluj + + + Loading... + Ładowanie... + + + Error + Błąd + + + Unable to update compatibility data! Try again later. + Nie można zaktualizować danych o kompatybilności! Spróbuj ponownie później. + + + Unable to open compatibility_data.json for writing. + Nie można otworzyć pliku compatibility_data.json do zapisu. + + + Unknown + Nieznany + + + Nothing + Nic + + + Boots + Buty + + + Menus + Menu + + + Ingame + W grze + + + Playable + Do grania + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Otwórz folder + + + + GameInfoClass + + Loading game list, please wait :3 + Ładowanie listy gier, proszę poczekaj :3 + + + Cancel + Anuluj + + + Loading... + Ładowanie... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Wybierz katalog + + + Directory to install games + Katalog do instalacji gier + + + Browse + Przeglądaj + + + Error + Błąd + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikona + + + Name + Nazwa + + + Serial + Numer seryjny + + + Compatibility + Zgodność + + + Region + Region + + + Firmware + Oprogramowanie + + + Size + Rozmiar + + + Version + Wersja + + + Path + Ścieżka + + + Play Time + Czas gry + + + Never Played + Nigdy nie grane + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Kompatybilność nie została przetestowana + + + Game does not initialize properly / crashes the emulator + Gra nie inicjuje się poprawnie / zawiesza się emulator + + + Game boots, but only displays a blank screen + Gra uruchamia się, ale wyświetla tylko pusty ekran + + + Game displays an image but does not go past the menu + Gra wyświetla obraz, ale nie przechodzi do menu + + + Game has game-breaking glitches or unplayable performance + Gra ma usterki przerywające rozgrywkę lub niegrywalną wydajność + + + Game can be completed with playable performance and no major glitches + Grę można ukończyć z grywalną wydajnością i bez większych usterek + + + Click to see details on github + Kliknij, aby zobaczyć szczegóły na GitHub + + + Last updated + Ostatnia aktualizacja + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Utwórz skrót + + + Cheats / Patches + Kody / poprawki + + + SFO Viewer + Menedżer plików SFO + + + Trophy Viewer + Menedżer trofeów + + + Open Folder... + Otwórz Folder... + + + Open Game Folder + Otwórz Katalog Gry + + + Open Save Data Folder + Otwórz Folder Danych Zapisów + + + Open Log Folder + Otwórz Folder Dziennika + + + Copy info... + Kopiuj informacje... + + + Copy Name + Kopiuj nazwę + + + Copy Serial + Kopiuj numer seryjny + + + Copy All + Kopiuj wszystko + + + Delete... + Usuń... + + + Delete Game + Usuń Grę + + + Delete Update + Usuń Aktualizację + + + Delete DLC + Usuń DLC + + + Compatibility... + kompatybilność... + + + Update database + Zaktualizuj bazę danych + + + View report + Wyświetl zgłoszenie + + + Submit a report + Wyślij zgłoszenie + + + Shortcut creation + Tworzenie skrótu + + + Shortcut created successfully! + Utworzenie skrótu zakończone pomyślnie! + + + Error + Błąd + + + Error creating shortcut! + Utworzenie skrótu zakończone niepowodzeniem! + + + Install PKG + Zainstaluj PKG + + + Game + Gra + + + This game has no update to delete! + Ta gra nie ma aktualizacji do usunięcia! + + + Update + Aktualizacja + + + This game has no DLC to delete! + Ta gra nie ma DLC do usunięcia! + + + DLC + DLC + + + Delete %1 + Usuń %1 + + + Are you sure you want to delete %1's %2 directory? + Czy na pewno chcesz usunąć katalog %1 z %2? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Wybierz katalog + + + Select which directory you want to install to. + Wybierz katalog, do którego chcesz zainstalować. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Otwórz/Dodaj folder Elf + + + Install Packages (PKG) + Zainstaluj paczkę (PKG) + + + Boot Game + Uruchom grę + + + Check for Updates + Sprawdź aktualizacje + + + About shadPS4 + O programie + + + Configure... + Konfiguruj... + + + Install application from a .pkg file + Zainstaluj aplikacje z pliku .pkg + + + Recent Games + Ostatnie gry + + + Open shadPS4 Folder + Otwórz folder shadPS4 + + + Exit + Wyjdź + + + Exit shadPS4 + Wyjdź z shadPS4 + + + Exit the application. + Wyjdź z aplikacji. + + + Show Game List + Pokaż listę gier + + + Game List Refresh + Odśwież listę gier + + + Tiny + Malutkie + + + Small + Małe + + + Medium + Średnie + + + Large + Wielkie + + + List View + Widok listy + + + Grid View + Widok siatki + + + Elf Viewer + Menedżer plików ELF + + + Game Install Directory + Katalog zainstalowanych gier + + + Download Cheats/Patches + Pobierz kody / poprawki + + + Dump Game List + Zgraj listę gier + + + PKG Viewer + Menedżer plików PKG + + + Search... + Szukaj... + + + File + Plik + + + View + Widok + + + Game List Icons + Ikony w widoku listy + + + Game List Mode + Tryb listy gier + + + Settings + Ustawienia + + + Utils + Narzędzia + + + Themes + Motywy + + + Help + Pomoc + + + Dark + Ciemny + + + Light + Jasny + + + Green + Zielony + + + Blue + Niebieski + + + Violet + Fioletowy + + + toolBar + Pasek narzędzi + + + Game List + Lista gier + + + * Unsupported Vulkan Version + * Nieobsługiwana wersja Vulkan + + + Download Cheats For All Installed Games + Pobierz kody do wszystkich zainstalowanych gier + + + Download Patches For All Games + Pobierz poprawki do wszystkich gier + + + Download Complete + Pobieranie zakończone + + + You have downloaded cheats for all the games you have installed. + Pobrałeś kody do wszystkich zainstalowanych gier. + + + Patches Downloaded Successfully! + Poprawki pobrane pomyślnie! + + + All Patches available for all games have been downloaded. + Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. + + + Games: + Gry: + + + ELF files (*.bin *.elf *.oelf) + Pliki ELF (*.bin *.elf *.oelf) + + + Game Boot + Uruchomienie gry + + + Only one file can be selected! + Można wybrać tylko jeden plik! + + + PKG Extraction + Wypakowywanie PKG + + + Patch detected! + Wykryto łatkę! + + + PKG and Game versions match: + Wersje PKG i gry są zgodne: + + + Would you like to overwrite? + Czy chcesz nadpisać? + + + PKG Version %1 is older than installed version: + Wersja PKG %1 jest starsza niż zainstalowana wersja: + + + Game is installed: + Gra jest zainstalowana: + + + Would you like to install Patch: + Czy chcesz zainstalować łatkę: + + + DLC Installation + Instalacja DLC + + + Would you like to install DLC: %1? + Czy chcesz zainstalować DLC: %1? + + + DLC already installed: + DLC już zainstalowane: + + + Game already installed + Gra już zainstalowana + + + PKG ERROR + BŁĄD PKG + + + Extracting PKG %1/%2 + Wypakowywanie PKG %1/%2 + + + Extraction Finished + Wypakowywanie zakończone + + + Game successfully installed at %1 + Gra pomyślnie zainstalowana w %1 + + + File doesn't appear to be a valid PKG file + Plik nie wydaje się być prawidłowym plikiem PKG + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Otwórz folder + + + Name + Nazwa + + + Serial + Numer seryjny + + + Installed + + + + Size + Rozmiar + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Region + + + Flags + + + + Path + Ścieżka + + + File + Plik + + + PKG ERROR + BŁĄD PKG + + + Unknown + Nieznany + + + Package + + + + + SettingsDialog + + Settings + Ustawienia + + + General + Ogólne + + + System + System + + + Console Language + Język konsoli + + + Emulator Language + Język emulatora + + + Emulator + Emulator + + + Enable Fullscreen + Włącz pełny ekran + + + Fullscreen Mode + Tryb Pełnoekranowy + + + Enable Separate Update Folder + Włącz oddzielny folder aktualizacji + + + Default tab when opening settings + Domyślna zakładka podczas otwierania ustawień + + + Show Game Size In List + Pokaż rozmiar gry na liście + + + Show Splash + Pokaż ekran powitania + + + Enable Discord Rich Presence + Włącz Discord Rich Presence + + + Username + Nazwa użytkownika + + + Trophy Key + Klucz trofeów + + + Trophy + Trofeum + + + Logger + Dziennik zdarzeń + + + Log Type + Typ dziennika + + + Log Filter + Filtrowanie dziennika + + + Open Log Location + Otwórz lokalizację dziennika + + + Input + Wejście + + + Cursor + Kursor + + + Hide Cursor + Ukryj kursor + + + Hide Cursor Idle Timeout + Czas oczekiwania na ukrycie kursora przy bezczynności + + + s + s + + + Controller + Kontroler + + + Back Button Behavior + Zachowanie przycisku wstecz + + + Graphics + Grafika + + + GUI + Interfejs + + + User + Użytkownik + + + Graphics Device + Karta graficzna + + + Width + Szerokość + + + Height + Wysokość + + + Vblank Divider + Dzielnik przerwy pionowej (Vblank) + + + Advanced + Zaawansowane + + + Enable Shaders Dumping + Włącz zgrywanie cieni + + + Enable NULL GPU + Wyłącz kartę graficzną + + + Paths + Ścieżki + + + Game Folders + Foldery gier + + + Add... + Dodaj... + + + Remove + Usuń + + + Debug + Debugowanie + + + Enable Debug Dumping + Włącz zgrywanie debugowania + + + Enable Vulkan Validation Layers + Włącz warstwy walidacji Vulkan + + + Enable Vulkan Synchronization Validation + Włącz walidację synchronizacji Vulkan + + + Enable RenderDoc Debugging + Włącz debugowanie RenderDoc + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Aktualizacja + + + Check for Updates at Startup + Sprawdź aktualizacje przy starcie + + + Always Show Changelog + Zawsze pokazuj dziennik zmian + + + Update Channel + Kanał Aktualizacji + + + Check for Updates + Sprawdź aktualizacje + + + GUI Settings + Ustawienia Interfejsu + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Wyłącz wyskakujące okienka trofeów + + + Play title music + Odtwórz muzykę tytułową + + + Update Compatibility Database On Startup + Aktualizuj bazę danych zgodności podczas uruchamiania + + + Game Compatibility + Kompatybilność gier + + + Display Compatibility Data + Wyświetl dane zgodności + + + Update Compatibility Database + Aktualizuj bazę danych zgodności + + + Volume + Głośność + + + Save + Zapisz + + + Apply + Zastosuj + + + Restore Defaults + Przywróć ustawienia domyślne + + + Close + Zamknij + + + Point your mouse at an option to display its description. + Najedź kursorem na opcję, aby wyświetlić jej opis. + + + consoleLanguageGroupBox + Język konsoli:\nUstala język, który używa gra PS4.\nZaleca się ustawienie tego na język, który obsługuje gra, co może się różnić w zależności od regionu. + + + emulatorLanguageGroupBox + Język emulatora:\nUstala język interfejsu użytkownika emulatora. + + + fullscreenCheckBox + Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. + + + separateUpdatesCheckBox + Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania. + + + showSplashCheckBox + Wyświetl ekran powitalny:\nPodczas uruchamiania gry wyświetla ekran powitalny (specjalny obraz). + + + discordRPCCheckbox + Włącz Discord Rich Presence:\nWyświetla ikonę emulatora i odpowiednie informacje na twoim profilu Discord. + + + userName + Nazwa użytkownika:\nUstala nazwę użytkownika konta PS4, która może być wyświetlana w niektórych grach. + + + TrophyKey + Klucz trofeów:\nKlucz używany do odszyfrowywania trofeów. Musi być uzyskany z konsoli po jailbreaku. Musi zawierać tylko znaki w kodzie szesnastkowym. + + + logTypeGroupBox + Typ logu:\nUstala, czy synchronizować wyjście okna dziennika dla wydajności. Może to mieć negatywny wpływ na emulację. + + + logFilter + Filtr logu:\nFiltruje dziennik, aby drukować tylko określone informacje.\nPrzykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później. + + + updaterGroupBox + Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. + + + GUIMusicGroupBox + Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. + + + disableTrophycheckBox + Wyłącz wyskakujące okienka trofeów:\nWyłącz powiadomienia o trofeach w grze. Postępy w zdobywaniu trofeów można nadal śledzić za pomocą przeglądarki trofeów (kliknij prawym przyciskiem myszy grę w oknie głównym). + + + hideCursorGroupBox + Ukryj kursor:\nWybierz, kiedy kursor zniknie:\nNigdy: Zawsze będziesz widział myszkę.\nNieaktywny: Ustaw czas, po którym zniknie po bezczynności.\nZawsze: nigdy nie zobaczysz myszki. + + + idleTimeoutGroupBox + Ustaw czas, po którym mysz zniknie po bezczynności. + + + backButtonBehaviorGroupBox + Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4. + + + enableCompatibilityCheckBox + Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję „Aktualizuj zgodność przy uruchomieniu”, aby uzyskać aktualne informacje. + + + checkCompatibilityOnStartupCheckBox + Aktualizuj zgodność przy uruchomieniu:\nAutomatycznie aktualizuj bazę danych kompatybilności podczas uruchamiania shadPS4. + + + updateCompatibilityButton + Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. + + + Never + Nigdy + + + Idle + Bezczynny + + + Always + Zawsze + + + Touchpad Left + Touchpad Lewy + + + Touchpad Right + Touchpad Prawy + + + Touchpad Center + Touchpad Środkowy + + + None + Brak + + + graphicsAdapterGroupBox + Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz "Auto Select", aby ustawić go automatycznie. + + + resolutionLayout + Szerokość/Wysokość:\nUstala rozmiar okna emulatora podczas uruchamiania, który może być zmieniany w trakcie gry.\nTo różni się od rozdzielczości w grze. + + + heightDivider + Dzielnik Vblank:\nWskaźnik klatek, z jakim emulator jest odświeżany, pomnożony przez tę liczbę. Zmiana tego może mieć negatywne skutki, takie jak przyspieszenie gry lub zniszczenie krytycznej funkcjonalności gry, która nie spodziewa się, że to zostanie zmienione! + + + dumpShadersCheckBox + Włącz zrzucanie shaderów:\nDla technicznego debugowania zapisuje shadery z gry w folderze podczas renderowania. + + + nullGpuCheckBox + Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej. + + + gameFoldersBox + Foldery gier:\nLista folderów do sprawdzenia zainstalowanych gier. + + + addFolderButton + Dodaj:\nDodaj folder do listy. + + + removeFolderButton + Usuń:\nUsuń folder z listy. + + + debugDump + Włącz zrzut debugowania:\nZapisuje symbole importu i eksportu oraz informacje nagłówkowe pliku dla aktualnie działającej aplikacji PS4 w katalogu. + + + vkValidationCheckBox + Włącz warstwę walidacji Vulkan:\nWłącza system, który waliduje stan renderera Vulkan i loguje informacje o jego wewnętrznym stanie. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. + + + vkSyncValidationCheckBox + Włącz walidację synchronizacji Vulkan:\nWłącza system, który waliduje timing zadań renderowania Vulkan. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. + + + rdocCheckBox + Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Przeglądaj + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Katalog do instalacji gier + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Menedżer trofeów + + diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 097d17d70..b0dff3d20 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1,1479 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - Sobre o shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Este software não deve ser usado para jogar jogos piratas. - - - - ElfViewer - - Open Folder - Abrir Pasta - - - - GameInfoClass - - Loading game list, please wait :3 - Carregando a lista de jogos, por favor aguarde :3 - - - Cancel - Cancelar - - - Loading... - Carregando... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Escolha o diretório - - - Select which directory you want to install to. - Selecione o diretório em que você deseja instalar. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Escolha o diretório - - - Directory to install games - Diretório para instalar jogos - - - Browse - Procurar - - - Error - Erro - - - The value for location to install games is not valid. - O diretório da instalação dos jogos não é válido. - - - - GuiContextMenus - - Create Shortcut - Criar Atalho - - - Cheats / Patches - Cheats / Patches - - - SFO Viewer - Visualizador de SFO - - - Trophy Viewer - Visualizador de Troféu - - - Open Folder... - Abrir Pasta... - - - Open Game Folder - Abrir Pasta do Jogo - - - Open Save Data Folder - Abrir Pasta de Save - - - Open Log Folder - Abrir Pasta de Log - - - Copy info... - Copiar informação... - - - Copy Name - Copiar Nome - - - Copy Serial - Copiar Serial - - - Copy All - Copiar Tudo - - - Delete... - Deletar... - - - Delete Game - Deletar Jogo - - - Delete Update - Deletar Atualização - - - Delete DLC - Deletar DLC - - - Compatibility... - Compatibilidade... - - - Update database - Atualizar banco de dados - - - View report - Ver status - - - Submit a report - Enviar status - - - Shortcut creation - Criação de atalho - - - Shortcut created successfully! - Atalho criado com sucesso! - - - Error - Erro - - - Error creating shortcut! - Erro ao criar atalho! - - - Install PKG - Instalar PKG - - - Game - Jogo - - - requiresEnableSeparateUpdateFolder_MSG - Este recurso requer a opção de configuração 'Habilitar Pasta de Atualização Separada' para funcionar. Se você quiser usar este recurso, habilite-o. - - - This game has no update to delete! - Este jogo não tem atualização para excluir! - - - Update - Atualização - - - This game has no DLC to delete! - Este jogo não tem DLC para excluir! - - - DLC - DLC - - - Delete %1 - Deletar %1 - - - Are you sure you want to delete %1's %2 directory? - Tem certeza de que deseja excluir o diretório %2 de %1 ? - - - - MainWindow - - Open/Add Elf Folder - Abrir/Adicionar pasta Elf - - - Install Packages (PKG) - Instalar Pacotes (PKG) - - - Boot Game - Iniciar Jogo - - - Check for Updates - Verificar atualizações - - - About shadPS4 - Sobre o shadPS4 - - - Configure... - Configurar... - - - Install application from a .pkg file - Instalar aplicação de um arquivo .pkg - - - Recent Games - Jogos Recentes - - - Open shadPS4 Folder - Abrir pasta shadPS4 - - - Exit - Sair - - - Exit shadPS4 - Sair do shadPS4 - - - Exit the application. - Sair da aplicação. - - - Show Game List - Mostrar Lista de Jogos - - - Game List Refresh - Atualizar Lista de Jogos - - - Tiny - Muito pequeno - - - Small - Pequeno - - - Medium - Médio - - - Large - Grande - - - List View - Visualizar em Lista - - - Grid View - Visualizar em Grade - - - Elf Viewer - Visualizador de Elf - - - Game Install Directory - Diretório de Instalação de Jogos - - - Download Cheats/Patches - Baixar Cheats/Patches - - - Dump Game List - Dumpar Lista de Jogos - - - PKG Viewer - Visualizador de PKG - - - Search... - Pesquisar... - - - File - Arquivo - - - View - Ver - - - Game List Icons - Ícones da Lista de Jogos - - - Game List Mode - Modo da Lista de Jogos - - - Settings - Configurações - - - Utils - Utilitários - - - Themes - Temas - - - Help - Ajuda - - - Dark - Escuro - - - Light - Claro - - - Green - Verde - - - Blue - Azul - - - Violet - Violeta - - - toolBar - Barra de Ferramentas - - - Game List - Lista de Jogos - - - * Unsupported Vulkan Version - * Versão Vulkan não suportada - - - Download Cheats For All Installed Games - Baixar Cheats para Todos os Jogos Instalados - - - Download Patches For All Games - Baixar Patches para Todos os Jogos - - - Download Complete - Download Completo - - - You have downloaded cheats for all the games you have installed. - Você baixou cheats para todos os jogos que instalou. - - - Patches Downloaded Successfully! - Patches Baixados com Sucesso! - - - All Patches available for all games have been downloaded. - Todos os patches disponíveis para todos os jogos foram baixados. - - - Games: - Jogos: - - - PKG File (*.PKG) - Arquivo PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Arquivos ELF (*.bin *.elf *.oelf) - - - Game Boot - Inicialização do Jogo - - - Only one file can be selected! - Apenas um arquivo pode ser selecionado! - - - PKG Extraction - Extração de PKG - - - Patch detected! - Atualização detectada! - - - PKG and Game versions match: - As versões do PKG e do Jogo são igual: - - - Would you like to overwrite? - Gostaria de substituir? - - - PKG Version %1 is older than installed version: - Versão do PKG %1 é mais antiga do que a versão instalada: - - - Game is installed: - Jogo instalado: - - - Would you like to install Patch: - Você gostaria de instalar a atualização: - - - DLC Installation - Instalação de DLC - - - Would you like to install DLC: %1? - Você gostaria de instalar o DLC: %1? - - - DLC already installed: - DLC já instalada: - - - Game already installed - O jogo já está instalado: - - - PKG is a patch, please install the game first! - O PKG é um patch, por favor, instale o jogo primeiro! - - - PKG ERROR - ERRO de PKG - - - Extracting PKG %1/%2 - Extraindo PKG %1/%2 - - - Extraction Finished - Extração Concluída - - - Game successfully installed at %1 - Jogo instalado com sucesso em %1 - - - File doesn't appear to be a valid PKG file - O arquivo não parece ser um arquivo PKG válido - - - - PKGViewer - - Open Folder - Abrir Pasta - - - - TrophyViewer - - Trophy Viewer - Visualizador de Troféu - - - - SettingsDialog - - Settings - Configurações - - - General - Geral - - - System - Sistema - - - Console Language - Idioma do Console - - - Emulator Language - Idioma do Emulador - - - Emulator - Emulador - - - Enable Fullscreen - Habilitar Tela Cheia - - - Fullscreen Mode - Modo de Tela Cheia - - - Enable Separate Update Folder - Habilitar pasta de atualização separada - - - Default tab when opening settings - Aba padrão ao abrir as configurações - - - Show Game Size In List - Mostrar Tamanho do Jogo na Lista - - - Show Splash - Mostrar Splash Inicial - - - Is PS4 Pro - Modo PS4 Pro - - - Enable Discord Rich Presence - Habilitar Discord Rich Presence - - - Username - Nome de usuário - - - Trophy Key - Chave de Troféu - - - Trophy - Troféus - - - Logger - Registro-Log - - - Log Type - Tipo de Registro - - - Log Filter - Filtro do Registro - - - Open Log Location - Abrir local do registro - - - Input - Entradas - - - Cursor - Cursor - - - Hide Cursor - Ocultar Cursor - - - Hide Cursor Idle Timeout - Tempo de Inatividade para Ocultar Cursor - - - s - s - - - Controller - Controle - - - Back Button Behavior - Comportamento do botão Voltar - - - Graphics - Gráficos - - - GUI - Interface - - - User - Usuário - - - Graphics Device - Placa de Vídeo - - - Width - Largura - - - Height - Altura - - - Vblank Divider - Divisor Vblank - - - Advanced - Avançado - - - Enable Shaders Dumping - Habilitar Dumping de Shaders - - - Enable NULL GPU - Habilitar GPU NULA - - - Paths - Pastas - - - Game Folders - Pastas dos Jogos - - - Add... - Adicionar... - - - Remove - Remover - - - Debug - Depuração - - - Enable Debug Dumping - Habilitar Depuração de Dumping - - - Enable Vulkan Validation Layers - Habilitar Camadas de Validação do Vulkan - - - Enable Vulkan Synchronization Validation - Habilitar Validação de Sincronização do Vulkan - - - Enable RenderDoc Debugging - Habilitar Depuração do RenderDoc - - - Enable Crash Diagnostics - Habilitar Diagnóstico de Falhas - - - Collect Shaders - Coletar Shaders - - - Copy GPU Buffers - Copiar Buffers de GPU - - - Host Debug Markers - Marcadores de Depuração do Host - - - Guest Debug Markers - Marcadores de Depuração do Convidado - - - Update - Atualização - - - Check for Updates at Startup - Verificar Atualizações ao Iniciar - - - Always Show Changelog - Sempre Mostrar o Changelog - - - Update Channel - Canal de Atualização - - - Check for Updates - Verificar atualizações - - - GUI Settings - Configurações da Interface - - - Title Music - Música no Menu - - - Disable Trophy Pop-ups - Desabilitar Pop-ups dos Troféus - - - Play title music - Reproduzir música de abertura - - - Update Compatibility Database On Startup - Atualizar Compatibilidade ao Inicializar - - - Game Compatibility - Compatibilidade dos Jogos - - - Display Compatibility Data - Exibir Dados de Compatibilidade - - - Update Compatibility Database - Atualizar Lista de Compatibilidade - - - Volume - Volume - - - Audio Backend - Backend de Áudio - - - Save - Salvar - - - Apply - Aplicar - - - Restore Defaults - Restaurar Padrões - - - Close - Fechar - - - Point your mouse at an option to display its description. - Passe o mouse sobre uma opção para exibir sua descrição. - - - consoleLanguageGroupBox - Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. - - - emulatorLanguageGroupBox - Idioma do emulador:\nDefine o idioma da interface do emulador. - - - fullscreenCheckBox - Habilitar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. - - - separateUpdatesCheckBox - Habilitar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento. - - - showSplashCheckBox - Mostrar Splash Inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo. - - - ps4proCheckBox - Modo PS4 Pro:\nFaz o emulador agir como um PS4 PRO, o que pode ativar recursos especiais em jogos que o suportam. - - - discordRPCCheckbox - Habilitar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. - - - userName - Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. - - - logFilter - Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. - - - updaterGroupBox - Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. - - - chooseHomeTabGroupBox - do menu. - - - GUIMusicGroupBox - Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. - - - disableTrophycheckBox - Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal). - - - hideCursorGroupBox - Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Você sempre verá o mouse.\nParado: Defina um tempo para ele desaparecer após ficar inativo.\nSempre: Você nunca verá o mouse. - - - idleTimeoutGroupBox - Defina um tempo em segundos para o mouse desaparecer após ficar inativo. - - - backButtonBehaviorGroupBox - Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4. - - - enableCompatibilityCheckBox - Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. - - - checkCompatibilityOnStartupCheckBox - Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado. - - - updateCompatibilityButton - Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade. - - - Never - Nunca - - - Idle - Parado - - - Always - Sempre - - - Touchpad Left - Touchpad Esquerdo - - - Touchpad Right - Touchpad Direito - - - Touchpad Center - Touchpad Centro - - - None - Nenhum - - - graphicsAdapterGroupBox - Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. - - - resolutionLayout - Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. - - - heightDivider - Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! - - - dumpShadersCheckBox - Habilitar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. - - - nullGpuCheckBox - Habilitar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. - - - gameFoldersBox - Pastas dos jogos:\nA lista de pastas para verificar se há jogos instalados. - - - addFolderButton - Adicionar:\nAdicione uma pasta à lista. - - - removeFolderButton - Remover:\nRemove uma pasta da lista. - - - debugDump - Habilitar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. - - - vkValidationCheckBox - Habilitar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - - - vkSyncValidationCheckBox - Habilitar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - - - rdocCheckBox - Habilitar Depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. - - - collectShaderCheckBox - Coletar Shaders:\nVocê precisa habilitar isso para editar shaders com o menu de depuração (Ctrl + F10). - - - crashDiagnosticsCheckBox - Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depurar erros de 'Device lost'. Se você tiver isso habilitado, você deve habilitar os Marcadores de Depuração de Host e de Convidado.\nNão funciona em GPUs da Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o SDK do Vulkan para que isso funcione. - - - copyGPUBuffersCheckBox - Copiar Buffers de GPU:\nContorna condições de corrida envolvendo envios de GPU.\nPode ou não ajudar com travamentos do PM4 tipo 0. - - - hostMarkersCheckBox - Marcadores de Depuração de Host:\nInsere informações do lado do emulador, como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, você deve habilitar o "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. - - - guestMarkersCheckBox - Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, você deve habilitar "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches para - - - defaultTextEdit_MSG - Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Imagem Não Disponível - - - Serial: - Serial: - - - Version: - Versão: - - - Size: - Tamanho: - - - Select Cheat File: - Selecione o Arquivo de Cheat: - - - Repository: - Repositório: - - - Download Cheats - Baixar Cheats - - - Delete File - Excluir Arquivo - - - No files selected. - Nenhum arquivo selecionado. - - - You can delete the cheats you don't want after downloading them. - Você pode excluir os cheats que não deseja após baixá-las. - - - Do you want to delete the selected file?\n%1 - Deseja excluir o arquivo selecionado?\n%1 - - - Select Patch File: - Selecione o Arquivo de Patch: - - - Download Patches - Baixar Patches - - - Save - Salvar - - - Cheats - Cheats - - - Patches - Patches - - - Error - Erro - - - No patch selected. - Nenhum patch selecionado. - - - Unable to open files.json for reading. - Não foi possível abrir files.json para leitura. - - - No patch file found for the current serial. - Nenhum arquivo de patch encontrado para o serial atual. - - - Unable to open the file for reading. - Não foi possível abrir o arquivo para leitura. - - - Unable to open the file for writing. - Não foi possível abrir o arquivo para gravação. - - - Failed to parse XML: - Falha ao analisar XML: - - - Success - Sucesso - - - Options saved successfully. - Opções salvas com sucesso. - - - Invalid Source - Fonte Inválida - - - The selected source is invalid. - A fonte selecionada é inválida. - - - File Exists - Arquivo Existe - - - File already exists. Do you want to replace it? - O arquivo já existe. Deseja substituí-lo? - - - Failed to save file: - Falha ao salvar o arquivo: - - - Failed to download file: - Falha ao baixar o arquivo: - - - Cheats Not Found - Cheats Não Encontrados - - - CheatsNotFound_MSG - Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. - - - Cheats Downloaded Successfully - Cheats Baixados com Sucesso - - - CheatsDownloadedSuccessfully_MSG - Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. - - - Failed to save: - Falha ao salvar: - - - Failed to download: - Falha ao baixar: - - - Download Complete - Download Completo - - - DownloadComplete_MSG - Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. - - - Failed to parse JSON data from HTML. - Falha ao analisar dados JSON do HTML. - - - Failed to retrieve HTML page. - Falha ao recuperar a página HTML. - - - The game is in version: %1 - O jogo está na versão: %1 - - - The downloaded patch only works on version: %1 - O patch baixado só funciona na versão: %1 - - - You may need to update your game. - Talvez você precise atualizar seu jogo. - - - Incompatibility Notice - Aviso de incompatibilidade - - - Failed to open file: - Falha ao abrir o arquivo: - - - XML ERROR: - ERRO de XML: - - - Failed to open files.json for writing - Falha ao abrir files.json para gravação - - - Author: - Autor: - - - Directory does not exist: - O Diretório não existe: - - - Failed to open files.json for reading. - Falha ao abrir files.json para leitura. - - - Name: - Nome: - - - Can't apply cheats before the game is started - Não é possível aplicar cheats antes que o jogo comece. - - - - GameListFrame - - Icon - Icone - - - Name - Nome - - - Serial - Serial - - - Compatibility - Compatibilidade - - - Region - Região - - - Firmware - Firmware - - - Size - Tamanho - - - Version - Versão - - - Path - Diretório - - - Play Time - Tempo Jogado - - - Never Played - Nunca jogado - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibilidade não testada - - - Game does not initialize properly / crashes the emulator - Jogo não inicializa corretamente / trava o emulador - - - Game boots, but only displays a blank screen - O jogo inicializa, mas exibe apenas uma tela vazia - - - Game displays an image but does not go past the menu - Jogo exibe imagem mas não passa do menu - - - Game has game-breaking glitches or unplayable performance - O jogo tem falhas que interrompem o jogo ou desempenho injogável - - - Game can be completed with playable performance and no major glitches - O jogo pode ser concluído com desempenho jogável e sem grandes falhas - - - Click to see details on github - Clique para ver detalhes no github - - - Last updated - Última atualização - - - - CheckUpdate - - Auto Updater - Atualizador automático - - - Error - Erro - - - Network error: - Erro de rede: - - - Error_Github_limit_MSG - O Atualizador Automático permite até 60 verificações de atualização por hora.\nVocê atingiu esse limite. Por favor, tente novamente mais tarde. - - - Failed to parse update information. - Falha ao analisar as informações de atualização. - - - No pre-releases found. - Nenhuma pre-release encontrada. - - - Invalid release data. - Dados da release inválidos. - - - No download URL found for the specified asset. - Nenhuma URL de download encontrada para o asset especificado. - - - Your version is already up to date! - Sua versão já está atualizada! - - - Update Available - Atualização disponível - - - Update Channel - Canal de Atualização - - - Current Version - Versão atual - - - Latest Version - Última versão - - - Do you want to update? - Você quer atualizar? - - - Show Changelog - Mostrar Changelog - - - Check for Updates at Startup - Verificar Atualizações ao Iniciar - - - Update - Atualizar - - - No - Não - - - Hide Changelog - Ocultar Changelog - - - Changes - Alterações - - - Network error occurred while trying to access the URL - Ocorreu um erro de rede ao tentar acessar o URL - - - Download Complete - Download Completo - - - The update has been downloaded, press OK to install. - A atualização foi baixada, pressione OK para instalar. - - - Failed to save the update file at - Falha ao salvar o arquivo de atualização em - - - Starting Update... - Iniciando atualização... - - - Failed to create the update script file - Falha ao criar o arquivo de script de atualização - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Obtendo dados de compatibilidade, por favor aguarde - - - Cancel - Cancelar - - - Loading... - Carregando... - - - Error - Erro - - - Unable to update compatibility data! Try again later. - Não foi possível atualizar os dados de compatibilidade! Tente novamente mais tarde. - - - Unable to open compatibility_data.json for writing. - Não foi possível abrir o compatibility_data.json para escrita. - - - Unknown - Desconhecido - - - Nothing - Nada - - - Boots - Boot - - - Menus - Menus - - - Ingame - Em jogo - - - Playable - Jogável - - + + AboutDialog + + About shadPS4 + Sobre o shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Este software não deve ser usado para jogar jogos piratas. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches para + + + defaultTextEdit_MSG + Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Imagem Não Disponível + + + Serial: + Serial: + + + Version: + Versão: + + + Size: + Tamanho: + + + Select Cheat File: + Selecione o Arquivo de Cheat: + + + Repository: + Repositório: + + + Download Cheats + Baixar Cheats + + + Delete File + Excluir Arquivo + + + No files selected. + Nenhum arquivo selecionado. + + + You can delete the cheats you don't want after downloading them. + Você pode excluir os cheats que não deseja após baixá-las. + + + Do you want to delete the selected file?\n%1 + Deseja excluir o arquivo selecionado?\n%1 + + + Select Patch File: + Selecione o Arquivo de Patch: + + + Download Patches + Baixar Patches + + + Save + Salvar + + + Cheats + Cheats + + + Patches + Patches + + + Error + Erro + + + No patch selected. + Nenhum patch selecionado. + + + Unable to open files.json for reading. + Não foi possível abrir files.json para leitura. + + + No patch file found for the current serial. + Nenhum arquivo de patch encontrado para o serial atual. + + + Unable to open the file for reading. + Não foi possível abrir o arquivo para leitura. + + + Unable to open the file for writing. + Não foi possível abrir o arquivo para gravação. + + + Failed to parse XML: + Falha ao analisar XML: + + + Success + Sucesso + + + Options saved successfully. + Opções salvas com sucesso. + + + Invalid Source + Fonte Inválida + + + The selected source is invalid. + A fonte selecionada é inválida. + + + File Exists + Arquivo Existe + + + File already exists. Do you want to replace it? + O arquivo já existe. Deseja substituí-lo? + + + Failed to save file: + Falha ao salvar o arquivo: + + + Failed to download file: + Falha ao baixar o arquivo: + + + Cheats Not Found + Cheats Não Encontrados + + + CheatsNotFound_MSG + Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. + + + Cheats Downloaded Successfully + Cheats Baixados com Sucesso + + + CheatsDownloadedSuccessfully_MSG + Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. + + + Failed to save: + Falha ao salvar: + + + Failed to download: + Falha ao baixar: + + + Download Complete + Download Completo + + + DownloadComplete_MSG + Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. + + + Failed to parse JSON data from HTML. + Falha ao analisar dados JSON do HTML. + + + Failed to retrieve HTML page. + Falha ao recuperar a página HTML. + + + The game is in version: %1 + O jogo está na versão: %1 + + + The downloaded patch only works on version: %1 + O patch baixado só funciona na versão: %1 + + + You may need to update your game. + Talvez você precise atualizar seu jogo. + + + Incompatibility Notice + Aviso de incompatibilidade + + + Failed to open file: + Falha ao abrir o arquivo: + + + XML ERROR: + ERRO de XML: + + + Failed to open files.json for writing + Falha ao abrir files.json para gravação + + + Author: + Autor: + + + Directory does not exist: + O Diretório não existe: + + + Failed to open files.json for reading. + Falha ao abrir files.json para leitura. + + + Name: + Nome: + + + Can't apply cheats before the game is started + Não é possível aplicar cheats antes que o jogo comece. + + + Close + Fechar + + + + CheckUpdate + + Auto Updater + Atualizador automático + + + Error + Erro + + + Network error: + Erro de rede: + + + Error_Github_limit_MSG + O Atualizador Automático permite até 60 verificações de atualização por hora.\nVocê atingiu esse limite. Por favor, tente novamente mais tarde. + + + Failed to parse update information. + Falha ao analisar as informações de atualização. + + + No pre-releases found. + Nenhuma pre-release encontrada. + + + Invalid release data. + Dados da release inválidos. + + + No download URL found for the specified asset. + Nenhuma URL de download encontrada para o asset especificado. + + + Your version is already up to date! + Sua versão já está atualizada! + + + Update Available + Atualização disponível + + + Update Channel + Canal de Atualização + + + Current Version + Versão atual + + + Latest Version + Última versão + + + Do you want to update? + Você quer atualizar? + + + Show Changelog + Mostrar Changelog + + + Check for Updates at Startup + Verificar Atualizações ao Iniciar + + + Update + Atualizar + + + No + Não + + + Hide Changelog + Ocultar Changelog + + + Changes + Alterações + + + Network error occurred while trying to access the URL + Ocorreu um erro de rede ao tentar acessar o URL + + + Download Complete + Download Completo + + + The update has been downloaded, press OK to install. + A atualização foi baixada, pressione OK para instalar. + + + Failed to save the update file at + Falha ao salvar o arquivo de atualização em + + + Starting Update... + Iniciando atualização... + + + Failed to create the update script file + Falha ao criar o arquivo de script de atualização + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Obtendo dados de compatibilidade, por favor aguarde + + + Cancel + Cancelar + + + Loading... + Carregando... + + + Error + Erro + + + Unable to update compatibility data! Try again later. + Não foi possível atualizar os dados de compatibilidade! Tente novamente mais tarde. + + + Unable to open compatibility_data.json for writing. + Não foi possível abrir o compatibility_data.json para escrita. + + + Unknown + Desconhecido + + + Nothing + Nada + + + Boots + Boot + + + Menus + Menus + + + Ingame + Em jogo + + + Playable + Jogável + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Abrir Pasta + + + + GameInfoClass + + Loading game list, please wait :3 + Carregando a lista de jogos, por favor aguarde :3 + + + Cancel + Cancelar + + + Loading... + Carregando... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Escolha o diretório + + + Directory to install games + Diretório para instalar jogos + + + Browse + Procurar + + + Error + Erro + + + Directory to install DLC + + + + + GameListFrame + + Icon + Icone + + + Name + Nome + + + Serial + Serial + + + Compatibility + Compatibilidade + + + Region + Região + + + Firmware + Firmware + + + Size + Tamanho + + + Version + Versão + + + Path + Diretório + + + Play Time + Tempo Jogado + + + Never Played + Nunca jogado + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibilidade não testada + + + Game does not initialize properly / crashes the emulator + Jogo não inicializa corretamente / trava o emulador + + + Game boots, but only displays a blank screen + O jogo inicializa, mas exibe apenas uma tela vazia + + + Game displays an image but does not go past the menu + Jogo exibe imagem mas não passa do menu + + + Game has game-breaking glitches or unplayable performance + O jogo tem falhas que interrompem o jogo ou desempenho injogável + + + Game can be completed with playable performance and no major glitches + O jogo pode ser concluído com desempenho jogável e sem grandes falhas + + + Click to see details on github + Clique para ver detalhes no github + + + Last updated + Última atualização + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Criar Atalho + + + Cheats / Patches + Cheats / Patches + + + SFO Viewer + Visualizador de SFO + + + Trophy Viewer + Visualizador de Troféu + + + Open Folder... + Abrir Pasta... + + + Open Game Folder + Abrir Pasta do Jogo + + + Open Save Data Folder + Abrir Pasta de Save + + + Open Log Folder + Abrir Pasta de Log + + + Copy info... + Copiar informação... + + + Copy Name + Copiar Nome + + + Copy Serial + Copiar Serial + + + Copy All + Copiar Tudo + + + Delete... + Deletar... + + + Delete Game + Deletar Jogo + + + Delete Update + Deletar Atualização + + + Delete DLC + Deletar DLC + + + Compatibility... + Compatibilidade... + + + Update database + Atualizar banco de dados + + + View report + Ver status + + + Submit a report + Enviar status + + + Shortcut creation + Criação de atalho + + + Shortcut created successfully! + Atalho criado com sucesso! + + + Error + Erro + + + Error creating shortcut! + Erro ao criar atalho! + + + Install PKG + Instalar PKG + + + Game + Jogo + + + This game has no update to delete! + Este jogo não tem atualização para excluir! + + + Update + Atualização + + + This game has no DLC to delete! + Este jogo não tem DLC para excluir! + + + DLC + DLC + + + Delete %1 + Deletar %1 + + + Are you sure you want to delete %1's %2 directory? + Tem certeza de que deseja excluir o diretório %2 de %1 ? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Escolha o diretório + + + Select which directory you want to install to. + Selecione o diretório em que você deseja instalar. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Abrir/Adicionar pasta Elf + + + Install Packages (PKG) + Instalar Pacotes (PKG) + + + Boot Game + Iniciar Jogo + + + Check for Updates + Verificar atualizações + + + About shadPS4 + Sobre o shadPS4 + + + Configure... + Configurar... + + + Install application from a .pkg file + Instalar aplicação de um arquivo .pkg + + + Recent Games + Jogos Recentes + + + Open shadPS4 Folder + Abrir pasta shadPS4 + + + Exit + Sair + + + Exit shadPS4 + Sair do shadPS4 + + + Exit the application. + Sair da aplicação. + + + Show Game List + Mostrar Lista de Jogos + + + Game List Refresh + Atualizar Lista de Jogos + + + Tiny + Muito pequeno + + + Small + Pequeno + + + Medium + Médio + + + Large + Grande + + + List View + Visualizar em Lista + + + Grid View + Visualizar em Grade + + + Elf Viewer + Visualizador de Elf + + + Game Install Directory + Diretório de Instalação de Jogos + + + Download Cheats/Patches + Baixar Cheats/Patches + + + Dump Game List + Dumpar Lista de Jogos + + + PKG Viewer + Visualizador de PKG + + + Search... + Pesquisar... + + + File + Arquivo + + + View + Ver + + + Game List Icons + Ícones da Lista de Jogos + + + Game List Mode + Modo da Lista de Jogos + + + Settings + Configurações + + + Utils + Utilitários + + + Themes + Temas + + + Help + Ajuda + + + Dark + Escuro + + + Light + Claro + + + Green + Verde + + + Blue + Azul + + + Violet + Violeta + + + toolBar + Barra de Ferramentas + + + Game List + Lista de Jogos + + + * Unsupported Vulkan Version + * Versão Vulkan não suportada + + + Download Cheats For All Installed Games + Baixar Cheats para Todos os Jogos Instalados + + + Download Patches For All Games + Baixar Patches para Todos os Jogos + + + Download Complete + Download Completo + + + You have downloaded cheats for all the games you have installed. + Você baixou cheats para todos os jogos que instalou. + + + Patches Downloaded Successfully! + Patches Baixados com Sucesso! + + + All Patches available for all games have been downloaded. + Todos os patches disponíveis para todos os jogos foram baixados. + + + Games: + Jogos: + + + ELF files (*.bin *.elf *.oelf) + Arquivos ELF (*.bin *.elf *.oelf) + + + Game Boot + Inicialização do Jogo + + + Only one file can be selected! + Apenas um arquivo pode ser selecionado! + + + PKG Extraction + Extração de PKG + + + Patch detected! + Atualização detectada! + + + PKG and Game versions match: + As versões do PKG e do Jogo são igual: + + + Would you like to overwrite? + Gostaria de substituir? + + + PKG Version %1 is older than installed version: + Versão do PKG %1 é mais antiga do que a versão instalada: + + + Game is installed: + Jogo instalado: + + + Would you like to install Patch: + Você gostaria de instalar a atualização: + + + DLC Installation + Instalação de DLC + + + Would you like to install DLC: %1? + Você gostaria de instalar o DLC: %1? + + + DLC already installed: + DLC já instalada: + + + Game already installed + O jogo já está instalado: + + + PKG ERROR + ERRO de PKG + + + Extracting PKG %1/%2 + Extraindo PKG %1/%2 + + + Extraction Finished + Extração Concluída + + + Game successfully installed at %1 + Jogo instalado com sucesso em %1 + + + File doesn't appear to be a valid PKG file + O arquivo não parece ser um arquivo PKG válido + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Abrir Pasta + + + Name + Nome + + + Serial + Serial + + + Installed + + + + Size + Tamanho + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Região + + + Flags + + + + Path + Diretório + + + File + Arquivo + + + PKG ERROR + ERRO de PKG + + + Unknown + Desconhecido + + + Package + + + + + SettingsDialog + + Settings + Configurações + + + General + Geral + + + System + Sistema + + + Console Language + Idioma do Console + + + Emulator Language + Idioma do Emulador + + + Emulator + Emulador + + + Enable Fullscreen + Habilitar Tela Cheia + + + Fullscreen Mode + Modo de Tela Cheia + + + Enable Separate Update Folder + Habilitar pasta de atualização separada + + + Default tab when opening settings + Aba padrão ao abrir as configurações + + + Show Game Size In List + Mostrar Tamanho do Jogo na Lista + + + Show Splash + Mostrar Splash Inicial + + + Enable Discord Rich Presence + Habilitar Discord Rich Presence + + + Username + Nome de usuário + + + Trophy Key + Chave de Troféu + + + Trophy + Troféus + + + Logger + Registro-Log + + + Log Type + Tipo de Registro + + + Log Filter + Filtro do Registro + + + Open Log Location + Abrir local do registro + + + Input + Entradas + + + Cursor + Cursor + + + Hide Cursor + Ocultar Cursor + + + Hide Cursor Idle Timeout + Tempo de Inatividade para Ocultar Cursor + + + s + s + + + Controller + Controle + + + Back Button Behavior + Comportamento do botão Voltar + + + Graphics + Gráficos + + + GUI + Interface + + + User + Usuário + + + Graphics Device + Placa de Vídeo + + + Width + Largura + + + Height + Altura + + + Vblank Divider + Divisor Vblank + + + Advanced + Avançado + + + Enable Shaders Dumping + Habilitar Dumping de Shaders + + + Enable NULL GPU + Habilitar GPU NULA + + + Paths + Pastas + + + Game Folders + Pastas dos Jogos + + + Add... + Adicionar... + + + Remove + Remover + + + Debug + Depuração + + + Enable Debug Dumping + Habilitar Depuração de Dumping + + + Enable Vulkan Validation Layers + Habilitar Camadas de Validação do Vulkan + + + Enable Vulkan Synchronization Validation + Habilitar Validação de Sincronização do Vulkan + + + Enable RenderDoc Debugging + Habilitar Depuração do RenderDoc + + + Enable Crash Diagnostics + Habilitar Diagnóstico de Falhas + + + Collect Shaders + Coletar Shaders + + + Copy GPU Buffers + Copiar Buffers de GPU + + + Host Debug Markers + Marcadores de Depuração do Host + + + Guest Debug Markers + Marcadores de Depuração do Convidado + + + Update + Atualização + + + Check for Updates at Startup + Verificar Atualizações ao Iniciar + + + Always Show Changelog + Sempre Mostrar o Changelog + + + Update Channel + Canal de Atualização + + + Check for Updates + Verificar atualizações + + + GUI Settings + Configurações da Interface + + + Title Music + Música no Menu + + + Disable Trophy Pop-ups + Desabilitar Pop-ups dos Troféus + + + Play title music + Reproduzir música de abertura + + + Update Compatibility Database On Startup + Atualizar Compatibilidade ao Inicializar + + + Game Compatibility + Compatibilidade dos Jogos + + + Display Compatibility Data + Exibir Dados de Compatibilidade + + + Update Compatibility Database + Atualizar Lista de Compatibilidade + + + Volume + Volume + + + Save + Salvar + + + Apply + Aplicar + + + Restore Defaults + Restaurar Padrões + + + Close + Fechar + + + Point your mouse at an option to display its description. + Passe o mouse sobre uma opção para exibir sua descrição. + + + consoleLanguageGroupBox + Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. + + + emulatorLanguageGroupBox + Idioma do emulador:\nDefine o idioma da interface do emulador. + + + fullscreenCheckBox + Habilitar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. + + + separateUpdatesCheckBox + Habilitar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento. + + + showSplashCheckBox + Mostrar Splash Inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo. + + + discordRPCCheckbox + Habilitar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. + + + userName + Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. + + + logFilter + Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. + + + updaterGroupBox + Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. + + + GUIMusicGroupBox + Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. + + + disableTrophycheckBox + Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal). + + + hideCursorGroupBox + Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Você sempre verá o mouse.\nParado: Defina um tempo para ele desaparecer após ficar inativo.\nSempre: Você nunca verá o mouse. + + + idleTimeoutGroupBox + Defina um tempo em segundos para o mouse desaparecer após ficar inativo. + + + backButtonBehaviorGroupBox + Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4. + + + enableCompatibilityCheckBox + Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. + + + checkCompatibilityOnStartupCheckBox + Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado. + + + updateCompatibilityButton + Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade. + + + Never + Nunca + + + Idle + Parado + + + Always + Sempre + + + Touchpad Left + Touchpad Esquerdo + + + Touchpad Right + Touchpad Direito + + + Touchpad Center + Touchpad Centro + + + None + Nenhum + + + graphicsAdapterGroupBox + Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. + + + resolutionLayout + Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. + + + heightDivider + Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! + + + dumpShadersCheckBox + Habilitar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. + + + nullGpuCheckBox + Habilitar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. + + + gameFoldersBox + Pastas dos jogos:\nA lista de pastas para verificar se há jogos instalados. + + + addFolderButton + Adicionar:\nAdicione uma pasta à lista. + + + removeFolderButton + Remover:\nRemove uma pasta da lista. + + + debugDump + Habilitar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. + + + vkValidationCheckBox + Habilitar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + + + vkSyncValidationCheckBox + Habilitar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + + + rdocCheckBox + Habilitar Depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. + + + collectShaderCheckBox + Coletar Shaders:\nVocê precisa habilitar isso para editar shaders com o menu de depuração (Ctrl + F10). + + + crashDiagnosticsCheckBox + Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depurar erros de 'Device lost'. Se você tiver isso habilitado, você deve habilitar os Marcadores de Depuração de Host e de Convidado.\nNão funciona em GPUs da Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o SDK do Vulkan para que isso funcione. + + + copyGPUBuffersCheckBox + Copiar Buffers de GPU:\nContorna condições de corrida envolvendo envios de GPU.\nPode ou não ajudar com travamentos do PM4 tipo 0. + + + hostMarkersCheckBox + Marcadores de Depuração de Host:\nInsere informações do lado do emulador, como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, você deve habilitar o "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. + + + guestMarkersCheckBox + Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, você deve habilitar "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Procurar + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Diretório para instalar jogos + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Visualizador de Troféu + + diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 1d2741bd4..c07aa99c4 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Trapaças / Patches - Coduri / Patch-uri - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Deschide Folder... - - - Open Game Folder - Deschide Folder Joc - - - Open Save Data Folder - Deschide Folder Date Salvate - - - Open Log Folder - Deschide Folder Jurnal - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Verifică actualizările - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Descarcă Coduri / Patch-uri - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Ajutor - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Lista jocurilor - - - * Unsupported Vulkan Version - * Versiune Vulkan nesuportată - - - Download Cheats For All Installed Games - Descarcă Cheats pentru toate jocurile instalate - - - Download Patches For All Games - Descarcă Patches pentru toate jocurile - - - Download Complete - Descărcare completă - - - You have downloaded cheats for all the games you have installed. - Ai descărcat cheats pentru toate jocurile instalate. - - - Patches Downloaded Successfully! - Patches descărcate cu succes! - - - All Patches available for all games have been downloaded. - Toate Patches disponibile pentru toate jocurile au fost descărcate. - - - Games: - Jocuri: - - - PKG File (*.PKG) - Fișier PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Fișiere ELF (*.bin *.elf *.oelf) - - - Game Boot - Boot Joc - - - Only one file can be selected! - Numai un fișier poate fi selectat! - - - PKG Extraction - Extracție PKG - - - Patch detected! - Patch detectat! - - - PKG and Game versions match: - Versiunile PKG și ale jocului sunt compatibile: - - - Would you like to overwrite? - Doriți să suprascrieți? - - - PKG Version %1 is older than installed version: - Versiunea PKG %1 este mai veche decât versiunea instalată: - - - Game is installed: - Jocul este instalat: - - - Would you like to install Patch: - Doriți să instalați patch-ul: - - - DLC Installation - Instalare DLC - - - Would you like to install DLC: %1? - Doriți să instalați DLC-ul: %1? - - - DLC already installed: - DLC deja instalat: - - - Game already installed - Jocul deja instalat - - - PKG is a patch, please install the game first! - PKG este un patch, te rugăm să instalezi mai întâi jocul! - - - PKG ERROR - EROARE PKG - - - Extracting PKG %1/%2 - Extracție PKG %1/%2 - - - Extraction Finished - Extracție terminată - - - Game successfully installed at %1 - Jocul a fost instalat cu succes la %1 - - - File doesn't appear to be a valid PKG file - Fișierul nu pare să fie un fișier PKG valid - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Mod Ecran Complet - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Tab-ul implicit la deschiderea setărilor - - - Show Game Size In List - Afișează dimensiunea jocului în listă - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Activați Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Deschide locația jurnalului - - - Input - Introducere - - - Cursor - Cursor - - - Hide Cursor - Ascunde cursorul - - - Hide Cursor Idle Timeout - Timeout pentru ascunderea cursorului inactiv - - - s - s - - - Controller - Controler - - - Back Button Behavior - Comportament buton înapoi - - - Graphics - Graphics - - - GUI - Interfață - - - User - Utilizator - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Trasee - - - Game Folders - Dosare de joc - - - Add... - Adaugă... - - - Remove - Eliminare - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Actualizare - - - Check for Updates at Startup - Verifică actualizări la pornire - - - Always Show Changelog - Arată întotdeauna jurnalul modificărilor - - - Update Channel - Canal de Actualizare - - - Check for Updates - Verifică actualizări - - - GUI Settings - Setări GUI - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Redă muzica titlului - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Volum - - - Audio Backend - Audio Backend - - - Save - Salvează - - - Apply - Aplică - - - Restore Defaults - Restabilește Impozitivele - - - Close - Închide - - - Point your mouse at an option to display its description. - Indicați mouse-ul asupra unei opțiuni pentru a afișa descrierea acesteia. - - - consoleLanguageGroupBox - Limba consolei:\nSetează limba pe care o folosește jocul PS4.\nSe recomandă să setezi această opțiune pe o limbă pe care jocul o suportă, ceea ce poate varia în funcție de regiune. - - - emulatorLanguageGroupBox - Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. - - - fullscreenCheckBox - Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Afișează ecranul de încărcare:\nAfișează ecranul de încărcare al jocului (o imagine specială) în timp ce jocul pornește. - - - ps4proCheckBox - Este PS4 Pro:\nFace ca emulatorul să se comporte ca un PS4 PRO, ceea ce poate activa funcții speciale în jocurile care o suportă. - - - discordRPCCheckbox - Activați Discord Rich Presence:\nAfișează pictograma emulatorului și informații relevante pe profilul dumneavoastră Discord. - - - userName - Nume utilizator:\nSetează numele de utilizator al contului PS4, care poate fi afișat de unele jocuri. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Tip jurnal:\nSetează dacă să sincronizezi ieșirea ferestrei de jurnal pentru performanță. Aceasta poate avea efecte adverse asupra emulării. - - - logFilter - Filtrul jurnalului:\nFiltrează jurnalul pentru a imprima doar informații specifice.\nExemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare. - - - updaterGroupBox - Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. - - - GUIMusicGroupBox - Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Ascunde cursorul:\nAlegeți când va dispărea cursorul:\nNiciodată: Vei vedea întotdeauna mouse-ul.\nInactiv: Setează un timp pentru a dispărea după inactivitate.\nÎntotdeauna: nu vei vedea niciodată mouse-ul. - - - idleTimeoutGroupBox - Setați un timp pentru ca mouse-ul să dispară după ce a fost inactiv. - - - backButtonBehaviorGroupBox - Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului să imite atingerea poziției specificate pe touchpad-ul PS4. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Niciodată - - - Idle - Inactiv - - - Always - Întotdeauna - - - Touchpad Left - Touchpad Stânga - - - Touchpad Right - Touchpad Dreapta - - - Touchpad Center - Centru Touchpad - - - None - Niciunul - - - graphicsAdapterGroupBox - Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează "Auto Select" pentru a-l determina automat. - - - resolutionLayout - Lățime/Înălțime:\nSetează dimensiunea ferestrei emulatorului la lansare, care poate fi redimensionată în timpul jocului.\nAceasta este diferită de rezoluția din joc. - - - heightDivider - Împărțitor Vblank:\nRata de cadre cu care emulatorul se reîmprospătează este multiplicată cu acest număr. Schimbarea acestuia poate avea efecte adverse, cum ar fi creșterea vitezei jocului sau distrugerea funcționalității critice a jocului care nu se așteaptă ca aceasta să se schimbe! - - - dumpShadersCheckBox - Activează salvarea shaderelor:\nÎn scopuri de depanare tehnică, salvează shader-urile jocului într-un folder pe măsură ce sunt randate. - - - nullGpuCheckBox - Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică. - - - gameFoldersBox - Folderele jocurilor:\nLista folderelor pentru a verifica jocurile instalate. - - - addFolderButton - Adăugați:\nAdăugați un folder la listă. - - - removeFolderButton - Eliminați:\nÎndepărtați un folder din listă. - - - debugDump - Activează salvarea pentru depanare:\nSalvează simbolurile de import și export și informațiile din antetul fișierului pentru aplicația PS4 care rulează în prezent într-un director. - - - vkValidationCheckBox - Activează straturile de validare Vulkan:\nActivează un sistem care validează starea renderer-ului Vulkan și înregistrează informații despre starea sa internă. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - - - vkSyncValidationCheckBox - Activează validarea sincronizării Vulkan:\nActivează un sistem care validează sincronizarea sarcinilor de redare Vulkan. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - - - rdocCheckBox - Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Nu este disponibilă imaginea - - - Serial: - Serial: - - - Version: - Versiune: - - - Size: - Dimensiune: - - - Select Cheat File: - Selectează fișierul Cheat: - - - Repository: - Repository: - - - Download Cheats - Descarcă Cheats - - - Delete File - Șterge Fișierul - - - No files selected. - Nu sunt fișiere selectate. - - - You can delete the cheats you don't want after downloading them. - Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. - - - Do you want to delete the selected file?\n%1 - Vrei să ștergi fișierul selectat?\n%1 - - - Select Patch File: - Selectează fișierul Patch: - - - Download Patches - Descarcă Patches - - - Save - Salvează - - - Cheats - Cheats - - - Patches - Patches - - - Error - Eroare - - - No patch selected. - Nu este selectat niciun patch. - - - Unable to open files.json for reading. - Imposibil de deschis files.json pentru citire. - - - No patch file found for the current serial. - Nu s-a găsit niciun fișier patch pentru serialul curent. - - - Unable to open the file for reading. - Imposibil de deschis fișierul pentru citire. - - - Unable to open the file for writing. - Imposibil de deschis fișierul pentru scriere. - - - Failed to parse XML: - Nu s-a reușit pararea XML: - - - Success - Succes - - - Options saved successfully. - Opțiunile au fost salvate cu succes. - - - Invalid Source - Sursă invalidă - - - The selected source is invalid. - Sursa selectată este invalidă. - - - File Exists - Fișier existent - - - File already exists. Do you want to replace it? - Fișierul există deja. Vrei să-l înlocuiești? - - - Failed to save file: - Nu s-a reușit salvarea fișierului: - - - Failed to download file: - Nu s-a reușit descărcarea fișierului: - - - Cheats Not Found - Cheats Nu au fost găsite - - - CheatsNotFound_MSG - Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. - - - Cheats Downloaded Successfully - Cheats descărcate cu succes - - - CheatsDownloadedSuccessfully_MSG - Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. - - - Failed to save: - Nu s-a reușit salvarea: - - - Failed to download: - Nu s-a reușit descărcarea: - - - Download Complete - Descărcare completă - - - DownloadComplete_MSG - Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. - - - Failed to parse JSON data from HTML. - Nu s-a reușit pararea datelor JSON din HTML. - - - Failed to retrieve HTML page. - Nu s-a reușit obținerea paginii HTML. - - - The game is in version: %1 - Jocul este în versiunea: %1 - - - The downloaded patch only works on version: %1 - Patch-ul descărcat funcționează doar pe versiunea: %1 - - - You may need to update your game. - Este posibil să trebuiască să actualizezi jocul tău. - - - Incompatibility Notice - Avertizare de incompatibilitate - - - Failed to open file: - Nu s-a reușit deschiderea fișierului: - - - XML ERROR: - EROARE XML: - - - Failed to open files.json for writing - Nu s-a reușit deschiderea files.json pentru scriere - - - Author: - Autor: - - - Directory does not exist: - Directorul nu există: - - - Failed to open files.json for reading. - Nu s-a reușit deschiderea files.json pentru citire. - - - Name: - Nume: - - - Can't apply cheats before the game is started - Nu poți aplica cheats înainte ca jocul să înceapă. - - - - GameListFrame - - Icon - Icon - - - Name - Nume - - - Serial - Serie - - - Compatibility - Compatibility - - - Region - Regiune - - - Firmware - Firmware - - - Size - Dimensiune - - - Version - Versiune - - - Path - Drum - - - Play Time - Timp de Joacă - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Faceți clic pentru a vedea detalii pe GitHub - - - Last updated - Ultima actualizare - - - - CheckUpdate - - Auto Updater - Actualizator automat - - - Error - Eroare - - - Network error: - Eroare de rețea: - - - Error_Github_limit_MSG - Actualizatorul automat permite până la 60 de verificări de actualizare pe oră.\nAți atins această limită. Vă rugăm să încercați din nou mai târziu. - - - Failed to parse update information. - Nu s-au putut analiza informațiile de actualizare. - - - No pre-releases found. - Nu au fost găsite pre-lansări. - - - Invalid release data. - Datele versiunii sunt invalide. - - - No download URL found for the specified asset. - Nu s-a găsit URL de descărcare pentru resursa specificată. - - - Your version is already up to date! - Versiunea ta este deja actualizată! - - - Update Available - Actualizare disponibilă - - - Update Channel - Canal de Actualizare - - - Current Version - Versiunea curentă - - - Latest Version - Ultima versiune - - - Do you want to update? - Doriți să actualizați? - - - Show Changelog - Afișați jurnalul de modificări - - - Check for Updates at Startup - Verifică actualizări la pornire - - - Update - Actualizare - - - No - Nu - - - Hide Changelog - Ascunde jurnalul de modificări - - - Changes - Modificări - - - Network error occurred while trying to access the URL - A apărut o eroare de rețea în timpul încercării de a accesa URL-ul - - - Download Complete - Descărcare completă - - - The update has been downloaded, press OK to install. - Actualizarea a fost descărcată, apăsați OK pentru a instala. - - - Failed to save the update file at - Nu s-a putut salva fișierul de actualizare la - - - Starting Update... - Încep actualizarea... - - - Failed to create the update script file - Nu s-a putut crea fișierul script de actualizare - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Se colectează datele de compatibilitate, vă rugăm să așteptați - - - Cancel - Anulează - - - Loading... - Se încarcă... - - - Error - Eroare - - - Unable to update compatibility data! Try again later. - Nu se poate actualiza datele de compatibilitate! Încercați din nou mai târziu. - - - Unable to open compatibility_data.json for writing. - Nu se poate deschide compatibility_data.json pentru scriere. - - - Unknown - Necunoscut - - - Nothing - Nimic - - - Boots - Botine - - - Menus - Meniuri - - - Ingame - În joc - - - Playable - Jucabil - - + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nu este disponibilă imaginea + + + Serial: + Serial: + + + Version: + Versiune: + + + Size: + Dimensiune: + + + Select Cheat File: + Selectează fișierul Cheat: + + + Repository: + Repository: + + + Download Cheats + Descarcă Cheats + + + Delete File + Șterge Fișierul + + + No files selected. + Nu sunt fișiere selectate. + + + You can delete the cheats you don't want after downloading them. + Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. + + + Do you want to delete the selected file?\n%1 + Vrei să ștergi fișierul selectat?\n%1 + + + Select Patch File: + Selectează fișierul Patch: + + + Download Patches + Descarcă Patches + + + Save + Salvează + + + Cheats + Cheats + + + Patches + Patches + + + Error + Eroare + + + No patch selected. + Nu este selectat niciun patch. + + + Unable to open files.json for reading. + Imposibil de deschis files.json pentru citire. + + + No patch file found for the current serial. + Nu s-a găsit niciun fișier patch pentru serialul curent. + + + Unable to open the file for reading. + Imposibil de deschis fișierul pentru citire. + + + Unable to open the file for writing. + Imposibil de deschis fișierul pentru scriere. + + + Failed to parse XML: + Nu s-a reușit pararea XML: + + + Success + Succes + + + Options saved successfully. + Opțiunile au fost salvate cu succes. + + + Invalid Source + Sursă invalidă + + + The selected source is invalid. + Sursa selectată este invalidă. + + + File Exists + Fișier existent + + + File already exists. Do you want to replace it? + Fișierul există deja. Vrei să-l înlocuiești? + + + Failed to save file: + Nu s-a reușit salvarea fișierului: + + + Failed to download file: + Nu s-a reușit descărcarea fișierului: + + + Cheats Not Found + Cheats Nu au fost găsite + + + CheatsNotFound_MSG + Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. + + + Cheats Downloaded Successfully + Cheats descărcate cu succes + + + CheatsDownloadedSuccessfully_MSG + Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. + + + Failed to save: + Nu s-a reușit salvarea: + + + Failed to download: + Nu s-a reușit descărcarea: + + + Download Complete + Descărcare completă + + + DownloadComplete_MSG + Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. + + + Failed to parse JSON data from HTML. + Nu s-a reușit pararea datelor JSON din HTML. + + + Failed to retrieve HTML page. + Nu s-a reușit obținerea paginii HTML. + + + The game is in version: %1 + Jocul este în versiunea: %1 + + + The downloaded patch only works on version: %1 + Patch-ul descărcat funcționează doar pe versiunea: %1 + + + You may need to update your game. + Este posibil să trebuiască să actualizezi jocul tău. + + + Incompatibility Notice + Avertizare de incompatibilitate + + + Failed to open file: + Nu s-a reușit deschiderea fișierului: + + + XML ERROR: + EROARE XML: + + + Failed to open files.json for writing + Nu s-a reușit deschiderea files.json pentru scriere + + + Author: + Autor: + + + Directory does not exist: + Directorul nu există: + + + Failed to open files.json for reading. + Nu s-a reușit deschiderea files.json pentru citire. + + + Name: + Nume: + + + Can't apply cheats before the game is started + Nu poți aplica cheats înainte ca jocul să înceapă. + + + Close + Închide + + + + CheckUpdate + + Auto Updater + Actualizator automat + + + Error + Eroare + + + Network error: + Eroare de rețea: + + + Error_Github_limit_MSG + Actualizatorul automat permite până la 60 de verificări de actualizare pe oră.\nAți atins această limită. Vă rugăm să încercați din nou mai târziu. + + + Failed to parse update information. + Nu s-au putut analiza informațiile de actualizare. + + + No pre-releases found. + Nu au fost găsite pre-lansări. + + + Invalid release data. + Datele versiunii sunt invalide. + + + No download URL found for the specified asset. + Nu s-a găsit URL de descărcare pentru resursa specificată. + + + Your version is already up to date! + Versiunea ta este deja actualizată! + + + Update Available + Actualizare disponibilă + + + Update Channel + Canal de Actualizare + + + Current Version + Versiunea curentă + + + Latest Version + Ultima versiune + + + Do you want to update? + Doriți să actualizați? + + + Show Changelog + Afișați jurnalul de modificări + + + Check for Updates at Startup + Verifică actualizări la pornire + + + Update + Actualizare + + + No + Nu + + + Hide Changelog + Ascunde jurnalul de modificări + + + Changes + Modificări + + + Network error occurred while trying to access the URL + A apărut o eroare de rețea în timpul încercării de a accesa URL-ul + + + Download Complete + Descărcare completă + + + The update has been downloaded, press OK to install. + Actualizarea a fost descărcată, apăsați OK pentru a instala. + + + Failed to save the update file at + Nu s-a putut salva fișierul de actualizare la + + + Starting Update... + Încep actualizarea... + + + Failed to create the update script file + Nu s-a putut crea fișierul script de actualizare + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Se colectează datele de compatibilitate, vă rugăm să așteptați + + + Cancel + Anulează + + + Loading... + Se încarcă... + + + Error + Eroare + + + Unable to update compatibility data! Try again later. + Nu se poate actualiza datele de compatibilitate! Încercați din nou mai târziu. + + + Unable to open compatibility_data.json for writing. + Nu se poate deschide compatibility_data.json pentru scriere. + + + Unknown + Necunoscut + + + Nothing + Nimic + + + Boots + Botine + + + Menus + Meniuri + + + Ingame + În joc + + + Playable + Jucabil + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Icon + + + Name + Nume + + + Serial + Serie + + + Compatibility + Compatibility + + + Region + Regiune + + + Firmware + Firmware + + + Size + Dimensiune + + + Version + Versiune + + + Path + Drum + + + Play Time + Timp de Joacă + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Faceți clic pentru a vedea detalii pe GitHub + + + Last updated + Ultima actualizare + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Deschide Folder... + + + Open Game Folder + Deschide Folder Joc + + + Open Save Data Folder + Deschide Folder Date Salvate + + + Open Log Folder + Deschide Folder Jurnal + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Cheats / Patches + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Verifică actualizările + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Descarcă Coduri / Patch-uri + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Ajutor + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Lista jocurilor + + + * Unsupported Vulkan Version + * Versiune Vulkan nesuportată + + + Download Cheats For All Installed Games + Descarcă Cheats pentru toate jocurile instalate + + + Download Patches For All Games + Descarcă Patches pentru toate jocurile + + + Download Complete + Descărcare completă + + + You have downloaded cheats for all the games you have installed. + Ai descărcat cheats pentru toate jocurile instalate. + + + Patches Downloaded Successfully! + Patches descărcate cu succes! + + + All Patches available for all games have been downloaded. + Toate Patches disponibile pentru toate jocurile au fost descărcate. + + + Games: + Jocuri: + + + ELF files (*.bin *.elf *.oelf) + Fișiere ELF (*.bin *.elf *.oelf) + + + Game Boot + Boot Joc + + + Only one file can be selected! + Numai un fișier poate fi selectat! + + + PKG Extraction + Extracție PKG + + + Patch detected! + Patch detectat! + + + PKG and Game versions match: + Versiunile PKG și ale jocului sunt compatibile: + + + Would you like to overwrite? + Doriți să suprascrieți? + + + PKG Version %1 is older than installed version: + Versiunea PKG %1 este mai veche decât versiunea instalată: + + + Game is installed: + Jocul este instalat: + + + Would you like to install Patch: + Doriți să instalați patch-ul: + + + DLC Installation + Instalare DLC + + + Would you like to install DLC: %1? + Doriți să instalați DLC-ul: %1? + + + DLC already installed: + DLC deja instalat: + + + Game already installed + Jocul deja instalat + + + PKG ERROR + EROARE PKG + + + Extracting PKG %1/%2 + Extracție PKG %1/%2 + + + Extraction Finished + Extracție terminată + + + Game successfully installed at %1 + Jocul a fost instalat cu succes la %1 + + + File doesn't appear to be a valid PKG file + Fișierul nu pare să fie un fișier PKG valid + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Nume + + + Serial + Serie + + + Installed + + + + Size + Dimensiune + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Regiune + + + Flags + + + + Path + Drum + + + File + File + + + PKG ERROR + EROARE PKG + + + Unknown + Necunoscut + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Mod Ecran Complet + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Tab-ul implicit la deschiderea setărilor + + + Show Game Size In List + Afișează dimensiunea jocului în listă + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Activați Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Deschide locația jurnalului + + + Input + Introducere + + + Cursor + Cursor + + + Hide Cursor + Ascunde cursorul + + + Hide Cursor Idle Timeout + Timeout pentru ascunderea cursorului inactiv + + + s + s + + + Controller + Controler + + + Back Button Behavior + Comportament buton înapoi + + + Graphics + Graphics + + + GUI + Interfață + + + User + Utilizator + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Trasee + + + Game Folders + Dosare de joc + + + Add... + Adaugă... + + + Remove + Eliminare + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Actualizare + + + Check for Updates at Startup + Verifică actualizări la pornire + + + Always Show Changelog + Arată întotdeauna jurnalul modificărilor + + + Update Channel + Canal de Actualizare + + + Check for Updates + Verifică actualizări + + + GUI Settings + Setări GUI + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Redă muzica titlului + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Volum + + + Save + Salvează + + + Apply + Aplică + + + Restore Defaults + Restabilește Impozitivele + + + Close + Închide + + + Point your mouse at an option to display its description. + Indicați mouse-ul asupra unei opțiuni pentru a afișa descrierea acesteia. + + + consoleLanguageGroupBox + Limba consolei:\nSetează limba pe care o folosește jocul PS4.\nSe recomandă să setezi această opțiune pe o limbă pe care jocul o suportă, ceea ce poate varia în funcție de regiune. + + + emulatorLanguageGroupBox + Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. + + + fullscreenCheckBox + Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Afișează ecranul de încărcare:\nAfișează ecranul de încărcare al jocului (o imagine specială) în timp ce jocul pornește. + + + discordRPCCheckbox + Activați Discord Rich Presence:\nAfișează pictograma emulatorului și informații relevante pe profilul dumneavoastră Discord. + + + userName + Nume utilizator:\nSetează numele de utilizator al contului PS4, care poate fi afișat de unele jocuri. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Tip jurnal:\nSetează dacă să sincronizezi ieșirea ferestrei de jurnal pentru performanță. Aceasta poate avea efecte adverse asupra emulării. + + + logFilter + Filtrul jurnalului:\nFiltrează jurnalul pentru a imprima doar informații specifice.\nExemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare. + + + updaterGroupBox + Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. + + + GUIMusicGroupBox + Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Ascunde cursorul:\nAlegeți când va dispărea cursorul:\nNiciodată: Vei vedea întotdeauna mouse-ul.\nInactiv: Setează un timp pentru a dispărea după inactivitate.\nÎntotdeauna: nu vei vedea niciodată mouse-ul. + + + idleTimeoutGroupBox + Setați un timp pentru ca mouse-ul să dispară după ce a fost inactiv. + + + backButtonBehaviorGroupBox + Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului să imite atingerea poziției specificate pe touchpad-ul PS4. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Niciodată + + + Idle + Inactiv + + + Always + Întotdeauna + + + Touchpad Left + Touchpad Stânga + + + Touchpad Right + Touchpad Dreapta + + + Touchpad Center + Centru Touchpad + + + None + Niciunul + + + graphicsAdapterGroupBox + Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează "Auto Select" pentru a-l determina automat. + + + resolutionLayout + Lățime/Înălțime:\nSetează dimensiunea ferestrei emulatorului la lansare, care poate fi redimensionată în timpul jocului.\nAceasta este diferită de rezoluția din joc. + + + heightDivider + Împărțitor Vblank:\nRata de cadre cu care emulatorul se reîmprospătează este multiplicată cu acest număr. Schimbarea acestuia poate avea efecte adverse, cum ar fi creșterea vitezei jocului sau distrugerea funcționalității critice a jocului care nu se așteaptă ca aceasta să se schimbe! + + + dumpShadersCheckBox + Activează salvarea shaderelor:\nÎn scopuri de depanare tehnică, salvează shader-urile jocului într-un folder pe măsură ce sunt randate. + + + nullGpuCheckBox + Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică. + + + gameFoldersBox + Folderele jocurilor:\nLista folderelor pentru a verifica jocurile instalate. + + + addFolderButton + Adăugați:\nAdăugați un folder la listă. + + + removeFolderButton + Eliminați:\nÎndepărtați un folder din listă. + + + debugDump + Activează salvarea pentru depanare:\nSalvează simbolurile de import și export și informațiile din antetul fișierului pentru aplicația PS4 care rulează în prezent într-un director. + + + vkValidationCheckBox + Activează straturile de validare Vulkan:\nActivează un sistem care validează starea renderer-ului Vulkan și înregistrează informații despre starea sa internă. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. + + + vkSyncValidationCheckBox + Activează validarea sincronizării Vulkan:\nActivează un sistem care validează sincronizarea sarcinilor de redare Vulkan. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. + + + rdocCheckBox + Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 985e40a49..2e15297e1 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1,8 +1,8 @@ - - + + AboutDialog @@ -22,1089 +22,6 @@ Это программное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. - - ElfViewer - - Open Folder - Открыть папку - - - - GameInfoClass - - Loading game list, please wait :3 - Загрузка списка игр, пожалуйста подождите :3 - - - Cancel - Отмена - - - Loading... - Загрузка... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Выберите папку - - - Select which directory you want to install to. - Выберите папку, в которую вы хотите установить. - - - Install All Queued to Selected Folder - Установить все из очереди в выбранную папку - - - Delete PKG File on Install - Удалить файл PKG при установке - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Выберите папку - - - Directory to install games - Каталог для установки игр - - - Browse - Обзор - - - Error - Ошибка - - - The value for location to install games is not valid. - Недопустимое значение местоположения для установки игр. - - - Directory to install DLC - Каталог для установки DLC - - - - GuiContextMenus - - Create Shortcut - Создать ярлык - - - Cheats / Patches - Читы и патчи - - - SFO Viewer - Просмотр SFO - - - Trophy Viewer - Просмотр трофеев - - - Open Folder... - Открыть папку... - - - Open Game Folder - Открыть папку с игрой - - - Open Save Data Folder - Открыть папку сохранений - - - Open Log Folder - Открыть папку логов - - - Copy info... - Копировать информацию... - - - Copy Name - Копировать имя - - - Copy Serial - Копировать серийный номер - - - Copy All - Копировать всё - - - Delete... - Удалить... - - - Delete Game - Удалить игру - - - Delete Update - Удалить обновление - - - Delete DLC - Удалить DLC - - - Compatibility... - Совместимость... - - - Update database - Обновить базу данных - - - View report - Посмотреть отчет - - - Submit a report - Отправить отчёт - - - Shortcut creation - Создание ярлыка - - - Shortcut created successfully! - Ярлык создан успешно! - - - Error - Ошибка - - - Error creating shortcut! - Ошибка создания ярлыка! - - - Install PKG - Установить PKG - - - Game - Игры - - - requiresEnableSeparateUpdateFolder_MSG - Эта функция требует включения настройки 'Отдельная папка обновлений'. Если вы хотите использовать эту функцию, пожалуйста включите её. - - - This game has no update to delete! - У этой игры нет обновлений для удаления! - - - Update - Обновления - - - This game has no DLC to delete! - У этой игры нет DLC для удаления! - - - DLC - DLC - - - Delete %1 - Удалить %1 - - - Are you sure you want to delete %1's %2 directory? - Вы уверены, что хотите удалить папку %2 %1? - - - Open Update Folder - Открыть папку обновлений - - - Delete Save Data - Удалить сохранения - - - This game has no update folder to open! - У этой игры нет папки обновлений, которую можно открыть! - - - Failed to convert icon. - Не удалось преобразовать иконку. - - - This game has no save data to delete! - У этой игры нет сохранений, которые можно удалить! - - - Save Data - Сохранения - - - - MainWindow - - Open/Add Elf Folder - Открыть/Добавить папку Elf - - - Install Packages (PKG) - Установить пакеты (PKG) - - - Boot Game - Запустить игру - - - Check for Updates - Проверить обновления - - - About shadPS4 - О shadPS4 - - - Configure... - Настроить... - - - Install application from a .pkg file - Установить приложение из файла .pkg - - - Recent Games - Недавние игры - - - Open shadPS4 Folder - Открыть папку shadPS4 - - - Exit - Выход - - - Exit shadPS4 - Выйти из shadPS4 - - - Exit the application. - Выйти из приложения. - - - Show Game List - Показать список игр - - - Game List Refresh - Обновить список игр - - - Tiny - Крошечный - - - Small - Маленький - - - Medium - Средний - - - Large - Большой - - - List View - Список - - - Grid View - Сетка - - - Elf Viewer - Исполняемый файл - - - Game Install Directory - Каталог установки игры - - - Download Cheats/Patches - Скачать читы или патчи - - - Dump Game List - Дамп списка игр - - - PKG Viewer - Просмотр PKG - - - Search... - Поиск... - - - File - Файл - - - View - Вид - - - Game List Icons - Размер иконок списка игр - - - Game List Mode - Вид списка игр - - - Settings - Настройки - - - Utils - Утилиты - - - Themes - Темы - - - Help - Помощь - - - Dark - Темная - - - Light - Светлая - - - Green - Зеленая - - - Blue - Синяя - - - Violet - Фиолетовая - - - toolBar - Панель инструментов - - - Game List - Список игр - - - * Unsupported Vulkan Version - * Неподдерживаемая версия Vulkan - - - Download Cheats For All Installed Games - Скачать читы для всех установленных игр - - - Download Patches For All Games - Скачать патчи для всех игр - - - Download Complete - Скачивание завершено - - - You have downloaded cheats for all the games you have installed. - Вы скачали читы для всех установленных игр. - - - Patches Downloaded Successfully! - Патчи успешно скачаны! - - - All Patches available for all games have been downloaded. - Все доступные патчи для всех игр были скачаны. - - - Games: - Игры: - - - PKG File (*.PKG) - Файл PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Файлы ELF (*.bin *.elf *.oelf) - - - Game Boot - Запуск игры - - - Only one file can be selected! - Можно выбрать только один файл! - - - PKG Extraction - Извлечение PKG - - - Patch detected! - Обнаружен патч! - - - PKG and Game versions match: - Версии PKG и игры совпадают: - - - Would you like to overwrite? - Хотите перезаписать? - - - PKG Version %1 is older than installed version: - Версия PKG %1 старше установленной версии: - - - Game is installed: - Игра установлена: - - - Would you like to install Patch: - Хотите установить патч: - - - DLC Installation - Установка DLC - - - Would you like to install DLC: %1? - Вы хотите установить DLC: %1? - - - DLC already installed: - DLC уже установлен: - - - Game already installed - Игра уже установлена - - - PKG is a patch, please install the game first! - PKG - это патч, сначала установите игру! - - - PKG ERROR - ОШИБКА PKG - - - Extracting PKG %1/%2 - Извлечение PKG %1/%2 - - - Extraction Finished - Извлечение завершено - - - Game successfully installed at %1 - Игра успешно установлена в %1 - - - File doesn't appear to be a valid PKG file - Файл не является допустимым файлом PKG - - - Run Game - Запустить игру - - - Eboot.bin file not found - Файл eboot.bin не найден - - - PKG File (*.PKG *.pkg) - Файл PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - Выбранный PKG является патчем или DLC, пожалуйста, сначала установите игру! - - - Game is already running! - Игра уже запущена! - - - shadPS4 - shadPS4 - - - - PKGViewer - - Open Folder - Открыть папку - - - &File - Файл - - - PKG ERROR - ОШИБКА PKG - - - - TrophyViewer - - Trophy Viewer - Просмотр трофеев - - - - SettingsDialog - - Settings - Настройки - - - General - Общее - - - System - Система - - - Console Language - Язык консоли - - - Emulator Language - Язык эмулятора - - - Emulator - Эмулятор - - - Enable Fullscreen - Полноэкранный режим - - - Fullscreen Mode - Тип полноэкранного режима - - - Enable Separate Update Folder - Отдельная папка обновлений - - - Default tab when opening settings - Вкладка по умолчанию при открытии настроек - - - Show Game Size In List - Показать размер игры в списке - - - Show Splash - Показывать заставку - - - Is PS4 Pro - Режим PS4 Pro - - - Enable Discord Rich Presence - Включить Discord Rich Presence - - - Username - Имя пользователя - - - Trophy Key - Ключ трофеев - - - Trophy - Трофеи - - - Logger - Логирование - - - Log Type - Тип логов - - - Log Filter - Фильтр логов - - - Open Log Location - Открыть местоположение журнала - - - Input - Ввод - - - Cursor - Курсор мыши - - - Hide Cursor - Скрывать курсор - - - Hide Cursor Idle Timeout - Время скрытия курсора при бездействии - - - s - сек - - - Controller - Контроллер - - - Back Button Behavior - Поведение кнопки назад - - - Graphics - Графика - - - GUI - Интерфейс - - - User - Пользователь - - - Graphics Device - Графическое устройство - - - Width - Ширина - - - Height - Высота - - - Vblank Divider - Делитель Vblank - - - Advanced - Продвинутые - - - Enable Shaders Dumping - Включить дамп шейдеров - - - Enable NULL GPU - Включить NULL GPU - - - Paths - Пути - - - Game Folders - Игровые папки - - - Add... - Добавить... - - - Remove - Удалить - - - Debug - Отладка - - - Enable Debug Dumping - Включить отладочные дампы - - - Enable Vulkan Validation Layers - Включить слои валидации Vulkan - - - Enable Vulkan Synchronization Validation - Включить валидацию синхронизации Vulkan - - - Enable RenderDoc Debugging - Включить отладку RenderDoc - - - Enable Crash Diagnostics - Включить диагностику сбоев - - - Collect Shaders - Собирать шейдеры - - - Copy GPU Buffers - Копировать буферы GPU - - - Host Debug Markers - Маркеры отладки хоста - - - Guest Debug Markers - Маркеры отладки гостя - - - Update - Обновление - - - Check for Updates at Startup - Проверка при запуске - - - Always Show Changelog - Всегда показывать журнал изменений - - - Update Channel - Канал обновления - - - Check for Updates - Проверить обновления - - - GUI Settings - Настройки интерфейса - - - Title Music - Заглавная музыка - - - Disable Trophy Pop-ups - Отключить уведомления о трофеях - - - Play title music - Играть заглавную музыку - - - Update Compatibility Database On Startup - Обновлять базу совместимости при запуске - - - Game Compatibility - Совместимость игр - - - Display Compatibility Data - Показывать данные совместимости - - - Update Compatibility Database - Обновить базу совместимости - - - Volume - Громкость - - - Audio Backend - Звуковая подсистема - - - Save - Сохранить - - - Apply - Применить - - - Restore Defaults - По умолчанию - - - Close - Закрыть - - - Point your mouse at an option to display its description. - Наведите указатель мыши на опцию, чтобы отобразить ее описание. - - - consoleLanguageGroupBox - Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. - - - emulatorLanguageGroupBox - Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. - - - fullscreenCheckBox - Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11. - - - separateUpdatesCheckBox - Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем "CUSA00000-UPDATE", где идентификатор CUSA совпадает с идентификатором игры. - - - showSplashCheckBox - Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. - - - ps4proCheckBox - Режим PS4 Pro:\nЗаставляет эмулятор работать как PS4 Pro, что может включить специальные функции в играх, поддерживающих это. - - - discordRPCCheckbox - Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. - - - userName - Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. - - - TrophyKey - Ключ трофеев:\nКлюч, используемый для расшифровки трофеев. Должен быть получен из вашей взломанной консоли.\nДолжен содержать только шестнадцатеричные символы. - - - logTypeGroupBox - Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. - - - logFilter - Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. - - - updaterGroupBox - Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. - - - GUIMusicGroupBox - Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. - - - disableTrophycheckBox - Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по-прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). - - - hideCursorGroupBox - Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. - - - idleTimeoutGroupBox - Время скрытия курсора при бездействии:\nУстановите время, через которое курсор исчезнет при бездействии. - - - backButtonBehaviorGroupBox - Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. - - - enableCompatibilityCheckBox - Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. - - - checkCompatibilityOnStartupCheckBox - Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. - - - updateCompatibilityButton - Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. - - - Never - Никогда - - - Idle - При бездействии - - - Always - Всегда - - - Touchpad Left - Тачпад слева - - - Touchpad Right - Тачпад справа - - - Touchpad Center - Центр тачпада - - - None - Нет - - - graphicsAdapterGroupBox - Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите "Автовыбор", чтобы определить GPU автоматически. - - - resolutionLayout - Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. - - - heightDivider - Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! - - - dumpShadersCheckBox - Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. - - - nullGpuCheckBox - Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. - - - gameFoldersBox - Игровые папки:\nСписок папок для проверки установленных игр. - - - addFolderButton - Добавить:\nДобавить папку в список. - - - removeFolderButton - Удалить:\nУдалить папку из списка. - - - debugDump - Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. - - - vkValidationCheckBox - Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. - - - vkSyncValidationCheckBox - Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. - - - rdocCheckBox - Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с RenderDoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. - - - collectShaderCheckBox - Собирать шейдеры:\nВам необходимо включить эту функцию для редактирования шейдеров с помощью меню отладки (Ctrl + F10). - - - crashDiagnosticsCheckBox - Диагностика сбоев:\nСоздает .yaml файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. - - - copyGPUBuffersCheckBox - Копировать буферы GPU:\nПозволяет обойти состояния гонки, связанные с отправками GPU.\nМожет помочь или не помочь при сбоях PM4 типа 0. - - - hostMarkersCheckBox - Маркеры отладки хоста:\nДобавляет информацию на стороне эмулятора, например маркеры для определенных команд AMDGPU, вокруг команд Vulkan, а также присваивает ресурсам отладочные имена.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. - - - guestMarkersCheckBox - Маркеры отладки гостя:\nДобавляет любые отладочные маркеры, добавленные самой игрой, в буфер команд.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. - - - saveDataBox - Путь сохранений:\nПапка, в которой будут храниться сохранения игр. - - - browseButton - Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений. - - - Borderless - Без полей - - - True - Истинный - - - Release - Release - - - Nightly - Nightly - - - Set the volume of the background music. - Установите громкость фоновой музыки. - - - Enable Motion Controls - Включить управление движением - - - Save Data Path - Путь сохранений - - - Browse - Обзор - - - async - асинхронный - - - sync - синхронный - - - Directory to install games - Каталог для установки игр - - - Directory to save data - Каталог для сохранений - - - Auto Select - Автовыбор - - CheatsPatches @@ -1331,105 +248,6 @@ Close Закрыть - - Error: - Ошибка: - - - ERROR - ОШИБКА - - - - GameListFrame - - Icon - Иконка - - - Name - Название - - - Serial - Серийный номер - - - Compatibility - Совместимость - - - Region - Регион - - - Firmware - Прошивка - - - Size - Размер - - - Version - Версия - - - Path - Путь - - - Play Time - Время в игре - - - Never Played - Нет - - - h - ч - - - m - м - - - s - с - - - Compatibility is untested - Совместимость не проверена - - - Game does not initialize properly / crashes the emulator - Игра не инициализируется правильно / эмулятор вылетает - - - Game boots, but only displays a blank screen - Игра запускается, но показывает только пустой экран - - - Game displays an image but does not go past the menu - Игра показывает картинку, но не проходит дальше меню - - - Game has game-breaking glitches or unplayable performance - Игра имеет ломающие игру глюки или плохую производительность - - - Game can be completed with playable performance and no major glitches - Игра может быть пройдена с хорошей производительностью и без серьезных сбоев - - - Click to see details on github - Нажмите, чтобы увидеть детали на GitHub - - - Last updated - Последнее обновление - CheckUpdate @@ -1445,10 +263,10 @@ Network error: Сетевая ошибка: - - Error_Github_limit_MSG - Автообновление позволяет выполнять до 60 проверок обновлений в час.\nВы достигли этого лимита. Пожалуйста, попробуйте позже. - + + Error_Github_limit_MSG + Автообновление позволяет выполнять до 60 проверок обновлений в час.\nВы достигли этого лимита. Пожалуйста, попробуйте позже. + Failed to parse update information. Не удалось разобрать информацию об обновлении. @@ -1538,6 +356,320 @@ Не удалось создать файл скрипта обновления + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Загрузка данных о совместимости, пожалуйста, подождите + + + Cancel + Отмена + + + Loading... + Загрузка... + + + Error + Ошибка + + + Unable to update compatibility data! Try again later. + Не удалось обновить данные совместимости! Повторите попытку позже. + + + Unable to open compatibility_data.json for writing. + Не удалось открыть файл compatibility_data.json для записи. + + + Unknown + Неизвестно + + + Nothing + Ничего + + + Boots + Запускается + + + Menus + В меню + + + Ingame + В игре + + + Playable + Играбельно + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Открыть папку + + + + GameInfoClass + + Loading game list, please wait :3 + Загрузка списка игр, пожалуйста подождите :3 + + + Cancel + Отмена + + + Loading... + Загрузка... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Выберите папку + + + Directory to install games + Каталог для установки игр + + + Browse + Обзор + + + Error + Ошибка + + + Directory to install DLC + Каталог для установки DLC + + + + GameListFrame + + Icon + Иконка + + + Name + Название + + + Serial + Серийный номер + + + Compatibility + Совместимость + + + Region + Регион + + + Firmware + Прошивка + + + Size + Размер + + + Version + Версия + + + Path + Путь + + + Play Time + Время в игре + + + Never Played + Нет + + + h + ч + + + m + м + + + s + с + + + Compatibility is untested + Совместимость не проверена + + + Game does not initialize properly / crashes the emulator + Игра не инициализируется правильно / эмулятор вылетает + + + Game boots, but only displays a blank screen + Игра запускается, но показывает только пустой экран + + + Game displays an image but does not go past the menu + Игра показывает картинку, но не проходит дальше меню + + + Game has game-breaking glitches or unplayable performance + Игра имеет ломающие игру глюки или плохую производительность + + + Game can be completed with playable performance and no major glitches + Игра может быть пройдена с хорошей производительностью и без серьезных сбоев + + + Click to see details on github + Нажмите, чтобы увидеть детали на GitHub + + + Last updated + Последнее обновление + + GameListUtils @@ -1562,54 +694,1097 @@ - CompatibilityInfoClass - - Fetching compatibility data, please wait - Загрузка данных о совместимости, пожалуйста, подождите - - - Cancel - Отмена - - - Loading... - Загрузка... - - - Error - Ошибка - - - Unable to update compatibility data! Try again later. - Не удалось обновить данные совместимости! Повторите попытку позже. - - - Unable to open compatibility_data.json for writing. - Не удалось открыть файл compatibility_data.json для записи. - - - Unknown - Неизвестно - - - Nothing - Ничего - - - Boots - Запускается - - - Menus - В меню - - - Ingame - В игре - - - Playable - Играбельно - + GuiContextMenus + + Create Shortcut + Создать ярлык + + + Cheats / Patches + Читы и патчи + + + SFO Viewer + Просмотр SFO + + + Trophy Viewer + Просмотр трофеев + + + Open Folder... + Открыть папку... + + + Open Game Folder + Открыть папку с игрой + + + Open Save Data Folder + Открыть папку сохранений + + + Open Log Folder + Открыть папку логов + + + Copy info... + Копировать информацию... + + + Copy Name + Копировать имя + + + Copy Serial + Копировать серийный номер + + + Copy All + Копировать всё + + + Delete... + Удалить... + + + Delete Game + Удалить игру + + + Delete Update + Удалить обновление + + + Delete DLC + Удалить DLC + + + Compatibility... + Совместимость... + + + Update database + Обновить базу данных + + + View report + Посмотреть отчет + + + Submit a report + Отправить отчёт + + + Shortcut creation + Создание ярлыка + + + Shortcut created successfully! + Ярлык создан успешно! + + + Error + Ошибка + + + Error creating shortcut! + Ошибка создания ярлыка! + + + Install PKG + Установить PKG + + + Game + Игры + + + This game has no update to delete! + У этой игры нет обновлений для удаления! + + + Update + Обновления + + + This game has no DLC to delete! + У этой игры нет DLC для удаления! + + + DLC + DLC + + + Delete %1 + Удалить %1 + + + Are you sure you want to delete %1's %2 directory? + Вы уверены, что хотите удалить папку %2 %1? + + + Open Update Folder + Открыть папку обновлений + + + Delete Save Data + Удалить сохранения + + + This game has no update folder to open! + У этой игры нет папки обновлений, которую можно открыть! + + + Failed to convert icon. + Не удалось преобразовать иконку. + + + This game has no save data to delete! + У этой игры нет сохранений, которые можно удалить! + + + Save Data + Сохранения + + + Copy Version + + + + Copy Size + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Выберите папку + + + Select which directory you want to install to. + Выберите папку, в которую вы хотите установить. + + + Install All Queued to Selected Folder + Установить все из очереди в выбранную папку + + + Delete PKG File on Install + Удалить файл PKG при установке + + + + MainWindow + + Open/Add Elf Folder + Открыть/Добавить папку Elf + + + Install Packages (PKG) + Установить пакеты (PKG) + + + Boot Game + Запустить игру + + + Check for Updates + Проверить обновления + + + About shadPS4 + О shadPS4 + + + Configure... + Настроить... + + + Install application from a .pkg file + Установить приложение из файла .pkg + + + Recent Games + Недавние игры + + + Open shadPS4 Folder + Открыть папку shadPS4 + + + Exit + Выход + + + Exit shadPS4 + Выйти из shadPS4 + + + Exit the application. + Выйти из приложения. + + + Show Game List + Показать список игр + + + Game List Refresh + Обновить список игр + + + Tiny + Крошечный + + + Small + Маленький + + + Medium + Средний + + + Large + Большой + + + List View + Список + + + Grid View + Сетка + + + Elf Viewer + Исполняемый файл + + + Game Install Directory + Каталог установки игры + + + Download Cheats/Patches + Скачать читы или патчи + + + Dump Game List + Дамп списка игр + + + PKG Viewer + Просмотр PKG + + + Search... + Поиск... + + + File + Файл + + + View + Вид + + + Game List Icons + Размер иконок списка игр + + + Game List Mode + Вид списка игр + + + Settings + Настройки + + + Utils + Утилиты + + + Themes + Темы + + + Help + Помощь + + + Dark + Темная + + + Light + Светлая + + + Green + Зеленая + + + Blue + Синяя + + + Violet + Фиолетовая + + + toolBar + Панель инструментов + + + Game List + Список игр + + + * Unsupported Vulkan Version + * Неподдерживаемая версия Vulkan + + + Download Cheats For All Installed Games + Скачать читы для всех установленных игр + + + Download Patches For All Games + Скачать патчи для всех игр + + + Download Complete + Скачивание завершено + + + You have downloaded cheats for all the games you have installed. + Вы скачали читы для всех установленных игр. + + + Patches Downloaded Successfully! + Патчи успешно скачаны! + + + All Patches available for all games have been downloaded. + Все доступные патчи для всех игр были скачаны. + + + Games: + Игры: + + + ELF files (*.bin *.elf *.oelf) + Файлы ELF (*.bin *.elf *.oelf) + + + Game Boot + Запуск игры + + + Only one file can be selected! + Можно выбрать только один файл! + + + PKG Extraction + Извлечение PKG + + + Patch detected! + Обнаружен патч! + + + PKG and Game versions match: + Версии PKG и игры совпадают: + + + Would you like to overwrite? + Хотите перезаписать? + + + PKG Version %1 is older than installed version: + Версия PKG %1 старше установленной версии: + + + Game is installed: + Игра установлена: + + + Would you like to install Patch: + Хотите установить патч: + + + DLC Installation + Установка DLC + + + Would you like to install DLC: %1? + Вы хотите установить DLC: %1? + + + DLC already installed: + DLC уже установлен: + + + Game already installed + Игра уже установлена + + + PKG ERROR + ОШИБКА PKG + + + Extracting PKG %1/%2 + Извлечение PKG %1/%2 + + + Extraction Finished + Извлечение завершено + + + Game successfully installed at %1 + Игра успешно установлена в %1 + + + File doesn't appear to be a valid PKG file + Файл не является допустимым файлом PKG + + + Run Game + Запустить игру + + + Eboot.bin file not found + Файл eboot.bin не найден + + + PKG File (*.PKG *.pkg) + Файл PKG (*.PKG *.pkg) + + + PKG is a patch or DLC, please install the game first! + Выбранный PKG является патчем или DLC, пожалуйста, сначала установите игру! + + + Game is already running! + Игра уже запущена! + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Открыть папку + + + PKG ERROR + ОШИБКА PKG + + + Name + Название + + + Serial + Серийный номер + + + Installed + + + + Size + Размер + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Регион + + + Flags + + + + Path + Путь + + + File + Файл + + + Unknown + Неизвестно + + + Package + + + + + SettingsDialog + + Settings + Настройки + + + General + Общее + + + System + Система + + + Console Language + Язык консоли + + + Emulator Language + Язык эмулятора + + + Emulator + Эмулятор + + + Enable Fullscreen + Полноэкранный режим + + + Fullscreen Mode + Тип полноэкранного режима + + + Enable Separate Update Folder + Отдельная папка обновлений + + + Default tab when opening settings + Вкладка по умолчанию при открытии настроек + + + Show Game Size In List + Показать размер игры в списке + + + Show Splash + Показывать заставку + + + Enable Discord Rich Presence + Включить Discord Rich Presence + + + Username + Имя пользователя + + + Trophy Key + Ключ трофеев + + + Trophy + Трофеи + + + Logger + Логирование + + + Log Type + Тип логов + + + Log Filter + Фильтр логов + + + Open Log Location + Открыть местоположение журнала + + + Input + Ввод + + + Cursor + Курсор мыши + + + Hide Cursor + Скрывать курсор + + + Hide Cursor Idle Timeout + Время скрытия курсора при бездействии + + + s + сек + + + Controller + Контроллер + + + Back Button Behavior + Поведение кнопки назад + + + Graphics + Графика + + + GUI + Интерфейс + + + User + Пользователь + + + Graphics Device + Графическое устройство + + + Width + Ширина + + + Height + Высота + + + Vblank Divider + Делитель Vblank + + + Advanced + Продвинутые + + + Enable Shaders Dumping + Включить дамп шейдеров + + + Enable NULL GPU + Включить NULL GPU + + + Paths + Пути + + + Game Folders + Игровые папки + + + Add... + Добавить... + + + Remove + Удалить + + + Debug + Отладка + + + Enable Debug Dumping + Включить отладочные дампы + + + Enable Vulkan Validation Layers + Включить слои валидации Vulkan + + + Enable Vulkan Synchronization Validation + Включить валидацию синхронизации Vulkan + + + Enable RenderDoc Debugging + Включить отладку RenderDoc + + + Enable Crash Diagnostics + Включить диагностику сбоев + + + Collect Shaders + Собирать шейдеры + + + Copy GPU Buffers + Копировать буферы GPU + + + Host Debug Markers + Маркеры отладки хоста + + + Guest Debug Markers + Маркеры отладки гостя + + + Update + Обновление + + + Check for Updates at Startup + Проверка при запуске + + + Always Show Changelog + Всегда показывать журнал изменений + + + Update Channel + Канал обновления + + + Check for Updates + Проверить обновления + + + GUI Settings + Настройки интерфейса + + + Title Music + Заглавная музыка + + + Disable Trophy Pop-ups + Отключить уведомления о трофеях + + + Play title music + Играть заглавную музыку + + + Update Compatibility Database On Startup + Обновлять базу совместимости при запуске + + + Game Compatibility + Совместимость игр + + + Display Compatibility Data + Показывать данные совместимости + + + Update Compatibility Database + Обновить базу совместимости + + + Volume + Громкость + + + Save + Сохранить + + + Apply + Применить + + + Restore Defaults + По умолчанию + + + Close + Закрыть + + + Point your mouse at an option to display its description. + Наведите указатель мыши на опцию, чтобы отобразить ее описание. + + + consoleLanguageGroupBox + Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. + + + emulatorLanguageGroupBox + Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. + + + fullscreenCheckBox + Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11. + + + separateUpdatesCheckBox + Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем "CUSA00000-UPDATE", где идентификатор CUSA совпадает с идентификатором игры. + + + showSplashCheckBox + Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. + + + discordRPCCheckbox + Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. + + + userName + Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. + + + TrophyKey + Ключ трофеев:\nКлюч, используемый для расшифровки трофеев. Должен быть получен из вашей взломанной консоли.\nДолжен содержать только шестнадцатеричные символы. + + + logTypeGroupBox + Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. + + + logFilter + Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. + + + updaterGroupBox + Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. + + + GUIMusicGroupBox + Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. + + + disableTrophycheckBox + Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по-прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). + + + hideCursorGroupBox + Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. + + + idleTimeoutGroupBox + Время скрытия курсора при бездействии:\nУстановите время, через которое курсор исчезнет при бездействии. + + + backButtonBehaviorGroupBox + Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. + + + enableCompatibilityCheckBox + Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. + + + checkCompatibilityOnStartupCheckBox + Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. + + + updateCompatibilityButton + Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. + + + Never + Никогда + + + Idle + При бездействии + + + Always + Всегда + + + Touchpad Left + Тачпад слева + + + Touchpad Right + Тачпад справа + + + Touchpad Center + Центр тачпада + + + None + Нет + + + graphicsAdapterGroupBox + Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите "Автовыбор", чтобы определить GPU автоматически. + + + resolutionLayout + Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. + + + heightDivider + Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! + + + dumpShadersCheckBox + Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. + + + nullGpuCheckBox + Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. + + + gameFoldersBox + Игровые папки:\nСписок папок для проверки установленных игр. + + + addFolderButton + Добавить:\nДобавить папку в список. + + + removeFolderButton + Удалить:\nУдалить папку из списка. + + + debugDump + Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. + + + vkValidationCheckBox + Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. + + + vkSyncValidationCheckBox + Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. + + + rdocCheckBox + Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с RenderDoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. + + + collectShaderCheckBox + Собирать шейдеры:\nВам необходимо включить эту функцию для редактирования шейдеров с помощью меню отладки (Ctrl + F10). + + + crashDiagnosticsCheckBox + Диагностика сбоев:\nСоздает .yaml файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. + + + copyGPUBuffersCheckBox + Копировать буферы GPU:\nПозволяет обойти состояния гонки, связанные с отправками GPU.\nМожет помочь или не помочь при сбоях PM4 типа 0. + + + hostMarkersCheckBox + Маркеры отладки хоста:\nДобавляет информацию на стороне эмулятора, например маркеры для определенных команд AMDGPU, вокруг команд Vulkan, а также присваивает ресурсам отладочные имена.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. + + + guestMarkersCheckBox + Маркеры отладки гостя:\nДобавляет любые отладочные маркеры, добавленные самой игрой, в буфер команд.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. + + + saveDataBox + Путь сохранений:\nПапка, в которой будут храниться сохранения игр. + + + browseButton + Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений. + + + Borderless + Без полей + + + True + Истинный + + + Release + Release + + + Nightly + Nightly + + + Set the volume of the background music. + Установите громкость фоновой музыки. + + + Enable Motion Controls + Включить управление движением + + + Save Data Path + Путь сохранений + + + Browse + Обзор + + + async + асинхронный + + + sync + синхронный + + + Directory to install games + Каталог для установки игр + + + Directory to save data + Каталог для сохранений + + + Auto Select + Автовыбор + + + Enable HDR + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + + TrophyViewer + + Trophy Viewer + Просмотр трофеев + diff --git a/src/qt_gui/translations/sq.ts b/src/qt_gui/translations/sq.ts deleted file mode 100644 index 20cce6f7d..000000000 --- a/src/qt_gui/translations/sq.ts +++ /dev/null @@ -1,1507 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - Rreth shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Ky program nuk duhet përdorur për të luajtur lojëra që nuk ke marrë ligjërisht. - - - - ElfViewer - - Open Folder - Hap Dosjen - - - - GameInfoClass - - Loading game list, please wait :3 - Po ngarkohet lista e lojërave, të lutem prit :3 - - - Cancel - Anulo - - - Loading... - Duke ngarkuar... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Përzgjidh dosjen - - - Select which directory you want to install to. - Përzgjidh në cilën dosje do që të instalosh. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Përzgjidh dosjen - - - Directory to install games - Dosja ku do instalohen lojërat - - - Browse - Shfleto - - - Error - Gabim - - - The value for location to install games is not valid. - Vlera për vendndodhjen e instalimit të lojërave nuk është e vlefshme. - - - - GuiContextMenus - - Create Shortcut - Krijo Shkurtore - - - Cheats / Patches - Mashtrime / Arna - - - SFO Viewer - Shikuesi i SFO - - - Trophy Viewer - Shikuesi i Trofeve - - - Open Folder... - Hap Dosjen... - - - Open Game Folder - Hap Dosjen e Lojës - - - Open Save Data Folder - Hap Dosjen e të Dhënave të Ruajtura - - - Open Log Folder - Hap Dosjen e Ditarit - - - Copy info... - Kopjo informacionin... - - - Copy Name - Kopjo Emrin - - - Copy Serial - Kopjo Serikun - - - Copy Version - Kopjo Versionin - - - Copy Size - Kopjo Madhësinë - - - Copy All - Kopjo të Gjitha - - - Delete... - Fshi... - - - Delete Game - Fshi lojën - - - Delete Update - Fshi përditësimin - - - Delete DLC - Fshi DLC-në - - - Compatibility... - Përputhshmëria... - - - Update database - Përditëso bazën e të dhënave - - - View report - Shiko raportin - - - Submit a report - Paraqit një raport - - - Shortcut creation - Krijimi i shkurtores - - - Shortcut created successfully! - Shkurtorja u krijua me sukses! - - - Error - Gabim - - - Error creating shortcut! - Gabim në krijimin e shkurtores! - - - Install PKG - Instalo PKG - - - Game - Loja - - - requiresEnableSeparateUpdateFolder_MSG - Kjo veçori kërkon cilësimin 'Aktivizo dosjen e ndarë të përditësimit' për të punuar. Në qoftë se do ta përdorësh këtë veçori, të lutem aktivizoje. - - - This game has no update to delete! - Kjo lojë nuk ka përditësim për të fshirë! - - - Update - Përditësim - - - This game has no DLC to delete! - Kjo lojë nuk ka DLC për të fshirë! - - - DLC - DLC - - - Delete %1 - Fshi %1 - - - Are you sure you want to delete %1's %2 directory? - Je i sigurt që do të fsish dosjen %2 të %1? - - - - MainWindow - - Open/Add Elf Folder - Hap/Shto Dosje ELF - - - Install Packages (PKG) - Instalo Paketat (PKG) - - - Boot Game - Nis Lojën - - - Check for Updates - Kontrollo për përditësime - - - About shadPS4 - Rreth shadPS4 - - - Configure... - Konfiguro... - - - Install application from a .pkg file - Instalo aplikacionin nga një skedar .pkg - - - Recent Games - Lojërat e fundit - - - Open shadPS4 Folder - Hap dosjen e shadPS4 - - - Exit - Dil - - - Exit shadPS4 - Dil nga shadPS4 - - - Exit the application. - Dil nga aplikacioni. - - - Show Game List - Shfaq Listën e Lojërave - - - Game List Refresh - Rifresko Listën e Lojërave - - - Tiny - Të vockla - - - Small - Të vogla - - - Medium - Të mesme - - - Large - Të mëdha - - - List View - Pamja me List - - - Grid View - Pamja me Rrjetë - - - Elf Viewer - Shikuesi i ELF - - - Game Install Directory - Dosja e Instalimit të Lojës - - - Download Cheats/Patches - Shkarko Mashtrime/Arna - - - Dump Game List - Zbraz Listën e Lojërave - - - PKG Viewer - Shikuesi i PKG - - - Search... - Kërko... - - - File - Skedari - - - View - Pamja - - - Game List Icons - Ikonat e Listës së Lojërave - - - Game List Mode - Mënyra e Listës së Lojërave - - - Settings - Cilësimet - - - Utils - Shërbimet - - - Themes - Motivet - - - Help - Ndihmë - - - Dark - E errët - - - Light - E çelët - - - Green - E gjelbër - - - Blue - E kaltër - - - Violet - Vjollcë - - - toolBar - Shiriti i veglave - - - Game List - Lista e lojërave - - - * Unsupported Vulkan Version - * Version i pambështetur i Vulkan - - - Download Cheats For All Installed Games - Shkarko mashtrime për të gjitha lojërat e instaluara - - - Download Patches For All Games - Shkarko arna për të gjitha lojërat e instaluara - - - Download Complete - Shkarkimi përfundoi - - - You have downloaded cheats for all the games you have installed. - Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. - - - Patches Downloaded Successfully! - Arnat u shkarkuan me sukses! - - - All Patches available for all games have been downloaded. - Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. - - - Games: - Lojërat: - - - PKG File (*.PKG) - Skedar PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Skedarë ELF (*.bin *.elf *.oelf) - - - Game Boot - Nis Lojën - - - Only one file can be selected! - Mund të përzgjidhet vetëm një skedar! - - - PKG Extraction - Nxjerrja e PKG-së - - - Patch detected! - U zbulua një arnë! - - - PKG and Game versions match: - PKG-ja dhe versioni i Lojës përputhen: - - - Would you like to overwrite? - Dëshiron të mbishkruash? - - - PKG Version %1 is older than installed version: - Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: - - - Game is installed: - Loja është instaluar: - - - Would you like to install Patch: - Dëshiron të instalosh Arnën: - - - DLC Installation - Instalimi i DLC-ve - - - Would you like to install DLC: %1? - Dëshiron të instalosh DLC-në: %1? - - - DLC already installed: - DLC-ja është instaluar tashmë: - - - Game already installed - Loja është instaluar tashmë - - - PKG is a patch, please install the game first! - PKG-ja është një arnë, të lutem instalo lojën fillimisht! - - - PKG ERROR - GABIM PKG - - - Extracting PKG %1/%2 - Po nxirret PKG-ja %1/%2 - - - Extraction Finished - Nxjerrja Përfundoi - - - Game successfully installed at %1 - Loja u instalua me sukses në %1 - - - File doesn't appear to be a valid PKG file - Skedari nuk duket si skedar PKG i vlefshëm - - - - PKGViewer - - Open Folder - Hap Dosjen - - - - TrophyViewer - - Trophy Viewer - Shikuesi i Trofeve - - - - SettingsDialog - - Settings - Cilësimet - - - General - Të përgjithshme - - - System - Sistemi - - - Console Language - Gjuha e Konsolës - - - Emulator Language - Gjuha e emulatorit - - - Emulator - Emulatori - - - Enable Fullscreen - Aktivizo Ekranin e plotë - - - Fullscreen Mode - Mënyra me ekran të plotë - - - Enable Separate Update Folder - Aktivizo dosjen e ndarë të përditësimit - - - Default tab when opening settings - Skeda e parazgjedhur kur hapen cilësimet - - - Show Game Size In List - Shfaq madhësinë e lojës në listë - - - Show Splash - Shfaq Pamjen e nisjes - - - Is PS4 Pro - Mënyra PS4 Pro - - - Enable Discord Rich Presence - Aktivizo Discord Rich Presence - - - Username - Përdoruesi - - - Trophy Key - Çelësi i Trofeve - - - Trophy - Trofeu - - - Logger - Regjistruesi i ditarit - - - Log Type - Lloji i Ditarit - - - Log Filter - Filtri i Ditarit - - - Open Log Location - Hap vendndodhjen e Ditarit - - - Input - Hyrja - - - Cursor - Kursori - - - Hide Cursor - Fshih kursorin - - - Hide Cursor Idle Timeout - Koha për fshehjen e kursorit joaktiv - - - s - s - - - Controller - Dorezë - - - Back Button Behavior - Sjellja e butonit mbrapa - - - Graphics - Grafika - - - GUI - Ndërfaqja - - - User - Përdoruesi - - - Graphics Device - Pajisja e Grafikës - - - Width - Gjerësia - - - Height - Lartësia - - - Vblank Divider - Ndarës Vblank - - - Advanced - Të përparuara - - - Enable Shaders Dumping - Aktivizo Zbrazjen e Shaders-ave - - - Enable NULL GPU - Aktivizo GPU-në NULL - - - Paths - Shtigjet - - - Game Folders - Dosjet e lojës - - - Add... - Shto... - - - Remove - Hiq - - - Debug - Korrigjim - - - Enable Debug Dumping - Aktivizo Zbrazjen për Korrigjim - - - Enable Vulkan Validation Layers - Aktivizo Shtresat e Vlefshmërisë Vulkan - - - Enable Vulkan Synchronization Validation - Aktivizo Vërtetimin e Sinkronizimit Vulkan - - - Enable RenderDoc Debugging - Aktivizo Korrigjimin RenderDoc - - - Enable Crash Diagnostics - Aktivizo Diagnozën e Rënies - - - Collect Shaders - Mblidh Shader-at - - - Copy GPU Buffers - Kopjo buffer-ët e GPU-së - - - Host Debug Markers - Shënjuesit e korrigjimit të host-it - - - Guest Debug Markers - Shënjuesit e korrigjimit të guest-it - - - Update - Përditëso - - - Check for Updates at Startup - Kontrollo për përditësime në nisje - - - Always Show Changelog - Shfaq gjithmonë regjistrin e ndryshimeve - - - Update Channel - Kanali i përditësimit - - - Check for Updates - Kontrollo për përditësime - - - GUI Settings - Cilësimet e GUI-së - - - Title Music - Muzika e titullit - - - Disable Trophy Pop-ups - Çaktivizo njoftimet për Trofetë - - - Background Image - Imazhi i sfondit - - - Show Background Image - Shfaq imazhin e sfondit - - - Opacity - Tejdukshmëria - - - Play title music - Luaj muzikën e titullit - - - Update Compatibility Database On Startup - Përditëso bazën e të dhënave të përputhshmërisë gjatë nisjes - - - Game Compatibility - Përputhshmëria e lojës - - - Display Compatibility Data - Shfaq të dhënat e përputhshmërisë - - - Update Compatibility Database - Përditëso bazën e të dhënave të përputhshmërisë - - - Volume - Vëllimi i zërit - - - Audio Backend - Audio Backend - - - Save - Ruaj - - - Apply - Zbato - - - Restore Defaults - Rikthe paracaktimet - - - Close - Mbyll - - - Point your mouse at an option to display its description. - Vendos miun mbi një rregullim për të shfaqur përshkrimin e tij. - - - consoleLanguageGroupBox - Gjuha e konsolës:\nPërcakton gjuhën që përdor loja PS4.\nKëshillohet të caktosh një gjuhë që loja mbështet, e cila do të ndryshojë sipas rajonit. - - - emulatorLanguageGroupBox - Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. - - - fullscreenCheckBox - Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës në mënyrën e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur tastin F11. - - - separateUpdatesCheckBox - Aktivizo dosjen e ndarë të përditësimit:\nAktivizon instalimin e përditësimeve të lojërave në dosje të veçanta për menaxhim më të lehtë.\nKjo mund të krijohet manualisht duke shtuar përditësimin e shpaketuar në dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID-në e lojës. - - - showSplashCheckBox - Shfaq ekranin e ngarkesës:\nShfaq ekranin e ngarkesës së lojës (një pamje e veçantë) gjatë fillimit të lojës. - - - ps4proCheckBox - Është PS4 Pro:\nBën që emulatori të veprojë si një PS4 PRO, gjë që mund të aktivizojë veçori të veçanta në lojrat që e mbështesin. - - - discordRPCCheckbox - Aktivizo Discord Rich Presence:\nShfaq ikonën e emulatorit dhe informacionin përkatës në profilin tënd në Discord. - - - userName - Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. - - - TrophyKey - Çelësi i Trofeve:\nÇelësi përdoret për të deshifruar trofetë. Duhet të merret nga konsola jote me jailbreak.\nDuhet të përmbajë vetëm karaktere hex. - - - logTypeGroupBox - Lloji i ditarit:\nPërcakton nëse të sinkronizohet dalja e dritares së ditarit për performancë. Mund të ketë efekte të këqija në emulim. - - - logFilter - Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. - - - updaterGroupBox - Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. - - - GUIBackgroundImageGroupBox - Imazhi i Sfondit:\nKontrollo tejdukshmërinë e imazhit të sfondit të lojës. - - - GUIMusicGroupBox - Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në ndërfaqe. - - - disableTrophycheckBox - Çaktivizo njoftimet për Trofetë:\nÇaktivizo njoftimet për trofetë gjatë lojës. Përparimi i trofeve mund të ndiqet duke përdorur Shikuesin e Trofeve (kliko me të djathtën mbi lojën në dritaren kryesore). - - - hideCursorGroupBox - Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nJoaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. - - - idleTimeoutGroupBox - Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja (në sekonda) pas së cilës kursori që nuk ka qënë në veprim fshihet. - - - backButtonBehaviorGroupBox - Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mprapa. - - - enableCompatibilityCheckBox - Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për të marrë informacion të përditësuar. - - - checkCompatibilityOnStartupCheckBox - Përditëso përputhshmërinë gjatë nisjes:\nPërditëson automatikisht bazën e të dhënave të përputhshmërisë kur shadPS4 niset. - - - updateCompatibilityButton - Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. - - - Never - Kurrë - - - Idle - Joaktiv - - - Always - Gjithmonë - - - Touchpad Left - Tastiera prekëse majtas - - - Touchpad Right - Tastiera prekëse djathtas - - - Touchpad Center - Tastiera prekëse në qendër - - - None - Asnjë - - - graphicsAdapterGroupBox - Pajisja grafike:\nNë sistemet me GPU të shumëfishta, zgjidh GPU-në që do të përdorë emulatori nga lista rënëse,\nose zgjidh "Auto Select" për ta përcaktuar automatikisht. - - - resolutionLayout - Gjerësia/Lartësia:\nPërcakton madhësinë e dritares së emulatorit në nisje, e cila mund të rregullohet gjatë lojës.\nKjo është ndryshe nga rezolucioni në lojë. - - - heightDivider - Ndarësi Vblank:\nFrekuenca pamore me të cilën rifreskohet emulatori shumëzohet me këtë numër. Ndryshimi i këtij mund të ketë efekte të këqija, si rritja e shpejtësisë së lojës ose prishja e punimit thelbësor të lojës që nuk e pret këtë ndryshim! - - - dumpShadersCheckBox - Aktivizo zbrazjen e shaders-ave:\nPër qëllime të korrigjimit teknik, ruan shaders-at e lojës në një dosje ndërsa ato pasqyrohen. - - - nullGpuCheckBox - Aktivizo GPU-në Null:\nPër qëllime të korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike. - - - gameFoldersBox - Dosjet e lojërave:\nLista e dosjeve për të kontrolluar lojërat e instaluara. - - - addFolderButton - Shto:\nShto një dosje në listë. - - - removeFolderButton - Hiq:\nHiq një dosje nga lista. - - - debugDump - Aktivizo zbrazjen për korrigjim:\nRuan simbolet e importit dhe eksportit dhe informacionin e kreut të skedarit për aplikacionin PS4 që po ekzekutohet në një dosje. - - - vkValidationCheckBox - Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - - - vkSyncValidationCheckBox - Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - - - rdocCheckBox - Aktivizo korrigjimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e pamjes të pasqyruar në moment. - - - collectShaderCheckBox - Mblidh Shader-at:\nDuhet ta aktivizosh këtë për të redaktuar shader-at me menynë e korrigjimit (Ctrl + F10). - - - crashDiagnosticsCheckBox - Diagnoza e rënies:\nKrijon një skedar .yaml me informacion rreth gjendjes së Vulkan-it në momentin e rënies.\nE dobishme për zgjidhjen e gabimeve 'Device lost'. Nëse e ke aktivizuar këtë, duhet të aktivizosh Shënjuesit e korrigjimit të host-it DHE të guest-it.\nNuk punon me GPU-t Intel.\nDuhet të kesh aktivizuar Shtresat e Vlefshmërisë Vulkan dhe Vulkan SDK që kjo të punojë. - - - copyGPUBuffersCheckBox - Kopjo buffer-ët e GPU-së:\nShmang kushtet e garës (race conditions) që lidhen me dërgimet e GPU-së.\nMund të ndihmojë, ose jo, në rast rëniesh të llojit PM4 0. - - - hostMarkersCheckBox - Shënjuesit e korrigjimit të host-it:\nShton informacion nga ana e emulatorit, si shënjues për komandat specifike AMDGPU rreth komandave Vulkan, si dhe jep burimeve emra korrigjimi.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. - - - guestMarkersCheckBox - Shënjuesit e korrigjimit të guest-it:\nShton çdo shënjues për korrigjim që loja vetë ka shtuar në buffer-in e komandave.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. - - - saveDataBox - Shtegu i Ruajtjes së të Dhënave:\nDosja ku do të ruhen të dhënat e ruajtjes së lojës. - - - browseButton - Shfleto:\nShfleto për të vendosur një dosje si shteg të ruajtjes së të dhënave. - - - - CheatsPatches - - Cheats / Patches for - Mashtrime / Arna për - - - defaultTextEdit_MSG - Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Nuk ofrohet asnjë imazh - - - Serial: - Seriku: - - - Version: - Versioni: - - - Size: - Madhësia: - - - Select Cheat File: - Përzgjidh Skedarin e Mashtrimit: - - - Repository: - Depo: - - - Download Cheats - Shkarko Mashtrimet - - - Delete File - Fshi Skedarin - - - No files selected. - Nuk u zgjodh asnjë skedar. - - - You can delete the cheats you don't want after downloading them. - Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. - - - Do you want to delete the selected file?\n%1 - Dëshiron të fshish skedarin e përzgjedhur?\n%1 - - - Select Patch File: - Përzgjidh Skedarin e Arnës: - - - Download Patches - Shkarko Arnat - - - Save - Ruaj - - - Cheats - Mashtrime - - - Patches - Arna - - - Error - Gabim - - - No patch selected. - Asnjë arnë e përzgjedhur. - - - Unable to open files.json for reading. - files.json nuk mund të hapet për lexim. - - - No patch file found for the current serial. - Nuk u gjet asnjë skedar patch për serikun aktual. - - - Unable to open the file for reading. - Skedari nuk mund të hapet për lexim. - - - Unable to open the file for writing. - Skedari nuk mund të hapet për shkrim. - - - Failed to parse XML: - Analiza e XML-së dështoi: - - - Success - Sukses - - - Options saved successfully. - Rregullimet u ruajtën me sukses. - - - Invalid Source - Burim i pavlefshëm - - - The selected source is invalid. - Burimi i përzgjedhur është i pavlefshëm. - - - File Exists - Skedari Ekziston - - - File already exists. Do you want to replace it? - Skedari ekziston tashmë. Dëshiron ta zëvendësosh? - - - Failed to save file: - Ruajtja e skedarit dështoi: - - - Failed to download file: - Shkarkimi i skedarit dështoi: - - - Cheats Not Found - Mashtrimet nuk u gjetën - - - CheatsNotFound_MSG - Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. - - - Cheats Downloaded Successfully - Mashtrimet u shkarkuan me sukses - - - CheatsDownloadedSuccessfully_MSG - Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. - - - Failed to save: - Ruajtja dështoi: - - - Failed to download: - Shkarkimi dështoi: - - - Download Complete - Shkarkimi përfundoi - - - DownloadComplete_MSG - Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse arna nuk shfaqet, mund të mos ekzistojë për numrin e serikut dhe versionin specifik të lojës. - - - Failed to parse JSON data from HTML. - Analiza e të dhënave JSON nga HTML dështoi. - - - Failed to retrieve HTML page. - Gjetja e faqes HTML dështoi. - - - The game is in version: %1 - Loja është në versionin: %1 - - - The downloaded patch only works on version: %1 - Arna e shkarkuar funksionon vetëm në versionin: %1 - - - You may need to update your game. - Mund të duhet të përditësosh lojën tënde. - - - Incompatibility Notice - Njoftim për mospërputhje - - - Failed to open file: - Hapja e skedarit dështoi: - - - XML ERROR: - GABIM XML: - - - Failed to open files.json for writing - Hapja e files.json për shkrim dështoi - - - Author: - Autori: - - - Directory does not exist: - Dosja nuk ekziston: - - - Failed to open files.json for reading. - Hapja e files.json për lexim dështoi. - - - Name: - Emri: - - - Can't apply cheats before the game is started - Nuk mund të zbatohen mashtrime para fillimit të lojës. - - - - GameListFrame - - Icon - Ikona - - - Name - Emri - - - Serial - Seriku - - - Compatibility - Përputhshmëria - - - Region - Rajoni - - - Firmware - Firmueri - - - Size - Madhësia - - - Version - Versioni - - - Path - Shtegu - - - Play Time - Koha e luajtjes - - - Never Played - Nuk është luajtur kurrë - - - h - o - - - m - m - - - s - s - - - Compatibility is untested - Përputhshmëria nuk është e testuar - - - Game does not initialize properly / crashes the emulator - Loja nuk niset siç duhet / rrëzon emulatorin - - - Game boots, but only displays a blank screen - Loja niset, por shfaq vetëm një ekran të zbrazët - - - Game displays an image but does not go past the menu - Loja shfaq një imazh, por nuk kalon përtej menysë - - - Game has game-breaking glitches or unplayable performance - Loja ka probleme kritike ose performancë të papërshtatshme për lojë - - - Game can be completed with playable performance and no major glitches - Loja mund të përfundohet me performancë të luajtshme dhe pa probleme të mëdha - - - Click to see details on github - Kliko për të parë detajet në GitHub - - - Last updated - Përditësuar për herë të fundit - - - - CheckUpdate - - Auto Updater - Përditësues automatik - - - Error - Gabim - - - Network error: - Gabim rrjeti: - - - Error_Github_limit_MSG - Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nKe arritur këtë kufi. Të lutem provo përsëri më vonë. - - - Failed to parse update information. - Analizimi i informacionit të përditësimit deshtoi. - - - No pre-releases found. - Nuk u gjetën botime paraprake. - - - Invalid release data. - Të dhënat e lëshimit janë të pavlefshme. - - - No download URL found for the specified asset. - Nuk u gjet URL-ja e shkarkimit për burimin e specifikuar. - - - Your version is already up to date! - Versioni jotë është i përditësuar tashmë! - - - Update Available - Ofrohet një përditësim - - - Update Channel - Kanali i përditësimit - - - Current Version - Versioni i tanishëm - - - Latest Version - Versioni më i fundit - - - Do you want to update? - Do të përditësosh? - - - Show Changelog - Trego ndryshimet - - - Check for Updates at Startup - Kontrollo për përditësime në nisje - - - Update - Përditëso - - - No - Jo - - - Hide Changelog - Fshih ndryshimet - - - Changes - Ndryshimet - - - Network error occurred while trying to access the URL - Ka ndodhur një gabim rrjeti gjatë përpjekjes për të qasur në URL-në - - - Download Complete - Shkarkimi përfundoi - - - The update has been downloaded, press OK to install. - Përditësimi është shkarkuar, shtyp OK për ta instaluar. - - - Failed to save the update file at - Dështoi ruajtja e skedarit të përditësimit në - - - Starting Update... - Po fillon përditësimi... - - - Failed to create the update script file - Krijimi i skedarit skript të përditësimit dështoi - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Duke marrë të dhënat e përputhshmërisë, të lutem prit - - - Cancel - Anulo - - - Loading... - Po ngarkohet... - - - Error - Gabim - - - Unable to update compatibility data! Try again later. - Nuk mund të përditësohen të dhënat e përputhshmërisë! Provo përsëri më vonë. - - - Unable to open compatibility_data.json for writing. - Nuk mund të hapet compatibility_data.json për të shkruar. - - - Unknown - E panjohur - - - Nothing - Asgjë - - - Boots - Niset - - - Menus - Meny - - - Ingame - Në lojë - - - Playable - E luajtshme - - - diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts new file mode 100644 index 000000000..ebd67452f --- /dev/null +++ b/src/qt_gui/translations/sq_AL.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + Rreth shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Ky program nuk duhet përdorur për të luajtur lojëra që nuk ke marrë ligjërisht. + + + + CheatsPatches + + Cheats / Patches for + Mashtrime / Arna për + + + defaultTextEdit_MSG + Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Nuk ofrohet asnjë imazh + + + Serial: + Seriku: + + + Version: + Versioni: + + + Size: + Madhësia: + + + Select Cheat File: + Përzgjidh Skedarin e Mashtrimit: + + + Repository: + Depo: + + + Download Cheats + Shkarko Mashtrimet + + + Delete File + Fshi Skedarin + + + No files selected. + Nuk u zgjodh asnjë skedar. + + + You can delete the cheats you don't want after downloading them. + Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. + + + Do you want to delete the selected file?\n%1 + Dëshiron të fshish skedarin e përzgjedhur?\n%1 + + + Select Patch File: + Përzgjidh Skedarin e Arnës: + + + Download Patches + Shkarko Arnat + + + Save + Ruaj + + + Cheats + Mashtrime + + + Patches + Arna + + + Error + Gabim + + + No patch selected. + Asnjë arnë e përzgjedhur. + + + Unable to open files.json for reading. + files.json nuk mund të hapet për lexim. + + + No patch file found for the current serial. + Nuk u gjet asnjë skedar patch për serikun aktual. + + + Unable to open the file for reading. + Skedari nuk mund të hapet për lexim. + + + Unable to open the file for writing. + Skedari nuk mund të hapet për shkrim. + + + Failed to parse XML: + Analiza e XML-së dështoi: + + + Success + Sukses + + + Options saved successfully. + Rregullimet u ruajtën me sukses. + + + Invalid Source + Burim i pavlefshëm + + + The selected source is invalid. + Burimi i përzgjedhur është i pavlefshëm. + + + File Exists + Skedari Ekziston + + + File already exists. Do you want to replace it? + Skedari ekziston tashmë. Dëshiron ta zëvendësosh? + + + Failed to save file: + Ruajtja e skedarit dështoi: + + + Failed to download file: + Shkarkimi i skedarit dështoi: + + + Cheats Not Found + Mashtrimet nuk u gjetën + + + CheatsNotFound_MSG + Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. + + + Cheats Downloaded Successfully + Mashtrimet u shkarkuan me sukses + + + CheatsDownloadedSuccessfully_MSG + Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. + + + Failed to save: + Ruajtja dështoi: + + + Failed to download: + Shkarkimi dështoi: + + + Download Complete + Shkarkimi përfundoi + + + DownloadComplete_MSG + Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse arna nuk shfaqet, mund të mos ekzistojë për numrin e serikut dhe versionin specifik të lojës. + + + Failed to parse JSON data from HTML. + Analiza e të dhënave JSON nga HTML dështoi. + + + Failed to retrieve HTML page. + Gjetja e faqes HTML dështoi. + + + The game is in version: %1 + Loja është në versionin: %1 + + + The downloaded patch only works on version: %1 + Arna e shkarkuar funksionon vetëm në versionin: %1 + + + You may need to update your game. + Mund të duhet të përditësosh lojën tënde. + + + Incompatibility Notice + Njoftim për mospërputhje + + + Failed to open file: + Hapja e skedarit dështoi: + + + XML ERROR: + GABIM XML: + + + Failed to open files.json for writing + Hapja e files.json për shkrim dështoi + + + Author: + Autori: + + + Directory does not exist: + Dosja nuk ekziston: + + + Failed to open files.json for reading. + Hapja e files.json për lexim dështoi. + + + Name: + Emri: + + + Can't apply cheats before the game is started + Nuk mund të zbatohen mashtrime para fillimit të lojës. + + + Close + Mbyll + + + + CheckUpdate + + Auto Updater + Përditësues automatik + + + Error + Gabim + + + Network error: + Gabim rrjeti: + + + Error_Github_limit_MSG + Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nKe arritur këtë kufi. Të lutem provo përsëri më vonë. + + + Failed to parse update information. + Analizimi i informacionit të përditësimit deshtoi. + + + No pre-releases found. + Nuk u gjetën botime paraprake. + + + Invalid release data. + Të dhënat e lëshimit janë të pavlefshme. + + + No download URL found for the specified asset. + Nuk u gjet URL-ja e shkarkimit për burimin e specifikuar. + + + Your version is already up to date! + Versioni jotë është i përditësuar tashmë! + + + Update Available + Ofrohet një përditësim + + + Update Channel + Kanali i përditësimit + + + Current Version + Versioni i tanishëm + + + Latest Version + Versioni më i fundit + + + Do you want to update? + Do të përditësosh? + + + Show Changelog + Trego ndryshimet + + + Check for Updates at Startup + Kontrollo për përditësime në nisje + + + Update + Përditëso + + + No + Jo + + + Hide Changelog + Fshih ndryshimet + + + Changes + Ndryshimet + + + Network error occurred while trying to access the URL + Ka ndodhur një gabim rrjeti gjatë përpjekjes për të qasur në URL-në + + + Download Complete + Shkarkimi përfundoi + + + The update has been downloaded, press OK to install. + Përditësimi është shkarkuar, shtyp OK për ta instaluar. + + + Failed to save the update file at + Dështoi ruajtja e skedarit të përditësimit në + + + Starting Update... + Po fillon përditësimi... + + + Failed to create the update script file + Krijimi i skedarit skript të përditësimit dështoi + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Duke marrë të dhënat e përputhshmërisë, të lutem prit + + + Cancel + Anulo + + + Loading... + Po ngarkohet... + + + Error + Gabim + + + Unable to update compatibility data! Try again later. + Nuk mund të përditësohen të dhënat e përputhshmërisë! Provo përsëri më vonë. + + + Unable to open compatibility_data.json for writing. + Nuk mund të hapet compatibility_data.json për të shkruar. + + + Unknown + E panjohur + + + Nothing + Asgjë + + + Boots + Niset + + + Menus + Meny + + + Ingame + Në lojë + + + Playable + E luajtshme + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Hap Dosjen + + + + GameInfoClass + + Loading game list, please wait :3 + Po ngarkohet lista e lojërave, të lutem prit :3 + + + Cancel + Anulo + + + Loading... + Duke ngarkuar... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Përzgjidh dosjen + + + Directory to install games + Dosja ku do instalohen lojërat + + + Browse + Shfleto + + + Error + Gabim + + + Directory to install DLC + + + + + GameListFrame + + Icon + Ikona + + + Name + Emri + + + Serial + Seriku + + + Compatibility + Përputhshmëria + + + Region + Rajoni + + + Firmware + Firmueri + + + Size + Madhësia + + + Version + Versioni + + + Path + Shtegu + + + Play Time + Koha e luajtjes + + + Never Played + Nuk është luajtur kurrë + + + h + o + + + m + m + + + s + s + + + Compatibility is untested + Përputhshmëria nuk është e testuar + + + Game does not initialize properly / crashes the emulator + Loja nuk niset siç duhet / rrëzon emulatorin + + + Game boots, but only displays a blank screen + Loja niset, por shfaq vetëm një ekran të zbrazët + + + Game displays an image but does not go past the menu + Loja shfaq një imazh, por nuk kalon përtej menysë + + + Game has game-breaking glitches or unplayable performance + Loja ka probleme kritike ose performancë të papërshtatshme për lojë + + + Game can be completed with playable performance and no major glitches + Loja mund të përfundohet me performancë të luajtshme dhe pa probleme të mëdha + + + Click to see details on github + Kliko për të parë detajet në GitHub + + + Last updated + Përditësuar për herë të fundit + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Krijo Shkurtore + + + Cheats / Patches + Mashtrime / Arna + + + SFO Viewer + Shikuesi i SFO + + + Trophy Viewer + Shikuesi i Trofeve + + + Open Folder... + Hap Dosjen... + + + Open Game Folder + Hap Dosjen e Lojës + + + Open Save Data Folder + Hap Dosjen e të Dhënave të Ruajtura + + + Open Log Folder + Hap Dosjen e Ditarit + + + Copy info... + Kopjo informacionin... + + + Copy Name + Kopjo Emrin + + + Copy Serial + Kopjo Serikun + + + Copy Version + Kopjo Versionin + + + Copy Size + Kopjo Madhësinë + + + Copy All + Kopjo të Gjitha + + + Delete... + Fshi... + + + Delete Game + Fshi lojën + + + Delete Update + Fshi përditësimin + + + Delete DLC + Fshi DLC-në + + + Compatibility... + Përputhshmëria... + + + Update database + Përditëso bazën e të dhënave + + + View report + Shiko raportin + + + Submit a report + Paraqit një raport + + + Shortcut creation + Krijimi i shkurtores + + + Shortcut created successfully! + Shkurtorja u krijua me sukses! + + + Error + Gabim + + + Error creating shortcut! + Gabim në krijimin e shkurtores! + + + Install PKG + Instalo PKG + + + Game + Loja + + + This game has no update to delete! + Kjo lojë nuk ka përditësim për të fshirë! + + + Update + Përditësim + + + This game has no DLC to delete! + Kjo lojë nuk ka DLC për të fshirë! + + + DLC + DLC + + + Delete %1 + Fshi %1 + + + Are you sure you want to delete %1's %2 directory? + Je i sigurt që do të fsish dosjen %2 të %1? + + + Open Update Folder + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Përzgjidh dosjen + + + Select which directory you want to install to. + Përzgjidh në cilën dosje do që të instalosh. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Hap/Shto Dosje ELF + + + Install Packages (PKG) + Instalo Paketat (PKG) + + + Boot Game + Nis Lojën + + + Check for Updates + Kontrollo për përditësime + + + About shadPS4 + Rreth shadPS4 + + + Configure... + Konfiguro... + + + Install application from a .pkg file + Instalo aplikacionin nga një skedar .pkg + + + Recent Games + Lojërat e fundit + + + Open shadPS4 Folder + Hap dosjen e shadPS4 + + + Exit + Dil + + + Exit shadPS4 + Dil nga shadPS4 + + + Exit the application. + Dil nga aplikacioni. + + + Show Game List + Shfaq Listën e Lojërave + + + Game List Refresh + Rifresko Listën e Lojërave + + + Tiny + Të vockla + + + Small + Të vogla + + + Medium + Të mesme + + + Large + Të mëdha + + + List View + Pamja me List + + + Grid View + Pamja me Rrjetë + + + Elf Viewer + Shikuesi i ELF + + + Game Install Directory + Dosja e Instalimit të Lojës + + + Download Cheats/Patches + Shkarko Mashtrime/Arna + + + Dump Game List + Zbraz Listën e Lojërave + + + PKG Viewer + Shikuesi i PKG + + + Search... + Kërko... + + + File + Skedari + + + View + Pamja + + + Game List Icons + Ikonat e Listës së Lojërave + + + Game List Mode + Mënyra e Listës së Lojërave + + + Settings + Cilësimet + + + Utils + Shërbimet + + + Themes + Motivet + + + Help + Ndihmë + + + Dark + E errët + + + Light + E çelët + + + Green + E gjelbër + + + Blue + E kaltër + + + Violet + Vjollcë + + + toolBar + Shiriti i veglave + + + Game List + Lista e lojërave + + + * Unsupported Vulkan Version + * Version i pambështetur i Vulkan + + + Download Cheats For All Installed Games + Shkarko mashtrime për të gjitha lojërat e instaluara + + + Download Patches For All Games + Shkarko arna për të gjitha lojërat e instaluara + + + Download Complete + Shkarkimi përfundoi + + + You have downloaded cheats for all the games you have installed. + Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. + + + Patches Downloaded Successfully! + Arnat u shkarkuan me sukses! + + + All Patches available for all games have been downloaded. + Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. + + + Games: + Lojërat: + + + ELF files (*.bin *.elf *.oelf) + Skedarë ELF (*.bin *.elf *.oelf) + + + Game Boot + Nis Lojën + + + Only one file can be selected! + Mund të përzgjidhet vetëm një skedar! + + + PKG Extraction + Nxjerrja e PKG-së + + + Patch detected! + U zbulua një arnë! + + + PKG and Game versions match: + PKG-ja dhe versioni i Lojës përputhen: + + + Would you like to overwrite? + Dëshiron të mbishkruash? + + + PKG Version %1 is older than installed version: + Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: + + + Game is installed: + Loja është instaluar: + + + Would you like to install Patch: + Dëshiron të instalosh Arnën: + + + DLC Installation + Instalimi i DLC-ve + + + Would you like to install DLC: %1? + Dëshiron të instalosh DLC-në: %1? + + + DLC already installed: + DLC-ja është instaluar tashmë: + + + Game already installed + Loja është instaluar tashmë + + + PKG ERROR + GABIM PKG + + + Extracting PKG %1/%2 + Po nxirret PKG-ja %1/%2 + + + Extraction Finished + Nxjerrja Përfundoi + + + Game successfully installed at %1 + Loja u instalua me sukses në %1 + + + File doesn't appear to be a valid PKG file + Skedari nuk duket si skedar PKG i vlefshëm + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Hap Dosjen + + + Name + Emri + + + Serial + Seriku + + + Installed + + + + Size + Madhësia + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Rajoni + + + Flags + + + + Path + Shtegu + + + File + Skedari + + + PKG ERROR + GABIM PKG + + + Unknown + E panjohur + + + Package + + + + + SettingsDialog + + Settings + Cilësimet + + + General + Të përgjithshme + + + System + Sistemi + + + Console Language + Gjuha e Konsolës + + + Emulator Language + Gjuha e emulatorit + + + Emulator + Emulatori + + + Enable Fullscreen + Aktivizo Ekranin e plotë + + + Fullscreen Mode + Mënyra me ekran të plotë + + + Enable Separate Update Folder + Aktivizo dosjen e ndarë të përditësimit + + + Default tab when opening settings + Skeda e parazgjedhur kur hapen cilësimet + + + Show Game Size In List + Shfaq madhësinë e lojës në listë + + + Show Splash + Shfaq Pamjen e nisjes + + + Enable Discord Rich Presence + Aktivizo Discord Rich Presence + + + Username + Përdoruesi + + + Trophy Key + Çelësi i Trofeve + + + Trophy + Trofeu + + + Logger + Regjistruesi i ditarit + + + Log Type + Lloji i Ditarit + + + Log Filter + Filtri i Ditarit + + + Open Log Location + Hap vendndodhjen e Ditarit + + + Input + Hyrja + + + Cursor + Kursori + + + Hide Cursor + Fshih kursorin + + + Hide Cursor Idle Timeout + Koha për fshehjen e kursorit joaktiv + + + s + s + + + Controller + Dorezë + + + Back Button Behavior + Sjellja e butonit mbrapa + + + Graphics + Grafika + + + GUI + Ndërfaqja + + + User + Përdoruesi + + + Graphics Device + Pajisja e Grafikës + + + Width + Gjerësia + + + Height + Lartësia + + + Vblank Divider + Ndarës Vblank + + + Advanced + Të përparuara + + + Enable Shaders Dumping + Aktivizo Zbrazjen e Shaders-ave + + + Enable NULL GPU + Aktivizo GPU-në NULL + + + Paths + Shtigjet + + + Game Folders + Dosjet e lojës + + + Add... + Shto... + + + Remove + Hiq + + + Debug + Korrigjim + + + Enable Debug Dumping + Aktivizo Zbrazjen për Korrigjim + + + Enable Vulkan Validation Layers + Aktivizo Shtresat e Vlefshmërisë Vulkan + + + Enable Vulkan Synchronization Validation + Aktivizo Vërtetimin e Sinkronizimit Vulkan + + + Enable RenderDoc Debugging + Aktivizo Korrigjimin RenderDoc + + + Enable Crash Diagnostics + Aktivizo Diagnozën e Rënies + + + Collect Shaders + Mblidh Shader-at + + + Copy GPU Buffers + Kopjo buffer-ët e GPU-së + + + Host Debug Markers + Shënjuesit e korrigjimit të host-it + + + Guest Debug Markers + Shënjuesit e korrigjimit të guest-it + + + Update + Përditëso + + + Check for Updates at Startup + Kontrollo për përditësime në nisje + + + Always Show Changelog + Shfaq gjithmonë regjistrin e ndryshimeve + + + Update Channel + Kanali i përditësimit + + + Check for Updates + Kontrollo për përditësime + + + GUI Settings + Cilësimet e GUI-së + + + Title Music + Muzika e titullit + + + Disable Trophy Pop-ups + Çaktivizo njoftimet për Trofetë + + + Background Image + Imazhi i sfondit + + + Show Background Image + Shfaq imazhin e sfondit + + + Opacity + Tejdukshmëria + + + Play title music + Luaj muzikën e titullit + + + Update Compatibility Database On Startup + Përditëso bazën e të dhënave të përputhshmërisë gjatë nisjes + + + Game Compatibility + Përputhshmëria e lojës + + + Display Compatibility Data + Shfaq të dhënat e përputhshmërisë + + + Update Compatibility Database + Përditëso bazën e të dhënave të përputhshmërisë + + + Volume + Vëllimi i zërit + + + Save + Ruaj + + + Apply + Zbato + + + Restore Defaults + Rikthe paracaktimet + + + Close + Mbyll + + + Point your mouse at an option to display its description. + Vendos miun mbi një rregullim për të shfaqur përshkrimin e tij. + + + consoleLanguageGroupBox + Gjuha e konsolës:\nPërcakton gjuhën që përdor loja PS4.\nKëshillohet të caktosh një gjuhë që loja mbështet, e cila do të ndryshojë sipas rajonit. + + + emulatorLanguageGroupBox + Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. + + + fullscreenCheckBox + Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës në mënyrën e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur tastin F11. + + + separateUpdatesCheckBox + Aktivizo dosjen e ndarë të përditësimit:\nAktivizon instalimin e përditësimeve të lojërave në dosje të veçanta për menaxhim më të lehtë.\nKjo mund të krijohet manualisht duke shtuar përditësimin e shpaketuar në dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID-në e lojës. + + + showSplashCheckBox + Shfaq ekranin e ngarkesës:\nShfaq ekranin e ngarkesës së lojës (një pamje e veçantë) gjatë fillimit të lojës. + + + discordRPCCheckbox + Aktivizo Discord Rich Presence:\nShfaq ikonën e emulatorit dhe informacionin përkatës në profilin tënd në Discord. + + + userName + Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. + + + TrophyKey + Çelësi i Trofeve:\nÇelësi përdoret për të deshifruar trofetë. Duhet të merret nga konsola jote me jailbreak.\nDuhet të përmbajë vetëm karaktere hex. + + + logTypeGroupBox + Lloji i ditarit:\nPërcakton nëse të sinkronizohet dalja e dritares së ditarit për performancë. Mund të ketë efekte të këqija në emulim. + + + logFilter + Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. + + + updaterGroupBox + Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. + + + GUIBackgroundImageGroupBox + Imazhi i Sfondit:\nKontrollo tejdukshmërinë e imazhit të sfondit të lojës. + + + GUIMusicGroupBox + Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në ndërfaqe. + + + disableTrophycheckBox + Çaktivizo njoftimet për Trofetë:\nÇaktivizo njoftimet për trofetë gjatë lojës. Përparimi i trofeve mund të ndiqet duke përdorur Shikuesin e Trofeve (kliko me të djathtën mbi lojën në dritaren kryesore). + + + hideCursorGroupBox + Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nJoaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. + + + idleTimeoutGroupBox + Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja (në sekonda) pas së cilës kursori që nuk ka qënë në veprim fshihet. + + + backButtonBehaviorGroupBox + Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mprapa. + + + enableCompatibilityCheckBox + Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për të marrë informacion të përditësuar. + + + checkCompatibilityOnStartupCheckBox + Përditëso përputhshmërinë gjatë nisjes:\nPërditëson automatikisht bazën e të dhënave të përputhshmërisë kur shadPS4 niset. + + + updateCompatibilityButton + Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. + + + Never + Kurrë + + + Idle + Joaktiv + + + Always + Gjithmonë + + + Touchpad Left + Tastiera prekëse majtas + + + Touchpad Right + Tastiera prekëse djathtas + + + Touchpad Center + Tastiera prekëse në qendër + + + None + Asnjë + + + graphicsAdapterGroupBox + Pajisja grafike:\nNë sistemet me GPU të shumëfishta, zgjidh GPU-në që do të përdorë emulatori nga lista rënëse,\nose zgjidh "Auto Select" për ta përcaktuar automatikisht. + + + resolutionLayout + Gjerësia/Lartësia:\nPërcakton madhësinë e dritares së emulatorit në nisje, e cila mund të rregullohet gjatë lojës.\nKjo është ndryshe nga rezolucioni në lojë. + + + heightDivider + Ndarësi Vblank:\nFrekuenca pamore me të cilën rifreskohet emulatori shumëzohet me këtë numër. Ndryshimi i këtij mund të ketë efekte të këqija, si rritja e shpejtësisë së lojës ose prishja e punimit thelbësor të lojës që nuk e pret këtë ndryshim! + + + dumpShadersCheckBox + Aktivizo zbrazjen e shaders-ave:\nPër qëllime të korrigjimit teknik, ruan shaders-at e lojës në një dosje ndërsa ato pasqyrohen. + + + nullGpuCheckBox + Aktivizo GPU-në Null:\nPër qëllime të korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike. + + + gameFoldersBox + Dosjet e lojërave:\nLista e dosjeve për të kontrolluar lojërat e instaluara. + + + addFolderButton + Shto:\nShto një dosje në listë. + + + removeFolderButton + Hiq:\nHiq një dosje nga lista. + + + debugDump + Aktivizo zbrazjen për korrigjim:\nRuan simbolet e importit dhe eksportit dhe informacionin e kreut të skedarit për aplikacionin PS4 që po ekzekutohet në një dosje. + + + vkValidationCheckBox + Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + + + vkSyncValidationCheckBox + Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + + + rdocCheckBox + Aktivizo korrigjimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e pamjes të pasqyruar në moment. + + + collectShaderCheckBox + Mblidh Shader-at:\nDuhet ta aktivizosh këtë për të redaktuar shader-at me menynë e korrigjimit (Ctrl + F10). + + + crashDiagnosticsCheckBox + Diagnoza e rënies:\nKrijon një skedar .yaml me informacion rreth gjendjes së Vulkan-it në momentin e rënies.\nE dobishme për zgjidhjen e gabimeve 'Device lost'. Nëse e ke aktivizuar këtë, duhet të aktivizosh Shënjuesit e korrigjimit të host-it DHE të guest-it.\nNuk punon me GPU-t Intel.\nDuhet të kesh aktivizuar Shtresat e Vlefshmërisë Vulkan dhe Vulkan SDK që kjo të punojë. + + + copyGPUBuffersCheckBox + Kopjo buffer-ët e GPU-së:\nShmang kushtet e garës (race conditions) që lidhen me dërgimet e GPU-së.\nMund të ndihmojë, ose jo, në rast rëniesh të llojit PM4 0. + + + hostMarkersCheckBox + Shënjuesit e korrigjimit të host-it:\nShton informacion nga ana e emulatorit, si shënjues për komandat specifike AMDGPU rreth komandave Vulkan, si dhe jep burimeve emra korrigjimi.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. + + + guestMarkersCheckBox + Shënjuesit e korrigjimit të guest-it:\nShton çdo shënjues për korrigjim që loja vetë ka shtuar në buffer-in e komandave.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. + + + saveDataBox + Shtegu i Ruajtjes së të Dhënave:\nDosja ku do të ruhen të dhënat e ruajtjes së lojës. + + + browseButton + Shfleto:\nShfleto për të vendosur një dosje si shteg të ruajtjes së të dhënave. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Shfleto + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Dosja ku do instalohen lojërat + + + Directory to save data + + + + enableHDRCheckBox + + + + + TrophyViewer + + Trophy Viewer + Shikuesi i Trofeve + + + diff --git a/src/qt_gui/translations/sv.ts b/src/qt_gui/translations/sv_SE.ts similarity index 97% rename from src/qt_gui/translations/sv.ts rename to src/qt_gui/translations/sv_SE.ts index 60ebf5432..858bcd47c 100644 --- a/src/qt_gui/translations/sv.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1,8 +1,8 @@ + - AboutDialog @@ -244,14 +244,6 @@ Can't apply cheats before the game is started Kan inte tillämpa fusk innan spelet är startat - - Error: - Fel: - - - ERROR - FEL - Close Stäng @@ -386,10 +378,6 @@ Unable to update compatibility data! Try again later. Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. - - Unable to open compatibility.json for writing. - Kunde inte öppna compatibility.json för skrivning. - Unknown Okänt @@ -673,10 +661,6 @@ Game can be completed with playable performance and no major glitches Spelet kan spelas klart med spelbar prestanda och utan större problem - - Click to go to issue - Klicka för att gå till problem - Last updated Senast uppdaterad @@ -1196,14 +1180,66 @@ Open Folder Öppna mapp - - &File - &Arkiv - PKG ERROR PKG-FEL + + Name + Namn + + + Serial + Serienummer + + + Installed + + + + Size + Storlek + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Region + + + Flags + + + + Path + Sökväg + + + File + Arkiv + + + Unknown + Okänt + + + Package + + SettingsDialog @@ -1255,10 +1291,6 @@ Show Splash Visa startskärm - - ps4proCheckBox - Är PS4 Pro:\nGör att emulatorn agerar som en PS4 PRO, vilket kan aktivera speciella funktioner i spel som har stöd för det - Enable Discord Rich Presence Aktivera Discord Rich Presence @@ -1323,10 +1355,6 @@ Graphics Grafik - - Gui - Gränssnitt - User Användare @@ -1743,6 +1771,14 @@ GUIBackgroundImageGroupBox Bakgrundsbild:\nKontrollerar opaciteten för spelets bakgrundsbild + + Enable HDR + + + + enableHDRCheckBox + + TrophyViewer diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 25878cb0f..7c8d078db 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - shadPS4 Hakkında - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. - - - This software should not be used to play games you have not legally obtained. - Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır. - - - - ElfViewer - - Open Folder - Klasörü Aç - - - - GameInfoClass - - Loading game list, please wait :3 - Oyun listesi yükleniyor, lütfen bekleyin :3 - - - Cancel - İptal - - - Loading... - Yükleniyor... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Klasörü Seç - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Klasörü Seç - - - Directory to install games - Oyunların yükleneceği klasör - - - Browse - Gözat - - - Error - Hata - - - The value for location to install games is not valid. - Oyunların yükleneceği konum için girilen klasör geçerli değil. - - - - GuiContextMenus - - Create Shortcut - Kısayol Oluştur - - - Cheats / Patches - Hileler / Yamanlar - - - SFO Viewer - SFO Görüntüleyici - - - Trophy Viewer - Kupa Görüntüleyici - - - Open Folder... - Klasörü Aç... - - - Open Game Folder - Oyun Klasörünü Aç - - - Open Save Data Folder - Kaydetme Verileri Klasörünü Aç - - - Open Log Folder - Log Klasörünü Aç - - - Copy info... - Bilgiyi Kopyala... - - - Copy Name - Adı Kopyala - - - Copy Serial - Seri Numarasını Kopyala - - - Copy All - Tümünü Kopyala - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Kısayol oluşturma - - - Shortcut created successfully! - Kısayol başarıyla oluşturuldu! - - - Error - Hata - - - Error creating shortcut! - Kısayol oluşturulurken hata oluştu! - - - Install PKG - PKG Yükle - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Elf Klasörünü Aç/Ekle - - - Install Packages (PKG) - Paketleri Kur (PKG) - - - Boot Game - Oyunu Başlat - - - Check for Updates - Güncellemeleri kontrol et - - - About shadPS4 - shadPS4 Hakkında - - - Configure... - Yapılandır... - - - Install application from a .pkg file - .pkg dosyasından uygulama yükle - - - Recent Games - Son Oyunlar - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Çıkış - - - Exit shadPS4 - shadPS4'ten Çık - - - Exit the application. - Uygulamadan çık. - - - Show Game List - Oyun Listesini Göster - - - Game List Refresh - Oyun Listesini Yenile - - - Tiny - Küçük - - - Small - Ufak - - - Medium - Orta - - - Large - Büyük - - - List View - Liste Görünümü - - - Grid View - Izgara Görünümü - - - Elf Viewer - Elf Görüntüleyici - - - Game Install Directory - Oyun Kurulum Klasörü - - - Download Cheats/Patches - Hileleri/Yamaları İndir - - - Dump Game List - Oyun Listesini Kaydet - - - PKG Viewer - PKG Görüntüleyici - - - Search... - Ara... - - - File - Dosya - - - View - Görünüm - - - Game List Icons - Oyun Listesi Simgeleri - - - Game List Mode - Oyun Listesi Modu - - - Settings - Ayarlar - - - Utils - Yardımcı Araçlar - - - Themes - Temalar - - - Help - Yardım - - - Dark - Koyu - - - Light - Açık - - - Green - Yeşil - - - Blue - Mavi - - - Violet - Mor - - - toolBar - Araç Çubuğu - - - Game List - Oyun Listesi - - - * Unsupported Vulkan Version - * Desteklenmeyen Vulkan Sürümü - - - Download Cheats For All Installed Games - Tüm Yüklenmiş Oyunlar İçin Hileleri İndir - - - Download Patches For All Games - Tüm Oyunlar İçin Yamaları İndir - - - Download Complete - İndirme Tamamlandı - - - You have downloaded cheats for all the games you have installed. - Yüklediğiniz tüm oyunlar için hileleri indirdiniz. - - - Patches Downloaded Successfully! - Yamalar Başarıyla İndirildi! - - - All Patches available for all games have been downloaded. - Tüm oyunlar için mevcut tüm yamalar indirildi. - - - Games: - Oyunlar: - - - PKG File (*.PKG) - PKG Dosyası (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF Dosyaları (*.bin *.elf *.oelf) - - - Game Boot - Oyun Başlatma - - - Only one file can be selected! - Sadece bir dosya seçilebilir! - - - PKG Extraction - PKG Çıkartma - - - Patch detected! - Yama tespit edildi! - - - PKG and Game versions match: - PKG ve oyun sürümleri uyumlu: - - - Would you like to overwrite? - Üzerine yazmak ister misiniz? - - - PKG Version %1 is older than installed version: - PKG Sürümü %1, kurulu sürümden daha eski: - - - Game is installed: - Oyun yüklendi: - - - Would you like to install Patch: - Yamanın yüklenmesini ister misiniz: - - - DLC Installation - DLC Yükleme - - - Would you like to install DLC: %1? - DLC'yi yüklemek ister misiniz: %1? - - - DLC already installed: - DLC zaten yüklü: - - - Game already installed - Oyun zaten yüklü - - - PKG is a patch, please install the game first! - PKG bir yama, lütfen önce oyunu yükleyin! - - - PKG ERROR - PKG HATASI - - - Extracting PKG %1/%2 - PKG Çıkarılıyor %1/%2 - - - Extraction Finished - Çıkarma Tamamlandı - - - Game successfully installed at %1 - Oyun başarıyla %1 konumuna yüklendi - - - File doesn't appear to be a valid PKG file - Dosya geçerli bir PKG dosyası gibi görünmüyor - - - - PKGViewer - - Open Folder - Klasörü Aç - - - - TrophyViewer - - Trophy Viewer - Kupa Görüntüleyici - - - - SettingsDialog - - Settings - Ayarlar - - - General - Genel - - - System - Sistem - - - Console Language - Konsol Dili - - - Emulator Language - Emülatör Dili - - - Emulator - Emülatör - - - Enable Fullscreen - Tam Ekranı Etkinleştir - - - Fullscreen Mode - Tam Ekran Modu - - - Enable Separate Update Folder - Ayrı Güncelleme Klasörünü Etkinleştir - - - Default tab when opening settings - Ayarlar açıldığında varsayılan sekme - - - Show Game Size In List - Oyun Boyutunu Listede Göster - - - Show Splash - Başlangıç Ekranını Göster - - - Is PS4 Pro - PS4 Pro - - - Enable Discord Rich Presence - Discord Rich Presence'i etkinleştir - - - Username - Kullanıcı Adı - - - Trophy Key - Kupa Anahtarı - - - Trophy - Kupa - - - Logger - Kayıt Tutucu - - - Log Type - Kayıt Türü - - - Log Filter - Kayıt Filtresi - - - Open Log Location - Günlük Konumunu Aç - - - Input - Girdi - - - Cursor - İmleç - - - Hide Cursor - İmleci Gizle - - - Hide Cursor Idle Timeout - İmleç İçin Hareketsizlik Zaman Aşımı - - - s - s - - - Controller - Kontrolcü - - - Back Button Behavior - Geri Dön Butonu Davranışı - - - Graphics - Grafikler - - - GUI - Arayüz - - - User - Kullanıcı - - - Graphics Device - Grafik Cihazı - - - Width - Genişlik - - - Height - Yükseklik - - - Vblank Divider - Vblank Bölücü - - - Advanced - Gelişmiş - - - Enable Shaders Dumping - Shader Kaydını Etkinleştir - - - Enable NULL GPU - NULL GPU'yu Etkinleştir - - - Paths - Yollar - - - Game Folders - Oyun Klasörleri - - - Add... - Ekle... - - - Remove - Kaldır - - - Debug - Hata Ayıklama - - - Enable Debug Dumping - Hata Ayıklama Dökümü Etkinleştir - - - Enable Vulkan Validation Layers - Vulkan Doğrulama Katmanlarını Etkinleştir - - - Enable Vulkan Synchronization Validation - Vulkan Senkronizasyon Doğrulamasını Etkinleştir - - - Enable RenderDoc Debugging - RenderDoc Hata Ayıklamayı Etkinleştir - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Güncelle - - - Check for Updates at Startup - Başlangıçta güncellemeleri kontrol et - - - Always Show Changelog - Her zaman değişiklik günlüğünü göster - - - Update Channel - Güncelleme Kanalı - - - Check for Updates - Güncellemeleri Kontrol Et - - - GUI Settings - GUI Ayarları - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Kupa Açılır Pencerelerini Devre Dışı Bırak - - - Play title music - Başlık müziğini çal - - - Update Compatibility Database On Startup - Başlangıçta Uyumluluk Veritabanını Güncelle - - - Game Compatibility - Oyun Uyumluluğu - - - Display Compatibility Data - Uyumluluk Verilerini Göster - - - Update Compatibility Database - Uyumluluk Veritabanını Güncelle - - - Volume - Ses Seviyesi - - - Audio Backend - Audio Backend - - - Save - Kaydet - - - Apply - Uygula - - - Restore Defaults - Varsayılanları Geri Yükle - - - Close - Kapat - - - Point your mouse at an option to display its description. - Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. - - - consoleLanguageGroupBox - Konsol Dili:\nPS4 oyununun kullandığı dili ayarlar.\nBu seçeneği, oyunun desteklediği bir dilde ayarlamanız önerilir; bu durum bölgeye göre değişebilir. - - - emulatorLanguageGroupBox - Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. - - - fullscreenCheckBox - Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Açılış Ekranını Göster:\nOyun açılırken (özel bir görüntü) açılış ekranını gösterir. - - - ps4proCheckBox - PS4 Pro:\nEmülatörü bir PS4 PRO gibi çalıştırır; bu, bunu destekleyen oyunlarda özel özellikleri etkinleştirebilir. - - - discordRPCCheckbox - Discord Rich Presence'i etkinleştir:\nEmülatör simgesini ve Discord profilinizdeki ilgili bilgileri gösterir. - - - userName - Kullanıcı Adı:\nBazı oyunlar tarafından gösterilebilen PS4 hesabının kullanıcı adını ayarlar. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Günlük Türü:\nPerformans için günlük penceresi çıkışını senkronize etme durumunu ayarlar. Bu, emülasyonda olumsuz etkilere yol açabilir. - - - logFilter - Günlük Filtre:\nSadece belirli bilgileri yazdırmak için günlüğü filtreler.\nÖrnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder. - - - updaterGroupBox - Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. - - - GUIMusicGroupBox - Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - İmleci gizle:\nİmlecin ne zaman kaybolacağını seçin:\nAsla: Fareyi her zaman göreceksiniz.\nPasif: Hareketsiz kaldıktan sonra kaybolması için bir süre belirleyin.\nHer zaman: fareyi asla göremeyeceksiniz. - - - idleTimeoutGroupBox - Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın. - - - backButtonBehaviorGroupBox - Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Asla - - - Idle - Boşta - - - Always - Her zaman - - - Touchpad Left - Dokunmatik Yüzey Sol - - - Touchpad Right - Dokunmatik Yüzey Sağ - - - Touchpad Center - Dokunmatik Yüzey Orta - - - None - Yok - - - graphicsAdapterGroupBox - Grafik Aygıtı:\nBirden fazla GPU'ya sahip sistemlerde, emülatörün kullanacağı GPU'yu açılır listeden seçin,\nor "Auto Select" seçeneğini seçerek otomatik olarak belirlenmesini sağlayın. - - - resolutionLayout - Genişlik/Yükseklik:\nEmülatör penceresinin açılışta boyutunu ayarlar; bu, oyun sırasında yeniden boyutlandırılabilir.\nBu, oyundaki çözünürlükten farklıdır. - - - heightDivider - Vblank Bölücü:\nEmülatörün yenileme hızı bu sayı ile çarpılır. Bu değerin değiştirilmesi olumsuz etkilere yol açabilir; oyun hızını artırabilir veya oyunun beklemediği kritik işlevselliği bozabilir! - - - dumpShadersCheckBox - Shader'ları Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, shader'ları render edildikçe bir klasöre kaydeder. - - - nullGpuCheckBox - Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır. - - - gameFoldersBox - Oyun klasörleri:\nYüklenmiş oyunları kontrol etmek için klasörlerin listesi. - - - addFolderButton - Ekle:\nListeye bir klasör ekle. - - - removeFolderButton - Kaldır:\nListeden bir klasörü kaldır. - - - debugDump - Hata Ayıklama için Dışa Aktarmayı Etkinleştir:\nŞu anda çalışan PS4 uygulaması için içe aktarılan ve dışa aktarılan sembolleri ve dosya başlık bilgilerini bir dizine kaydedin. - - - vkValidationCheckBox - Vulkan Doğrulama Katmanlarını Etkinleştir:\nVulkan renderlayıcısının durumunu doğrulayan ve iç durum hakkında bilgi kaydeden bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - - - vkSyncValidationCheckBox - Vulkan Senkronizasyon Doğrulamasını Etkinleştir:\nVulkan renderlama görevlerinin senkronizasyonunu doğrulayan bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - - - rdocCheckBox - RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Görüntü Mevcut Değil - - - Serial: - Seri Numarası: - - - Version: - Sürüm: - - - Size: - Boyut: - - - Select Cheat File: - Hile Dosyasını Seçin: - - - Repository: - Depo: - - - Download Cheats - Hileleri İndir - - - Delete File - Dosyayı Sil - - - No files selected. - Hiçbir dosya seçilmedi. - - - You can delete the cheats you don't want after downloading them. - İndirdikten sonra istemediğiniz hileleri silebilirsiniz. - - - Do you want to delete the selected file?\n%1 - Seçilen dosyayı silmek istiyor musunuz?\n%1 - - - Select Patch File: - Yama Dosyasını Seçin: - - - Download Patches - Yamaları İndir - - - Save - Kaydet - - - Cheats - Hileler - - - Patches - Yamalar - - - Error - Hata - - - No patch selected. - Hiç yama seçilmedi. - - - Unable to open files.json for reading. - files.json dosyası okumak için açılamadı. - - - No patch file found for the current serial. - Mevcut seri numarası için hiç yama dosyası bulunamadı. - - - Unable to open the file for reading. - Dosya okumak için açılamadı. - - - Unable to open the file for writing. - Dosya yazmak için açılamadı. - - - Failed to parse XML: - XML ayrıştırılamadı: - - - Success - Başarı - - - Options saved successfully. - Ayarlar başarıyla kaydedildi. - - - Invalid Source - Geçersiz Kaynak - - - The selected source is invalid. - Seçilen kaynak geçersiz. - - - File Exists - Dosya Var - - - File already exists. Do you want to replace it? - Dosya zaten var. Üzerine yazmak ister misiniz? - - - Failed to save file: - Dosya kaydedilemedi: - - - Failed to download file: - Dosya indirilemedi: - - - Cheats Not Found - Hileler Bulunamadı - - - CheatsNotFound_MSG - Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. - - - Cheats Downloaded Successfully - Hileler Başarıyla İndirildi - - - CheatsDownloadedSuccessfully_MSG - Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. - - - Failed to save: - Kaydedilemedi: - - - Failed to download: - İndirilemedi: - - - Download Complete - İndirme Tamamlandı - - - DownloadComplete_MSG - Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. - - - Failed to parse JSON data from HTML. - HTML'den JSON verileri ayrıştırılamadı. - - - Failed to retrieve HTML page. - HTML sayfası alınamadı. - - - The game is in version: %1 - Oyun sürümü: %1 - - - The downloaded patch only works on version: %1 - İndirilen yama sadece şu sürümde çalışıyor: %1 - - - You may need to update your game. - Oyunuzu güncellemeniz gerekebilir. - - - Incompatibility Notice - Uyumsuzluk Bildirimi - - - Failed to open file: - Dosya açılamadı: - - - XML ERROR: - XML HATASI: - - - Failed to open files.json for writing - files.json dosyası yazmak için açılamadı - - - Author: - Yazar: - - - Directory does not exist: - Klasör mevcut değil: - - - Failed to open files.json for reading. - files.json dosyası okumak için açılamadı. - - - Name: - İsim: - - - Can't apply cheats before the game is started - Hileleri oyuna başlamadan önce uygulayamazsınız. - - - - GameListFrame - - Icon - Simge - - - Name - Ad - - - Serial - Seri Numarası - - - Compatibility - Uyumluluk - - - Region - Bölge - - - Firmware - Yazılım - - - Size - Boyut - - - Version - Sürüm - - - Path - Yol - - - Play Time - Oynama Süresi - - - Never Played - Hiç Oynanmadı - - - h - sa - - - m - dk - - - s - sn - - - Compatibility is untested - Uyumluluk test edilmemiş - - - Game does not initialize properly / crashes the emulator - Oyun düzgün bir şekilde başlatılamıyor / emülatörü çökertiyor - - - Game boots, but only displays a blank screen - Oyun başlatılabiliyor ancak yalnızca boş bir ekran gösteriyor - - - Game displays an image but does not go past the menu - Oyun bir resim gösteriyor ancak menüleri geçemiyor - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Oyun, oynanabilir performansla tamamlanabilir ve büyük aksaklık yok - - - Click to see details on github - Detayları görmek için GitHub’a tıklayın - - - Last updated - Son güncelleme - - - - CheckUpdate - - Auto Updater - Otomatik Güncelleyici - - - Error - Hata - - - Network error: - Ağ hatası: - - - Error_Github_limit_MSG - Otomatik Güncelleyici, saat başına en fazla 60 güncelleme kontrolüne izin verir.\nBu sınıra ulaştınız. Lütfen daha sonra tekrar deneyin. - - - Failed to parse update information. - Güncelleme bilgilerini ayrıştırma başarısız oldu. - - - No pre-releases found. - Ön sürüm bulunamadı. - - - Invalid release data. - Geçersiz sürüm verisi. - - - No download URL found for the specified asset. - Belirtilen varlık için hiçbir indirme URL'si bulunamadı. - - - Your version is already up to date! - Sürümünüz zaten güncel! - - - Update Available - Güncelleme Mevcut - - - Update Channel - Güncelleme Kanalı - - - Current Version - Mevcut Sürüm - - - Latest Version - Son Sürüm - - - Do you want to update? - Güncellemek istiyor musunuz? - - - Show Changelog - Değişiklik Günlüğünü Göster - - - Check for Updates at Startup - Başlangıçta güncellemeleri kontrol et - - - Update - Güncelle - - - No - Hayır - - - Hide Changelog - Değişiklik Günlüğünü Gizle - - - Changes - Değişiklikler - - - Network error occurred while trying to access the URL - URL'ye erişmeye çalışırken bir ağ hatası oluştu - - - Download Complete - İndirme Tamamlandı - - - The update has been downloaded, press OK to install. - Güncelleme indirildi, yüklemek için Tamam'a basın. - - - Failed to save the update file at - Güncelleme dosyası kaydedilemedi - - - Starting Update... - Güncelleme Başlatılıyor... - - - Failed to create the update script file - Güncelleme komut dosyası oluşturulamadı - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Uyumluluk verileri alınıyor, lütfen bekleyin - - - Cancel - İptal - - - Loading... - Yükleniyor... - - - Error - Hata - - - Unable to update compatibility data! Try again later. - Uyumluluk verileri güncellenemedi! Lütfen daha sonra tekrar deneyin. - - - Unable to open compatibility_data.json for writing. - compatibility_data.json dosyasını yazmak için açamadık. - - - Unknown - Bilinmeyen - - - Nothing - Hiçbir şey - - - Boots - Botlar - - - Menus - Menüler - - - Ingame - Oyunda - - - Playable - Oynanabilir - - + + AboutDialog + + About shadPS4 + shadPS4 Hakkında + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. + + + This software should not be used to play games you have not legally obtained. + Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Görüntü Mevcut Değil + + + Serial: + Seri Numarası: + + + Version: + Sürüm: + + + Size: + Boyut: + + + Select Cheat File: + Hile Dosyasını Seçin: + + + Repository: + Depo: + + + Download Cheats + Hileleri İndir + + + Delete File + Dosyayı Sil + + + No files selected. + Hiçbir dosya seçilmedi. + + + You can delete the cheats you don't want after downloading them. + İndirdikten sonra istemediğiniz hileleri silebilirsiniz. + + + Do you want to delete the selected file?\n%1 + Seçilen dosyayı silmek istiyor musunuz?\n%1 + + + Select Patch File: + Yama Dosyasını Seçin: + + + Download Patches + Yamaları İndir + + + Save + Kaydet + + + Cheats + Hileler + + + Patches + Yamalar + + + Error + Hata + + + No patch selected. + Hiç yama seçilmedi. + + + Unable to open files.json for reading. + files.json dosyası okumak için açılamadı. + + + No patch file found for the current serial. + Mevcut seri numarası için hiç yama dosyası bulunamadı. + + + Unable to open the file for reading. + Dosya okumak için açılamadı. + + + Unable to open the file for writing. + Dosya yazmak için açılamadı. + + + Failed to parse XML: + XML ayrıştırılamadı: + + + Success + Başarı + + + Options saved successfully. + Ayarlar başarıyla kaydedildi. + + + Invalid Source + Geçersiz Kaynak + + + The selected source is invalid. + Seçilen kaynak geçersiz. + + + File Exists + Dosya Var + + + File already exists. Do you want to replace it? + Dosya zaten var. Üzerine yazmak ister misiniz? + + + Failed to save file: + Dosya kaydedilemedi: + + + Failed to download file: + Dosya indirilemedi: + + + Cheats Not Found + Hileler Bulunamadı + + + CheatsNotFound_MSG + Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. + + + Cheats Downloaded Successfully + Hileler Başarıyla İndirildi + + + CheatsDownloadedSuccessfully_MSG + Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. + + + Failed to save: + Kaydedilemedi: + + + Failed to download: + İndirilemedi: + + + Download Complete + İndirme Tamamlandı + + + DownloadComplete_MSG + Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. + + + Failed to parse JSON data from HTML. + HTML'den JSON verileri ayrıştırılamadı. + + + Failed to retrieve HTML page. + HTML sayfası alınamadı. + + + The game is in version: %1 + Oyun sürümü: %1 + + + The downloaded patch only works on version: %1 + İndirilen yama sadece şu sürümde çalışıyor: %1 + + + You may need to update your game. + Oyunuzu güncellemeniz gerekebilir. + + + Incompatibility Notice + Uyumsuzluk Bildirimi + + + Failed to open file: + Dosya açılamadı: + + + XML ERROR: + XML HATASI: + + + Failed to open files.json for writing + files.json dosyası yazmak için açılamadı + + + Author: + Yazar: + + + Directory does not exist: + Klasör mevcut değil: + + + Failed to open files.json for reading. + files.json dosyası okumak için açılamadı. + + + Name: + İsim: + + + Can't apply cheats before the game is started + Hileleri oyuna başlamadan önce uygulayamazsınız. + + + Close + Kapat + + + + CheckUpdate + + Auto Updater + Otomatik Güncelleyici + + + Error + Hata + + + Network error: + Ağ hatası: + + + Error_Github_limit_MSG + Otomatik Güncelleyici, saat başına en fazla 60 güncelleme kontrolüne izin verir.\nBu sınıra ulaştınız. Lütfen daha sonra tekrar deneyin. + + + Failed to parse update information. + Güncelleme bilgilerini ayrıştırma başarısız oldu. + + + No pre-releases found. + Ön sürüm bulunamadı. + + + Invalid release data. + Geçersiz sürüm verisi. + + + No download URL found for the specified asset. + Belirtilen varlık için hiçbir indirme URL'si bulunamadı. + + + Your version is already up to date! + Sürümünüz zaten güncel! + + + Update Available + Güncelleme Mevcut + + + Update Channel + Güncelleme Kanalı + + + Current Version + Mevcut Sürüm + + + Latest Version + Son Sürüm + + + Do you want to update? + Güncellemek istiyor musunuz? + + + Show Changelog + Değişiklik Günlüğünü Göster + + + Check for Updates at Startup + Başlangıçta güncellemeleri kontrol et + + + Update + Güncelle + + + No + Hayır + + + Hide Changelog + Değişiklik Günlüğünü Gizle + + + Changes + Değişiklikler + + + Network error occurred while trying to access the URL + URL'ye erişmeye çalışırken bir ağ hatası oluştu + + + Download Complete + İndirme Tamamlandı + + + The update has been downloaded, press OK to install. + Güncelleme indirildi, yüklemek için Tamam'a basın. + + + Failed to save the update file at + Güncelleme dosyası kaydedilemedi + + + Starting Update... + Güncelleme Başlatılıyor... + + + Failed to create the update script file + Güncelleme komut dosyası oluşturulamadı + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Uyumluluk verileri alınıyor, lütfen bekleyin + + + Cancel + İptal + + + Loading... + Yükleniyor... + + + Error + Hata + + + Unable to update compatibility data! Try again later. + Uyumluluk verileri güncellenemedi! Lütfen daha sonra tekrar deneyin. + + + Unable to open compatibility_data.json for writing. + compatibility_data.json dosyasını yazmak için açamadık. + + + Unknown + Bilinmeyen + + + Nothing + Hiçbir şey + + + Boots + Botlar + + + Menus + Menüler + + + Ingame + Oyunda + + + Playable + Oynanabilir + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Klasörü Aç + + + + GameInfoClass + + Loading game list, please wait :3 + Oyun listesi yükleniyor, lütfen bekleyin :3 + + + Cancel + İptal + + + Loading... + Yükleniyor... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Klasörü Seç + + + Directory to install games + Oyunların yükleneceği klasör + + + Browse + Gözat + + + Error + Hata + + + Directory to install DLC + + + + + GameListFrame + + Icon + Simge + + + Name + Ad + + + Serial + Seri Numarası + + + Compatibility + Uyumluluk + + + Region + Bölge + + + Firmware + Yazılım + + + Size + Boyut + + + Version + Sürüm + + + Path + Yol + + + Play Time + Oynama Süresi + + + Never Played + Hiç Oynanmadı + + + h + sa + + + m + dk + + + s + sn + + + Compatibility is untested + Uyumluluk test edilmemiş + + + Game does not initialize properly / crashes the emulator + Oyun düzgün bir şekilde başlatılamıyor / emülatörü çökertiyor + + + Game boots, but only displays a blank screen + Oyun başlatılabiliyor ancak yalnızca boş bir ekran gösteriyor + + + Game displays an image but does not go past the menu + Oyun bir resim gösteriyor ancak menüleri geçemiyor + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Oyun, oynanabilir performansla tamamlanabilir ve büyük aksaklık yok + + + Click to see details on github + Detayları görmek için GitHub’a tıklayın + + + Last updated + Son güncelleme + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Kısayol Oluştur + + + Cheats / Patches + Hileler / Yamanlar + + + SFO Viewer + SFO Görüntüleyici + + + Trophy Viewer + Kupa Görüntüleyici + + + Open Folder... + Klasörü Aç... + + + Open Game Folder + Oyun Klasörünü Aç + + + Open Save Data Folder + Kaydetme Verileri Klasörünü Aç + + + Open Log Folder + Log Klasörünü Aç + + + Copy info... + Bilgiyi Kopyala... + + + Copy Name + Adı Kopyala + + + Copy Serial + Seri Numarasını Kopyala + + + Copy All + Tümünü Kopyala + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Kısayol oluşturma + + + Shortcut created successfully! + Kısayol başarıyla oluşturuldu! + + + Error + Hata + + + Error creating shortcut! + Kısayol oluşturulurken hata oluştu! + + + Install PKG + PKG Yükle + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Klasörü Seç + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Elf Klasörünü Aç/Ekle + + + Install Packages (PKG) + Paketleri Kur (PKG) + + + Boot Game + Oyunu Başlat + + + Check for Updates + Güncellemeleri kontrol et + + + About shadPS4 + shadPS4 Hakkında + + + Configure... + Yapılandır... + + + Install application from a .pkg file + .pkg dosyasından uygulama yükle + + + Recent Games + Son Oyunlar + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Çıkış + + + Exit shadPS4 + shadPS4'ten Çık + + + Exit the application. + Uygulamadan çık. + + + Show Game List + Oyun Listesini Göster + + + Game List Refresh + Oyun Listesini Yenile + + + Tiny + Küçük + + + Small + Ufak + + + Medium + Orta + + + Large + Büyük + + + List View + Liste Görünümü + + + Grid View + Izgara Görünümü + + + Elf Viewer + Elf Görüntüleyici + + + Game Install Directory + Oyun Kurulum Klasörü + + + Download Cheats/Patches + Hileleri/Yamaları İndir + + + Dump Game List + Oyun Listesini Kaydet + + + PKG Viewer + PKG Görüntüleyici + + + Search... + Ara... + + + File + Dosya + + + View + Görünüm + + + Game List Icons + Oyun Listesi Simgeleri + + + Game List Mode + Oyun Listesi Modu + + + Settings + Ayarlar + + + Utils + Yardımcı Araçlar + + + Themes + Temalar + + + Help + Yardım + + + Dark + Koyu + + + Light + Açık + + + Green + Yeşil + + + Blue + Mavi + + + Violet + Mor + + + toolBar + Araç Çubuğu + + + Game List + Oyun Listesi + + + * Unsupported Vulkan Version + * Desteklenmeyen Vulkan Sürümü + + + Download Cheats For All Installed Games + Tüm Yüklenmiş Oyunlar İçin Hileleri İndir + + + Download Patches For All Games + Tüm Oyunlar İçin Yamaları İndir + + + Download Complete + İndirme Tamamlandı + + + You have downloaded cheats for all the games you have installed. + Yüklediğiniz tüm oyunlar için hileleri indirdiniz. + + + Patches Downloaded Successfully! + Yamalar Başarıyla İndirildi! + + + All Patches available for all games have been downloaded. + Tüm oyunlar için mevcut tüm yamalar indirildi. + + + Games: + Oyunlar: + + + ELF files (*.bin *.elf *.oelf) + ELF Dosyaları (*.bin *.elf *.oelf) + + + Game Boot + Oyun Başlatma + + + Only one file can be selected! + Sadece bir dosya seçilebilir! + + + PKG Extraction + PKG Çıkartma + + + Patch detected! + Yama tespit edildi! + + + PKG and Game versions match: + PKG ve oyun sürümleri uyumlu: + + + Would you like to overwrite? + Üzerine yazmak ister misiniz? + + + PKG Version %1 is older than installed version: + PKG Sürümü %1, kurulu sürümden daha eski: + + + Game is installed: + Oyun yüklendi: + + + Would you like to install Patch: + Yamanın yüklenmesini ister misiniz: + + + DLC Installation + DLC Yükleme + + + Would you like to install DLC: %1? + DLC'yi yüklemek ister misiniz: %1? + + + DLC already installed: + DLC zaten yüklü: + + + Game already installed + Oyun zaten yüklü + + + PKG ERROR + PKG HATASI + + + Extracting PKG %1/%2 + PKG Çıkarılıyor %1/%2 + + + Extraction Finished + Çıkarma Tamamlandı + + + Game successfully installed at %1 + Oyun başarıyla %1 konumuna yüklendi + + + File doesn't appear to be a valid PKG file + Dosya geçerli bir PKG dosyası gibi görünmüyor + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Klasörü Aç + + + Name + Ad + + + Serial + Seri Numarası + + + Installed + + + + Size + Boyut + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Bölge + + + Flags + + + + Path + Yol + + + File + Dosya + + + PKG ERROR + PKG HATASI + + + Unknown + Bilinmeyen + + + Package + + + + + SettingsDialog + + Settings + Ayarlar + + + General + Genel + + + System + Sistem + + + Console Language + Konsol Dili + + + Emulator Language + Emülatör Dili + + + Emulator + Emülatör + + + Enable Fullscreen + Tam Ekranı Etkinleştir + + + Fullscreen Mode + Tam Ekran Modu + + + Enable Separate Update Folder + Ayrı Güncelleme Klasörünü Etkinleştir + + + Default tab when opening settings + Ayarlar açıldığında varsayılan sekme + + + Show Game Size In List + Oyun Boyutunu Listede Göster + + + Show Splash + Başlangıç Ekranını Göster + + + Enable Discord Rich Presence + Discord Rich Presence'i etkinleştir + + + Username + Kullanıcı Adı + + + Trophy Key + Kupa Anahtarı + + + Trophy + Kupa + + + Logger + Kayıt Tutucu + + + Log Type + Kayıt Türü + + + Log Filter + Kayıt Filtresi + + + Open Log Location + Günlük Konumunu Aç + + + Input + Girdi + + + Cursor + İmleç + + + Hide Cursor + İmleci Gizle + + + Hide Cursor Idle Timeout + İmleç İçin Hareketsizlik Zaman Aşımı + + + s + s + + + Controller + Kontrolcü + + + Back Button Behavior + Geri Dön Butonu Davranışı + + + Graphics + Grafikler + + + GUI + Arayüz + + + User + Kullanıcı + + + Graphics Device + Grafik Cihazı + + + Width + Genişlik + + + Height + Yükseklik + + + Vblank Divider + Vblank Bölücü + + + Advanced + Gelişmiş + + + Enable Shaders Dumping + Shader Kaydını Etkinleştir + + + Enable NULL GPU + NULL GPU'yu Etkinleştir + + + Paths + Yollar + + + Game Folders + Oyun Klasörleri + + + Add... + Ekle... + + + Remove + Kaldır + + + Debug + Hata Ayıklama + + + Enable Debug Dumping + Hata Ayıklama Dökümü Etkinleştir + + + Enable Vulkan Validation Layers + Vulkan Doğrulama Katmanlarını Etkinleştir + + + Enable Vulkan Synchronization Validation + Vulkan Senkronizasyon Doğrulamasını Etkinleştir + + + Enable RenderDoc Debugging + RenderDoc Hata Ayıklamayı Etkinleştir + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Güncelle + + + Check for Updates at Startup + Başlangıçta güncellemeleri kontrol et + + + Always Show Changelog + Her zaman değişiklik günlüğünü göster + + + Update Channel + Güncelleme Kanalı + + + Check for Updates + Güncellemeleri Kontrol Et + + + GUI Settings + GUI Ayarları + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Kupa Açılır Pencerelerini Devre Dışı Bırak + + + Play title music + Başlık müziğini çal + + + Update Compatibility Database On Startup + Başlangıçta Uyumluluk Veritabanını Güncelle + + + Game Compatibility + Oyun Uyumluluğu + + + Display Compatibility Data + Uyumluluk Verilerini Göster + + + Update Compatibility Database + Uyumluluk Veritabanını Güncelle + + + Volume + Ses Seviyesi + + + Save + Kaydet + + + Apply + Uygula + + + Restore Defaults + Varsayılanları Geri Yükle + + + Close + Kapat + + + Point your mouse at an option to display its description. + Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. + + + consoleLanguageGroupBox + Konsol Dili:\nPS4 oyununun kullandığı dili ayarlar.\nBu seçeneği, oyunun desteklediği bir dilde ayarlamanız önerilir; bu durum bölgeye göre değişebilir. + + + emulatorLanguageGroupBox + Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. + + + fullscreenCheckBox + Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Açılış Ekranını Göster:\nOyun açılırken (özel bir görüntü) açılış ekranını gösterir. + + + discordRPCCheckbox + Discord Rich Presence'i etkinleştir:\nEmülatör simgesini ve Discord profilinizdeki ilgili bilgileri gösterir. + + + userName + Kullanıcı Adı:\nBazı oyunlar tarafından gösterilebilen PS4 hesabının kullanıcı adını ayarlar. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Günlük Türü:\nPerformans için günlük penceresi çıkışını senkronize etme durumunu ayarlar. Bu, emülasyonda olumsuz etkilere yol açabilir. + + + logFilter + Günlük Filtre:\nSadece belirli bilgileri yazdırmak için günlüğü filtreler.\nÖrnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder. + + + updaterGroupBox + Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. + + + GUIMusicGroupBox + Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + İmleci gizle:\nİmlecin ne zaman kaybolacağını seçin:\nAsla: Fareyi her zaman göreceksiniz.\nPasif: Hareketsiz kaldıktan sonra kaybolması için bir süre belirleyin.\nHer zaman: fareyi asla göremeyeceksiniz. + + + idleTimeoutGroupBox + Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın. + + + backButtonBehaviorGroupBox + Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Asla + + + Idle + Boşta + + + Always + Her zaman + + + Touchpad Left + Dokunmatik Yüzey Sol + + + Touchpad Right + Dokunmatik Yüzey Sağ + + + Touchpad Center + Dokunmatik Yüzey Orta + + + None + Yok + + + graphicsAdapterGroupBox + Grafik Aygıtı:\nBirden fazla GPU'ya sahip sistemlerde, emülatörün kullanacağı GPU'yu açılır listeden seçin,\nor "Auto Select" seçeneğini seçerek otomatik olarak belirlenmesini sağlayın. + + + resolutionLayout + Genişlik/Yükseklik:\nEmülatör penceresinin açılışta boyutunu ayarlar; bu, oyun sırasında yeniden boyutlandırılabilir.\nBu, oyundaki çözünürlükten farklıdır. + + + heightDivider + Vblank Bölücü:\nEmülatörün yenileme hızı bu sayı ile çarpılır. Bu değerin değiştirilmesi olumsuz etkilere yol açabilir; oyun hızını artırabilir veya oyunun beklemediği kritik işlevselliği bozabilir! + + + dumpShadersCheckBox + Shader'ları Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, shader'ları render edildikçe bir klasöre kaydeder. + + + nullGpuCheckBox + Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır. + + + gameFoldersBox + Oyun klasörleri:\nYüklenmiş oyunları kontrol etmek için klasörlerin listesi. + + + addFolderButton + Ekle:\nListeye bir klasör ekle. + + + removeFolderButton + Kaldır:\nListeden bir klasörü kaldır. + + + debugDump + Hata Ayıklama için Dışa Aktarmayı Etkinleştir:\nŞu anda çalışan PS4 uygulaması için içe aktarılan ve dışa aktarılan sembolleri ve dosya başlık bilgilerini bir dizine kaydedin. + + + vkValidationCheckBox + Vulkan Doğrulama Katmanlarını Etkinleştir:\nVulkan renderlayıcısının durumunu doğrulayan ve iç durum hakkında bilgi kaydeden bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. + + + vkSyncValidationCheckBox + Vulkan Senkronizasyon Doğrulamasını Etkinleştir:\nVulkan renderlama görevlerinin senkronizasyonunu doğrulayan bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. + + + rdocCheckBox + RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Gözat + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Oyunların yükleneceği klasör + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Kupa Görüntüleyici + + diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 3b880b9ab..e1b2e2fa3 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1,1572 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - Про shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 - це експериментальний емулятор з відкритим вихідним кодом для PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Це програмне забезпечення не повинно використовуватися для запуску ігор, котрі ви отримали не легально. - - - - ElfViewer - - Open Folder - Відкрити папку - - - - GameInfoClass - - Loading game list, please wait :3 - Завантажуємо список ігор, будь ласка, зачекайте :3 - - - Cancel - Відмінити - - - Loading... - Завантаження... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Виберіть папку - - - Select which directory you want to install to. - Виберіть папку, до якої ви хочете встановити. - - - Install All Queued to Selected Folder - Встановити все з черги до вибраної папки - - - Delete PKG File on Install - Видалити файл PKG під час встановлення - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Виберіть папку - - - Directory to install games - Папка для встановлення ігор - - - Browse - Обрати - - - Error - Помилка - - - The value for location to install games is not valid. - Не коректне значення розташування для встановлення ігор. - - - - GuiContextMenus - - Create Shortcut - Створити Ярлик - - - Cheats / Patches - Чити та Патчі - - - SFO Viewer - Перегляд SFO - - - Trophy Viewer - Перегляд трофеїв - - - Open Folder... - Відкрити Папку... - - - Open Game Folder - Відкрити папку гри - - - Open Update Folder - Відкрити папку оновлень - - - Open Save Data Folder - Відкрити папку збережень гри - - - Open Log Folder - Відкрити папку логів - - - Copy info... - Копіювати інформацію... - - - Copy Name - Копіювати назву гри - - - Copy Serial - Копіювати серійний номер - - - Copy Version - Копіювати версію - - - Copy Size - Копіювати розмір - - - Copy All - Копіювати все - - - Delete... - Видалити... - - - Delete Game - Видалити гру - - - Delete Update - Видалити оновлення - - - Delete Save Data - Видалити збереження - - - Delete DLC - Видалити DLC - - - Compatibility... - Сумісність... - - - Update database - Оновити базу даних - - - View report - Переглянути звіт - - - Submit a report - Створити звіт - - - Shortcut creation - Створення ярлика - - - Shortcut created successfully! - Ярлик створений успішно! - - - Error - Помилка - - - Error creating shortcut! - Помилка при створенні ярлика! - - - Install PKG - Встановити PKG - - - Game - гри - - - requiresEnableSeparateUpdateFolder_MSG - Ця функція потребує увімкнути опцію 'Окрема папка оновлень'. Якщо ви хочете використовувати цю функцію, будь ласка, увімкніть її. - - - This game has no update to delete! - Ця гра не має оновлень для видалення! - - - This game has no update folder to open! - Ця гра не має папки оновленнь, щоб відкрити її! - - - Update - Оновлення - - - This game has no save data to delete! - Ця гра не містить збережень, які можна видалити! - - - Save Data - Збереження - - - This game has no DLC to delete! - Ця гра не має DLC для видалення! - - - DLC - DLC - - - Delete %1 - Видалення %1 - - - Are you sure you want to delete %1's %2 directory? - Ви впевнені, що хочете видалити %1 з папки %2? - - - - MainWindow - - Open/Add Elf Folder - Відкрити/Додати папку Elf - - - Install Packages (PKG) - Встановити пакети (PKG) - - - Boot Game - Запустити гру - - - Check for Updates - Перевірити наявність оновлень - - - About shadPS4 - Про shadPS4 - - - Configure... - Налаштувати... - - - Install application from a .pkg file - Встановити додаток з файлу .pkg - - - Recent Games - Нещодавні ігри - - - Open shadPS4 Folder - Відкрити папку shadPS4 - - - Exit - Вихід - - - Exit shadPS4 - Вийти з shadPS4 - - - Exit the application. - Вийти з додатку. - - - Show Game List - Показати список ігор - - - Game List Refresh - Оновити список ігор - - - Tiny - Крихітний - - - Small - Маленький - - - Medium - Середній - - - Large - Великий - - - List View - Список - - - Grid View - Сітка - - - Elf Viewer - Виконуваний файл - - - Game Install Directory - Каталоги встановлення ігор та оновлень - - - Download Cheats/Patches - Завантажити Чити/Патчі - - - Dump Game List - Дамп списку ігор - - - PKG Viewer - Перегляд PKG - - - Search... - Пошук... - - - File - Файл - - - View - Вид - - - Game List Icons - Розмір значків списку ігор - - - Game List Mode - Вид списку ігор - - - Settings - Налаштування - - - Utils - Утиліти - - - Themes - Теми - - - Help - Допомога - - - Dark - Темна - - - Light - Світла - - - Green - Зелена - - - Blue - Синя - - - Violet - Фіолетова - - - toolBar - Панель інструментів - - - Game List - Список ігор - - - * Unsupported Vulkan Version - * Непідтримувана версія Vulkan - - - Download Cheats For All Installed Games - Завантажити чити для усіх встановлених ігор - - - Download Patches For All Games - Завантажити патчі для всіх ігор - - - Download Complete - Завантаження завершено - - - You have downloaded cheats for all the games you have installed. - Ви завантажили чити для усіх встановлених ігор. - - - Patches Downloaded Successfully! - Патчі успішно завантажено! - - - All Patches available for all games have been downloaded. - Завантажено всі доступні патчі для всіх ігор. - - - Games: - Ігри: - - - PKG File (*.PKG) - Файл PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Файли ELF (*.bin *.elf *.oelf) - - - Game Boot - Запуск гри - - - Only one file can be selected! - Можна вибрати лише один файл! - - - PKG Extraction - Розпакування PKG - - - Patch detected! - Виявлено патч! - - - PKG and Game versions match: - Версії PKG та гри збігаються: - - - Would you like to overwrite? - Бажаєте перезаписати? - - - PKG Version %1 is older than installed version: - Версія PKG %1 старіша за встановлену версію: - - - Game is installed: - Встановлена гра: - - - Would you like to install Patch: - Бажаєте встановити патч: - - - DLC Installation - Встановлення DLC - - - Would you like to install DLC: %1? - Ви бажаєте встановити DLC: %1? - - - DLC already installed: - DLC вже встановлено: - - - Game already installed - Гра вже встановлена - - - PKG is a patch, please install the game first! - PKG - це патч, будь ласка, спочатку встановіть гру! - - - PKG ERROR - ПОМИЛКА PKG - - - Extracting PKG %1/%2 - Витягування PKG %1/%2 - - - Extraction Finished - Розпакування завершено - - - Game successfully installed at %1 - Гру успішно встановлено у %1 - - - File doesn't appear to be a valid PKG file - Файл не є дійсним PKG-файлом - - - - PKGViewer - - Open Folder - Відкрити папку - - - - TrophyViewer - - Trophy Viewer - Трофеї - - - - SettingsDialog - - Settings - Налаштування - - - General - Загальні - - - System - Система - - - Console Language - Мова консолі - - - Emulator Language - Мова емулятора - - - Emulator - Емулятор - - - Enable Fullscreen - Увімкнути повноекранний режим - - - Fullscreen Mode - Тип повноекранного режиму - - - Borderless - Без рамок - - - True - Повний екран - - - Enable Separate Update Folder - Увімкнути окрему папку оновлень - - - Default tab when opening settings - Вкладка за замовчуванням при відкритті налаштувань - - - Show Game Size In List - Показати розмір гри у списку - - - Show Splash - Показувати заставку - - - Is PS4 Pro - Режим PS4 Pro - - - Enable Discord Rich Presence - Увімкнути Discord Rich Presence - - - Username - Ім'я користувача - - - Trophy Key - Ключ трофеїв - - - Trophy - Трофеї - - - Logger - Логування - - - Log Type - Тип логів - - - async - Асинхронний - - - sync - Синхронний - - - Log Filter - Фільтр логів - - - Open Log Location - Відкрити місце розташування журналу - - - Input - Введення - - - Cursor - Курсор миші - - - Hide Cursor - Приховати курсор - - - Hide Cursor Idle Timeout - Тайм-аут приховування курсора при бездіяльності - - - s - сек - - - Controller - Контролер - - - Back Button Behavior - Перепризначення кнопки назад - - - Enable Motion Controls - Увімкнути керування рухом - - - Graphics - Графіка - - - GUI - Інтерфейс - - - User - Користувач - - - Graphics Device - Графічний пристрій - - - Width - Ширина - - - Height - Висота - - - Vblank Divider - Розділювач Vblank - - - Advanced - Розширені - - - Enable Shaders Dumping - Увімкнути дамп шейдерів - - - Auto Select - Автовибір - - - Enable NULL GPU - Увімкнути NULL GPU - - - Paths - Шляхи - - - Game Folders - Ігрові папки - - - Add... - Додати... - - - Remove - Вилучити - - - Save Data Path - Шлях до файлів збережень - - - Debug - Налагодження - - - Enable Debug Dumping - Увімкнути налагоджувальні дампи - - - Enable Vulkan Validation Layers - Увімкнути шари валідації Vulkan - - - Enable Vulkan Synchronization Validation - Увімкнути валідацію синхронізації Vulkan - - - Enable RenderDoc Debugging - Увімкнути налагодження RenderDoc - - - Enable Crash Diagnostics - Увімкнути діагностику збоїв - - - Collect Shaders - Збирати шейдери - - - Copy GPU Buffers - Копіювати буфери GPU - - - Host Debug Markers - Хостові маркери налагодження - - - Guest Debug Markers - Гостьові маркери налагодження - - - - Update - Оновлення - - - Check for Updates at Startup - Перевіряти оновлення під час запуску - - - Always Show Changelog - Завжди показувати журнал змін - - - Update Channel - Канал оновлення - - - Release - Релізний - - - Nightly - Тестовий - - - Check for Updates - Перевірити оновлення - - - GUI Settings - Інтерфейс - - - Title Music - Титульна музика - - - Disable Trophy Pop-ups - Вимкнути спливаючі вікна трофеїв - - - Background Image - Фонове зображення - - - Show Background Image - Показувати фонове зображення - - - Opacity - Непрозорість - - - Play title music - Програвати титульну музику - - - Update Compatibility Database On Startup - Оновлення даних ігрової сумісності під час запуску - - - Game Compatibility - Сумісність з іграми - - - Display Compatibility Data - Відображати данні ігрової сумістністі - - - Update Compatibility Database - Оновити данні ігрової сумістності - - - Volume - Гучність - - - Audio Backend - Аудіосистема - - - Save - Зберегти - - - Apply - Застосувати - - - Restore Defaults - За замовчуванням - - - Close - Закрити - - - Point your mouse at an option to display its description. - Наведіть курсор миші на опцію, щоб відобразити її опис. - - - consoleLanguageGroupBox - Мова консолі:\nВстановіть мову, яка буде використовуватись у іграх PS4.\nРекомендується встановити мову котра підтримується грою, оскільки вона може відрізнятися в залежності від регіону. - - - emulatorLanguageGroupBox - Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора. - - - fullscreenCheckBox - Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11. - - - separateUpdatesCheckBox - Окрема папка для оновлень:\nДає змогу встановлювати оновлення гри в окрему папку для зручності. - - - showSplashCheckBox - Показувати заставку:\nВідображає заставку гри (спеціальне зображення) під час запуску гри. - - - ps4proCheckBox - Режим PS4 Pro:\nЗмушує емулятор працювати як PS4 Pro, що може ввімкнути спеціальні функції в іграх, які підтримують це. - - - discordRPCCheckbox - Увімкнути Discord Rich Presence:\nВідображає значок емулятора та відповідну інформацію у вашому профілі Discord. - - - userName - Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Воно може відображатися в деяких іграх. - - - TrophyKey - Ключ трофеїв:\nКлюч для розшифровки трофеїв. Може бути отриманий зі зламаної консолі.\nПовинен містити лише шістнадцяткові символи. - - - logTypeGroupBox - Тип логів:\nВстановіть, чи синхронізувати виведення вікна логів заради продуктивності. Це може негативно вплинути на емуляцію. - - - logFilter - Фільтр логів:\nФільтрує логи, щоб показувати тільки певну інформацію.\nПриклади: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Рівні: Trace, Debug, Info, Warning, Error, Critical - у цьому порядку, конкретний рівень глушить усі попередні рівні у списку і показує всі наступні рівні. - - - updaterGroupBox - Оновлення:\nРелізний: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nТестовий: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. - - - GUIBackgroundImageGroupBox - Фонове зображення:\nКерує непрозорістю фонового зображення гри. - - - GUIMusicGroupBox - Грати титульну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. - - - disableTrophycheckBox - Вимкнути спливаючі вікна трофеїв:\nВимикає сповіщення про ігрові трофеї. Прогрес трофея все ще можна відстежувати за допомогою "Перегляд трофеїв" (клацніть правою кнопкою миші на грі у головному вікні). - - - hideCursorGroupBox - Приховувати курсор:\nВиберіть, коли курсор зникатиме:\nНіколи: Курсор миші завжди буде видимий.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Курсор миші завжди буде прихований. - - - idleTimeoutGroupBox - Встановіть час, через який курсор зникне в разі бездіяльності. - - - backButtonBehaviorGroupBox - Перепризначення кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. - - - enableCompatibilityCheckBox - Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть "Оновлення даних ігрової сумісності під час запуску" для отримання актуальної інформації. - - - checkCompatibilityOnStartupCheckBox - Оновлення даних ігрової сумісності під час запуску:\nАвтоматично оновлює базу даних ігрової сумісності під час запуску shadPS4. - - - updateCompatibilityButton - Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. - - - Never - Ніколи - - - Idle - При бездіяльності - - - Always - Завжди - - - Touchpad Left - Ліва сторона тачпаду - - - Touchpad Right - Права сторона тачпаду - - - Touchpad Center - Середина тачпаду - - - None - Без змін - - - graphicsAdapterGroupBox - Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Автовибір", щоб визначити його автоматично. - - - resolutionLayout - Ширина/Висота:\nВстановіть розмір вікна емулятора під час запуску, який може бути змінений під час гри.\nЦе відрізняється від роздільної здатності в грі. - - - heightDivider - Розділювач Vblank:\nЧастота кадрів, з якою оновлюється емулятор, множиться на це число. Зміна цього параметра може мати негативні наслідки, такі як збільшення швидкості гри або порушення критичних функцій гри, які цього не очікують! - - - dumpShadersCheckBox - Увімкнути дамп шейдерів:\nДля технічного налагодження зберігає шейдери ігор у папку під час рендерингу. - - - nullGpuCheckBox - Увімкнути NULL GPU:\nДля технічного налагодження відключає рендеринг гри так, ніби графічної карти немає. - - - gameFoldersBox - Ігрові папки:\nСписок папок, що скануватимуться для виявлення ігор. - - - addFolderButton - Додати:\nДодати папку в список. - - - removeFolderButton - Вилучити:\nВилучити папку зі списку. - - - debugDump - Увімкнути налагоджувальні дампи:\nЗберігає символи імпорту, експорту та інформацію про заголовок файлу поточної виконуваної програми PS4 у папку. - - - vkValidationCheckBox - Увімкнути шари валідації Vulkan:\nВключає систему, яка перевіряє стан рендерера Vulkan і логує інформацію про його внутрішній стан. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - - - vkSyncValidationCheckBox - Увімкнути валідацію синхронізації Vulkan:\nВключає систему, яка перевіряє таймінг завдань рендерингу Vulkan. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - - - rdocCheckBox - Увімкнути налагодження RenderDoc:\nЯкщо увімкнено, емулятор забезпечить сумісність із Renderdoc, даючи змогу захоплювати й аналізувати поточні кадри під час рендерингу. - - - collectShaderCheckBox - Збирати шейдери:\nВам потрібно увімкнути цю опцію, щоб редагувати шейдери за допомогою меню налагодження (Ctrl + F10). - - - crashDiagnosticsCheckBox - Діагностика збоїв:\nСтворює .yaml файл з інформацією про стан Vulkan на момент збою.\nКорисно для налагодження помилок 'Device lost'. Якщо у вас увімкнено цей параметр, вам слід увімкнути маркери налагодження Хоста ТА Гостя.\nНе працює на графічних процесорах Intel.\nДля цього вам потрібно увімкнути шари валідації Vulkan і мати Vulkan SDK. - - - copyGPUBuffersCheckBox - Копіювати буфери GPU:\nДозволяє обійти проблеми синхронізації, пов'язані з відправленням даних на GPU\nМоже як допомогти, так і не вплинути на збої типу PM4 (тип 0). - - - hostMarkersCheckBox - Хостові маркери налагодження:\nДодає інформацію емулятора, наприклад маркери для конкретних команд AMDGPU у Vulkan, також присвоює ресурсам налагоджувані назви.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. - - - guestMarkersCheckBox - Гостьові маркери налагодження:\nВставляє налагоджувані маркери, які сама гра додала до командного буфера.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. - - - saveDataBox - Шлях до файлів збережень:\nПапка, де будуть зберігатися ігрові збереження. - - - browseButton - Вибрати:\nВиберіть папку для ігрових збережень. - - - - CheatsPatches - - Cheats / Patches for - Чити та Патчі для - - - defaultTextEdit_MSG - Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Зображення відсутнє - - - Serial: - Серійний номер: - - - Version: - Версія: - - - Size: - Розмір: - - - Select Cheat File: - Виберіть файл читу: - - - Repository: - Репозиторій: - - - Download Cheats - Завантажити чити - - - Delete File - Видалити файл - - - No files selected. - Файли не вибрані. - - - You can delete the cheats you don't want after downloading them. - Ви можете видалити непотрібні чити після їх завантаження. - - - Do you want to delete the selected file?\n%1 - Ви хочете видалити вибраний файл?\n%1 - - - Select Patch File: - Виберіть файл патчу: - - - Download Patches - Завантажити патчі - - - Save - Зберегти - - - Cheats - Чити - - - Patches - Патчі - - - Error - Помилка - - - No patch selected. - Патч не вибрано. - - - Unable to open files.json for reading. - Не вдалось відкрити files.json для читання. - - - No patch file found for the current serial. - Файл патча для поточного серійного номера не знайдено. - - - Unable to open the file for reading. - Не вдалося відкрити файл для читання. - - - Unable to open the file for writing. - Не вдалось відкрити файл для запису. - - - Failed to parse XML: - Не вдалося розібрати XML: - - - Success - Успіх - - - Options saved successfully. - Параметри успішно збережено. - - - Invalid Source - Неправильне джерело - - - The selected source is invalid. - Вибране джерело є недійсним. - - - File Exists - Файл існує - - - File already exists. Do you want to replace it? - Файл вже існує. Ви хочете замінити його? - - - Failed to save file: - Не вдалося зберегти файл: - - - Failed to download file: - Не вдалося завантажити файл: - - - Cheats Not Found - Читів не знайдено - - - CheatsNotFound_MSG - У вибраному репозиторії не знайдено Читів для цієї гри, спробуйте інший репозиторій або іншу версію гри. - - - Cheats Downloaded Successfully - Чити успішно завантажено - - - CheatsDownloadedSuccessfully_MSG - Ви успішно завантажили чити для цієї версії гри з обраного репозиторія. Ви можете спробувати завантажити з іншого репозиторія, якщо він буде доступним, ви також зможете скористатися ним, вибравши файл зі списку. - - - Failed to save: - Не вдалося зберегти: - - - Failed to download: - Не вдалося завантажити: - - - Download Complete - Заватнаження завершено - - - DownloadComplete_MSG - Патчі успішно завантажено! Всі доступні патчі для усіх ігор, завантажено, немає необхідності завантажувати їх окремо для кожної гри, як це відбувається у випадку з читами. Якщо патч не з’являється, можливо, його не існує для конкретного серійного номера та версії гри. Можливо, необхідно оновити гру. - - - Failed to parse JSON data from HTML. - Не вдалося розібрати JSON-дані з HTML. - - - Failed to retrieve HTML page. - Не вдалося отримати HTML-сторінку. - - - The game is in version: %1 - Версія гри: %1 - - - The downloaded patch only works on version: %1 - Завантажений патч працює лише на версії: %1 - - - You may need to update your game. - Можливо, вам потрібно оновити гру. - - - Incompatibility Notice - Повідомлення про несумісність - - - Failed to open file: - Не вдалося відкрити файл: - - - XML ERROR: - ПОМИЛКА XML: - - - Failed to open files.json for writing - Не вдалося відкрити files.json для запису - - - Author: - Автор: - - - Directory does not exist: - Каталогу не існує: - - - Failed to open files.json for reading. - Не вдалося відкрити files.json для читання. - - - Name: - Назва: - - - Can't apply cheats before the game is started - Неможливо застосовувати чити до початку гри. - - - - GameListFrame - - Icon - Значок - - - Name - Назва - - - Serial - Серійний номер - - - Compatibility - Сумісність - - - Region - Регіон - - - Firmware - Прошивка - - - Size - Розмір - - - Version - Версія - - - Path - Шлях - - - Play Time - Час у грі - - - Never Played - Ніколи не запускалась - - - h - год - - - m - хв - - - s - сек - - - Compatibility is untested - Сумісність не перевірена - - - Game does not initialize properly / crashes the emulator - Гра не ініціалізується належним чином або спричиняє збій емулятора. - - - Game boots, but only displays a blank screen - Гра запускається, але відображає лише чорний екран. - - - Game displays an image but does not go past the menu - Гра відображає зображення, але не проходить далі меню. - - - Game has game-breaking glitches or unplayable performance - У грі є критичні баги або погана продуктивність - - - Game can be completed with playable performance and no major glitches - Гру можна пройти з хорошою продуктивністю та без серйозних глюків. - - - Click to see details on github - Натисніть, щоб переглянути деталі на GitHub - - - Last updated - Останнє оновлення - - - - CheckUpdate - - Auto Updater - Автооновлення - - - Error - Помилка - - - Network error: - Мережева помилка: - - - Error_Github_limit_MSG - Автооновлення дозволяє до 60 перевірок оновлень на годину.\nВи досягли цього ліміту. Будь ласка, спробуйте пізніше. - - - Failed to parse update information. - Не вдалося розібрати інформацію про оновлення. - - - No pre-releases found. - Попередніх версій не знайдено. - - - Invalid release data. - Некоректні дані про випуск. - - - No download URL found for the specified asset. - Не знайдено URL для завантаження зазначеного ресурсу. - - - Your version is already up to date! - У вас актуальна версія! - - - Update Available - Доступне оновлення - - - Update Channel - Канал оновлення - - - Current Version - Поточна версія - - - Latest Version - Остання версія - - - Do you want to update? - Ви хочете оновитися? - - - Show Changelog - Показати журнал змін - - - Check for Updates at Startup - Перевірка оновлень під час запуску - - - Update - Оновитись - - - No - Ні - - - Hide Changelog - Приховати журнал змін - - - Changes - Журнал змін - - - Network error occurred while trying to access the URL - Сталася мережева помилка під час спроби доступу до URL - - - Download Complete - Завантаження завершено - - - The update has been downloaded, press OK to install. - Оновлення завантажено, натисніть OK для встановлення. - - - Failed to save the update file at - Не вдалося зберегти файл оновлення в - - - Starting Update... - Початок оновлення... - - - Failed to create the update script file - Не вдалося створити файл скрипта оновлення - - - - GameListUtils - - B - Б - - - KB - КБ - - - MB - - - - GB - ГБ - - - TB - ТБ - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Отримання даних про сумісність. Будь ласка, зачекайте - - - Cancel - Відмінити - - - Loading... - Завантаження... - - - Error - Помилка - - - Unable to update compatibility data! Try again later. - Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. - - - Unable to open compatibility_data.json for writing. - Не вдалося відкрити файл compatibility_data.json для запису. - - - Unknown - Невідомо - - - Nothing - Не працює - - - Boots - Запускається - - - Menus - У меню - - - Ingame - У грі - - - Playable - Іграбельно - - + + AboutDialog + + About shadPS4 + Про shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 - це експериментальний емулятор з відкритим вихідним кодом для PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Це програмне забезпечення не повинно використовуватися для запуску ігор, котрі ви отримали не легально. + + + + CheatsPatches + + Cheats / Patches for + Чити та Патчі для + + + defaultTextEdit_MSG + Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Зображення відсутнє + + + Serial: + Серійний номер: + + + Version: + Версія: + + + Size: + Розмір: + + + Select Cheat File: + Виберіть файл читу: + + + Repository: + Репозиторій: + + + Download Cheats + Завантажити чити + + + Delete File + Видалити файл + + + No files selected. + Файли не вибрані. + + + You can delete the cheats you don't want after downloading them. + Ви можете видалити непотрібні чити після їх завантаження. + + + Do you want to delete the selected file?\n%1 + Ви хочете видалити вибраний файл?\n%1 + + + Select Patch File: + Виберіть файл патчу: + + + Download Patches + Завантажити патчі + + + Save + Зберегти + + + Cheats + Чити + + + Patches + Патчі + + + Error + Помилка + + + No patch selected. + Патч не вибрано. + + + Unable to open files.json for reading. + Не вдалось відкрити files.json для читання. + + + No patch file found for the current serial. + Файл патча для поточного серійного номера не знайдено. + + + Unable to open the file for reading. + Не вдалося відкрити файл для читання. + + + Unable to open the file for writing. + Не вдалось відкрити файл для запису. + + + Failed to parse XML: + Не вдалося розібрати XML: + + + Success + Успіх + + + Options saved successfully. + Параметри успішно збережено. + + + Invalid Source + Неправильне джерело + + + The selected source is invalid. + Вибране джерело є недійсним. + + + File Exists + Файл існує + + + File already exists. Do you want to replace it? + Файл вже існує. Ви хочете замінити його? + + + Failed to save file: + Не вдалося зберегти файл: + + + Failed to download file: + Не вдалося завантажити файл: + + + Cheats Not Found + Читів не знайдено + + + CheatsNotFound_MSG + У вибраному репозиторії не знайдено Читів для цієї гри, спробуйте інший репозиторій або іншу версію гри. + + + Cheats Downloaded Successfully + Чити успішно завантажено + + + CheatsDownloadedSuccessfully_MSG + Ви успішно завантажили чити для цієї версії гри з обраного репозиторія. Ви можете спробувати завантажити з іншого репозиторія, якщо він буде доступним, ви також зможете скористатися ним, вибравши файл зі списку. + + + Failed to save: + Не вдалося зберегти: + + + Failed to download: + Не вдалося завантажити: + + + Download Complete + Заватнаження завершено + + + DownloadComplete_MSG + Патчі успішно завантажено! Всі доступні патчі для усіх ігор, завантажено, немає необхідності завантажувати їх окремо для кожної гри, як це відбувається у випадку з читами. Якщо патч не з’являється, можливо, його не існує для конкретного серійного номера та версії гри. Можливо, необхідно оновити гру. + + + Failed to parse JSON data from HTML. + Не вдалося розібрати JSON-дані з HTML. + + + Failed to retrieve HTML page. + Не вдалося отримати HTML-сторінку. + + + The game is in version: %1 + Версія гри: %1 + + + The downloaded patch only works on version: %1 + Завантажений патч працює лише на версії: %1 + + + You may need to update your game. + Можливо, вам потрібно оновити гру. + + + Incompatibility Notice + Повідомлення про несумісність + + + Failed to open file: + Не вдалося відкрити файл: + + + XML ERROR: + ПОМИЛКА XML: + + + Failed to open files.json for writing + Не вдалося відкрити files.json для запису + + + Author: + Автор: + + + Directory does not exist: + Каталогу не існує: + + + Failed to open files.json for reading. + Не вдалося відкрити files.json для читання. + + + Name: + Назва: + + + Can't apply cheats before the game is started + Неможливо застосовувати чити до початку гри. + + + Close + Закрити + + + + CheckUpdate + + Auto Updater + Автооновлення + + + Error + Помилка + + + Network error: + Мережева помилка: + + + Error_Github_limit_MSG + Автооновлення дозволяє до 60 перевірок оновлень на годину.\nВи досягли цього ліміту. Будь ласка, спробуйте пізніше. + + + Failed to parse update information. + Не вдалося розібрати інформацію про оновлення. + + + No pre-releases found. + Попередніх версій не знайдено. + + + Invalid release data. + Некоректні дані про випуск. + + + No download URL found for the specified asset. + Не знайдено URL для завантаження зазначеного ресурсу. + + + Your version is already up to date! + У вас актуальна версія! + + + Update Available + Доступне оновлення + + + Update Channel + Канал оновлення + + + Current Version + Поточна версія + + + Latest Version + Остання версія + + + Do you want to update? + Ви хочете оновитися? + + + Show Changelog + Показати журнал змін + + + Check for Updates at Startup + Перевірка оновлень під час запуску + + + Update + Оновитись + + + No + Ні + + + Hide Changelog + Приховати журнал змін + + + Changes + Журнал змін + + + Network error occurred while trying to access the URL + Сталася мережева помилка під час спроби доступу до URL + + + Download Complete + Завантаження завершено + + + The update has been downloaded, press OK to install. + Оновлення завантажено, натисніть OK для встановлення. + + + Failed to save the update file at + Не вдалося зберегти файл оновлення в + + + Starting Update... + Початок оновлення... + + + Failed to create the update script file + Не вдалося створити файл скрипта оновлення + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Отримання даних про сумісність. Будь ласка, зачекайте + + + Cancel + Відмінити + + + Loading... + Завантаження... + + + Error + Помилка + + + Unable to update compatibility data! Try again later. + Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. + + + Unable to open compatibility_data.json for writing. + Не вдалося відкрити файл compatibility_data.json для запису. + + + Unknown + Невідомо + + + Nothing + Не працює + + + Boots + Запускається + + + Menus + У меню + + + Ingame + У грі + + + Playable + Іграбельно + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Відкрити папку + + + + GameInfoClass + + Loading game list, please wait :3 + Завантажуємо список ігор, будь ласка, зачекайте :3 + + + Cancel + Відмінити + + + Loading... + Завантаження... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Виберіть папку + + + Directory to install games + Папка для встановлення ігор + + + Browse + Обрати + + + Error + Помилка + + + Directory to install DLC + + + + + GameListFrame + + Icon + Значок + + + Name + Назва + + + Serial + Серійний номер + + + Compatibility + Сумісність + + + Region + Регіон + + + Firmware + Прошивка + + + Size + Розмір + + + Version + Версія + + + Path + Шлях + + + Play Time + Час у грі + + + Never Played + Ніколи не запускалась + + + h + год + + + m + хв + + + s + сек + + + Compatibility is untested + Сумісність не перевірена + + + Game does not initialize properly / crashes the emulator + Гра не ініціалізується належним чином або спричиняє збій емулятора. + + + Game boots, but only displays a blank screen + Гра запускається, але відображає лише чорний екран. + + + Game displays an image but does not go past the menu + Гра відображає зображення, але не проходить далі меню. + + + Game has game-breaking glitches or unplayable performance + У грі є критичні баги або погана продуктивність + + + Game can be completed with playable performance and no major glitches + Гру можна пройти з хорошою продуктивністю та без серйозних глюків. + + + Click to see details on github + Натисніть, щоб переглянути деталі на GitHub + + + Last updated + Останнє оновлення + + + + GameListUtils + + B + Б + + + KB + КБ + + + MB + + + + GB + ГБ + + + TB + ТБ + + + + GuiContextMenus + + Create Shortcut + Створити Ярлик + + + Cheats / Patches + Чити та Патчі + + + SFO Viewer + Перегляд SFO + + + Trophy Viewer + Перегляд трофеїв + + + Open Folder... + Відкрити Папку... + + + Open Game Folder + Відкрити папку гри + + + Open Update Folder + Відкрити папку оновлень + + + Open Save Data Folder + Відкрити папку збережень гри + + + Open Log Folder + Відкрити папку логів + + + Copy info... + Копіювати інформацію... + + + Copy Name + Копіювати назву гри + + + Copy Serial + Копіювати серійний номер + + + Copy Version + Копіювати версію + + + Copy Size + Копіювати розмір + + + Copy All + Копіювати все + + + Delete... + Видалити... + + + Delete Game + Видалити гру + + + Delete Update + Видалити оновлення + + + Delete Save Data + Видалити збереження + + + Delete DLC + Видалити DLC + + + Compatibility... + Сумісність... + + + Update database + Оновити базу даних + + + View report + Переглянути звіт + + + Submit a report + Створити звіт + + + Shortcut creation + Створення ярлика + + + Shortcut created successfully! + Ярлик створений успішно! + + + Error + Помилка + + + Error creating shortcut! + Помилка при створенні ярлика! + + + Install PKG + Встановити PKG + + + Game + гри + + + This game has no update to delete! + Ця гра не має оновлень для видалення! + + + This game has no update folder to open! + Ця гра не має папки оновленнь, щоб відкрити її! + + + Update + Оновлення + + + This game has no save data to delete! + Ця гра не містить збережень, які можна видалити! + + + Save Data + Збереження + + + This game has no DLC to delete! + Ця гра не має DLC для видалення! + + + DLC + DLC + + + Delete %1 + Видалення %1 + + + Are you sure you want to delete %1's %2 directory? + Ви впевнені, що хочете видалити %1 з папки %2? + + + Failed to convert icon. + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Виберіть папку + + + Select which directory you want to install to. + Виберіть папку, до якої ви хочете встановити. + + + Install All Queued to Selected Folder + Встановити все з черги до вибраної папки + + + Delete PKG File on Install + Видалити файл PKG під час встановлення + + + + MainWindow + + Open/Add Elf Folder + Відкрити/Додати папку Elf + + + Install Packages (PKG) + Встановити пакети (PKG) + + + Boot Game + Запустити гру + + + Check for Updates + Перевірити наявність оновлень + + + About shadPS4 + Про shadPS4 + + + Configure... + Налаштувати... + + + Install application from a .pkg file + Встановити додаток з файлу .pkg + + + Recent Games + Нещодавні ігри + + + Open shadPS4 Folder + Відкрити папку shadPS4 + + + Exit + Вихід + + + Exit shadPS4 + Вийти з shadPS4 + + + Exit the application. + Вийти з додатку. + + + Show Game List + Показати список ігор + + + Game List Refresh + Оновити список ігор + + + Tiny + Крихітний + + + Small + Маленький + + + Medium + Середній + + + Large + Великий + + + List View + Список + + + Grid View + Сітка + + + Elf Viewer + Виконуваний файл + + + Game Install Directory + Каталоги встановлення ігор та оновлень + + + Download Cheats/Patches + Завантажити Чити/Патчі + + + Dump Game List + Дамп списку ігор + + + PKG Viewer + Перегляд PKG + + + Search... + Пошук... + + + File + Файл + + + View + Вид + + + Game List Icons + Розмір значків списку ігор + + + Game List Mode + Вид списку ігор + + + Settings + Налаштування + + + Utils + Утиліти + + + Themes + Теми + + + Help + Допомога + + + Dark + Темна + + + Light + Світла + + + Green + Зелена + + + Blue + Синя + + + Violet + Фіолетова + + + toolBar + Панель інструментів + + + Game List + Список ігор + + + * Unsupported Vulkan Version + * Непідтримувана версія Vulkan + + + Download Cheats For All Installed Games + Завантажити чити для усіх встановлених ігор + + + Download Patches For All Games + Завантажити патчі для всіх ігор + + + Download Complete + Завантаження завершено + + + You have downloaded cheats for all the games you have installed. + Ви завантажили чити для усіх встановлених ігор. + + + Patches Downloaded Successfully! + Патчі успішно завантажено! + + + All Patches available for all games have been downloaded. + Завантажено всі доступні патчі для всіх ігор. + + + Games: + Ігри: + + + ELF files (*.bin *.elf *.oelf) + Файли ELF (*.bin *.elf *.oelf) + + + Game Boot + Запуск гри + + + Only one file can be selected! + Можна вибрати лише один файл! + + + PKG Extraction + Розпакування PKG + + + Patch detected! + Виявлено патч! + + + PKG and Game versions match: + Версії PKG та гри збігаються: + + + Would you like to overwrite? + Бажаєте перезаписати? + + + PKG Version %1 is older than installed version: + Версія PKG %1 старіша за встановлену версію: + + + Game is installed: + Встановлена гра: + + + Would you like to install Patch: + Бажаєте встановити патч: + + + DLC Installation + Встановлення DLC + + + Would you like to install DLC: %1? + Ви бажаєте встановити DLC: %1? + + + DLC already installed: + DLC вже встановлено: + + + Game already installed + Гра вже встановлена + + + PKG ERROR + ПОМИЛКА PKG + + + Extracting PKG %1/%2 + Витягування PKG %1/%2 + + + Extraction Finished + Розпакування завершено + + + Game successfully installed at %1 + Гру успішно встановлено у %1 + + + File doesn't appear to be a valid PKG file + Файл не є дійсним PKG-файлом + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Відкрити папку + + + Name + Назва + + + Serial + Серійний номер + + + Installed + + + + Size + Розмір + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Регіон + + + Flags + + + + Path + Шлях + + + File + Файл + + + PKG ERROR + ПОМИЛКА PKG + + + Unknown + Невідомо + + + Package + + + + + SettingsDialog + + Settings + Налаштування + + + General + Загальні + + + System + Система + + + Console Language + Мова консолі + + + Emulator Language + Мова емулятора + + + Emulator + Емулятор + + + Enable Fullscreen + Увімкнути повноекранний режим + + + Fullscreen Mode + Тип повноекранного режиму + + + Borderless + Без рамок + + + True + Повний екран + + + Enable Separate Update Folder + Увімкнути окрему папку оновлень + + + Default tab when opening settings + Вкладка за замовчуванням при відкритті налаштувань + + + Show Game Size In List + Показати розмір гри у списку + + + Show Splash + Показувати заставку + + + Enable Discord Rich Presence + Увімкнути Discord Rich Presence + + + Username + Ім'я користувача + + + Trophy Key + Ключ трофеїв + + + Trophy + Трофеї + + + Logger + Логування + + + Log Type + Тип логів + + + async + Асинхронний + + + sync + Синхронний + + + Log Filter + Фільтр логів + + + Open Log Location + Відкрити місце розташування журналу + + + Input + Введення + + + Cursor + Курсор миші + + + Hide Cursor + Приховати курсор + + + Hide Cursor Idle Timeout + Тайм-аут приховування курсора при бездіяльності + + + s + сек + + + Controller + Контролер + + + Back Button Behavior + Перепризначення кнопки назад + + + Enable Motion Controls + Увімкнути керування рухом + + + Graphics + Графіка + + + GUI + Інтерфейс + + + User + Користувач + + + Graphics Device + Графічний пристрій + + + Width + Ширина + + + Height + Висота + + + Vblank Divider + Розділювач Vblank + + + Advanced + Розширені + + + Enable Shaders Dumping + Увімкнути дамп шейдерів + + + Auto Select + Автовибір + + + Enable NULL GPU + Увімкнути NULL GPU + + + Paths + Шляхи + + + Game Folders + Ігрові папки + + + Add... + Додати... + + + Remove + Вилучити + + + Save Data Path + Шлях до файлів збережень + + + Debug + Налагодження + + + Enable Debug Dumping + Увімкнути налагоджувальні дампи + + + Enable Vulkan Validation Layers + Увімкнути шари валідації Vulkan + + + Enable Vulkan Synchronization Validation + Увімкнути валідацію синхронізації Vulkan + + + Enable RenderDoc Debugging + Увімкнути налагодження RenderDoc + + + Enable Crash Diagnostics + Увімкнути діагностику збоїв + + + Collect Shaders + Збирати шейдери + + + Copy GPU Buffers + Копіювати буфери GPU + + + Host Debug Markers + Хостові маркери налагодження + + + Guest Debug Markers + Гостьові маркери налагодження + + + Update + Оновлення + + + Check for Updates at Startup + Перевіряти оновлення під час запуску + + + Always Show Changelog + Завжди показувати журнал змін + + + Update Channel + Канал оновлення + + + Release + Релізний + + + Nightly + Тестовий + + + Check for Updates + Перевірити оновлення + + + GUI Settings + Інтерфейс + + + Title Music + Титульна музика + + + Disable Trophy Pop-ups + Вимкнути спливаючі вікна трофеїв + + + Background Image + Фонове зображення + + + Show Background Image + Показувати фонове зображення + + + Opacity + Непрозорість + + + Play title music + Програвати титульну музику + + + Update Compatibility Database On Startup + Оновлення даних ігрової сумісності під час запуску + + + Game Compatibility + Сумісність з іграми + + + Display Compatibility Data + Відображати данні ігрової сумістністі + + + Update Compatibility Database + Оновити данні ігрової сумістності + + + Volume + Гучність + + + Save + Зберегти + + + Apply + Застосувати + + + Restore Defaults + За замовчуванням + + + Close + Закрити + + + Point your mouse at an option to display its description. + Наведіть курсор миші на опцію, щоб відобразити її опис. + + + consoleLanguageGroupBox + Мова консолі:\nВстановіть мову, яка буде використовуватись у іграх PS4.\nРекомендується встановити мову котра підтримується грою, оскільки вона може відрізнятися в залежності від регіону. + + + emulatorLanguageGroupBox + Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора. + + + fullscreenCheckBox + Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11. + + + separateUpdatesCheckBox + Окрема папка для оновлень:\nДає змогу встановлювати оновлення гри в окрему папку для зручності. + + + showSplashCheckBox + Показувати заставку:\nВідображає заставку гри (спеціальне зображення) під час запуску гри. + + + discordRPCCheckbox + Увімкнути Discord Rich Presence:\nВідображає значок емулятора та відповідну інформацію у вашому профілі Discord. + + + userName + Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Воно може відображатися в деяких іграх. + + + TrophyKey + Ключ трофеїв:\nКлюч для розшифровки трофеїв. Може бути отриманий зі зламаної консолі.\nПовинен містити лише шістнадцяткові символи. + + + logTypeGroupBox + Тип логів:\nВстановіть, чи синхронізувати виведення вікна логів заради продуктивності. Це може негативно вплинути на емуляцію. + + + logFilter + Фільтр логів:\nФільтрує логи, щоб показувати тільки певну інформацію.\nПриклади: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Рівні: Trace, Debug, Info, Warning, Error, Critical - у цьому порядку, конкретний рівень глушить усі попередні рівні у списку і показує всі наступні рівні. + + + updaterGroupBox + Оновлення:\nРелізний: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nТестовий: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. + + + GUIBackgroundImageGroupBox + Фонове зображення:\nКерує непрозорістю фонового зображення гри. + + + GUIMusicGroupBox + Грати титульну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. + + + disableTrophycheckBox + Вимкнути спливаючі вікна трофеїв:\nВимикає сповіщення про ігрові трофеї. Прогрес трофея все ще можна відстежувати за допомогою "Перегляд трофеїв" (клацніть правою кнопкою миші на грі у головному вікні). + + + hideCursorGroupBox + Приховувати курсор:\nВиберіть, коли курсор зникатиме:\nНіколи: Курсор миші завжди буде видимий.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Курсор миші завжди буде прихований. + + + idleTimeoutGroupBox + Встановіть час, через який курсор зникне в разі бездіяльності. + + + backButtonBehaviorGroupBox + Перепризначення кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. + + + enableCompatibilityCheckBox + Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть "Оновлення даних ігрової сумісності під час запуску" для отримання актуальної інформації. + + + checkCompatibilityOnStartupCheckBox + Оновлення даних ігрової сумісності під час запуску:\nАвтоматично оновлює базу даних ігрової сумісності під час запуску shadPS4. + + + updateCompatibilityButton + Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. + + + Never + Ніколи + + + Idle + При бездіяльності + + + Always + Завжди + + + Touchpad Left + Ліва сторона тачпаду + + + Touchpad Right + Права сторона тачпаду + + + Touchpad Center + Середина тачпаду + + + None + Без змін + + + graphicsAdapterGroupBox + Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Автовибір", щоб визначити його автоматично. + + + resolutionLayout + Ширина/Висота:\nВстановіть розмір вікна емулятора під час запуску, який може бути змінений під час гри.\nЦе відрізняється від роздільної здатності в грі. + + + heightDivider + Розділювач Vblank:\nЧастота кадрів, з якою оновлюється емулятор, множиться на це число. Зміна цього параметра може мати негативні наслідки, такі як збільшення швидкості гри або порушення критичних функцій гри, які цього не очікують! + + + dumpShadersCheckBox + Увімкнути дамп шейдерів:\nДля технічного налагодження зберігає шейдери ігор у папку під час рендерингу. + + + nullGpuCheckBox + Увімкнути NULL GPU:\nДля технічного налагодження відключає рендеринг гри так, ніби графічної карти немає. + + + gameFoldersBox + Ігрові папки:\nСписок папок, що скануватимуться для виявлення ігор. + + + addFolderButton + Додати:\nДодати папку в список. + + + removeFolderButton + Вилучити:\nВилучити папку зі списку. + + + debugDump + Увімкнути налагоджувальні дампи:\nЗберігає символи імпорту, експорту та інформацію про заголовок файлу поточної виконуваної програми PS4 у папку. + + + vkValidationCheckBox + Увімкнути шари валідації Vulkan:\nВключає систему, яка перевіряє стан рендерера Vulkan і логує інформацію про його внутрішній стан. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. + + + vkSyncValidationCheckBox + Увімкнути валідацію синхронізації Vulkan:\nВключає систему, яка перевіряє таймінг завдань рендерингу Vulkan. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. + + + rdocCheckBox + Увімкнути налагодження RenderDoc:\nЯкщо увімкнено, емулятор забезпечить сумісність із Renderdoc, даючи змогу захоплювати й аналізувати поточні кадри під час рендерингу. + + + collectShaderCheckBox + Збирати шейдери:\nВам потрібно увімкнути цю опцію, щоб редагувати шейдери за допомогою меню налагодження (Ctrl + F10). + + + crashDiagnosticsCheckBox + Діагностика збоїв:\nСтворює .yaml файл з інформацією про стан Vulkan на момент збою.\nКорисно для налагодження помилок 'Device lost'. Якщо у вас увімкнено цей параметр, вам слід увімкнути маркери налагодження Хоста ТА Гостя.\nНе працює на графічних процесорах Intel.\nДля цього вам потрібно увімкнути шари валідації Vulkan і мати Vulkan SDK. + + + copyGPUBuffersCheckBox + Копіювати буфери GPU:\nДозволяє обійти проблеми синхронізації, пов'язані з відправленням даних на GPU\nМоже як допомогти, так і не вплинути на збої типу PM4 (тип 0). + + + hostMarkersCheckBox + Хостові маркери налагодження:\nДодає інформацію емулятора, наприклад маркери для конкретних команд AMDGPU у Vulkan, також присвоює ресурсам налагоджувані назви.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. + + + guestMarkersCheckBox + Гостьові маркери налагодження:\nВставляє налагоджувані маркери, які сама гра додала до командного буфера.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. + + + saveDataBox + Шлях до файлів збережень:\nПапка, де будуть зберігатися ігрові збереження. + + + browseButton + Вибрати:\nВиберіть папку для ігрових збережень. + + + Enable HDR + + + + Set the volume of the background music. + + + + Browse + Обрати + + + Directory to install games + Папка для встановлення ігор + + + Directory to save data + + + + enableHDRCheckBox + + + + + TrophyViewer + + Trophy Viewer + Трофеї + + diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index a85f5b2c8..dddc7bfe0 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - Mẹo / Bản vá - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - Mở Thư Mục... - - - Open Game Folder - Mở Thư Mục Trò Chơi - - - Open Save Data Folder - Mở Thư Mục Dữ Liệu Lưu - - - Open Log Folder - Mở Thư Mục Nhật Ký - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - Kiểm tra bản cập nhật - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Tải Mẹo / Bản vá - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - Giúp đỡ - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - Danh sách trò chơi - - - * Unsupported Vulkan Version - * Phiên bản Vulkan không được hỗ trợ - - - Download Cheats For All Installed Games - Tải xuống cheat cho tất cả các trò chơi đã cài đặt - - - Download Patches For All Games - Tải xuống bản vá cho tất cả các trò chơi - - - Download Complete - Tải xuống hoàn tất - - - You have downloaded cheats for all the games you have installed. - Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. - - - Patches Downloaded Successfully! - Bản vá đã tải xuống thành công! - - - All Patches available for all games have been downloaded. - Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. - - - Games: - Trò chơi: - - - PKG File (*.PKG) - Tệp PKG (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - Tệp ELF (*.bin *.elf *.oelf) - - - Game Boot - Khởi động trò chơi - - - Only one file can be selected! - Chỉ có thể chọn một tệp duy nhất! - - - PKG Extraction - Giải nén PKG - - - Patch detected! - Đã phát hiện bản vá! - - - PKG and Game versions match: - Các phiên bản PKG và trò chơi khớp nhau: - - - Would you like to overwrite? - Bạn có muốn ghi đè không? - - - PKG Version %1 is older than installed version: - Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: - - - Game is installed: - Trò chơi đã được cài đặt: - - - Would you like to install Patch: - Bạn có muốn cài đặt bản vá: - - - DLC Installation - Cài đặt DLC - - - Would you like to install DLC: %1? - Bạn có muốn cài đặt DLC: %1? - - - DLC already installed: - DLC đã được cài đặt: - - - Game already installed - Trò chơi đã được cài đặt - - - PKG is a patch, please install the game first! - PKG là bản vá, vui lòng cài đặt trò chơi trước! - - - PKG ERROR - LOI PKG - - - Extracting PKG %1/%2 - Đang giải nén PKG %1/%2 - - - Extraction Finished - Giải nén hoàn tất - - - Game successfully installed at %1 - Trò chơi đã được cài đặt thành công tại %1 - - - File doesn't appear to be a valid PKG file - Tệp không có vẻ là tệp PKG hợp lệ - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Chế độ Toàn màn hình - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - Tab mặc định khi mở cài đặt - - - Show Game Size In List - Hiển thị Kích thước Game trong Danh sách - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - Bật Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - Mở vị trí nhật ký - - - Input - Đầu vào - - - Cursor - Con trỏ - - - Hide Cursor - Ẩn con trỏ - - - Hide Cursor Idle Timeout - Thời gian chờ ẩn con trỏ - - - s - s - - - Controller - Điều khiển - - - Back Button Behavior - Hành vi nút quay lại - - - Graphics - Graphics - - - GUI - Giao diện - - - User - Người dùng - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - Đường dẫn - - - Game Folders - Thư mục trò chơi - - - Add... - Thêm... - - - Remove - Xóa - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - Cập nhật - - - Check for Updates at Startup - Kiểm tra cập nhật khi khởi động - - - Always Show Changelog - Luôn hiển thị nhật ký thay đổi - - - Update Channel - Kênh Cập Nhật - - - Check for Updates - Kiểm tra cập nhật - - - GUI Settings - Cài đặt GUI - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - Phát nhạc tiêu đề - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - Âm lượng - - - Audio Backend - Audio Backend - - - Save - Lưu - - - Apply - Áp dụng - - - Restore Defaults - Khôi phục cài đặt mặc định - - - Close - Đóng - - - Point your mouse at an option to display its description. - Di chuyển chuột đến tùy chọn để hiển thị mô tả của nó. - - - consoleLanguageGroupBox - Ngôn ngữ console:\nChọn ngôn ngữ mà trò chơi PS4 sẽ sử dụng.\nKhuyên bạn nên đặt tùy chọn này thành một ngôn ngữ mà trò chơi hỗ trợ, có thể thay đổi tùy theo vùng. - - - emulatorLanguageGroupBox - Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. - - - fullscreenCheckBox - Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - Hiển thị màn hình khởi động:\nHiển thị màn hình khởi động của trò chơi (một hình ảnh đặc biệt) trong khi trò chơi khởi động. - - - ps4proCheckBox - Là PS4 Pro:\nKhiến trình giả lập hoạt động như một PS4 PRO, điều này có thể kích hoạt các tính năng đặc biệt trong các trò chơi hỗ trợ điều này. - - - discordRPCCheckbox - Bật Discord Rich Presence:\nHiển thị biểu tượng trình giả lập và thông tin liên quan trên hồ sơ Discord của bạn. - - - userName - Tên người dùng:\nChọn tên người dùng của tài khoản PS4, có thể được một số trò chơi hiển thị. - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - Loại nhật ký:\nChọn xem có đồng bộ hóa đầu ra cửa sổ nhật ký cho hiệu suất hay không. Điều này có thể có tác động tiêu cực đến việc giả lập. - - - logFilter - Bộ lọc nhật ký:\nLọc nhật ký để in chỉ thông tin cụ thể.\nVí dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách và ghi lại tất cả các mức sau đó. - - - updaterGroupBox - Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. - - - GUIMusicGroupBox - Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - Ẩn con trỏ:\nChọn khi nào con trỏ sẽ biến mất:\nKhông bao giờ: Bạn sẽ luôn thấy chuột.\nKhông hoạt động: Đặt một khoảng thời gian để nó biến mất sau khi không hoạt động.\nLuôn luôn: bạn sẽ không bao giờ thấy chuột. - - - idleTimeoutGroupBox - Đặt thời gian để chuột biến mất sau khi không hoạt động. - - - backButtonBehaviorGroupBox - Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm để mô phỏng việc chạm vào vị trí đã chỉ định trên touchpad của PS4. - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - Không bao giờ - - - Idle - Nhàn rỗi - - - Always - Luôn luôn - - - Touchpad Left - Touchpad Trái - - - Touchpad Right - Touchpad Phải - - - Touchpad Center - Giữa Touchpad - - - None - Không có - - - graphicsAdapterGroupBox - Thiết bị đồ họa:\nTrên các hệ thống có GPU đa năng, hãy chọn GPU mà trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn "Auto Select" để tự động xác định. - - - resolutionLayout - Chiều rộng/Cao:\nChọn kích thước cửa sổ của trình giả lập khi khởi động, có thể điều chỉnh trong quá trình chơi.\nĐiều này khác với độ phân giải trong trò chơi. - - - heightDivider - Bộ chia Vblank:\nTốc độ khung hình mà trình giả lập làm mới được nhân với số này. Thay đổi này có thể có tác động tiêu cực như tăng tốc độ trò chơi hoặc làm hỏng chức năng quan trọng mà trò chơi không mong đợi thay đổi điều này! - - - dumpShadersCheckBox - Bật xuất shader:\nĐể mục đích gỡ lỗi kỹ thuật, lưu shader của trò chơi vào một thư mục khi chúng được kết xuất. - - - nullGpuCheckBox - Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, vô hiệu hóa việc kết xuất trò chơi như thể không có card đồ họa. - - - gameFoldersBox - Thư mục trò chơi:\nDanh sách các thư mục để kiểm tra các trò chơi đã cài đặt. - - - addFolderButton - Thêm:\nThêm một thư mục vào danh sách. - - - removeFolderButton - Xóa:\nXóa một thư mục khỏi danh sách. - - - debugDump - Bật xuất gỡ lỗi:\nLưu biểu tượng nhập và xuất và thông tin tiêu đề tệp cho ứng dụng PS4 hiện đang chạy vào một thư mục. - - - vkValidationCheckBox - Bật lớp xác thực Vulkan:\nKích hoạt một hệ thống xác thực trạng thái của bộ kết xuất Vulkan và ghi lại thông tin về trạng thái nội bộ của nó. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - - - vkSyncValidationCheckBox - Bật xác thực đồng bộ Vulkan:\nKích hoạt một hệ thống xác thực thời gian của nhiệm vụ kết xuất Vulkan. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - - - rdocCheckBox - Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - Không có hình ảnh - - - Serial: - Số seri: - - - Version: - Phiên bản: - - - Size: - Kích thước: - - - Select Cheat File: - Chọn tệp Cheat: - - - Repository: - Kho lưu trữ: - - - Download Cheats - Tải xuống Cheat - - - Delete File - Xóa tệp - - - No files selected. - Không có tệp nào được chọn. - - - You can delete the cheats you don't want after downloading them. - Bạn có thể xóa các cheat không muốn sau khi tải xuống. - - - Do you want to delete the selected file?\n%1 - Bạn có muốn xóa tệp đã chọn?\n%1 - - - Select Patch File: - Chọn tệp Bản vá: - - - Download Patches - Tải xuống Bản vá - - - Save - Lưu - - - Cheats - Cheat - - - Patches - Bản vá - - - Error - Lỗi - - - No patch selected. - Không có bản vá nào được chọn. - - - Unable to open files.json for reading. - Không thể mở files.json để đọc. - - - No patch file found for the current serial. - Không tìm thấy tệp bản vá cho số seri hiện tại. - - - Unable to open the file for reading. - Không thể mở tệp để đọc. - - - Unable to open the file for writing. - Không thể mở tệp để ghi. - - - Failed to parse XML: - Không thể phân tích XML: - - - Success - Thành công - - - Options saved successfully. - Các tùy chọn đã được lưu thành công. - - - Invalid Source - Nguồn không hợp lệ - - - The selected source is invalid. - Nguồn đã chọn không hợp lệ. - - - File Exists - Tệp đã tồn tại - - - File already exists. Do you want to replace it? - Tệp đã tồn tại. Bạn có muốn thay thế nó không? - - - Failed to save file: - Không thể lưu tệp: - - - Failed to download file: - Không thể tải xuống tệp: - - - Cheats Not Found - Không tìm thấy Cheat - - - CheatsNotFound_MSG - Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. - - - Cheats Downloaded Successfully - Cheat đã tải xuống thành công - - - CheatsDownloadedSuccessfully_MSG - Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. - - - Failed to save: - Không thể lưu: - - - Failed to download: - Không thể tải xuống: - - - Download Complete - Tải xuống hoàn tất - - - DownloadComplete_MSG - Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. - - - Failed to parse JSON data from HTML. - Không thể phân tích dữ liệu JSON từ HTML. - - - Failed to retrieve HTML page. - Không thể lấy trang HTML. - - - The game is in version: %1 - Trò chơi đang ở phiên bản: %1 - - - The downloaded patch only works on version: %1 - Patch đã tải về chỉ hoạt động trên phiên bản: %1 - - - You may need to update your game. - Bạn có thể cần cập nhật trò chơi của mình. - - - Incompatibility Notice - Thông báo không tương thích - - - Failed to open file: - Không thể mở tệp: - - - XML ERROR: - LỖI XML: - - - Failed to open files.json for writing - Không thể mở files.json để ghi - - - Author: - Tác giả: - - - Directory does not exist: - Thư mục không tồn tại: - - - Failed to open files.json for reading. - Không thể mở files.json để đọc. - - - Name: - Tên: - - - Can't apply cheats before the game is started - Không thể áp dụng cheat trước khi trò chơi bắt đầu. - - - - GameListFrame - - Icon - Biểu tượng - - - Name - Tên - - - Serial - Số seri - - - Compatibility - Compatibility - - - Region - Khu vực - - - Firmware - Phần mềm - - - Size - Kích thước - - - Version - Phiên bản - - - Path - Đường dẫn - - - Play Time - Thời gian chơi - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - Nhấp để xem chi tiết trên GitHub - - - Last updated - Cập nhật lần cuối - - - - CheckUpdate - - Auto Updater - Trình cập nhật tự động - - - Error - Lỗi - - - Network error: - Lỗi mạng: - - - Error_Github_limit_MSG - Trình cập nhật tự động cho phép tối đa 60 lần kiểm tra cập nhật mỗi giờ.\nBạn đã đạt đến giới hạn này. Vui lòng thử lại sau. - - - Failed to parse update information. - Không thể phân tích thông tin cập nhật. - - - No pre-releases found. - Không tìm thấy bản phát hành trước. - - - Invalid release data. - Dữ liệu bản phát hành không hợp lệ. - - - No download URL found for the specified asset. - Không tìm thấy URL tải xuống cho tài sản đã chỉ định. - - - Your version is already up to date! - Phiên bản của bạn đã được cập nhật! - - - Update Available - Có bản cập nhật - - - Update Channel - Kênh Cập Nhật - - - Current Version - Phiên bản hiện tại - - - Latest Version - Phiên bản mới nhất - - - Do you want to update? - Bạn có muốn cập nhật không? - - - Show Changelog - Hiện nhật ký thay đổi - - - Check for Updates at Startup - Kiểm tra cập nhật khi khởi động - - - Update - Cập nhật - - - No - Không - - - Hide Changelog - Ẩn nhật ký thay đổi - - - Changes - Thay đổi - - - Network error occurred while trying to access the URL - Xảy ra lỗi mạng khi cố gắng truy cập URL - - - Download Complete - Tải xuống hoàn tất - - - The update has been downloaded, press OK to install. - Bản cập nhật đã được tải xuống, nhấn OK để cài đặt. - - - Failed to save the update file at - Không thể lưu tệp cập nhật tại - - - Starting Update... - Đang bắt đầu cập nhật... - - - Failed to create the update script file - Không thể tạo tệp kịch bản cập nhật - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Đang tải dữ liệu tương thích, vui lòng chờ - - - Cancel - Hủy bỏ - - - Loading... - Đang tải... - - - Error - Lỗi - - - Unable to update compatibility data! Try again later. - Không thể cập nhật dữ liệu tương thích! Vui lòng thử lại sau. - - - Unable to open compatibility_data.json for writing. - Không thể mở compatibility_data.json để ghi. - - - Unknown - Không xác định - - - Nothing - Không có gì - - - Boots - Giày ủng - - - Menus - Menu - - - Ingame - Trong game - - - Playable - Có thể chơi - - + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + Không có hình ảnh + + + Serial: + Số seri: + + + Version: + Phiên bản: + + + Size: + Kích thước: + + + Select Cheat File: + Chọn tệp Cheat: + + + Repository: + Kho lưu trữ: + + + Download Cheats + Tải xuống Cheat + + + Delete File + Xóa tệp + + + No files selected. + Không có tệp nào được chọn. + + + You can delete the cheats you don't want after downloading them. + Bạn có thể xóa các cheat không muốn sau khi tải xuống. + + + Do you want to delete the selected file?\n%1 + Bạn có muốn xóa tệp đã chọn?\n%1 + + + Select Patch File: + Chọn tệp Bản vá: + + + Download Patches + Tải xuống Bản vá + + + Save + Lưu + + + Cheats + Cheat + + + Patches + Bản vá + + + Error + Lỗi + + + No patch selected. + Không có bản vá nào được chọn. + + + Unable to open files.json for reading. + Không thể mở files.json để đọc. + + + No patch file found for the current serial. + Không tìm thấy tệp bản vá cho số seri hiện tại. + + + Unable to open the file for reading. + Không thể mở tệp để đọc. + + + Unable to open the file for writing. + Không thể mở tệp để ghi. + + + Failed to parse XML: + Không thể phân tích XML: + + + Success + Thành công + + + Options saved successfully. + Các tùy chọn đã được lưu thành công. + + + Invalid Source + Nguồn không hợp lệ + + + The selected source is invalid. + Nguồn đã chọn không hợp lệ. + + + File Exists + Tệp đã tồn tại + + + File already exists. Do you want to replace it? + Tệp đã tồn tại. Bạn có muốn thay thế nó không? + + + Failed to save file: + Không thể lưu tệp: + + + Failed to download file: + Không thể tải xuống tệp: + + + Cheats Not Found + Không tìm thấy Cheat + + + CheatsNotFound_MSG + Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. + + + Cheats Downloaded Successfully + Cheat đã tải xuống thành công + + + CheatsDownloadedSuccessfully_MSG + Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. + + + Failed to save: + Không thể lưu: + + + Failed to download: + Không thể tải xuống: + + + Download Complete + Tải xuống hoàn tất + + + DownloadComplete_MSG + Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. + + + Failed to parse JSON data from HTML. + Không thể phân tích dữ liệu JSON từ HTML. + + + Failed to retrieve HTML page. + Không thể lấy trang HTML. + + + The game is in version: %1 + Trò chơi đang ở phiên bản: %1 + + + The downloaded patch only works on version: %1 + Patch đã tải về chỉ hoạt động trên phiên bản: %1 + + + You may need to update your game. + Bạn có thể cần cập nhật trò chơi của mình. + + + Incompatibility Notice + Thông báo không tương thích + + + Failed to open file: + Không thể mở tệp: + + + XML ERROR: + LỖI XML: + + + Failed to open files.json for writing + Không thể mở files.json để ghi + + + Author: + Tác giả: + + + Directory does not exist: + Thư mục không tồn tại: + + + Failed to open files.json for reading. + Không thể mở files.json để đọc. + + + Name: + Tên: + + + Can't apply cheats before the game is started + Không thể áp dụng cheat trước khi trò chơi bắt đầu. + + + Close + Đóng + + + + CheckUpdate + + Auto Updater + Trình cập nhật tự động + + + Error + Lỗi + + + Network error: + Lỗi mạng: + + + Error_Github_limit_MSG + Trình cập nhật tự động cho phép tối đa 60 lần kiểm tra cập nhật mỗi giờ.\nBạn đã đạt đến giới hạn này. Vui lòng thử lại sau. + + + Failed to parse update information. + Không thể phân tích thông tin cập nhật. + + + No pre-releases found. + Không tìm thấy bản phát hành trước. + + + Invalid release data. + Dữ liệu bản phát hành không hợp lệ. + + + No download URL found for the specified asset. + Không tìm thấy URL tải xuống cho tài sản đã chỉ định. + + + Your version is already up to date! + Phiên bản của bạn đã được cập nhật! + + + Update Available + Có bản cập nhật + + + Update Channel + Kênh Cập Nhật + + + Current Version + Phiên bản hiện tại + + + Latest Version + Phiên bản mới nhất + + + Do you want to update? + Bạn có muốn cập nhật không? + + + Show Changelog + Hiện nhật ký thay đổi + + + Check for Updates at Startup + Kiểm tra cập nhật khi khởi động + + + Update + Cập nhật + + + No + Không + + + Hide Changelog + Ẩn nhật ký thay đổi + + + Changes + Thay đổi + + + Network error occurred while trying to access the URL + Xảy ra lỗi mạng khi cố gắng truy cập URL + + + Download Complete + Tải xuống hoàn tất + + + The update has been downloaded, press OK to install. + Bản cập nhật đã được tải xuống, nhấn OK để cài đặt. + + + Failed to save the update file at + Không thể lưu tệp cập nhật tại + + + Starting Update... + Đang bắt đầu cập nhật... + + + Failed to create the update script file + Không thể tạo tệp kịch bản cập nhật + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Đang tải dữ liệu tương thích, vui lòng chờ + + + Cancel + Hủy bỏ + + + Loading... + Đang tải... + + + Error + Lỗi + + + Unable to update compatibility data! Try again later. + Không thể cập nhật dữ liệu tương thích! Vui lòng thử lại sau. + + + Unable to open compatibility_data.json for writing. + Không thể mở compatibility_data.json để ghi. + + + Unknown + Không xác định + + + Nothing + Không có gì + + + Boots + Giày ủng + + + Menus + Menu + + + Ingame + Trong game + + + Playable + Có thể chơi + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + Biểu tượng + + + Name + Tên + + + Serial + Số seri + + + Compatibility + Compatibility + + + Region + Khu vực + + + Firmware + Phần mềm + + + Size + Kích thước + + + Version + Phiên bản + + + Path + Đường dẫn + + + Play Time + Thời gian chơi + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Nhấp để xem chi tiết trên GitHub + + + Last updated + Cập nhật lần cuối + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Mẹo / Bản vá + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Mở Thư Mục... + + + Open Game Folder + Mở Thư Mục Trò Chơi + + + Open Save Data Folder + Mở Thư Mục Dữ Liệu Lưu + + + Open Log Folder + Mở Thư Mục Nhật Ký + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Kiểm tra bản cập nhật + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Tải Mẹo / Bản vá + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Giúp đỡ + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Danh sách trò chơi + + + * Unsupported Vulkan Version + * Phiên bản Vulkan không được hỗ trợ + + + Download Cheats For All Installed Games + Tải xuống cheat cho tất cả các trò chơi đã cài đặt + + + Download Patches For All Games + Tải xuống bản vá cho tất cả các trò chơi + + + Download Complete + Tải xuống hoàn tất + + + You have downloaded cheats for all the games you have installed. + Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. + + + Patches Downloaded Successfully! + Bản vá đã tải xuống thành công! + + + All Patches available for all games have been downloaded. + Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. + + + Games: + Trò chơi: + + + ELF files (*.bin *.elf *.oelf) + Tệp ELF (*.bin *.elf *.oelf) + + + Game Boot + Khởi động trò chơi + + + Only one file can be selected! + Chỉ có thể chọn một tệp duy nhất! + + + PKG Extraction + Giải nén PKG + + + Patch detected! + Đã phát hiện bản vá! + + + PKG and Game versions match: + Các phiên bản PKG và trò chơi khớp nhau: + + + Would you like to overwrite? + Bạn có muốn ghi đè không? + + + PKG Version %1 is older than installed version: + Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: + + + Game is installed: + Trò chơi đã được cài đặt: + + + Would you like to install Patch: + Bạn có muốn cài đặt bản vá: + + + DLC Installation + Cài đặt DLC + + + Would you like to install DLC: %1? + Bạn có muốn cài đặt DLC: %1? + + + DLC already installed: + DLC đã được cài đặt: + + + Game already installed + Trò chơi đã được cài đặt + + + PKG ERROR + LOI PKG + + + Extracting PKG %1/%2 + Đang giải nén PKG %1/%2 + + + Extraction Finished + Giải nén hoàn tất + + + Game successfully installed at %1 + Trò chơi đã được cài đặt thành công tại %1 + + + File doesn't appear to be a valid PKG file + Tệp không có vẻ là tệp PKG hợp lệ + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + Tên + + + Serial + Số seri + + + Installed + + + + Size + Kích thước + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + Khu vực + + + Flags + + + + Path + Đường dẫn + + + File + File + + + PKG ERROR + LOI PKG + + + Unknown + Không xác định + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Chế độ Toàn màn hình + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Tab mặc định khi mở cài đặt + + + Show Game Size In List + Hiển thị Kích thước Game trong Danh sách + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Bật Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Mở vị trí nhật ký + + + Input + Đầu vào + + + Cursor + Con trỏ + + + Hide Cursor + Ẩn con trỏ + + + Hide Cursor Idle Timeout + Thời gian chờ ẩn con trỏ + + + s + s + + + Controller + Điều khiển + + + Back Button Behavior + Hành vi nút quay lại + + + Graphics + Graphics + + + GUI + Giao diện + + + User + Người dùng + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + Đường dẫn + + + Game Folders + Thư mục trò chơi + + + Add... + Thêm... + + + Remove + Xóa + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Cập nhật + + + Check for Updates at Startup + Kiểm tra cập nhật khi khởi động + + + Always Show Changelog + Luôn hiển thị nhật ký thay đổi + + + Update Channel + Kênh Cập Nhật + + + Check for Updates + Kiểm tra cập nhật + + + GUI Settings + Cài đặt GUI + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + Phát nhạc tiêu đề + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Âm lượng + + + Save + Lưu + + + Apply + Áp dụng + + + Restore Defaults + Khôi phục cài đặt mặc định + + + Close + Đóng + + + Point your mouse at an option to display its description. + Di chuyển chuột đến tùy chọn để hiển thị mô tả của nó. + + + consoleLanguageGroupBox + Ngôn ngữ console:\nChọn ngôn ngữ mà trò chơi PS4 sẽ sử dụng.\nKhuyên bạn nên đặt tùy chọn này thành một ngôn ngữ mà trò chơi hỗ trợ, có thể thay đổi tùy theo vùng. + + + emulatorLanguageGroupBox + Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. + + + fullscreenCheckBox + Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + Hiển thị màn hình khởi động:\nHiển thị màn hình khởi động của trò chơi (một hình ảnh đặc biệt) trong khi trò chơi khởi động. + + + discordRPCCheckbox + Bật Discord Rich Presence:\nHiển thị biểu tượng trình giả lập và thông tin liên quan trên hồ sơ Discord của bạn. + + + userName + Tên người dùng:\nChọn tên người dùng của tài khoản PS4, có thể được một số trò chơi hiển thị. + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + Loại nhật ký:\nChọn xem có đồng bộ hóa đầu ra cửa sổ nhật ký cho hiệu suất hay không. Điều này có thể có tác động tiêu cực đến việc giả lập. + + + logFilter + Bộ lọc nhật ký:\nLọc nhật ký để in chỉ thông tin cụ thể.\nVí dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách và ghi lại tất cả các mức sau đó. + + + updaterGroupBox + Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. + + + GUIMusicGroupBox + Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + Ẩn con trỏ:\nChọn khi nào con trỏ sẽ biến mất:\nKhông bao giờ: Bạn sẽ luôn thấy chuột.\nKhông hoạt động: Đặt một khoảng thời gian để nó biến mất sau khi không hoạt động.\nLuôn luôn: bạn sẽ không bao giờ thấy chuột. + + + idleTimeoutGroupBox + Đặt thời gian để chuột biến mất sau khi không hoạt động. + + + backButtonBehaviorGroupBox + Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm để mô phỏng việc chạm vào vị trí đã chỉ định trên touchpad của PS4. + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Không bao giờ + + + Idle + Nhàn rỗi + + + Always + Luôn luôn + + + Touchpad Left + Touchpad Trái + + + Touchpad Right + Touchpad Phải + + + Touchpad Center + Giữa Touchpad + + + None + Không có + + + graphicsAdapterGroupBox + Thiết bị đồ họa:\nTrên các hệ thống có GPU đa năng, hãy chọn GPU mà trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn "Auto Select" để tự động xác định. + + + resolutionLayout + Chiều rộng/Cao:\nChọn kích thước cửa sổ của trình giả lập khi khởi động, có thể điều chỉnh trong quá trình chơi.\nĐiều này khác với độ phân giải trong trò chơi. + + + heightDivider + Bộ chia Vblank:\nTốc độ khung hình mà trình giả lập làm mới được nhân với số này. Thay đổi này có thể có tác động tiêu cực như tăng tốc độ trò chơi hoặc làm hỏng chức năng quan trọng mà trò chơi không mong đợi thay đổi điều này! + + + dumpShadersCheckBox + Bật xuất shader:\nĐể mục đích gỡ lỗi kỹ thuật, lưu shader của trò chơi vào một thư mục khi chúng được kết xuất. + + + nullGpuCheckBox + Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, vô hiệu hóa việc kết xuất trò chơi như thể không có card đồ họa. + + + gameFoldersBox + Thư mục trò chơi:\nDanh sách các thư mục để kiểm tra các trò chơi đã cài đặt. + + + addFolderButton + Thêm:\nThêm một thư mục vào danh sách. + + + removeFolderButton + Xóa:\nXóa một thư mục khỏi danh sách. + + + debugDump + Bật xuất gỡ lỗi:\nLưu biểu tượng nhập và xuất và thông tin tiêu đề tệp cho ứng dụng PS4 hiện đang chạy vào một thư mục. + + + vkValidationCheckBox + Bật lớp xác thực Vulkan:\nKích hoạt một hệ thống xác thực trạng thái của bộ kết xuất Vulkan và ghi lại thông tin về trạng thái nội bộ của nó. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. + + + vkSyncValidationCheckBox + Bật xác thực đồng bộ Vulkan:\nKích hoạt một hệ thống xác thực thời gian của nhiệm vụ kết xuất Vulkan. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. + + + rdocCheckBox + Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 6d1f52c5d..8bc8d16a3 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1,1507 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - 关于 shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 是一款实验性质的开源 PlayStation 4 模拟器软件。 - - - This software should not be used to play games you have not legally obtained. - 本软件不得用于运行未经合法授权而获得的游戏。 - - - - ElfViewer - - Open Folder - 打开文件夹 - - - - GameInfoClass - - Loading game list, please wait :3 - 加载游戏列表中, 请稍等 :3 - - - Cancel - 取消 - - - Loading... - 加载中... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - 选择文件目录 - - - Select which directory you want to install to. - 选择您想要安装到的目录。 - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - 选择文件目录 - - - Directory to install games - 要安装游戏的目录 - - - Browse - 浏览 - - - Error - 错误 - - - The value for location to install games is not valid. - 游戏安装位置无效。 - - - - GuiContextMenus - - Create Shortcut - 创建快捷方式 - - - Cheats / Patches - 作弊码/补丁 - - - SFO Viewer - SFO 查看器 - - - Trophy Viewer - 奖杯查看器 - - - Open Folder... - 打开文件夹... - - - Open Game Folder - 打开游戏文件夹 - - - Open Save Data Folder - 打开存档数据文件夹 - - - Open Log Folder - 打开日志文件夹 - - - Copy info... - 复制信息... - - - Copy Name - 复制名称 - - - Copy Serial - 复制序列号 - - - Copy Version - 复制版本 - - - Copy Size - 复制大小 - - - Copy All - 复制全部 - - - Delete... - 删除... - - - Delete Game - 删除游戏 - - - Delete Update - 删除更新 - - - Delete DLC - 删除 DLC - - - Compatibility... - 兼容性... - - - Update database - 更新数据库 - - - View report - 查看报告 - - - Submit a report - 提交报告 - - - Shortcut creation - 创建快捷方式 - - - Shortcut created successfully! - 创建快捷方式成功! - - - Error - 错误 - - - Error creating shortcut! - 创建快捷方式出错! - - - Install PKG - 安装 PKG - - - Game - 游戏 - - - requiresEnableSeparateUpdateFolder_MSG - 这个功能需要“启用单独的更新目录”配置选项才能正常运行,如果您想要使用这个功能,请启用它。 - - - This game has no update to delete! - 这个游戏没有更新可以删除! - - - Update - 更新 - - - This game has no DLC to delete! - 这个游戏没有 DLC 可以删除! - - - DLC - DLC - - - Delete %1 - 删除 %1 - - - Are you sure you want to delete %1's %2 directory? - 您确定要删除 %1 的%2目录? - - - - MainWindow - - Open/Add Elf Folder - 打开/添加 Elf 文件夹 - - - Install Packages (PKG) - 安装 Packages (PKG) - - - Boot Game - 启动游戏 - - - Check for Updates - 检查更新 - - - About shadPS4 - 关于 shadPS4 - - - Configure... - 设置... - - - Install application from a .pkg file - 从 .pkg 文件安装应用程序 - - - Recent Games - 最近启动的游戏 - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - 退出 - - - Exit shadPS4 - 退出 shadPS4 - - - Exit the application. - 退出应用程序。 - - - Show Game List - 显示游戏列表 - - - Game List Refresh - 刷新游戏列表 - - - Tiny - 微小 - - - Small - - - - Medium - - - - Large - - - - List View - 列表视图 - - - Grid View - 表格视图 - - - Elf Viewer - Elf 查看器 - - - Game Install Directory - 游戏安装目录 - - - Download Cheats/Patches - 下载作弊码/补丁 - - - Dump Game List - 导出游戏列表 - - - PKG Viewer - PKG 查看器 - - - Search... - 搜索... - - - File - 文件 - - - View - 显示 - - - Game List Icons - 游戏列表图标 - - - Game List Mode - 游戏列表模式 - - - Settings - 设置 - - - Utils - 工具 - - - Themes - 主题 - - - Help - 帮助 - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - 工具栏 - - - Game List - 游戏列表 - - - * Unsupported Vulkan Version - * 不支持的 Vulkan 版本 - - - Download Cheats For All Installed Games - 下载所有已安装游戏的作弊码 - - - Download Patches For All Games - 下载所有游戏的补丁 - - - Download Complete - 下载完成 - - - You have downloaded cheats for all the games you have installed. - 您已下载了所有已安装游戏的作弊码。 - - - Patches Downloaded Successfully! - 补丁下载成功! - - - All Patches available for all games have been downloaded. - 所有游戏的可用补丁都已下载。 - - - Games: - 游戏: - - - PKG File (*.PKG) - PKG 文件 (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF 文件 (*.bin *.elf *.oelf) - - - Game Boot - 启动游戏 - - - Only one file can be selected! - 只能选择一个文件! - - - PKG Extraction - PKG 解压 - - - Patch detected! - 检测到补丁! - - - PKG and Game versions match: - PKG 和游戏版本匹配: - - - Would you like to overwrite? - 您想要覆盖吗? - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安装版本更旧: - - - Game is installed: - 游戏已安装: - - - Would you like to install Patch: - 您想安装补丁吗: - - - DLC Installation - DLC 安装 - - - Would you like to install DLC: %1? - 您想安装 DLC:%1 吗? - - - DLC already installed: - DLC 已经安装: - - - Game already installed - 游戏已经安装 - - - PKG is a patch, please install the game first! - PKG 是一个补丁,请先安装游戏! - - - PKG ERROR - PKG 错误 - - - Extracting PKG %1/%2 - 正在解压 PKG %1/%2 - - - Extraction Finished - 解压完成 - - - Game successfully installed at %1 - 游戏成功安装在 %1 - - - File doesn't appear to be a valid PKG file - 文件似乎不是有效的 PKG 文件 - - - - PKGViewer - - Open Folder - 打开文件夹 - - - - TrophyViewer - - Trophy Viewer - 奖杯查看器 - - - - SettingsDialog - - Settings - 设置 - - - General - 常规 - - - System - 系统 - - - Console Language - 主机语言 - - - Emulator Language - 模拟器语言 - - - Emulator - 模拟器 - - - Enable Fullscreen - 启用全屏 - - - Fullscreen Mode - 全屏模式 - - - Enable Separate Update Folder - 启用单独的更新目录 - - - Default tab when opening settings - 打开设置时的默认选项卡 - - - Show Game Size In List - 在列表中显示游戏大小 - - - Show Splash - 显示启动画面 - - - Is PS4 Pro - 模拟 PS4 Pro - - - Enable Discord Rich Presence - 启用 Discord Rich Presence - - - Username - 用户名 - - - Trophy Key - 奖杯密钥 - - - Trophy - 奖杯 - - - Logger - 日志 - - - Log Type - 日志类型 - - - Log Filter - 日志过滤 - - - Open Log Location - 打开日志位置 - - - Input - 输入 - - - Cursor - 光标 - - - Hide Cursor - 隐藏光标 - - - Hide Cursor Idle Timeout - 光标隐藏闲置时长 - - - s - - - - Controller - 手柄 - - - Back Button Behavior - 返回按钮行为 - - - Graphics - 图像 - - - GUI - 界面 - - - User - 用户 - - - Graphics Device - 图形设备 - - - Width - 宽度 - - - Height - 高度 - - - Vblank Divider - Vblank Divider - - - Advanced - 高级 - - - Enable Shaders Dumping - 启用着色器转储 - - - Enable NULL GPU - 启用 NULL GPU - - - Paths - 路径 - - - Game Folders - 游戏文件夹 - - - Add... - 添加... - - - Remove - 删除 - - - Debug - 调试 - - - Enable Debug Dumping - 启用调试转储 - - - Enable Vulkan Validation Layers - 启用 Vulkan 验证层 - - - Enable Vulkan Synchronization Validation - 启用 Vulkan 同步验证 - - - Enable RenderDoc Debugging - 启用 RenderDoc 调试 - - - Enable Crash Diagnostics - 启用崩溃诊断 - - - Collect Shaders - 收集着色器 - - - Copy GPU Buffers - 复制 GPU 缓冲区 - - - Host Debug Markers - Host 调试标记 - - - Guest Debug Markers - Geust 调试标记 - - - Update - 更新 - - - Check for Updates at Startup - 启动时检查更新 - - - Always Show Changelog - 始终显示变更日志 - - - Update Channel - 更新频道 - - - Check for Updates - 检查更新 - - - GUI Settings - 界面设置 - - - Title Music - 标题音乐 - - - Disable Trophy Pop-ups - 禁止弹出奖杯 - - - Background Image - 背景图片 - - - Show Background Image - 显示背景图片 - - - Opacity - 可见度 - - - Play title music - 播放标题音乐 - - - Update Compatibility Database On Startup - 启动时更新兼容性数据库 - - - Game Compatibility - 游戏兼容性 - - - Display Compatibility Data - 显示兼容性数据 - - - Update Compatibility Database - 更新兼容性数据库 - - - Volume - 音量 - - - Audio Backend - 音频后端 - - - Save - 保存 - - - Apply - 应用 - - - Restore Defaults - 恢复默认 - - - Close - 关闭 - - - Point your mouse at an option to display its description. - 将鼠标指针指向选项以显示其描述。 - - - consoleLanguageGroupBox - 主机语言:\n设置 PS4 游戏中使用的语言。\n建议设置为支持的语言,这将因地区而异。 - - - emulatorLanguageGroupBox - 模拟器语言:\n设置模拟器用户界面的语言。 - - - fullscreenCheckBox - 启用全屏:\n以全屏模式启动游戏。\n您可以按 F11 键切换回窗口模式。 - - - separateUpdatesCheckBox - 启用单独的更新目录:\n启用安装游戏更新到一个单独的目录中以更便于管理。 - - - showSplashCheckBox - 显示启动画面:\n在游戏启动时显示游戏的启动画面(特殊图像)。 - - - ps4proCheckBox - 模拟 PS4 Pro:\n使模拟器作为 PS4 Pro 运行,可以在支持的游戏中激活特殊功能。 - - - discordRPCCheckbox - 启用 Discord Rich Presence:\n在您的 Discord 个人资料上显示模拟器图标和相关信息。 - - - userName - 用户名:\n设置 PS4 帐户的用户名,某些游戏中可能会显示此名称。 - - - TrophyKey - 奖杯密钥:\n用于解密奖杯的密钥。必须从您的越狱主机中获得。\n仅包含十六进制字符。 - - - logTypeGroupBox - 日志类型:\n设置日志窗口输出的同步方式以提高性能。可能会对模拟产生不良影响。 - - - logFilter - 日志过滤器:\n过滤日志,仅打印特定信息。\n例如:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - 按此顺序,特定级别将静默列表中所有先前的级别,并记录所有后续级别。 - - - updaterGroupBox - 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 - - - GUIBackgroundImageGroupBox - 背景图片:\n控制游戏背景图片的可见度。 - - - GUIMusicGroupBox - 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 - - - disableTrophycheckBox - 禁止弹出奖杯:\n禁用游戏内奖杯通知。可以在奖杯查看器中继续跟踪奖杯进度(在主窗口中右键点击游戏)。 - - - hideCursorGroupBox - 隐藏光标:\n选择光标何时消失:\n从不: 从不隐藏光标。\n闲置:光标在闲置若干秒后消失。\n始终:始终隐藏光标。 - - - idleTimeoutGroupBox - 光标隐藏闲置时长:\n光标自动隐藏之前的闲置时长。 - - - backButtonBehaviorGroupBox - 返回按钮行为:\n设置手柄的返回按钮模拟在 PS4 触控板上指定位置的点击。 - - - enableCompatibilityCheckBox - 显示兼容性数据:\n在列表视图中显示游戏兼容性信息。启用“启动时更新兼容性数据库”以获取最新信息。 - - - checkCompatibilityOnStartupCheckBox - 启动时更新兼容性数据库:\n当 shadPS4 启动时自动更新兼容性数据库。 - - - updateCompatibilityButton - 更新兼容性数据库:\n立即更新兼容性数据库。 - - - Never - 从不 - - - Idle - 闲置 - - - Always - 始终 - - - Touchpad Left - 触控板左侧 - - - Touchpad Right - 触控板右侧 - - - Touchpad Center - 触控板中间 - - - None - - - - graphicsAdapterGroupBox - 图形设备:\n在具有多个 GPU 的系统中,从下拉列表中选择要使用的 GPU,\n或者选择“自动选择”由模拟器决定。 - - - resolutionLayout - 宽度/高度:\n设置启动游戏时的窗口大小,游戏过程中可以调整。\n这与游戏内的分辨率不同。 - - - heightDivider - Vblank Divider:\n模拟器刷新的帧率会乘以此数字。改变此项可能会导致游戏速度加快,或破坏游戏中不期望此变化的关键功能! - - - dumpShadersCheckBox - 启用着色器转储:\n用于技术调试,在渲染期间将游戏着色器保存到文件夹中。 - - - nullGpuCheckBox - 启用 NULL GPU:\n用于技术调试,禁用游戏渲染,就像没有显卡一样。 - - - gameFoldersBox - 游戏文件夹:\n检查已安装游戏的文件夹列表。 - - - addFolderButton - 添加:\n将文件夹添加到列表。 - - - removeFolderButton - 移除:\n从列表中移除文件夹。 - - - debugDump - 启用调试转储:\n将当前正在运行的 PS4 程序的导入和导出符号及文件头信息保存到目录中。 - - - vkValidationCheckBox - 启用 Vulkan 验证层:\n启用一个系统来验证 Vulkan 渲染器的状态并记录其内部状态的信息。\n这将降低性能并可能改变模拟的行为。 - - - vkSyncValidationCheckBox - 启用 Vulkan 同步验证:\n启用一个系统来验证 Vulkan 渲染任务的时间。\n这将降低性能并可能改变模拟的行为。 - - - rdocCheckBox - 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 - - - collectShaderCheckBox - 收集着色器:\n您需要启用此功能才能使用调试菜单(Ctrl + F10)编辑着色器。 - - - crashDiagnosticsCheckBox - 崩溃诊断:\n创建一个包含崩溃时 Vulkan 状态的 .yaml 文件。\n对于调试“Device lost”错误很有用。如果您启用了此功能,您应该同时启用 Host 和 Guest 调试标记。\n此功能在 Intel 显卡上不可用。\n您需要启用 Vulkan 验证层并安装 Vulkan SDK 才能使用此功能。 - - - copyGPUBuffersCheckBox - 复制 GPU 缓冲区:\n绕过涉及 GPU 提交的竞态条件。\n对于 PM4 type 0 崩溃可能有帮助,也可能没有帮助。 - - - hostMarkersCheckBox - Host 调试标记:\n在 Vulkan 命令周围插入模拟器端信息,如特定 AMD GPU 命令的标记,以及为资源提供调试名称。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 - - - guestMarkersCheckBox - Guest 调试标记:\n在命令缓冲区中插入游戏本身添加的任何调试标记。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 - - - saveDataBox - 存档数据路径:\n保存游戏存档数据的目录。 - - - browseButton - 浏览:\n选择一个目录保存游戏存档数据。 - - - - CheatsPatches - - Cheats / Patches for - 作弊码/补丁: - - - defaultTextEdit_MSG - 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - 没有可用的图片 - - - Serial: - 序列号: - - - Version: - 版本: - - - Size: - 大小: - - - Select Cheat File: - 选择作弊码文件: - - - Repository: - 存储库: - - - Download Cheats - 下载作弊码 - - - Delete File - 删除文件 - - - No files selected. - 没有选择文件。 - - - You can delete the cheats you don't want after downloading them. - 您可以在下载后删除不想要的作弊码。 - - - Do you want to delete the selected file?\n%1 - 您要删除选中的文件吗?\n%1 - - - Select Patch File: - 选择补丁文件: - - - Download Patches - 下载补丁 - - - Save - 保存 - - - Cheats - 作弊码 - - - Patches - 补丁 - - - Error - 错误 - - - No patch selected. - 没有选择补丁。 - - - Unable to open files.json for reading. - 无法打开 files.json 进行读取。 - - - No patch file found for the current serial. - 未找到当前序列号的补丁文件。 - - - Unable to open the file for reading. - 无法打开文件进行读取。 - - - Unable to open the file for writing. - 无法打开文件进行写入。 - - - Failed to parse XML: - 解析 XML 失败: - - - Success - 成功 - - - Options saved successfully. - 选项已成功保存。 - - - Invalid Source - 无效的来源 - - - The selected source is invalid. - 选择的来源无效。 - - - File Exists - 文件已存在 - - - File already exists. Do you want to replace it? - 文件已存在,您要替换它吗? - - - Failed to save file: - 保存文件失败: - - - Failed to download file: - 下载文件失败: - - - Cheats Not Found - 未找到作弊码 - - - CheatsNotFound_MSG - 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 - - - Cheats Downloaded Successfully - 作弊码下载成功 - - - CheatsDownloadedSuccessfully_MSG - 您已从所选存储库中成功下载了该游戏版本的作弊码。您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 - - - Failed to save: - 保存失败: - - - Failed to download: - 下载失败: - - - Download Complete - 下载完成 - - - DownloadComplete_MSG - 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不适用于当前游戏的序列号和版本。 - - - Failed to parse JSON data from HTML. - 无法解析 HTML 中的 JSON 数据。 - - - Failed to retrieve HTML page. - 无法获取 HTML 页面。 - - - The game is in version: %1 - 游戏版本:%1 - - - The downloaded patch only works on version: %1 - 下载的补丁仅适用于版本:%1 - - - You may need to update your game. - 您可能需要更新您的游戏。 - - - Incompatibility Notice - 不兼容通知 - - - Failed to open file: - 无法打开文件: - - - XML ERROR: - XML 错误: - - - Failed to open files.json for writing - 无法打开 files.json 进行写入 - - - Author: - 作者: - - - Directory does not exist: - 目录不存在: - - - Failed to open files.json for reading. - 无法打开 files.json 进行读取。 - - - Name: - 名称: - - - Can't apply cheats before the game is started - 在游戏启动之前无法应用作弊码。 - - - - GameListFrame - - Icon - 图标 - - - Name - 名称 - - - Serial - 序列号 - - - Compatibility - 兼容性 - - - Region - 区域 - - - Firmware - 固件 - - - Size - 大小 - - - Version - 版本 - - - Path - 路径 - - - Play Time - 游戏时间 - - - Never Played - 未玩过 - - - h - 小时 - - - m - 分钟 - - - s - - - - Compatibility is untested - 兼容性未经测试 - - - Game does not initialize properly / crashes the emulator - 游戏无法正确初始化/模拟器崩溃 - - - Game boots, but only displays a blank screen - 游戏启动,但只显示白屏 - - - Game displays an image but does not go past the menu - 游戏显示图像但无法通过菜单页面 - - - Game has game-breaking glitches or unplayable performance - 游戏有严重的 Bug 或太卡无法游玩 - - - Game can be completed with playable performance and no major glitches - 游戏能在可玩的性能下通关且没有重大 Bug - - - Click to see details on github - 点击查看 GitHub 上的详细信息 - - - Last updated - 最后更新 - - - - CheckUpdate - - Auto Updater - 自动更新程序 - - - Error - 错误 - - - Network error: - 网络错误: - - - Error_Github_limit_MSG - 自动更新程序每小时最多允许 60 次更新检查。\n您已达到此限制。请稍后再试。 - - - Failed to parse update information. - 无法解析更新信息。 - - - No pre-releases found. - 未找到预发布版本。 - - - Invalid release data. - 无效的发布数据。 - - - No download URL found for the specified asset. - 未找到指定资源的下载地址。 - - - Your version is already up to date! - 您的版本已经是最新的! - - - Update Available - 可用更新 - - - Update Channel - 更新频道 - - - Current Version - 当前版本 - - - Latest Version - 最新版本 - - - Do you want to update? - 您想要更新吗? - - - Show Changelog - 显示更新日志 - - - Check for Updates at Startup - 启动时检查更新 - - - Update - 更新 - - - No - - - - Hide Changelog - 隐藏更新日志 - - - Changes - 更新日志 - - - Network error occurred while trying to access the URL - 尝试访问网址时发生网络错误 - - - Download Complete - 下载完成 - - - The update has been downloaded, press OK to install. - 更新已下载,请按 OK 安装。 - - - Failed to save the update file at - 无法保存更新文件到 - - - Starting Update... - 正在开始更新... - - - Failed to create the update script file - 无法创建更新脚本文件 - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - 正在获取兼容性数据,请稍等 - - - Cancel - 取消 - - - Loading... - 加载中... - - - Error - 错误 - - - Unable to update compatibility data! Try again later. - 无法更新兼容性数据!稍后再试。 - - - Unable to open compatibility_data.json for writing. - 无法打开 compatibility_data.json 进行写入。 - - - Unknown - 未知 - - - Nothing - 无法启动 - - - Boots - 可启动 - - - Menus - 可进入菜单 - - - Ingame - 可进入游戏内 - - - Playable - 可通关 - - + + AboutDialog + + About shadPS4 + 关于 shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 是一款实验性质的开源 PlayStation 4 模拟器软件。 + + + This software should not be used to play games you have not legally obtained. + 本软件不得用于运行未经合法授权而获得的游戏。 + + + + CheatsPatches + + Cheats / Patches for + 作弊码/补丁: + + + defaultTextEdit_MSG + 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + 没有可用的图片 + + + Serial: + 序列号: + + + Version: + 版本: + + + Size: + 大小: + + + Select Cheat File: + 选择作弊码文件: + + + Repository: + 存储库: + + + Download Cheats + 下载作弊码 + + + Delete File + 删除文件 + + + No files selected. + 没有选择文件。 + + + You can delete the cheats you don't want after downloading them. + 您可以在下载后删除不想要的作弊码。 + + + Do you want to delete the selected file?\n%1 + 您要删除选中的文件吗?\n%1 + + + Select Patch File: + 选择补丁文件: + + + Download Patches + 下载补丁 + + + Save + 保存 + + + Cheats + 作弊码 + + + Patches + 补丁 + + + Error + 错误 + + + No patch selected. + 没有选择补丁。 + + + Unable to open files.json for reading. + 无法打开 files.json 进行读取。 + + + No patch file found for the current serial. + 未找到当前序列号的补丁文件。 + + + Unable to open the file for reading. + 无法打开文件进行读取。 + + + Unable to open the file for writing. + 无法打开文件进行写入。 + + + Failed to parse XML: + 解析 XML 失败: + + + Success + 成功 + + + Options saved successfully. + 选项已成功保存。 + + + Invalid Source + 无效的来源 + + + The selected source is invalid. + 选择的来源无效。 + + + File Exists + 文件已存在 + + + File already exists. Do you want to replace it? + 文件已存在,您要替换它吗? + + + Failed to save file: + 保存文件失败: + + + Failed to download file: + 下载文件失败: + + + Cheats Not Found + 未找到作弊码 + + + CheatsNotFound_MSG + 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 + + + Cheats Downloaded Successfully + 作弊码下载成功 + + + CheatsDownloadedSuccessfully_MSG + 您已从所选存储库中成功下载了该游戏版本的作弊码。您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 + + + Failed to save: + 保存失败: + + + Failed to download: + 下载失败: + + + Download Complete + 下载完成 + + + DownloadComplete_MSG + 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不适用于当前游戏的序列号和版本。 + + + Failed to parse JSON data from HTML. + 无法解析 HTML 中的 JSON 数据。 + + + Failed to retrieve HTML page. + 无法获取 HTML 页面。 + + + The game is in version: %1 + 游戏版本:%1 + + + The downloaded patch only works on version: %1 + 下载的补丁仅适用于版本:%1 + + + You may need to update your game. + 您可能需要更新您的游戏。 + + + Incompatibility Notice + 不兼容通知 + + + Failed to open file: + 无法打开文件: + + + XML ERROR: + XML 错误: + + + Failed to open files.json for writing + 无法打开 files.json 进行写入 + + + Author: + 作者: + + + Directory does not exist: + 目录不存在: + + + Failed to open files.json for reading. + 无法打开 files.json 进行读取。 + + + Name: + 名称: + + + Can't apply cheats before the game is started + 在游戏启动之前无法应用作弊码。 + + + Close + 关闭 + + + + CheckUpdate + + Auto Updater + 自动更新程序 + + + Error + 错误 + + + Network error: + 网络错误: + + + Error_Github_limit_MSG + 自动更新程序每小时最多允许 60 次更新检查。\n您已达到此限制。请稍后再试。 + + + Failed to parse update information. + 无法解析更新信息。 + + + No pre-releases found. + 未找到预发布版本。 + + + Invalid release data. + 无效的发布数据。 + + + No download URL found for the specified asset. + 未找到指定资源的下载地址。 + + + Your version is already up to date! + 您的版本已经是最新的! + + + Update Available + 可用更新 + + + Update Channel + 更新频道 + + + Current Version + 当前版本 + + + Latest Version + 最新版本 + + + Do you want to update? + 您想要更新吗? + + + Show Changelog + 显示更新日志 + + + Check for Updates at Startup + 启动时检查更新 + + + Update + 更新 + + + No + + + + Hide Changelog + 隐藏更新日志 + + + Changes + 更新日志 + + + Network error occurred while trying to access the URL + 尝试访问网址时发生网络错误 + + + Download Complete + 下载完成 + + + The update has been downloaded, press OK to install. + 更新已下载,请按 OK 安装。 + + + Failed to save the update file at + 无法保存更新文件到 + + + Starting Update... + 正在开始更新... + + + Failed to create the update script file + 无法创建更新脚本文件 + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 正在获取兼容性数据,请稍等 + + + Cancel + 取消 + + + Loading... + 加载中... + + + Error + 错误 + + + Unable to update compatibility data! Try again later. + 无法更新兼容性数据!稍后再试。 + + + Unable to open compatibility_data.json for writing. + 无法打开 compatibility_data.json 进行写入。 + + + Unknown + 未知 + + + Nothing + 无法启动 + + + Boots + 可启动 + + + Menus + 可进入菜单 + + + Ingame + 可进入游戏内 + + + Playable + 可通关 + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + 打开文件夹 + + + + GameInfoClass + + Loading game list, please wait :3 + 加载游戏列表中, 请稍等 :3 + + + Cancel + 取消 + + + Loading... + 加载中... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - 选择文件目录 + + + Directory to install games + 要安装游戏的目录 + + + Browse + 浏览 + + + Error + 错误 + + + Directory to install DLC + + + + + GameListFrame + + Icon + 图标 + + + Name + 名称 + + + Serial + 序列号 + + + Compatibility + 兼容性 + + + Region + 区域 + + + Firmware + 固件 + + + Size + 大小 + + + Version + 版本 + + + Path + 路径 + + + Play Time + 游戏时间 + + + Never Played + 未玩过 + + + h + 小时 + + + m + 分钟 + + + s + + + + Compatibility is untested + 兼容性未经测试 + + + Game does not initialize properly / crashes the emulator + 游戏无法正确初始化/模拟器崩溃 + + + Game boots, but only displays a blank screen + 游戏启动,但只显示白屏 + + + Game displays an image but does not go past the menu + 游戏显示图像但无法通过菜单页面 + + + Game has game-breaking glitches or unplayable performance + 游戏有严重的 Bug 或太卡无法游玩 + + + Game can be completed with playable performance and no major glitches + 游戏能在可玩的性能下通关且没有重大 Bug + + + Click to see details on github + 点击查看 GitHub 上的详细信息 + + + Last updated + 最后更新 + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + 创建快捷方式 + + + Cheats / Patches + 作弊码/补丁 + + + SFO Viewer + SFO 查看器 + + + Trophy Viewer + 奖杯查看器 + + + Open Folder... + 打开文件夹... + + + Open Game Folder + 打开游戏文件夹 + + + Open Save Data Folder + 打开存档数据文件夹 + + + Open Log Folder + 打开日志文件夹 + + + Copy info... + 复制信息... + + + Copy Name + 复制名称 + + + Copy Serial + 复制序列号 + + + Copy Version + 复制版本 + + + Copy Size + 复制大小 + + + Copy All + 复制全部 + + + Delete... + 删除... + + + Delete Game + 删除游戏 + + + Delete Update + 删除更新 + + + Delete DLC + 删除 DLC + + + Compatibility... + 兼容性... + + + Update database + 更新数据库 + + + View report + 查看报告 + + + Submit a report + 提交报告 + + + Shortcut creation + 创建快捷方式 + + + Shortcut created successfully! + 创建快捷方式成功! + + + Error + 错误 + + + Error creating shortcut! + 创建快捷方式出错! + + + Install PKG + 安装 PKG + + + Game + 游戏 + + + This game has no update to delete! + 这个游戏没有更新可以删除! + + + Update + 更新 + + + This game has no DLC to delete! + 这个游戏没有 DLC 可以删除! + + + DLC + DLC + + + Delete %1 + 删除 %1 + + + Are you sure you want to delete %1's %2 directory? + 您确定要删除 %1 的%2目录? + + + Open Update Folder + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - 选择文件目录 + + + Select which directory you want to install to. + 选择您想要安装到的目录。 + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + 打开/添加 Elf 文件夹 + + + Install Packages (PKG) + 安装 Packages (PKG) + + + Boot Game + 启动游戏 + + + Check for Updates + 检查更新 + + + About shadPS4 + 关于 shadPS4 + + + Configure... + 设置... + + + Install application from a .pkg file + 从 .pkg 文件安装应用程序 + + + Recent Games + 最近启动的游戏 + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + 退出 + + + Exit shadPS4 + 退出 shadPS4 + + + Exit the application. + 退出应用程序。 + + + Show Game List + 显示游戏列表 + + + Game List Refresh + 刷新游戏列表 + + + Tiny + 微小 + + + Small + + + + Medium + + + + Large + + + + List View + 列表视图 + + + Grid View + 表格视图 + + + Elf Viewer + Elf 查看器 + + + Game Install Directory + 游戏安装目录 + + + Download Cheats/Patches + 下载作弊码/补丁 + + + Dump Game List + 导出游戏列表 + + + PKG Viewer + PKG 查看器 + + + Search... + 搜索... + + + File + 文件 + + + View + 显示 + + + Game List Icons + 游戏列表图标 + + + Game List Mode + 游戏列表模式 + + + Settings + 设置 + + + Utils + 工具 + + + Themes + 主题 + + + Help + 帮助 + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + 工具栏 + + + Game List + 游戏列表 + + + * Unsupported Vulkan Version + * 不支持的 Vulkan 版本 + + + Download Cheats For All Installed Games + 下载所有已安装游戏的作弊码 + + + Download Patches For All Games + 下载所有游戏的补丁 + + + Download Complete + 下载完成 + + + You have downloaded cheats for all the games you have installed. + 您已下载了所有已安装游戏的作弊码。 + + + Patches Downloaded Successfully! + 补丁下载成功! + + + All Patches available for all games have been downloaded. + 所有游戏的可用补丁都已下载。 + + + Games: + 游戏: + + + ELF files (*.bin *.elf *.oelf) + ELF 文件 (*.bin *.elf *.oelf) + + + Game Boot + 启动游戏 + + + Only one file can be selected! + 只能选择一个文件! + + + PKG Extraction + PKG 解压 + + + Patch detected! + 检测到补丁! + + + PKG and Game versions match: + PKG 和游戏版本匹配: + + + Would you like to overwrite? + 您想要覆盖吗? + + + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安装版本更旧: + + + Game is installed: + 游戏已安装: + + + Would you like to install Patch: + 您想安装补丁吗: + + + DLC Installation + DLC 安装 + + + Would you like to install DLC: %1? + 您想安装 DLC:%1 吗? + + + DLC already installed: + DLC 已经安装: + + + Game already installed + 游戏已经安装 + + + PKG ERROR + PKG 错误 + + + Extracting PKG %1/%2 + 正在解压 PKG %1/%2 + + + Extraction Finished + 解压完成 + + + Game successfully installed at %1 + 游戏成功安装在 %1 + + + File doesn't appear to be a valid PKG file + 文件似乎不是有效的 PKG 文件 + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + 打开文件夹 + + + Name + 名称 + + + Serial + 序列号 + + + Installed + + + + Size + 大小 + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + 区域 + + + Flags + + + + Path + 路径 + + + File + 文件 + + + PKG ERROR + PKG 错误 + + + Unknown + 未知 + + + Package + + + + + SettingsDialog + + Settings + 设置 + + + General + 常规 + + + System + 系统 + + + Console Language + 主机语言 + + + Emulator Language + 模拟器语言 + + + Emulator + 模拟器 + + + Enable Fullscreen + 启用全屏 + + + Fullscreen Mode + 全屏模式 + + + Enable Separate Update Folder + 启用单独的更新目录 + + + Default tab when opening settings + 打开设置时的默认选项卡 + + + Show Game Size In List + 在列表中显示游戏大小 + + + Show Splash + 显示启动画面 + + + Enable Discord Rich Presence + 启用 Discord Rich Presence + + + Username + 用户名 + + + Trophy Key + 奖杯密钥 + + + Trophy + 奖杯 + + + Logger + 日志 + + + Log Type + 日志类型 + + + Log Filter + 日志过滤 + + + Open Log Location + 打开日志位置 + + + Input + 输入 + + + Cursor + 光标 + + + Hide Cursor + 隐藏光标 + + + Hide Cursor Idle Timeout + 光标隐藏闲置时长 + + + s + + + + Controller + 手柄 + + + Back Button Behavior + 返回按钮行为 + + + Graphics + 图像 + + + GUI + 界面 + + + User + 用户 + + + Graphics Device + 图形设备 + + + Width + 宽度 + + + Height + 高度 + + + Vblank Divider + Vblank Divider + + + Advanced + 高级 + + + Enable Shaders Dumping + 启用着色器转储 + + + Enable NULL GPU + 启用 NULL GPU + + + Paths + 路径 + + + Game Folders + 游戏文件夹 + + + Add... + 添加... + + + Remove + 删除 + + + Debug + 调试 + + + Enable Debug Dumping + 启用调试转储 + + + Enable Vulkan Validation Layers + 启用 Vulkan 验证层 + + + Enable Vulkan Synchronization Validation + 启用 Vulkan 同步验证 + + + Enable RenderDoc Debugging + 启用 RenderDoc 调试 + + + Enable Crash Diagnostics + 启用崩溃诊断 + + + Collect Shaders + 收集着色器 + + + Copy GPU Buffers + 复制 GPU 缓冲区 + + + Host Debug Markers + Host 调试标记 + + + Guest Debug Markers + Geust 调试标记 + + + Update + 更新 + + + Check for Updates at Startup + 启动时检查更新 + + + Always Show Changelog + 始终显示变更日志 + + + Update Channel + 更新频道 + + + Check for Updates + 检查更新 + + + GUI Settings + 界面设置 + + + Title Music + 标题音乐 + + + Disable Trophy Pop-ups + 禁止弹出奖杯 + + + Background Image + 背景图片 + + + Show Background Image + 显示背景图片 + + + Opacity + 可见度 + + + Play title music + 播放标题音乐 + + + Update Compatibility Database On Startup + 启动时更新兼容性数据库 + + + Game Compatibility + 游戏兼容性 + + + Display Compatibility Data + 显示兼容性数据 + + + Update Compatibility Database + 更新兼容性数据库 + + + Volume + 音量 + + + Save + 保存 + + + Apply + 应用 + + + Restore Defaults + 恢复默认 + + + Close + 关闭 + + + Point your mouse at an option to display its description. + 将鼠标指针指向选项以显示其描述。 + + + consoleLanguageGroupBox + 主机语言:\n设置 PS4 游戏中使用的语言。\n建议设置为支持的语言,这将因地区而异。 + + + emulatorLanguageGroupBox + 模拟器语言:\n设置模拟器用户界面的语言。 + + + fullscreenCheckBox + 启用全屏:\n以全屏模式启动游戏。\n您可以按 F11 键切换回窗口模式。 + + + separateUpdatesCheckBox + 启用单独的更新目录:\n启用安装游戏更新到一个单独的目录中以更便于管理。 + + + showSplashCheckBox + 显示启动画面:\n在游戏启动时显示游戏的启动画面(特殊图像)。 + + + discordRPCCheckbox + 启用 Discord Rich Presence:\n在您的 Discord 个人资料上显示模拟器图标和相关信息。 + + + userName + 用户名:\n设置 PS4 帐户的用户名,某些游戏中可能会显示此名称。 + + + TrophyKey + 奖杯密钥:\n用于解密奖杯的密钥。必须从您的越狱主机中获得。\n仅包含十六进制字符。 + + + logTypeGroupBox + 日志类型:\n设置日志窗口输出的同步方式以提高性能。可能会对模拟产生不良影响。 + + + logFilter + 日志过滤器:\n过滤日志,仅打印特定信息。\n例如:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - 按此顺序,特定级别将静默列表中所有先前的级别,并记录所有后续级别。 + + + updaterGroupBox + 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 + + + GUIBackgroundImageGroupBox + 背景图片:\n控制游戏背景图片的可见度。 + + + GUIMusicGroupBox + 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 + + + disableTrophycheckBox + 禁止弹出奖杯:\n禁用游戏内奖杯通知。可以在奖杯查看器中继续跟踪奖杯进度(在主窗口中右键点击游戏)。 + + + hideCursorGroupBox + 隐藏光标:\n选择光标何时消失:\n从不: 从不隐藏光标。\n闲置:光标在闲置若干秒后消失。\n始终:始终隐藏光标。 + + + idleTimeoutGroupBox + 光标隐藏闲置时长:\n光标自动隐藏之前的闲置时长。 + + + backButtonBehaviorGroupBox + 返回按钮行为:\n设置手柄的返回按钮模拟在 PS4 触控板上指定位置的点击。 + + + enableCompatibilityCheckBox + 显示兼容性数据:\n在列表视图中显示游戏兼容性信息。启用“启动时更新兼容性数据库”以获取最新信息。 + + + checkCompatibilityOnStartupCheckBox + 启动时更新兼容性数据库:\n当 shadPS4 启动时自动更新兼容性数据库。 + + + updateCompatibilityButton + 更新兼容性数据库:\n立即更新兼容性数据库。 + + + Never + 从不 + + + Idle + 闲置 + + + Always + 始终 + + + Touchpad Left + 触控板左侧 + + + Touchpad Right + 触控板右侧 + + + Touchpad Center + 触控板中间 + + + None + + + + graphicsAdapterGroupBox + 图形设备:\n在具有多个 GPU 的系统中,从下拉列表中选择要使用的 GPU,\n或者选择“自动选择”由模拟器决定。 + + + resolutionLayout + 宽度/高度:\n设置启动游戏时的窗口大小,游戏过程中可以调整。\n这与游戏内的分辨率不同。 + + + heightDivider + Vblank Divider:\n模拟器刷新的帧率会乘以此数字。改变此项可能会导致游戏速度加快,或破坏游戏中不期望此变化的关键功能! + + + dumpShadersCheckBox + 启用着色器转储:\n用于技术调试,在渲染期间将游戏着色器保存到文件夹中。 + + + nullGpuCheckBox + 启用 NULL GPU:\n用于技术调试,禁用游戏渲染,就像没有显卡一样。 + + + gameFoldersBox + 游戏文件夹:\n检查已安装游戏的文件夹列表。 + + + addFolderButton + 添加:\n将文件夹添加到列表。 + + + removeFolderButton + 移除:\n从列表中移除文件夹。 + + + debugDump + 启用调试转储:\n将当前正在运行的 PS4 程序的导入和导出符号及文件头信息保存到目录中。 + + + vkValidationCheckBox + 启用 Vulkan 验证层:\n启用一个系统来验证 Vulkan 渲染器的状态并记录其内部状态的信息。\n这将降低性能并可能改变模拟的行为。 + + + vkSyncValidationCheckBox + 启用 Vulkan 同步验证:\n启用一个系统来验证 Vulkan 渲染任务的时间。\n这将降低性能并可能改变模拟的行为。 + + + rdocCheckBox + 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 + + + collectShaderCheckBox + 收集着色器:\n您需要启用此功能才能使用调试菜单(Ctrl + F10)编辑着色器。 + + + crashDiagnosticsCheckBox + 崩溃诊断:\n创建一个包含崩溃时 Vulkan 状态的 .yaml 文件。\n对于调试“Device lost”错误很有用。如果您启用了此功能,您应该同时启用 Host 和 Guest 调试标记。\n此功能在 Intel 显卡上不可用。\n您需要启用 Vulkan 验证层并安装 Vulkan SDK 才能使用此功能。 + + + copyGPUBuffersCheckBox + 复制 GPU 缓冲区:\n绕过涉及 GPU 提交的竞态条件。\n对于 PM4 type 0 崩溃可能有帮助,也可能没有帮助。 + + + hostMarkersCheckBox + Host 调试标记:\n在 Vulkan 命令周围插入模拟器端信息,如特定 AMD GPU 命令的标记,以及为资源提供调试名称。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 + + + guestMarkersCheckBox + Guest 调试标记:\n在命令缓冲区中插入游戏本身添加的任何调试标记。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 + + + saveDataBox + 存档数据路径:\n保存游戏存档数据的目录。 + + + browseButton + 浏览:\n选择一个目录保存游戏存档数据。 + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + 浏览 + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + 要安装游戏的目录 + + + Directory to save data + + + + enableHDRCheckBox + + + + + TrophyViewer + + Trophy Viewer + 奖杯查看器 + + diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index a3a574ea5..c54eee4c0 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1,1475 +1,1790 @@ + - - - AboutDialog - - About shadPS4 - About shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. - - - - ElfViewer - - Open Folder - Open Folder - - - - GameInfoClass - - Loading game list, please wait :3 - Loading game list, please wait :3 - - - Cancel - Cancel - - - Loading... - Loading... - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Directory to install games - Directory to install games - - - Browse - Browse - - - Error - Error - - - The value for location to install games is not valid. - The value for location to install games is not valid. - - - - GuiContextMenus - - Create Shortcut - Create Shortcut - - - Cheats / Patches - Zuòbì / Xiūbǔ chéngshì - - - SFO Viewer - SFO Viewer - - - Trophy Viewer - Trophy Viewer - - - Open Folder... - 打開資料夾... - - - Open Game Folder - 打開遊戲資料夾 - - - Open Save Data Folder - 打開存檔資料夾 - - - Open Log Folder - 打開日誌資料夾 - - - Copy info... - Copy info... - - - Copy Name - Copy Name - - - Copy Serial - Copy Serial - - - Copy All - Copy All - - - Delete... - Delete... - - - Delete Game - Delete Game - - - Delete Update - Delete Update - - - Delete DLC - Delete DLC - - - Compatibility... - Compatibility... - - - Update database - Update database - - - View report - View report - - - Submit a report - Submit a report - - - Shortcut creation - Shortcut creation - - - Shortcut created successfully! - Shortcut created successfully! - - - Error - Error - - - Error creating shortcut! - Error creating shortcut! - - - Install PKG - Install PKG - - - Game - Game - - - requiresEnableSeparateUpdateFolder_MSG - This feature requires the 'Enable Separate Update Folder' config option to work. If you want to use this feature, please enable it. - - - This game has no update to delete! - This game has no update to delete! - - - Update - Update - - - This game has no DLC to delete! - This game has no DLC to delete! - - - DLC - DLC - - - Delete %1 - Delete %1 - - - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? - - - - MainWindow - - Open/Add Elf Folder - Open/Add Elf Folder - - - Install Packages (PKG) - Install Packages (PKG) - - - Boot Game - Boot Game - - - Check for Updates - 檢查更新 - - - About shadPS4 - About shadPS4 - - - Configure... - Configure... - - - Install application from a .pkg file - Install application from a .pkg file - - - Recent Games - Recent Games - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Exit - - - Exit shadPS4 - Exit shadPS4 - - - Exit the application. - Exit the application. - - - Show Game List - Show Game List - - - Game List Refresh - Game List Refresh - - - Tiny - Tiny - - - Small - Small - - - Medium - Medium - - - Large - Large - - - List View - List View - - - Grid View - Grid View - - - Elf Viewer - Elf Viewer - - - Game Install Directory - Game Install Directory - - - Download Cheats/Patches - Xiàzài Zuòbì / Xiūbǔ chéngshì - - - Dump Game List - Dump Game List - - - PKG Viewer - PKG Viewer - - - Search... - Search... - - - File - File - - - View - View - - - Game List Icons - Game List Icons - - - Game List Mode - Game List Mode - - - Settings - Settings - - - Utils - Utils - - - Themes - Themes - - - Help - 幫助 - - - Dark - Dark - - - Light - Light - - - Green - Green - - - Blue - Blue - - - Violet - Violet - - - toolBar - toolBar - - - Game List - 遊戲列表 - - - * Unsupported Vulkan Version - * 不支援的 Vulkan 版本 - - - Download Cheats For All Installed Games - 下載所有已安裝遊戲的作弊碼 - - - Download Patches For All Games - 下載所有遊戲的修補檔 - - - Download Complete - 下載完成 - - - You have downloaded cheats for all the games you have installed. - 您已經下載了所有已安裝遊戲的作弊碼。 - - - Patches Downloaded Successfully! - 修補檔下載成功! - - - All Patches available for all games have been downloaded. - 所有遊戲的修補檔已經下載完成。 - - - Games: - 遊戲: - - - PKG File (*.PKG) - PKG 檔案 (*.PKG) - - - ELF files (*.bin *.elf *.oelf) - ELF 檔案 (*.bin *.elf *.oelf) - - - Game Boot - 遊戲啟動 - - - Only one file can be selected! - 只能選擇一個檔案! - - - PKG Extraction - PKG 解壓縮 - - - Patch detected! - 檢測到補丁! - - - PKG and Game versions match: - PKG 和遊戲版本匹配: - - - Would you like to overwrite? - 您想要覆蓋嗎? - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安裝版本更舊: - - - Game is installed: - 遊戲已安裝: - - - Would you like to install Patch: - 您想要安裝補丁嗎: - - - DLC Installation - DLC 安裝 - - - Would you like to install DLC: %1? - 您想要安裝 DLC: %1 嗎? - - - DLC already installed: - DLC 已經安裝: - - - Game already installed - 遊戲已經安裝 - - - PKG is a patch, please install the game first! - PKG 是修補檔,請先安裝遊戲! - - - PKG ERROR - PKG 錯誤 - - - Extracting PKG %1/%2 - 正在解壓縮 PKG %1/%2 - - - Extraction Finished - 解壓縮完成 - - - Game successfully installed at %1 - 遊戲成功安裝於 %1 - - - File doesn't appear to be a valid PKG file - 檔案似乎不是有效的 PKG 檔案 - - - - PKGViewer - - Open Folder - Open Folder - - - - TrophyViewer - - Trophy Viewer - Trophy Viewer - - - - SettingsDialog - - Settings - Settings - - - General - General - - - System - System - - - Console Language - Console Language - - - Emulator Language - Emulator Language - - - Emulator - Emulator - - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - 全螢幕模式 - - - Enable Separate Update Folder - Enable Separate Update Folder - - - Default tab when opening settings - 打開設置時的默認選項卡 - - - Show Game Size In List - 顯示遊戲大小在列表中 - - - Show Splash - Show Splash - - - Is PS4 Pro - Is PS4 Pro - - - Enable Discord Rich Presence - 啟用 Discord Rich Presence - - - Username - Username - - - Trophy Key - Trophy Key - - - Trophy - Trophy - - - Logger - Logger - - - Log Type - Log Type - - - Log Filter - Log Filter - - - Open Log Location - 開啟日誌位置 - - - Input - 輸入 - - - Cursor - 游標 - - - Hide Cursor - 隱藏游標 - - - Hide Cursor Idle Timeout - 游標空閒超時隱藏 - - - s - s - - - Controller - 控制器 - - - Back Button Behavior - 返回按鈕行為 - - - Graphics - Graphics - - - GUI - 介面 - - - User - 使用者 - - - Graphics Device - Graphics Device - - - Width - Width - - - Height - Height - - - Vblank Divider - Vblank Divider - - - Advanced - Advanced - - - Enable Shaders Dumping - Enable Shaders Dumping - - - Enable NULL GPU - Enable NULL GPU - - - Paths - 路徑 - - - Game Folders - 遊戲資料夾 - - - Add... - 添加... - - - Remove - 刪除 - - - Debug - Debug - - - Enable Debug Dumping - Enable Debug Dumping - - - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation - - - Enable RenderDoc Debugging - Enable RenderDoc Debugging - - - Enable Crash Diagnostics - Enable Crash Diagnostics - - - Collect Shaders - Collect Shaders - - - Copy GPU Buffers - Copy GPU Buffers - - - Host Debug Markers - Host Debug Markers - - - Guest Debug Markers - Guest Debug Markers - - - Update - 更新 - - - Check for Updates at Startup - 啟動時檢查更新 - - - Always Show Changelog - 始終顯示變更紀錄 - - - Update Channel - 更新頻道 - - - Check for Updates - 檢查更新 - - - GUI Settings - 介面設置 - - - Title Music - Title Music - - - Disable Trophy Pop-ups - Disable Trophy Pop-ups - - - Play title music - 播放標題音樂 - - - Update Compatibility Database On Startup - Update Compatibility Database On Startup - - - Game Compatibility - Game Compatibility - - - Display Compatibility Data - Display Compatibility Data - - - Update Compatibility Database - Update Compatibility Database - - - Volume - 音量 - - - Audio Backend - Audio Backend - - - Save - 儲存 - - - Apply - 應用 - - - Restore Defaults - 還原預設值 - - - Close - 關閉 - - - Point your mouse at an option to display its description. - 將鼠標指向選項以顯示其描述。 - - - consoleLanguageGroupBox - 主機語言:\n設定PS4遊戲使用的語言。\n建議將其設置為遊戲支持的語言,這會因地區而異。 - - - emulatorLanguageGroupBox - 模擬器語言:\n設定模擬器的用戶介面的語言。 - - - fullscreenCheckBox - 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 - - - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - - - showSplashCheckBox - 顯示啟動畫面:\n在遊戲啟動時顯示遊戲的啟動畫面(特殊圖片)。 - - - ps4proCheckBox - 為PS4 Pro:\n讓模擬器像PS4 PRO一樣運作,這可能啟用支持此功能的遊戲中的特殊功能。 - - - discordRPCCheckbox - 啟用 Discord Rich Presence:\n在您的 Discord 個人檔案上顯示模擬器圖標和相關信息。 - - - userName - 用戶名:\n設定PS4帳號的用戶名,某些遊戲中可能會顯示。 - - - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - - - logTypeGroupBox - 日誌類型:\n設定是否同步日誌窗口的輸出以提高性能。可能對模擬產生不良影響。 - - - logFilter - 日誌過濾器:\n過濾日誌以僅打印特定信息。\n範例:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - 以此順序,特定級別靜音所有前面的級別,並記錄其後的每個級別。 - - - updaterGroupBox - 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 - - - GUIMusicGroupBox - 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 - - - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - - - hideCursorGroupBox - 隱藏游標:\n選擇游標何時消失:\n從不: 您將始終看到滑鼠。\n閒置: 設定在閒置後消失的時間。\n始終: 您將永遠看不到滑鼠。 - - - idleTimeoutGroupBox - 設定滑鼠在閒置後消失的時間。 - - - backButtonBehaviorGroupBox - 返回按鈕行為:\n設定控制器的返回按鈕模擬在 PS4 觸控板上指定位置的觸碰。 - - - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - - - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - - - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. - - - Never - 從不 - - - Idle - 閒置 - - - Always - 始終 - - - Touchpad Left - 觸控板左側 - - - Touchpad Right - 觸控板右側 - - - Touchpad Center - 觸控板中間 - - - None - - - - graphicsAdapterGroupBox - 圖形設備:\n在多GPU系統中,從下拉列表中選擇模擬器將使用的GPU,\n或選擇「自動選擇」以自動確定。 - - - resolutionLayout - 寬度/高度:\n設定模擬器啟動時的窗口大小,可以在遊戲過程中調整。\n這與遊戲內解析度不同。 - - - heightDivider - Vblank分隔符:\n模擬器的幀速率將乘以這個數字。更改此數字可能會有不良影響,例如增加遊戲速度,或破壞不預期此變化的關鍵遊戲功能! - - - dumpShadersCheckBox - 啟用著色器轉儲:\n為了技術調試,將遊戲的著色器在渲染時保存到文件夾中。 - - - nullGpuCheckBox - 啟用空GPU:\n為了技術調試,禁用遊戲渲染,彷彿沒有顯示卡。 - - - gameFoldersBox - 遊戲資料夾:\n檢查已安裝遊戲的資料夾列表。 - - - addFolderButton - 添加:\n將資料夾添加到列表。 - - - removeFolderButton - 移除:\n從列表中移除資料夾。 - - - debugDump - 啟用調試轉儲:\n將當前運行的PS4程序的輸入和輸出符號及文件頭信息保存到目錄中。 - - - vkValidationCheckBox - 啟用Vulkan驗證層:\n啟用一個系統來驗證Vulkan渲染器的狀態並記錄其內部狀態的信息。這將降低性能並可能改變模擬行為。 - - - vkSyncValidationCheckBox - 啟用Vulkan同步驗證:\n啟用一個系統來驗證Vulkan渲染任務的時間。這將降低性能並可能改變模擬行為。 - - - rdocCheckBox - 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 - - - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - - - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - - - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - - - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - - - - CheatsPatches - - Cheats / Patches for - Cheats / Patches for - - - defaultTextEdit_MSG - 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats - - - No Image Available - 沒有可用的圖片 - - - Serial: - 序號: - - - Version: - 版本: - - - Size: - 大小: - - - Select Cheat File: - 選擇作弊檔案: - - - Repository: - 儲存庫: - - - Download Cheats - 下載作弊碼 - - - Delete File - 刪除檔案 - - - No files selected. - 沒有選擇檔案。 - - - You can delete the cheats you don't want after downloading them. - 您可以在下載後刪除不需要的作弊碼。 - - - Do you want to delete the selected file?\n%1 - 您是否要刪除選定的檔案?\n%1 - - - Select Patch File: - 選擇修補檔案: - - - Download Patches - 下載修補檔 - - - Save - 儲存 - - - Cheats - 作弊碼 - - - Patches - 修補檔 - - - Error - 錯誤 - - - No patch selected. - 未選擇修補檔。 - - - Unable to open files.json for reading. - 無法打開 files.json 進行讀取。 - - - No patch file found for the current serial. - 找不到當前序號的修補檔。 - - - Unable to open the file for reading. - 無法打開檔案進行讀取。 - - - Unable to open the file for writing. - 無法打開檔案進行寫入。 - - - Failed to parse XML: - 解析 XML 失敗: - - - Success - 成功 - - - Options saved successfully. - 選項已成功儲存。 - - - Invalid Source - 無效的來源 - - - The selected source is invalid. - 選擇的來源無效。 - - - File Exists - 檔案已存在 - - - File already exists. Do you want to replace it? - 檔案已存在。您是否希望替換它? - - - Failed to save file: - 無法儲存檔案: - - - Failed to download file: - 無法下載檔案: - - - Cheats Not Found - 未找到作弊碼 - - - CheatsNotFound_MSG - 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 - - - Cheats Downloaded Successfully - 作弊碼下載成功 - - - CheatsDownloadedSuccessfully_MSG - 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 - - - Failed to save: - 儲存失敗: - - - Failed to download: - 下載失敗: - - - Download Complete - 下載完成 - - - DownloadComplete_MSG - 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。 - - - Failed to parse JSON data from HTML. - 無法從 HTML 解析 JSON 數據。 - - - Failed to retrieve HTML page. - 無法檢索 HTML 頁面。 - - - The game is in version: %1 - 遊戲版本: %1 - - - The downloaded patch only works on version: %1 - 下載的補丁僅適用於版本: %1 - - - You may need to update your game. - 您可能需要更新遊戲。 - - - Incompatibility Notice - 不相容通知 - - - Failed to open file: - 無法打開檔案: - - - XML ERROR: - XML 錯誤: - - - Failed to open files.json for writing - 無法打開 files.json 進行寫入 - - - Author: - 作者: - - - Directory does not exist: - 目錄不存在: - - - Failed to open files.json for reading. - 無法打開 files.json 進行讀取。 - - - Name: - 名稱: - - - Can't apply cheats before the game is started - 在遊戲開始之前無法應用作弊。 - - - - GameListFrame - - Icon - 圖示 - - - Name - 名稱 - - - Serial - 序號 - - - Compatibility - Compatibility - - - Region - 區域 - - - Firmware - 固件 - - - Size - 大小 - - - Version - 版本 - - - Path - 路徑 - - - Play Time - 遊玩時間 - - - Never Played - Never Played - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - Compatibility is untested - - - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator - - - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen - - - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu - - - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance - - - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches - - - Click to see details on github - 點擊查看 GitHub 上的詳細資訊 - - - Last updated - 最後更新 - - - - CheckUpdate - - Auto Updater - 自動更新程式 - - - Error - 錯誤 - - - Network error: - 網路錯誤: - - - Error_Github_limit_MSG - 自動更新程式每小時最多允許 60 次更新檢查。\n您已達到此限制。請稍後再試。 - - - Failed to parse update information. - 無法解析更新資訊。 - - - No pre-releases found. - 未找到預發布版本。 - - - Invalid release data. - 無效的發行數據。 - - - No download URL found for the specified asset. - 未找到指定資產的下載 URL。 - - - Your version is already up to date! - 您的版本已經是最新的! - - - Update Available - 可用更新 - - - Update Channel - 更新頻道 - - - Current Version - 當前版本 - - - Latest Version - 最新版本 - - - Do you want to update? - 您想要更新嗎? - - - Show Changelog - 顯示變更日誌 - - - Check for Updates at Startup - 啟動時檢查更新 - - - Update - 更新 - - - No - - - - Hide Changelog - 隱藏變更日誌 - - - Changes - 變更 - - - Network error occurred while trying to access the URL - 嘗試訪問 URL 時發生網路錯誤 - - - Download Complete - 下載完成 - - - The update has been downloaded, press OK to install. - 更新已下載,按 OK 安裝。 - - - Failed to save the update file at - 無法將更新文件保存到 - - - Starting Update... - 正在開始更新... - - - Failed to create the update script file - 無法創建更新腳本文件 - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - 正在取得相容性資料,請稍候 - - - Cancel - 取消 - - - Loading... - 載入中... - - - Error - 錯誤 - - - Unable to update compatibility data! Try again later. - 無法更新相容性資料!請稍後再試。 - - - Unable to open compatibility_data.json for writing. - 無法開啟 compatibility_data.json 進行寫入。 - - - Unknown - 未知 - - - Nothing - - - - Boots - 靴子 - - - Menus - 選單 - - - Ingame - 遊戲內 - - - Playable - 可玩 - - + + AboutDialog + + About shadPS4 + About shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + defaultTextEdit_MSG + 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats + + + No Image Available + 沒有可用的圖片 + + + Serial: + 序號: + + + Version: + 版本: + + + Size: + 大小: + + + Select Cheat File: + 選擇作弊檔案: + + + Repository: + 儲存庫: + + + Download Cheats + 下載作弊碼 + + + Delete File + 刪除檔案 + + + No files selected. + 沒有選擇檔案。 + + + You can delete the cheats you don't want after downloading them. + 您可以在下載後刪除不需要的作弊碼。 + + + Do you want to delete the selected file?\n%1 + 您是否要刪除選定的檔案?\n%1 + + + Select Patch File: + 選擇修補檔案: + + + Download Patches + 下載修補檔 + + + Save + 儲存 + + + Cheats + 作弊碼 + + + Patches + 修補檔 + + + Error + 錯誤 + + + No patch selected. + 未選擇修補檔。 + + + Unable to open files.json for reading. + 無法打開 files.json 進行讀取。 + + + No patch file found for the current serial. + 找不到當前序號的修補檔。 + + + Unable to open the file for reading. + 無法打開檔案進行讀取。 + + + Unable to open the file for writing. + 無法打開檔案進行寫入。 + + + Failed to parse XML: + 解析 XML 失敗: + + + Success + 成功 + + + Options saved successfully. + 選項已成功儲存。 + + + Invalid Source + 無效的來源 + + + The selected source is invalid. + 選擇的來源無效。 + + + File Exists + 檔案已存在 + + + File already exists. Do you want to replace it? + 檔案已存在。您是否希望替換它? + + + Failed to save file: + 無法儲存檔案: + + + Failed to download file: + 無法下載檔案: + + + Cheats Not Found + 未找到作弊碼 + + + CheatsNotFound_MSG + 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 + + + Cheats Downloaded Successfully + 作弊碼下載成功 + + + CheatsDownloadedSuccessfully_MSG + 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 + + + Failed to save: + 儲存失敗: + + + Failed to download: + 下載失敗: + + + Download Complete + 下載完成 + + + DownloadComplete_MSG + 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。 + + + Failed to parse JSON data from HTML. + 無法從 HTML 解析 JSON 數據。 + + + Failed to retrieve HTML page. + 無法檢索 HTML 頁面。 + + + The game is in version: %1 + 遊戲版本: %1 + + + The downloaded patch only works on version: %1 + 下載的補丁僅適用於版本: %1 + + + You may need to update your game. + 您可能需要更新遊戲。 + + + Incompatibility Notice + 不相容通知 + + + Failed to open file: + 無法打開檔案: + + + XML ERROR: + XML 錯誤: + + + Failed to open files.json for writing + 無法打開 files.json 進行寫入 + + + Author: + 作者: + + + Directory does not exist: + 目錄不存在: + + + Failed to open files.json for reading. + 無法打開 files.json 進行讀取。 + + + Name: + 名稱: + + + Can't apply cheats before the game is started + 在遊戲開始之前無法應用作弊。 + + + Close + 關閉 + + + + CheckUpdate + + Auto Updater + 自動更新程式 + + + Error + 錯誤 + + + Network error: + 網路錯誤: + + + Error_Github_limit_MSG + 自動更新程式每小時最多允許 60 次更新檢查。\n您已達到此限制。請稍後再試。 + + + Failed to parse update information. + 無法解析更新資訊。 + + + No pre-releases found. + 未找到預發布版本。 + + + Invalid release data. + 無效的發行數據。 + + + No download URL found for the specified asset. + 未找到指定資產的下載 URL。 + + + Your version is already up to date! + 您的版本已經是最新的! + + + Update Available + 可用更新 + + + Update Channel + 更新頻道 + + + Current Version + 當前版本 + + + Latest Version + 最新版本 + + + Do you want to update? + 您想要更新嗎? + + + Show Changelog + 顯示變更日誌 + + + Check for Updates at Startup + 啟動時檢查更新 + + + Update + 更新 + + + No + + + + Hide Changelog + 隱藏變更日誌 + + + Changes + 變更 + + + Network error occurred while trying to access the URL + 嘗試訪問 URL 時發生網路錯誤 + + + Download Complete + 下載完成 + + + The update has been downloaded, press OK to install. + 更新已下載,按 OK 安裝。 + + + Failed to save the update file at + 無法將更新文件保存到 + + + Starting Update... + 正在開始更新... + + + Failed to create the update script file + 無法創建更新腳本文件 + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + 正在取得相容性資料,請稍候 + + + Cancel + 取消 + + + Loading... + 載入中... + + + Error + 錯誤 + + + Unable to update compatibility data! Try again later. + 無法更新相容性資料!請稍後再試。 + + + Unable to open compatibility_data.json for writing. + 無法開啟 compatibility_data.json 進行寫入。 + + + Unknown + 未知 + + + Nothing + + + + Boots + 靴子 + + + Menus + 選單 + + + Ingame + 遊戲內 + + + Playable + 可玩 + + + + ControlSettings + + Configure Controls + + + + Control Settings + + + + D-Pad + + + + Up + + + + Left + + + + Right + + + + Down + + + + Left Stick Deadzone (def:2 max:127) + + + + Left Deadzone + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + L1 / LB + + + + L2 / LT + + + + KBM Controls + + + + KBM Editor + + + + Back + + + + R1 / RB + + + + R2 / RT + + + + L3 + + + + Options / Start + + + + R3 + + + + Face Buttons + + + + Triangle / Y + + + + Square / X + + + + Circle / B + + + + Cross / A + + + + Right Stick Deadzone (def:2, max:127) + + + + Right Deadzone + + + + Right Stick + + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + + + + + GameListFrame + + Icon + 圖示 + + + Name + 名稱 + + + Serial + 序號 + + + Compatibility + Compatibility + + + Region + 區域 + + + Firmware + 固件 + + + Size + 大小 + + + Version + 版本 + + + Path + 路徑 + + + Play Time + 遊玩時間 + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + 點擊查看 GitHub 上的詳細資訊 + + + Last updated + 最後更新 + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Zuòbì / Xiūbǔ chéngshì + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + 打開資料夾... + + + Open Game Folder + 打開遊戲資料夾 + + + Open Save Data Folder + 打開存檔資料夾 + + + Open Log Folder + 打開日誌資料夾 + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + + + + Copy Version + + + + Copy Size + + + + Delete Save Data + + + + This game has no update folder to open! + + + + Failed to convert icon. + + + + This game has no save data to delete! + + + + Save Data + + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + + + + Delete PKG File on Install + + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + 檢查更新 + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Xiàzài Zuòbì / Xiūbǔ chéngshì + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + 幫助 + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + 遊戲列表 + + + * Unsupported Vulkan Version + * 不支援的 Vulkan 版本 + + + Download Cheats For All Installed Games + 下載所有已安裝遊戲的作弊碼 + + + Download Patches For All Games + 下載所有遊戲的修補檔 + + + Download Complete + 下載完成 + + + You have downloaded cheats for all the games you have installed. + 您已經下載了所有已安裝遊戲的作弊碼。 + + + Patches Downloaded Successfully! + 修補檔下載成功! + + + All Patches available for all games have been downloaded. + 所有遊戲的修補檔已經下載完成。 + + + Games: + 遊戲: + + + ELF files (*.bin *.elf *.oelf) + ELF 檔案 (*.bin *.elf *.oelf) + + + Game Boot + 遊戲啟動 + + + Only one file can be selected! + 只能選擇一個檔案! + + + PKG Extraction + PKG 解壓縮 + + + Patch detected! + 檢測到補丁! + + + PKG and Game versions match: + PKG 和遊戲版本匹配: + + + Would you like to overwrite? + 您想要覆蓋嗎? + + + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安裝版本更舊: + + + Game is installed: + 遊戲已安裝: + + + Would you like to install Patch: + 您想要安裝補丁嗎: + + + DLC Installation + DLC 安裝 + + + Would you like to install DLC: %1? + 您想要安裝 DLC: %1 嗎? + + + DLC already installed: + DLC 已經安裝: + + + Game already installed + 遊戲已經安裝 + + + PKG ERROR + PKG 錯誤 + + + Extracting PKG %1/%2 + 正在解壓縮 PKG %1/%2 + + + Extraction Finished + 解壓縮完成 + + + Game successfully installed at %1 + 遊戲成功安裝於 %1 + + + File doesn't appear to be a valid PKG file + 檔案似乎不是有效的 PKG 檔案 + + + Run Game + + + + Eboot.bin file not found + + + + PKG File (*.PKG *.pkg) + + + + PKG is a patch or DLC, please install the game first! + + + + Game is already running! + + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + Name + 名稱 + + + Serial + 序號 + + + Installed + + + + Size + 大小 + + + Category + + + + Type + + + + App Ver + + + + FW + + + + Region + 區域 + + + Flags + + + + Path + 路徑 + + + File + File + + + PKG ERROR + PKG 錯誤 + + + Unknown + 未知 + + + Package + + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + 全螢幕模式 + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + 打開設置時的默認選項卡 + + + Show Game Size In List + 顯示遊戲大小在列表中 + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + 啟用 Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + 開啟日誌位置 + + + Input + 輸入 + + + Cursor + 游標 + + + Hide Cursor + 隱藏游標 + + + Hide Cursor Idle Timeout + 游標空閒超時隱藏 + + + s + s + + + Controller + 控制器 + + + Back Button Behavior + 返回按鈕行為 + + + Graphics + Graphics + + + GUI + 介面 + + + User + 使用者 + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Paths + 路徑 + + + Game Folders + 遊戲資料夾 + + + Add... + 添加... + + + Remove + 刪除 + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + 更新 + + + Check for Updates at Startup + 啟動時檢查更新 + + + Always Show Changelog + 始終顯示變更紀錄 + + + Update Channel + 更新頻道 + + + Check for Updates + 檢查更新 + + + GUI Settings + 介面設置 + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Play title music + 播放標題音樂 + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + 音量 + + + Save + 儲存 + + + Apply + 應用 + + + Restore Defaults + 還原預設值 + + + Close + 關閉 + + + Point your mouse at an option to display its description. + 將鼠標指向選項以顯示其描述。 + + + consoleLanguageGroupBox + 主機語言:\n設定PS4遊戲使用的語言。\n建議將其設置為遊戲支持的語言,這會因地區而異。 + + + emulatorLanguageGroupBox + 模擬器語言:\n設定模擬器的用戶介面的語言。 + + + fullscreenCheckBox + 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 + + + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + + + showSplashCheckBox + 顯示啟動畫面:\n在遊戲啟動時顯示遊戲的啟動畫面(特殊圖片)。 + + + discordRPCCheckbox + 啟用 Discord Rich Presence:\n在您的 Discord 個人檔案上顯示模擬器圖標和相關信息。 + + + userName + 用戶名:\n設定PS4帳號的用戶名,某些遊戲中可能會顯示。 + + + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + logTypeGroupBox + 日誌類型:\n設定是否同步日誌窗口的輸出以提高性能。可能對模擬產生不良影響。 + + + logFilter + 日誌過濾器:\n過濾日誌以僅打印特定信息。\n範例:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - 以此順序,特定級別靜音所有前面的級別,並記錄其後的每個級別。 + + + updaterGroupBox + 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 + + + GUIMusicGroupBox + 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 + + + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + hideCursorGroupBox + 隱藏游標:\n選擇游標何時消失:\n從不: 您將始終看到滑鼠。\n閒置: 設定在閒置後消失的時間。\n始終: 您將永遠看不到滑鼠。 + + + idleTimeoutGroupBox + 設定滑鼠在閒置後消失的時間。 + + + backButtonBehaviorGroupBox + 返回按鈕行為:\n設定控制器的返回按鈕模擬在 PS4 觸控板上指定位置的觸碰。 + + + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + 從不 + + + Idle + 閒置 + + + Always + 始終 + + + Touchpad Left + 觸控板左側 + + + Touchpad Right + 觸控板右側 + + + Touchpad Center + 觸控板中間 + + + None + + + + graphicsAdapterGroupBox + 圖形設備:\n在多GPU系統中,從下拉列表中選擇模擬器將使用的GPU,\n或選擇「自動選擇」以自動確定。 + + + resolutionLayout + 寬度/高度:\n設定模擬器啟動時的窗口大小,可以在遊戲過程中調整。\n這與遊戲內解析度不同。 + + + heightDivider + Vblank分隔符:\n模擬器的幀速率將乘以這個數字。更改此數字可能會有不良影響,例如增加遊戲速度,或破壞不預期此變化的關鍵遊戲功能! + + + dumpShadersCheckBox + 啟用著色器轉儲:\n為了技術調試,將遊戲的著色器在渲染時保存到文件夾中。 + + + nullGpuCheckBox + 啟用空GPU:\n為了技術調試,禁用遊戲渲染,彷彿沒有顯示卡。 + + + gameFoldersBox + 遊戲資料夾:\n檢查已安裝遊戲的資料夾列表。 + + + addFolderButton + 添加:\n將資料夾添加到列表。 + + + removeFolderButton + 移除:\n從列表中移除資料夾。 + + + debugDump + 啟用調試轉儲:\n將當前運行的PS4程序的輸入和輸出符號及文件頭信息保存到目錄中。 + + + vkValidationCheckBox + 啟用Vulkan驗證層:\n啟用一個系統來驗證Vulkan渲染器的狀態並記錄其內部狀態的信息。這將降低性能並可能改變模擬行為。 + + + vkSyncValidationCheckBox + 啟用Vulkan同步驗證:\n啟用一個系統來驗證Vulkan渲染任務的時間。這將降低性能並可能改變模擬行為。 + + + rdocCheckBox + 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 + + + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Borderless + + + + True + + + + Enable HDR + + + + Release + + + + Nightly + + + + Background Image + + + + Show Background Image + + + + Opacity + + + + Set the volume of the background music. + + + + Enable Motion Controls + + + + Save Data Path + + + + Browse + Browse + + + async + + + + sync + + + + Auto Select + + + + Directory to install games + Directory to install games + + + Directory to save data + + + + GUIBackgroundImageGroupBox + + + + enableHDRCheckBox + + + + saveDataBox + + + + browseButton + + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + From 753a3072ee5fc1a3cdcd9d50d975660c02feb86b Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 13 Feb 2025 14:50:02 +0200 Subject: [PATCH 272/455] Update Crowdin configuration file --- crowdin.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 crowdin.yml diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 000000000..64363f02a --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,3 @@ +files: + - source: /src/qt_gui/translations/en_US.ts + translation: /%original_path%/%locale_with_underscore%.ts From 40cd5c57c5381efb1dbe43bf59c0da721349307f Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 13 Feb 2025 14:58:54 +0200 Subject: [PATCH 273/455] Update REUSE.toml --- REUSE.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/REUSE.toml b/REUSE.toml index 63242edb2..3c5a0dc59 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -3,6 +3,7 @@ version = 1 [[annotations]] path = [ "REUSE.toml", + "crowdin.yml", "CMakeSettings.json", ".github/FUNDING.yml", ".github/shadps4.png", From c94cd531f0ef6c40902a06efd81807e17473cf3c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 13 Feb 2025 15:40:14 +0200 Subject: [PATCH 274/455] New Crowdin updates (#2415) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Spanish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Norwegian) * New translations en_us.ts (Polish) * New translations en_us.ts (Russian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) --- src/qt_gui/translations/ar_SA.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/da_DK.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/de_DE.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/el_GR.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/es_ES.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/fa_IR.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/fi_FI.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/fr_FR.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/hu_HU.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/id_ID.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/it_IT.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/ja_JP.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/ko_KR.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/lt_LT.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/nl_NL.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/no_NO.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/pl_PL.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/pt_BR.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/ro_RO.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/ru_RU.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/sq_AL.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/sv_SE.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/tr_TR.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/uk_UA.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/vi_VN.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/zh_CN.ts | 1802 +++++++++++++++--------------- src/qt_gui/translations/zh_TW.ts | 1802 +++++++++++++++--------------- 27 files changed, 24327 insertions(+), 24327 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 275751817..0235a242d 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - حول shadPS4 + About shadPS4 + حول shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. - This software should not be used to play games you have not legally obtained. - يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني. + This software should not be used to play games you have not legally obtained. + يجب عدم استخدام هذا البرنامج لتشغيل الألعاب التي لم تحصل عليها بشكل قانوني. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - لا تتوفر صورة + No Image Available + لا تتوفر صورة - Serial: - الرقم التسلسلي: + Serial: + الرقم التسلسلي: - Version: - الإصدار: + Version: + الإصدار: - Size: - الحجم: + Size: + الحجم: - Select Cheat File: - اختر ملف الغش: + Select Cheat File: + اختر ملف الغش: - Repository: - المستودع: + Repository: + المستودع: - Download Cheats - تنزيل الغش + Download Cheats + تنزيل الغش - Delete File - حذف الملف + Delete File + حذف الملف - No files selected. - لم يتم اختيار أي ملفات. + No files selected. + لم يتم اختيار أي ملفات. - You can delete the cheats you don't want after downloading them. - يمكنك حذف الغش الذي لا تريده بعد تنزيله. + You can delete the cheats you don't want after downloading them. + يمكنك حذف الغش الذي لا تريده بعد تنزيله. - Do you want to delete the selected file?\n%1 - هل تريد حذف الملف المحدد؟\n%1 + Do you want to delete the selected file?\n%1 + هل تريد حذف الملف المحدد؟\n%1 - Select Patch File: - اختر ملف التصحيح: + Select Patch File: + اختر ملف التصحيح: - Download Patches - تنزيل التصحيحات + Download Patches + تنزيل التصحيحات - Save - حفظ + Save + حفظ - Cheats - الغش + Cheats + الغش - Patches - التصحيحات + Patches + التصحيحات - Error - خطأ + Error + خطأ - No patch selected. - لم يتم اختيار أي تصحيح. + No patch selected. + لم يتم اختيار أي تصحيح. - Unable to open files.json for reading. - تعذر فتح files.json للقراءة. + Unable to open files.json for reading. + تعذر فتح files.json للقراءة. - No patch file found for the current serial. - لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. + No patch file found for the current serial. + لم يتم العثور على ملف تصحيح للرقم التسلسلي الحالي. - Unable to open the file for reading. - تعذر فتح الملف للقراءة. + Unable to open the file for reading. + تعذر فتح الملف للقراءة. - Unable to open the file for writing. - تعذر فتح الملف للكتابة. + Unable to open the file for writing. + تعذر فتح الملف للكتابة. - Failed to parse XML: - :فشل في تحليل XML + Failed to parse XML: + :فشل في تحليل XML - Success - نجاح + Success + نجاح - Options saved successfully. - تم حفظ الخيارات بنجاح. + Options saved successfully. + تم حفظ الخيارات بنجاح. - Invalid Source - مصدر غير صالح + Invalid Source + مصدر غير صالح - The selected source is invalid. - المصدر المحدد غير صالح. + The selected source is invalid. + المصدر المحدد غير صالح. - File Exists - الملف موجود + File Exists + الملف موجود - File already exists. Do you want to replace it? - الملف موجود بالفعل. هل تريد استبداله؟ + File already exists. Do you want to replace it? + الملف موجود بالفعل. هل تريد استبداله؟ - Failed to save file: - :فشل في حفظ الملف + Failed to save file: + :فشل في حفظ الملف - Failed to download file: - :فشل في تنزيل الملف + Failed to download file: + :فشل في تنزيل الملف - Cheats Not Found - لم يتم العثور على الغش + Cheats Not Found + لم يتم العثور على الغش - CheatsNotFound_MSG - لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. + CheatsNotFound_MSG + لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. - Cheats Downloaded Successfully - تم تنزيل الغش بنجاح + Cheats Downloaded Successfully + تم تنزيل الغش بنجاح - CheatsDownloadedSuccessfully_MSG - لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. + CheatsDownloadedSuccessfully_MSG + لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. - Failed to save: - :فشل في الحفظ + Failed to save: + :فشل في الحفظ - Failed to download: - :فشل في التنزيل + Failed to download: + :فشل في التنزيل - Download Complete - اكتمل التنزيل + Download Complete + اكتمل التنزيل - DownloadComplete_MSG - تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. + DownloadComplete_MSG + تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. - Failed to parse JSON data from HTML. - فشل في تحليل بيانات JSON من HTML. + Failed to parse JSON data from HTML. + فشل في تحليل بيانات JSON من HTML. - Failed to retrieve HTML page. - .HTML فشل في استرجاع صفحة + Failed to retrieve HTML page. + .HTML فشل في استرجاع صفحة - The game is in version: %1 - اللعبة في الإصدار: %1 + The game is in version: %1 + اللعبة في الإصدار: %1 - The downloaded patch only works on version: %1 - الباتش الذي تم تنزيله يعمل فقط على الإصدار: %1 + The downloaded patch only works on version: %1 + الباتش الذي تم تنزيله يعمل فقط على الإصدار: %1 - You may need to update your game. - قد تحتاج إلى تحديث لعبتك. + You may need to update your game. + قد تحتاج إلى تحديث لعبتك. - Incompatibility Notice - إشعار عدم التوافق + Incompatibility Notice + إشعار عدم التوافق - Failed to open file: - :فشل في فتح الملف + Failed to open file: + :فشل في فتح الملف - XML ERROR: - :خطأ في XML + XML ERROR: + :خطأ في XML - Failed to open files.json for writing - فشل في فتح files.json للكتابة + Failed to open files.json for writing + فشل في فتح files.json للكتابة - Author: - :المؤلف + Author: + :المؤلف - Directory does not exist: - :المجلد غير موجود + Directory does not exist: + :المجلد غير موجود - Failed to open files.json for reading. - فشل في فتح files.json للقراءة. + Failed to open files.json for reading. + فشل في فتح files.json للقراءة. - Name: - :الاسم + Name: + :الاسم - Can't apply cheats before the game is started - لا يمكن تطبيق الغش قبل بدء اللعبة. + Can't apply cheats before the game is started + لا يمكن تطبيق الغش قبل بدء اللعبة. - Close - إغلاق + Close + إغلاق - - + + CheckUpdate - Auto Updater - محدث تلقائي + Auto Updater + محدث تلقائي - Error - خطأ + Error + خطأ - Network error: - خطأ في الشبكة: + Network error: + خطأ في الشبكة: - Error_Github_limit_MSG - يتيح التحديث التلقائي ما يصل إلى 60 عملية تحقق من التحديث في الساعة.\nلقد وصلت إلى هذا الحد. الرجاء المحاولة مرة أخرى لاحقًا. + Error_Github_limit_MSG + يتيح التحديث التلقائي ما يصل إلى 60 عملية تحقق من التحديث في الساعة.\nلقد وصلت إلى هذا الحد. الرجاء المحاولة مرة أخرى لاحقًا. - Failed to parse update information. - فشل في تحليل معلومات التحديث. + Failed to parse update information. + فشل في تحليل معلومات التحديث. - No pre-releases found. - لم يتم العثور على أي إصدارات مسبقة. + No pre-releases found. + لم يتم العثور على أي إصدارات مسبقة. - Invalid release data. - بيانات الإصدار غير صالحة. + Invalid release data. + بيانات الإصدار غير صالحة. - No download URL found for the specified asset. - لم يتم العثور على عنوان URL للتنزيل للأصل المحدد. + No download URL found for the specified asset. + لم يتم العثور على عنوان URL للتنزيل للأصل المحدد. - Your version is already up to date! - نسختك محدثة بالفعل! + Your version is already up to date! + نسختك محدثة بالفعل! - Update Available - تحديث متاح + Update Available + تحديث متاح - Update Channel - قناة التحديث + Update Channel + قناة التحديث - Current Version - الإصدار الحالي + Current Version + الإصدار الحالي - Latest Version - آخر إصدار + Latest Version + آخر إصدار - Do you want to update? - هل تريد التحديث؟ + Do you want to update? + هل تريد التحديث؟ - Show Changelog - عرض سجل التغييرات + Show Changelog + عرض سجل التغييرات - Check for Updates at Startup - تحقق من التحديثات عند بدء التشغيل + Check for Updates at Startup + تحقق من التحديثات عند بدء التشغيل - Update - تحديث + Update + تحديث - No - لا + No + لا - Hide Changelog - إخفاء سجل التغييرات + Hide Changelog + إخفاء سجل التغييرات - Changes - تغييرات + Changes + تغييرات - Network error occurred while trying to access the URL - حدث خطأ في الشبكة أثناء محاولة الوصول إلى عنوان URL + Network error occurred while trying to access the URL + حدث خطأ في الشبكة أثناء محاولة الوصول إلى عنوان URL - Download Complete - اكتمل التنزيل + Download Complete + اكتمل التنزيل - The update has been downloaded, press OK to install. - تم تنزيل التحديث، اضغط على OK للتثبيت. + The update has been downloaded, press OK to install. + تم تنزيل التحديث، اضغط على OK للتثبيت. - Failed to save the update file at - فشل في حفظ ملف التحديث في + Failed to save the update file at + فشل في حفظ ملف التحديث في - Starting Update... - بدء التحديث... + Starting Update... + بدء التحديث... - Failed to create the update script file - فشل في إنشاء ملف سكريبت التحديث + Failed to create the update script file + فشل في إنشاء ملف سكريبت التحديث - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - جاري جلب بيانات التوافق، يرجى الانتظار + Fetching compatibility data, please wait + جاري جلب بيانات التوافق، يرجى الانتظار - Cancel - إلغاء + Cancel + إلغاء - Loading... - جاري التحميل... + Loading... + جاري التحميل... - Error - خطأ + Error + خطأ - Unable to update compatibility data! Try again later. - تعذر تحديث بيانات التوافق! حاول مرة أخرى لاحقاً. + Unable to update compatibility data! Try again later. + تعذر تحديث بيانات التوافق! حاول مرة أخرى لاحقاً. - Unable to open compatibility_data.json for writing. - تعذر فتح compatibility_data.json للكتابة. + Unable to open compatibility_data.json for writing. + تعذر فتح compatibility_data.json للكتابة. - Unknown - غير معروف + Unknown + غير معروف - Nothing - لا شيء + Nothing + لا شيء - Boots - أحذية + Boots + أحذية - Menus - قوائم + Menus + قوائم - Ingame - داخل اللعبة + Ingame + داخل اللعبة - Playable - قابل للعب + Playable + قابل للعب - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - فتح المجلد + Open Folder + فتح المجلد - - + + GameInfoClass - Loading game list, please wait :3 - جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3 + Loading game list, please wait :3 + جارٍ تحميل قائمة الألعاب، يرجى الانتظار :3 - Cancel - إلغاء + Cancel + إلغاء - Loading... - ...جارٍ التحميل + Loading... + ...جارٍ التحميل - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - اختر المجلد + shadPS4 - Choose directory + shadPS4 - اختر المجلد - Directory to install games - مجلد تثبيت الألعاب + Directory to install games + مجلد تثبيت الألعاب - Browse - تصفح + Browse + تصفح - Error - خطأ + Error + خطأ - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - أيقونة + Icon + أيقونة - Name - اسم + Name + اسم - Serial - سيريال + Serial + سيريال - Compatibility - Compatibility + Compatibility + Compatibility - Region - منطقة + Region + منطقة - Firmware - البرمجيات الثابتة + Firmware + البرمجيات الثابتة - Size - حجم + Size + حجم - Version - إصدار + Version + إصدار - Path - مسار + Path + مسار - Play Time - وقت اللعب + Play Time + وقت اللعب - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - انقر لرؤية التفاصيل على GitHub + Click to see details on github + انقر لرؤية التفاصيل على GitHub - Last updated - آخر تحديث + Last updated + آخر تحديث - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - إنشاء اختصار + Create Shortcut + إنشاء اختصار - Cheats / Patches - الغش / التصحيحات + Cheats / Patches + الغش / التصحيحات - SFO Viewer - عارض SFO + SFO Viewer + عارض SFO - Trophy Viewer - عارض الجوائز + Trophy Viewer + عارض الجوائز - Open Folder... - فتح المجلد... + Open Folder... + فتح المجلد... - Open Game Folder - فتح مجلد اللعبة + Open Game Folder + فتح مجلد اللعبة - Open Save Data Folder - فتح مجلد بيانات الحفظ + Open Save Data Folder + فتح مجلد بيانات الحفظ - Open Log Folder - فتح مجلد السجل + Open Log Folder + فتح مجلد السجل - Copy info... - ...نسخ المعلومات + Copy info... + ...نسخ المعلومات - Copy Name - نسخ الاسم + Copy Name + نسخ الاسم - Copy Serial - نسخ الرقم التسلسلي + Copy Serial + نسخ الرقم التسلسلي - Copy All - نسخ الكل + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + نسخ الكل - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - إنشاء اختصار + View report + View report - Shortcut created successfully! - تم إنشاء الاختصار بنجاح! + Submit a report + Submit a report - Error - خطأ + Shortcut creation + إنشاء اختصار - Error creating shortcut! - خطأ في إنشاء الاختصار + Shortcut created successfully! + تم إنشاء الاختصار بنجاح! - Install PKG - PKG تثبيت + Error + خطأ - Game - Game + Error creating shortcut! + خطأ في إنشاء الاختصار - This game has no update to delete! - This game has no update to delete! + Install PKG + PKG تثبيت - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - اختر المجلد + shadPS4 - Choose directory + shadPS4 - اختر المجلد - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Elf فتح/إضافة مجلد + Open/Add Elf Folder + Elf فتح/إضافة مجلد - Install Packages (PKG) - (PKG) تثبيت الحزم + Install Packages (PKG) + (PKG) تثبيت الحزم - Boot Game - تشغيل اللعبة + Boot Game + تشغيل اللعبة - Check for Updates - تحقق من التحديثات + Check for Updates + تحقق من التحديثات - About shadPS4 - shadPS4 حول + About shadPS4 + shadPS4 حول - Configure... - ...تكوين + Configure... + ...تكوين - Install application from a .pkg file - .pkg تثبيت التطبيق من ملف + Install application from a .pkg file + .pkg تثبيت التطبيق من ملف - Recent Games - الألعاب الأخيرة + Recent Games + الألعاب الأخيرة - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - خروج + Exit + خروج - Exit shadPS4 - الخروج من shadPS4 + Exit shadPS4 + الخروج من shadPS4 - Exit the application. - الخروج من التطبيق. + Exit the application. + الخروج من التطبيق. - Show Game List - إظهار قائمة الألعاب + Show Game List + إظهار قائمة الألعاب - Game List Refresh - تحديث قائمة الألعاب + Game List Refresh + تحديث قائمة الألعاب - Tiny - صغير جدًا + Tiny + صغير جدًا - Small - صغير + Small + صغير - Medium - متوسط + Medium + متوسط - Large - كبير + Large + كبير - List View - عرض القائمة + List View + عرض القائمة - Grid View - عرض الشبكة + Grid View + عرض الشبكة - Elf Viewer - عارض Elf + Elf Viewer + عارض Elf - Game Install Directory - دليل تثبيت اللعبة + Game Install Directory + دليل تثبيت اللعبة - Download Cheats/Patches - تنزيل الغش/التصحيحات + Download Cheats/Patches + تنزيل الغش/التصحيحات - Dump Game List - تفريغ قائمة الألعاب + Dump Game List + تفريغ قائمة الألعاب - PKG Viewer - عارض PKG + PKG Viewer + عارض PKG - Search... - ...بحث + Search... + ...بحث - File - ملف + File + ملف - View - عرض + View + عرض - Game List Icons - أيقونات قائمة الألعاب + Game List Icons + أيقونات قائمة الألعاب - Game List Mode - وضع قائمة الألعاب + Game List Mode + وضع قائمة الألعاب - Settings - الإعدادات + Settings + الإعدادات - Utils - الأدوات + Utils + الأدوات - Themes - السمات + Themes + السمات - Help - مساعدة + Help + مساعدة - Dark - داكن + Dark + داكن - Light - فاتح + Light + فاتح - Green - أخضر + Green + أخضر - Blue - أزرق + Blue + أزرق - Violet - بنفسجي + Violet + بنفسجي - toolBar - شريط الأدوات + toolBar + شريط الأدوات - Game List - ققائمة الألعاب + Game List + ققائمة الألعاب - * Unsupported Vulkan Version - * إصدار Vulkan غير مدعوم + * Unsupported Vulkan Version + * إصدار Vulkan غير مدعوم - Download Cheats For All Installed Games - تنزيل الغش لجميع الألعاب المثبتة + Download Cheats For All Installed Games + تنزيل الغش لجميع الألعاب المثبتة - Download Patches For All Games - تنزيل التصحيحات لجميع الألعاب + Download Patches For All Games + تنزيل التصحيحات لجميع الألعاب - Download Complete - اكتمل التنزيل + Download Complete + اكتمل التنزيل - You have downloaded cheats for all the games you have installed. - لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. + You have downloaded cheats for all the games you have installed. + لقد قمت بتنزيل الغش لجميع الألعاب التي قمت بتثبيتها. - Patches Downloaded Successfully! - !تم تنزيل التصحيحات بنجاح + Patches Downloaded Successfully! + !تم تنزيل التصحيحات بنجاح - All Patches available for all games have been downloaded. - .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب + All Patches available for all games have been downloaded. + .تم تنزيل جميع التصحيحات المتاحة لجميع الألعاب - Games: - :الألعاب + Games: + :الألعاب - ELF files (*.bin *.elf *.oelf) - ELF (*.bin *.elf *.oelf) ملفات + ELF files (*.bin *.elf *.oelf) + ELF (*.bin *.elf *.oelf) ملفات - Game Boot - تشغيل اللعبة + Game Boot + تشغيل اللعبة - Only one file can be selected! - !يمكن تحديد ملف واحد فقط + Only one file can be selected! + !يمكن تحديد ملف واحد فقط - PKG Extraction - PKG استخراج + PKG Extraction + PKG استخراج - Patch detected! - تم اكتشاف تصحيح! + Patch detected! + تم اكتشاف تصحيح! - PKG and Game versions match: - :واللعبة تتطابق إصدارات PKG + PKG and Game versions match: + :واللعبة تتطابق إصدارات PKG - Would you like to overwrite? - هل ترغب في الكتابة فوق الملف الموجود؟ + Would you like to overwrite? + هل ترغب في الكتابة فوق الملف الموجود؟ - PKG Version %1 is older than installed version: - :أقدم من الإصدار المثبت PKG Version %1 + PKG Version %1 is older than installed version: + :أقدم من الإصدار المثبت PKG Version %1 - Game is installed: - :اللعبة مثبتة + Game is installed: + :اللعبة مثبتة - Would you like to install Patch: - :هل ترغب في تثبيت التصحيح + Would you like to install Patch: + :هل ترغب في تثبيت التصحيح - DLC Installation - تثبيت المحتوى القابل للتنزيل + DLC Installation + تثبيت المحتوى القابل للتنزيل - Would you like to install DLC: %1? - هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ + Would you like to install DLC: %1? + هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ - DLC already installed: - :المحتوى القابل للتنزيل مثبت بالفعل + DLC already installed: + :المحتوى القابل للتنزيل مثبت بالفعل - Game already installed - اللعبة مثبتة بالفعل + Game already installed + اللعبة مثبتة بالفعل - PKG ERROR - PKG خطأ في + PKG ERROR + PKG خطأ في - Extracting PKG %1/%2 - PKG %1/%2 جاري استخراج + Extracting PKG %1/%2 + PKG %1/%2 جاري استخراج - Extraction Finished - اكتمل الاستخراج + Extraction Finished + اكتمل الاستخراج - Game successfully installed at %1 - تم تثبيت اللعبة بنجاح في %1 + Game successfully installed at %1 + تم تثبيت اللعبة بنجاح في %1 - File doesn't appear to be a valid PKG file - يبدو أن الملف ليس ملف PKG صالحًا + File doesn't appear to be a valid PKG file + يبدو أن الملف ليس ملف PKG صالحًا - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - فتح المجلد + Open Folder + فتح المجلد - Name - اسم + PKG ERROR + PKG خطأ في - Serial - سيريال + Name + اسم - Installed - + Serial + سيريال - Size - حجم + Installed + Installed - Category - + Size + حجم - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - منطقة + FW + FW - Flags - + Region + منطقة - Path - مسار + Flags + Flags - File - ملف + Path + مسار - PKG ERROR - PKG خطأ في + File + ملف - Unknown - غير معروف + Unknown + غير معروف - Package - + Package + Package - - + + SettingsDialog - Settings - الإعدادات + Settings + الإعدادات - General - عام + General + عام - System - النظام + System + النظام - Console Language - لغة وحدة التحكم + Console Language + لغة وحدة التحكم - Emulator Language - لغة المحاكي + Emulator Language + لغة المحاكي - Emulator - المحاكي + Emulator + المحاكي - Enable Fullscreen - تمكين ملء الشاشة + Enable Fullscreen + تمكين ملء الشاشة - Fullscreen Mode - وضع ملء الشاشة + Fullscreen Mode + وضع ملء الشاشة - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - علامة التبويب الافتراضية عند فتح الإعدادات + Default tab when opening settings + علامة التبويب الافتراضية عند فتح الإعدادات - Show Game Size In List - عرض حجم اللعبة في القائمة + Show Game Size In List + عرض حجم اللعبة في القائمة - Show Splash - إظهار شاشة البداية + Show Splash + إظهار شاشة البداية - Enable Discord Rich Presence - تفعيل حالة الثراء في ديسكورد + Enable Discord Rich Presence + تفعيل حالة الثراء في ديسكورد - Username - اسم المستخدم + Username + اسم المستخدم - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - المسجل + Logger + المسجل - Log Type - نوع السجل + Log Type + نوع السجل - Log Filter - مرشح السجل + Log Filter + مرشح السجل - Open Log Location - افتح موقع السجل + Open Log Location + افتح موقع السجل - Input - إدخال + Input + إدخال - Cursor - مؤشر + Cursor + مؤشر - Hide Cursor - إخفاء المؤشر + Hide Cursor + إخفاء المؤشر - Hide Cursor Idle Timeout - مهلة إخفاء المؤشر عند الخمول + Hide Cursor Idle Timeout + مهلة إخفاء المؤشر عند الخمول - s - s + s + s - Controller - التحكم + Controller + التحكم - Back Button Behavior - سلوك زر العودة + Back Button Behavior + سلوك زر العودة - Graphics - الرسومات + Graphics + الرسومات - GUI - واجهة + GUI + واجهة - User - مستخدم + User + مستخدم - Graphics Device - جهاز الرسومات + Graphics Device + جهاز الرسومات - Width - العرض + Width + العرض - Height - الارتفاع + Height + الارتفاع - Vblank Divider - Vblank مقسم + Vblank Divider + Vblank مقسم - Advanced - متقدم + Advanced + متقدم - Enable Shaders Dumping - تمكين تفريغ الشيدرات + Enable Shaders Dumping + تمكين تفريغ الشيدرات - Enable NULL GPU - تمكين وحدة معالجة الرسومات الفارغة + Enable NULL GPU + تمكين وحدة معالجة الرسومات الفارغة - Paths - المسارات + Enable HDR + Enable HDR - Game Folders - مجلدات اللعبة + Paths + المسارات - Add... - إضافة... + Game Folders + مجلدات اللعبة - Remove - إزالة + Add... + إضافة... - Debug - تصحيح الأخطاء + Remove + إزالة - Enable Debug Dumping - تمكين تفريغ التصحيح + Debug + تصحيح الأخطاء - Enable Vulkan Validation Layers - Vulkan تمكين طبقات التحقق من + Enable Debug Dumping + تمكين تفريغ التصحيح - Enable Vulkan Synchronization Validation - Vulkan تمكين التحقق من تزامن + Enable Vulkan Validation Layers + Vulkan تمكين طبقات التحقق من - Enable RenderDoc Debugging - RenderDoc تمكين تصحيح أخطاء + Enable Vulkan Synchronization Validation + Vulkan تمكين التحقق من تزامن - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + RenderDoc تمكين تصحيح أخطاء - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - تحديث + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - تحقق من التحديثات عند بدء التشغيل + Update + تحديث - Update Channel - قناة التحديث + Check for Updates at Startup + تحقق من التحديثات عند بدء التشغيل - Check for Updates - التحقق من التحديثات + Always Show Changelog + Always Show Changelog - GUI Settings - إعدادات الواجهة + Update Channel + قناة التحديث - Title Music - Title Music + Check for Updates + التحقق من التحديثات - Disable Trophy Pop-ups - Disable Trophy Pop-ups + GUI Settings + إعدادات الواجهة - Play title music - تشغيل موسيقى العنوان + Title Music + Title Music - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Game Compatibility - Game Compatibility + Background Image + Background Image - Display Compatibility Data - Display Compatibility Data + Show Background Image + Show Background Image - Update Compatibility Database - Update Compatibility Database + Opacity + Opacity - Volume - الصوت + Play title music + تشغيل موسيقى العنوان - Save - حفظ + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Apply - تطبيق + Game Compatibility + Game Compatibility - Restore Defaults - استعادة الإعدادات الافتراضية + Display Compatibility Data + Display Compatibility Data - Close - إغلاق + Update Compatibility Database + Update Compatibility Database - Point your mouse at an option to display its description. - وجّه الماوس نحو خيار لعرض وصفه. + Volume + الصوت - consoleLanguageGroupBox - لغة الجهاز:\nتحدد لغة اللعبة التي يستخدمها جهاز PS4.\nيوصى بضبطها على لغة يدعمها الجهاز، والتي قد تختلف حسب المنطقة. + Save + حفظ - emulatorLanguageGroupBox - لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. + Apply + تطبيق - fullscreenCheckBox - تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. + Restore Defaults + استعادة الإعدادات الافتراضية - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Close + إغلاق - showSplashCheckBox - إظهار شاشة البداية:\nيعرض شاشة البداية الخاصة باللعبة (صورة خاصة) أثناء بدء التشغيل. + Point your mouse at an option to display its description. + وجّه الماوس نحو خيار لعرض وصفه. - discordRPCCheckbox - تفعيل حالة الثراء في ديسكورد:\nيعرض أيقونة المحاكي ومعلومات ذات صلة على ملفك الشخصي في ديسكورد. + consoleLanguageGroupBox + لغة الجهاز:\nتحدد لغة اللعبة التي يستخدمها جهاز PS4.\nيوصى بضبطها على لغة يدعمها الجهاز، والتي قد تختلف حسب المنطقة. - userName - اسم المستخدم:\nيضبط اسم حساب PS4، الذي قد يتم عرضه في بعض الألعاب. + emulatorLanguageGroupBox + لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + fullscreenCheckBox + تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. - logTypeGroupBox - نوع السجل:\nيضبط ما إذا كان سيتم مزامنة مخرجات نافذة السجل للأداء. قد يؤثر سلبًا على المحاكاة. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logFilter - فلتر السجل:\nيقوم بتصفية السجل لطباعة معلومات محددة فقط.\nأمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده. + showSplashCheckBox + إظهار شاشة البداية:\nيعرض شاشة البداية الخاصة باللعبة (صورة خاصة) أثناء بدء التشغيل. - updaterGroupBox - تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. + discordRPCCheckbox + تفعيل حالة الثراء في ديسكورد:\nيعرض أيقونة المحاكي ومعلومات ذات صلة على ملفك الشخصي في ديسكورد. - GUIMusicGroupBox - تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. + userName + اسم المستخدم:\nيضبط اسم حساب PS4، الذي قد يتم عرضه في بعض الألعاب. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - hideCursorGroupBox - إخفاء المؤشر:\nاختر متى سيختفي المؤشر:\nأبداً: سترى الفأرة دائماً.\nعاطل: حدد وقتاً لاختفائه بعد أن يكون غير مستخدم.\nدائماً: لن ترى الفأرة أبداً. + logTypeGroupBox + نوع السجل:\nيضبط ما إذا كان سيتم مزامنة مخرجات نافذة السجل للأداء. قد يؤثر سلبًا على المحاكاة. - idleTimeoutGroupBox - حدد وقتاً لاختفاء الفأرة بعد أن تكون غير مستخدم. + logFilter + فلتر السجل:\nيقوم بتصفية السجل لطباعة معلومات محددة فقط.\nأمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده. - backButtonBehaviorGroupBox - سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4. + updaterGroupBox + تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + GUIMusicGroupBox + تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Never - أبداً + hideCursorGroupBox + إخفاء المؤشر:\nاختر متى سيختفي المؤشر:\nأبداً: سترى الفأرة دائماً.\nعاطل: حدد وقتاً لاختفائه بعد أن يكون غير مستخدم.\nدائماً: لن ترى الفأرة أبداً. - Idle - خامل + idleTimeoutGroupBox + حدد وقتاً لاختفاء الفأرة بعد أن تكون غير مستخدم. - Always - دائماً + backButtonBehaviorGroupBox + سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4. - Touchpad Left - لوحة اللمس اليسرى + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Right - لوحة اللمس اليمنى + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Center - وسط لوحة اللمس + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - None - لا شيء + Never + أبداً - graphicsAdapterGroupBox - جهاز الرسومات:\nعلى الأنظمة متعددة وحدات معالجة الرسومات، اختر وحدة معالجة الرسومات التي سيستخدمها المحاكي من قائمة منسدلة،\nأو اختر "Auto Select" لتحديدها تلقائيًا. + Idle + خامل - resolutionLayout - العرض / الارتفاع:\nيضبط حجم نافذة المحاكي عند التشغيل، والذي يمكن تغيير حجمه أثناء اللعب.\nهذا يختلف عن دقة اللعبة نفسها. + Always + دائماً - heightDivider - مقسم معدل التحديث:\nيتم مضاعفة معدل الإطارات الذي يتم تحديث المحاكي به بواسطة هذا الرقم. قد يؤدي تغيير هذا إلى آثار سلبية، مثل زيادة سرعة اللعبة أو كسر الوظائف الأساسية التي لا تتوقع هذا التغيير! + Touchpad Left + لوحة اللمس اليسرى - dumpShadersCheckBox - تمكين تفريغ الـ Shaders:\nلأغراض تصحيح الأخطاء التقنية، يحفظ الـ Shaders الخاصة باللعبة في مجلد أثناء التشغيل. + Touchpad Right + لوحة اللمس اليمنى - nullGpuCheckBox - تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات. + Touchpad Center + وسط لوحة اللمس - gameFoldersBox - مجلدات اللعبة:\nقائمة بالمجلدات للتحقق من الألعاب المثبتة. + None + لا شيء - addFolderButton - إضافة:\nأضف مجلداً إلى القائمة. + graphicsAdapterGroupBox + جهاز الرسومات:\nعلى الأنظمة متعددة وحدات معالجة الرسومات، اختر وحدة معالجة الرسومات التي سيستخدمها المحاكي من قائمة منسدلة،\nأو اختر "Auto Select" لتحديدها تلقائيًا. - removeFolderButton - إزالة:\nأزل مجلداً من القائمة. + resolutionLayout + العرض / الارتفاع:\nيضبط حجم نافذة المحاكي عند التشغيل، والذي يمكن تغيير حجمه أثناء اللعب.\nهذا يختلف عن دقة اللعبة نفسها. - debugDump - تمكين تفريغ التصحيح:\nيحفظ رموز الاستيراد والتصدير ومعلومات رأس الملف للبرنامج الحالي لجهاز PS4 إلى دليل. + heightDivider + مقسم معدل التحديث:\nيتم مضاعفة معدل الإطارات الذي يتم تحديث المحاكي به بواسطة هذا الرقم. قد يؤدي تغيير هذا إلى آثار سلبية، مثل زيادة سرعة اللعبة أو كسر الوظائف الأساسية التي لا تتوقع هذا التغيير! - vkValidationCheckBox - تمكين طبقات التحقق من Vulkan:\nيتيح نظام يتحقق من حالة مشغل Vulkan ويسجل معلومات حول حالته الداخلية. سيؤدي هذا إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. + dumpShadersCheckBox + تمكين تفريغ الـ Shaders:\nلأغراض تصحيح الأخطاء التقنية، يحفظ الـ Shaders الخاصة باللعبة في مجلد أثناء التشغيل. - vkSyncValidationCheckBox - تمكين التحقق من تزامن Vulkan:\nيتيح نظام يتحقق من توقيت مهام عرض Vulkan. سيؤدي ذلك إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. + nullGpuCheckBox + تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات. - rdocCheckBox - تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. + enableHDRCheckBox + enableHDRCheckBox - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + gameFoldersBox + مجلدات اللعبة:\nقائمة بالمجلدات للتحقق من الألعاب المثبتة. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + addFolderButton + إضافة:\nأضف مجلداً إلى القائمة. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + removeFolderButton + إزالة:\nأزل مجلداً من القائمة. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + debugDump + تمكين تفريغ التصحيح:\nيحفظ رموز الاستيراد والتصدير ومعلومات رأس الملف للبرنامج الحالي لجهاز PS4 إلى دليل. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + تمكين طبقات التحقق من Vulkan:\nيتيح نظام يتحقق من حالة مشغل Vulkan ويسجل معلومات حول حالته الداخلية. سيؤدي هذا إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - Borderless - + vkSyncValidationCheckBox + تمكين التحقق من تزامن Vulkan:\nيتيح نظام يتحقق من توقيت مهام عرض Vulkan. سيؤدي ذلك إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - True - + rdocCheckBox + تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. - Enable HDR - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Release - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Nightly - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Always Show Changelog - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - تصفح + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - مجلد تثبيت الألعاب + Browse + تصفح - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + مجلد تثبيت الألعاب - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - عارض الجوائز + Trophy Viewer + عارض الجوائز - + diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 17d34bc3b..ed9e854a3 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Ingen billede tilgængelig + No Image Available + Ingen billede tilgængelig - Serial: - Serienummer: + Serial: + Serienummer: - Version: - Version: + Version: + Version: - Size: - Størrelse: + Size: + Størrelse: - Select Cheat File: - Vælg snyd-fil: + Select Cheat File: + Vælg snyd-fil: - Repository: - Repository: + Repository: + Repository: - Download Cheats - Hent snyd + Download Cheats + Hent snyd - Delete File - Slet fil + Delete File + Slet fil - No files selected. - Ingen filer valgt. + No files selected. + Ingen filer valgt. - You can delete the cheats you don't want after downloading them. - Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. + You can delete the cheats you don't want after downloading them. + Du kan slette de snyd, du ikke ønsker, efter at have hentet dem. - Do you want to delete the selected file?\n%1 - Ønsker du at slette den valgte fil?\n%1 + Do you want to delete the selected file?\n%1 + Ønsker du at slette den valgte fil?\n%1 - Select Patch File: - Vælg patch-fil: + Select Patch File: + Vælg patch-fil: - Download Patches - Hent patches + Download Patches + Hent patches - Save - Gem + Save + Gem - Cheats - Snyd + Cheats + Snyd - Patches - Patches + Patches + Patches - Error - Fejl + Error + Fejl - No patch selected. - Ingen patch valgt. + No patch selected. + Ingen patch valgt. - Unable to open files.json for reading. - Kan ikke åbne files.json til læsning. + Unable to open files.json for reading. + Kan ikke åbne files.json til læsning. - No patch file found for the current serial. - Ingen patch-fil fundet for det nuværende serienummer. + No patch file found for the current serial. + Ingen patch-fil fundet for det nuværende serienummer. - Unable to open the file for reading. - Kan ikke åbne filen til læsning. + Unable to open the file for reading. + Kan ikke åbne filen til læsning. - Unable to open the file for writing. - Kan ikke åbne filen til skrivning. + Unable to open the file for writing. + Kan ikke åbne filen til skrivning. - Failed to parse XML: - Kunne ikke analysere XML: + Failed to parse XML: + Kunne ikke analysere XML: - Success - Succes + Success + Succes - Options saved successfully. - Indstillinger gemt med succes. + Options saved successfully. + Indstillinger gemt med succes. - Invalid Source - Ugyldig kilde + Invalid Source + Ugyldig kilde - The selected source is invalid. - Den valgte kilde er ugyldig. + The selected source is invalid. + Den valgte kilde er ugyldig. - File Exists - Fil findes + File Exists + Fil findes - File already exists. Do you want to replace it? - Filen findes allerede. Vil du erstatte den? + File already exists. Do you want to replace it? + Filen findes allerede. Vil du erstatte den? - Failed to save file: - Kunne ikke gemme fil: + Failed to save file: + Kunne ikke gemme fil: - Failed to download file: - Kunne ikke hente fil: + Failed to download file: + Kunne ikke hente fil: - Cheats Not Found - Snyd ikke fundet + Cheats Not Found + Snyd ikke fundet - CheatsNotFound_MSG - Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. + CheatsNotFound_MSG + Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. - Cheats Downloaded Successfully - Snyd hentet med succes + Cheats Downloaded Successfully + Snyd hentet med succes - CheatsDownloadedSuccessfully_MSG - Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. + CheatsDownloadedSuccessfully_MSG + Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. - Failed to save: - Kunne ikke gemme: + Failed to save: + Kunne ikke gemme: - Failed to download: - Kunne ikke hente: + Failed to download: + Kunne ikke hente: - Download Complete - Download fuldført + Download Complete + Download fuldført - DownloadComplete_MSG - Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. + DownloadComplete_MSG + Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. - The game is in version: %1 - Spillet er i version: %1 + The game is in version: %1 + Spillet er i version: %1 - The downloaded patch only works on version: %1 - Den downloadede patch fungerer kun på version: %1 + The downloaded patch only works on version: %1 + Den downloadede patch fungerer kun på version: %1 - You may need to update your game. - Du skal muligvis opdatere dit spil. + You may need to update your game. + Du skal muligvis opdatere dit spil. - Incompatibility Notice - Uforenelighedsmeddelelse + Incompatibility Notice + Uforenelighedsmeddelelse - Failed to open file: - Kunne ikke åbne fil: + Failed to open file: + Kunne ikke åbne fil: - XML ERROR: - XML FEJL: + XML ERROR: + XML FEJL: - Failed to open files.json for writing - Kunne ikke åbne files.json til skrivning + Failed to open files.json for writing + Kunne ikke åbne files.json til skrivning - Author: - Forfatter: + Author: + Forfatter: - Directory does not exist: - Mappe findes ikke: + Directory does not exist: + Mappe findes ikke: - Failed to open files.json for reading. - Kunne ikke åbne files.json til læsning. + Failed to open files.json for reading. + Kunne ikke åbne files.json til læsning. - Name: - Navn: + Name: + Navn: - Can't apply cheats before the game is started - Kan ikke anvende snyd før spillet er startet. + Can't apply cheats before the game is started + Kan ikke anvende snyd før spillet er startet. - Close - Luk + Close + Luk - - + + CheckUpdate - Auto Updater - Automatisk opdatering + Auto Updater + Automatisk opdatering - Error - Fejl + Error + Fejl - Network error: - Netsværksfejl: + Network error: + Netsværksfejl: - Error_Github_limit_MSG - Autoopdateren tillader op til 60 opdateringstjek i timen.\nDu har nået denne grænse. Prøv igen senere. + Error_Github_limit_MSG + Autoopdateren tillader op til 60 opdateringstjek i timen.\nDu har nået denne grænse. Prøv igen senere. - Failed to parse update information. - Kunne ikke analysere opdateringsoplysninger. + Failed to parse update information. + Kunne ikke analysere opdateringsoplysninger. - No pre-releases found. - Ingen forhåndsudgivelser fundet. + No pre-releases found. + Ingen forhåndsudgivelser fundet. - Invalid release data. - Ugyldige udgivelsesdata. + Invalid release data. + Ugyldige udgivelsesdata. - No download URL found for the specified asset. - Ingen download-URL fundet for den specificerede aktiver. + No download URL found for the specified asset. + Ingen download-URL fundet for den specificerede aktiver. - Your version is already up to date! - Din version er allerede opdateret! + Your version is already up to date! + Din version er allerede opdateret! - Update Available - Opdatering tilgængelig + Update Available + Opdatering tilgængelig - Update Channel - Opdateringskanal + Update Channel + Opdateringskanal - Current Version - Nuværende version + Current Version + Nuværende version - Latest Version - Nyeste version + Latest Version + Nyeste version - Do you want to update? - Vil du opdatere? + Do you want to update? + Vil du opdatere? - Show Changelog - Vis ændringslog + Show Changelog + Vis ændringslog - Check for Updates at Startup - Tjek for opdateringer ved start + Check for Updates at Startup + Tjek for opdateringer ved start - Update - Opdater + Update + Opdater - No - Nej + No + Nej - Hide Changelog - Skjul ændringslog + Hide Changelog + Skjul ændringslog - Changes - Ændringer + Changes + Ændringer - Network error occurred while trying to access the URL - Netsværksfejl opstod, mens der blev forsøgt at få adgang til URL'en + Network error occurred while trying to access the URL + Netsværksfejl opstod, mens der blev forsøgt at få adgang til URL'en - Download Complete - Download fuldført + Download Complete + Download fuldført - The update has been downloaded, press OK to install. - Opdateringen er blevet downloadet, tryk på OK for at installere. + The update has been downloaded, press OK to install. + Opdateringen er blevet downloadet, tryk på OK for at installere. - Failed to save the update file at - Kunne ikke gemme opdateringsfilen på + Failed to save the update file at + Kunne ikke gemme opdateringsfilen på - Starting Update... - Starter opdatering... + Starting Update... + Starter opdatering... - Failed to create the update script file - Kunne ikke oprette opdateringsscriptfilen + Failed to create the update script file + Kunne ikke oprette opdateringsscriptfilen - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Henter kompatibilitetsdata, vent venligst + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vent venligst - Cancel - Annuller + Cancel + Annuller - Loading... - Indlæser... + Loading... + Indlæser... - Error - Fejl + Error + Fejl - Unable to update compatibility data! Try again later. - Kan ikke opdatere kompatibilitetsdata! Prøv igen senere. + Unable to update compatibility data! Try again later. + Kan ikke opdatere kompatibilitetsdata! Prøv igen senere. - Unable to open compatibility_data.json for writing. - Kan ikke åbne compatibility_data.json til skrivning. + Unable to open compatibility_data.json for writing. + Kan ikke åbne compatibility_data.json til skrivning. - Unknown - Ukendt + Unknown + Ukendt - Nothing - Intet + Nothing + Intet - Boots - Støvler + Boots + Støvler - Menus - Menuer + Menus + Menuer - Ingame - I spillet + Ingame + I spillet - Playable - Spilbar + Playable + Spilbar - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikon + Icon + Ikon - Name - Navn + Name + Navn - Serial - Seriel + Serial + Seriel - Compatibility - Compatibility + Compatibility + Compatibility - Region - Region + Region + Region - Firmware - Firmware + Firmware + Firmware - Size - Størrelse + Size + Størrelse - Version - Version + Version + Version - Path - Sti + Path + Sti - Play Time - Spilletid + Play Time + Spilletid - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Klik for at se detaljer på GitHub + Click to see details on github + Klik for at se detaljer på GitHub - Last updated - Sidst opdateret + Last updated + Sidst opdateret - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - Cheats / Patches - Trick / Patches + Cheats / Patches + Trick / Patches - SFO Viewer - SFO Viewer + SFO Viewer + SFO Viewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - Open Folder... - Åbn Mappe... + Open Folder... + Åbn Mappe... - Open Game Folder - Åbn Spilmappe + Open Game Folder + Åbn Spilmappe - Open Save Data Folder - Åbn Gem Data Mappe + Open Save Data Folder + Åbn Gem Data Mappe - Open Log Folder - Åbn Log Mappe + Open Log Folder + Åbn Log Mappe - Copy info... - Copy info... + Copy info... + Copy info... - Copy Name - Copy Name + Copy Name + Copy Name - Copy Serial - Copy Serial + Copy Serial + Copy Serial - Copy All - Copy All + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copy All - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Shortcut creation + View report + View report - Shortcut created successfully! - Shortcut created successfully! + Submit a report + Submit a report - Error - Error + Shortcut creation + Shortcut creation - Error creating shortcut! - Error creating shortcut! + Shortcut created successfully! + Shortcut created successfully! - Install PKG - Install PKG + Error + Error - Game - Game + Error creating shortcut! + Error creating shortcut! - This game has no update to delete! - This game has no update to delete! + Install PKG + Install PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Tjek for opdateringer + Check for Updates + Tjek for opdateringer - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Download Tricks / Patches + Download Cheats/Patches + Download Tricks / Patches - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Hjælp + Help + Hjælp - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Spiloversigt + Game List + Spiloversigt - * Unsupported Vulkan Version - * Ikke understøttet Vulkan-version + * Unsupported Vulkan Version + * Ikke understøttet Vulkan-version - Download Cheats For All Installed Games - Hent snyd til alle installerede spil + Download Cheats For All Installed Games + Hent snyd til alle installerede spil - Download Patches For All Games - Hent patches til alle spil + Download Patches For All Games + Hent patches til alle spil - Download Complete - Download fuldført + Download Complete + Download fuldført - You have downloaded cheats for all the games you have installed. - Du har hentet snyd til alle de spil, du har installeret. + You have downloaded cheats for all the games you have installed. + Du har hentet snyd til alle de spil, du har installeret. - Patches Downloaded Successfully! - Patcher hentet med succes! + Patches Downloaded Successfully! + Patcher hentet med succes! - All Patches available for all games have been downloaded. - Alle patches til alle spil er blevet hentet. + All Patches available for all games have been downloaded. + Alle patches til alle spil er blevet hentet. - Games: - Spil: + Games: + Spil: - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) - Game Boot - Spil-boot + Game Boot + Spil-boot - Only one file can be selected! - Kun én fil kan vælges! + Only one file can be selected! + Kun én fil kan vælges! - PKG Extraction - PKG-udtrækning + PKG Extraction + PKG-udtrækning - Patch detected! - Opdatering detekteret! + Patch detected! + Opdatering detekteret! - PKG and Game versions match: - PKG og spilversioner matcher: + PKG and Game versions match: + PKG og spilversioner matcher: - Would you like to overwrite? - Vil du overskrive? + Would you like to overwrite? + Vil du overskrive? - PKG Version %1 is older than installed version: - PKG Version %1 er ældre end den installerede version: + PKG Version %1 is older than installed version: + PKG Version %1 er ældre end den installerede version: - Game is installed: - Spillet er installeret: + Game is installed: + Spillet er installeret: - Would you like to install Patch: - Vil du installere opdateringen: + Would you like to install Patch: + Vil du installere opdateringen: - DLC Installation - DLC Installation + DLC Installation + DLC Installation - Would you like to install DLC: %1? - Vil du installere DLC: %1? + Would you like to install DLC: %1? + Vil du installere DLC: %1? - DLC already installed: - DLC allerede installeret: + DLC already installed: + DLC allerede installeret: - Game already installed - Spillet er allerede installeret + Game already installed + Spillet er allerede installeret - PKG ERROR - PKG FEJL + PKG ERROR + PKG FEJL - Extracting PKG %1/%2 - Udvinding af PKG %1/%2 + Extracting PKG %1/%2 + Udvinding af PKG %1/%2 - Extraction Finished - Udvinding afsluttet + Extraction Finished + Udvinding afsluttet - Game successfully installed at %1 - Spillet blev installeret succesfuldt på %1 + Game successfully installed at %1 + Spillet blev installeret succesfuldt på %1 - File doesn't appear to be a valid PKG file - Filen ser ikke ud til at være en gyldig PKG-fil + File doesn't appear to be a valid PKG file + Filen ser ikke ud til at være en gyldig PKG-fil - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Navn + PKG ERROR + PKG FEJL - Serial - Seriel + Name + Navn - Installed - + Serial + Seriel - Size - Størrelse + Installed + Installed - Category - + Size + Størrelse - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Region + FW + FW - Flags - + Region + Region - Path - Sti + Flags + Flags - File - File + Path + Sti - PKG ERROR - PKG FEJL + File + File - Unknown - Ukendt + Unknown + Ukendt - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - Fuldskærmstilstand + Fullscreen Mode + Fuldskærmstilstand - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Standardfaneblad ved åbning af indstillinger + Default tab when opening settings + Standardfaneblad ved åbning af indstillinger - Show Game Size In List - Vis vis spilstørrelse i listen + Show Game Size In List + Vis vis spilstørrelse i listen - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Aktiver Discord Rich Presence + Enable Discord Rich Presence + Aktiver Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - Åbn logplacering + Open Log Location + Åbn logplacering - Input - Indtastning + Input + Indtastning - Cursor - Markør + Cursor + Markør - Hide Cursor - Skjul markør + Hide Cursor + Skjul markør - Hide Cursor Idle Timeout - Timeout for skjul markør ved inaktivitet + Hide Cursor Idle Timeout + Timeout for skjul markør ved inaktivitet - s - s + s + s - Controller - Controller + Controller + Controller - Back Button Behavior - Tilbageknap adfærd + Back Button Behavior + Tilbageknap adfærd - Graphics - Graphics + Graphics + Graphics - GUI - Interface + GUI + Interface - User - Bruger + User + Bruger - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Stier + Enable HDR + Enable HDR - Game Folders - Spilmapper + Paths + Stier - Add... - Tilføj... + Game Folders + Spilmapper - Remove - Fjern + Add... + Tilføj... - Debug - Debug + Remove + Fjern - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Opdatering + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Tjek for opdateringer ved start + Update + Opdatering - Always Show Changelog - Vis altid changelog + Check for Updates at Startup + Tjek for opdateringer ved start - Update Channel - Opdateringskanal + Always Show Changelog + Vis altid changelog - Check for Updates - Tjek for opdateringer + Update Channel + Opdateringskanal - GUI Settings - GUI-Indstillinger + Check for Updates + Tjek for opdateringer - Title Music - Title Music + GUI Settings + GUI-Indstillinger - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Afspil titelsang + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Afspil titelsang - Volume - Lydstyrke + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Gem + Game Compatibility + Game Compatibility - Apply - Anvend + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Gendan standardindstillinger + Update Compatibility Database + Update Compatibility Database - Close - Luk + Volume + Lydstyrke - Point your mouse at an option to display its description. - Peg musen over et valg for at vise dets beskrivelse. + Save + Gem - consoleLanguageGroupBox - Konsolsprog:\nIndstiller sproget, som PS4-spillet bruger.\nDet anbefales at indstille dette til et sprog, som spillet understøtter, hvilket kan variere efter region. + Apply + Anvend - emulatorLanguageGroupBox - Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. + Restore Defaults + Gendan standardindstillinger - fullscreenCheckBox - Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. + Close + Luk - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Peg musen over et valg for at vise dets beskrivelse. - showSplashCheckBox - Vis startskærm:\nViser en startskærm (speciel grafik) under opstarten. + consoleLanguageGroupBox + Konsolsprog:\nIndstiller sproget, som PS4-spillet bruger.\nDet anbefales at indstille dette til et sprog, som spillet understøtter, hvilket kan variere efter region. - discordRPCCheckbox - Aktiver Discord Rich Presence:\nViser emulatorikonet og relevante oplysninger på din Discord-profil. + emulatorLanguageGroupBox + Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. - userName - Brugernavn:\nIndstiller PS4-kontoens navn, som kan blive vist i nogle spil. + fullscreenCheckBox + Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Logtype:\nIndstiller, om logvinduets output vil blive synkroniseret for at øge ydeevnen. Dette kan påvirke emulatorens ydeevne negativt. + showSplashCheckBox + Vis startskærm:\nViser en startskærm (speciel grafik) under opstarten. - logFilter - Logfilter:\nFiltrerer loggen for kun at udskrive bestemte oplysninger.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer. + discordRPCCheckbox + Aktiver Discord Rich Presence:\nViser emulatorikonet og relevante oplysninger på din Discord-profil. - updaterGroupBox - Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. + userName + Brugernavn:\nIndstiller PS4-kontoens navn, som kan blive vist i nogle spil. - GUIMusicGroupBox - Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Logtype:\nIndstiller, om logvinduets output vil blive synkroniseret for at øge ydeevnen. Dette kan påvirke emulatorens ydeevne negativt. - hideCursorGroupBox - Skjul Cursor:\nVælg hvornår cursoren skal forsvinde:\nAldrig: Du vil altid se musen.\nInaktiv: Indstil en tid for, hvornår den skal forsvinde efter at være inaktiv.\nAltid: du vil aldrig se musen. + logFilter + Logfilter:\nFiltrerer loggen for kun at udskrive bestemte oplysninger.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer. - idleTimeoutGroupBox - Indstil en tid for, at musen skal forsvinde efter at være inaktiv. + updaterGroupBox + Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. - backButtonBehaviorGroupBox - Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk på den angivne position på PS4 berøringsflade. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Skjul Cursor:\nVælg hvornår cursoren skal forsvinde:\nAldrig: Du vil altid se musen.\nInaktiv: Indstil en tid for, hvornår den skal forsvinde efter at være inaktiv.\nAltid: du vil aldrig se musen. - Never - Aldrig + idleTimeoutGroupBox + Indstil en tid for, at musen skal forsvinde efter at være inaktiv. - Idle - Inaktiv + backButtonBehaviorGroupBox + Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk på den angivne position på PS4 berøringsflade. - Always - Altid + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Berøringsplade Venstre + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Berøringsplade Højre + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Berøringsplade Center + Never + Aldrig - None - Ingen + Idle + Inaktiv - graphicsAdapterGroupBox - Grafikadapter:\nPå systemer med flere GPU'er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge "Auto Select" for at vælge den automatisk. + Always + Altid - resolutionLayout - Skærmopløsning:\nIndstiller emulatorvinduets størrelse under afspilning, som kan ændres under afspilning.\nDette er forskelligt fra selve spillets opløsning. + Touchpad Left + Berøringsplade Venstre - heightDivider - Opdateringshastighedsdeler:\nMultiplicerer den frekvens, som emulatoren opdaterer billedet med, med dette tal. Ændring af dette kan have negative effekter, såsom hurtigere spil eller ødelagte funktioner! + Touchpad Right + Berøringsplade Højre - dumpShadersCheckBox - Aktiver dumping af Shaders:\nTil teknisk fejlfinding gemmer det spillets shaders i en mappe under afspilning. + Touchpad Center + Berøringsplade Center - nullGpuCheckBox - Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort. + None + Ingen - gameFoldersBox - Spilmappen:\nListen over mapper til at tjekke for installerede spil. + graphicsAdapterGroupBox + Grafikadapter:\nPå systemer med flere GPU'er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge "Auto Select" for at vælge den automatisk. - addFolderButton - Tilføj:\nTilføj en mappe til listen. + resolutionLayout + Skærmopløsning:\nIndstiller emulatorvinduets størrelse under afspilning, som kan ændres under afspilning.\nDette er forskelligt fra selve spillets opløsning. - removeFolderButton - Fjern:\nFjern en mappe fra listen. + heightDivider + Opdateringshastighedsdeler:\nMultiplicerer den frekvens, som emulatoren opdaterer billedet med, med dette tal. Ændring af dette kan have negative effekter, såsom hurtigere spil eller ødelagte funktioner! - debugDump - Aktiver debugging-dump:\nGemmer import/export-symboler og headeroplysninger for det aktuelle PS4-program til en mappe. + dumpShadersCheckBox + Aktiver dumping af Shaders:\nTil teknisk fejlfinding gemmer det spillets shaders i en mappe under afspilning. - vkValidationCheckBox - Aktiver Vulkan-valideringslag:\nAktiverer et system, der validerer Vulkan-driverens tilstand og logger oplysninger om dens interne tilstand. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. + nullGpuCheckBox + Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort. - vkSyncValidationCheckBox - Aktiver Vulkan-synkroniseringsvalidering:\nAktiverer et system, der validerer tidspunktet for Vulkan's renderingsopgaver. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. + gameFoldersBox + Spilmappen:\nListen over mapper til at tjekke for installerede spil. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Tilføj:\nTilføj en mappe til listen. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Fjern:\nFjern en mappe fra listen. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Aktiver debugging-dump:\nGemmer import/export-symboler og headeroplysninger for det aktuelle PS4-program til en mappe. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Aktiver Vulkan-valideringslag:\nAktiverer et system, der validerer Vulkan-driverens tilstand og logger oplysninger om dens interne tilstand. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Aktiver Vulkan-synkroniseringsvalidering:\nAktiverer et system, der validerer tidspunktet for Vulkan's renderingsopgaver. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - Borderless - + rdocCheckBox + Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 4a9ab1a8d..696c434d1 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Über shadPS4 + About shadPS4 + Über shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. - This software should not be used to play games you have not legally obtained. - Diese Software soll nicht dazu benutzt werden illegal kopierte Spiele zu spielen. + This software should not be used to play games you have not legally obtained. + Diese Software soll nicht dazu benutzt werden illegal kopierte Spiele zu spielen. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches für + Cheats / Patches for + Cheats / Patches für - defaultTextEdit_MSG - Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Kein Bild verfügbar + No Image Available + Kein Bild verfügbar - Serial: - Seriennummer: + Serial: + Seriennummer: - Version: - Version: + Version: + Version: - Size: - Größe: + Size: + Größe: - Select Cheat File: - Cheat-Datei auswählen: + Select Cheat File: + Cheat-Datei auswählen: - Repository: - Repository: + Repository: + Repository: - Download Cheats - Cheats herunterladen + Download Cheats + Cheats herunterladen - Delete File - Datei löschen + Delete File + Datei löschen - No files selected. - Keine Dateien ausgewählt. + No files selected. + Keine Dateien ausgewählt. - You can delete the cheats you don't want after downloading them. - Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. + You can delete the cheats you don't want after downloading them. + Du kannst die Cheats, die du nicht möchtest, nach dem Herunterladen löschen. - Do you want to delete the selected file?\n%1 - Willst du die ausgewählte Datei löschen?\n%1 + Do you want to delete the selected file?\n%1 + Willst du die ausgewählte Datei löschen?\n%1 - Select Patch File: - Patch-Datei auswählen: + Select Patch File: + Patch-Datei auswählen: - Download Patches - Patches herunterladen + Download Patches + Patches herunterladen - Save - Speichern + Save + Speichern - Cheats - Cheats + Cheats + Cheats - Patches - Patches + Patches + Patches - Error - Fehler + Error + Fehler - No patch selected. - Kein Patch ausgewählt. + No patch selected. + Kein Patch ausgewählt. - Unable to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. + Unable to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. - No patch file found for the current serial. - Keine Patch-Datei für die aktuelle Seriennummer gefunden. + No patch file found for the current serial. + Keine Patch-Datei für die aktuelle Seriennummer gefunden. - Unable to open the file for reading. - Kann die Datei nicht zum Lesen öffnen. + Unable to open the file for reading. + Kann die Datei nicht zum Lesen öffnen. - Unable to open the file for writing. - Kann die Datei nicht zum Schreiben öffnen. + Unable to open the file for writing. + Kann die Datei nicht zum Schreiben öffnen. - Failed to parse XML: - Fehler beim Parsen von XML: + Failed to parse XML: + Fehler beim Parsen von XML: - Success - Erfolg + Success + Erfolg - Options saved successfully. - Optionen erfolgreich gespeichert. + Options saved successfully. + Optionen erfolgreich gespeichert. - Invalid Source - Ungültige Quelle + Invalid Source + Ungültige Quelle - The selected source is invalid. - Die ausgewählte Quelle ist ungültig. + The selected source is invalid. + Die ausgewählte Quelle ist ungültig. - File Exists - Datei existiert + File Exists + Datei existiert - File already exists. Do you want to replace it? - Datei existiert bereits. Möchtest du sie ersetzen? + File already exists. Do you want to replace it? + Datei existiert bereits. Möchtest du sie ersetzen? - Failed to save file: - Fehler beim Speichern der Datei: + Failed to save file: + Fehler beim Speichern der Datei: - Failed to download file: - Fehler beim Herunterladen der Datei: + Failed to download file: + Fehler beim Herunterladen der Datei: - Cheats Not Found - Cheats nicht gefunden + Cheats Not Found + Cheats nicht gefunden - CheatsNotFound_MSG - Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. + CheatsNotFound_MSG + Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. - Cheats Downloaded Successfully - Cheats erfolgreich heruntergeladen + Cheats Downloaded Successfully + Cheats erfolgreich heruntergeladen - CheatsDownloadedSuccessfully_MSG - Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. + CheatsDownloadedSuccessfully_MSG + Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. - Failed to save: - Speichern fehlgeschlagen: + Failed to save: + Speichern fehlgeschlagen: - Failed to download: - Herunterladen fehlgeschlagen: + Failed to download: + Herunterladen fehlgeschlagen: - Download Complete - Download abgeschlossen + Download Complete + Download abgeschlossen - DownloadComplete_MSG - Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. + DownloadComplete_MSG + Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. - Failed to parse JSON data from HTML. - Fehler beim Parsen der JSON-Daten aus HTML. + Failed to parse JSON data from HTML. + Fehler beim Parsen der JSON-Daten aus HTML. - Failed to retrieve HTML page. - Fehler beim Abrufen der HTML-Seite. + Failed to retrieve HTML page. + Fehler beim Abrufen der HTML-Seite. - The game is in version: %1 - Das Spiel ist in der Version: %1 + The game is in version: %1 + Das Spiel ist in der Version: %1 - The downloaded patch only works on version: %1 - Der heruntergeladene Patch funktioniert nur in der Version: %1 + The downloaded patch only works on version: %1 + Der heruntergeladene Patch funktioniert nur in der Version: %1 - You may need to update your game. - Sie müssen möglicherweise Ihr Spiel aktualisieren. + You may need to update your game. + Sie müssen möglicherweise Ihr Spiel aktualisieren. - Incompatibility Notice - Inkompatibilitätsbenachrichtigung + Incompatibility Notice + Inkompatibilitätsbenachrichtigung - Failed to open file: - Öffnung der Datei fehlgeschlagen: + Failed to open file: + Öffnung der Datei fehlgeschlagen: - XML ERROR: - XML-Fehler: + XML ERROR: + XML-Fehler: - Failed to open files.json for writing - Kann files.json nicht zum Schreiben öffnen + Failed to open files.json for writing + Kann files.json nicht zum Schreiben öffnen - Author: - Autor: + Author: + Autor: - Directory does not exist: - Verzeichnis existiert nicht: + Directory does not exist: + Verzeichnis existiert nicht: - Failed to open files.json for reading. - Kann files.json nicht zum Lesen öffnen. + Failed to open files.json for reading. + Kann files.json nicht zum Lesen öffnen. - Name: - Name: + Name: + Name: - Can't apply cheats before the game is started - Kann keine Cheats anwenden, bevor das Spiel gestartet ist. + Can't apply cheats before the game is started + Kann keine Cheats anwenden, bevor das Spiel gestartet ist. - Close - Schließen + Close + Schließen - - + + CheckUpdate - Auto Updater - Automatischer Aktualisierer + Auto Updater + Automatischer Aktualisierer - Error - Fehler + Error + Fehler - Network error: - Netzwerkfehler: + Network error: + Netzwerkfehler: - Error_Github_limit_MSG - Der Auto-Updater erlaubt bis zu 60 Update-Überprüfungen pro Stunde.\nDu hast dieses Limit erreicht. Bitte versuche es später erneut. + Error_Github_limit_MSG + Der Auto-Updater erlaubt bis zu 60 Update-Überprüfungen pro Stunde.\nDu hast dieses Limit erreicht. Bitte versuche es später erneut. - Failed to parse update information. - Fehler beim Parsen der Aktualisierungsinformationen. + Failed to parse update information. + Fehler beim Parsen der Aktualisierungsinformationen. - No pre-releases found. - Keine Vorabveröffentlichungen gefunden. + No pre-releases found. + Keine Vorabveröffentlichungen gefunden. - Invalid release data. - Ungültige Versionsdaten. + Invalid release data. + Ungültige Versionsdaten. - No download URL found for the specified asset. - Keine Download-URL für das angegebene Asset gefunden. + No download URL found for the specified asset. + Keine Download-URL für das angegebene Asset gefunden. - Your version is already up to date! - Ihre Version ist bereits aktuell! + Your version is already up to date! + Ihre Version ist bereits aktuell! - Update Available - Aktualisierung verfügbar + Update Available + Aktualisierung verfügbar - Update Channel - Update-Kanal + Update Channel + Update-Kanal - Current Version - Aktuelle Version + Current Version + Aktuelle Version - Latest Version - Neueste Version + Latest Version + Neueste Version - Do you want to update? - Möchten Sie aktualisieren? + Do you want to update? + Möchten Sie aktualisieren? - Show Changelog - Änderungsprotokoll anzeigen + Show Changelog + Änderungsprotokoll anzeigen - Check for Updates at Startup - Beim Start nach Updates suchen + Check for Updates at Startup + Beim Start nach Updates suchen - Update - Aktualisieren + Update + Aktualisieren - No - Nein + No + Nein - Hide Changelog - Änderungsprotokoll ausblenden + Hide Changelog + Änderungsprotokoll ausblenden - Changes - Änderungen + Changes + Änderungen - Network error occurred while trying to access the URL - Beim Zugriff auf die URL ist ein Netzwerkfehler aufgetreten + Network error occurred while trying to access the URL + Beim Zugriff auf die URL ist ein Netzwerkfehler aufgetreten - Download Complete - Download abgeschlossen + Download Complete + Download abgeschlossen - The update has been downloaded, press OK to install. - Die Aktualisierung wurde heruntergeladen, drücken Sie OK, um zu installieren. + The update has been downloaded, press OK to install. + Die Aktualisierung wurde heruntergeladen, drücken Sie OK, um zu installieren. - Failed to save the update file at - Fehler beim Speichern der Aktualisierungsdatei in + Failed to save the update file at + Fehler beim Speichern der Aktualisierungsdatei in - Starting Update... - Aktualisierung wird gestartet... + Starting Update... + Aktualisierung wird gestartet... - Failed to create the update script file - Fehler beim Erstellen der Aktualisierungs-Skriptdatei + Failed to create the update script file + Fehler beim Erstellen der Aktualisierungs-Skriptdatei - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Lade Kompatibilitätsdaten, bitte warten + Fetching compatibility data, please wait + Lade Kompatibilitätsdaten, bitte warten - Cancel - Abbrechen + Cancel + Abbrechen - Loading... - Lädt... + Loading... + Lädt... - Error - Fehler + Error + Fehler - Unable to update compatibility data! Try again later. - Kompatibilitätsdaten konnten nicht aktualisiert werden! Versuchen Sie es später erneut. + Unable to update compatibility data! Try again later. + Kompatibilitätsdaten konnten nicht aktualisiert werden! Versuchen Sie es später erneut. - Unable to open compatibility_data.json for writing. - Kann compatibility_data.json nicht zum Schreiben öffnen. + Unable to open compatibility_data.json for writing. + Kann compatibility_data.json nicht zum Schreiben öffnen. - Unknown - Unbekannt + Unknown + Unbekannt - Nothing - Nichts + Nothing + Nichts - Boots - Startet + Boots + Startet - Menus - Menüs + Menus + Menüs - Ingame - ImSpiel + Ingame + ImSpiel - Playable - Spielbar + Playable + Spielbar - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Ordner öffnen + Open Folder + Ordner öffnen - - + + GameInfoClass - Loading game list, please wait :3 - Lade Spielliste, bitte warten :3 + Loading game list, please wait :3 + Lade Spielliste, bitte warten :3 - Cancel - Abbrechen + Cancel + Abbrechen - Loading... - Lade... + Loading... + Lade... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Wähle Ordner + shadPS4 - Choose directory + shadPS4 - Wähle Ordner - Directory to install games - Installationsverzeichnis für Spiele + Directory to install games + Installationsverzeichnis für Spiele - Browse - Durchsuchen + Browse + Durchsuchen - Error - Fehler + Error + Fehler - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Symbol + Icon + Symbol - Name - Name + Name + Name - Serial - Seriennummer + Serial + Seriennummer - Compatibility - Kompatibilität + Compatibility + Kompatibilität - Region - Region + Region + Region - Firmware - Firmware + Firmware + Firmware - Size - Größe + Size + Größe - Version - Version + Version + Version - Path - Pfad + Path + Pfad - Play Time - Spielzeit + Play Time + Spielzeit - Never Played - Niemals gespielt + Never Played + Niemals gespielt - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Kompatibilität wurde noch nicht getested + Compatibility is untested + Kompatibilität wurde noch nicht getested - Game does not initialize properly / crashes the emulator - Das Spiel wird nicht richtig initialisiert / stürzt den Emulator ab + Game does not initialize properly / crashes the emulator + Das Spiel wird nicht richtig initialisiert / stürzt den Emulator ab - Game boots, but only displays a blank screen - Spiel startet, aber zeigt nur einen blanken Bildschirm + Game boots, but only displays a blank screen + Spiel startet, aber zeigt nur einen blanken Bildschirm - Game displays an image but does not go past the menu - Spiel zeigt ein Bild aber geht nicht über das Menü hinaus + Game displays an image but does not go past the menu + Spiel zeigt ein Bild aber geht nicht über das Menü hinaus - Game has game-breaking glitches or unplayable performance - Spiel hat spiel-brechende Störungen oder unspielbare Leistung + Game has game-breaking glitches or unplayable performance + Spiel hat spiel-brechende Störungen oder unspielbare Leistung - Game can be completed with playable performance and no major glitches - Spiel kann mit spielbarer Leistung und keinen großen Störungen abgeschlossen werden + Game can be completed with playable performance and no major glitches + Spiel kann mit spielbarer Leistung und keinen großen Störungen abgeschlossen werden - Click to see details on github - Klicken Sie hier, um Details auf GitHub zu sehen + Click to see details on github + Klicken Sie hier, um Details auf GitHub zu sehen - Last updated - Zuletzt aktualisiert + Last updated + Zuletzt aktualisiert - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Verknüpfung erstellen + Create Shortcut + Verknüpfung erstellen - Cheats / Patches - Cheats / Patches + Cheats / Patches + Cheats / Patches - SFO Viewer - SFO anzeigen + SFO Viewer + SFO anzeigen - Trophy Viewer - Trophäen anzeigen + Trophy Viewer + Trophäen anzeigen - Open Folder... - Ordner öffnen... + Open Folder... + Ordner öffnen... - Open Game Folder - Spielordner öffnen + Open Game Folder + Spielordner öffnen - Open Update Folder - Öffne Update-Ordner + Open Save Data Folder + Speicherordner öffnen - Open Save Data Folder - Speicherordner öffnen + Open Log Folder + Protokollordner öffnen - Open Log Folder - Protokollordner öffnen + Copy info... + Infos kopieren... - Copy info... - Infos kopieren... + Copy Name + Namen kopieren - Copy Name - Namen kopieren + Copy Serial + Seriennummer kopieren - Copy Serial - Seriennummer kopieren + Copy Version + Version kopieren - Copy Version - Version kopieren + Copy Size + Größe kopieren - Copy Size - Größe kopieren + Copy All + Alles kopieren - Copy All - Alles kopieren + Delete... + Löschen... - Delete... - Löschen... + Delete Game + Lösche Spiel - Delete Game - Lösche Spiel + Delete Update + Lösche Aktualisierung - Delete Update - Lösche Aktualisierung + Delete DLC + Lösche DLC - Delete Save Data - Lösche Speicherdaten + Compatibility... + Kompatibilität... - Delete DLC - Lösche DLC + Update database + Aktualisiere Datenbank - Compatibility... - Kompatibilität... + View report + Bericht ansehen - Update database - Aktualisiere Datenbank + Submit a report + Einen Bericht einreichen - View report - Bericht ansehen + Shortcut creation + Verknüpfungserstellung - Submit a report - Einen Bericht einreichen + Shortcut created successfully! + Verknüpfung erfolgreich erstellt! - Shortcut creation - Verknüpfungserstellung + Error + Fehler - Shortcut created successfully! - Verknüpfung erfolgreich erstellt! + Error creating shortcut! + Fehler beim Erstellen der Verknüpfung! - Error - Fehler + Install PKG + PKG installieren - Error creating shortcut! - Fehler beim Erstellen der Verknüpfung! + Game + Spiel - Install PKG - PKG installieren + This game has no update to delete! + Dieses Spiel hat keine Aktualisierung zum löschen! - Game - Spiel + Update + Aktualisieren - This game has no update to delete! - Dieses Spiel hat keine Aktualisierung zum löschen! + This game has no DLC to delete! + Dieses Spiel hat kein DLC zum aktualisieren! - Update - Aktualisieren + DLC + DLC - This game has no DLC to delete! - Dieses Spiel hat kein DLC zum aktualisieren! + Delete %1 + Lösche %1 - DLC - DLC + Are you sure you want to delete %1's %2 directory? + Sind Sie sicher dass Sie %1 %2 Ordner löschen wollen? - Delete %1 - Lösche %1 + Open Update Folder + Öffne Update-Ordner - Are you sure you want to delete %1's %2 directory? - Sind Sie sicher dass Sie %1 %2 Ordner löschen wollen? + Delete Save Data + Lösche Speicherdaten - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Wähle Ordner + shadPS4 - Choose directory + shadPS4 - Wähle Ordner - Select which directory you want to install to. - Wählen Sie das Verzeichnis aus, in das Sie installieren möchten. + Select which directory you want to install to. + Wählen Sie das Verzeichnis aus, in das Sie installieren möchten. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Elf-Ordner öffnen/hinzufügen + Open/Add Elf Folder + Elf-Ordner öffnen/hinzufügen - Install Packages (PKG) - Pakete installieren (PKG) + Install Packages (PKG) + Pakete installieren (PKG) - Boot Game - Spiel starten + Boot Game + Spiel starten - Check for Updates - Nach Updates suchen + Check for Updates + Nach Updates suchen - About shadPS4 - Über shadPS4 + About shadPS4 + Über shadPS4 - Configure... - Konfigurieren... + Configure... + Konfigurieren... - Install application from a .pkg file - Installiere Anwendung aus .pkg-Datei + Install application from a .pkg file + Installiere Anwendung aus .pkg-Datei - Recent Games - Zuletzt gespielt + Recent Games + Zuletzt gespielt - Open shadPS4 Folder - Öffne shadPS4 Ordner + Open shadPS4 Folder + Öffne shadPS4 Ordner - Exit - Beenden + Exit + Beenden - Exit shadPS4 - shadPS4 beenden + Exit shadPS4 + shadPS4 beenden - Exit the application. - Die Anwendung beenden. + Exit the application. + Die Anwendung beenden. - Show Game List - Spielliste anzeigen + Show Game List + Spielliste anzeigen - Game List Refresh - Spielliste aktualisieren + Game List Refresh + Spielliste aktualisieren - Tiny - Winzig + Tiny + Winzig - Small - Klein + Small + Klein - Medium - Mittel + Medium + Mittel - Large - Groß + Large + Groß - List View - Listenansicht + List View + Listenansicht - Grid View - Gitteransicht + Grid View + Gitteransicht - Elf Viewer - Elf-Ansicht + Elf Viewer + Elf-Ansicht - Game Install Directory - Installationsverzeichnis für Spiele + Game Install Directory + Installationsverzeichnis für Spiele - Download Cheats/Patches - Cheats/Patches herunterladen + Download Cheats/Patches + Cheats/Patches herunterladen - Dump Game List - Spielliste ausgeben + Dump Game List + Spielliste ausgeben - PKG Viewer - PKG-Anschauer + PKG Viewer + PKG-Anschauer - Search... - Suchen... + Search... + Suchen... - File - Datei + File + Datei - View - Ansicht + View + Ansicht - Game List Icons - Spiellisten-Symbole + Game List Icons + Spiellisten-Symbole - Game List Mode - Spiellisten-Modus + Game List Mode + Spiellisten-Modus - Settings - Einstellungen + Settings + Einstellungen - Utils - Werkzeuge + Utils + Werkzeuge - Themes - Stile + Themes + Stile - Help - Hilfe + Help + Hilfe - Dark - Dunkel + Dark + Dunkel - Light - Hell + Light + Hell - Green - Grün + Green + Grün - Blue - Blau + Blue + Blau - Violet - Violett + Violet + Violett - toolBar - Werkzeugleiste + toolBar + Werkzeugleiste - Game List - Spieleliste + Game List + Spieleliste - * Unsupported Vulkan Version - * Nicht unterstützte Vulkan-Version + * Unsupported Vulkan Version + * Nicht unterstützte Vulkan-Version - Download Cheats For All Installed Games - Cheats für alle installierten Spiele herunterladen + Download Cheats For All Installed Games + Cheats für alle installierten Spiele herunterladen - Download Patches For All Games - Patches für alle Spiele herunterladen + Download Patches For All Games + Patches für alle Spiele herunterladen - Download Complete - Download abgeschlossen + Download Complete + Download abgeschlossen - You have downloaded cheats for all the games you have installed. - Sie haben Cheats für alle installierten Spiele heruntergeladen. + You have downloaded cheats for all the games you have installed. + Sie haben Cheats für alle installierten Spiele heruntergeladen. - Patches Downloaded Successfully! - Patches erfolgreich heruntergeladen! + Patches Downloaded Successfully! + Patches erfolgreich heruntergeladen! - All Patches available for all games have been downloaded. - Alle Patches für alle Spiele wurden heruntergeladen. + All Patches available for all games have been downloaded. + Alle Patches für alle Spiele wurden heruntergeladen. - Games: - Spiele: + Games: + Spiele: - ELF files (*.bin *.elf *.oelf) - ELF-Dateien (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF-Dateien (*.bin *.elf *.oelf) - Game Boot - Spiel-Start + Game Boot + Spiel-Start - Only one file can be selected! - Es kann nur eine Datei ausgewählt werden! + Only one file can be selected! + Es kann nur eine Datei ausgewählt werden! - PKG Extraction - PKG-Extraktion + PKG Extraction + PKG-Extraktion - Patch detected! - Patch erkannt! + Patch detected! + Patch erkannt! - PKG and Game versions match: - PKG- und Spielversionen stimmen überein: + PKG and Game versions match: + PKG- und Spielversionen stimmen überein: - Would you like to overwrite? - Willst du überschreiben? + Would you like to overwrite? + Willst du überschreiben? - PKG Version %1 is older than installed version: - PKG-Version %1 ist älter als die installierte Version: + PKG Version %1 is older than installed version: + PKG-Version %1 ist älter als die installierte Version: - Game is installed: - Spiel ist installiert: + Game is installed: + Spiel ist installiert: - Would you like to install Patch: - Willst du den Patch installieren: + Would you like to install Patch: + Willst du den Patch installieren: - DLC Installation - DLC-Installation + DLC Installation + DLC-Installation - Would you like to install DLC: %1? - Willst du das DLC installieren: %1? + Would you like to install DLC: %1? + Willst du das DLC installieren: %1? - DLC already installed: - DLC bereits installiert: + DLC already installed: + DLC bereits installiert: - Game already installed - Spiel bereits installiert + Game already installed + Spiel bereits installiert - PKG ERROR - PKG-FEHLER + PKG ERROR + PKG-FEHLER - Extracting PKG %1/%2 - Extrahiere PKG %1/%2 + Extracting PKG %1/%2 + Extrahiere PKG %1/%2 - Extraction Finished - Extraktion abgeschlossen + Extraction Finished + Extraktion abgeschlossen - Game successfully installed at %1 - Spiel erfolgreich installiert auf %1 + Game successfully installed at %1 + Spiel erfolgreich installiert auf %1 - File doesn't appear to be a valid PKG file - Die Datei scheint keine gültige PKG-Datei zu sein + File doesn't appear to be a valid PKG file + Die Datei scheint keine gültige PKG-Datei zu sein - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Ordner öffnen + Open Folder + Ordner öffnen - Name - Name + PKG ERROR + PKG-FEHLER - Serial - Seriennummer + Name + Name - Installed - + Serial + Seriennummer - Size - Größe + Installed + Installed - Category - + Size + Größe - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Region + FW + FW - Flags - + Region + Region - Path - Pfad + Flags + Flags - File - Datei + Path + Pfad - PKG ERROR - PKG-FEHLER + File + Datei - Unknown - Unbekannt + Unknown + Unbekannt - Package - + Package + Package - - + + SettingsDialog - Save Data Path - Speicherdaten-Pfad + Settings + Einstellungen - Settings - Einstellungen + General + Allgemein - General - Allgemein + System + System - System - System + Console Language + Konsolensprache - Console Language - Konsolensprache + Emulator Language + Emulatorsprache - Emulator Language - Emulatorsprache + Emulator + Emulator - Emulator - Emulator + Enable Fullscreen + Vollbild aktivieren - Enable Fullscreen - Vollbild aktivieren + Fullscreen Mode + Vollbildmodus - Fullscreen Mode - Vollbildmodus + Enable Separate Update Folder + Separaten Update-Ordner aktivieren - Enable Separate Update Folder - Separaten Update-Ordner aktivieren + Default tab when opening settings + Standardregisterkarte beim Öffnen der Einstellungen - Default tab when opening settings - Standardregisterkarte beim Öffnen der Einstellungen + Show Game Size In List + Zeige Spielgröße in der Liste - Show Game Size In List - Zeige Spielgröße in der Liste + Show Splash + Startbildschirm anzeigen - Show Splash - Startbildschirm anzeigen + Enable Discord Rich Presence + Discord Rich Presence aktivieren - Enable Discord Rich Presence - Discord Rich Presence aktivieren + Username + Benutzername - Username - Benutzername + Trophy Key + Trophäenschlüssel - Trophy Key - Trophäenschlüssel + Trophy + Trophäe - Trophy - Trophäe + Logger + Logger - Logger - Logger + Log Type + Logtyp - Log Type - Logtyp + Log Filter + Log-Filter - Log Filter - Log-Filter + Open Log Location + Protokollspeicherort öffnen - Open Log Location - Protokollspeicherort öffnen + Input + Eingabe - Input - Eingabe + Cursor + Cursor - Enable Motion Controls - Aktiviere Bewegungssteuerung + Hide Cursor + Cursor ausblenden - Cursor - Cursor + Hide Cursor Idle Timeout + Inaktivitätszeitüberschreitung zum Ausblenden des Cursors - Hide Cursor - Cursor ausblenden + s + s - Hide Cursor Idle Timeout - Inaktivitätszeitüberschreitung zum Ausblenden des Cursors + Controller + Controller - s - s + Back Button Behavior + Verhalten der Zurück-Taste - Controller - Controller + Graphics + Grafik - Back Button Behavior - Verhalten der Zurück-Taste + GUI + Benutzeroberfläche - Graphics - Grafik + User + Benutzer - GUI - Benutzeroberfläche + Graphics Device + Grafikgerät - User - Benutzer + Width + Breite - Graphics Device - Grafikgerät + Height + Höhe - Width - Breite + Vblank Divider + Vblank-Teiler - Height - Höhe + Advanced + Erweitert - Vblank Divider - Vblank-Teiler + Enable Shaders Dumping + Shader-Dumping aktivieren - Advanced - Erweitert + Enable NULL GPU + NULL GPU aktivieren - Enable Shaders Dumping - Shader-Dumping aktivieren + Enable HDR + Enable HDR - Enable NULL GPU - NULL GPU aktivieren + Paths + Pfad - Paths - Pfad + Game Folders + Spieleordner - Game Folders - Spieleordner + Add... + Hinzufügen... - Add... - Hinzufügen... + Remove + Entfernen - Remove - Entfernen + Debug + Debug - Debug - Debug + Enable Debug Dumping + Debug-Dumping aktivieren - Enable Debug Dumping - Debug-Dumping aktivieren + Enable Vulkan Validation Layers + Vulkan Validations-Ebenen aktivieren - Enable Vulkan Validation Layers - Vulkan Validations-Ebenen aktivieren + Enable Vulkan Synchronization Validation + Vulkan Synchronisations-Validierung aktivieren - Enable Vulkan Synchronization Validation - Vulkan Synchronisations-Validierung aktivieren + Enable RenderDoc Debugging + RenderDoc-Debugging aktivieren - Enable RenderDoc Debugging - RenderDoc-Debugging aktivieren + Enable Crash Diagnostics + Absturz-Diagnostik aktivieren - Enable Crash Diagnostics - Absturz-Diagnostik aktivieren + Collect Shaders + Sammle Shader - Collect Shaders - Sammle Shader + Copy GPU Buffers + Kopiere GPU Puffer - Copy GPU Buffers - Kopiere GPU Puffer + Host Debug Markers + Host-Debug-Markierer - Host Debug Markers - Host-Debug-Markierer + Guest Debug Markers + Guest-Debug-Markierer - Guest Debug Markers - Guest-Debug-Markierer + Update + Aktualisieren - Update - Aktualisieren + Check for Updates at Startup + Beim Start nach Updates suchen - Check for Updates at Startup - Beim Start nach Updates suchen + Always Show Changelog + Changelog immer anzeigen - Always Show Changelog - Changelog immer anzeigen + Update Channel + Update-Kanal - Update Channel - Update-Kanal + Check for Updates + Nach Updates suchen - Check for Updates - Nach Updates suchen + GUI Settings + GUI-Einstellungen - GUI Settings - GUI-Einstellungen + Title Music + Titelmusik - Title Music - Titelmusik + Disable Trophy Pop-ups + Deaktiviere Trophäen Pop-ups - Disable Trophy Pop-ups - Deaktiviere Trophäen Pop-ups + Background Image + Background Image - Play title music - Titelmusik abspielen + Show Background Image + Show Background Image - Update Compatibility Database On Startup - Aktualisiere Kompatibilitätsdatenbank beim Start + Opacity + Opacity - Game Compatibility - Spielkompatibilität + Play title music + Titelmusik abspielen - Display Compatibility Data - Zeige Kompatibilitätsdaten + Update Compatibility Database On Startup + Aktualisiere Kompatibilitätsdatenbank beim Start - Update Compatibility Database - Aktualisiere Kompatibilitätsdatenbank + Game Compatibility + Spielkompatibilität - Volume - Lautstärke + Display Compatibility Data + Zeige Kompatibilitätsdaten - Save - Speichern + Update Compatibility Database + Aktualisiere Kompatibilitätsdatenbank - Apply - Übernehmen + Volume + Lautstärke - Restore Defaults - Werkseinstellungen wiederherstellen + Save + Speichern - Close - Schließen + Apply + Übernehmen - Point your mouse at an option to display its description. - Bewege die Maus über eine Option, um deren Beschreibung anzuzeigen. + Restore Defaults + Werkseinstellungen wiederherstellen - consoleLanguageGroupBox - Konsolensprache:\nLegt die Sprache fest, die das PS4-Spiel verwendet.\nEs wird empfohlen, diese auf eine vom Spiel unterstützte Sprache einzustellen, die je nach Region unterschiedlich sein kann. + Close + Schließen - emulatorLanguageGroupBox - Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. + Point your mouse at an option to display its description. + Bewege die Maus über eine Option, um deren Beschreibung anzuzeigen. - fullscreenCheckBox - Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. + consoleLanguageGroupBox + Konsolensprache:\nLegt die Sprache fest, die das PS4-Spiel verwendet.\nEs wird empfohlen, diese auf eine vom Spiel unterstützte Sprache einzustellen, die je nach Region unterschiedlich sein kann. - separateUpdatesCheckBox - Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung. + emulatorLanguageGroupBox + Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. - showSplashCheckBox - Startbildschirm anzeigen:\nZeigt beim Start einen speziellen Bildschirm (Splash) des Spiels an. + fullscreenCheckBox + Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. - discordRPCCheckbox - Discord Rich Presence aktivieren:\nZeigt das Emulator-Icon und relevante Informationen in deinem Discord-Profil an. + separateUpdatesCheckBox + Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung. - userName - Benutzername:\nLegt den Namen des PS4-Kontos fest, der in einigen Spielen angezeigt werden kann. + showSplashCheckBox + Startbildschirm anzeigen:\nZeigt beim Start einen speziellen Bildschirm (Splash) des Spiels an. - TrophyKey - Trophäenschlüssel:\nSchlüssel zum Entschlüsseln von Trophäen. Muss von Ihrer gejailbreakten Konsole abgerufen werden.\nDarf nur Hex-Zeichen enthalten. + discordRPCCheckbox + Discord Rich Presence aktivieren:\nZeigt das Emulator-Icon und relevante Informationen in deinem Discord-Profil an. - logTypeGroupBox - Protokolltyp:\nLegt fest, ob die Ausgabe des Protokollfensters synchronisiert wird, um die Leistung zu verbessern. Dies kann sich negativ auf die Emulation auswirken. + userName + Benutzername:\nLegt den Namen des PS4-Kontos fest, der in einigen Spielen angezeigt werden kann. - logFilter - Protokollfilter:\nFiltert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden.\nBeispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an. + TrophyKey + Trophäenschlüssel:\nSchlüssel zum Entschlüsseln von Trophäen. Muss von Ihrer gejailbreakten Konsole abgerufen werden.\nDarf nur Hex-Zeichen enthalten. - updaterGroupBox - Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. + logTypeGroupBox + Protokolltyp:\nLegt fest, ob die Ausgabe des Protokollfensters synchronisiert wird, um die Leistung zu verbessern. Dies kann sich negativ auf die Emulation auswirken. - GUIMusicGroupBox - Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. + logFilter + Protokollfilter:\nFiltert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden.\nBeispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an. - disableTrophycheckBox - Trophäen-Popups deaktivieren:\nDeaktivieren Sie Trophäenbenachrichtigungen im Spiel. Der Trophäenfortschritt kann weiterhin mit dem Trophäen-Viewer verfolgt werden (klicken Sie mit der rechten Maustaste auf das Spiel im Hauptfenster).. + updaterGroupBox + Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. - hideCursorGroupBox - Maus ausblenden:\nWählen Sie, wann der Cursor verschwinden soll:\nNie: Sie sehen die Maus immer.\nInaktiv: Legen Sie eine Zeit fest, nach der sie nach Inaktivität verschwindet.\nImmer: Sie sehen die Maus niemals. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - idleTimeoutGroupBox - Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll. + GUIMusicGroupBox + Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. - backButtonBehaviorGroupBox - Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert. + disableTrophycheckBox + Trophäen-Popups deaktivieren:\nDeaktivieren Sie Trophäenbenachrichtigungen im Spiel. Der Trophäenfortschritt kann weiterhin mit dem Trophäen-Viewer verfolgt werden (klicken Sie mit der rechten Maustaste auf das Spiel im Hauptfenster).. - enableCompatibilityCheckBox - Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie „Aktualisiere Kompatibilitätsdatenbank beim Start“, um aktuelle Informationen zu erhalten. + hideCursorGroupBox + Maus ausblenden:\nWählen Sie, wann der Cursor verschwinden soll:\nNie: Sie sehen die Maus immer.\nInaktiv: Legen Sie eine Zeit fest, nach der sie nach Inaktivität verschwindet.\nImmer: Sie sehen die Maus niemals. - checkCompatibilityOnStartupCheckBox - Kompatibilität beim Start aktualisieren:\nAktualisiert die Kompatibilitätsdatenbank automatisch, wenn shadPS4 startet. + idleTimeoutGroupBox + Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll. - updateCompatibilityButton - Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. + backButtonBehaviorGroupBox + Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert. - Never - Niemals + enableCompatibilityCheckBox + Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie „Aktualisiere Kompatibilitätsdatenbank beim Start“, um aktuelle Informationen zu erhalten. - Idle - Im Leerlauf + checkCompatibilityOnStartupCheckBox + Kompatibilität beim Start aktualisieren:\nAktualisiert die Kompatibilitätsdatenbank automatisch, wenn shadPS4 startet. - Always - Immer + updateCompatibilityButton + Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. - Touchpad Left - Touchpad Links + Never + Niemals - Touchpad Right - Touchpad Rechts + Idle + Im Leerlauf - Touchpad Center - Touchpad Mitte + Always + Immer - None - Keine + Touchpad Left + Touchpad Links - graphicsAdapterGroupBox - Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie "Auto Select", um sie automatisch auszuwählen. + Touchpad Right + Touchpad Rechts - resolutionLayout - Auflösung:\nLegt die Größe des Emulator-Fensters während der Wiedergabe fest, die während der Wiedergabe geändert werden kann.\nDies unterscheidet sich von der tatsächlichen Spielauflösung. + Touchpad Center + Touchpad Mitte - heightDivider - Framerate-Teiler:\nMultipliziert die Bildrate, mit der der Emulator aktualisiert wird, mit diesem Wert. Dies kann sich negativ auswirken, wie z.B. beschleunigtes Gameplay oder Funktionsstörungen! + None + Keine - dumpShadersCheckBox - Shader-Dumping aktivieren:\nZum technischen Debuggen speichert es die Shaders des Spiels in einem Ordner während der Wiedergabe. + graphicsAdapterGroupBox + Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie "Auto Select", um sie automatisch auszuwählen. - nullGpuCheckBox - Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre. + resolutionLayout + Auflösung:\nLegt die Größe des Emulator-Fensters während der Wiedergabe fest, die während der Wiedergabe geändert werden kann.\nDies unterscheidet sich von der tatsächlichen Spielauflösung. - gameFoldersBox - Spieleordner:\nDie Liste der Ordner, in denen nach installierten Spielen gesucht wird. + heightDivider + Framerate-Teiler:\nMultipliziert die Bildrate, mit der der Emulator aktualisiert wird, mit diesem Wert. Dies kann sich negativ auswirken, wie z.B. beschleunigtes Gameplay oder Funktionsstörungen! - addFolderButton - Hinzufügen:\nFügen Sie einen Ordner zur Liste hinzu. + dumpShadersCheckBox + Shader-Dumping aktivieren:\nZum technischen Debuggen speichert es die Shaders des Spiels in einem Ordner während der Wiedergabe. - removeFolderButton - Entfernen:\nEntfernen Sie einen Ordner aus der Liste. + nullGpuCheckBox + Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre. - debugDump - Debug-Dump aktivieren:\nSpeichert Import-/Exportsymbole und Headerinformationen des aktuellen PS4-Programms in einem Verzeichnis. + enableHDRCheckBox + enableHDRCheckBox - vkValidationCheckBox - Vulkan-Validierungsebenen aktivieren:\nAktiviert ein System, das den Zustand des Vulkan-Treibers validiert und Informationen über dessen internen Zustand protokolliert. Dies verringert die Leistung und kann möglicherweise das Verhalten der Emulation ändern. + gameFoldersBox + Spieleordner:\nDie Liste der Ordner, in denen nach installierten Spielen gesucht wird. - vkSyncValidationCheckBox - Vulkan-Synchronisationsvalidierung aktivieren:\nAktiviert ein System, das die Zeitplanung der Rendering-Aufgaben von Vulkan validiert. Dies wird die Leistung verringern und kann möglicherweise das Verhalten der Emulation ändern. + addFolderButton + Hinzufügen:\nFügen Sie einen Ordner zur Liste hinzu. - rdocCheckBox - RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. + removeFolderButton + Entfernen:\nEntfernen Sie einen Ordner aus der Liste. - collectShaderCheckBox - Shader sammeln:\nSie müssen diese Option aktivieren, um Shader mit dem Debug-Menü (Strg + F10) bearbeiten zu können. + debugDump + Debug-Dump aktivieren:\nSpeichert Import-/Exportsymbole und Headerinformationen des aktuellen PS4-Programms in einem Verzeichnis. - crashDiagnosticsCheckBox - Absturzdiagnose:\nErstellt eine .yaml-Datei mit Informationen über den Vulkan-Status zum Zeitpunkt des Absturzes.\nNützlich zum Debuggen von „Gerät verloren“-Fehlern. Wenn Sie dies aktiviert haben, sollten Sie Host- UND Gast-Debug-Markierungen aktivieren.\nFunktioniert nicht auf Intel-GPUs.\nDamit dies funktioniert, müssen Vulkan Validationsschichten aktiviert und das Vulkan SDK installiert sein. + vkValidationCheckBox + Vulkan-Validierungsebenen aktivieren:\nAktiviert ein System, das den Zustand des Vulkan-Treibers validiert und Informationen über dessen internen Zustand protokolliert. Dies verringert die Leistung und kann möglicherweise das Verhalten der Emulation ändern. - copyGPUBuffersCheckBox - GPU-Puffer kopieren:\nUmgeht Race-Bedingungen mit GPU-Übermittlungen.\nKann bei PM4-Abstürzen vom Typ 0 hilfreich sein oder auch nicht. + vkSyncValidationCheckBox + Vulkan-Synchronisationsvalidierung aktivieren:\nAktiviert ein System, das die Zeitplanung der Rendering-Aufgaben von Vulkan validiert. Dies wird die Leistung verringern und kann möglicherweise das Verhalten der Emulation ändern. - hostMarkersCheckBox - Host-Debug-Marker:\nFügt emulatorseitige Informationen wie Marker für bestimmte AMDGPU-Befehle rund um Vulkan-Befehle ein und gibt Ressourcen-Debug-Namen an.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. + rdocCheckBox + RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. - guestMarkersCheckBox - Gast-Debug-Markierer:\nFügt alle Debug-Markierer, die das Spiel selbst hinzugefügt hat, in den Befehlspuffer ein.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. + collectShaderCheckBox + Shader sammeln:\nSie müssen diese Option aktivieren, um Shader mit dem Debug-Menü (Strg + F10) bearbeiten zu können. - Borderless - + crashDiagnosticsCheckBox + Absturzdiagnose:\nErstellt eine .yaml-Datei mit Informationen über den Vulkan-Status zum Zeitpunkt des Absturzes.\nNützlich zum Debuggen von „Gerät verloren“-Fehlern. Wenn Sie dies aktiviert haben, sollten Sie Host- UND Gast-Debug-Markierungen aktivieren.\nFunktioniert nicht auf Intel-GPUs.\nDamit dies funktioniert, müssen Vulkan Validationsschichten aktiviert und das Vulkan SDK installiert sein. - True - + copyGPUBuffersCheckBox + GPU-Puffer kopieren:\nUmgeht Race-Bedingungen mit GPU-Übermittlungen.\nKann bei PM4-Abstürzen vom Typ 0 hilfreich sein oder auch nicht. - Enable HDR - + hostMarkersCheckBox + Host-Debug-Marker:\nFügt emulatorseitige Informationen wie Marker für bestimmte AMDGPU-Befehle rund um Vulkan-Befehle ein und gibt Ressourcen-Debug-Namen an.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. - Release - + guestMarkersCheckBox + Gast-Debug-Markierer:\nFügt alle Debug-Markierer, die das Spiel selbst hinzugefügt hat, in den Befehlspuffer ein.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. - Nightly - + saveDataBox + saveDataBox - Background Image - + browseButton + browseButton - Show Background Image - + Borderless + Borderless - Opacity - + True + True - Set the volume of the background music. - + Release + Release - Browse - Durchsuchen + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Aktiviere Bewegungssteuerung - Auto Select - + Save Data Path + Speicherdaten-Pfad - Directory to install games - Installationsverzeichnis für Spiele + Browse + Durchsuchen - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Installationsverzeichnis für Spiele - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophäenansicht + Trophy Viewer + Trophäenansicht - + diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 8c1c9517d..f27f2911e 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Δεν διατίθεται εικόνα + No Image Available + Δεν διατίθεται εικόνα - Serial: - Σειριακός αριθμός: + Serial: + Σειριακός αριθμός: - Version: - Έκδοση: + Version: + Έκδοση: - Size: - Μέγεθος: + Size: + Μέγεθος: - Select Cheat File: - Επιλέξτε αρχείο Cheat: + Select Cheat File: + Επιλέξτε αρχείο Cheat: - Repository: - Αποθετήριο: + Repository: + Αποθετήριο: - Download Cheats - Λήψη Cheats + Download Cheats + Λήψη Cheats - Delete File - Διαγραφή αρχείου + Delete File + Διαγραφή αρχείου - No files selected. - Δεν έχουν επιλεγεί αρχεία. + No files selected. + Δεν έχουν επιλεγεί αρχεία. - You can delete the cheats you don't want after downloading them. - Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. + You can delete the cheats you don't want after downloading them. + Μπορείτε να διαγράψετε τα cheats που δεν θέλετε μετά τη λήψη τους. - Do you want to delete the selected file?\n%1 - Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 + Do you want to delete the selected file?\n%1 + Θέλετε να διαγράψετε το επιλεγμένο αρχείο;\n%1 - Select Patch File: - Επιλέξτε αρχείο Patch: + Select Patch File: + Επιλέξτε αρχείο Patch: - Download Patches - Λήψη Patches + Download Patches + Λήψη Patches - Save - Αποθήκευση + Save + Αποθήκευση - Cheats - Cheats + Cheats + Cheats - Patches - Patches + Patches + Patches - Error - Σφάλμα + Error + Σφάλμα - No patch selected. - Δεν έχει επιλεγεί κανένα patch. + No patch selected. + Δεν έχει επιλεγεί κανένα patch. - Unable to open files.json for reading. - Αδυναμία ανοίγματος του files.json για ανάγνωση. + Unable to open files.json for reading. + Αδυναμία ανοίγματος του files.json για ανάγνωση. - No patch file found for the current serial. - Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. + No patch file found for the current serial. + Δεν βρέθηκε αρχείο patch για τον τρέχοντα σειριακό αριθμό. - Unable to open the file for reading. - Αδυναμία ανοίγματος του αρχείου για ανάγνωση. + Unable to open the file for reading. + Αδυναμία ανοίγματος του αρχείου για ανάγνωση. - Unable to open the file for writing. - Αδυναμία ανοίγματος του αρχείου για εγγραφή. + Unable to open the file for writing. + Αδυναμία ανοίγματος του αρχείου για εγγραφή. - Failed to parse XML: - Αποτυχία ανάλυσης XML: + Failed to parse XML: + Αποτυχία ανάλυσης XML: - Success - Επιτυχία + Success + Επιτυχία - Options saved successfully. - Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. + Options saved successfully. + Οι ρυθμίσεις αποθηκεύτηκαν επιτυχώς. - Invalid Source - Μη έγκυρη Πηγή + Invalid Source + Μη έγκυρη Πηγή - The selected source is invalid. - Η επιλεγμένη πηγή είναι μη έγκυρη. + The selected source is invalid. + Η επιλεγμένη πηγή είναι μη έγκυρη. - File Exists - Η αρχείο υπάρχει + File Exists + Η αρχείο υπάρχει - File already exists. Do you want to replace it? - Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; + File already exists. Do you want to replace it? + Η αρχείο υπάρχει ήδη. Θέλετε να την αντικαταστήσετε; - Failed to save file: - Αποτυχία αποθήκευσης αρχείου: + Failed to save file: + Αποτυχία αποθήκευσης αρχείου: - Failed to download file: - Αποτυχία λήψης αρχείου: + Failed to download file: + Αποτυχία λήψης αρχείου: - Cheats Not Found - Δεν βρέθηκαν Cheats + Cheats Not Found + Δεν βρέθηκαν Cheats - CheatsNotFound_MSG - Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. + CheatsNotFound_MSG + Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. - Cheats Downloaded Successfully - Cheats κατεβάστηκαν επιτυχώς + Cheats Downloaded Successfully + Cheats κατεβάστηκαν επιτυχώς - CheatsDownloadedSuccessfully_MSG - Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. + CheatsDownloadedSuccessfully_MSG + Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. - Failed to save: - Αποτυχία αποθήκευσης: + Failed to save: + Αποτυχία αποθήκευσης: - Failed to download: - Αποτυχία λήψης: + Failed to download: + Αποτυχία λήψης: - Download Complete - Η λήψη ολοκληρώθηκε + Download Complete + Η λήψη ολοκληρώθηκε - DownloadComplete_MSG - Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. + DownloadComplete_MSG + Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. - Failed to parse JSON data from HTML. - Αποτυχία ανάλυσης δεδομένων JSON από HTML. + Failed to parse JSON data from HTML. + Αποτυχία ανάλυσης δεδομένων JSON από HTML. - Failed to retrieve HTML page. - Αποτυχία ανάκτησης σελίδας HTML. + Failed to retrieve HTML page. + Αποτυχία ανάκτησης σελίδας HTML. - The game is in version: %1 - Το παιχνίδι είναι στην έκδοση: %1 + The game is in version: %1 + Το παιχνίδι είναι στην έκδοση: %1 - The downloaded patch only works on version: %1 - Η ληφθείσα ενημέρωση λειτουργεί μόνο στην έκδοση: %1 + The downloaded patch only works on version: %1 + Η ληφθείσα ενημέρωση λειτουργεί μόνο στην έκδοση: %1 - You may need to update your game. - Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι σας. + You may need to update your game. + Μπορεί να χρειαστεί να ενημερώσετε το παιχνίδι σας. - Incompatibility Notice - Ειδοποίηση ασυμβατότητας + Incompatibility Notice + Ειδοποίηση ασυμβατότητας - Failed to open file: - Αποτυχία ανοίγματος αρχείου: + Failed to open file: + Αποτυχία ανοίγματος αρχείου: - XML ERROR: - ΣΦΑΛΜΑ XML: + XML ERROR: + ΣΦΑΛΜΑ XML: - Failed to open files.json for writing - Αποτυχία ανοίγματος του files.json για εγγραφή + Failed to open files.json for writing + Αποτυχία ανοίγματος του files.json για εγγραφή - Author: - Συγγραφέας: + Author: + Συγγραφέας: - Directory does not exist: - Ο φάκελος δεν υπάρχει: + Directory does not exist: + Ο φάκελος δεν υπάρχει: - Failed to open files.json for reading. - Αποτυχία ανοίγματος του files.json για ανάγνωση. + Failed to open files.json for reading. + Αποτυχία ανοίγματος του files.json για ανάγνωση. - Name: - Όνομα: + Name: + Όνομα: - Can't apply cheats before the game is started - Δεν μπορείτε να εφαρμόσετε cheats πριν ξεκινήσει το παιχνίδι. + Can't apply cheats before the game is started + Δεν μπορείτε να εφαρμόσετε cheats πριν ξεκινήσει το παιχνίδι. - Close - Κλείσιμο + Close + Κλείσιμο - - + + CheckUpdate - Auto Updater - Αυτόματος Ενημερωτής + Auto Updater + Αυτόματος Ενημερωτής - Error - Σφάλμα + Error + Σφάλμα - Network error: - Σφάλμα δικτύου: + Network error: + Σφάλμα δικτύου: - Error_Github_limit_MSG - Ο Αυτόματος Ενημερωτής επιτρέπει έως και 60 ελέγχους ενημερώσεων ανά ώρα.\nΈχετε φτάσει αυτό το όριο. Παρακαλώ δοκιμάστε ξανά αργότερα. + Error_Github_limit_MSG + Ο Αυτόματος Ενημερωτής επιτρέπει έως και 60 ελέγχους ενημερώσεων ανά ώρα.\nΈχετε φτάσει αυτό το όριο. Παρακαλώ δοκιμάστε ξανά αργότερα. - Failed to parse update information. - Αποτυχία ανάλυσης πληροφοριών ενημέρωσης. + Failed to parse update information. + Αποτυχία ανάλυσης πληροφοριών ενημέρωσης. - No pre-releases found. - Δεν βρέθηκαν προ-κυκλοφορίες. + No pre-releases found. + Δεν βρέθηκαν προ-κυκλοφορίες. - Invalid release data. - Μη έγκυρα δεδομένα έκδοσης. + Invalid release data. + Μη έγκυρα δεδομένα έκδοσης. - No download URL found for the specified asset. - Δεν βρέθηκε URL λήψης για το συγκεκριμένο στοιχείο. + No download URL found for the specified asset. + Δεν βρέθηκε URL λήψης για το συγκεκριμένο στοιχείο. - Your version is already up to date! - Η έκδοσή σας είναι ήδη ενημερωμένη! + Your version is already up to date! + Η έκδοσή σας είναι ήδη ενημερωμένη! - Update Available - Διαθέσιμη Ενημέρωση + Update Available + Διαθέσιμη Ενημέρωση - Update Channel - Κανάλι Ενημέρωσης + Update Channel + Κανάλι Ενημέρωσης - Current Version - Τρέχουσα Έκδοση + Current Version + Τρέχουσα Έκδοση - Latest Version - Τελευταία Έκδοση + Latest Version + Τελευταία Έκδοση - Do you want to update? - Θέλετε να ενημερώσετε; + Do you want to update? + Θέλετε να ενημερώσετε; - Show Changelog - Εμφάνιση Ιστορικού Αλλαγών + Show Changelog + Εμφάνιση Ιστορικού Αλλαγών - Check for Updates at Startup - Έλεγχος για ενημερώσεις κατά την εκκίνηση + Check for Updates at Startup + Έλεγχος για ενημερώσεις κατά την εκκίνηση - Update - Ενημέρωση + Update + Ενημέρωση - No - Όχι + No + Όχι - Hide Changelog - Απόκρυψη Ιστορικού Αλλαγών + Hide Changelog + Απόκρυψη Ιστορικού Αλλαγών - Changes - Αλλαγές + Changes + Αλλαγές - Network error occurred while trying to access the URL - Σφάλμα δικτύου κατά την προσπάθεια πρόσβασης στη διεύθυνση URL + Network error occurred while trying to access the URL + Σφάλμα δικτύου κατά την προσπάθεια πρόσβασης στη διεύθυνση URL - Download Complete - Λήψη ολοκληρώθηκε + Download Complete + Λήψη ολοκληρώθηκε - The update has been downloaded, press OK to install. - Η ενημέρωση έχει ληφθεί, πατήστε OK για να εγκαταστήσετε. + The update has been downloaded, press OK to install. + Η ενημέρωση έχει ληφθεί, πατήστε OK για να εγκαταστήσετε. - Failed to save the update file at - Αποτυχία αποθήκευσης του αρχείου ενημέρωσης στο + Failed to save the update file at + Αποτυχία αποθήκευσης του αρχείου ενημέρωσης στο - Starting Update... - Εκκίνηση Ενημέρωσης... + Starting Update... + Εκκίνηση Ενημέρωσης... - Failed to create the update script file - Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης + Failed to create the update script file + Αποτυχία δημιουργίας του αρχείου σεναρίου ενημέρωσης - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Φόρτωση δεδομένων συμβατότητας, παρακαλώ περιμένετε + Fetching compatibility data, please wait + Φόρτωση δεδομένων συμβατότητας, παρακαλώ περιμένετε - Cancel - Ακύρωση + Cancel + Ακύρωση - Loading... - Φόρτωση... + Loading... + Φόρτωση... - Error - Σφάλμα + Error + Σφάλμα - Unable to update compatibility data! Try again later. - Δεν ήταν δυνατή η ενημέρωση των δεδομένων συμβατότητας! Προσπαθήστε αργότερα. + Unable to update compatibility data! Try again later. + Δεν ήταν δυνατή η ενημέρωση των δεδομένων συμβατότητας! Προσπαθήστε αργότερα. - Unable to open compatibility_data.json for writing. - Αδύνατο να ανοίξετε το compatibility_data.json για εγγραφή. + Unable to open compatibility_data.json for writing. + Αδύνατο να ανοίξετε το compatibility_data.json για εγγραφή. - Unknown - Άγνωστο + Unknown + Άγνωστο - Nothing - Τίποτα + Nothing + Τίποτα - Boots - Μπότες + Boots + Μπότες - Menus - Μενού + Menus + Μενού - Ingame - Εντός παιχνιδιού + Ingame + Εντός παιχνιδιού - Playable - Παιχνιδεύσιμο + Playable + Παιχνιδεύσιμο - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Εικονίδιο + Icon + Εικονίδιο - Name - Όνομα + Name + Όνομα - Serial - Σειριακός αριθμός + Serial + Σειριακός αριθμός - Compatibility - Compatibility + Compatibility + Compatibility - Region - Περιοχή + Region + Περιοχή - Firmware - Λογισμικό + Firmware + Λογισμικό - Size - Μέγεθος + Size + Μέγεθος - Version - Έκδοση + Version + Έκδοση - Path - Διαδρομή + Path + Διαδρομή - Play Time - Χρόνος παιχνιδιού + Play Time + Χρόνος παιχνιδιού - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Κάντε κλικ για να δείτε λεπτομέρειες στο GitHub + Click to see details on github + Κάντε κλικ για να δείτε λεπτομέρειες στο GitHub - Last updated - Τελευταία ενημέρωση + Last updated + Τελευταία ενημέρωση - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - Cheats / Patches - Kodikí / Enimeróseis + Cheats / Patches + Kodikí / Enimeróseis - SFO Viewer - SFO Viewer + SFO Viewer + SFO Viewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - Open Folder... - Άνοιγμα Φακέλου... + Open Folder... + Άνοιγμα Φακέλου... - Open Game Folder - Άνοιγμα Φακέλου Παιχνιδιού + Open Game Folder + Άνοιγμα Φακέλου Παιχνιδιού - Open Save Data Folder - Άνοιγμα Φακέλου Αποθηκευμένων Δεδομένων + Open Save Data Folder + Άνοιγμα Φακέλου Αποθηκευμένων Δεδομένων - Open Log Folder - Άνοιγμα Φακέλου Καταγραφής + Open Log Folder + Άνοιγμα Φακέλου Καταγραφής - Copy info... - Copy info... + Copy info... + Copy info... - Copy Name - Copy Name + Copy Name + Copy Name - Copy Serial - Copy Serial + Copy Serial + Copy Serial - Copy All - Copy All + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copy All - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Shortcut creation + View report + View report - Shortcut created successfully! - Shortcut created successfully! + Submit a report + Submit a report - Error - Error + Shortcut creation + Shortcut creation - Error creating shortcut! - Error creating shortcut! + Shortcut created successfully! + Shortcut created successfully! - Install PKG - Install PKG + Error + Error - Game - Game + Error creating shortcut! + Error creating shortcut! - This game has no update to delete! - This game has no update to delete! + Install PKG + Install PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Έλεγχος για ενημερώσεις + Check for Updates + Έλεγχος για ενημερώσεις - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Κατεβάστε Κωδικούς / Ενημερώσεις + Download Cheats/Patches + Κατεβάστε Κωδικούς / Ενημερώσεις - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Βοήθεια + Help + Βοήθεια - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Λίστα παιχνιδιών + Game List + Λίστα παιχνιδιών - * Unsupported Vulkan Version - * Μη υποστηριζόμενη έκδοση Vulkan + * Unsupported Vulkan Version + * Μη υποστηριζόμενη έκδοση Vulkan - Download Cheats For All Installed Games - Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια + Download Cheats For All Installed Games + Λήψη Cheats για όλα τα εγκατεστημένα παιχνίδια - Download Patches For All Games - Λήψη Patches για όλα τα παιχνίδια + Download Patches For All Games + Λήψη Patches για όλα τα παιχνίδια - Download Complete - Η λήψη ολοκληρώθηκε + Download Complete + Η λήψη ολοκληρώθηκε - You have downloaded cheats for all the games you have installed. - Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. + You have downloaded cheats for all the games you have installed. + Έχετε κατεβάσει cheats για όλα τα εγκατεστημένα παιχνίδια. - Patches Downloaded Successfully! - Τα Patches κατέβηκαν επιτυχώς! + Patches Downloaded Successfully! + Τα Patches κατέβηκαν επιτυχώς! - All Patches available for all games have been downloaded. - Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. + All Patches available for all games have been downloaded. + Όλα τα διαθέσιμα Patches για όλα τα παιχνίδια έχουν κατέβει. - Games: - Παιχνίδια: + Games: + Παιχνίδια: - ELF files (*.bin *.elf *.oelf) - Αρχεία ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Αρχεία ELF (*.bin *.elf *.oelf) - Game Boot - Εκκίνηση παιχνιδιού + Game Boot + Εκκίνηση παιχνιδιού - Only one file can be selected! - Μπορεί να επιλεγεί μόνο ένα αρχείο! + Only one file can be selected! + Μπορεί να επιλεγεί μόνο ένα αρχείο! - PKG Extraction - Εξαγωγή PKG + PKG Extraction + Εξαγωγή PKG - Patch detected! - Αναγνώριση ενημέρωσης! + Patch detected! + Αναγνώριση ενημέρωσης! - PKG and Game versions match: - Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: + PKG and Game versions match: + Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: - Would you like to overwrite? - Θέλετε να αντικαταστήσετε; + Would you like to overwrite? + Θέλετε να αντικαταστήσετε; - PKG Version %1 is older than installed version: - Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: + PKG Version %1 is older than installed version: + Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: - Game is installed: - Το παιχνίδι είναι εγκατεστημένο: + Game is installed: + Το παιχνίδι είναι εγκατεστημένο: - Would you like to install Patch: - Θέλετε να εγκαταστήσετε την ενημέρωση: + Would you like to install Patch: + Θέλετε να εγκαταστήσετε την ενημέρωση: - DLC Installation - Εγκατάσταση DLC + DLC Installation + Εγκατάσταση DLC - Would you like to install DLC: %1? - Θέλετε να εγκαταστήσετε το DLC: %1; + Would you like to install DLC: %1? + Θέλετε να εγκαταστήσετε το DLC: %1; - DLC already installed: - DLC ήδη εγκατεστημένο: + DLC already installed: + DLC ήδη εγκατεστημένο: - Game already installed - Παιχνίδι ήδη εγκατεστημένο + Game already installed + Παιχνίδι ήδη εγκατεστημένο - PKG ERROR - ΣΦΑΛΜΑ PKG + PKG ERROR + ΣΦΑΛΜΑ PKG - Extracting PKG %1/%2 - Εξαγωγή PKG %1/%2 + Extracting PKG %1/%2 + Εξαγωγή PKG %1/%2 - Extraction Finished - Η εξαγωγή ολοκληρώθηκε + Extraction Finished + Η εξαγωγή ολοκληρώθηκε - Game successfully installed at %1 - Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 + Game successfully installed at %1 + Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 - File doesn't appear to be a valid PKG file - Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG + File doesn't appear to be a valid PKG file + Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Όνομα + PKG ERROR + ΣΦΑΛΜΑ PKG - Serial - Σειριακός αριθμός + Name + Όνομα - Installed - + Serial + Σειριακός αριθμός - Size - Μέγεθος + Installed + Installed - Category - + Size + Μέγεθος - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Περιοχή + FW + FW - Flags - + Region + Περιοχή - Path - Διαδρομή + Flags + Flags - File - File + Path + Διαδρομή - PKG ERROR - ΣΦΑΛΜΑ PKG + File + File - Unknown - Άγνωστο + Unknown + Άγνωστο - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - Λειτουργία Πλήρους Οθόνης + Fullscreen Mode + Λειτουργία Πλήρους Οθόνης - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Προεπιλεγμένη καρτέλα κατά την ανοίγμα των ρυθμίσεων + Default tab when opening settings + Προεπιλεγμένη καρτέλα κατά την ανοίγμα των ρυθμίσεων - Show Game Size In List - Εμφάνιση Μεγέθους Παιχνιδιού στη Λίστα + Show Game Size In List + Εμφάνιση Μεγέθους Παιχνιδιού στη Λίστα - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Ενεργοποίηση Discord Rich Presence + Enable Discord Rich Presence + Ενεργοποίηση Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - Άνοιγμα τοποθεσίας αρχείου καταγραφής + Open Log Location + Άνοιγμα τοποθεσίας αρχείου καταγραφής - Input - Είσοδος + Input + Είσοδος - Cursor - Δείκτης + Cursor + Δείκτης - Hide Cursor - Απόκρυψη δείκτη + Hide Cursor + Απόκρυψη δείκτη - Hide Cursor Idle Timeout - Χρόνος αδράνειας απόκρυψης δείκτη + Hide Cursor Idle Timeout + Χρόνος αδράνειας απόκρυψης δείκτη - s - s + s + s - Controller - Controller + Controller + Controller - Back Button Behavior - Συμπεριφορά κουμπιού επιστροφής + Back Button Behavior + Συμπεριφορά κουμπιού επιστροφής - Graphics - Graphics + Graphics + Graphics - GUI - Διεπαφή + GUI + Διεπαφή - User - Χρήστης + User + Χρήστης - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Διαδρομές + Enable HDR + Enable HDR - Game Folders - Φάκελοι παιχνιδιών + Paths + Διαδρομές - Add... - Προσθήκη... + Game Folders + Φάκελοι παιχνιδιών - Remove - Αφαίρεση + Add... + Προσθήκη... - Debug - Debug + Remove + Αφαίρεση - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Ενημέρωση + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Έλεγχος για ενημερώσεις κατά την εκκίνηση + Update + Ενημέρωση - Always Show Changelog - Πάντα εμφάνιση ιστορικού αλλαγών + Check for Updates at Startup + Έλεγχος για ενημερώσεις κατά την εκκίνηση - Update Channel - Κανάλι Ενημέρωσης + Always Show Changelog + Πάντα εμφάνιση ιστορικού αλλαγών - Check for Updates - Έλεγχος για ενημερώσεις + Update Channel + Κανάλι Ενημέρωσης - GUI Settings - Ρυθμίσεις GUI + Check for Updates + Έλεγχος για ενημερώσεις - Title Music - Title Music + GUI Settings + Ρυθμίσεις GUI - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Αναπαραγωγή μουσικής τίτλου + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Αναπαραγωγή μουσικής τίτλου - Volume - ένταση + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Αποθήκευση + Game Compatibility + Game Compatibility - Apply - Εφαρμογή + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Επαναφορά Προεπιλογών + Update Compatibility Database + Update Compatibility Database - Close - Κλείσιμο + Volume + ένταση - Point your mouse at an option to display its description. - Τοποθετήστε το ποντίκι σας πάνω σε μια επιλογή για να εμφανίσετε την περιγραφή της. + Save + Αποθήκευση - consoleLanguageGroupBox - Γλώσσα Κονσόλας:\nΡυθμίζει τη γλώσσα που θα χρησιμοποιήσει το παιχνίδι PS4.\nΣυνιστάται να επιλέξετε μία από τις γλώσσες που υποστηρίζονται από το παιχνίδι, η οποία ενδέχεται να διαφέρει ανάλογα με την περιοχή. + Apply + Εφαρμογή - emulatorLanguageGroupBox - Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. + Restore Defaults + Επαναφορά Προεπιλογών - fullscreenCheckBox - Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. + Close + Κλείσιμο - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Τοποθετήστε το ποντίκι σας πάνω σε μια επιλογή για να εμφανίσετε την περιγραφή της. - showSplashCheckBox - Εμφάνιση Splash Screen:\nΕμφανίζει ειδική γραφική οθόνη κατά την εκκίνηση. + consoleLanguageGroupBox + Γλώσσα Κονσόλας:\nΡυθμίζει τη γλώσσα που θα χρησιμοποιήσει το παιχνίδι PS4.\nΣυνιστάται να επιλέξετε μία από τις γλώσσες που υποστηρίζονται από το παιχνίδι, η οποία ενδέχεται να διαφέρει ανάλογα με την περιοχή. - discordRPCCheckbox - Ενεργοποίηση Discord Rich Presence:\nΕμφανίζει το εικονίδιο του emulator και σχετικές πληροφορίες στο προφίλ σας στο Discord. + emulatorLanguageGroupBox + Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. - userName - Όνομα Χρήστη:\nΟρίζει το όνομα του λογαριασμού PS4, το οποίο μπορεί να εμφανιστεί σε ορισμένα παιχνίδια. + fullscreenCheckBox + Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Τύπος Καταγραφής:\nΚαθορίζει αν η έξοδος του παραθύρου καταγραφής θα συγχρονιστεί για αύξηση της απόδοσης. Αυτό μπορεί να επηρεάσει αρνητικά τις επιδόσεις του εξομοιωτή. + showSplashCheckBox + Εμφάνιση Splash Screen:\nΕμφανίζει ειδική γραφική οθόνη κατά την εκκίνηση. - logFilter - Φίλτρο Καταγραφής:\nΦιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες.\nΠαραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα. + discordRPCCheckbox + Ενεργοποίηση Discord Rich Presence:\nΕμφανίζει το εικονίδιο του emulator και σχετικές πληροφορίες στο προφίλ σας στο Discord. - updaterGroupBox - Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. + userName + Όνομα Χρήστη:\nΟρίζει το όνομα του λογαριασμού PS4, το οποίο μπορεί να εμφανιστεί σε ορισμένα παιχνίδια. - GUIMusicGroupBox - Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Τύπος Καταγραφής:\nΚαθορίζει αν η έξοδος του παραθύρου καταγραφής θα συγχρονιστεί για αύξηση της απόδοσης. Αυτό μπορεί να επηρεάσει αρνητικά τις επιδόσεις του εξομοιωτή. - hideCursorGroupBox - Απόκρυψη Κέρσορα:\nΕπιλέξτε πότε θα εξαφανιστεί ο κέρσορας:\nΠοτέ: θα βλέπετε πάντα το ποντίκι.\nΑδρανές: ορίστε έναν χρόνο για να εξαφανιστεί μετά από αδράνεια.\nΠάντα: δεν θα δείτε ποτέ το ποντίκι. + logFilter + Φίλτρο Καταγραφής:\nΦιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες.\nΠαραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα. - idleTimeoutGroupBox - Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια. + updaterGroupBox + Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. - backButtonBehaviorGroupBox - Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Απόκρυψη Κέρσορα:\nΕπιλέξτε πότε θα εξαφανιστεί ο κέρσορας:\nΠοτέ: θα βλέπετε πάντα το ποντίκι.\nΑδρανές: ορίστε έναν χρόνο για να εξαφανιστεί μετά από αδράνεια.\nΠάντα: δεν θα δείτε ποτέ το ποντίκι. - Never - Ποτέ + idleTimeoutGroupBox + Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια. - Idle - Αδρανής + backButtonBehaviorGroupBox + Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4. - Always - Πάντα + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Touchpad Αριστερά + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Touchpad Δεξιά + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Κέντρο Touchpad + Never + Ποτέ - None - Κανένα + Idle + Αδρανής - graphicsAdapterGroupBox - Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\nή επιλέξτε "Auto Select" για αυτόματη επιλογή. + Always + Πάντα - resolutionLayout - Ανάλυση Οθόνης:\nΚαθορίζει το μέγεθος του παραθύρου του εξομοιωτή κατά την αναπαραγωγή, το οποίο μπορεί να αλλάξει κατά τη διάρκεια του παιχνιδιού.\nΑυτό είναι διαφορετικό από την ανάλυση του ίδιου του παιχνιδιού. + Touchpad Left + Touchpad Αριστερά - heightDivider - Διαιρέτης Συχνότητας Ανανέωσης:\nΠολλαπλασιάζει τον ρυθμό με τον οποίο ο εξομοιωτής ενημερώνει την εικόνα με αυτόν τον αριθμό. Η αλλαγή αυτής της ρύθμισης μπορεί να έχει αρνητικές επιπτώσεις, όπως ταχύτερο παιχνίδι ή σπασμένες λειτουργίες! + Touchpad Right + Touchpad Δεξιά - dumpShadersCheckBox - Ενεργοποίηση Καταγραφής Σκιάσεων (Shaders):\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις σκιάσεις του παιχνιδιού σε φάκελο κατά τη διάρκεια της αναπαραγωγής. + Touchpad Center + Κέντρο Touchpad - nullGpuCheckBox - Ενεργοποίηση Εικονικής GPU:\nΓια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών. + None + Κανένα - gameFoldersBox - Φάκελοι Παιχνιδιών:\nΗ λίστα των φακέλων για έλεγχο των εγκατεστημένων παιχνιδιών. + graphicsAdapterGroupBox + Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\nή επιλέξτε "Auto Select" για αυτόματη επιλογή. - addFolderButton - Προσθήκη:\nΠροσθέστε έναν φάκελο στη λίστα. + resolutionLayout + Ανάλυση Οθόνης:\nΚαθορίζει το μέγεθος του παραθύρου του εξομοιωτή κατά την αναπαραγωγή, το οποίο μπορεί να αλλάξει κατά τη διάρκεια του παιχνιδιού.\nΑυτό είναι διαφορετικό από την ανάλυση του ίδιου του παιχνιδιού. - removeFolderButton - Αφαίρεση:\nΑφαιρέστε έναν φάκελο από τη λίστα. + heightDivider + Διαιρέτης Συχνότητας Ανανέωσης:\nΠολλαπλασιάζει τον ρυθμό με τον οποίο ο εξομοιωτής ενημερώνει την εικόνα με αυτόν τον αριθμό. Η αλλαγή αυτής της ρύθμισης μπορεί να έχει αρνητικές επιπτώσεις, όπως ταχύτερο παιχνίδι ή σπασμένες λειτουργίες! - debugDump - Ενεργοποίηση Καταγραφής Αποσφαλμάτωσης:\nΑποθηκεύει τα σύμβολα εισαγωγής/εξαγωγής και τις κεφαλίδες πληροφοριών του τρέχοντος προγράμματος PS4 σε έναν φάκελο. + dumpShadersCheckBox + Ενεργοποίηση Καταγραφής Σκιάσεων (Shaders):\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις σκιάσεις του παιχνιδιού σε φάκελο κατά τη διάρκεια της αναπαραγωγής. - vkValidationCheckBox - Ενεργοποίηση Επικύρωσης Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει την κατάσταση του προγράμματος οδήγησης Vulkan και καταγράφει πληροφορίες για την εσωτερική του κατάσταση. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. + nullGpuCheckBox + Ενεργοποίηση Εικονικής GPU:\nΓια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών. - vkSyncValidationCheckBox - Ενεργοποίηση Επικύρωσης Συγχρονισμού Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει τον συγχρονισμό των εργασιών απόδοσης του Vulkan. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. + gameFoldersBox + Φάκελοι Παιχνιδιών:\nΗ λίστα των φακέλων για έλεγχο των εγκατεστημένων παιχνιδιών. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Προσθήκη:\nΠροσθέστε έναν φάκελο στη λίστα. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Αφαίρεση:\nΑφαιρέστε έναν φάκελο από τη λίστα. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Ενεργοποίηση Καταγραφής Αποσφαλμάτωσης:\nΑποθηκεύει τα σύμβολα εισαγωγής/εξαγωγής και τις κεφαλίδες πληροφοριών του τρέχοντος προγράμματος PS4 σε έναν φάκελο. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Ενεργοποίηση Επικύρωσης Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει την κατάσταση του προγράμματος οδήγησης Vulkan και καταγράφει πληροφορίες για την εσωτερική του κατάσταση. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Ενεργοποίηση Επικύρωσης Συγχρονισμού Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει τον συγχρονισμό των εργασιών απόδοσης του Vulkan. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - Borderless - + rdocCheckBox + Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index c169e68c6..af7e5012f 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Acerca de shadPS4 + About shadPS4 + Acerca de shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 es un emulador experimental de código abierto para la PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 es un emulador experimental de código abierto para la PlayStation 4. - This software should not be used to play games you have not legally obtained. - Este software no debe utilizarse para jugar juegos que hayas obtenido ilegalmente. + This software should not be used to play games you have not legally obtained. + Este software no debe utilizarse para jugar juegos que hayas obtenido ilegalmente. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - No hay imagen disponible + No Image Available + No hay imagen disponible - Serial: - Número de serie: + Serial: + Número de serie: - Version: - Versión: + Version: + Versión: - Size: - Tamaño: + Size: + Tamaño: - Select Cheat File: - Seleccionar archivo de trucos: + Select Cheat File: + Seleccionar archivo de trucos: - Repository: - Repositorio: + Repository: + Repositorio: - Download Cheats - Descargar trucos + Download Cheats + Descargar trucos - Delete File - Eliminar archivo + Delete File + Eliminar archivo - No files selected. - No se han seleccionado archivos. + No files selected. + No se han seleccionado archivos. - You can delete the cheats you don't want after downloading them. - Puedes eliminar los trucos que no quieras una vez descargados. + You can delete the cheats you don't want after downloading them. + Puedes eliminar los trucos que no quieras una vez descargados. - Do you want to delete the selected file?\n%1 - ¿Deseas eliminar el archivo seleccionado?\n%1 + Do you want to delete the selected file?\n%1 + ¿Deseas eliminar el archivo seleccionado?\n%1 - Select Patch File: - Seleccionar archivo de parche: + Select Patch File: + Seleccionar archivo de parche: - Download Patches - Descargar parches + Download Patches + Descargar parches - Save - Guardar + Save + Guardar - Cheats - Trucos + Cheats + Trucos - Patches - Parches + Patches + Parches - Error - Error + Error + Error - No patch selected. - No se ha seleccionado ningún parche. + No patch selected. + No se ha seleccionado ningún parche. - Unable to open files.json for reading. - No se puede abrir files.json para lectura. + Unable to open files.json for reading. + No se puede abrir files.json para lectura. - No patch file found for the current serial. - No se encontró ningún archivo de parche para el número de serie actual. + No patch file found for the current serial. + No se encontró ningún archivo de parche para el número de serie actual. - Unable to open the file for reading. - No se puede abrir el archivo para lectura. + Unable to open the file for reading. + No se puede abrir el archivo para lectura. - Unable to open the file for writing. - No se puede abrir el archivo para escritura. + Unable to open the file for writing. + No se puede abrir el archivo para escritura. - Failed to parse XML: - Error al analizar XML: + Failed to parse XML: + Error al analizar XML: - Success - Éxito + Success + Éxito - Options saved successfully. - Opciones guardadas exitosamente. + Options saved successfully. + Opciones guardadas exitosamente. - Invalid Source - Fuente inválida + Invalid Source + Fuente inválida - The selected source is invalid. - La fuente seleccionada es inválida. + The selected source is invalid. + La fuente seleccionada es inválida. - File Exists - El archivo ya existe + File Exists + El archivo ya existe - File already exists. Do you want to replace it? - El archivo ya existe. ¿Deseas reemplazarlo? + File already exists. Do you want to replace it? + El archivo ya existe. ¿Deseas reemplazarlo? - Failed to save file: - Error al guardar el archivo: + Failed to save file: + Error al guardar el archivo: - Failed to download file: - Error al descargar el archivo: + Failed to download file: + Error al descargar el archivo: - Cheats Not Found - Trucos no encontrados + Cheats Not Found + Trucos no encontrados - CheatsNotFound_MSG - No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. + CheatsNotFound_MSG + No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. - Cheats Downloaded Successfully - Trucos descargados exitosamente + Cheats Downloaded Successfully + Trucos descargados exitosamente - CheatsDownloadedSuccessfully_MSG - Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. + CheatsDownloadedSuccessfully_MSG + Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. - Failed to save: - Error al guardar: + Failed to save: + Error al guardar: - Failed to download: - Error al descargar: + Failed to download: + Error al descargar: - Download Complete - Descarga completa + Download Complete + Descarga completa - DownloadComplete_MSG - ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. + DownloadComplete_MSG + ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. - Failed to parse JSON data from HTML. - Error al analizar los datos JSON del HTML. + Failed to parse JSON data from HTML. + Error al analizar los datos JSON del HTML. - Failed to retrieve HTML page. - Error al recuperar la página HTML. + Failed to retrieve HTML page. + Error al recuperar la página HTML. - The game is in version: %1 - El juego está en la versión: %1 + The game is in version: %1 + El juego está en la versión: %1 - The downloaded patch only works on version: %1 - El parche descargado solo funciona en la versión: %1 + The downloaded patch only works on version: %1 + El parche descargado solo funciona en la versión: %1 - You may need to update your game. - Puede que necesites actualizar tu juego. + You may need to update your game. + Puede que necesites actualizar tu juego. - Incompatibility Notice - Aviso de incompatibilidad + Incompatibility Notice + Aviso de incompatibilidad - Failed to open file: - Error al abrir el archivo: + Failed to open file: + Error al abrir el archivo: - XML ERROR: - ERROR XML: + XML ERROR: + ERROR XML: - Failed to open files.json for writing - Error al abrir files.json para escritura + Failed to open files.json for writing + Error al abrir files.json para escritura - Author: - Autor: + Author: + Autor: - Directory does not exist: - El directorio no existe: + Directory does not exist: + El directorio no existe: - Failed to open files.json for reading. - Error al abrir files.json para lectura. + Failed to open files.json for reading. + Error al abrir files.json para lectura. - Name: - Nombre: + Name: + Nombre: - Can't apply cheats before the game is started - No se pueden aplicar trucos antes de que se inicie el juego. + Can't apply cheats before the game is started + No se pueden aplicar trucos antes de que se inicie el juego. - Close - Cerrar + Close + Cerrar - - + + CheckUpdate - Auto Updater - Actualizador Automático + Auto Updater + Actualizador Automático - Error - Error + Error + Error - Network error: - Error de red: + Network error: + Error de red: - Error_Github_limit_MSG - El actualizador automático permite hasta 60 comprobaciones de actualización por hora.\nHas alcanzado este límite. Por favor, inténtalo de nuevo más tarde. + Error_Github_limit_MSG + El actualizador automático permite hasta 60 comprobaciones de actualización por hora.\nHas alcanzado este límite. Por favor, inténtalo de nuevo más tarde. - Failed to parse update information. - Error al analizar la información de actualización. + Failed to parse update information. + Error al analizar la información de actualización. - No pre-releases found. - No se encontraron prelanzamientos. + No pre-releases found. + No se encontraron prelanzamientos. - Invalid release data. - Datos de versión no válidos. + Invalid release data. + Datos de versión no válidos. - No download URL found for the specified asset. - No se encontró URL de descarga para el activo especificado. + No download URL found for the specified asset. + No se encontró URL de descarga para el activo especificado. - Your version is already up to date! - ¡Su versión ya está actualizada! + Your version is already up to date! + ¡Su versión ya está actualizada! - Update Available - Actualización disponible + Update Available + Actualización disponible - Update Channel - Canal de Actualización + Update Channel + Canal de Actualización - Current Version - Versión actual + Current Version + Versión actual - Latest Version - Última versión + Latest Version + Última versión - Do you want to update? - ¿Quieres actualizar? + Do you want to update? + ¿Quieres actualizar? - Show Changelog - Mostrar registro de cambios + Show Changelog + Mostrar registro de cambios - Check for Updates at Startup - Buscar actualizaciones al iniciar + Check for Updates at Startup + Buscar actualizaciones al iniciar - Update - Actualizar + Update + Actualizar - No - No + No + No - Hide Changelog - Ocultar registro de cambios + Hide Changelog + Ocultar registro de cambios - Changes - Cambios + Changes + Cambios - Network error occurred while trying to access the URL - Se produjo un error de red al intentar acceder a la URL + Network error occurred while trying to access the URL + Se produjo un error de red al intentar acceder a la URL - Download Complete - Descarga completa + Download Complete + Descarga completa - The update has been downloaded, press OK to install. - La actualización se ha descargado, presione Aceptar para instalar. + The update has been downloaded, press OK to install. + La actualización se ha descargado, presione Aceptar para instalar. - Failed to save the update file at - No se pudo guardar el archivo de actualización en + Failed to save the update file at + No se pudo guardar el archivo de actualización en - Starting Update... - Iniciando actualización... + Starting Update... + Iniciando actualización... - Failed to create the update script file - No se pudo crear el archivo del script de actualización + Failed to create the update script file + No se pudo crear el archivo del script de actualización - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Obteniendo datos de compatibilidad, por favor espera + Fetching compatibility data, please wait + Obteniendo datos de compatibilidad, por favor espera - Cancel - Cancelar + Cancel + Cancelar - Loading... - Cargando... + Loading... + Cargando... - Error - Error + Error + Error - Unable to update compatibility data! Try again later. - ¡No se pudo actualizar los datos de compatibilidad! Intenta de nuevo más tarde. + Unable to update compatibility data! Try again later. + ¡No se pudo actualizar los datos de compatibilidad! Intenta de nuevo más tarde. - Unable to open compatibility_data.json for writing. - No se pudo abrir compatibility_data.json para escribir. + Unable to open compatibility_data.json for writing. + No se pudo abrir compatibility_data.json para escribir. - Unknown - Desconocido + Unknown + Desconocido - Nothing - Nada + Nothing + Nada - Boots - Inicia + Boots + Inicia - Menus - Menús + Menus + Menús - Ingame - En el juego + Ingame + En el juego - Playable - Jugable + Playable + Jugable - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Abrir carpeta + Open Folder + Abrir carpeta - - + + GameInfoClass - Loading game list, please wait :3 - Cargando lista de juegos, por favor espera :3 + Loading game list, please wait :3 + Cargando lista de juegos, por favor espera :3 - Cancel - Cancelar + Cancel + Cancelar - Loading... - Cargando... + Loading... + Cargando... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Elegir carpeta + shadPS4 - Choose directory + shadPS4 - Elegir carpeta - Directory to install games - Carpeta para instalar juegos + Directory to install games + Carpeta para instalar juegos - Browse - Buscar + Browse + Buscar - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Icono + Icon + Icono - Name - Nombre + Name + Nombre - Serial - Numero de serie + Serial + Numero de serie - Compatibility - Compatibility + Compatibility + Compatibility - Region - Región + Region + Región - Firmware - Firmware + Firmware + Firmware - Size - Tamaño + Size + Tamaño - Version - Versión + Version + Versión - Path - Ruta + Path + Ruta - Play Time - Tiempo de Juego + Play Time + Tiempo de Juego - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Haz clic para ver detalles en GitHub + Click to see details on github + Haz clic para ver detalles en GitHub - Last updated - Última actualización + Last updated + Última actualización - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Crear acceso directo + Create Shortcut + Crear acceso directo - Cheats / Patches - Trucos / Parches + Cheats / Patches + Trucos / Parches - SFO Viewer - Vista SFO + SFO Viewer + Vista SFO - Trophy Viewer - Ver trofeos + Trophy Viewer + Ver trofeos - Open Folder... - Abrir Carpeta... + Open Folder... + Abrir Carpeta... - Open Game Folder - Abrir Carpeta del Juego + Open Game Folder + Abrir Carpeta del Juego - Open Save Data Folder - Abrir Carpeta de Datos Guardados + Open Save Data Folder + Abrir Carpeta de Datos Guardados - Open Log Folder - Abrir Carpeta de Registros + Open Log Folder + Abrir Carpeta de Registros - Copy info... - Copiar información... + Copy info... + Copiar información... - Copy Name - Copiar nombre + Copy Name + Copiar nombre - Copy Serial - Copiar número de serie + Copy Serial + Copiar número de serie - Copy All - Copiar todo + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copiar todo - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Acceso directo creado + View report + View report - Shortcut created successfully! - ¡Acceso directo creado con éxito! + Submit a report + Submit a report - Error - Error + Shortcut creation + Acceso directo creado - Error creating shortcut! - ¡Error al crear el acceso directo! + Shortcut created successfully! + ¡Acceso directo creado con éxito! - Install PKG - Instalar PKG + Error + Error - Game - Game + Error creating shortcut! + ¡Error al crear el acceso directo! - This game has no update to delete! - This game has no update to delete! + Install PKG + Instalar PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Elegir carpeta + shadPS4 - Choose directory + shadPS4 - Elegir carpeta - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Abrir/Agregar carpeta Elf + Open/Add Elf Folder + Abrir/Agregar carpeta Elf - Install Packages (PKG) - Instalar paquetes (PKG) + Install Packages (PKG) + Instalar paquetes (PKG) - Boot Game - Iniciar juego + Boot Game + Iniciar juego - Check for Updates - Buscar actualizaciones + Check for Updates + Buscar actualizaciones - About shadPS4 - Acerca de shadPS4 + About shadPS4 + Acerca de shadPS4 - Configure... - Configurar... + Configure... + Configurar... - Install application from a .pkg file - Instalar aplicación desde un archivo .pkg + Install application from a .pkg file + Instalar aplicación desde un archivo .pkg - Recent Games - Juegos recientes + Recent Games + Juegos recientes - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Salir + Exit + Salir - Exit shadPS4 - Salir de shadPS4 + Exit shadPS4 + Salir de shadPS4 - Exit the application. - Salir de la aplicación. + Exit the application. + Salir de la aplicación. - Show Game List - Mostrar lista de juegos + Show Game List + Mostrar lista de juegos - Game List Refresh - Actualizar lista de juegos + Game List Refresh + Actualizar lista de juegos - Tiny - Muy pequeño + Tiny + Muy pequeño - Small - Pequeño + Small + Pequeño - Medium - Mediano + Medium + Mediano - Large - Grande + Large + Grande - List View - Vista de lista + List View + Vista de lista - Grid View - Vista de cuadrícula + Grid View + Vista de cuadrícula - Elf Viewer - Vista Elf + Elf Viewer + Vista Elf - Game Install Directory - Carpeta de instalación de los juegos + Game Install Directory + Carpeta de instalación de los juegos - Download Cheats/Patches - Descargar Trucos / Parches + Download Cheats/Patches + Descargar Trucos / Parches - Dump Game List - Volcar lista de juegos + Dump Game List + Volcar lista de juegos - PKG Viewer - Vista PKG + PKG Viewer + Vista PKG - Search... - Buscar... + Search... + Buscar... - File - Archivo + File + Archivo - View - Vista + View + Vista - Game List Icons - Iconos de los juegos + Game List Icons + Iconos de los juegos - Game List Mode - Tipo de lista + Game List Mode + Tipo de lista - Settings - Configuración + Settings + Configuración - Utils - Utilidades + Utils + Utilidades - Themes - Temas + Themes + Temas - Help - Ayuda + Help + Ayuda - Dark - Oscuro + Dark + Oscuro - Light - Claro + Light + Claro - Green - Verde + Green + Verde - Blue - Azul + Blue + Azul - Violet - Violeta + Violet + Violeta - toolBar - Barra de herramientas + toolBar + Barra de herramientas - Game List - Lista de juegos + Game List + Lista de juegos - * Unsupported Vulkan Version - * Versión de Vulkan no soportada + * Unsupported Vulkan Version + * Versión de Vulkan no soportada - Download Cheats For All Installed Games - Descargar trucos para todos los juegos instalados + Download Cheats For All Installed Games + Descargar trucos para todos los juegos instalados - Download Patches For All Games - Descargar parches para todos los juegos + Download Patches For All Games + Descargar parches para todos los juegos - Download Complete - Descarga completa + Download Complete + Descarga completa - You have downloaded cheats for all the games you have installed. - Has descargado trucos para todos los juegos que tienes instalados. + You have downloaded cheats for all the games you have installed. + Has descargado trucos para todos los juegos que tienes instalados. - Patches Downloaded Successfully! - ¡Parches descargados exitosamente! + Patches Downloaded Successfully! + ¡Parches descargados exitosamente! - All Patches available for all games have been downloaded. - Todos los parches disponibles han sido descargados para todos los juegos. + All Patches available for all games have been downloaded. + Todos los parches disponibles han sido descargados para todos los juegos. - Games: - Juegos: + Games: + Juegos: - ELF files (*.bin *.elf *.oelf) - Archivos ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Archivos ELF (*.bin *.elf *.oelf) - Game Boot - Inicio del juego + Game Boot + Inicio del juego - Only one file can be selected! - ¡Solo se puede seleccionar un archivo! + Only one file can be selected! + ¡Solo se puede seleccionar un archivo! - PKG Extraction - Extracción de PKG + PKG Extraction + Extracción de PKG - Patch detected! - ¡Actualización detectada! + Patch detected! + ¡Actualización detectada! - PKG and Game versions match: - Las versiones de PKG y del juego coinciden: + PKG and Game versions match: + Las versiones de PKG y del juego coinciden: - Would you like to overwrite? - ¿Desea sobrescribir? + Would you like to overwrite? + ¿Desea sobrescribir? - PKG Version %1 is older than installed version: - La versión de PKG %1 es más antigua que la versión instalada: + PKG Version %1 is older than installed version: + La versión de PKG %1 es más antigua que la versión instalada: - Game is installed: - El juego está instalado: + Game is installed: + El juego está instalado: - Would you like to install Patch: - ¿Desea instalar la actualización: + Would you like to install Patch: + ¿Desea instalar la actualización: - DLC Installation - Instalación de DLC + DLC Installation + Instalación de DLC - Would you like to install DLC: %1? - ¿Desea instalar el DLC: %1? + Would you like to install DLC: %1? + ¿Desea instalar el DLC: %1? - DLC already installed: - DLC ya instalado: + DLC already installed: + DLC ya instalado: - Game already installed - Juego ya instalado + Game already installed + Juego ya instalado - PKG ERROR - ERROR PKG + PKG ERROR + ERROR PKG - Extracting PKG %1/%2 - Extrayendo PKG %1/%2 + Extracting PKG %1/%2 + Extrayendo PKG %1/%2 - Extraction Finished - Extracción terminada + Extraction Finished + Extracción terminada - Game successfully installed at %1 - Juego instalado exitosamente en %1 + Game successfully installed at %1 + Juego instalado exitosamente en %1 - File doesn't appear to be a valid PKG file - El archivo parece no ser un archivo PKG válido + File doesn't appear to be a valid PKG file + El archivo parece no ser un archivo PKG válido - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Abrir carpeta + Open Folder + Abrir carpeta - Name - Nombre + PKG ERROR + ERROR PKG - Serial - Numero de serie + Name + Nombre - Installed - + Serial + Numero de serie - Size - Tamaño + Installed + Installed - Category - + Size + Tamaño - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Región + FW + FW - Flags - + Region + Región - Path - Ruta + Flags + Flags - File - Archivo + Path + Ruta - PKG ERROR - ERROR PKG + File + Archivo - Unknown - Desconocido + Unknown + Desconocido - Package - + Package + Package - - + + SettingsDialog - Settings - Configuración + Settings + Configuración - General - General + General + General - System - Sistema + System + Sistema - Console Language - Idioma de la consola + Console Language + Idioma de la consola - Emulator Language - Idioma del emulador + Emulator Language + Idioma del emulador - Emulator - Emulador + Emulator + Emulador - Enable Fullscreen - Habilitar pantalla completa + Enable Fullscreen + Habilitar pantalla completa - Fullscreen Mode - Modo de Pantalla Completa + Fullscreen Mode + Modo de Pantalla Completa - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Pestaña predeterminada al abrir la configuración + Default tab when opening settings + Pestaña predeterminada al abrir la configuración - Show Game Size In List - Mostrar Tamaño del Juego en la Lista + Show Game Size In List + Mostrar Tamaño del Juego en la Lista - Show Splash - Mostrar splash + Show Splash + Mostrar splash - Enable Discord Rich Presence - Habilitar Discord Rich Presence + Enable Discord Rich Presence + Habilitar Discord Rich Presence - Username - Nombre de usuario + Username + Nombre de usuario - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Registro + Logger + Registro - Log Type - Tipo de registro + Log Type + Tipo de registro - Log Filter - Filtro de registro + Log Filter + Filtro de registro - Open Log Location - Abrir ubicación del registro + Open Log Location + Abrir ubicación del registro - Input - Entrada + Input + Entrada - Cursor - Cursor + Cursor + Cursor - Hide Cursor - Ocultar cursor + Hide Cursor + Ocultar cursor - Hide Cursor Idle Timeout - Tiempo de espera para ocultar cursor inactivo + Hide Cursor Idle Timeout + Tiempo de espera para ocultar cursor inactivo - s - s + s + s - Controller - Controlador + Controller + Controlador - Back Button Behavior - Comportamiento del botón de retroceso + Back Button Behavior + Comportamiento del botón de retroceso - Graphics - Gráficos + Graphics + Gráficos - GUI - Interfaz + GUI + Interfaz - User - Usuario + User + Usuario - Graphics Device - Dispositivo gráfico + Graphics Device + Dispositivo gráfico - Width - Ancho + Width + Ancho - Height - Alto + Height + Alto - Vblank Divider - Divisor de Vblank + Vblank Divider + Divisor de Vblank - Advanced - Avanzado + Advanced + Avanzado - Enable Shaders Dumping - Habilitar volcado de shaders + Enable Shaders Dumping + Habilitar volcado de shaders - Enable NULL GPU - Habilitar GPU NULL + Enable NULL GPU + Habilitar GPU NULL - Paths - Rutas + Enable HDR + Enable HDR - Game Folders - Carpetas de juego + Paths + Rutas - Add... - Añadir... + Game Folders + Carpetas de juego - Remove - Eliminar + Add... + Añadir... - Debug - Depuración + Remove + Eliminar - Enable Debug Dumping - Habilitar volcado de depuración + Debug + Depuración - Enable Vulkan Validation Layers - Habilitar capas de validación de Vulkan + Enable Debug Dumping + Habilitar volcado de depuración - Enable Vulkan Synchronization Validation - Habilitar validación de sincronización de Vulkan + Enable Vulkan Validation Layers + Habilitar capas de validación de Vulkan - Enable RenderDoc Debugging - Habilitar depuración de RenderDoc + Enable Vulkan Synchronization Validation + Habilitar validación de sincronización de Vulkan - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Habilitar depuración de RenderDoc - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Actualización + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Buscar actualizaciones al iniciar + Update + Actualización - Always Show Changelog - Mostrar siempre el registro de cambios + Check for Updates at Startup + Buscar actualizaciones al iniciar - Update Channel - Canal de Actualización + Always Show Changelog + Mostrar siempre el registro de cambios - Check for Updates - Verificar actualizaciones + Update Channel + Canal de Actualización - GUI Settings - Configuraciones de la Interfaz + Check for Updates + Verificar actualizaciones - Title Music - Title Music + GUI Settings + Configuraciones de la Interfaz - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Background Image - Imagen de fondo + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Show Background Image - Mostrar Imagen de Fondo + Background Image + Imagen de fondo - Opacity - Opacidad + Show Background Image + Mostrar Imagen de Fondo - Play title music - Reproducir la música de apertura + Opacity + Opacidad - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Play title music + Reproducir la música de apertura - Game Compatibility - Game Compatibility + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Display Compatibility Data - Display Compatibility Data + Game Compatibility + Game Compatibility - Update Compatibility Database - Update Compatibility Database + Display Compatibility Data + Display Compatibility Data - Volume - Volumen + Update Compatibility Database + Update Compatibility Database - Save - Guardar + Volume + Volumen - Apply - Aplicar + Save + Guardar - Restore Defaults - Restaurar Valores Predeterminados + Apply + Aplicar - Close - Cerrar + Restore Defaults + Restaurar Valores Predeterminados - Point your mouse at an option to display its description. - Coloque el mouse sobre una opción para mostrar su descripción. + Close + Cerrar - consoleLanguageGroupBox - Idioma de la Consola:\nEstablece el idioma que utiliza el juego de PS4.\nSe recomienda configurarlo a un idioma que el juego soporte, lo cual varía por región. + Point your mouse at an option to display its description. + Coloque el mouse sobre una opción para mostrar su descripción. - emulatorLanguageGroupBox - Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. + consoleLanguageGroupBox + Idioma de la Consola:\nEstablece el idioma que utiliza el juego de PS4.\nSe recomienda configurarlo a un idioma que el juego soporte, lo cual varía por región. - fullscreenCheckBox - Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. + emulatorLanguageGroupBox + Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + fullscreenCheckBox + Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. - showSplashCheckBox - Mostrar Pantalla de Inicio:\nMuestra la pantalla de inicio del juego (una imagen especial) mientras el juego se está iniciando. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - discordRPCCheckbox - Habilitar Discord Rich Presence:\nMuestra el ícono del emulador y la información relevante en tu perfil de Discord. + showSplashCheckBox + Mostrar Pantalla de Inicio:\nMuestra la pantalla de inicio del juego (una imagen especial) mientras el juego se está iniciando. - userName - Nombre de Usuario:\nEstablece el nombre de usuario de la cuenta de PS4, que puede ser mostrado por algunos juegos. + discordRPCCheckbox + Habilitar Discord Rich Presence:\nMuestra el ícono del emulador y la información relevante en tu perfil de Discord. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + userName + Nombre de Usuario:\nEstablece el nombre de usuario de la cuenta de PS4, que puede ser mostrado por algunos juegos. - logTypeGroupBox - Tipo de Registro:\nEstablece si sincronizar la salida de la ventana de registro para mejorar el rendimiento. Puede tener efectos adversos en la emulación. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logFilter - Filtro de Registro:\nFiltra el registro para imprimir solo información específica.\nEjemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior. + logTypeGroupBox + Tipo de Registro:\nEstablece si sincronizar la salida de la ventana de registro para mejorar el rendimiento. Puede tener efectos adversos en la emulación. - updaterGroupBox - Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. + logFilter + Filtro de Registro:\nFiltra el registro para imprimir solo información específica.\nEjemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior. - GUIBackgroundImageGroupBox - Imagen de fondo:\nControle la opacidad de la imagen de fondo del juego. + updaterGroupBox + Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. - GUIMusicGroupBox - Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. + GUIBackgroundImageGroupBox + Imagen de fondo:\nControle la opacidad de la imagen de fondo del juego. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + GUIMusicGroupBox + Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. - hideCursorGroupBox - Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - idleTimeoutGroupBox - Establezca un tiempo para que el mouse desaparezca después de estar inactivo. + hideCursorGroupBox + Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse. - backButtonBehaviorGroupBox - Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4. + idleTimeoutGroupBox + Establezca un tiempo para que el mouse desaparezca después de estar inactivo. - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + backButtonBehaviorGroupBox + Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Never - Nunca + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Idle - Inactivo + Never + Nunca - Always - Siempre + Idle + Inactivo - Touchpad Left - Touchpad Izquierda + Always + Siempre - Touchpad Right - Touchpad Derecha + Touchpad Left + Touchpad Izquierda - Touchpad Center - Centro del Touchpad + Touchpad Right + Touchpad Derecha - None - Ninguno + Touchpad Center + Centro del Touchpad - graphicsAdapterGroupBox - Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona "Auto Select" para determinarla automáticamente. + None + Ninguno - resolutionLayout - Anchura/Altura:\nEstablece el tamaño de la ventana del emulador al iniciar, que se puede redimensionar durante el juego.\nEsto es diferente de la resolución en el juego. + graphicsAdapterGroupBox + Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona "Auto Select" para determinarla automáticamente. - heightDivider - Divisor de Vblank:\nLa tasa de cuadros a la que se refresca el emulador se multiplica por este número. Cambiar esto puede tener efectos adversos, como aumentar la velocidad del juego, o romper la funcionalidad crítica del juego que no espera que esto cambie. + resolutionLayout + Anchura/Altura:\nEstablece el tamaño de la ventana del emulador al iniciar, que se puede redimensionar durante el juego.\nEsto es diferente de la resolución en el juego. - dumpShadersCheckBox - Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. + heightDivider + Divisor de Vblank:\nLa tasa de cuadros a la que se refresca el emulador se multiplica por este número. Cambiar esto puede tener efectos adversos, como aumentar la velocidad del juego, o romper la funcionalidad crítica del juego que no espera que esto cambie. - nullGpuCheckBox - Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica. + dumpShadersCheckBox + Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. - gameFoldersBox - Carpetas de Juegos:\nLa lista de carpetas para verificar los juegos instalados. + nullGpuCheckBox + Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica. - addFolderButton - Añadir:\nAgregar una carpeta a la lista. + enableHDRCheckBox + enableHDRCheckBox - removeFolderButton - Eliminar:\nEliminar una carpeta de la lista. + gameFoldersBox + Carpetas de Juegos:\nLa lista de carpetas para verificar los juegos instalados. - debugDump - Habilitar la Volcadura de Depuración:\nGuarda los símbolos de importación y exportación y la información del encabezado del archivo del programa de PS4 que se está ejecutando actualmente en un directorio. + addFolderButton + Añadir:\nAgregar una carpeta a la lista. - vkValidationCheckBox - Habilitar Capas de Validación de Vulkan:\nHabilita un sistema que valida el estado del renderizador de Vulkan y registra información sobre su estado interno. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. + removeFolderButton + Eliminar:\nEliminar una carpeta de la lista. - vkSyncValidationCheckBox - Habilitar Validación de Sincronización de Vulkan:\nHabilita un sistema que valida el tiempo de las tareas de renderizado de Vulkan. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. + debugDump + Habilitar la Volcadura de Depuración:\nGuarda los símbolos de importación y exportación y la información del encabezado del archivo del programa de PS4 que se está ejecutando actualmente en un directorio. - rdocCheckBox - Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. + vkValidationCheckBox + Habilitar Capas de Validación de Vulkan:\nHabilita un sistema que valida el estado del renderizador de Vulkan y registra información sobre su estado interno. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + vkSyncValidationCheckBox + Habilitar Validación de Sincronización de Vulkan:\nHabilita un sistema que valida el tiempo de las tareas de renderizado de Vulkan. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + rdocCheckBox + Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Borderless - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - True - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Enable HDR - + saveDataBox + saveDataBox - Release - + browseButton + browseButton - Nightly - + Borderless + Borderless - Set the volume of the background music. - + True + True - Enable Motion Controls - + Release + Release - Save Data Path - + Nightly + Nightly - Browse - Buscar + Set the volume of the background music. + Set the volume of the background music. - async - + Enable Motion Controls + Enable Motion Controls - sync - + Save Data Path + Save Data Path - Auto Select - + Browse + Buscar - Directory to install games - Carpeta para instalar juegos + async + async - Directory to save data - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Carpeta para instalar juegos - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Vista de trofeos + Trophy Viewer + Vista de trofeos - + diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 81ff8e901..cc5e2e762 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - درباره ShadPS4 + About shadPS4 + درباره ShadPS4 - shadPS4 - ShadPS4 + shadPS4 + ShadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - یک شبیه ساز متن باز برای پلی استیشن 4 است. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + یک شبیه ساز متن باز برای پلی استیشن 4 است. - This software should not be used to play games you have not legally obtained. - این برنامه نباید برای بازی هایی که شما به صورت غیرقانونی به دست آوردید استفاده شود. + This software should not be used to play games you have not legally obtained. + این برنامه نباید برای بازی هایی که شما به صورت غیرقانونی به دست آوردید استفاده شود. - - + + CheatsPatches - Cheats / Patches for - چیت / پچ برای + Cheats / Patches for + چیت / پچ برای - defaultTextEdit_MSG - defaultTextEdit_MSG + defaultTextEdit_MSG + defaultTextEdit_MSG - No Image Available - تصویری موجود نمی باشد + No Image Available + تصویری موجود نمی باشد - Serial: - سریال: + Serial: + سریال: - Version: - نسخه: + Version: + نسخه: - Size: - حجم: + Size: + حجم: - Select Cheat File: - فایل چیت را انتخاب کنید: + Select Cheat File: + فایل چیت را انتخاب کنید: - Repository: - :منبع + Repository: + :منبع - Download Cheats - دانلود چیت ها + Download Cheats + دانلود چیت ها - Delete File - حذف فایل + Delete File + حذف فایل - No files selected. - فایلی انتخاب نشده. + No files selected. + فایلی انتخاب نشده. - You can delete the cheats you don't want after downloading them. - شما میتوانید بعد از دانلود چیت هایی که نمیخواهید را پاک کنید + You can delete the cheats you don't want after downloading them. + شما میتوانید بعد از دانلود چیت هایی که نمیخواهید را پاک کنید - Do you want to delete the selected file?\n%1 - آیا میخواهید فایل های انتخاب شده را پاک کنید؟ \n%1 + Do you want to delete the selected file?\n%1 + آیا میخواهید فایل های انتخاب شده را پاک کنید؟ \n%1 - Select Patch File: - فایل پچ را انتخاب کنید + Select Patch File: + فایل پچ را انتخاب کنید - Download Patches - دانلود کردن پچ ها + Download Patches + دانلود کردن پچ ها - Save - ذخیره + Save + ذخیره - Cheats - چیت ها + Cheats + چیت ها - Patches - پچ ها + Patches + پچ ها - Error - ارور + Error + ارور - No patch selected. - هیچ پچ انتخاب نشده + No patch selected. + هیچ پچ انتخاب نشده - Unable to open files.json for reading. - .json مشکل در خواندن فایل + Unable to open files.json for reading. + .json مشکل در خواندن فایل - No patch file found for the current serial. - هیچ فایل پچ برای سریال بازی شما پیدا نشد. + No patch file found for the current serial. + هیچ فایل پچ برای سریال بازی شما پیدا نشد. - Unable to open the file for reading. - خطا در خواندن فایل + Unable to open the file for reading. + خطا در خواندن فایل - Unable to open the file for writing. - خطا در نوشتن فایل + Unable to open the file for writing. + خطا در نوشتن فایل - Failed to parse XML: - انجام نشد XML تجزیه فایل: + Failed to parse XML: + انجام نشد XML تجزیه فایل: - Success - عملیات موفق بود + Success + عملیات موفق بود - Options saved successfully. - تغییرات با موفقیت ذخیره شد✅ + Options saved successfully. + تغییرات با موفقیت ذخیره شد✅ - Invalid Source - منبع نامعتبر❌ + Invalid Source + منبع نامعتبر❌ - The selected source is invalid. - منبع انتخاب شده نامعتبر است + The selected source is invalid. + منبع انتخاب شده نامعتبر است - File Exists - فایل وجود دارد + File Exists + فایل وجود دارد - File already exists. Do you want to replace it? - فایل از قبل وجود دارد. آیا می خواهید آن را جایگزین کنید؟ + File already exists. Do you want to replace it? + فایل از قبل وجود دارد. آیا می خواهید آن را جایگزین کنید؟ - Failed to save file: - ذخیره فایل موفقیت آمیز نبود: + Failed to save file: + ذخیره فایل موفقیت آمیز نبود: - Failed to download file: - خطا در دانلود فایل: + Failed to download file: + خطا در دانلود فایل: - Cheats Not Found - چیت یافت نشد + Cheats Not Found + چیت یافت نشد - CheatsNotFound_MSG - متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید. + CheatsNotFound_MSG + متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید. - Cheats Downloaded Successfully - دانلود چیت ها موفقیت آمیز بود✅ + Cheats Downloaded Successfully + دانلود چیت ها موفقیت آمیز بود✅ - CheatsDownloadedSuccessfully_MSG - تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید. + CheatsDownloadedSuccessfully_MSG + تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید. - Failed to save: - خطا در ذخیره اطلاعات: + Failed to save: + خطا در ذخیره اطلاعات: - Failed to download: - خطا در دانلود❌ + Failed to download: + خطا در دانلود❌ - Download Complete - دانلود کامل شد + Download Complete + دانلود کامل شد - DownloadComplete_MSG - پچ ها با موفقیت بارگیری شدند! تمام وصله های موجود برای همه بازی ها دانلود شده اند، نیازی به دانلود جداگانه آنها برای هر بازی نیست، همانطور که در Cheats اتفاق می افتد. اگر پچ ظاهر نشد، ممکن است برای سریال و نسخه خاصی از بازی وجود نداشته باشد. + DownloadComplete_MSG + پچ ها با موفقیت بارگیری شدند! تمام وصله های موجود برای همه بازی ها دانلود شده اند، نیازی به دانلود جداگانه آنها برای هر بازی نیست، همانطور که در Cheats اتفاق می افتد. اگر پچ ظاهر نشد، ممکن است برای سریال و نسخه خاصی از بازی وجود نداشته باشد. - Failed to parse JSON data from HTML. - HTML از JSON خطا در تجزیه اطلاعات. + Failed to parse JSON data from HTML. + HTML از JSON خطا در تجزیه اطلاعات. - Failed to retrieve HTML page. - HTML خطا دربازیابی صفحه + Failed to retrieve HTML page. + HTML خطا دربازیابی صفحه - The game is in version: %1 - بازی در نسخه: %1 است + The game is in version: %1 + بازی در نسخه: %1 است - The downloaded patch only works on version: %1 - وصله دانلود شده فقط در نسخه: %1 کار می کند + The downloaded patch only works on version: %1 + وصله دانلود شده فقط در نسخه: %1 کار می کند - You may need to update your game. - شاید لازم باشد بازی خود را به روز کنید. + You may need to update your game. + شاید لازم باشد بازی خود را به روز کنید. - Incompatibility Notice - اطلاعیه عدم سازگاری + Incompatibility Notice + اطلاعیه عدم سازگاری - Failed to open file: - خطا در اجرای فایل: + Failed to open file: + خطا در اجرای فایل: - XML ERROR: - XML ERROR: + XML ERROR: + XML ERROR: - Failed to open files.json for writing - .json خطا در نوشتن فایل + Failed to open files.json for writing + .json خطا در نوشتن فایل - Author: - تولید کننده: + Author: + تولید کننده: - Directory does not exist: - پوشه وجود ندارد: + Directory does not exist: + پوشه وجود ندارد: - Failed to open files.json for reading. - .json خطا در خواندن فایل + Failed to open files.json for reading. + .json خطا در خواندن فایل - Name: - نام: + Name: + نام: - Can't apply cheats before the game is started - قبل از شروع بازی نمی توانید تقلب ها را اعمال کنید. + Can't apply cheats before the game is started + قبل از شروع بازی نمی توانید تقلب ها را اعمال کنید. - Close - بستن + Close + بستن - - + + CheckUpdate - Auto Updater - به‌روزرسانی خودکار + Auto Updater + به‌روزرسانی خودکار - Error - خطا + Error + خطا - Network error: - خطای شبکه: + Network error: + خطای شبکه: - Error_Github_limit_MSG - به‌روزرسانی خودکار حداکثر ۶۰ بررسی به‌روزرسانی در ساعت را مجاز می‌داند.\nشما به این محدودیت رسیده‌اید. لطفاً بعداً دوباره امتحان کنید. + Error_Github_limit_MSG + به‌روزرسانی خودکار حداکثر ۶۰ بررسی به‌روزرسانی در ساعت را مجاز می‌داند.\nشما به این محدودیت رسیده‌اید. لطفاً بعداً دوباره امتحان کنید. - Failed to parse update information. - خطا در تجزیه اطلاعات بهروزرسانی. + Failed to parse update information. + خطا در تجزیه اطلاعات بهروزرسانی. - No pre-releases found. - هیچ پیش انتشاری یافت نشد. + No pre-releases found. + هیچ پیش انتشاری یافت نشد. - Invalid release data. - داده های نسخه نامعتبر است. + Invalid release data. + داده های نسخه نامعتبر است. - No download URL found for the specified asset. - هیچ URL دانلودی برای دارایی مشخص شده پیدا نشد. + No download URL found for the specified asset. + هیچ URL دانلودی برای دارایی مشخص شده پیدا نشد. - Your version is already up to date! - نسخه شما اکنون به روز شده است! + Your version is already up to date! + نسخه شما اکنون به روز شده است! - Update Available - به روز رسانی موجود است + Update Available + به روز رسانی موجود است - Update Channel - کانال به‌روزرسانی + Update Channel + کانال به‌روزرسانی - Current Version - نسخه فعلی + Current Version + نسخه فعلی - Latest Version - جدیدترین نسخه + Latest Version + جدیدترین نسخه - Do you want to update? - آیا می خواهید به روز رسانی کنید؟ + Do you want to update? + آیا می خواهید به روز رسانی کنید؟ - Show Changelog - نمایش تغییرات + Show Changelog + نمایش تغییرات - Check for Updates at Startup - بررسی به‌روزرسانی هنگام شروع + Check for Updates at Startup + بررسی به‌روزرسانی هنگام شروع - Update - به روز رسانی + Update + به روز رسانی - No - خیر + No + خیر - Hide Changelog - مخفی کردن تغییرات + Hide Changelog + مخفی کردن تغییرات - Changes - تغییرات + Changes + تغییرات - Network error occurred while trying to access the URL - در حین تلاش برای دسترسی به URL خطای شبکه رخ داد + Network error occurred while trying to access the URL + در حین تلاش برای دسترسی به URL خطای شبکه رخ داد - Download Complete - دانلود کامل شد + Download Complete + دانلود کامل شد - The update has been downloaded, press OK to install. - به روز رسانی دانلود شده است، برای نصب OK را فشار دهید. + The update has been downloaded, press OK to install. + به روز رسانی دانلود شده است، برای نصب OK را فشار دهید. - Failed to save the update file at - فایل به روز رسانی ذخیره نشد + Failed to save the update file at + فایل به روز رسانی ذخیره نشد - Starting Update... - شروع به روز رسانی... + Starting Update... + شروع به روز رسانی... - Failed to create the update script file - فایل اسکریپت به روز رسانی ایجاد نشد + Failed to create the update script file + فایل اسکریپت به روز رسانی ایجاد نشد - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - در حال بارگذاری داده‌های سازگاری، لطفاً صبر کنید + Fetching compatibility data, please wait + در حال بارگذاری داده‌های سازگاری، لطفاً صبر کنید - Cancel - لغو + Cancel + لغو - Loading... - در حال بارگذاری... + Loading... + در حال بارگذاری... - Error - خطا + Error + خطا - Unable to update compatibility data! Try again later. - ناتوان از بروزرسانی داده‌های سازگاری! لطفاً بعداً دوباره تلاش کنید. + Unable to update compatibility data! Try again later. + ناتوان از بروزرسانی داده‌های سازگاری! لطفاً بعداً دوباره تلاش کنید. - Unable to open compatibility_data.json for writing. - امکان باز کردن compatibility_data.json برای نوشتن وجود ندارد. + Unable to open compatibility_data.json for writing. + امکان باز کردن compatibility_data.json برای نوشتن وجود ندارد. - Unknown - ناشناخته + Unknown + ناشناخته - Nothing - هیچ چیز + Nothing + هیچ چیز - Boots - چکمه‌ها + Boots + چکمه‌ها - Menus - منوها + Menus + منوها - Ingame - داخل بازی + Ingame + داخل بازی - Playable - قابل بازی + Playable + قابل بازی - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - فولدر را بازکن + Open Folder + فولدر را بازکن - - + + GameInfoClass - Loading game list, please wait :3 - درحال بارگیری لیست بازی ها,لطفا کمی صبرکنید :3 + Loading game list, please wait :3 + درحال بارگیری لیست بازی ها,لطفا کمی صبرکنید :3 - Cancel - لغو + Cancel + لغو - Loading... - ...درحال بارگیری + Loading... + ...درحال بارگیری - - + + GameInstallDialog - shadPS4 - Choose directory - ShadPS4 - انتخاب محل نصب بازی + shadPS4 - Choose directory + ShadPS4 - انتخاب محل نصب بازی - Directory to install games - محل نصب بازی ها + Directory to install games + محل نصب بازی ها - Browse - انتخاب دستی + Browse + انتخاب دستی - Error - ارور + Error + ارور - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - آیکون + Icon + آیکون - Name - نام + Name + نام - Serial - سریال + Serial + سریال - Compatibility - سازگاری + Compatibility + سازگاری - Region - منطقه + Region + منطقه - Firmware - فریم‌ور + Firmware + فریم‌ور - Size - اندازه + Size + اندازه - Version - نسخه + Version + نسخه - Path - مسیر + Path + مسیر - Play Time - زمان بازی + Play Time + زمان بازی - Never Played - هرگز بازی نشده + Never Played + هرگز بازی نشده - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - سازگاری تست نشده است + Compatibility is untested + سازگاری تست نشده است - Game does not initialize properly / crashes the emulator - بازی به درستی راه‌اندازی نمی‌شود / شبیه‌ساز کرش می‌کند + Game does not initialize properly / crashes the emulator + بازی به درستی راه‌اندازی نمی‌شود / شبیه‌ساز کرش می‌کند - Game boots, but only displays a blank screen - بازی اجرا می‌شود، اما فقط یک صفحه خالی نمایش داده می‌شود + Game boots, but only displays a blank screen + بازی اجرا می‌شود، اما فقط یک صفحه خالی نمایش داده می‌شود - Game displays an image but does not go past the menu - بازی تصویری نمایش می‌دهد، اما از منو فراتر نمی‌رود + Game displays an image but does not go past the menu + بازی تصویری نمایش می‌دهد، اما از منو فراتر نمی‌رود - Game has game-breaking glitches or unplayable performance - بازی دارای اشکالات بحرانی یا عملکرد غیرقابل بازی است + Game has game-breaking glitches or unplayable performance + بازی دارای اشکالات بحرانی یا عملکرد غیرقابل بازی است - Game can be completed with playable performance and no major glitches - بازی با عملکرد قابل قبول و بدون اشکالات عمده قابل بازی است. + Game can be completed with playable performance and no major glitches + بازی با عملکرد قابل قبول و بدون اشکالات عمده قابل بازی است. - Click to see details on github - برای مشاهده جزئیات در GitHub کلیک کنید + Click to see details on github + برای مشاهده جزئیات در GitHub کلیک کنید - Last updated - آخرین به‌روزرسانی + Last updated + آخرین به‌روزرسانی - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - ایجاد میانبر + Create Shortcut + ایجاد میانبر - Cheats / Patches - چیت/پچ ها + Cheats / Patches + چیت/پچ ها - SFO Viewer - SFO مشاهده + SFO Viewer + SFO مشاهده - Trophy Viewer - مشاهده جوایز + Trophy Viewer + مشاهده جوایز - Open Folder... - باز کردن پوشه... + Open Folder... + باز کردن پوشه... - Open Game Folder - باز کردن پوشه بازی + Open Game Folder + باز کردن پوشه بازی - Open Save Data Folder - پوشه ذخیره داده را باز کنید + Open Save Data Folder + پوشه ذخیره داده را باز کنید - Open Log Folder - باز کردن پوشه لاگ + Open Log Folder + باز کردن پوشه لاگ - Copy info... - ...کپی کردن اطلاعات + Copy info... + ...کپی کردن اطلاعات - Copy Name - کپی کردن نام + Copy Name + کپی کردن نام - Copy Serial - کپی کردن سریال + Copy Serial + کپی کردن سریال - Copy All - کپی کردن تمامی مقادیر + Copy Version + Copy Version - Delete... - حذف... + Copy Size + Copy Size - Delete Game - حذف بازی + Copy All + کپی کردن تمامی مقادیر - Delete Update - حذف به‌روزرسانی + Delete... + حذف... - Delete DLC - حذف محتوای اضافی (DLC) + Delete Game + حذف بازی - Compatibility... - Compatibility... + Delete Update + حذف به‌روزرسانی - Update database - Update database + Delete DLC + حذف محتوای اضافی (DLC) - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - ایجاد میانبر + View report + View report - Shortcut created successfully! - میانبر با موفقیت ساخته شد! + Submit a report + Submit a report - Error - ارور + Shortcut creation + ایجاد میانبر - Error creating shortcut! - مشکلی در هنگام ساخت میانبر بوجود آمد! + Shortcut created successfully! + میانبر با موفقیت ساخته شد! - Install PKG - نصب PKG + Error + ارور - Game - بازی + Error creating shortcut! + مشکلی در هنگام ساخت میانبر بوجود آمد! - This game has no update to delete! - این بازی به‌روزرسانی‌ای برای حذف ندارد! + Install PKG + نصب PKG - Update - به‌روزرسانی + Game + بازی - This game has no DLC to delete! - این بازی محتوای اضافی (DLC) برای حذف ندارد! + This game has no update to delete! + این بازی به‌روزرسانی‌ای برای حذف ندارد! - DLC - DLC + Update + به‌روزرسانی - Delete %1 - حذف %1 + This game has no DLC to delete! + این بازی محتوای اضافی (DLC) برای حذف ندارد! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + حذف %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - ShadPS4 - انتخاب محل نصب بازی + shadPS4 - Choose directory + ShadPS4 - انتخاب محل نصب بازی - Select which directory you want to install to. - محلی را که می‌خواهید در آن نصب شود، انتخاب کنید. + Select which directory you want to install to. + محلی را که می‌خواهید در آن نصب شود، انتخاب کنید. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - ELF بازکردن/ساختن پوشه + Open/Add Elf Folder + ELF بازکردن/ساختن پوشه - Install Packages (PKG) - نصب بسته (PKG) + Install Packages (PKG) + نصب بسته (PKG) - Boot Game - اجرای بازی + Boot Game + اجرای بازی - Check for Updates - به روز رسانی را بررسی کنید + Check for Updates + به روز رسانی را بررسی کنید - About shadPS4 - ShadPS4 درباره + About shadPS4 + ShadPS4 درباره - Configure... - ...تنظیمات + Configure... + ...تنظیمات - Install application from a .pkg file - .PKG نصب بازی از فایل + Install application from a .pkg file + .PKG نصب بازی از فایل - Recent Games - بازی های اخیر + Recent Games + بازی های اخیر - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - خروج + Exit + خروج - Exit shadPS4 - ShadPS4 بستن + Exit shadPS4 + ShadPS4 بستن - Exit the application. - بستن برنامه + Exit the application. + بستن برنامه - Show Game List - نشان دادن بازی ها + Show Game List + نشان دادن بازی ها - Game List Refresh - رفرش لیست بازی ها + Game List Refresh + رفرش لیست بازی ها - Tiny - کوچک ترین + Tiny + کوچک ترین - Small - کوچک + Small + کوچک - Medium - متوسط + Medium + متوسط - Large - بزرگ + Large + بزرگ - List View - نمایش لیست + List View + نمایش لیست - Grid View - شبکه ای (چهارخونه) + Grid View + شبکه ای (چهارخونه) - Elf Viewer - مشاهده گر Elf + Elf Viewer + مشاهده گر Elf - Game Install Directory - محل نصب بازی + Game Install Directory + محل نصب بازی - Download Cheats/Patches - دانلود چیت/پچ + Download Cheats/Patches + دانلود چیت/پچ - Dump Game List - استخراج لیست بازی ها + Dump Game List + استخراج لیست بازی ها - PKG Viewer - PKG مشاهده گر + PKG Viewer + PKG مشاهده گر - Search... - جست و جو... + Search... + جست و جو... - File - فایل + File + فایل - View - شخصی سازی + View + شخصی سازی - Game List Icons - آیکون ها + Game List Icons + آیکون ها - Game List Mode - حالت نمایش لیست بازی ها + Game List Mode + حالت نمایش لیست بازی ها - Settings - تنظیمات + Settings + تنظیمات - Utils - ابزارها + Utils + ابزارها - Themes - تم ها + Themes + تم ها - Help - کمک + Help + کمک - Dark - تیره + Dark + تیره - Light - روشن + Light + روشن - Green - سبز + Green + سبز - Blue - آبی + Blue + آبی - Violet - بنفش + Violet + بنفش - toolBar - نوار ابزار + toolBar + نوار ابزار - Game List - لیست بازی + Game List + لیست بازی - * Unsupported Vulkan Version - شما پشتیبانی نمیشود Vulkan ورژن * + * Unsupported Vulkan Version + شما پشتیبانی نمیشود Vulkan ورژن * - Download Cheats For All Installed Games - دانلود چیت برای همه بازی ها + Download Cheats For All Installed Games + دانلود چیت برای همه بازی ها - Download Patches For All Games - دانلود پچ برای همه بازی ها + Download Patches For All Games + دانلود پچ برای همه بازی ها - Download Complete - دانلود کامل شد✅ + Download Complete + دانلود کامل شد✅ - You have downloaded cheats for all the games you have installed. - چیت برای همه بازی های شما دانلودشد✅ + You have downloaded cheats for all the games you have installed. + چیت برای همه بازی های شما دانلودشد✅ - Patches Downloaded Successfully! - پچ ها با موفقیت دانلود شد✅ + Patches Downloaded Successfully! + پچ ها با موفقیت دانلود شد✅ - All Patches available for all games have been downloaded. - ✅تمام پچ های موجود برای همه بازی های شما دانلود شد + All Patches available for all games have been downloaded. + ✅تمام پچ های موجود برای همه بازی های شما دانلود شد - Games: - بازی ها: + Games: + بازی ها: - ELF files (*.bin *.elf *.oelf) - ELF فایل های (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF فایل های (*.bin *.elf *.oelf) - Game Boot - اجرای بازی + Game Boot + اجرای بازی - Only one file can be selected! - فقط یک فایل انتخاب کنید! + Only one file can be selected! + فقط یک فایل انتخاب کنید! - PKG Extraction - PKG استخراج فایل + PKG Extraction + PKG استخراج فایل - Patch detected! - پچ شناسایی شد! + Patch detected! + پچ شناسایی شد! - PKG and Game versions match: - و نسخه بازی همخوانی دارد PKG فایل: + PKG and Game versions match: + و نسخه بازی همخوانی دارد PKG فایل: - Would you like to overwrite? - آیا مایل به جایگزینی فایل هستید؟ + Would you like to overwrite? + آیا مایل به جایگزینی فایل هستید؟ - PKG Version %1 is older than installed version: - نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: + PKG Version %1 is older than installed version: + نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: - Game is installed: - بازی نصب شد: + Game is installed: + بازی نصب شد: - Would you like to install Patch: - آیا مایل به نصب پچ هستید: + Would you like to install Patch: + آیا مایل به نصب پچ هستید: - DLC Installation - نصب DLC + DLC Installation + نصب DLC - Would you like to install DLC: %1? - آیا مایل به نصب DLC هستید: %1 + Would you like to install DLC: %1? + آیا مایل به نصب DLC هستید: %1 - DLC already installed: - قبلا نصب شده DLC این: + DLC already installed: + قبلا نصب شده DLC این: - Game already installed - این بازی قبلا نصب شده + Game already installed + این بازی قبلا نصب شده - PKG ERROR - PKG ارور فایل + PKG ERROR + PKG ارور فایل - Extracting PKG %1/%2 - درحال استخراج PKG %1/%2 + Extracting PKG %1/%2 + درحال استخراج PKG %1/%2 - Extraction Finished - استخراج به پایان رسید + Extraction Finished + استخراج به پایان رسید - Game successfully installed at %1 - بازی با موفقیت در %1 نصب شد + Game successfully installed at %1 + بازی با موفقیت در %1 نصب شد - File doesn't appear to be a valid PKG file - این فایل یک PKG درست به نظر نمی آید + File doesn't appear to be a valid PKG file + این فایل یک PKG درست به نظر نمی آید - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - ShadPS4 + shadPS4 + ShadPS4 - - + + PKGViewer - Open Folder - بازکردن پوشه + Open Folder + بازکردن پوشه - Name - نام + PKG ERROR + PKG ارور فایل - Serial - سریال + Name + نام - Installed - + Serial + سریال - Size - اندازه + Installed + Installed - Category - + Size + اندازه - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - منطقه + FW + FW - Flags - + Region + منطقه - Path - مسیر + Flags + Flags - File - فایل + Path + مسیر - PKG ERROR - PKG ارور فایل + File + فایل - Unknown - ناشناخته + Unknown + ناشناخته - Package - + Package + Package - - + + SettingsDialog - Settings - تنظیمات + Settings + تنظیمات - General - عمومی + General + عمومی - System - سیستم + System + سیستم - Console Language - زبان کنسول + Console Language + زبان کنسول - Emulator Language - زبان شبیه ساز + Emulator Language + زبان شبیه ساز - Emulator - شبیه ساز + Emulator + شبیه ساز - Enable Fullscreen - تمام صفحه + Enable Fullscreen + تمام صفحه - Fullscreen Mode - حالت تمام صفحه + Fullscreen Mode + حالت تمام صفحه - Enable Separate Update Folder - فعال‌سازی پوشه جداگانه برای به‌روزرسانی + Enable Separate Update Folder + فعال‌سازی پوشه جداگانه برای به‌روزرسانی - Default tab when opening settings - زبان پیش‌فرض هنگام باز کردن تنظیمات + Default tab when opening settings + زبان پیش‌فرض هنگام باز کردن تنظیمات - Show Game Size In List - نمایش اندازه بازی در لیست + Show Game Size In List + نمایش اندازه بازی در لیست - Show Splash - Splash نمایش + Show Splash + Splash نمایش - Enable Discord Rich Presence - Discord Rich Presence را فعال کنید + Enable Discord Rich Presence + Discord Rich Presence را فعال کنید - Username - نام کاربری + Username + نام کاربری - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log نوع + Log Type + Log نوع - Log Filter - Log فیلتر + Log Filter + Log فیلتر - Open Log Location - باز کردن مکان گزارش + Open Log Location + باز کردن مکان گزارش - Input - ورودی + Input + ورودی - Cursor - نشانگر + Cursor + نشانگر - Hide Cursor - پنهان کردن نشانگر + Hide Cursor + پنهان کردن نشانگر - Hide Cursor Idle Timeout - مخفی کردن زمان توقف مکان نما + Hide Cursor Idle Timeout + مخفی کردن زمان توقف مکان نما - s - s + s + s - Controller - دسته بازی + Controller + دسته بازی - Back Button Behavior - رفتار دکمه بازگشت + Back Button Behavior + رفتار دکمه بازگشت - Graphics - گرافیک + Graphics + گرافیک - GUI - رابط کاربری + GUI + رابط کاربری - User - کاربر + User + کاربر - Graphics Device - کارت گرافیک مورداستفاده + Graphics Device + کارت گرافیک مورداستفاده - Width - عرض + Width + عرض - Height - طول + Height + طول - Vblank Divider - تقسیم‌کننده Vblank + Vblank Divider + تقسیم‌کننده Vblank - Advanced - ...بیشتر + Advanced + ...بیشتر - Enable Shaders Dumping - فعال‌سازی ذخیره‌سازی شیدرها + Enable Shaders Dumping + فعال‌سازی ذخیره‌سازی شیدرها - Enable NULL GPU - NULL GPU فعال کردن + Enable NULL GPU + NULL GPU فعال کردن - Paths - مسیرها + Enable HDR + Enable HDR - Game Folders - پوشه های بازی + Paths + مسیرها - Add... - افزودن... + Game Folders + پوشه های بازی - Remove - حذف + Add... + افزودن... - Debug - دیباگ + Remove + حذف - Enable Debug Dumping - Debug Dumping + Debug + دیباگ - Enable Vulkan Validation Layers - Vulkan Validation Layers + Enable Debug Dumping + Debug Dumping - Enable Vulkan Synchronization Validation - Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Vulkan Validation Layers - Enable RenderDoc Debugging - RenderDoc Debugging + Enable Vulkan Synchronization Validation + Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - به‌روزرسانی + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - بررسی به‌روزرسانی‌ها در زمان راه‌اندازی + Update + به‌روزرسانی - Always Show Changelog - نمایش دائم تاریخچه تغییرات + Check for Updates at Startup + بررسی به‌روزرسانی‌ها در زمان راه‌اندازی - Update Channel - کانال به‌روزرسانی + Always Show Changelog + نمایش دائم تاریخچه تغییرات - Check for Updates - بررسی به‌روزرسانی‌ها + Update Channel + کانال به‌روزرسانی - GUI Settings - تنظیمات رابط کاربری + Check for Updates + بررسی به‌روزرسانی‌ها - Title Music - Title Music + GUI Settings + تنظیمات رابط کاربری - Disable Trophy Pop-ups - غیرفعال کردن نمایش جوایز + Title Music + Title Music - Play title music - پخش موسیقی عنوان + Disable Trophy Pop-ups + غیرفعال کردن نمایش جوایز - Update Compatibility Database On Startup - به‌روزرسانی پایگاه داده سازگاری هنگام راه‌اندازی + Background Image + Background Image - Game Compatibility - سازگاری بازی با سیستم + Show Background Image + Show Background Image - Display Compatibility Data - نمایش داده‌های سازگاری + Opacity + Opacity - Update Compatibility Database - به‌روزرسانی پایگاه داده سازگاری + Play title music + پخش موسیقی عنوان - Volume - صدا + Update Compatibility Database On Startup + به‌روزرسانی پایگاه داده سازگاری هنگام راه‌اندازی - Save - ذخیره + Game Compatibility + سازگاری بازی با سیستم - Apply - اعمال + Display Compatibility Data + نمایش داده‌های سازگاری - Restore Defaults - بازیابی پیش فرض ها + Update Compatibility Database + به‌روزرسانی پایگاه داده سازگاری - Close - بستن + Volume + صدا - Point your mouse at an option to display its description. - ماوس خود را بر روی یک گزینه قرار دهید تا توضیحات آن نمایش داده شود. + Save + ذخیره - consoleLanguageGroupBox - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + Apply + اعمال - emulatorLanguageGroupBox - زبان شبیه‌ساز:\nزبان رابط کاربری شبیه‌ساز را انتخاب می‌کند. + Restore Defaults + بازیابی پیش فرض ها - fullscreenCheckBox - فعال‌سازی تمام صفحه:\nپنجره بازی را به‌طور خودکار به حالت تمام صفحه در می‌آورد.\nبرای تغییر این حالت می‌توانید کلید F11 را فشار دهید. + Close + بستن - separateUpdatesCheckBox - فعال‌سازی پوشه جداگانه برای به‌روزرسانی:\nامکان نصب به‌روزرسانی‌های بازی در یک پوشه جداگانه برای مدیریت راحت‌تر را فراهم می‌کند. + Point your mouse at an option to display its description. + ماوس خود را بر روی یک گزینه قرار دهید تا توضیحات آن نمایش داده شود. - showSplashCheckBox - نمایش صفحه شروع:\nصفحه شروع بازی (تصویری ویژه) را هنگام بارگذاری بازی نمایش می‌دهد. + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - discordRPCCheckbox - فعال کردن Discord Rich Presence:\nآیکون شبیه ساز و اطلاعات مربوطه را در نمایه Discord شما نمایش می دهد. + emulatorLanguageGroupBox + زبان شبیه‌ساز:\nزبان رابط کاربری شبیه‌ساز را انتخاب می‌کند. - userName - نام کاربری:\nنام کاربری حساب PS4 را تنظیم می‌کند که ممکن است توسط برخی بازی‌ها نمایش داده شود. + fullscreenCheckBox + فعال‌سازی تمام صفحه:\nپنجره بازی را به‌طور خودکار به حالت تمام صفحه در می‌آورد.\nبرای تغییر این حالت می‌توانید کلید F11 را فشار دهید. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + فعال‌سازی پوشه جداگانه برای به‌روزرسانی:\nامکان نصب به‌روزرسانی‌های بازی در یک پوشه جداگانه برای مدیریت راحت‌تر را فراهم می‌کند. - logTypeGroupBox - نوع لاگ:\nتنظیم می‌کند که آیا خروجی پنجره لاگ برای بهبود عملکرد همگام‌سازی شود یا خیر. این ممکن است تأثیر منفی بر شبیه‌سازی داشته باشد. + showSplashCheckBox + نمایش صفحه شروع:\nصفحه شروع بازی (تصویری ویژه) را هنگام بارگذاری بازی نمایش می‌دهد. - logFilter - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + discordRPCCheckbox + فعال کردن Discord Rich Presence:\nآیکون شبیه ساز و اطلاعات مربوطه را در نمایه Discord شما نمایش می دهد. - updaterGroupBox - به‌روزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر می‌شوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست‌ شده‌تر هستند.\nشبانه: نسخه‌های توسعه‌ای که شامل جدیدترین ویژگی‌ها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند. + userName + نام کاربری:\nنام کاربری حساب PS4 را تنظیم می‌کند که ممکن است توسط برخی بازی‌ها نمایش داده شود. - GUIMusicGroupBox - پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال می‌کند. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - غیرفعال کردن نمایش جوایز:\nنمایش اعلان‌های جوایز درون بازی را غیرفعال می‌کند. پیشرفت جوایز همچنان از طریق نمایشگر جوایز (کلیک راست روی بازی در پنجره اصلی) قابل پیگیری است.. + logTypeGroupBox + نوع لاگ:\nتنظیم می‌کند که آیا خروجی پنجره لاگ برای بهبود عملکرد همگام‌سازی شود یا خیر. این ممکن است تأثیر منفی بر شبیه‌سازی داشته باشد. - hideCursorGroupBox - پنهان کردن نشانگر:\nانتخاب کنید که نشانگر چه زمانی ناپدید شود:\nهرگز: شما همیشه ماوس را خواهید دید.\nغیرفعال: زمانی را برای ناپدید شدن بعد از غیرفعالی تعیین کنید.\nهمیشه: شما هرگز ماوس را نخواهید دید. + logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - idleTimeoutGroupBox - زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید. + updaterGroupBox + به‌روزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر می‌شوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست‌ شده‌تر هستند.\nشبانه: نسخه‌های توسعه‌ای که شامل جدیدترین ویژگی‌ها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند. - backButtonBehaviorGroupBox - رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - نمایش داده‌های سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش می‌دهد. برای دریافت اطلاعات به‌روز، گزینه "به‌روزرسانی سازگاری هنگام راه‌اندازی" را فعال کنید. + GUIMusicGroupBox + پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال می‌کند. - checkCompatibilityOnStartupCheckBox - به‌روزرسانی سازگاری هنگام راه‌اندازی:\nبه‌طور خودکار پایگاه داده سازگاری را هنگام راه‌اندازی ShadPS4 به‌روزرسانی می‌کند. + disableTrophycheckBox + غیرفعال کردن نمایش جوایز:\nنمایش اعلان‌های جوایز درون بازی را غیرفعال می‌کند. پیشرفت جوایز همچنان از طریق نمایشگر جوایز (کلیک راست روی بازی در پنجره اصلی) قابل پیگیری است.. - updateCompatibilityButton - به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. + hideCursorGroupBox + پنهان کردن نشانگر:\nانتخاب کنید که نشانگر چه زمانی ناپدید شود:\nهرگز: شما همیشه ماوس را خواهید دید.\nغیرفعال: زمانی را برای ناپدید شدن بعد از غیرفعالی تعیین کنید.\nهمیشه: شما هرگز ماوس را نخواهید دید. - Never - هرگز + idleTimeoutGroupBox + زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید. - Idle - بیکار + backButtonBehaviorGroupBox + رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند. - Always - همیشه + enableCompatibilityCheckBox + نمایش داده‌های سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش می‌دهد. برای دریافت اطلاعات به‌روز، گزینه "به‌روزرسانی سازگاری هنگام راه‌اندازی" را فعال کنید. - Touchpad Left - صفحه لمسی سمت چپ + checkCompatibilityOnStartupCheckBox + به‌روزرسانی سازگاری هنگام راه‌اندازی:\nبه‌طور خودکار پایگاه داده سازگاری را هنگام راه‌اندازی ShadPS4 به‌روزرسانی می‌کند. - Touchpad Right - صفحه لمسی سمت راست + updateCompatibilityButton + به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. - Touchpad Center - مرکز صفحه لمسی + Never + هرگز - None - هیچ کدام + Idle + بیکار - graphicsAdapterGroupBox - دستگاه گرافیکی:\nدر سیستم‌های با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیه‌ساز از آن استفاده می‌کند را انتخاب کنید، یا گزینه "انتخاب خودکار" را انتخاب کنید تا به طور خودکار تعیین شود. + Always + همیشه - resolutionLayout - عرض/ارتفاع:\nاندازه پنجره شبیه‌ساز را در هنگام راه‌اندازی تنظیم می‌کند، که در حین بازی قابل تغییر اندازه است.\nاین با وضوح داخل بازی متفاوت است. + Touchpad Left + صفحه لمسی سمت چپ - heightDivider - تقسیم‌کننده Vblank:\nمیزان فریم ریت که شبیه‌ساز با آن به‌روزرسانی می‌شود، در این عدد ضرب می‌شود. تغییر این مقدار ممکن است تأثیرات منفی داشته باشد، مانند افزایش سرعت بازی یا خراب شدن عملکردهای حیاتی بازی که انتظار تغییر آن را ندارند! + Touchpad Right + صفحه لمسی سمت راست - dumpShadersCheckBox - فعال‌سازی ذخیره‌سازی شیدرها:\nبه‌منظور اشکال‌زدایی فنی، شیدرهای بازی را هنگام رندر شدن در یک پوشه ذخیره می‌کند. + Touchpad Center + مرکز صفحه لمسی - nullGpuCheckBox - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + None + هیچ کدام - gameFoldersBox - پوشه های بازی:\nلیست پوشه هایی که باید بازی های نصب شده را بررسی کنید. + graphicsAdapterGroupBox + دستگاه گرافیکی:\nدر سیستم‌های با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیه‌ساز از آن استفاده می‌کند را انتخاب کنید، یا گزینه "انتخاب خودکار" را انتخاب کنید تا به طور خودکار تعیین شود. - addFolderButton - اضافه کردن:\nیک پوشه به لیست اضافه کنید. + resolutionLayout + عرض/ارتفاع:\nاندازه پنجره شبیه‌ساز را در هنگام راه‌اندازی تنظیم می‌کند، که در حین بازی قابل تغییر اندازه است.\nاین با وضوح داخل بازی متفاوت است. - removeFolderButton - حذف:\nیک پوشه را از لیست حذف کنید. + heightDivider + تقسیم‌کننده Vblank:\nمیزان فریم ریت که شبیه‌ساز با آن به‌روزرسانی می‌شود، در این عدد ضرب می‌شود. تغییر این مقدار ممکن است تأثیرات منفی داشته باشد، مانند افزایش سرعت بازی یا خراب شدن عملکردهای حیاتی بازی که انتظار تغییر آن را ندارند! - debugDump - فعال‌سازی ذخیره‌سازی دیباگ:\nنمادهای import و export و اطلاعات هدر فایل برنامه در حال اجرای PS4 را در یک پوشه ذخیره می‌کند. + dumpShadersCheckBox + فعال‌سازی ذخیره‌سازی شیدرها:\nبه‌منظور اشکال‌زدایی فنی، شیدرهای بازی را هنگام رندر شدن در یک پوشه ذخیره می‌کند. - vkValidationCheckBox - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - vkSyncValidationCheckBox - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + gameFoldersBox + پوشه های بازی:\nلیست پوشه هایی که باید بازی های نصب شده را بررسی کنید. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + اضافه کردن:\nیک پوشه به لیست اضافه کنید. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + حذف:\nیک پوشه را از لیست حذف کنید. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + فعال‌سازی ذخیره‌سازی دیباگ:\nنمادهای import و export و اطلاعات هدر فایل برنامه در حال اجرای PS4 را در یک پوشه ذخیره می‌کند. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - Borderless - + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - انتخاب دستی + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - محل نصب بازی ها + Browse + انتخاب دستی - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + محل نصب بازی ها - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - مشاهده جوایز + Trophy Viewer + مشاهده جوایز - + diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index cb5962502..eb9e02c04 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Tietoa shadPS4:sta + About shadPS4 + Tietoa shadPS4:sta - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori. - This software should not be used to play games you have not legally obtained. - Tätä ohjelmistoa ei saa käyttää pelien pelaamiseen, joita et ole hankkinut laillisesti. + This software should not be used to play games you have not legally obtained. + Tätä ohjelmistoa ei saa käyttää pelien pelaamiseen, joita et ole hankkinut laillisesti. - - + + CheatsPatches - Cheats / Patches for - Huijaukset / Paikkaukset pelille + Cheats / Patches for + Huijaukset / Paikkaukset pelille - defaultTextEdit_MSG - Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Kuvaa ei saatavilla + No Image Available + Kuvaa ei saatavilla - Serial: - Sarjanumero: + Serial: + Sarjanumero: - Version: - Versio: + Version: + Versio: - Size: - Koko: + Size: + Koko: - Select Cheat File: - Valitse Huijaustiedosto: + Select Cheat File: + Valitse Huijaustiedosto: - Repository: - Repositorio: + Repository: + Repositorio: - Download Cheats - Lataa Huijaukset + Download Cheats + Lataa Huijaukset - Delete File - Poista Tiedosto + Delete File + Poista Tiedosto - No files selected. - Tiedostoja ei ole valittuna. + No files selected. + Tiedostoja ei ole valittuna. - You can delete the cheats you don't want after downloading them. - Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. + You can delete the cheats you don't want after downloading them. + Voit poistaa ei-toivomasi huijaukset lataamisen jälkeen. - Do you want to delete the selected file?\n%1 - Haluatko poistaa valitun tiedoston?\n%1 + Do you want to delete the selected file?\n%1 + Haluatko poistaa valitun tiedoston?\n%1 - Select Patch File: - Valitse Paikkaustiedosto: + Select Patch File: + Valitse Paikkaustiedosto: - Download Patches - Lataa Paikkaukset + Download Patches + Lataa Paikkaukset - Save - Tallenna + Save + Tallenna - Cheats - Huijaukset + Cheats + Huijaukset - Patches - Paikkaukset + Patches + Paikkaukset - Error - Virhe + Error + Virhe - No patch selected. - Paikkausta ei ole valittuna. + No patch selected. + Paikkausta ei ole valittuna. - Unable to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. + Unable to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. - No patch file found for the current serial. - Nykyiselle sarjanumerolle ei löytynyt paikkaustiedostoa. + No patch file found for the current serial. + Nykyiselle sarjanumerolle ei löytynyt paikkaustiedostoa. - Unable to open the file for reading. - Tiedostoa ei voitu avata lukemista varten. + Unable to open the file for reading. + Tiedostoa ei voitu avata lukemista varten. - Unable to open the file for writing. - Tiedostoa ei voitu avata kirjoittamista varten. + Unable to open the file for writing. + Tiedostoa ei voitu avata kirjoittamista varten. - Failed to parse XML: - XML:n jäsentäminen epäonnistui: + Failed to parse XML: + XML:n jäsentäminen epäonnistui: - Success - Onnistuminen + Success + Onnistuminen - Options saved successfully. - Vaihtoehdot tallennettu onnistuneesti. + Options saved successfully. + Vaihtoehdot tallennettu onnistuneesti. - Invalid Source - Virheellinen Lähde + Invalid Source + Virheellinen Lähde - The selected source is invalid. - Valittu lähde on virheellinen. + The selected source is invalid. + Valittu lähde on virheellinen. - File Exists - Olemassaoleva Tiedosto + File Exists + Olemassaoleva Tiedosto - File already exists. Do you want to replace it? - Tiedosto on jo olemassa. Haluatko korvata sen? + File already exists. Do you want to replace it? + Tiedosto on jo olemassa. Haluatko korvata sen? - Failed to save file: - Tiedoston tallentaminen epäonnistui: + Failed to save file: + Tiedoston tallentaminen epäonnistui: - Failed to download file: - Tiedoston lataaminen epäonnistui: + Failed to download file: + Tiedoston lataaminen epäonnistui: - Cheats Not Found - Huijauksia Ei Löytynyt + Cheats Not Found + Huijauksia Ei Löytynyt - CheatsNotFound_MSG - Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. + CheatsNotFound_MSG + Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. - Cheats Downloaded Successfully - Huijaukset Ladattu Onnistuneesti + Cheats Downloaded Successfully + Huijaukset Ladattu Onnistuneesti - CheatsDownloadedSuccessfully_MSG - Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. + CheatsDownloadedSuccessfully_MSG + Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. - Failed to save: - Tallentaminen epäonnistui: + Failed to save: + Tallentaminen epäonnistui: - Failed to download: - Lataus epäonnistui: + Failed to download: + Lataus epäonnistui: - Download Complete - Lataus valmis + Download Complete + Lataus valmis - DownloadComplete_MSG - Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. + DownloadComplete_MSG + Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. - Failed to parse JSON data from HTML. - JSON-tietojen jäsentäminen HTML:stä epäonnistui. + Failed to parse JSON data from HTML. + JSON-tietojen jäsentäminen HTML:stä epäonnistui. - Failed to retrieve HTML page. - HTML-sivun hakeminen epäonnistui. + Failed to retrieve HTML page. + HTML-sivun hakeminen epäonnistui. - The game is in version: %1 - Peli on versiossa: %1 + The game is in version: %1 + Peli on versiossa: %1 - The downloaded patch only works on version: %1 - Ladattu paikkaus toimii vain versiossa: %1 + The downloaded patch only works on version: %1 + Ladattu paikkaus toimii vain versiossa: %1 - You may need to update your game. - Sinun on ehkä päivitettävä pelisi. + You may need to update your game. + Sinun on ehkä päivitettävä pelisi. - Incompatibility Notice - Yhteensopivuusilmoitus + Incompatibility Notice + Yhteensopivuusilmoitus - Failed to open file: - Tiedoston avaaminen epäonnistui: + Failed to open file: + Tiedoston avaaminen epäonnistui: - XML ERROR: - XML VIRHE: + XML ERROR: + XML VIRHE: - Failed to open files.json for writing - Tiedostoa files.json ei voitu avata kirjoittamista varten + Failed to open files.json for writing + Tiedostoa files.json ei voitu avata kirjoittamista varten - Author: - Tekijä: + Author: + Tekijä: - Directory does not exist: - Hakemistoa ei ole olemassa: + Directory does not exist: + Hakemistoa ei ole olemassa: - Failed to open files.json for reading. - Tiedostoa files.json ei voitu avata lukemista varten. + Failed to open files.json for reading. + Tiedostoa files.json ei voitu avata lukemista varten. - Name: - Nimi: + Name: + Nimi: - Can't apply cheats before the game is started - Huijauksia ei voi käyttää ennen kuin peli on käynnissä. + Can't apply cheats before the game is started + Huijauksia ei voi käyttää ennen kuin peli on käynnissä. - Close - Sulje + Close + Sulje - - + + CheckUpdate - Auto Updater - Automaattinen Päivitys + Auto Updater + Automaattinen Päivitys - Error - Virhe + Error + Virhe - Network error: - Verkkovirhe: + Network error: + Verkkovirhe: - Error_Github_limit_MSG - Automaattinen päivitys sallii enintään 60 päivitystarkistusta tunnissa.\nOlet saavuttanut tämän rajan. Yritä myöhemmin uudelleen. + Error_Github_limit_MSG + Automaattinen päivitys sallii enintään 60 päivitystarkistusta tunnissa.\nOlet saavuttanut tämän rajan. Yritä myöhemmin uudelleen. - Failed to parse update information. - Päivitystietojen jäsentäminen epäonnistui. + Failed to parse update information. + Päivitystietojen jäsentäminen epäonnistui. - No pre-releases found. - Ennakkojulkaisuja ei löytynyt. + No pre-releases found. + Ennakkojulkaisuja ei löytynyt. - Invalid release data. - Virheelliset julkaisutiedot. + Invalid release data. + Virheelliset julkaisutiedot. - No download URL found for the specified asset. - Lataus-URL:ia ei löytynyt määritetylle omaisuudelle. + No download URL found for the specified asset. + Lataus-URL:ia ei löytynyt määritetylle omaisuudelle. - Your version is already up to date! - Versiosi on jo ajan tasalla! + Your version is already up to date! + Versiosi on jo ajan tasalla! - Update Available - Päivitys Saatavilla + Update Available + Päivitys Saatavilla - Update Channel - Päivityskanava + Update Channel + Päivityskanava - Current Version - Nykyinen Versio + Current Version + Nykyinen Versio - Latest Version - Uusin Versio + Latest Version + Uusin Versio - Do you want to update? - Haluatko päivittää? + Do you want to update? + Haluatko päivittää? - Show Changelog - Näytä Muutoshistoria + Show Changelog + Näytä Muutoshistoria - Check for Updates at Startup - Tarkista Päivitykset Käynnistettäessä + Check for Updates at Startup + Tarkista Päivitykset Käynnistettäessä - Update - Päivitä + Update + Päivitä - No - Ei + No + Ei - Hide Changelog - Piilota Muutoshistoria + Hide Changelog + Piilota Muutoshistoria - Changes - Muutokset + Changes + Muutokset - Network error occurred while trying to access the URL - URL-osoitteeseen yhdistettäessä tapahtui verkkovirhe + Network error occurred while trying to access the URL + URL-osoitteeseen yhdistettäessä tapahtui verkkovirhe - Download Complete - Lataus Valmis + Download Complete + Lataus Valmis - The update has been downloaded, press OK to install. - Päivitys on ladattu, paina OK asentaaksesi. + The update has been downloaded, press OK to install. + Päivitys on ladattu, paina OK asentaaksesi. - Failed to save the update file at - Päivitystiedoston tallentaminen epäonnistui sijaintiin + Failed to save the update file at + Päivitystiedoston tallentaminen epäonnistui sijaintiin - Starting Update... - Aloitetaan päivitystä... + Starting Update... + Aloitetaan päivitystä... - Failed to create the update script file - Päivitysskripttitiedoston luominen epäonnistui + Failed to create the update script file + Päivitysskripttitiedoston luominen epäonnistui - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Haetaan yhteensopivuustietoja, odota + Fetching compatibility data, please wait + Haetaan yhteensopivuustietoja, odota - Cancel - Peruuta + Cancel + Peruuta - Loading... - Ladataan... + Loading... + Ladataan... - Error - Virhe + Error + Virhe - Unable to update compatibility data! Try again later. - Yhteensopivuustietoja ei voitu päivittää! Yritä myöhemmin uudelleen. + Unable to update compatibility data! Try again later. + Yhteensopivuustietoja ei voitu päivittää! Yritä myöhemmin uudelleen. - Unable to open compatibility_data.json for writing. - Ei voitu avata compatibility_data.json-tiedostoa kirjoittamista varten. + Unable to open compatibility_data.json for writing. + Ei voitu avata compatibility_data.json-tiedostoa kirjoittamista varten. - Unknown - Tuntematon + Unknown + Tuntematon - Nothing - Ei mitään + Nothing + Ei mitään - Boots - Sahat + Boots + Sahat - Menus - Valikot + Menus + Valikot - Ingame - Pelin aikana + Ingame + Pelin aikana - Playable - Pelattava + Playable + Pelattava - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Avaa Hakemisto + Open Folder + Avaa Hakemisto - - + + GameInfoClass - Loading game list, please wait :3 - Ole hyvä ja odota, ladataan pelilistaa :3 + Loading game list, please wait :3 + Ole hyvä ja odota, ladataan pelilistaa :3 - Cancel - Peruuta + Cancel + Peruuta - Loading... - Ladataan... + Loading... + Ladataan... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Valitse hakemisto + shadPS4 - Choose directory + shadPS4 - Valitse hakemisto - Directory to install games - Pelien asennushakemisto + Directory to install games + Pelien asennushakemisto - Browse - Selaa + Browse + Selaa - Error - Virhe + Error + Virhe - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikoni + Icon + Ikoni - Name - Nimi + Name + Nimi - Serial - Sarjanumero + Serial + Sarjanumero - Compatibility - Compatibility + Compatibility + Compatibility - Region - Alue + Region + Alue - Firmware - Ohjelmisto + Firmware + Ohjelmisto - Size - Koko + Size + Koko - Version - Versio + Version + Versio - Path - Polku + Path + Polku - Play Time - Peliaika + Play Time + Peliaika - Never Played - Pelaamaton + Never Played + Pelaamaton - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Yhteensopivuutta ei ole testattu + Compatibility is untested + Yhteensopivuutta ei ole testattu - Game does not initialize properly / crashes the emulator - Peli ei alustaudu kunnolla / kaataa emulaattorin + Game does not initialize properly / crashes the emulator + Peli ei alustaudu kunnolla / kaataa emulaattorin - Game boots, but only displays a blank screen - Peli käynnistyy, mutta näyttää vain tyhjän ruudun + Game boots, but only displays a blank screen + Peli käynnistyy, mutta näyttää vain tyhjän ruudun - Game displays an image but does not go past the menu - Peli näyttää kuvan mutta ei mene valikosta eteenpäin + Game displays an image but does not go past the menu + Peli näyttää kuvan mutta ei mene valikosta eteenpäin - Game has game-breaking glitches or unplayable performance - Pelissä on pelikokemusta rikkovia häiriöitä tai kelvoton suorituskyky + Game has game-breaking glitches or unplayable performance + Pelissä on pelikokemusta rikkovia häiriöitä tai kelvoton suorituskyky - Game can be completed with playable performance and no major glitches - Pelillä on hyväksyttävä suorituskyky, eikä mitään suuria häiriöitä + Game can be completed with playable performance and no major glitches + Pelillä on hyväksyttävä suorituskyky, eikä mitään suuria häiriöitä - Click to see details on github - Napsauta nähdäksesi lisätiedot GitHubissa + Click to see details on github + Napsauta nähdäksesi lisätiedot GitHubissa - Last updated - Viimeksi päivitetty + Last updated + Viimeksi päivitetty - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Luo Pikakuvake + Create Shortcut + Luo Pikakuvake - Cheats / Patches - Huijaukset / Korjaukset + Cheats / Patches + Huijaukset / Korjaukset - SFO Viewer - SFO Selain + SFO Viewer + SFO Selain - Trophy Viewer - Trophy Selain + Trophy Viewer + Trophy Selain - Open Folder... - Avaa Hakemisto... + Open Folder... + Avaa Hakemisto... - Open Game Folder - Avaa Pelihakemisto + Open Game Folder + Avaa Pelihakemisto - Open Save Data Folder - Avaa Tallennustiedostohakemisto + Open Save Data Folder + Avaa Tallennustiedostohakemisto - Open Log Folder - Avaa Lokihakemisto + Open Log Folder + Avaa Lokihakemisto - Copy info... - Kopioi tietoja... + Copy info... + Kopioi tietoja... - Copy Name - Kopioi Nimi + Copy Name + Kopioi Nimi - Copy Serial - Kopioi Sarjanumero + Copy Serial + Kopioi Sarjanumero - Copy All - Kopioi kaikki + Copy Version + Copy Version - Delete... - Poista... + Copy Size + Copy Size - Delete Game - Poista Peli + Copy All + Kopioi kaikki - Delete Update - Poista Päivitys + Delete... + Poista... - Delete DLC - Poista Lisäsisältö + Delete Game + Poista Peli - Compatibility... - Yhteensopivuus... + Delete Update + Poista Päivitys - Update database - Päivitä tietokanta + Delete DLC + Poista Lisäsisältö - View report - Näytä raportti + Compatibility... + Yhteensopivuus... - Submit a report - Tee raportti + Update database + Päivitä tietokanta - Shortcut creation - Pikakuvakkeen luonti + View report + Näytä raportti - Shortcut created successfully! - Pikakuvake luotu onnistuneesti! + Submit a report + Tee raportti - Error - Virhe + Shortcut creation + Pikakuvakkeen luonti - Error creating shortcut! - Virhe pikakuvakkeen luonnissa! + Shortcut created successfully! + Pikakuvake luotu onnistuneesti! - Install PKG - Asenna PKG + Error + Virhe - Game - Peli + Error creating shortcut! + Virhe pikakuvakkeen luonnissa! - This game has no update to delete! - Tällä pelillä ei ole poistettavaa päivitystä! + Install PKG + Asenna PKG - Update - Päivitä + Game + Peli - This game has no DLC to delete! - Tällä pelillä ei ole poistettavaa lisäsisältöä! + This game has no update to delete! + Tällä pelillä ei ole poistettavaa päivitystä! - DLC - Lisäsisältö + Update + Päivitä - Delete %1 - Poista %1 + This game has no DLC to delete! + Tällä pelillä ei ole poistettavaa lisäsisältöä! - Are you sure you want to delete %1's %2 directory? - Haluatko varmasti poistaa %1n %2hakemiston? + DLC + Lisäsisältö - Open Update Folder - + Delete %1 + Poista %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Haluatko varmasti poistaa %1n %2hakemiston? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Valitse hakemisto + shadPS4 - Choose directory + shadPS4 - Valitse hakemisto - Select which directory you want to install to. - Valitse, mihin hakemistoon haluat asentaa. + Select which directory you want to install to. + Valitse, mihin hakemistoon haluat asentaa. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Avaa/Lisää Elf Hakemisto + Open/Add Elf Folder + Avaa/Lisää Elf Hakemisto - Install Packages (PKG) - Asenna Paketteja (PKG) + Install Packages (PKG) + Asenna Paketteja (PKG) - Boot Game - Käynnistä Peli + Boot Game + Käynnistä Peli - Check for Updates - Tarkista Päivitykset + Check for Updates + Tarkista Päivitykset - About shadPS4 - Tietoa shadPS4:sta + About shadPS4 + Tietoa shadPS4:sta - Configure... - Asetukset... + Configure... + Asetukset... - Install application from a .pkg file - Asenna sovellus .pkg tiedostosta + Install application from a .pkg file + Asenna sovellus .pkg tiedostosta - Recent Games - Viimeisimmät Pelit + Recent Games + Viimeisimmät Pelit - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Sulje + Exit + Sulje - Exit shadPS4 - Sulje shadPS4 + Exit shadPS4 + Sulje shadPS4 - Exit the application. - Sulje sovellus. + Exit the application. + Sulje sovellus. - Show Game List - Avaa pelilista + Show Game List + Avaa pelilista - Game List Refresh - Päivitä pelilista + Game List Refresh + Päivitä pelilista - Tiny - Hyvin pieni + Tiny + Hyvin pieni - Small - Pieni + Small + Pieni - Medium - Keskikokoinen + Medium + Keskikokoinen - Large - Suuri + Large + Suuri - List View - Listanäkymä + List View + Listanäkymä - Grid View - Ruudukkonäkymä + Grid View + Ruudukkonäkymä - Elf Viewer - Elf Selain + Elf Viewer + Elf Selain - Game Install Directory - Peliasennushakemisto + Game Install Directory + Peliasennushakemisto - Download Cheats/Patches - Lataa Huijaukset / Korjaukset + Download Cheats/Patches + Lataa Huijaukset / Korjaukset - Dump Game List - Kirjoita Pelilista Tiedostoon + Dump Game List + Kirjoita Pelilista Tiedostoon - PKG Viewer - PKG Selain + PKG Viewer + PKG Selain - Search... - Hae... + Search... + Hae... - File - Tiedosto + File + Tiedosto - View - Näkymä + View + Näkymä - Game List Icons - Pelilistan Ikonit + Game List Icons + Pelilistan Ikonit - Game List Mode - Pelilistamuoto + Game List Mode + Pelilistamuoto - Settings - Asetukset + Settings + Asetukset - Utils - Työkalut + Utils + Työkalut - Themes - Teemat + Themes + Teemat - Help - Apua + Help + Apua - Dark - Tumma + Dark + Tumma - Light - Vaalea + Light + Vaalea - Green - Vihreä + Green + Vihreä - Blue - Sininen + Blue + Sininen - Violet - Violetti + Violet + Violetti - toolBar - Työkalupalkki + toolBar + Työkalupalkki - Game List - Pelilista + Game List + Pelilista - * Unsupported Vulkan Version - * Ei Tuettu Vulkan-versio + * Unsupported Vulkan Version + * Ei Tuettu Vulkan-versio - Download Cheats For All Installed Games - Lataa Huijaukset Kaikille Asennetuille Peleille + Download Cheats For All Installed Games + Lataa Huijaukset Kaikille Asennetuille Peleille - Download Patches For All Games - Lataa Paikkaukset Kaikille Peleille + Download Patches For All Games + Lataa Paikkaukset Kaikille Peleille - Download Complete - Lataus Valmis + Download Complete + Lataus Valmis - You have downloaded cheats for all the games you have installed. - Olet ladannut huijaukset kaikkiin asennettuihin peleihin. + You have downloaded cheats for all the games you have installed. + Olet ladannut huijaukset kaikkiin asennettuihin peleihin. - Patches Downloaded Successfully! - Paikkaukset Ladattu Onnistuneesti! + Patches Downloaded Successfully! + Paikkaukset Ladattu Onnistuneesti! - All Patches available for all games have been downloaded. - Kaikki saatavilla olevat Paikkaukset kaikille peleille on ladattu. + All Patches available for all games have been downloaded. + Kaikki saatavilla olevat Paikkaukset kaikille peleille on ladattu. - Games: - Pelit: + Games: + Pelit: - ELF files (*.bin *.elf *.oelf) - ELF-tiedostot (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF-tiedostot (*.bin *.elf *.oelf) - Game Boot - Pelin Käynnistys + Game Boot + Pelin Käynnistys - Only one file can be selected! - Vain yksi tiedosto voi olla valittuna! + Only one file can be selected! + Vain yksi tiedosto voi olla valittuna! - PKG Extraction - PKG:n purku + PKG Extraction + PKG:n purku - Patch detected! - Päivitys havaittu! + Patch detected! + Päivitys havaittu! - PKG and Game versions match: - PKG- ja peliversiot vastaavat: + PKG and Game versions match: + PKG- ja peliversiot vastaavat: - Would you like to overwrite? - Haluatko korvata? + Would you like to overwrite? + Haluatko korvata? - PKG Version %1 is older than installed version: - PKG-versio %1 on vanhempi kuin asennettu versio: + PKG Version %1 is older than installed version: + PKG-versio %1 on vanhempi kuin asennettu versio: - Game is installed: - Peli on asennettu: + Game is installed: + Peli on asennettu: - Would you like to install Patch: - Haluatko asentaa päivityksen: + Would you like to install Patch: + Haluatko asentaa päivityksen: - DLC Installation - Lisäsisällön asennus + DLC Installation + Lisäsisällön asennus - Would you like to install DLC: %1? - Haluatko asentaa lisäsisällön: %1? + Would you like to install DLC: %1? + Haluatko asentaa lisäsisällön: %1? - DLC already installed: - Lisäsisältö on jo asennettu: + DLC already installed: + Lisäsisältö on jo asennettu: - Game already installed - Peli on jo asennettu + Game already installed + Peli on jo asennettu - PKG ERROR - PKG VIRHE + PKG ERROR + PKG VIRHE - Extracting PKG %1/%2 - Purkaminen PKG %1/%2 + Extracting PKG %1/%2 + Purkaminen PKG %1/%2 - Extraction Finished - Purku valmis + Extraction Finished + Purku valmis - Game successfully installed at %1 - Peli asennettu onnistuneesti kohtaan %1 + Game successfully installed at %1 + Peli asennettu onnistuneesti kohtaan %1 - File doesn't appear to be a valid PKG file - Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto + File doesn't appear to be a valid PKG file + Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Avaa Hakemisto + Open Folder + Avaa Hakemisto - Name - Nimi + PKG ERROR + PKG VIRHE - Serial - Sarjanumero + Name + Nimi - Installed - + Serial + Sarjanumero - Size - Koko + Installed + Installed - Category - + Size + Koko - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Alue + FW + FW - Flags - + Region + Alue - Path - Polku + Flags + Flags - File - Tiedosto + Path + Polku - PKG ERROR - PKG VIRHE + File + Tiedosto - Unknown - Tuntematon + Unknown + Tuntematon - Package - + Package + Package - - + + SettingsDialog - Settings - Asetukset + Settings + Asetukset - General - Yleinen + General + Yleinen - System - Järjestelmä + System + Järjestelmä - Console Language - Konsolin Kieli + Console Language + Konsolin Kieli - Emulator Language - Emulaattorin Kieli + Emulator Language + Emulaattorin Kieli - Emulator - Emulaattori + Emulator + Emulaattori - Enable Fullscreen - Ota Käyttöön Koko Ruudun Tila + Enable Fullscreen + Ota Käyttöön Koko Ruudun Tila - Fullscreen Mode - Koko näytön tila + Fullscreen Mode + Koko näytön tila - Enable Separate Update Folder - Ota Käyttöön Erillinen Päivityshakemisto + Enable Separate Update Folder + Ota Käyttöön Erillinen Päivityshakemisto - Default tab when opening settings - Oletusvälilehti avattaessa asetuksia + Default tab when opening settings + Oletusvälilehti avattaessa asetuksia - Show Game Size In List - Näytä pelin koko luettelossa + Show Game Size In List + Näytä pelin koko luettelossa - Show Splash - Näytä Aloitusnäyttö + Show Splash + Näytä Aloitusnäyttö - Enable Discord Rich Presence - Ota käyttöön Discord Rich Presence + Enable Discord Rich Presence + Ota käyttöön Discord Rich Presence - Username - Käyttäjänimi + Username + Käyttäjänimi - Trophy Key - Trophy Avain + Trophy Key + Trophy Avain - Trophy - Trophy + Trophy + Trophy - Logger - Lokinkerääjä + Logger + Lokinkerääjä - Log Type - Lokin Tyyppi + Log Type + Lokin Tyyppi - Log Filter - Lokisuodatin + Log Filter + Lokisuodatin - Open Log Location - Avaa lokin sijainti + Open Log Location + Avaa lokin sijainti - Input - Syöttö + Input + Syöttö - Cursor - Kursori + Cursor + Kursori - Hide Cursor - Piilota Kursori + Hide Cursor + Piilota Kursori - Hide Cursor Idle Timeout - Inaktiivisuuden Aikaraja Kursorin Piilottamiseen + Hide Cursor Idle Timeout + Inaktiivisuuden Aikaraja Kursorin Piilottamiseen - s - s + s + s - Controller - Ohjain + Controller + Ohjain - Back Button Behavior - Takaisin-painikkeen Käyttäytyminen + Back Button Behavior + Takaisin-painikkeen Käyttäytyminen - Graphics - Grafiikka + Graphics + Grafiikka - GUI - Rajapinta + GUI + Rajapinta - User - Käyttäjä + User + Käyttäjä - Graphics Device - Näytönohjain + Graphics Device + Näytönohjain - Width - Leveys + Width + Leveys - Height - Korkeus + Height + Korkeus - Vblank Divider - Vblank jakaja + Vblank Divider + Vblank jakaja - Advanced - Lisäasetukset + Advanced + Lisäasetukset - Enable Shaders Dumping - Ota Käyttöön Varjostinvedokset + Enable Shaders Dumping + Ota Käyttöön Varjostinvedokset - Enable NULL GPU - Ota Käyttöön NULL GPU + Enable NULL GPU + Ota Käyttöön NULL GPU - Paths - Polut + Enable HDR + Enable HDR - Game Folders - Pelihakemistot + Paths + Polut - Add... - Lisää... + Game Folders + Pelihakemistot - Remove - Poista + Add... + Lisää... - Debug - Virheenkorjaus + Remove + Poista - Enable Debug Dumping - Ota Käyttöön Virheenkorjausvedokset + Debug + Virheenkorjaus - Enable Vulkan Validation Layers - Ota Käyttöön Vulkan-validointikerrokset + Enable Debug Dumping + Ota Käyttöön Virheenkorjausvedokset - Enable Vulkan Synchronization Validation - Ota Käyttöön Vulkan-synkronointivalidointi + Enable Vulkan Validation Layers + Ota Käyttöön Vulkan-validointikerrokset - Enable RenderDoc Debugging - Ota Käyttöön RenderDoc Virheenkorjaus + Enable Vulkan Synchronization Validation + Ota Käyttöön Vulkan-synkronointivalidointi - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Ota Käyttöön RenderDoc Virheenkorjaus - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Päivitys + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Tarkista Päivitykset Käynnistäessä + Update + Päivitys - Always Show Changelog - Näytä aina muutoshistoria + Check for Updates at Startup + Tarkista Päivitykset Käynnistäessä - Update Channel - Päivityskanava + Always Show Changelog + Näytä aina muutoshistoria - Check for Updates - Tarkista Päivitykset + Update Channel + Päivityskanava - GUI Settings - GUI-asetukset + Check for Updates + Tarkista Päivitykset - Title Music - Title Music + GUI Settings + GUI-asetukset - Disable Trophy Pop-ups - Poista Trophy Pop-upit Käytöstä + Title Music + Title Music - Play title music - Soita Otsikkomusiikkia + Disable Trophy Pop-ups + Poista Trophy Pop-upit Käytöstä - Update Compatibility Database On Startup - Päivitä Yhteensopivuustietokanta Käynnistäessä + Background Image + Background Image - Game Compatibility - Peliyhteensopivuus + Show Background Image + Show Background Image - Display Compatibility Data - Näytä Yhteensopivuustiedot + Opacity + Opacity - Update Compatibility Database - Päivitä Yhteensopivuustietokanta + Play title music + Soita Otsikkomusiikkia - Volume - Äänenvoimakkuus + Update Compatibility Database On Startup + Päivitä Yhteensopivuustietokanta Käynnistäessä - Save - Tallenna + Game Compatibility + Peliyhteensopivuus - Apply - Ota käyttöön + Display Compatibility Data + Näytä Yhteensopivuustiedot - Restore Defaults - Palauta Oletukset + Update Compatibility Database + Päivitä Yhteensopivuustietokanta - Close - Sulje + Volume + Äänenvoimakkuus - Point your mouse at an option to display its description. - Siirrä hiiri vaihtoehdon päälle näyttääksesi sen kuvauksen. + Save + Tallenna - consoleLanguageGroupBox - Konsolin Kieli:\nAseta PS4-pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. + Apply + Ota käyttöön - emulatorLanguageGroupBox - Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. + Restore Defaults + Palauta Oletukset - fullscreenCheckBox - Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. + Close + Sulje - separateUpdatesCheckBox - Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. + Point your mouse at an option to display its description. + Siirrä hiiri vaihtoehdon päälle näyttääksesi sen kuvauksen. - showSplashCheckBox - Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. + consoleLanguageGroupBox + Konsolin Kieli:\nAseta PS4-pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. - discordRPCCheckbox - Ota käyttöön Discord Rich Presence:\nNäyttää emulaattorin kuvakkeen ja asiaankuuluvat tiedot Discord-profiilissasi. + emulatorLanguageGroupBox + Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. - userName - Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissain peleissä. + fullscreenCheckBox + Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. - TrophyKey - Trophy Avain:\nThrophyjen dekryptoinnissa käytetty avain. Pitää hankkia jailbreakatusta konsolista.\nSaa sisältää vain hex-merkkejä. + separateUpdatesCheckBox + Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. - logTypeGroupBox - Lokityyppi:\nAsettaa, synkronoidaanko loki-ikkunan ulostulo suorituskyvyn vuoksi. Tämä voi vaikuttaa haitallisesti emulointiin. + showSplashCheckBox + Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. - logFilter - Lokisuodatin:\nSuodattaa lokia tulostamaan vain määrättyä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nTasot: Trace, Debug, Info, Warning, Error, Critical - tässä järjestyksessä. Valittu taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. + discordRPCCheckbox + Ota käyttöön Discord Rich Presence:\nNäyttää emulaattorin kuvakkeen ja asiaankuuluvat tiedot Discord-profiilissasi. - updaterGroupBox - Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. + userName + Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissain peleissä. - GUIMusicGroupBox - Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. + TrophyKey + Trophy Avain:\nThrophyjen dekryptoinnissa käytetty avain. Pitää hankkia jailbreakatusta konsolista.\nSaa sisältää vain hex-merkkejä. - disableTrophycheckBox - Poista Trophy Pop-upit Käytöstä:\nPoista trophy ilmoitukset pelin aikana. Trophyjen edistystä voi silti seurata Trophy Selainta käyttämällä (klikkaa peliä hiiren oikealla emulaattorin pääikkunassa). + logTypeGroupBox + Lokityyppi:\nAsettaa, synkronoidaanko loki-ikkunan ulostulo suorituskyvyn vuoksi. Tämä voi vaikuttaa haitallisesti emulointiin. - hideCursorGroupBox - Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nInaktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. + logFilter + Lokisuodatin:\nSuodattaa lokia tulostamaan vain määrättyä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nTasot: Trace, Debug, Info, Warning, Error, Critical - tässä järjestyksessä. Valittu taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. - idleTimeoutGroupBox - Aseta aika, milloin hiiri häviää oltuaan aktiivinen. + updaterGroupBox + Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. - backButtonBehaviorGroupBox - Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön "Päivitä Yhteensopivuustietokanta Käynnistäessä" saadaksesi ajantasaista tietoa. + GUIMusicGroupBox + Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. - checkCompatibilityOnStartupCheckBox - Päivitä Yhteensopivuustiedot Käynnistäessä:\nPäivitä yhteensopivuustiedot automaattisesti shadPS4:n käynnistyessä. + disableTrophycheckBox + Poista Trophy Pop-upit Käytöstä:\nPoista trophy ilmoitukset pelin aikana. Trophyjen edistystä voi silti seurata Trophy Selainta käyttämällä (klikkaa peliä hiiren oikealla emulaattorin pääikkunassa). - updateCompatibilityButton - Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. + hideCursorGroupBox + Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nInaktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. - Never - Ei koskaan + idleTimeoutGroupBox + Aseta aika, milloin hiiri häviää oltuaan aktiivinen. - Idle - Inaktiivinen + backButtonBehaviorGroupBox + Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan. - Always - Aina + enableCompatibilityCheckBox + Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön "Päivitä Yhteensopivuustietokanta Käynnistäessä" saadaksesi ajantasaista tietoa. - Touchpad Left - Kosketuslevyn Vasen Puoli + checkCompatibilityOnStartupCheckBox + Päivitä Yhteensopivuustiedot Käynnistäessä:\nPäivitä yhteensopivuustiedot automaattisesti shadPS4:n käynnistyessä. - Touchpad Right - Kosketuslevyn Oikea Puoli + updateCompatibilityButton + Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. - Touchpad Center - Kosketuslevyn Keskikohta + Never + Ei koskaan - None - Ei mitään + Idle + Inaktiivinen - graphicsAdapterGroupBox - Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse "Auto Select" automaattiseen määritykseen. + Always + Aina - resolutionLayout - Leveys/Korkeus:\nAsettaa käynnistetyn emulaattori-ikkunan koon, jota voidaan muuttaa pelin aikana.\nTämä on eri, kuin pelin sisäinen resoluutio. + Touchpad Left + Kosketuslevyn Vasen Puoli - heightDivider - Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten lisätä pelin nopeutta tai rikkoa kriittisiä pelitoimintoja, jotka eivät odota tämän muuttuvan! + Touchpad Right + Kosketuslevyn Oikea Puoli - dumpShadersCheckBox - Ota Käyttöön Varjostinvedokset:\nTeknistä vianetsintää varten. Pelin varjostimia tallennetaan hakemistoon niiden renderöityessä. + Touchpad Center + Kosketuslevyn Keskikohta - nullGpuCheckBox - Ota Null GPU käyttöön:\nTeknistä vianetsintää varten. Pelin renderöinti estetään, ikään kuin näytönohjainta ei olisi. + None + Ei mitään - gameFoldersBox - Pelihakemistot:\nLista hakemistoista, joista pelejä haetaan. + graphicsAdapterGroupBox + Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse "Auto Select" automaattiseen määritykseen. - addFolderButton - Lisää:\nLisää hakemisto listalle. + resolutionLayout + Leveys/Korkeus:\nAsettaa käynnistetyn emulaattori-ikkunan koon, jota voidaan muuttaa pelin aikana.\nTämä on eri, kuin pelin sisäinen resoluutio. - removeFolderButton - Poista:\nPoista hakemisto listalta. + heightDivider + Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten lisätä pelin nopeutta tai rikkoa kriittisiä pelitoimintoja, jotka eivät odota tämän muuttuvan! - debugDump - Ota Käyttöön Virheenkorjausvedokset:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. + dumpShadersCheckBox + Ota Käyttöön Varjostinvedokset:\nTeknistä vianetsintää varten. Pelin varjostimia tallennetaan hakemistoon niiden renderöityessä. - vkValidationCheckBox - Ota Käyttöön Vulkan-validointikerrokset:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + nullGpuCheckBox + Ota Null GPU käyttöön:\nTeknistä vianetsintää varten. Pelin renderöinti estetään, ikään kuin näytönohjainta ei olisi. - vkSyncValidationCheckBox - Ota Käyttöön Vulkan-synkronointivalidointi:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. + gameFoldersBox + Pelihakemistot:\nLista hakemistoista, joista pelejä haetaan. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Lisää:\nLisää hakemisto listalle. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Poista:\nPoista hakemisto listalta. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Ota Käyttöön Virheenkorjausvedokset:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Ota Käyttöön Vulkan-validointikerrokset:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Ota Käyttöön Vulkan-synkronointivalidointi:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - Borderless - + rdocCheckBox + Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Selaa + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Pelien asennushakemisto + Browse + Selaa - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Pelien asennushakemisto - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Selain + Trophy Viewer + Trophy Selain - + diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index c32d6dca3..ca6a3cc35 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - À propos de shadPS4 + About shadPS4 + À propos de shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 est un émulateur open-source expérimental de la PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 est un émulateur open-source expérimental de la PlayStation 4. - This software should not be used to play games you have not legally obtained. - Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement. + This software should not be used to play games you have not legally obtained. + Ce logiciel ne doit pas être utilisé pour jouer à des jeux que vous n'avez pas obtenus légalement. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patchs pour + Cheats / Patches for + Cheats / Patchs pour - defaultTextEdit_MSG - Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Aucune image disponible + No Image Available + Aucune image disponible - Serial: - Numéro de série: + Serial: + Numéro de série: - Version: - Version: + Version: + Version: - Size: - Taille: + Size: + Taille: - Select Cheat File: - Sélectionner le fichier de Cheat: + Select Cheat File: + Sélectionner le fichier de Cheat: - Repository: - Dépôt: + Repository: + Dépôt: - Download Cheats - Télécharger les Cheats + Download Cheats + Télécharger les Cheats - Delete File - Supprimer le fichier + Delete File + Supprimer le fichier - No files selected. - Aucun fichier sélectionné. + No files selected. + Aucun fichier sélectionné. - You can delete the cheats you don't want after downloading them. - Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. + You can delete the cheats you don't want after downloading them. + Vous pouvez supprimer les Cheats que vous ne souhaitez pas après les avoir téléchargés. - Do you want to delete the selected file?\n%1 - Voulez-vous supprimer le fichier sélectionné ?\n%1 + Do you want to delete the selected file?\n%1 + Voulez-vous supprimer le fichier sélectionné ?\n%1 - Select Patch File: - Sélectionner le fichier de patch: + Select Patch File: + Sélectionner le fichier de patch: - Download Patches - Télécharger les patchs + Download Patches + Télécharger les patchs - Save - Enregistrer + Save + Enregistrer - Cheats - Cheats + Cheats + Cheats - Patches - Patchs + Patches + Patchs - Error - Erreur + Error + Erreur - No patch selected. - Aucun patch sélectionné. + No patch selected. + Aucun patch sélectionné. - Unable to open files.json for reading. - Impossible d'ouvrir files.json pour la lecture. + Unable to open files.json for reading. + Impossible d'ouvrir files.json pour la lecture. - No patch file found for the current serial. - Aucun fichier de patch trouvé pour la série actuelle. + No patch file found for the current serial. + Aucun fichier de patch trouvé pour la série actuelle. - Unable to open the file for reading. - Impossible d'ouvrir le fichier pour la lecture. + Unable to open the file for reading. + Impossible d'ouvrir le fichier pour la lecture. - Unable to open the file for writing. - Impossible d'ouvrir le fichier pour l'écriture. + Unable to open the file for writing. + Impossible d'ouvrir le fichier pour l'écriture. - Failed to parse XML: - Échec de l'analyse XML: + Failed to parse XML: + Échec de l'analyse XML: - Success - Succès + Success + Succès - Options saved successfully. - Options enregistrées avec succès. + Options saved successfully. + Options enregistrées avec succès. - Invalid Source - Source invalide + Invalid Source + Source invalide - The selected source is invalid. - La source sélectionnée est invalide. + The selected source is invalid. + La source sélectionnée est invalide. - File Exists - Le fichier existe + File Exists + Le fichier existe - File already exists. Do you want to replace it? - Le fichier existe déjà. Voulez-vous le remplacer ? + File already exists. Do you want to replace it? + Le fichier existe déjà. Voulez-vous le remplacer ? - Failed to save file: - Échec de l'enregistrement du fichier: + Failed to save file: + Échec de l'enregistrement du fichier: - Failed to download file: - Échec du téléchargement du fichier: + Failed to download file: + Échec du téléchargement du fichier: - Cheats Not Found - Cheats non trouvés + Cheats Not Found + Cheats non trouvés - CheatsNotFound_MSG - Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. + CheatsNotFound_MSG + Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. - Cheats Downloaded Successfully - Cheats téléchargés avec succès + Cheats Downloaded Successfully + Cheats téléchargés avec succès - CheatsDownloadedSuccessfully_MSG - Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. + CheatsDownloadedSuccessfully_MSG + Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. - Failed to save: - Échec de l'enregistrement: + Failed to save: + Échec de l'enregistrement: - Failed to download: - Échec du téléchargement: + Failed to download: + Échec du téléchargement: - Download Complete - Téléchargement terminé + Download Complete + Téléchargement terminé - DownloadComplete_MSG - Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour la série et la version spécifiques du jeu. + DownloadComplete_MSG + Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour la série et la version spécifiques du jeu. - Failed to parse JSON data from HTML. - Échec de l'analyse des données JSON à partir du HTML. + Failed to parse JSON data from HTML. + Échec de l'analyse des données JSON à partir du HTML. - Failed to retrieve HTML page. - Échec de la récupération de la page HTML. + Failed to retrieve HTML page. + Échec de la récupération de la page HTML. - The game is in version: %1 - Le jeu est en version: %1 + The game is in version: %1 + Le jeu est en version: %1 - The downloaded patch only works on version: %1 - Le patch téléchargé ne fonctionne que sur la version: %1 + The downloaded patch only works on version: %1 + Le patch téléchargé ne fonctionne que sur la version: %1 - You may need to update your game. - Vous devriez peut-être mettre à jour votre jeu. + You may need to update your game. + Vous devriez peut-être mettre à jour votre jeu. - Incompatibility Notice - Avis d'incompatibilité + Incompatibility Notice + Avis d'incompatibilité - Failed to open file: - Échec de l'ouverture du fichier: + Failed to open file: + Échec de l'ouverture du fichier: - XML ERROR: - Erreur XML: + XML ERROR: + Erreur XML: - Failed to open files.json for writing - Échec de l'ouverture de files.json pour l'écriture + Failed to open files.json for writing + Échec de l'ouverture de files.json pour l'écriture - Author: - Auteur: + Author: + Auteur: - Directory does not exist: - Le répertoire n'existe pas: + Directory does not exist: + Le répertoire n'existe pas: - Failed to open files.json for reading. - Échec de l'ouverture de files.json pour la lecture. + Failed to open files.json for reading. + Échec de l'ouverture de files.json pour la lecture. - Name: - Nom: + Name: + Nom: - Can't apply cheats before the game is started - Impossible d'appliquer les cheats avant que le jeu ne soit lancé + Can't apply cheats before the game is started + Impossible d'appliquer les cheats avant que le jeu ne soit lancé - Close - Fermer + Close + Fermer - - + + CheckUpdate - Auto Updater - Mise à jour automatique + Auto Updater + Mise à jour automatique - Error - Erreur + Error + Erreur - Network error: - Erreur réseau: + Network error: + Erreur réseau: - Error_Github_limit_MSG - Le programme de mise à jour automatique permet jusqu'à 60 vérifications de mise à jour par heure.\nVous avez atteint cette limite. Veuillez réessayer plus tard. + Error_Github_limit_MSG + Le programme de mise à jour automatique permet jusqu'à 60 vérifications de mise à jour par heure.\nVous avez atteint cette limite. Veuillez réessayer plus tard. - Failed to parse update information. - Échec de l'analyse des informations de mise à jour. + Failed to parse update information. + Échec de l'analyse des informations de mise à jour. - No pre-releases found. - Aucune pré-version trouvée. + No pre-releases found. + Aucune pré-version trouvée. - Invalid release data. - Données de version invalides. + Invalid release data. + Données de version invalides. - No download URL found for the specified asset. - Aucune URL de téléchargement trouvée pour l'élément spécifié. + No download URL found for the specified asset. + Aucune URL de téléchargement trouvée pour l'élément spécifié. - Your version is already up to date! - Votre version est déjà à jour ! + Your version is already up to date! + Votre version est déjà à jour ! - Update Available - Mise à jour disponible + Update Available + Mise à jour disponible - Update Channel - Canal de Mise à Jour + Update Channel + Canal de Mise à Jour - Current Version - Version actuelle + Current Version + Version actuelle - Latest Version - Dernière version + Latest Version + Dernière version - Do you want to update? - Voulez-vous mettre à jour ? + Do you want to update? + Voulez-vous mettre à jour ? - Show Changelog - Afficher le journal des modifications + Show Changelog + Afficher le journal des modifications - Check for Updates at Startup - Vérif. maj au démarrage + Check for Updates at Startup + Vérif. maj au démarrage - Update - Mettre à jour + Update + Mettre à jour - No - Non + No + Non - Hide Changelog - Cacher le journal des modifications + Hide Changelog + Cacher le journal des modifications - Changes - Modifications + Changes + Modifications - Network error occurred while trying to access the URL - Une erreur réseau s'est produite en essayant d'accéder à l'URL + Network error occurred while trying to access the URL + Une erreur réseau s'est produite en essayant d'accéder à l'URL - Download Complete - Téléchargement terminé + Download Complete + Téléchargement terminé - The update has been downloaded, press OK to install. - La mise à jour a été téléchargée, appuyez sur OK pour l'installer. + The update has been downloaded, press OK to install. + La mise à jour a été téléchargée, appuyez sur OK pour l'installer. - Failed to save the update file at - Échec de la sauvegarde du fichier de mise à jour à + Failed to save the update file at + Échec de la sauvegarde du fichier de mise à jour à - Starting Update... - Démarrage de la mise à jour... + Starting Update... + Démarrage de la mise à jour... - Failed to create the update script file - Échec de la création du fichier de script de mise à jour + Failed to create the update script file + Échec de la création du fichier de script de mise à jour - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Récupération des données de compatibilité, veuillez patienter + Fetching compatibility data, please wait + Récupération des données de compatibilité, veuillez patienter - Cancel - Annuler + Cancel + Annuler - Loading... - Chargement... + Loading... + Chargement... - Error - Erreur + Error + Erreur - Unable to update compatibility data! Try again later. - Impossible de mettre à jour les données de compatibilité ! Essayez plus tard. + Unable to update compatibility data! Try again later. + Impossible de mettre à jour les données de compatibilité ! Essayez plus tard. - Unable to open compatibility_data.json for writing. - Impossible d'ouvrir compatibility_data.json en écriture. + Unable to open compatibility_data.json for writing. + Impossible d'ouvrir compatibility_data.json en écriture. - Unknown - Inconnu + Unknown + Inconnu - Nothing - Rien + Nothing + Rien - Boots - Démarre + Boots + Démarre - Menus - Menu + Menus + Menu - Ingame - En jeu + Ingame + En jeu - Playable - Jouable + Playable + Jouable - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Ouvrir un dossier + Open Folder + Ouvrir un dossier - - + + GameInfoClass - Loading game list, please wait :3 - Chargement de la liste de jeu, veuillez patienter... + Loading game list, please wait :3 + Chargement de la liste de jeu, veuillez patienter... - Cancel - Annuler + Cancel + Annuler - Loading... - Chargement... + Loading... + Chargement... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choisir un répertoire + shadPS4 - Choose directory + shadPS4 - Choisir un répertoire - Directory to install games - Répertoire d'installation des jeux + Directory to install games + Répertoire d'installation des jeux - Browse - Parcourir + Browse + Parcourir - Error - Erreur + Error + Erreur - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Icône + Icon + Icône - Name - Nom + Name + Nom - Serial - Numéro de série + Serial + Numéro de série - Compatibility - Compatibilité + Compatibility + Compatibilité - Region - Région + Region + Région - Firmware - Firmware + Firmware + Firmware - Size - Taille + Size + Taille - Version - Version + Version + Version - Path - Répertoire + Path + Répertoire - Play Time - Temps de jeu + Play Time + Temps de jeu - Never Played - Jamais joué + Never Played + Jamais joué - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - La compatibilité n'a pas été testé + Compatibility is untested + La compatibilité n'a pas été testé - Game does not initialize properly / crashes the emulator - Le jeu ne se lance pas correctement / crash l'émulateur + Game does not initialize properly / crashes the emulator + Le jeu ne se lance pas correctement / crash l'émulateur - Game boots, but only displays a blank screen - Le jeu démarre, mais n'affiche qu'un écran noir + Game boots, but only displays a blank screen + Le jeu démarre, mais n'affiche qu'un écran noir - Game displays an image but does not go past the menu - Le jeu affiche une image mais ne dépasse pas le menu + Game displays an image but does not go past the menu + Le jeu affiche une image mais ne dépasse pas le menu - Game has game-breaking glitches or unplayable performance - Le jeu a des problèmes majeurs ou des performances qui le rendent injouable + Game has game-breaking glitches or unplayable performance + Le jeu a des problèmes majeurs ou des performances qui le rendent injouable - Game can be completed with playable performance and no major glitches - Le jeu peut être terminé avec des performances acceptables et sans problèmes majeurs + Game can be completed with playable performance and no major glitches + Le jeu peut être terminé avec des performances acceptables et sans problèmes majeurs - Click to see details on github - Cliquez pour voir les détails sur GitHub + Click to see details on github + Cliquez pour voir les détails sur GitHub - Last updated - Dernière mise à jour + Last updated + Dernière mise à jour - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Créer un raccourci + Create Shortcut + Créer un raccourci - Cheats / Patches - Cheats/Patchs + Cheats / Patches + Cheats/Patchs - SFO Viewer - Visionneuse SFO + SFO Viewer + Visionneuse SFO - Trophy Viewer - Visionneuse de trophées + Trophy Viewer + Visionneuse de trophées - Open Folder... - Ouvrir le Dossier... + Open Folder... + Ouvrir le Dossier... - Open Game Folder - Ouvrir le Dossier du Jeu + Open Game Folder + Ouvrir le Dossier du Jeu - Open Save Data Folder - Ouvrir le Dossier des Données de Sauvegarde + Open Save Data Folder + Ouvrir le Dossier des Données de Sauvegarde - Open Log Folder - Ouvrir le Dossier des Logs + Open Log Folder + Ouvrir le Dossier des Logs - Copy info... - Copier infos... + Copy info... + Copier infos... - Copy Name - Copier le nom + Copy Name + Copier le nom - Copy Serial - Copier le N° de série + Copy Serial + Copier le N° de série - Copy All - Copier tout + Copy Version + Copy Version - Delete... - Supprimer... + Copy Size + Copy Size - Delete Game - Supprimer jeu + Copy All + Copier tout - Delete Update - Supprimer MÀJ + Delete... + Supprimer... - Delete DLC - Supprimer DLC + Delete Game + Supprimer jeu - Compatibility... - Compatibilité... + Delete Update + Supprimer MÀJ - Update database - Mettre à jour la base de données + Delete DLC + Supprimer DLC - View report - Voir rapport + Compatibility... + Compatibilité... - Submit a report - Soumettre un rapport + Update database + Mettre à jour la base de données - Shortcut creation - Création du raccourci + View report + Voir rapport - Shortcut created successfully! - Raccourci créé avec succès ! + Submit a report + Soumettre un rapport - Error - Erreur + Shortcut creation + Création du raccourci - Error creating shortcut! - Erreur lors de la création du raccourci ! + Shortcut created successfully! + Raccourci créé avec succès ! - Install PKG - Installer un PKG + Error + Erreur - Game - Jeu + Error creating shortcut! + Erreur lors de la création du raccourci ! - This game has no update to delete! - Ce jeu n'a pas de mise à jour à supprimer! + Install PKG + Installer un PKG - Update - Mise à jour + Game + Jeu - This game has no DLC to delete! - Ce jeu n'a pas de DLC à supprimer! + This game has no update to delete! + Ce jeu n'a pas de mise à jour à supprimer! - DLC - DLC + Update + Mise à jour - Delete %1 - Supprime %1 + This game has no DLC to delete! + Ce jeu n'a pas de DLC à supprimer! - Are you sure you want to delete %1's %2 directory? - Êtes vous sûr de vouloir supprimer le répertoire %1 %2 ? + DLC + DLC - Open Update Folder - + Delete %1 + Supprime %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Êtes vous sûr de vouloir supprimer le répertoire %1 %2 ? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choisir un répertoire + shadPS4 - Choose directory + shadPS4 - Choisir un répertoire - Select which directory you want to install to. - Sélectionnez le répertoire où vous souhaitez effectuer l'installation. + Select which directory you want to install to. + Sélectionnez le répertoire où vous souhaitez effectuer l'installation. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Ouvrir/Ajouter un dossier ELF + Open/Add Elf Folder + Ouvrir/Ajouter un dossier ELF - Install Packages (PKG) - Installer des packages (PKG) + Install Packages (PKG) + Installer des packages (PKG) - Boot Game - Démarrer un jeu + Boot Game + Démarrer un jeu - Check for Updates - Vérifier les mises à jour + Check for Updates + Vérifier les mises à jour - About shadPS4 - À propos de shadPS4 + About shadPS4 + À propos de shadPS4 - Configure... - Configurer... + Configure... + Configurer... - Install application from a .pkg file - Installer une application depuis un fichier .pkg + Install application from a .pkg file + Installer une application depuis un fichier .pkg - Recent Games - Jeux récents + Recent Games + Jeux récents - Open shadPS4 Folder - Ouvrir le dossier de shadPS4 + Open shadPS4 Folder + Ouvrir le dossier de shadPS4 - Exit - Fermer + Exit + Fermer - Exit shadPS4 - Fermer shadPS4 + Exit shadPS4 + Fermer shadPS4 - Exit the application. - Fermer l'application. + Exit the application. + Fermer l'application. - Show Game List - Afficher la liste de jeux + Show Game List + Afficher la liste de jeux - Game List Refresh - Rafraîchir la liste de jeux + Game List Refresh + Rafraîchir la liste de jeux - Tiny - Très Petit + Tiny + Très Petit - Small - Petit + Small + Petit - Medium - Moyen + Medium + Moyen - Large - Grand + Large + Grand - List View - Mode liste + List View + Mode liste - Grid View - Mode grille + Grid View + Mode grille - Elf Viewer - Visionneuse ELF + Elf Viewer + Visionneuse ELF - Game Install Directory - Répertoire des jeux + Game Install Directory + Répertoire des jeux - Download Cheats/Patches - Télécharger Cheats/Patchs + Download Cheats/Patches + Télécharger Cheats/Patchs - Dump Game List - Dumper la liste des jeux + Dump Game List + Dumper la liste des jeux - PKG Viewer - Visionneuse PKG + PKG Viewer + Visionneuse PKG - Search... - Chercher... + Search... + Chercher... - File - Fichier + File + Fichier - View - Affichage + View + Affichage - Game List Icons - Icônes des jeux + Game List Icons + Icônes des jeux - Game List Mode - Mode d'affichage + Game List Mode + Mode d'affichage - Settings - Paramètres + Settings + Paramètres - Utils - Utilitaires + Utils + Utilitaires - Themes - Thèmes + Themes + Thèmes - Help - Aide + Help + Aide - Dark - Sombre + Dark + Sombre - Light - Clair + Light + Clair - Green - Vert + Green + Vert - Blue - Bleu + Blue + Bleu - Violet - Violet + Violet + Violet - toolBar - Barre d'outils + toolBar + Barre d'outils - Game List - Liste de jeux + Game List + Liste de jeux - * Unsupported Vulkan Version - * Version de Vulkan non prise en charge + * Unsupported Vulkan Version + * Version de Vulkan non prise en charge - Download Cheats For All Installed Games - Télécharger les Cheats pour tous les jeux installés + Download Cheats For All Installed Games + Télécharger les Cheats pour tous les jeux installés - Download Patches For All Games - Télécharger les patchs pour tous les jeux + Download Patches For All Games + Télécharger les patchs pour tous les jeux - Download Complete - Téléchargement terminé + Download Complete + Téléchargement terminé - You have downloaded cheats for all the games you have installed. - Vous avez téléchargé des Cheats pour tous les jeux installés. + You have downloaded cheats for all the games you have installed. + Vous avez téléchargé des Cheats pour tous les jeux installés. - Patches Downloaded Successfully! - Patchs téléchargés avec succès ! + Patches Downloaded Successfully! + Patchs téléchargés avec succès ! - All Patches available for all games have been downloaded. - Tous les patchs disponibles ont été téléchargés. + All Patches available for all games have been downloaded. + Tous les patchs disponibles ont été téléchargés. - Games: - Jeux: + Games: + Jeux: - ELF files (*.bin *.elf *.oelf) - Fichiers ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Fichiers ELF (*.bin *.elf *.oelf) - Game Boot - Démarrer un jeu + Game Boot + Démarrer un jeu - Only one file can be selected! - Un seul fichier peut être sélectionné ! + Only one file can be selected! + Un seul fichier peut être sélectionné ! - PKG Extraction - Extraction du PKG + PKG Extraction + Extraction du PKG - Patch detected! - Patch détecté ! + Patch detected! + Patch détecté ! - PKG and Game versions match: - Les versions PKG et jeu correspondent: + PKG and Game versions match: + Les versions PKG et jeu correspondent: - Would you like to overwrite? - Souhaitez-vous remplacer ? + Would you like to overwrite? + Souhaitez-vous remplacer ? - PKG Version %1 is older than installed version: - La version PKG %1 est plus ancienne que la version installée: + PKG Version %1 is older than installed version: + La version PKG %1 est plus ancienne que la version installée: - Game is installed: - Jeu installé: + Game is installed: + Jeu installé: - Would you like to install Patch: - Souhaitez-vous installer le patch: + Would you like to install Patch: + Souhaitez-vous installer le patch: - DLC Installation - Installation du DLC + DLC Installation + Installation du DLC - Would you like to install DLC: %1? - Souhaitez-vous installer le DLC: %1 ? + Would you like to install DLC: %1? + Souhaitez-vous installer le DLC: %1 ? - DLC already installed: - DLC déjà installé: + DLC already installed: + DLC déjà installé: - Game already installed - Jeu déjà installé + Game already installed + Jeu déjà installé - PKG ERROR - Erreur PKG + PKG ERROR + Erreur PKG - Extracting PKG %1/%2 - Extraction PKG %1/%2 + Extracting PKG %1/%2 + Extraction PKG %1/%2 - Extraction Finished - Extraction terminée + Extraction Finished + Extraction terminée - Game successfully installed at %1 - Jeu installé avec succès dans %1 + Game successfully installed at %1 + Jeu installé avec succès dans %1 - File doesn't appear to be a valid PKG file - Le fichier ne semble pas être un PKG valide + File doesn't appear to be a valid PKG file + Le fichier ne semble pas être un PKG valide - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Ouvrir un dossier + Open Folder + Ouvrir un dossier - Name - Nom + PKG ERROR + Erreur PKG - Serial - Numéro de série + Name + Nom - Installed - + Serial + Numéro de série - Size - Taille + Installed + Installed - Category - + Size + Taille - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Région + FW + FW - Flags - + Region + Région - Path - Répertoire + Flags + Flags - File - Fichier + Path + Répertoire - PKG ERROR - Erreur PKG + File + Fichier - Unknown - Inconnu + Unknown + Inconnu - Package - + Package + Package - - + + SettingsDialog - Settings - Paramètres + Settings + Paramètres - General - Général + General + Général - System - Système + System + Système - Console Language - Langage de la console + Console Language + Langage de la console - Emulator Language - Langage de l'émulateur + Emulator Language + Langage de l'émulateur - Emulator - Émulateur + Emulator + Émulateur - Enable Fullscreen - Plein écran + Enable Fullscreen + Plein écran - Fullscreen Mode - Mode Plein Écran + Fullscreen Mode + Mode Plein Écran - Enable Separate Update Folder - Dossier séparé pour les mises à jour + Enable Separate Update Folder + Dossier séparé pour les mises à jour - Default tab when opening settings - Onglet par défaut lors de l'ouverture des paramètres + Default tab when opening settings + Onglet par défaut lors de l'ouverture des paramètres - Show Game Size In List - Afficher la taille des jeux dans la liste + Show Game Size In List + Afficher la taille des jeux dans la liste - Show Splash - Afficher l'image du jeu + Show Splash + Afficher l'image du jeu - Enable Discord Rich Presence - Activer la présence Discord + Enable Discord Rich Presence + Activer la présence Discord - Username - Nom d'utilisateur + Username + Nom d'utilisateur - Trophy Key - Clé de trophée + Trophy Key + Clé de trophée - Trophy - Trophée + Trophy + Trophée - Logger - Journalisation + Logger + Journalisation - Log Type - Type de journal + Log Type + Type de journal - Log Filter - Filtre du journal + Log Filter + Filtre du journal - Open Log Location - Ouvrir l'emplacement du journal + Open Log Location + Ouvrir l'emplacement du journal - Input - Entrée + Input + Entrée - Cursor - Curseur + Cursor + Curseur - Hide Cursor - Masquer le curseur + Hide Cursor + Masquer le curseur - Hide Cursor Idle Timeout - Délai d'inactivité pour masquer le curseur + Hide Cursor Idle Timeout + Délai d'inactivité pour masquer le curseur - s - s + s + s - Controller - Manette + Controller + Manette - Back Button Behavior - Comportement du bouton retour + Back Button Behavior + Comportement du bouton retour - Graphics - Graphismes + Graphics + Graphismes - GUI - Interface + GUI + Interface - User - Utilisateur + User + Utilisateur - Graphics Device - Carte graphique + Graphics Device + Carte graphique - Width - Largeur + Width + Largeur - Height - Hauteur + Height + Hauteur - Vblank Divider - Vblank + Vblank Divider + Vblank - Advanced - Avancé + Advanced + Avancé - Enable Shaders Dumping - Dumper les shaders + Enable Shaders Dumping + Dumper les shaders - Enable NULL GPU - NULL GPU + Enable NULL GPU + NULL GPU - Paths - Chemins + Enable HDR + Enable HDR - Game Folders - Dossiers de jeu + Paths + Chemins - Add... - Ajouter... + Game Folders + Dossiers de jeu - Remove - Supprimer + Add... + Ajouter... - Debug - Débogage + Remove + Supprimer - Enable Debug Dumping - Activer le débogage + Debug + Débogage - Enable Vulkan Validation Layers - Activer la couche de validation Vulkan + Enable Debug Dumping + Activer le débogage - Enable Vulkan Synchronization Validation - Activer la synchronisation de la validation Vulkan + Enable Vulkan Validation Layers + Activer la couche de validation Vulkan - Enable RenderDoc Debugging - Activer le débogage RenderDoc + Enable Vulkan Synchronization Validation + Activer la synchronisation de la validation Vulkan - Enable Crash Diagnostics - Activer le diagnostic de crash + Enable RenderDoc Debugging + Activer le débogage RenderDoc - Collect Shaders - Collecter les shaders + Enable Crash Diagnostics + Activer le diagnostic de crash - Copy GPU Buffers - Copier la mémoire tampon GPU + Collect Shaders + Collecter les shaders - Host Debug Markers - Marqueur de débogage hôte + Copy GPU Buffers + Copier la mémoire tampon GPU - Guest Debug Markers - Marqueur de débogage invité + Host Debug Markers + Marqueur de débogage hôte - Update - Mise à jour + Guest Debug Markers + Marqueur de débogage invité - Check for Updates at Startup - Vérif. maj au démarrage + Update + Mise à jour - Always Show Changelog - Afficher toujours le changelog + Check for Updates at Startup + Vérif. maj au démarrage - Update Channel - Canal de Mise à Jour + Always Show Changelog + Afficher toujours le changelog - Check for Updates - Vérifier les mises à jour + Update Channel + Canal de Mise à Jour - GUI Settings - Paramètres de l'interface + Check for Updates + Vérifier les mises à jour - Title Music - Musique du titre + GUI Settings + Paramètres de l'interface - Disable Trophy Pop-ups - Désactiver les notifications de trophées + Title Music + Musique du titre - Play title music - Lire la musique du titre + Disable Trophy Pop-ups + Désactiver les notifications de trophées - Update Compatibility Database On Startup - Mettre à jour la base de données de compatibilité au lancement + Background Image + Background Image - Game Compatibility - Compatibilité du jeu + Show Background Image + Show Background Image - Display Compatibility Data - Afficher les données de compatibilité + Opacity + Opacity - Update Compatibility Database - Mettre à jour la base de données de compatibilité + Play title music + Lire la musique du titre - Volume - Volume + Update Compatibility Database On Startup + Mettre à jour la base de données de compatibilité au lancement - Save - Enregistrer + Game Compatibility + Compatibilité du jeu - Apply - Appliquer + Display Compatibility Data + Afficher les données de compatibilité - Restore Defaults - Restaurer les paramètres par défaut + Update Compatibility Database + Mettre à jour la base de données de compatibilité - Close - Fermer + Volume + Volume - Point your mouse at an option to display its description. - Pointez votre souris sur une option pour afficher sa description. + Save + Enregistrer - consoleLanguageGroupBox - Langue de la console:\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région. + Apply + Appliquer - emulatorLanguageGroupBox - Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur. + Restore Defaults + Restaurer les paramètres par défaut - fullscreenCheckBox - Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. + Close + Fermer - separateUpdatesCheckBox - Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. + Point your mouse at an option to display its description. + Pointez votre souris sur une option pour afficher sa description. - showSplashCheckBox - Afficher l'écran de démarrage:\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu. + consoleLanguageGroupBox + Langue de la console:\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région. - discordRPCCheckbox - Activer Discord Rich Presence:\nAffiche l'icône de l'émulateur et les informations pertinentes sur votre profil Discord. + emulatorLanguageGroupBox + Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur. - userName - Nom d'utilisateur:\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux. + fullscreenCheckBox + Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. - TrophyKey - Clé de trophées:\nClé utilisée pour décrypter les trophées. Doit être obtenu à partir de votre console jailbreakée.\nDoit contenir des caractères hexadécimaux uniquement. + separateUpdatesCheckBox + Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. - logTypeGroupBox - Type de journal:\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation. + showSplashCheckBox + Afficher l'écran de démarrage:\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu. - logFilter - Filtre de journal:\n n'imprime que des informations spécifiques.\nExemples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux: Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants. + discordRPCCheckbox + Activer Discord Rich Presence:\nAffiche l'icône de l'émulateur et les informations pertinentes sur votre profil Discord. - updaterGroupBox - Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. + userName + Nom d'utilisateur:\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux. - GUIMusicGroupBox - Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. + TrophyKey + Clé de trophées:\nClé utilisée pour décrypter les trophées. Doit être obtenu à partir de votre console jailbreakée.\nDoit contenir des caractères hexadécimaux uniquement. - disableTrophycheckBox - Désactiver les notifications de trophées:\nDésactive les notifications de trophées en jeu. La progression des trophées peut toujours être suivie à l'aide de la Visionneuse de trophées (clique droit sur le jeu sur la fenêtre principale). + logTypeGroupBox + Type de journal:\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation. - hideCursorGroupBox - Masquer le curseur:\nChoisissez quand le curseur disparaîtra:\nJamais: Vous verrez toujours la souris.\nInactif: Définissez un temps pour qu'il disparaisse après inactivité.\nToujours: vous ne verrez jamais la souris. + logFilter + Filtre de journal:\n n'imprime que des informations spécifiques.\nExemples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux: Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants. - idleTimeoutGroupBox - Définissez un temps pour que la souris disparaisse après être inactif. + updaterGroupBox + Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. - backButtonBehaviorGroupBox - Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez "Mettre à jour la compatibilité au démarrage" pour avoir des informations à jour. + GUIMusicGroupBox + Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. - checkCompatibilityOnStartupCheckBox - Mettre à jour la compatibilité au démarrage:\nMettre à jour automatiquement la base de données de compatibilité au démarrage de shadPS4. + disableTrophycheckBox + Désactiver les notifications de trophées:\nDésactive les notifications de trophées en jeu. La progression des trophées peut toujours être suivie à l'aide de la Visionneuse de trophées (clique droit sur le jeu sur la fenêtre principale). - updateCompatibilityButton - Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. + hideCursorGroupBox + Masquer le curseur:\nChoisissez quand le curseur disparaîtra:\nJamais: Vous verrez toujours la souris.\nInactif: Définissez un temps pour qu'il disparaisse après inactivité.\nToujours: vous ne verrez jamais la souris. - Never - Jamais + idleTimeoutGroupBox + Définissez un temps pour que la souris disparaisse après être inactif. - Idle - Inactif + backButtonBehaviorGroupBox + Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4. - Always - Toujours + enableCompatibilityCheckBox + Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez "Mettre à jour la compatibilité au démarrage" pour avoir des informations à jour. - Touchpad Left - Pavé Tactile Gauche + checkCompatibilityOnStartupCheckBox + Mettre à jour la compatibilité au démarrage:\nMettre à jour automatiquement la base de données de compatibilité au démarrage de shadPS4. - Touchpad Right - Pavé Tactile Droit + updateCompatibilityButton + Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. - Touchpad Center - Centre du Pavé Tactile + Never + Jamais - None - Aucun + Idle + Inactif - graphicsAdapterGroupBox - Adaptateur graphique:\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement. + Always + Toujours - resolutionLayout - Largeur/Hauteur:\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu. + Touchpad Left + Pavé Tactile Gauche - heightDivider - Diviseur Vblank:\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement ! + Touchpad Right + Pavé Tactile Droit - dumpShadersCheckBox - Activer l'exportation de shaders:\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu. + Touchpad Center + Centre du Pavé Tactile - nullGpuCheckBox - Activer le GPU nul:\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique. + None + Aucun - gameFoldersBox - Dossiers de jeux:\nLa liste des dossiers à vérifier pour les jeux installés. + graphicsAdapterGroupBox + Adaptateur graphique:\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement. - addFolderButton - Ajouter:\nAjouter un dossier à la liste. + resolutionLayout + Largeur/Hauteur:\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu. - removeFolderButton - Supprimer:\nSupprimer un dossier de la liste. + heightDivider + Diviseur Vblank:\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement ! - debugDump - Activer l'exportation de débogage:\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire. + dumpShadersCheckBox + Activer l'exportation de shaders:\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu. - vkValidationCheckBox - Activer les couches de validation Vulkan:\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation. + nullGpuCheckBox + Activer le GPU nul:\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique. - vkSyncValidationCheckBox - Activer la validation de synchronisation Vulkan:\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. + gameFoldersBox + Dossiers de jeux:\nLa liste des dossiers à vérifier pour les jeux installés. - collectShaderCheckBox - Collecter les Shaders:\nVous devez activer cette option pour modifier les shaders avec le menu de débogage (Ctrl + F10). + addFolderButton + Ajouter:\nAjouter un dossier à la liste. - crashDiagnosticsCheckBox - Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer la couche de validation Vulkan ainsi que le Vulkan SDK pour que cela fonctionne. + removeFolderButton + Supprimer:\nSupprimer un dossier de la liste. - copyGPUBuffersCheckBox - Copier la mémoire tampon GPU:\nContourne les conditions de course impliquant des soumissions GPU.\nPeut aider ou non en cas de crash PM4 type 0. + debugDump + Activer l'exportation de débogage:\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire. - hostMarkersCheckBox - Marqueur de débogage hôte:\nInsère des informations côté émulateur telles que des marqueurs pour des commandes spécifiques AMDGPU autour des commandes Vulkan, ainsi que donner les noms de débogages des ressources.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. + vkValidationCheckBox + Activer les couches de validation Vulkan:\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation. - guestMarkersCheckBox - Marqueur de débogage invité:\nInsère tous les marqueurs de débogage que le jeu a ajouté a la commande mémoire tampon.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. + vkSyncValidationCheckBox + Activer la validation de synchronisation Vulkan:\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation. - Borderless - + rdocCheckBox + Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. - True - + collectShaderCheckBox + Collecter les Shaders:\nVous devez activer cette option pour modifier les shaders avec le menu de débogage (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer la couche de validation Vulkan ainsi que le Vulkan SDK pour que cela fonctionne. - Release - + copyGPUBuffersCheckBox + Copier la mémoire tampon GPU:\nContourne les conditions de course impliquant des soumissions GPU.\nPeut aider ou non en cas de crash PM4 type 0. - Nightly - + hostMarkersCheckBox + Marqueur de débogage hôte:\nInsère des informations côté émulateur telles que des marqueurs pour des commandes spécifiques AMDGPU autour des commandes Vulkan, ainsi que donner les noms de débogages des ressources.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. - Background Image - + guestMarkersCheckBox + Marqueur de débogage invité:\nInsère tous les marqueurs de débogage que le jeu a ajouté a la commande mémoire tampon.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Parcourir + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Répertoire d'installation des jeux + Browse + Parcourir - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Répertoire d'installation des jeux - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Visionneuse de trophées + Trophy Viewer + Visionneuse de trophées - + diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 6ef25db33..5feb7cf25 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - A shadPS4-ről + About shadPS4 + A shadPS4-ről - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. - This software should not be used to play games you have not legally obtained. - Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. + This software should not be used to play games you have not legally obtained. + Ne használja ezt a szoftvert olyan játékokkal, amelyeket nem legális módon szerzett be. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Nincs elérhető kép + No Image Available + Nincs elérhető kép - Serial: - Sorozatszám: + Serial: + Sorozatszám: - Version: - Verzió: + Version: + Verzió: - Size: - Méret: + Size: + Méret: - Select Cheat File: - Válaszd ki a csalás fájlt: + Select Cheat File: + Válaszd ki a csalás fájlt: - Repository: - Tároló: + Repository: + Tároló: - Download Cheats - Csalások letöltése + Download Cheats + Csalások letöltése - Delete File - Fájl törlése + Delete File + Fájl törlése - No files selected. - Nincsenek kiválasztott fájlok. + No files selected. + Nincsenek kiválasztott fájlok. - You can delete the cheats you don't want after downloading them. - Törölheted a nem kívánt csalásokat a letöltés után. + You can delete the cheats you don't want after downloading them. + Törölheted a nem kívánt csalásokat a letöltés után. - Do you want to delete the selected file?\n%1 - Szeretnéd törölni a kiválasztott fájlt?\n%1 + Do you want to delete the selected file?\n%1 + Szeretnéd törölni a kiválasztott fájlt?\n%1 - Select Patch File: - Válaszd ki a javítás fájlt: + Select Patch File: + Válaszd ki a javítás fájlt: - Download Patches - Javítások letöltése + Download Patches + Javítások letöltése - Save - Mentés + Save + Mentés - Cheats - Csalások + Cheats + Csalások - Patches - Javítások + Patches + Javítások - Error - Hiba + Error + Hiba - No patch selected. - Nincs kiválasztva javítás. + No patch selected. + Nincs kiválasztva javítás. - Unable to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. + Unable to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. - No patch file found for the current serial. - Nincs található javítási fájl a jelenlegi sorozatszámhoz. + No patch file found for the current serial. + Nincs található javítási fájl a jelenlegi sorozatszámhoz. - Unable to open the file for reading. - Nem sikerült megnyitni a fájlt olvasásra. + Unable to open the file for reading. + Nem sikerült megnyitni a fájlt olvasásra. - Unable to open the file for writing. - Nem sikerült megnyitni a fájlt írásra. + Unable to open the file for writing. + Nem sikerült megnyitni a fájlt írásra. - Failed to parse XML: - XML elemzési hiba: + Failed to parse XML: + XML elemzési hiba: - Success - Siker + Success + Siker - Options saved successfully. - A beállítások sikeresen elmentve. + Options saved successfully. + A beállítások sikeresen elmentve. - Invalid Source - Érvénytelen forrás + Invalid Source + Érvénytelen forrás - The selected source is invalid. - A kiválasztott forrás érvénytelen. + The selected source is invalid. + A kiválasztott forrás érvénytelen. - File Exists - A fájl létezik + File Exists + A fájl létezik - File already exists. Do you want to replace it? - A fájl már létezik. Szeretnéd helyettesíteni? + File already exists. Do you want to replace it? + A fájl már létezik. Szeretnéd helyettesíteni? - Failed to save file: - Nem sikerült elmenteni a fájlt: + Failed to save file: + Nem sikerült elmenteni a fájlt: - Failed to download file: - Nem sikerült letölteni a fájlt: + Failed to download file: + Nem sikerült letölteni a fájlt: - Cheats Not Found - Csalások nem találhatóak + Cheats Not Found + Csalások nem találhatóak - CheatsNotFound_MSG - Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban, próbálj meg egy másik tárolót vagy a játék egy másik verzióját. + CheatsNotFound_MSG + Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban, próbálj meg egy másik tárolót vagy a játék egy másik verzióját. - Cheats Downloaded Successfully - Csalások sikeresen letöltve + Cheats Downloaded Successfully + Csalások sikeresen letöltve - CheatsDownloadedSuccessfully_MSG - Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. + CheatsDownloadedSuccessfully_MSG + Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. - Failed to save: - Nem sikerült menteni: + Failed to save: + Nem sikerült menteni: - Failed to download: - Nem sikerült letölteni: + Failed to download: + Nem sikerült letölteni: - Download Complete - Letöltés befejezve + Download Complete + Letöltés befejezve - DownloadComplete_MSG - Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítások nem jelennek meg, lehet, hogy nem léteznek a játék adott sorozatszámához és verziójához. + DownloadComplete_MSG + Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítások nem jelennek meg, lehet, hogy nem léteznek a játék adott sorozatszámához és verziójához. - Failed to parse JSON data from HTML. - Nem sikerült az JSON adatok elemzése HTML-ből. + Failed to parse JSON data from HTML. + Nem sikerült az JSON adatok elemzése HTML-ből. - Failed to retrieve HTML page. - Nem sikerült HTML oldal lekérése. + Failed to retrieve HTML page. + Nem sikerült HTML oldal lekérése. - The game is in version: %1 - A játék verziója: %1 + The game is in version: %1 + A játék verziója: %1 - The downloaded patch only works on version: %1 - A letöltött javításhoz a(z) %1 verzió működik + The downloaded patch only works on version: %1 + A letöltött javításhoz a(z) %1 verzió működik - You may need to update your game. - Lehet, hogy frissítened kell a játékodat. + You may need to update your game. + Lehet, hogy frissítened kell a játékodat. - Incompatibility Notice - Inkompatibilitási értesítés + Incompatibility Notice + Inkompatibilitási értesítés - Failed to open file: - Nem sikerült megnyitni a fájlt: + Failed to open file: + Nem sikerült megnyitni a fájlt: - XML ERROR: - XML HIBA: + XML ERROR: + XML HIBA: - Failed to open files.json for writing - Nem sikerült megnyitni a files.json fájlt írásra + Failed to open files.json for writing + Nem sikerült megnyitni a files.json fájlt írásra - Author: - Szerző: + Author: + Szerző: - Directory does not exist: - A mappa nem létezik: + Directory does not exist: + A mappa nem létezik: - Failed to open files.json for reading. - Nem sikerült megnyitni a files.json fájlt olvasásra. + Failed to open files.json for reading. + Nem sikerült megnyitni a files.json fájlt olvasásra. - Name: - Név: + Name: + Név: - Can't apply cheats before the game is started - Nem lehet csalásokat alkalmazni, mielőtt a játék elindul. + Can't apply cheats before the game is started + Nem lehet csalásokat alkalmazni, mielőtt a játék elindul. - Close - Bezárás + Close + Bezárás - - + + CheckUpdate - Auto Updater - Automatikus frissítő + Auto Updater + Automatikus frissítő - Error - Hiba + Error + Hiba - Network error: - Hálózati hiba: + Network error: + Hálózati hiba: - Error_Github_limit_MSG - Az automatikus frissítő óránként legfeljebb 60 frissítésellenőrzést engedélyez.\nElérte ezt a korlátot. Kérjük, próbálja újra később. + Error_Github_limit_MSG + Az automatikus frissítő óránként legfeljebb 60 frissítésellenőrzést engedélyez.\nElérte ezt a korlátot. Kérjük, próbálja újra később. - Failed to parse update information. - A frissítési információk elemzése sikertelen. + Failed to parse update information. + A frissítési információk elemzése sikertelen. - No pre-releases found. - Nem található előzetes kiadás. + No pre-releases found. + Nem található előzetes kiadás. - Invalid release data. - Érvénytelen kiadási adatok. + Invalid release data. + Érvénytelen kiadási adatok. - No download URL found for the specified asset. - Nincs letöltési URL a megadott eszközhöz. + No download URL found for the specified asset. + Nincs letöltési URL a megadott eszközhöz. - Your version is already up to date! - A verziód már naprakész! + Your version is already up to date! + A verziód már naprakész! - Update Available - Frissítés elérhető + Update Available + Frissítés elérhető - Update Channel - Frissítési Csatorna + Update Channel + Frissítési Csatorna - Current Version - Jelenlegi verzió + Current Version + Jelenlegi verzió - Latest Version - Új verzió + Latest Version + Új verzió - Do you want to update? - Szeretnéd frissíteni? + Do you want to update? + Szeretnéd frissíteni? - Show Changelog - Változások megjelenítése + Show Changelog + Változások megjelenítése - Check for Updates at Startup - Frissítések keresése indításkor + Check for Updates at Startup + Frissítések keresése indításkor - Update - Frissítés + Update + Frissítés - No - Mégse + No + Mégse - Hide Changelog - Változások elrejtése + Hide Changelog + Változások elrejtése - Changes - Változások + Changes + Változások - Network error occurred while trying to access the URL - Hálózati hiba történt az URL elérésekor + Network error occurred while trying to access the URL + Hálózati hiba történt az URL elérésekor - Download Complete - Letöltés kész + Download Complete + Letöltés kész - The update has been downloaded, press OK to install. - A frissítés letöltődött, nyomja meg az OK gombot az telepítéshez. + The update has been downloaded, press OK to install. + A frissítés letöltődött, nyomja meg az OK gombot az telepítéshez. - Failed to save the update file at - A frissítési fájl mentése nem sikerült a következő helyre + Failed to save the update file at + A frissítési fájl mentése nem sikerült a következő helyre - Starting Update... - Frissítés indítása... + Starting Update... + Frissítés indítása... - Failed to create the update script file - A frissítési szkript fájl létrehozása nem sikerült + Failed to create the update script file + A frissítési szkript fájl létrehozása nem sikerült - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Kompatibilitási adatok betöltése, kérem várjon + Fetching compatibility data, please wait + Kompatibilitási adatok betöltése, kérem várjon - Cancel - Megszakítás + Cancel + Megszakítás - Loading... - Betöltés... + Loading... + Betöltés... - Error - Hiba + Error + Hiba - Unable to update compatibility data! Try again later. - Nem sikerült frissíteni a kompatibilitási adatokat! Kérem próbálja újra később. + Unable to update compatibility data! Try again later. + Nem sikerült frissíteni a kompatibilitási adatokat! Kérem próbálja újra később. - Unable to open compatibility_data.json for writing. - Nem sikerült megnyitni a compatibility_data.json fájlt írásra. + Unable to open compatibility_data.json for writing. + Nem sikerült megnyitni a compatibility_data.json fájlt írásra. - Unknown - Ismeretlen + Unknown + Ismeretlen - Nothing - Semmi + Nothing + Semmi - Boots - Csizmák + Boots + Csizmák - Menus - Menük + Menus + Menük - Ingame - Játékban + Ingame + Játékban - Playable - Játszható + Playable + Játszható - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Mappa megnyitása + Open Folder + Mappa megnyitása - - + + GameInfoClass - Loading game list, please wait :3 - Játék könyvtár betöltése, kérjük várjon :3 + Loading game list, please wait :3 + Játék könyvtár betöltése, kérjük várjon :3 - Cancel - Megszakítás + Cancel + Megszakítás - Loading... - Betöltés.. + Loading... + Betöltés.. - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Mappa kiválasztása + shadPS4 - Choose directory + shadPS4 - Mappa kiválasztása - Directory to install games - Mappa a játékok telepítésére + Directory to install games + Mappa a játékok telepítésére - Browse - Böngészés + Browse + Böngészés - Error - Hiba + Error + Hiba - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikon + Icon + Ikon - Name - Név + Name + Név - Serial - Sorozatszám + Serial + Sorozatszám - Compatibility - Compatibility + Compatibility + Compatibility - Region - Régió + Region + Régió - Firmware - Firmware + Firmware + Firmware - Size - Méret + Size + Méret - Version - Verzió + Version + Verzió - Path - Útvonal + Path + Útvonal - Play Time - Játékidő + Play Time + Játékidő - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Kattintson a részletek megtekintéséhez a GitHubon + Click to see details on github + Kattintson a részletek megtekintéséhez a GitHubon - Last updated - Utoljára frissítve + Last updated + Utoljára frissítve - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Parancsikon Létrehozása + Create Shortcut + Parancsikon Létrehozása - Cheats / Patches - Csalások / Javítások + Cheats / Patches + Csalások / Javítások - SFO Viewer - SFO Nézegető + SFO Viewer + SFO Nézegető - Trophy Viewer - Trófeák Megtekintése + Trophy Viewer + Trófeák Megtekintése - Open Folder... - Mappa megnyitása... + Open Folder... + Mappa megnyitása... - Open Game Folder - Játék Mappa Megnyitása + Open Game Folder + Játék Mappa Megnyitása - Open Save Data Folder - Mentési adatok mappa megnyitása + Open Save Data Folder + Mentési adatok mappa megnyitása - Open Log Folder - Napló mappa megnyitása + Open Log Folder + Napló mappa megnyitása - Copy info... - Információ Másolása... + Copy info... + Információ Másolása... - Copy Name - Név Másolása + Copy Name + Név Másolása - Copy Serial - Széria Másolása + Copy Serial + Széria Másolása - Copy All - Összes Másolása + Copy Version + Copy Version - Delete... - Törlés... + Copy Size + Copy Size - Delete Game - Játék törlése + Copy All + Összes Másolása - Delete Update - Frissítések törlése + Delete... + Törlés... - Delete DLC - DLC-k törlése + Delete Game + Játék törlése - Compatibility... - Compatibility... + Delete Update + Frissítések törlése - Update database - Update database + Delete DLC + DLC-k törlése - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Parancsikon létrehozása + View report + View report - Shortcut created successfully! - Parancsikon sikeresen létrehozva! + Submit a report + Submit a report - Error - Hiba + Shortcut creation + Parancsikon létrehozása - Error creating shortcut! - Hiba a parancsikon létrehozásával! + Shortcut created successfully! + Parancsikon sikeresen létrehozva! - Install PKG - PKG telepítése + Error + Hiba - Game - Játék + Error creating shortcut! + Hiba a parancsikon létrehozásával! - This game has no update to delete! - Ehhez a játékhoz nem tartozik törlendő frissítés! + Install PKG + PKG telepítése - Update - Frissítés + Game + Játék - This game has no DLC to delete! - Ehhez a játékhoz nem tartozik törlendő DLC! + This game has no update to delete! + Ehhez a játékhoz nem tartozik törlendő frissítés! - DLC - DLC + Update + Frissítés - Delete %1 - Delete %1 + This game has no DLC to delete! + Ehhez a játékhoz nem tartozik törlendő DLC! - Are you sure you want to delete %1's %2 directory? - Biztosan törölni akarja a %1's %2 mappát? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Biztosan törölni akarja a %1's %2 mappát? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Mappa kiválasztása + shadPS4 - Choose directory + shadPS4 - Mappa kiválasztása - Select which directory you want to install to. - Válassza ki a mappát a játékok telepítésére. + Select which directory you want to install to. + Válassza ki a mappát a játékok telepítésére. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - ELF Mappa Megnyitása/Hozzáadása + Open/Add Elf Folder + ELF Mappa Megnyitása/Hozzáadása - Install Packages (PKG) - PKG-k Telepítése (PKG) + Install Packages (PKG) + PKG-k Telepítése (PKG) - Boot Game - Játék Indítása + Boot Game + Játék Indítása - Check for Updates - Frissítések keresése + Check for Updates + Frissítések keresése - About shadPS4 - A shadPS4-ről + About shadPS4 + A shadPS4-ről - Configure... - Konfigurálás... + Configure... + Konfigurálás... - Install application from a .pkg file - Program telepítése egy .pkg fájlból + Install application from a .pkg file + Program telepítése egy .pkg fájlból - Recent Games - Legutóbbi Játékok + Recent Games + Legutóbbi Játékok - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Kilépés + Exit + Kilépés - Exit shadPS4 - Kilépés a shadPS4-ből + Exit shadPS4 + Kilépés a shadPS4-ből - Exit the application. - Lépjen ki a programból. + Exit the application. + Lépjen ki a programból. - Show Game List - Játék Könyvtár Megjelenítése + Show Game List + Játék Könyvtár Megjelenítése - Game List Refresh - Játék Könyvtár Újratöltése + Game List Refresh + Játék Könyvtár Újratöltése - Tiny - Apró + Tiny + Apró - Small - Kicsi + Small + Kicsi - Medium - Közepes + Medium + Közepes - Large - Nagy + Large + Nagy - List View - Lista Nézet + List View + Lista Nézet - Grid View - Rács Nézet + Grid View + Rács Nézet - Elf Viewer - Elf Nézegető + Elf Viewer + Elf Nézegető - Game Install Directory - Játék Telepítési Mappa + Game Install Directory + Játék Telepítési Mappa - Download Cheats/Patches - Csalások / Javítások letöltése + Download Cheats/Patches + Csalások / Javítások letöltése - Dump Game List - Játéklista Dumpolása + Dump Game List + Játéklista Dumpolása - PKG Viewer - PKG Nézegető + PKG Viewer + PKG Nézegető - Search... - Keresés... + Search... + Keresés... - File - Fájl + File + Fájl - View - Nézet + View + Nézet - Game List Icons - Játékkönyvtár Ikonok + Game List Icons + Játékkönyvtár Ikonok - Game List Mode - Játékkönyvtár Nézet + Game List Mode + Játékkönyvtár Nézet - Settings - Beállítások + Settings + Beállítások - Utils - Segédeszközök + Utils + Segédeszközök - Themes - Témák + Themes + Témák - Help - Segítség + Help + Segítség - Dark - Sötét + Dark + Sötét - Light - Világos + Light + Világos - Green - Zöld + Green + Zöld - Blue - Kék + Blue + Kék - Violet - Ibolya + Violet + Ibolya - toolBar - Eszköztár + toolBar + Eszköztár - Game List - Játéklista + Game List + Játéklista - * Unsupported Vulkan Version - * Nem támogatott Vulkan verzió + * Unsupported Vulkan Version + * Nem támogatott Vulkan verzió - Download Cheats For All Installed Games - Csalások letöltése minden telepített játékhoz + Download Cheats For All Installed Games + Csalások letöltése minden telepített játékhoz - Download Patches For All Games - Javítások letöltése minden játékhoz + Download Patches For All Games + Javítások letöltése minden játékhoz - Download Complete - Letöltés befejezve + Download Complete + Letöltés befejezve - You have downloaded cheats for all the games you have installed. - Minden elérhető csalás letöltődött az összes telepített játékhoz. + You have downloaded cheats for all the games you have installed. + Minden elérhető csalás letöltődött az összes telepített játékhoz. - Patches Downloaded Successfully! - Javítások sikeresen letöltve! + Patches Downloaded Successfully! + Javítások sikeresen letöltve! - All Patches available for all games have been downloaded. - Az összes játékhoz elérhető javítás letöltésre került. + All Patches available for all games have been downloaded. + Az összes játékhoz elérhető javítás letöltésre került. - Games: - Játékok: + Games: + Játékok: - ELF files (*.bin *.elf *.oelf) - ELF fájlok (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF fájlok (*.bin *.elf *.oelf) - Game Boot - Játék indító + Game Boot + Játék indító - Only one file can be selected! - Csak egy fájl választható ki! + Only one file can be selected! + Csak egy fájl választható ki! - PKG Extraction - PKG kicsomagolás + PKG Extraction + PKG kicsomagolás - Patch detected! - Frissítés észlelve! + Patch detected! + Frissítés észlelve! - PKG and Game versions match: - A PKG és a játék verziói egyeznek: + PKG and Game versions match: + A PKG és a játék verziói egyeznek: - Would you like to overwrite? - Szeretné felülírni? + Would you like to overwrite? + Szeretné felülírni? - PKG Version %1 is older than installed version: - A(z) %1-es PKG verzió régebbi, mint a telepített verzió: + PKG Version %1 is older than installed version: + A(z) %1-es PKG verzió régebbi, mint a telepített verzió: - Game is installed: - A játék telepítve van: + Game is installed: + A játék telepítve van: - Would you like to install Patch: - Szeretné telepíteni a frissítést: + Would you like to install Patch: + Szeretné telepíteni a frissítést: - DLC Installation - DLC Telepítés + DLC Installation + DLC Telepítés - Would you like to install DLC: %1? - Szeretné telepíteni a %1 DLC-t? + Would you like to install DLC: %1? + Szeretné telepíteni a %1 DLC-t? - DLC already installed: - DLC már telepítve: + DLC already installed: + DLC már telepítve: - Game already installed - A játék már telepítve van + Game already installed + A játék már telepítve van - PKG ERROR - PKG HIBA + PKG ERROR + PKG HIBA - Extracting PKG %1/%2 - PKG kicsomagolása %1/%2 + Extracting PKG %1/%2 + PKG kicsomagolása %1/%2 - Extraction Finished - Kicsomagolás befejezve + Extraction Finished + Kicsomagolás befejezve - Game successfully installed at %1 - A játék sikeresen telepítve itt: %1 + Game successfully installed at %1 + A játék sikeresen telepítve itt: %1 - File doesn't appear to be a valid PKG file - A fájl nem tűnik érvényes PKG fájlnak + File doesn't appear to be a valid PKG file + A fájl nem tűnik érvényes PKG fájlnak - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Mappa Megnyitása + Open Folder + Mappa Megnyitása - Name - Név + PKG ERROR + PKG HIBA - Serial - Sorozatszám + Name + Név - Installed - + Serial + Sorozatszám - Size - Méret + Installed + Installed - Category - + Size + Méret - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Régió + FW + FW - Flags - + Region + Régió - Path - Útvonal + Flags + Flags - File - Fájl + Path + Útvonal - PKG ERROR - PKG HIBA + File + Fájl - Unknown - Ismeretlen + Unknown + Ismeretlen - Package - + Package + Package - - + + SettingsDialog - Settings - Beállítások + Settings + Beállítások - General - Általános + General + Általános - System - Rendszer + System + Rendszer - Console Language - A Konzol Nyelvezete + Console Language + A Konzol Nyelvezete - Emulator Language - Az Emulátor Nyelvezete + Emulator Language + Az Emulátor Nyelvezete - Emulator - Emulátor + Emulator + Emulátor - Enable Fullscreen - Teljes Képernyő Engedélyezése + Enable Fullscreen + Teljes Képernyő Engedélyezése - Fullscreen Mode - Teljes képernyős mód + Fullscreen Mode + Teljes képernyős mód - Enable Separate Update Folder - Külön Frissítési Mappa Engedélyezése + Enable Separate Update Folder + Külön Frissítési Mappa Engedélyezése - Default tab when opening settings - Alapértelmezett fül a beállítások megnyitásakor + Default tab when opening settings + Alapértelmezett fül a beállítások megnyitásakor - Show Game Size In List - Játékméret megjelenítése a listában + Show Game Size In List + Játékméret megjelenítése a listában - Show Splash - Indítóképernyő Mutatása + Show Splash + Indítóképernyő Mutatása - Enable Discord Rich Presence - A Discord Rich Presence engedélyezése + Enable Discord Rich Presence + A Discord Rich Presence engedélyezése - Username - Felhasználónév + Username + Felhasználónév - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Naplózó + Logger + Naplózó - Log Type - Naplózási Típus + Log Type + Naplózási Típus - Log Filter - Naplózási Filter + Log Filter + Naplózási Filter - Open Log Location - Napló helyének megnyitása + Open Log Location + Napló helyének megnyitása - Input - Bemenet + Input + Bemenet - Cursor - Kurzor + Cursor + Kurzor - Hide Cursor - Kurzor elrejtése + Hide Cursor + Kurzor elrejtése - Hide Cursor Idle Timeout - Kurzor inaktivitási időtúllépés + Hide Cursor Idle Timeout + Kurzor inaktivitási időtúllépés - s - s + s + s - Controller - Kontroller + Controller + Kontroller - Back Button Behavior - Vissza gomb Viselkedése + Back Button Behavior + Vissza gomb Viselkedése - Graphics - Grafika + Graphics + Grafika - GUI - Felület + GUI + Felület - User - Felhasználó + User + Felhasználó - Graphics Device - Grafikai Eszköz + Graphics Device + Grafikai Eszköz - Width - Szélesség + Width + Szélesség - Height - Magasság + Height + Magasság - Vblank Divider - Vblank Elosztó + Vblank Divider + Vblank Elosztó - Advanced - Haladó + Advanced + Haladó - Enable Shaders Dumping - Shader Dumpolás Engedélyezése + Enable Shaders Dumping + Shader Dumpolás Engedélyezése - Enable NULL GPU - NULL GPU Engedélyezése + Enable NULL GPU + NULL GPU Engedélyezése - Paths - Útvonalak + Enable HDR + Enable HDR - Game Folders - Játékmappák + Paths + Útvonalak - Add... - Hozzáadás... + Game Folders + Játékmappák - Remove - Eltávolítás + Add... + Hozzáadás... - Debug - Debugolás + Remove + Eltávolítás - Enable Debug Dumping - Debug Dumpolás Engedélyezése + Debug + Debugolás - Enable Vulkan Validation Layers - Vulkan Validációs Rétegek Engedélyezése + Enable Debug Dumping + Debug Dumpolás Engedélyezése - Enable Vulkan Synchronization Validation - Vulkan Szinkronizálás Validáció + Enable Vulkan Validation Layers + Vulkan Validációs Rétegek Engedélyezése - Enable RenderDoc Debugging - RenderDoc Debugolás Engedélyezése + Enable Vulkan Synchronization Validation + Vulkan Szinkronizálás Validáció - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + RenderDoc Debugolás Engedélyezése - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Frissítés + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Frissítések keresése indításkor + Update + Frissítés - Always Show Changelog - Mindig mutasd a változásnaplót + Check for Updates at Startup + Frissítések keresése indításkor - Update Channel - Frissítési Csatorna + Always Show Changelog + Mindig mutasd a változásnaplót - Check for Updates - Frissítések keresése + Update Channel + Frissítési Csatorna - GUI Settings - GUI Beállítások + Check for Updates + Frissítések keresése - Title Music - Title Music + GUI Settings + GUI Beállítások - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Címzene lejátszása + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Címzene lejátszása - Volume - Hangerő + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Mentés + Game Compatibility + Game Compatibility - Apply - Alkalmaz + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Alapértelmezett értékek visszaállítása + Update Compatibility Database + Update Compatibility Database - Close - Bezárás + Volume + Hangerő - Point your mouse at an option to display its description. - Helyezze az egérmutatót egy lehetőség fölé, hogy megjelenítse annak leírását. + Save + Mentés - consoleLanguageGroupBox - Konzol nyelve:\nBeállítja a PS4 játék nyelvét.\nAjánlott a játék által támogatott nyelvre állítani, amely régiónként változhat. + Apply + Alkalmaz - emulatorLanguageGroupBox - Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. + Restore Defaults + Alapértelmezett értékek visszaállítása - fullscreenCheckBox - Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. + Close + Bezárás - separateUpdatesCheckBox - Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében. + Point your mouse at an option to display its description. + Helyezze az egérmutatót egy lehetőség fölé, hogy megjelenítse annak leírását. - showSplashCheckBox - Indítóképernyő megjelenítése:\nMegjeleníti a játék indítóképernyőjét (különleges képet) a játék elindításakor. + consoleLanguageGroupBox + Konzol nyelve:\nBeállítja a PS4 játék nyelvét.\nAjánlott a játék által támogatott nyelvre állítani, amely régiónként változhat. - discordRPCCheckbox - A Discord Rich Presence engedélyezése:\nMegjeleníti az emulator ikonját és a kapcsolódó információkat a Discord profilján. + emulatorLanguageGroupBox + Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. - userName - Felhasználónév:\nBeállítja a PS4 fiók felhasználónevét, amelyet egyes játékok megjeleníthetnek. + fullscreenCheckBox + Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében. - logTypeGroupBox - Napló típusa:\nBeállítja, hogy szinkronizálja-e a naplóablak kimenetét a teljesítmény érdekében. Ennek kedvezőtlen hatásai lehetnek az emulációra. + showSplashCheckBox + Indítóképernyő megjelenítése:\nMegjeleníti a játék indítóképernyőjét (különleges képet) a játék elindításakor. - logFilter - Napló szűrő:\nCsak bizonyos információk megjelenítésére szűri a naplót.\nPéldák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket. + discordRPCCheckbox + A Discord Rich Presence engedélyezése:\nMegjeleníti az emulator ikonját és a kapcsolódó információkat a Discord profilján. - updaterGroupBox - Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. + userName + Felhasználónév:\nBeállítja a PS4 fiók felhasználónevét, amelyet egyes játékok megjeleníthetnek. - GUIMusicGroupBox - Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Napló típusa:\nBeállítja, hogy szinkronizálja-e a naplóablak kimenetét a teljesítmény érdekében. Ennek kedvezőtlen hatásai lehetnek az emulációra. - hideCursorGroupBox - Kurzor elrejtése:\nVálassza ki, mikor tűnjön el az egérmutató:\nSoha: Az egér mindig látható.\nInaktív: Állítson be egy időt, amennyi idő mozdulatlanság után eltűnik.\nMindig: az egér mindig el lesz rejtve. + logFilter + Napló szűrő:\nCsak bizonyos információk megjelenítésére szűri a naplót.\nPéldák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket. - idleTimeoutGroupBox - Állítson be egy időt, ami után egér inaktív állapotban eltűnik. + updaterGroupBox + Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. - backButtonBehaviorGroupBox - Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Kurzor elrejtése:\nVálassza ki, mikor tűnjön el az egérmutató:\nSoha: Az egér mindig látható.\nInaktív: Állítson be egy időt, amennyi idő mozdulatlanság után eltűnik.\nMindig: az egér mindig el lesz rejtve. - Never - Soha + idleTimeoutGroupBox + Állítson be egy időt, ami után egér inaktív állapotban eltűnik. - Idle - Inaktív + backButtonBehaviorGroupBox + Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését. - Always - Mindig + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Érintőpad Bal + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Érintőpad Jobb + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Érintőpad Közép + Never + Soha - None - Semmi + Idle + Inaktív - graphicsAdapterGroupBox - Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az "Auto Select" lehetőséget, hogy automatikusan kiválassza azt. + Always + Mindig - resolutionLayout - Szélesség/Magasság:\nBeállítja az emulátor ablakának méretét induláskor, amely a játék során átméretezhető.\nEz különbözik a játékbeli felbontástól. + Touchpad Left + Érintőpad Bal - heightDivider - Vblank elosztó:\nAz emulátor frissítési sebessége e számot megszorozva működik. Ennek megváltoztatása kedvezőtlen hatásokat okozhat, például növelheti a játék sebességét, vagy megszakíthat kritikus játékfunkciókat, amelyek nem számítanak arra, hogy ez megváltozik! + Touchpad Right + Érintőpad Jobb - dumpShadersCheckBox - Shader dumping engedélyezése:\nMűszaki hibaelhárítás céljából a játékok shaderjeit elmenti egy mappába, ahogy renderelődnek. + Touchpad Center + Érintőpad Közép - nullGpuCheckBox - Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya. + None + Semmi - gameFoldersBox - Játék mappák:\nA mappák listája, ahol telepített játékok vannak. + graphicsAdapterGroupBox + Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az "Auto Select" lehetőséget, hogy automatikusan kiválassza azt. - addFolderButton - Hozzáadás:\nHozzon létre egy mappát a listában. + resolutionLayout + Szélesség/Magasság:\nBeállítja az emulátor ablakának méretét induláskor, amely a játék során átméretezhető.\nEz különbözik a játékbeli felbontástól. - removeFolderButton - Eltávolítás:\nTávolítson el egy mappát a listából. + heightDivider + Vblank elosztó:\nAz emulátor frissítési sebessége e számot megszorozva működik. Ennek megváltoztatása kedvezőtlen hatásokat okozhat, például növelheti a játék sebességét, vagy megszakíthat kritikus játékfunkciókat, amelyek nem számítanak arra, hogy ez megváltozik! - debugDump - Debug dumpolás engedélyezése:\nElmenti a futó PS4 program import- és exportszimbólumait, valamint a fájl fejlécinformációit egy könyvtárba. + dumpShadersCheckBox + Shader dumping engedélyezése:\nMűszaki hibaelhárítás céljából a játékok shaderjeit elmenti egy mappába, ahogy renderelődnek. - vkValidationCheckBox - Vulkan validációs rétegek engedélyezése:\nEngedélyezi a Vulkan renderelő állapotának validálását és információk naplózását annak belső állapotáról. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. + nullGpuCheckBox + Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya. - vkSyncValidationCheckBox - Vulkan szinkronizációs validáció engedélyezése:\nEngedélyezi a Vulkan renderelési feladatok időzítésének validálását. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. + gameFoldersBox + Játék mappák:\nA mappák listája, ahol telepített játékok vannak. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Hozzáadás:\nHozzon létre egy mappát a listában. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Eltávolítás:\nTávolítson el egy mappát a listából. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Debug dumpolás engedélyezése:\nElmenti a futó PS4 program import- és exportszimbólumait, valamint a fájl fejlécinformációit egy könyvtárba. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Vulkan validációs rétegek engedélyezése:\nEngedélyezi a Vulkan renderelő állapotának validálását és információk naplózását annak belső állapotáról. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Vulkan szinkronizációs validáció engedélyezése:\nEngedélyezi a Vulkan renderelési feladatok időzítésének validálását. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - Borderless - + rdocCheckBox + RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Böngészés + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Mappa a játékok telepítésére + Browse + Böngészés - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Mappa a játékok telepítésére - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trófeák Megtekintése + Trophy Viewer + Trófeák Megtekintése - + diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 6e30ab310..6ca56e729 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Tidak Ada Gambar Tersedia + No Image Available + Tidak Ada Gambar Tersedia - Serial: - Serial: + Serial: + Serial: - Version: - Versi: + Version: + Versi: - Size: - Ukuran: + Size: + Ukuran: - Select Cheat File: - Pilih File Cheat: + Select Cheat File: + Pilih File Cheat: - Repository: - Repositori: + Repository: + Repositori: - Download Cheats - Unduh Cheat + Download Cheats + Unduh Cheat - Delete File - Hapus File + Delete File + Hapus File - No files selected. - Tidak ada file yang dipilih. + No files selected. + Tidak ada file yang dipilih. - You can delete the cheats you don't want after downloading them. - Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. + You can delete the cheats you don't want after downloading them. + Anda dapat menghapus cheat yang tidak Anda inginkan setelah mengunduhnya. - Do you want to delete the selected file?\n%1 - Apakah Anda ingin menghapus berkas yang dipilih?\n%1 + Do you want to delete the selected file?\n%1 + Apakah Anda ingin menghapus berkas yang dipilih?\n%1 - Select Patch File: - Pilih File Patch: + Select Patch File: + Pilih File Patch: - Download Patches - Unduh Patch + Download Patches + Unduh Patch - Save - Simpan + Save + Simpan - Cheats - Cheat + Cheats + Cheat - Patches - Patch + Patches + Patch - Error - Kesalahan + Error + Kesalahan - No patch selected. - Tidak ada patch yang dipilih. + No patch selected. + Tidak ada patch yang dipilih. - Unable to open files.json for reading. - Tidak dapat membuka files.json untuk dibaca. + Unable to open files.json for reading. + Tidak dapat membuka files.json untuk dibaca. - No patch file found for the current serial. - Tidak ada file patch ditemukan untuk serial saat ini. + No patch file found for the current serial. + Tidak ada file patch ditemukan untuk serial saat ini. - Unable to open the file for reading. - Tidak dapat membuka file untuk dibaca. + Unable to open the file for reading. + Tidak dapat membuka file untuk dibaca. - Unable to open the file for writing. - Tidak dapat membuka file untuk menulis. + Unable to open the file for writing. + Tidak dapat membuka file untuk menulis. - Failed to parse XML: - Gagal menganalisis XML: + Failed to parse XML: + Gagal menganalisis XML: - Success - Sukses + Success + Sukses - Options saved successfully. - Opsi berhasil disimpan. + Options saved successfully. + Opsi berhasil disimpan. - Invalid Source - Sumber Tidak Valid + Invalid Source + Sumber Tidak Valid - The selected source is invalid. - Sumber yang dipilih tidak valid. + The selected source is invalid. + Sumber yang dipilih tidak valid. - File Exists - File Ada + File Exists + File Ada - File already exists. Do you want to replace it? - File sudah ada. Apakah Anda ingin menggantinya? + File already exists. Do you want to replace it? + File sudah ada. Apakah Anda ingin menggantinya? - Failed to save file: - Gagal menyimpan file: + Failed to save file: + Gagal menyimpan file: - Failed to download file: - Gagal mengunduh file: + Failed to download file: + Gagal mengunduh file: - Cheats Not Found - Cheat Tidak Ditemukan + Cheats Not Found + Cheat Tidak Ditemukan - CheatsNotFound_MSG - Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. + CheatsNotFound_MSG + Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. - Cheats Downloaded Successfully - Cheat Berhasil Diunduh + Cheats Downloaded Successfully + Cheat Berhasil Diunduh - CheatsDownloadedSuccessfully_MSG - Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. + CheatsDownloadedSuccessfully_MSG + Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. - Failed to save: - Gagal menyimpan: + Failed to save: + Gagal menyimpan: - Failed to download: - Gagal mengunduh: + Failed to download: + Gagal mengunduh: - Download Complete - Unduhan Selesai + Download Complete + Unduhan Selesai - DownloadComplete_MSG - Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. + DownloadComplete_MSG + Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. - Failed to parse JSON data from HTML. - Gagal menganalisis data JSON dari HTML. + Failed to parse JSON data from HTML. + Gagal menganalisis data JSON dari HTML. - Failed to retrieve HTML page. - Gagal mengambil halaman HTML. + Failed to retrieve HTML page. + Gagal mengambil halaman HTML. - The game is in version: %1 - Permainan berada di versi: %1 + The game is in version: %1 + Permainan berada di versi: %1 - The downloaded patch only works on version: %1 - Patch yang diunduh hanya berfungsi pada versi: %1 + The downloaded patch only works on version: %1 + Patch yang diunduh hanya berfungsi pada versi: %1 - You may need to update your game. - Anda mungkin perlu memperbarui permainan Anda. + You may need to update your game. + Anda mungkin perlu memperbarui permainan Anda. - Incompatibility Notice - Pemberitahuan Ketidakcocokan + Incompatibility Notice + Pemberitahuan Ketidakcocokan - Failed to open file: - Gagal membuka file: + Failed to open file: + Gagal membuka file: - XML ERROR: - KESALAHAN XML: + XML ERROR: + KESALAHAN XML: - Failed to open files.json for writing - Gagal membuka files.json untuk menulis + Failed to open files.json for writing + Gagal membuka files.json untuk menulis - Author: - Penulis: + Author: + Penulis: - Directory does not exist: - Direktori tidak ada: + Directory does not exist: + Direktori tidak ada: - Failed to open files.json for reading. - Gagal membuka files.json untuk dibaca. + Failed to open files.json for reading. + Gagal membuka files.json untuk dibaca. - Name: - Nama: + Name: + Nama: - Can't apply cheats before the game is started - Tidak bisa menerapkan cheat sebelum permainan dimulai. + Can't apply cheats before the game is started + Tidak bisa menerapkan cheat sebelum permainan dimulai. - Close - Tutup + Close + Tutup - - + + CheckUpdate - Auto Updater - Pembaruan Otomatis + Auto Updater + Pembaruan Otomatis - Error - Kesalahan + Error + Kesalahan - Network error: - Kesalahan jaringan: + Network error: + Kesalahan jaringan: - Error_Github_limit_MSG - Pembaruan Otomatis memungkinkan hingga 60 pemeriksaan pembaruan per jam.\nAnda telah mencapai batas ini. Silakan coba lagi nanti. + Error_Github_limit_MSG + Pembaruan Otomatis memungkinkan hingga 60 pemeriksaan pembaruan per jam.\nAnda telah mencapai batas ini. Silakan coba lagi nanti. - Failed to parse update information. - Gagal memparse informasi pembaruan. + Failed to parse update information. + Gagal memparse informasi pembaruan. - No pre-releases found. - Tidak ada pra-rilis yang ditemukan. + No pre-releases found. + Tidak ada pra-rilis yang ditemukan. - Invalid release data. - Data rilis tidak valid. + Invalid release data. + Data rilis tidak valid. - No download URL found for the specified asset. - Tidak ada URL unduhan ditemukan untuk aset yang ditentukan. + No download URL found for the specified asset. + Tidak ada URL unduhan ditemukan untuk aset yang ditentukan. - Your version is already up to date! - Versi Anda sudah terbaru! + Your version is already up to date! + Versi Anda sudah terbaru! - Update Available - Pembaruan Tersedia + Update Available + Pembaruan Tersedia - Update Channel - Saluran Pembaruan + Update Channel + Saluran Pembaruan - Current Version - Versi Saat Ini + Current Version + Versi Saat Ini - Latest Version - Versi Terbaru + Latest Version + Versi Terbaru - Do you want to update? - Apakah Anda ingin memperbarui? + Do you want to update? + Apakah Anda ingin memperbarui? - Show Changelog - Tampilkan Catatan Perubahan + Show Changelog + Tampilkan Catatan Perubahan - Check for Updates at Startup - Periksa pembaruan saat mulai + Check for Updates at Startup + Periksa pembaruan saat mulai - Update - Perbarui + Update + Perbarui - No - Tidak + No + Tidak - Hide Changelog - Sembunyikan Catatan Perubahan + Hide Changelog + Sembunyikan Catatan Perubahan - Changes - Perubahan + Changes + Perubahan - Network error occurred while trying to access the URL - Kesalahan jaringan terjadi saat mencoba mengakses URL + Network error occurred while trying to access the URL + Kesalahan jaringan terjadi saat mencoba mengakses URL - Download Complete - Unduhan Selesai + Download Complete + Unduhan Selesai - The update has been downloaded, press OK to install. - Pembaruan telah diunduh, tekan OK untuk menginstal. + The update has been downloaded, press OK to install. + Pembaruan telah diunduh, tekan OK untuk menginstal. - Failed to save the update file at - Gagal menyimpan file pembaruan di + Failed to save the update file at + Gagal menyimpan file pembaruan di - Starting Update... - Memulai Pembaruan... + Starting Update... + Memulai Pembaruan... - Failed to create the update script file - Gagal membuat file skrip pembaruan + Failed to create the update script file + Gagal membuat file skrip pembaruan - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Memuat data kompatibilitas, harap tunggu + Fetching compatibility data, please wait + Memuat data kompatibilitas, harap tunggu - Cancel - Batal + Cancel + Batal - Loading... - Memuat... + Loading... + Memuat... - Error - Kesalahan + Error + Kesalahan - Unable to update compatibility data! Try again later. - Tidak dapat memperbarui data kompatibilitas! Coba lagi nanti. + Unable to update compatibility data! Try again later. + Tidak dapat memperbarui data kompatibilitas! Coba lagi nanti. - Unable to open compatibility_data.json for writing. - Tidak dapat membuka compatibility_data.json untuk menulis. + Unable to open compatibility_data.json for writing. + Tidak dapat membuka compatibility_data.json untuk menulis. - Unknown - Tidak Dikenal + Unknown + Tidak Dikenal - Nothing - Tidak ada + Nothing + Tidak ada - Boots - Sepatu Bot + Boots + Sepatu Bot - Menus - Menu + Menus + Menu - Ingame - Dalam Permainan + Ingame + Dalam Permainan - Playable - Playable + Playable + Playable - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikon + Icon + Ikon - Name - Nama + Name + Nama - Serial - Serial + Serial + Serial - Compatibility - Compatibility + Compatibility + Compatibility - Region - Wilayah + Region + Wilayah - Firmware - Firmware + Firmware + Firmware - Size - Ukuran + Size + Ukuran - Version - Versi + Version + Versi - Path - Jalur + Path + Jalur - Play Time - Waktu Bermain + Play Time + Waktu Bermain - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Klik untuk melihat detail di GitHub + Click to see details on github + Klik untuk melihat detail di GitHub - Last updated - Terakhir diperbarui + Last updated + Terakhir diperbarui - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - Cheats / Patches - Cheat / Patch + Cheats / Patches + Cheat / Patch - SFO Viewer - SFO Viewer + SFO Viewer + SFO Viewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - Open Folder... - Buka Folder... + Open Folder... + Buka Folder... - Open Game Folder - Buka Folder Game + Open Game Folder + Buka Folder Game - Open Save Data Folder - Buka Folder Data Simpanan + Open Save Data Folder + Buka Folder Data Simpanan - Open Log Folder - Buka Folder Log + Open Log Folder + Buka Folder Log - Copy info... - Copy info... + Copy info... + Copy info... - Copy Name - Copy Name + Copy Name + Copy Name - Copy Serial - Copy Serial + Copy Serial + Copy Serial - Copy All - Copy All + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copy All - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Shortcut creation + View report + View report - Shortcut created successfully! - Shortcut created successfully! + Submit a report + Submit a report - Error - Error + Shortcut creation + Shortcut creation - Error creating shortcut! - Error creating shortcut! + Shortcut created successfully! + Shortcut created successfully! - Install PKG - Install PKG + Error + Error - Game - Game + Error creating shortcut! + Error creating shortcut! - This game has no update to delete! - This game has no update to delete! + Install PKG + Install PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Periksa pembaruan + Check for Updates + Periksa pembaruan - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Unduh Cheat / Patch + Download Cheats/Patches + Unduh Cheat / Patch - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Bantuan + Help + Bantuan - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Daftar game + Game List + Daftar game - * Unsupported Vulkan Version - * Versi Vulkan Tidak Didukung + * Unsupported Vulkan Version + * Versi Vulkan Tidak Didukung - Download Cheats For All Installed Games - Unduh Cheat Untuk Semua Game Yang Terpasang + Download Cheats For All Installed Games + Unduh Cheat Untuk Semua Game Yang Terpasang - Download Patches For All Games - Unduh Patch Untuk Semua Game + Download Patches For All Games + Unduh Patch Untuk Semua Game - Download Complete - Unduhan Selesai + Download Complete + Unduhan Selesai - You have downloaded cheats for all the games you have installed. - Anda telah mengunduh cheat untuk semua game yang terpasang. + You have downloaded cheats for all the games you have installed. + Anda telah mengunduh cheat untuk semua game yang terpasang. - Patches Downloaded Successfully! - Patch Berhasil Diunduh! + Patches Downloaded Successfully! + Patch Berhasil Diunduh! - All Patches available for all games have been downloaded. - Semua Patch yang tersedia untuk semua game telah diunduh. + All Patches available for all games have been downloaded. + Semua Patch yang tersedia untuk semua game telah diunduh. - Games: - Game: + Games: + Game: - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) - Game Boot - Boot Game + Game Boot + Boot Game - Only one file can be selected! - Hanya satu file yang bisa dipilih! + Only one file can be selected! + Hanya satu file yang bisa dipilih! - PKG Extraction - Ekstraksi PKG + PKG Extraction + Ekstraksi PKG - Patch detected! - Patch terdeteksi! + Patch detected! + Patch terdeteksi! - PKG and Game versions match: - Versi PKG dan Game cocok: + PKG and Game versions match: + Versi PKG dan Game cocok: - Would you like to overwrite? - Apakah Anda ingin menimpa? + Would you like to overwrite? + Apakah Anda ingin menimpa? - PKG Version %1 is older than installed version: - Versi PKG %1 lebih lama dari versi yang terpasang: + PKG Version %1 is older than installed version: + Versi PKG %1 lebih lama dari versi yang terpasang: - Game is installed: - Game telah terpasang: + Game is installed: + Game telah terpasang: - Would you like to install Patch: - Apakah Anda ingin menginstal patch: + Would you like to install Patch: + Apakah Anda ingin menginstal patch: - DLC Installation - Instalasi DLC + DLC Installation + Instalasi DLC - Would you like to install DLC: %1? - Apakah Anda ingin menginstal DLC: %1? + Would you like to install DLC: %1? + Apakah Anda ingin menginstal DLC: %1? - DLC already installed: - DLC sudah terpasang: + DLC already installed: + DLC sudah terpasang: - Game already installed - Game sudah terpasang + Game already installed + Game sudah terpasang - PKG ERROR - KESALAHAN PKG + PKG ERROR + KESALAHAN PKG - Extracting PKG %1/%2 - Mengekstrak PKG %1/%2 + Extracting PKG %1/%2 + Mengekstrak PKG %1/%2 - Extraction Finished - Ekstraksi Selesai + Extraction Finished + Ekstraksi Selesai - Game successfully installed at %1 - Game berhasil dipasang di %1 + Game successfully installed at %1 + Game berhasil dipasang di %1 - File doesn't appear to be a valid PKG file - File tampaknya bukan file PKG yang valid + File doesn't appear to be a valid PKG file + File tampaknya bukan file PKG yang valid - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Nama + PKG ERROR + KESALAHAN PKG - Serial - Serial + Name + Nama - Installed - + Serial + Serial - Size - Ukuran + Installed + Installed - Category - + Size + Ukuran - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Wilayah + FW + FW - Flags - + Region + Wilayah - Path - Jalur + Flags + Flags - File - File + Path + Jalur - PKG ERROR - KESALAHAN PKG + File + File - Unknown - Tidak Dikenal + Unknown + Tidak Dikenal - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - Mode Layar Penuh + Fullscreen Mode + Mode Layar Penuh - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Tab default saat membuka pengaturan + Default tab when opening settings + Tab default saat membuka pengaturan - Show Game Size In List - Tampilkan Ukuran Game di Daftar + Show Game Size In List + Tampilkan Ukuran Game di Daftar - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Aktifkan Discord Rich Presence + Enable Discord Rich Presence + Aktifkan Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - Buka Lokasi Log + Open Log Location + Buka Lokasi Log - Input - Masukan + Input + Masukan - Cursor - Kursor + Cursor + Kursor - Hide Cursor - Sembunyikan kursor + Hide Cursor + Sembunyikan kursor - Hide Cursor Idle Timeout - Batas waktu sembunyikan kursor tidak aktif + Hide Cursor Idle Timeout + Batas waktu sembunyikan kursor tidak aktif - s - s + s + s - Controller - Pengontrol + Controller + Pengontrol - Back Button Behavior - Perilaku tombol kembali + Back Button Behavior + Perilaku tombol kembali - Graphics - Graphics + Graphics + Graphics - GUI - Antarmuka + GUI + Antarmuka - User - Pengguna + User + Pengguna - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Jalur + Enable HDR + Enable HDR - Game Folders - Folder Permainan + Paths + Jalur - Add... - Tambah... + Game Folders + Folder Permainan - Remove - Hapus + Add... + Tambah... - Debug - Debug + Remove + Hapus - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Pembaruan + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Periksa pembaruan saat mulai + Update + Pembaruan - Always Show Changelog - Selalu Tampilkan Riwayat Perubahan + Check for Updates at Startup + Periksa pembaruan saat mulai - Update Channel - Saluran Pembaruan + Always Show Changelog + Selalu Tampilkan Riwayat Perubahan - Check for Updates - Periksa pembaruan + Update Channel + Saluran Pembaruan - GUI Settings - Pengaturan GUI + Check for Updates + Periksa pembaruan - Title Music - Title Music + GUI Settings + Pengaturan GUI - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Putar musik judul + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Putar musik judul - Volume - Volume + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Simpan + Game Compatibility + Game Compatibility - Apply - Terapkan + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Kembalikan Pengaturan Default + Update Compatibility Database + Update Compatibility Database - Close - Tutup + Volume + Volume - Point your mouse at an option to display its description. - Arahkan mouse Anda pada opsi untuk menampilkan deskripsinya. + Save + Simpan - consoleLanguageGroupBox - Bahasa Konsol:\nMenetapkan bahasa yang digunakan oleh permainan PS4.\nDisarankan untuk mengatur ini ke bahasa yang didukung oleh permainan, yang dapat bervariasi berdasarkan wilayah. + Apply + Terapkan - emulatorLanguageGroupBox - Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. + Restore Defaults + Kembalikan Pengaturan Default - fullscreenCheckBox - Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. + Close + Tutup - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Arahkan mouse Anda pada opsi untuk menampilkan deskripsinya. - showSplashCheckBox - Tampilkan Layar Pembuka:\nMenampilkan layar pembuka permainan (gambar khusus) saat permainan dimulai. + consoleLanguageGroupBox + Bahasa Konsol:\nMenetapkan bahasa yang digunakan oleh permainan PS4.\nDisarankan untuk mengatur ini ke bahasa yang didukung oleh permainan, yang dapat bervariasi berdasarkan wilayah. - discordRPCCheckbox - Aktifkan Discord Rich Presence:\nMenampilkan ikon emulator dan informasi relevan di profil Discord Anda. + emulatorLanguageGroupBox + Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. - userName - Nama Pengguna:\nMenetapkan nama pengguna akun PS4, yang mungkin ditampilkan oleh beberapa permainan. + fullscreenCheckBox + Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Jenis Log:\nMenetapkan apakah untuk menyinkronkan output jendela log untuk kinerja. Dapat memiliki efek buruk pada emulasi. + showSplashCheckBox + Tampilkan Layar Pembuka:\nMenampilkan layar pembuka permainan (gambar khusus) saat permainan dimulai. - logFilter - Filter Log:\nMenyaring log untuk hanya mencetak informasi tertentu.\nContoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya. + discordRPCCheckbox + Aktifkan Discord Rich Presence:\nMenampilkan ikon emulator dan informasi relevan di profil Discord Anda. - updaterGroupBox - Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. + userName + Nama Pengguna:\nMenetapkan nama pengguna akun PS4, yang mungkin ditampilkan oleh beberapa permainan. - GUIMusicGroupBox - Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Jenis Log:\nMenetapkan apakah untuk menyinkronkan output jendela log untuk kinerja. Dapat memiliki efek buruk pada emulasi. - hideCursorGroupBox - Sembunyikan Kursor:\nPilih kapan kursor akan menghilang:\nTidak Pernah: Anda akan selalu melihat mouse.\nTidak Aktif: Tetapkan waktu untuk menghilang setelah tidak aktif.\nSelalu: Anda tidak akan pernah melihat mouse. + logFilter + Filter Log:\nMenyaring log untuk hanya mencetak informasi tertentu.\nContoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya. - idleTimeoutGroupBox - Tetapkan waktu untuk mouse menghilang setelah tidak aktif. + updaterGroupBox + Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. - backButtonBehaviorGroupBox - Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Sembunyikan Kursor:\nPilih kapan kursor akan menghilang:\nTidak Pernah: Anda akan selalu melihat mouse.\nTidak Aktif: Tetapkan waktu untuk menghilang setelah tidak aktif.\nSelalu: Anda tidak akan pernah melihat mouse. - Never - Tidak Pernah + idleTimeoutGroupBox + Tetapkan waktu untuk mouse menghilang setelah tidak aktif. - Idle - Diam + backButtonBehaviorGroupBox + Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4. - Always - Selalu + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Touchpad Kiri + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Touchpad Kanan + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Pusat Touchpad + Never + Tidak Pernah - None - Tidak Ada + Idle + Diam - graphicsAdapterGroupBox - Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih "Auto Select" untuk menentukan secara otomatis. + Always + Selalu - resolutionLayout - Lebar/Tinggi:\nMenetapkan ukuran jendela emulator saat diluncurkan, yang dapat diubah ukurannya selama permainan.\nIni berbeda dari resolusi dalam permainan. + Touchpad Left + Touchpad Kiri - heightDivider - Pembagi Vblank:\nKecepatan bingkai di mana emulator menyegarkan dikalikan dengan angka ini. Mengubah ini dapat memiliki efek buruk, seperti meningkatkan kecepatan permainan, atau merusak fungsi kritis permainan yang tidak mengharapkan ini berubah! + Touchpad Right + Touchpad Kanan - dumpShadersCheckBox - Aktifkan Pembuangan Shader:\nUntuk tujuan debugging teknis, menyimpan shader permainan ke folder saat mereka dirender. + Touchpad Center + Pusat Touchpad - nullGpuCheckBox - Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis. + None + Tidak Ada - gameFoldersBox - Folder Permainan:\nDaftar folder untuk memeriksa permainan yang diinstal. + graphicsAdapterGroupBox + Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih "Auto Select" untuk menentukan secara otomatis. - addFolderButton - Tambah:\nTambahkan folder ke daftar. + resolutionLayout + Lebar/Tinggi:\nMenetapkan ukuran jendela emulator saat diluncurkan, yang dapat diubah ukurannya selama permainan.\nIni berbeda dari resolusi dalam permainan. - removeFolderButton - Hapus:\nHapus folder dari daftar. + heightDivider + Pembagi Vblank:\nKecepatan bingkai di mana emulator menyegarkan dikalikan dengan angka ini. Mengubah ini dapat memiliki efek buruk, seperti meningkatkan kecepatan permainan, atau merusak fungsi kritis permainan yang tidak mengharapkan ini berubah! - debugDump - Aktifkan Pembuangan Debug:\nMenyimpan simbol impor dan ekspor serta informasi header file dari program PS4 yang sedang berjalan ke direktori. + dumpShadersCheckBox + Aktifkan Pembuangan Shader:\nUntuk tujuan debugging teknis, menyimpan shader permainan ke folder saat mereka dirender. - vkValidationCheckBox - Aktifkan Vulkan Validation Layers:\nMengaktifkan sistem yang memvalidasi status penggambaran Vulkan dan mencatat informasi tentang status internalnya. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. + nullGpuCheckBox + Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis. - vkSyncValidationCheckBox - Aktifkan Vulkan Synchronization Validation:\nMengaktifkan sistem yang memvalidasi waktu tugas penggambaran Vulkan. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. + gameFoldersBox + Folder Permainan:\nDaftar folder untuk memeriksa permainan yang diinstal. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Tambah:\nTambahkan folder ke daftar. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Hapus:\nHapus folder dari daftar. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Aktifkan Pembuangan Debug:\nMenyimpan simbol impor dan ekspor serta informasi header file dari program PS4 yang sedang berjalan ke direktori. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Aktifkan Vulkan Validation Layers:\nMengaktifkan sistem yang memvalidasi status penggambaran Vulkan dan mencatat informasi tentang status internalnya. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Aktifkan Vulkan Synchronization Validation:\nMengaktifkan sistem yang memvalidasi waktu tugas penggambaran Vulkan. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - Borderless - + rdocCheckBox + Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 4351d1fd8..b44836810 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Riguardo shadPS4 + About shadPS4 + Riguardo shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 è un emulatore sperimentale open-source per PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 è un emulatore sperimentale open-source per PlayStation 4. - This software should not be used to play games you have not legally obtained. - Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente. + This software should not be used to play games you have not legally obtained. + Questo programma non dovrebbe essere utilizzato per riprodurre giochi che non vengono ottenuti legalmente. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patch per + Cheats / Patches for + Cheats / Patch per - defaultTextEdit_MSG - I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Nessuna immagine disponibile + No Image Available + Nessuna immagine disponibile - Serial: - Seriale: + Serial: + Seriale: - Version: - Versione: + Version: + Versione: - Size: - Dimensione: + Size: + Dimensione: - Select Cheat File: - Seleziona File Trucchi: + Select Cheat File: + Seleziona File Trucchi: - Repository: - Archivio: + Repository: + Archivio: - Download Cheats - Scarica trucchi + Download Cheats + Scarica trucchi - Delete File - Cancella File + Delete File + Cancella File - No files selected. - Nessun file selezionato. + No files selected. + Nessun file selezionato. - You can delete the cheats you don't want after downloading them. - Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. + You can delete the cheats you don't want after downloading them. + Puoi cancellare i trucchi che non vuoi utilizzare dopo averli scaricati. - Do you want to delete the selected file?\n%1 - Vuoi cancellare il file selezionato?\n%1 + Do you want to delete the selected file?\n%1 + Vuoi cancellare il file selezionato?\n%1 - Select Patch File: - Seleziona File Patch: + Select Patch File: + Seleziona File Patch: - Download Patches - Scarica Patch + Download Patches + Scarica Patch - Save - Salva + Save + Salva - Cheats - Trucchi + Cheats + Trucchi - Patches - Patch + Patches + Patch - Error - Errore + Error + Errore - No patch selected. - Nessuna patch selezionata. + No patch selected. + Nessuna patch selezionata. - Unable to open files.json for reading. - Impossibile aprire il file .json per la lettura. + Unable to open files.json for reading. + Impossibile aprire il file .json per la lettura. - No patch file found for the current serial. - Nessun file patch trovato per il seriale selezionato. + No patch file found for the current serial. + Nessun file patch trovato per il seriale selezionato. - Unable to open the file for reading. - Impossibile aprire il file per la lettura. + Unable to open the file for reading. + Impossibile aprire il file per la lettura. - Unable to open the file for writing. - Impossibile aprire il file per la scrittura. + Unable to open the file for writing. + Impossibile aprire il file per la scrittura. - Failed to parse XML: - Analisi XML fallita: + Failed to parse XML: + Analisi XML fallita: - Success - Successo + Success + Successo - Options saved successfully. - Opzioni salvate con successo. + Options saved successfully. + Opzioni salvate con successo. - Invalid Source - Fonte non valida + Invalid Source + Fonte non valida - The selected source is invalid. - La fonte selezionata non è valida. + The selected source is invalid. + La fonte selezionata non è valida. - File Exists - Il file è presente + File Exists + Il file è presente - File already exists. Do you want to replace it? - Il file è già presente. Vuoi sostituirlo? + File already exists. Do you want to replace it? + Il file è già presente. Vuoi sostituirlo? - Failed to save file: - Salvataggio file fallito: + Failed to save file: + Salvataggio file fallito: - Failed to download file: - Scaricamento file fallito: + Failed to download file: + Scaricamento file fallito: - Cheats Not Found - Trucchi non trovati + Cheats Not Found + Trucchi non trovati - CheatsNotFound_MSG - Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. + CheatsNotFound_MSG + Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. - Cheats Downloaded Successfully - Trucchi scaricati con successo! + Cheats Downloaded Successfully + Trucchi scaricati con successo! - CheatsDownloadedSuccessfully_MSG - Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. + CheatsDownloadedSuccessfully_MSG + Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. - Failed to save: - Salvataggio fallito: + Failed to save: + Salvataggio fallito: - Failed to download: - Impossibile scaricare: + Failed to download: + Impossibile scaricare: - Download Complete - Scaricamento completo + Download Complete + Scaricamento completo - DownloadComplete_MSG - Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. + DownloadComplete_MSG + Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. - Failed to parse JSON data from HTML. - Impossibile analizzare i dati JSON dall'HTML. + Failed to parse JSON data from HTML. + Impossibile analizzare i dati JSON dall'HTML. - Failed to retrieve HTML page. - Impossibile recuperare la pagina HTML. + Failed to retrieve HTML page. + Impossibile recuperare la pagina HTML. - The game is in version: %1 - Il gioco è nella versione: %1 + The game is in version: %1 + Il gioco è nella versione: %1 - The downloaded patch only works on version: %1 - La patch scaricata funziona solo sulla versione: %1 + The downloaded patch only works on version: %1 + La patch scaricata funziona solo sulla versione: %1 - You may need to update your game. - Potresti aver bisogno di aggiornare il tuo gioco. + You may need to update your game. + Potresti aver bisogno di aggiornare il tuo gioco. - Incompatibility Notice - Avviso di incompatibilità + Incompatibility Notice + Avviso di incompatibilità - Failed to open file: - Impossibile aprire file: + Failed to open file: + Impossibile aprire file: - XML ERROR: - ERRORE XML: + XML ERROR: + ERRORE XML: - Failed to open files.json for writing - Impossibile aprire i file .json per la scrittura + Failed to open files.json for writing + Impossibile aprire i file .json per la scrittura - Author: - Autore: + Author: + Autore: - Directory does not exist: - La cartella non esiste: + Directory does not exist: + La cartella non esiste: - Failed to open files.json for reading. - Impossibile aprire i file .json per la lettura. + Failed to open files.json for reading. + Impossibile aprire i file .json per la lettura. - Name: - Nome: + Name: + Nome: - Can't apply cheats before the game is started - Non è possibile applicare i trucchi prima dell'inizio del gioco. + Can't apply cheats before the game is started + Non è possibile applicare i trucchi prima dell'inizio del gioco. - Close - Chiudi + Close + Chiudi - - + + CheckUpdate - Auto Updater - Aggiornamento automatico + Auto Updater + Aggiornamento automatico - Error - Errore + Error + Errore - Network error: - Errore di rete: + Network error: + Errore di rete: - Error_Github_limit_MSG - L'Aggiornamento Automatico consente fino a 60 controlli di aggiornamento all'ora.\nHai raggiunto questo limite. Riprova più tardi. + Error_Github_limit_MSG + L'Aggiornamento Automatico consente fino a 60 controlli di aggiornamento all'ora.\nHai raggiunto questo limite. Riprova più tardi. - Failed to parse update information. - Impossibile analizzare le informazioni di aggiornamento. + Failed to parse update information. + Impossibile analizzare le informazioni di aggiornamento. - No pre-releases found. - Nessuna anteprima trovata. + No pre-releases found. + Nessuna anteprima trovata. - Invalid release data. - Dati della release non validi. + Invalid release data. + Dati della release non validi. - No download URL found for the specified asset. - Nessun URL di download trovato per l'asset specificato. + No download URL found for the specified asset. + Nessun URL di download trovato per l'asset specificato. - Your version is already up to date! - La tua versione è già aggiornata! + Your version is already up to date! + La tua versione è già aggiornata! - Update Available - Aggiornamento disponibile + Update Available + Aggiornamento disponibile - Update Channel - Canale di Aggiornamento + Update Channel + Canale di Aggiornamento - Current Version - Versione attuale + Current Version + Versione attuale - Latest Version - Ultima versione + Latest Version + Ultima versione - Do you want to update? - Vuoi aggiornare? + Do you want to update? + Vuoi aggiornare? - Show Changelog - Mostra il Changelog + Show Changelog + Mostra il Changelog - Check for Updates at Startup - Controlla aggiornamenti all’avvio + Check for Updates at Startup + Controlla aggiornamenti all’avvio - Update - Aggiorna + Update + Aggiorna - No - No + No + No - Hide Changelog - Nascondi il Changelog + Hide Changelog + Nascondi il Changelog - Changes - Modifiche + Changes + Modifiche - Network error occurred while trying to access the URL - Si è verificato un errore di rete durante il tentativo di accesso all'URL + Network error occurred while trying to access the URL + Si è verificato un errore di rete durante il tentativo di accesso all'URL - Download Complete - Download completato + Download Complete + Download completato - The update has been downloaded, press OK to install. - L'aggiornamento è stato scaricato, premi OK per installare. + The update has been downloaded, press OK to install. + L'aggiornamento è stato scaricato, premi OK per installare. - Failed to save the update file at - Impossibile salvare il file di aggiornamento in + Failed to save the update file at + Impossibile salvare il file di aggiornamento in - Starting Update... - Inizio aggiornamento... + Starting Update... + Inizio aggiornamento... - Failed to create the update script file - Impossibile creare il file di script di aggiornamento + Failed to create the update script file + Impossibile creare il file di script di aggiornamento - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Recuperando dati di compatibilità, per favore attendere + Fetching compatibility data, please wait + Recuperando dati di compatibilità, per favore attendere - Cancel - Annulla + Cancel + Annulla - Loading... - Caricamento... + Loading... + Caricamento... - Error - Errore + Error + Errore - Unable to update compatibility data! Try again later. - Impossibile aggiornare i dati di compatibilità! Riprova più tardi. + Unable to update compatibility data! Try again later. + Impossibile aggiornare i dati di compatibilità! Riprova più tardi. - Unable to open compatibility_data.json for writing. - Impossibile aprire compatibility_data.json per la scrittura. + Unable to open compatibility_data.json for writing. + Impossibile aprire compatibility_data.json per la scrittura. - Unknown - Sconosciuto + Unknown + Sconosciuto - Nothing - Niente + Nothing + Niente - Boots - Si Avvia + Boots + Si Avvia - Menus - Menu + Menus + Menu - Ingame - In gioco + Ingame + In gioco - Playable - Giocabile + Playable + Giocabile - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Apri Cartella + Open Folder + Apri Cartella - - + + GameInfoClass - Loading game list, please wait :3 - Caricamento lista giochi, attendere :3 + Loading game list, please wait :3 + Caricamento lista giochi, attendere :3 - Cancel - Annulla + Cancel + Annulla - Loading... - Caricamento... + Loading... + Caricamento... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Scegli cartella + shadPS4 - Choose directory + shadPS4 - Scegli cartella - Directory to install games - Cartella di installazione dei giochi + Directory to install games + Cartella di installazione dei giochi - Browse - Sfoglia + Browse + Sfoglia - Error - Errore + Error + Errore - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Icona + Icon + Icona - Name - Nome + Name + Nome - Serial - Seriale + Serial + Seriale - Compatibility - Compatibilità + Compatibility + Compatibilità - Region - Regione + Region + Regione - Firmware - Firmware + Firmware + Firmware - Size - Dimensione + Size + Dimensione - Version - Versione + Version + Versione - Path - Percorso + Path + Percorso - Play Time - Tempo di Gioco + Play Time + Tempo di Gioco - Never Played - Mai Giocato + Never Played + Mai Giocato - h - o + h + o - m - m + m + m - s - s + s + s - Compatibility is untested - Nessuna informazione sulla compatibilità + Compatibility is untested + Nessuna informazione sulla compatibilità - Game does not initialize properly / crashes the emulator - Il gioco non si avvia in modo corretto / forza chiusura dell'emulatore + Game does not initialize properly / crashes the emulator + Il gioco non si avvia in modo corretto / forza chiusura dell'emulatore - Game boots, but only displays a blank screen - Il gioco si avvia, ma mostra solo una schermata nera + Game boots, but only displays a blank screen + Il gioco si avvia, ma mostra solo una schermata nera - Game displays an image but does not go past the menu - Il gioco mostra immagini ma non va oltre il menu + Game displays an image but does not go past the menu + Il gioco mostra immagini ma non va oltre il menu - Game has game-breaking glitches or unplayable performance - Il gioco ha problemi gravi di emulazione oppure framerate troppo basso + Game has game-breaking glitches or unplayable performance + Il gioco ha problemi gravi di emulazione oppure framerate troppo basso - Game can be completed with playable performance and no major glitches - Il gioco può essere completato con buone prestazioni e senza problemi gravi + Game can be completed with playable performance and no major glitches + Il gioco può essere completato con buone prestazioni e senza problemi gravi - Click to see details on github - Fai clic per vedere i dettagli su GitHub + Click to see details on github + Fai clic per vedere i dettagli su GitHub - Last updated - Ultimo aggiornamento + Last updated + Ultimo aggiornamento - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Crea scorciatoia + Create Shortcut + Crea scorciatoia - Cheats / Patches - Trucchi / Patch + Cheats / Patches + Trucchi / Patch - SFO Viewer - Visualizzatore SFO + SFO Viewer + Visualizzatore SFO - Trophy Viewer - Visualizzatore Trofei + Trophy Viewer + Visualizzatore Trofei - Open Folder... - Apri Cartella... + Open Folder... + Apri Cartella... - Open Game Folder - Apri Cartella del Gioco + Open Game Folder + Apri Cartella del Gioco - Open Save Data Folder - Apri Cartella dei Dati di Salvataggio + Open Save Data Folder + Apri Cartella dei Dati di Salvataggio - Open Log Folder - Apri Cartella dei Log + Open Log Folder + Apri Cartella dei Log - Copy info... - Copia informazioni... + Copy info... + Copia informazioni... - Copy Name - Copia Nome + Copy Name + Copia Nome - Copy Serial - Copia Seriale + Copy Serial + Copia Seriale - Copy All - Copia Tutto + Copy Version + Copy Version - Delete... - Elimina... + Copy Size + Copy Size - Delete Game - Elimina Gioco + Copy All + Copia Tutto - Delete Update - Elimina Aggiornamento + Delete... + Elimina... - Delete DLC - Elimina DLC + Delete Game + Elimina Gioco - Compatibility... - Compatibilità... + Delete Update + Elimina Aggiornamento - Update database - Aggiorna database + Delete DLC + Elimina DLC - View report - Visualizza rapporto + Compatibility... + Compatibilità... - Submit a report - Invia rapporto + Update database + Aggiorna database - Shortcut creation - Creazione scorciatoia + View report + Visualizza rapporto - Shortcut created successfully! - Scorciatoia creata con successo! + Submit a report + Invia rapporto - Error - Errore + Shortcut creation + Creazione scorciatoia - Error creating shortcut! - Errore nella creazione della scorciatoia! + Shortcut created successfully! + Scorciatoia creata con successo! - Install PKG - Installa PKG + Error + Errore - Game - Gioco + Error creating shortcut! + Errore nella creazione della scorciatoia! - This game has no update to delete! - Questo gioco non ha alcun aggiornamento da eliminare! + Install PKG + Installa PKG - Update - Aggiornamento + Game + Gioco - This game has no DLC to delete! - Questo gioco non ha alcun DLC da eliminare! + This game has no update to delete! + Questo gioco non ha alcun aggiornamento da eliminare! - DLC - DLC + Update + Aggiornamento - Delete %1 - Elimina %1 + This game has no DLC to delete! + Questo gioco non ha alcun DLC da eliminare! - Are you sure you want to delete %1's %2 directory? - Sei sicuro di eliminale la cartella %2 di %1? + DLC + DLC - Open Update Folder - + Delete %1 + Elimina %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Sei sicuro di eliminale la cartella %2 di %1? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Scegli cartella + shadPS4 - Choose directory + shadPS4 - Scegli cartella - Select which directory you want to install to. - Seleziona in quale cartella vuoi effettuare l'installazione. + Select which directory you want to install to. + Seleziona in quale cartella vuoi effettuare l'installazione. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Apri/Aggiungi cartella Elf + Open/Add Elf Folder + Apri/Aggiungi cartella Elf - Install Packages (PKG) - Installa Pacchetti (PKG) + Install Packages (PKG) + Installa Pacchetti (PKG) - Boot Game - Avvia Gioco + Boot Game + Avvia Gioco - Check for Updates - Controlla aggiornamenti + Check for Updates + Controlla aggiornamenti - About shadPS4 - Riguardo a shadPS4 + About shadPS4 + Riguardo a shadPS4 - Configure... - Configura... + Configure... + Configura... - Install application from a .pkg file - Installa applicazione da un file .pkg + Install application from a .pkg file + Installa applicazione da un file .pkg - Recent Games - Giochi Recenti + Recent Games + Giochi Recenti - Open shadPS4 Folder - Apri Cartella shadps4 + Open shadPS4 Folder + Apri Cartella shadps4 - Exit - Uscita + Exit + Uscita - Exit shadPS4 - Esci da shadPS4 + Exit shadPS4 + Esci da shadPS4 - Exit the application. - Esci dall'applicazione. + Exit the application. + Esci dall'applicazione. - Show Game List - Mostra Lista Giochi + Show Game List + Mostra Lista Giochi - Game List Refresh - Aggiorna Lista Giochi + Game List Refresh + Aggiorna Lista Giochi - Tiny - Minuscolo + Tiny + Minuscolo - Small - Piccolo + Small + Piccolo - Medium - Medio + Medium + Medio - Large - Grande + Large + Grande - List View - Visualizzazione Lista + List View + Visualizzazione Lista - Grid View - Visualizzazione Griglia + Grid View + Visualizzazione Griglia - Elf Viewer - Visualizzatore Elf + Elf Viewer + Visualizzatore Elf - Game Install Directory - Cartella Installazione Giochi + Game Install Directory + Cartella Installazione Giochi - Download Cheats/Patches - Scarica Trucchi/Patch + Download Cheats/Patches + Scarica Trucchi/Patch - Dump Game List - Scarica Lista Giochi + Dump Game List + Scarica Lista Giochi - PKG Viewer - Visualizzatore PKG + PKG Viewer + Visualizzatore PKG - Search... - Cerca... + Search... + Cerca... - File - File + File + File - View - Visualizza + View + Visualizza - Game List Icons - Icone Lista Giochi + Game List Icons + Icone Lista Giochi - Game List Mode - Modalità Lista Giochi + Game List Mode + Modalità Lista Giochi - Settings - Impostazioni + Settings + Impostazioni - Utils - Utilità + Utils + Utilità - Themes - Temi + Themes + Temi - Help - Aiuto + Help + Aiuto - Dark - Scuro + Dark + Scuro - Light - Chiaro + Light + Chiaro - Green - Verde + Green + Verde - Blue - Blu + Blue + Blu - Violet - Viola + Violet + Viola - toolBar - Barra strumenti + toolBar + Barra strumenti - Game List - Elenco giochi + Game List + Elenco giochi - * Unsupported Vulkan Version - * Versione Vulkan non supportata + * Unsupported Vulkan Version + * Versione Vulkan non supportata - Download Cheats For All Installed Games - Scarica Trucchi per tutti i giochi installati + Download Cheats For All Installed Games + Scarica Trucchi per tutti i giochi installati - Download Patches For All Games - Scarica Patch per tutti i giochi + Download Patches For All Games + Scarica Patch per tutti i giochi - Download Complete - Download completato + Download Complete + Download completato - You have downloaded cheats for all the games you have installed. - Hai scaricato trucchi per tutti i giochi installati. + You have downloaded cheats for all the games you have installed. + Hai scaricato trucchi per tutti i giochi installati. - Patches Downloaded Successfully! - Patch scaricate con successo! + Patches Downloaded Successfully! + Patch scaricate con successo! - All Patches available for all games have been downloaded. - Tutte le patch disponibili per tutti i giochi sono state scaricate. + All Patches available for all games have been downloaded. + Tutte le patch disponibili per tutti i giochi sono state scaricate. - Games: - Giochi: + Games: + Giochi: - ELF files (*.bin *.elf *.oelf) - File ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + File ELF (*.bin *.elf *.oelf) - Game Boot - Avvia Gioco + Game Boot + Avvia Gioco - Only one file can be selected! - Si può selezionare solo un file! + Only one file can be selected! + Si può selezionare solo un file! - PKG Extraction - Estrazione file PKG + PKG Extraction + Estrazione file PKG - Patch detected! - Patch rilevata! + Patch detected! + Patch rilevata! - PKG and Game versions match: - Le versioni di PKG e del Gioco corrispondono: + PKG and Game versions match: + Le versioni di PKG e del Gioco corrispondono: - Would you like to overwrite? - Vuoi sovrascrivere? + Would you like to overwrite? + Vuoi sovrascrivere? - PKG Version %1 is older than installed version: - La versione PKG %1 è più vecchia rispetto alla versione installata: + PKG Version %1 is older than installed version: + La versione PKG %1 è più vecchia rispetto alla versione installata: - Game is installed: - Gioco installato: + Game is installed: + Gioco installato: - Would you like to install Patch: - Vuoi installare la patch: + Would you like to install Patch: + Vuoi installare la patch: - DLC Installation - Installazione DLC + DLC Installation + Installazione DLC - Would you like to install DLC: %1? - Vuoi installare il DLC: %1? + Would you like to install DLC: %1? + Vuoi installare il DLC: %1? - DLC already installed: - DLC già installato: + DLC already installed: + DLC già installato: - Game already installed - Gioco già installato + Game already installed + Gioco già installato - PKG ERROR - ERRORE PKG + PKG ERROR + ERRORE PKG - Extracting PKG %1/%2 - Estrazione file PKG %1/%2 + Extracting PKG %1/%2 + Estrazione file PKG %1/%2 - Extraction Finished - Estrazione Completata + Extraction Finished + Estrazione Completata - Game successfully installed at %1 - Gioco installato correttamente in %1 + Game successfully installed at %1 + Gioco installato correttamente in %1 - File doesn't appear to be a valid PKG file - Il file sembra non essere un file PKG valido + File doesn't appear to be a valid PKG file + Il file sembra non essere un file PKG valido - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Apri Cartella + Open Folder + Apri Cartella - Name - Nome + PKG ERROR + ERRORE PKG - Serial - Seriale + Name + Nome - Installed - + Serial + Seriale - Size - Dimensione + Installed + Installed - Category - + Size + Dimensione - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Regione + FW + FW - Flags - + Region + Regione - Path - Percorso + Flags + Flags - File - File + Path + Percorso - PKG ERROR - ERRORE PKG + File + File - Unknown - Sconosciuto + Unknown + Sconosciuto - Package - + Package + Package - - + + SettingsDialog - Settings - Impostazioni + Settings + Impostazioni - General - Generale + General + Generale - System - Sistema + System + Sistema - Console Language - Lingua della console + Console Language + Lingua della console - Emulator Language - Lingua dell'emulatore + Emulator Language + Lingua dell'emulatore - Emulator - Emulatore + Emulator + Emulatore - Enable Fullscreen - Abilita Schermo Intero + Enable Fullscreen + Abilita Schermo Intero - Fullscreen Mode - Modalità Schermo Intero + Fullscreen Mode + Modalità Schermo Intero - Enable Separate Update Folder - Abilita Cartella Aggiornamenti Separata + Enable Separate Update Folder + Abilita Cartella Aggiornamenti Separata - Default tab when opening settings - Scheda predefinita all'apertura delle impostazioni + Default tab when opening settings + Scheda predefinita all'apertura delle impostazioni - Show Game Size In List - Mostra la dimensione del gioco nell'elenco + Show Game Size In List + Mostra la dimensione del gioco nell'elenco - Show Splash - Mostra Schermata Iniziale + Show Splash + Mostra Schermata Iniziale - Enable Discord Rich Presence - Abilita Discord Rich Presence + Enable Discord Rich Presence + Abilita Discord Rich Presence - Username - Nome Utente + Username + Nome Utente - Trophy Key - Chiave Trofei + Trophy Key + Chiave Trofei - Trophy - Trofei + Trophy + Trofei - Logger - Logger + Logger + Logger - Log Type - Tipo di Log + Log Type + Tipo di Log - Log Filter - Filtro Log + Log Filter + Filtro Log - Open Log Location - Apri posizione del registro + Open Log Location + Apri posizione del registro - Input - Input + Input + Input - Cursor - Cursore + Cursor + Cursore - Hide Cursor - Nascondi Cursore + Hide Cursor + Nascondi Cursore - Hide Cursor Idle Timeout - Timeout inattività per nascondere il cursore + Hide Cursor Idle Timeout + Timeout inattività per nascondere il cursore - s - s + s + s - Controller - Controller + Controller + Controller - Back Button Behavior - Comportamento del pulsante Indietro + Back Button Behavior + Comportamento del pulsante Indietro - Graphics - Grafica + Graphics + Grafica - GUI - Interfaccia + GUI + Interfaccia - User - Utente + User + Utente - Graphics Device - Scheda Grafica + Graphics Device + Scheda Grafica - Width - Larghezza + Width + Larghezza - Height - Altezza + Height + Altezza - Vblank Divider - Divisore Vblank + Vblank Divider + Divisore Vblank - Advanced - Avanzate + Advanced + Avanzate - Enable Shaders Dumping - Abilita Dump Shader + Enable Shaders Dumping + Abilita Dump Shader - Enable NULL GPU - Abilita NULL GPU + Enable NULL GPU + Abilita NULL GPU - Paths - Percorsi + Enable HDR + Enable HDR - Game Folders - Cartelle di gioco + Paths + Percorsi - Add... - Aggiungi... + Game Folders + Cartelle di gioco - Remove - Rimuovi + Add... + Aggiungi... - Debug - Debug + Remove + Rimuovi - Enable Vulkan Validation Layers - Abilita Vulkan Validation Layers + Debug + Debug - Enable Vulkan Synchronization Validation - Abilita Vulkan Synchronization Validation + Enable Debug Dumping + Enable Debug Dumping - Enable RenderDoc Debugging - Abilita RenderDoc Debugging + Enable Vulkan Validation Layers + Abilita Vulkan Validation Layers - Enable Crash Diagnostics - Abilita Diagnostica Crash + Enable Vulkan Synchronization Validation + Abilita Vulkan Synchronization Validation - Collect Shaders - Raccogli Shaders + Enable RenderDoc Debugging + Abilita RenderDoc Debugging - Copy GPU Buffers - Copia Buffer GPU + Enable Crash Diagnostics + Abilita Diagnostica Crash - Host Debug Markers - Marcatori di Debug dell'Host + Collect Shaders + Raccogli Shaders - Guest Debug Markers - Marcatori di Debug del Guest + Copy GPU Buffers + Copia Buffer GPU - Update - Aggiornamento + Host Debug Markers + Marcatori di Debug dell'Host - Check for Updates at Startup - Verifica aggiornamenti all’avvio + Guest Debug Markers + Marcatori di Debug del Guest - Always Show Changelog - Mostra sempre il changelog + Update + Aggiornamento - Update Channel - Canale di Aggiornamento + Check for Updates at Startup + Verifica aggiornamenti all’avvio - Check for Updates - Controlla aggiornamenti + Always Show Changelog + Mostra sempre il changelog - GUI Settings - Impostazioni GUI + Update Channel + Canale di Aggiornamento - Title Music - Musica del Titolo + Check for Updates + Controlla aggiornamenti - Disable Trophy Pop-ups - Disabilita Notifica Trofei + GUI Settings + Impostazioni GUI - Play title music - Riproduci musica del titolo + Title Music + Musica del Titolo - Update Compatibility Database On Startup - Aggiorna Database Compatibilità all'Avvio + Disable Trophy Pop-ups + Disabilita Notifica Trofei - Game Compatibility - Compatibilità Gioco + Background Image + Background Image - Display Compatibility Data - Mostra Dati Compatibilità + Show Background Image + Show Background Image - Update Compatibility Database - Aggiorna Database Compatibilità + Opacity + Opacity - Volume - Volume + Play title music + Riproduci musica del titolo - Save - Salva + Update Compatibility Database On Startup + Aggiorna Database Compatibilità all'Avvio - Apply - Applica + Game Compatibility + Compatibilità Gioco - Restore Defaults - Ripristina Impostazioni Predefinite + Display Compatibility Data + Mostra Dati Compatibilità - Close - Chiudi + Update Compatibility Database + Aggiorna Database Compatibilità - Point your mouse at an option to display its description. - Sposta il mouse su un'opzione per visualizzarne la descrizione. + Volume + Volume - consoleLanguageGroupBox - Lingua della Console:\nImposta la lingua utilizzata dal gioco PS4.\nÈ consigliabile impostare questa su una lingua supportata dal gioco, che può variare a seconda della regione. + Save + Salva - emulatorLanguageGroupBox - Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. + Apply + Applica - fullscreenCheckBox - Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. + Restore Defaults + Ripristina Impostazioni Predefinite - separateUpdatesCheckBox - Abilita Cartella Aggiornamenti Separata:\nAbilita l'installazione degli aggiornamenti in una cartella separata per una più facile gestione. + Close + Chiudi - showSplashCheckBox - Mostra Schermata di Avvio:\nMostra la schermata di avvio del gioco (un'immagine speciale) mentre il gioco si sta avviando. + Point your mouse at an option to display its description. + Sposta il mouse su un'opzione per visualizzarne la descrizione. - discordRPCCheckbox - Abilita Discord Rich Presence:\nMostra l'icona dell'emulatore e informazioni pertinenti sul tuo profilo Discord. + consoleLanguageGroupBox + Lingua della Console:\nImposta la lingua utilizzata dal gioco PS4.\nÈ consigliabile impostare questa su una lingua supportata dal gioco, che può variare a seconda della regione. - userName - Nome Utente:\nImposta il nome utente dell'account PS4, che potrebbe essere visualizzato da alcuni giochi. + emulatorLanguageGroupBox + Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. - TrophyKey - Chiave Trofei:\nChiave utilizzata per la decrittazione dei trofei. Deve essere estratta dalla vostra console con jailbreak.\nDeve contenere solo caratteri esadecimali. + fullscreenCheckBox + Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. - logTypeGroupBox - Tipo di Log:\nImposta se sincronizzare l'output della finestra di log per le prestazioni. Potrebbe avere effetti avversi sull'emulazione. + separateUpdatesCheckBox + Abilita Cartella Aggiornamenti Separata:\nAbilita l'installazione degli aggiornamenti in una cartella separata per una più facile gestione. - logFilter - Filtro Log:\nFiltra il log per stampare solo informazioni specifiche.\nEsempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo. + showSplashCheckBox + Mostra Schermata di Avvio:\nMostra la schermata di avvio del gioco (un'immagine speciale) mentre il gioco si sta avviando. - updaterGroupBox - Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. + discordRPCCheckbox + Abilita Discord Rich Presence:\nMostra l'icona dell'emulatore e informazioni pertinenti sul tuo profilo Discord. - GUIMusicGroupBox - Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. + userName + Nome Utente:\nImposta il nome utente dell'account PS4, che potrebbe essere visualizzato da alcuni giochi. - disableTrophycheckBox - Disabilita Notifica Trofei:\nDisabilita notifiche in gioco dei trofei. Il progresso dei Trofei può ancora essere controllato con il Visualizzatore Trofei (clicca tasto destro sul gioco nella finestra principale). + TrophyKey + Chiave Trofei:\nChiave utilizzata per la decrittazione dei trofei. Deve essere estratta dalla vostra console con jailbreak.\nDeve contenere solo caratteri esadecimali. - hideCursorGroupBox - Nascondi cursore:\nScegli quando il cursore scomparirà:\nMai: Vedrai sempre il mouse.\nInattivo: Imposta un tempo per farlo scomparire dopo essere stato inattivo.\nSempre: non vedrai mai il mouse. + logTypeGroupBox + Tipo di Log:\nImposta se sincronizzare l'output della finestra di log per le prestazioni. Potrebbe avere effetti avversi sull'emulazione. - idleTimeoutGroupBox - Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo. + logFilter + Filtro Log:\nFiltra il log per stampare solo informazioni specifiche.\nEsempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo. - backButtonBehaviorGroupBox - Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4. + updaterGroupBox + Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. - enableCompatibilityCheckBox - Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita "Aggiorna Compatiblità all'Avvio" per ottenere informazioni aggiornate. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - checkCompatibilityOnStartupCheckBox - Aggiorna Compatibilità all'Avvio:\nAggiorna automaticamente il database della compatibilità quando si avvia shadps4. + GUIMusicGroupBox + Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. - updateCompatibilityButton - Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. + disableTrophycheckBox + Disabilita Notifica Trofei:\nDisabilita notifiche in gioco dei trofei. Il progresso dei Trofei può ancora essere controllato con il Visualizzatore Trofei (clicca tasto destro sul gioco nella finestra principale). - Never - Mai + hideCursorGroupBox + Nascondi cursore:\nScegli quando il cursore scomparirà:\nMai: Vedrai sempre il mouse.\nInattivo: Imposta un tempo per farlo scomparire dopo essere stato inattivo.\nSempre: non vedrai mai il mouse. - Idle - Inattivo + idleTimeoutGroupBox + Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo. - Always - Sempre + backButtonBehaviorGroupBox + Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4. - Touchpad Left - Touchpad Sinistra + enableCompatibilityCheckBox + Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita "Aggiorna Compatiblità all'Avvio" per ottenere informazioni aggiornate. - Touchpad Right - Touchpad Destra + checkCompatibilityOnStartupCheckBox + Aggiorna Compatibilità all'Avvio:\nAggiorna automaticamente il database della compatibilità quando si avvia shadps4. - Touchpad Center - Centro del Touchpad + updateCompatibilityButton + Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. - None - Nessuno + Never + Mai - graphicsAdapterGroupBox - Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. + Idle + Inattivo - resolutionLayout - Larghezza/Altezza:\nImposta la dimensione della finestra dell'emulatore all'avvio, che può essere ridimensionata durante il gioco.\nQuesto è diverso dalla risoluzione in gioco. + Always + Sempre - heightDivider - Divisore Vblank:\nIl frame rate con cui l'emulatore si aggiorna viene moltiplicato per questo numero. Cambiare questo potrebbe avere effetti avversi, come aumentare la velocità del gioco o rompere funzionalità critiche del gioco che non si aspettano questa modifica! + Touchpad Left + Touchpad Sinistra - dumpShadersCheckBox - Abilita Pompaggio Shader:\nPer scopi di debug tecnico, salva gli shader dei giochi in una cartella mentre vengono resi. + Touchpad Right + Touchpad Destra - nullGpuCheckBox - Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica. + Touchpad Center + Centro del Touchpad - gameFoldersBox - Cartelle di Gioco:\nL'elenco delle cartelle da controllare per i giochi installati. + None + Nessuno - addFolderButton - Aggiungi:\nAggiungi una cartella all'elenco. + graphicsAdapterGroupBox + Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. - removeFolderButton - Rimuovi:\nRimuovi una cartella dall'elenco. + resolutionLayout + Larghezza/Altezza:\nImposta la dimensione della finestra dell'emulatore all'avvio, che può essere ridimensionata durante il gioco.\nQuesto è diverso dalla risoluzione in gioco. - debugDump - Abilita Pompaggio di Debug:\nSalva i simboli di importazione ed esportazione e le informazioni sull'intestazione del file del programma PS4 attualmente in esecuzione in una directory. + heightDivider + Divisore Vblank:\nIl frame rate con cui l'emulatore si aggiorna viene moltiplicato per questo numero. Cambiare questo potrebbe avere effetti avversi, come aumentare la velocità del gioco o rompere funzionalità critiche del gioco che non si aspettano questa modifica! - vkValidationCheckBox - Abilita Strati di Validazione Vulkan:\nAbilita un sistema che convalida lo stato del renderer Vulkan e registra informazioni sul suo stato interno. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. + dumpShadersCheckBox + Abilita Pompaggio Shader:\nPer scopi di debug tecnico, salva gli shader dei giochi in una cartella mentre vengono resi. - vkSyncValidationCheckBox - Abilita Validazione della Sincronizzazione Vulkan:\nAbilita un sistema che convalida il timing delle attività di rendering Vulkan. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. + nullGpuCheckBox + Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica. - rdocCheckBox - Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. + enableHDRCheckBox + enableHDRCheckBox - collectShaderCheckBox - Raccogli Shader:\nBisogna attivare questa opzione per poter modificare gli shader nel menu di debug (Ctrl + F10). + gameFoldersBox + Cartelle di Gioco:\nL'elenco delle cartelle da controllare per i giochi installati. - crashDiagnosticsCheckBox - Diagnostica Crash:\nCrea un file .yaml che contiene informazioni riguardo lo stato del renderer Vulkan nel momento in cui si verifica un crash.\nUtile per poter effettuare il debug degli errori di tipo "Device Lost". Se hai questa opzione attiva dovresti abilitare anche Marcatori di Debug Host e Guest.\nNon è funzionante su GPU Intel.\nVulkan Validation Layers deve essere abilitato e bisogna aver installato l'SDK Vulkan per poter utilizzare questa funzione. + addFolderButton + Aggiungi:\nAggiungi una cartella all'elenco. - copyGPUBuffersCheckBox - Copia Buffer GPU:\nCerca di aggirare le race conditions che riguardano gli invii alla GPU.\nPotrebbe aiutare ad evitare crash che riguardano i PM4 di tipo 0. + removeFolderButton + Rimuovi:\nRimuovi una cartella dall'elenco. - hostMarkersCheckBox - Marcatori di Debug dell'Host:\nInserisce nel log informazioni ottenute dall'emulatore come ad esempio marcatori per comandi specifici AMDGPU quando si hanno comandi Vulkan e associa nomi di debug per le risorse.\nSe hai questa opzione abilitata dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. + debugDump + Abilita Pompaggio di Debug:\nSalva i simboli di importazione ed esportazione e le informazioni sull'intestazione del file del programma PS4 attualmente in esecuzione in una directory. - guestMarkersCheckBox - Marcatori di Debug del Guest:\nInserisce nel log marcatori di debug che il gioco stesso ha aggiunto al buffer dei comandi.\nSe hai abilitato questa opzione dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. + vkValidationCheckBox + Abilita Strati di Validazione Vulkan:\nAbilita un sistema che convalida lo stato del renderer Vulkan e registra informazioni sul suo stato interno. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - Borderless - + vkSyncValidationCheckBox + Abilita Validazione della Sincronizzazione Vulkan:\nAbilita un sistema che convalida il timing delle attività di rendering Vulkan. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - True - + rdocCheckBox + Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. - Enable HDR - + collectShaderCheckBox + Raccogli Shader:\nBisogna attivare questa opzione per poter modificare gli shader nel menu di debug (Ctrl + F10). - Release - + crashDiagnosticsCheckBox + Diagnostica Crash:\nCrea un file .yaml che contiene informazioni riguardo lo stato del renderer Vulkan nel momento in cui si verifica un crash.\nUtile per poter effettuare il debug degli errori di tipo "Device Lost". Se hai questa opzione attiva dovresti abilitare anche Marcatori di Debug Host e Guest.\nNon è funzionante su GPU Intel.\nVulkan Validation Layers deve essere abilitato e bisogna aver installato l'SDK Vulkan per poter utilizzare questa funzione. - Nightly - + copyGPUBuffersCheckBox + Copia Buffer GPU:\nCerca di aggirare le race conditions che riguardano gli invii alla GPU.\nPotrebbe aiutare ad evitare crash che riguardano i PM4 di tipo 0. - Background Image - + hostMarkersCheckBox + Marcatori di Debug dell'Host:\nInserisce nel log informazioni ottenute dall'emulatore come ad esempio marcatori per comandi specifici AMDGPU quando si hanno comandi Vulkan e associa nomi di debug per le risorse.\nSe hai questa opzione abilitata dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. - Show Background Image - + guestMarkersCheckBox + Marcatori di Debug del Guest:\nInserisce nel log marcatori di debug che il gioco stesso ha aggiunto al buffer dei comandi.\nSe hai abilitato questa opzione dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. - Opacity - + saveDataBox + saveDataBox - Set the volume of the background music. - + browseButton + browseButton - Enable Motion Controls - + Borderless + Borderless - Save Data Path - + True + True - Browse - Sfoglia + Release + Release - Enable Debug Dumping - + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Cartella di installazione dei giochi + Browse + Sfoglia - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Cartella di installazione dei giochi - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Visualizzatore Trofei + Trophy Viewer + Visualizzatore Trofei - + diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 73c9d736c..2c666d688 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - shadPS4について + About shadPS4 + shadPS4について - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 - This software should not be used to play games you have not legally obtained. - 非正規、非合法のゲームをプレイするためにこのソフトウェアを使用しないでください。 + This software should not be used to play games you have not legally obtained. + 非正規、非合法のゲームをプレイするためにこのソフトウェアを使用しないでください。 - - + + CheatsPatches - Cheats / Patches for - のチート/パッチ + Cheats / Patches for + のチート/パッチ - defaultTextEdit_MSG - チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチは開発を行っていないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 + defaultTextEdit_MSG + チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチは開発を行っていないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 - No Image Available - 画像は利用できません + No Image Available + 画像は利用できません - Serial: - シリアル: + Serial: + シリアル: - Version: - バージョン: + Version: + バージョン: - Size: - サイズ: + Size: + サイズ: - Select Cheat File: - チートファイルを選択: + Select Cheat File: + チートファイルを選択: - Repository: - リポジトリ: + Repository: + リポジトリ: - Download Cheats - チートをダウンロード + Download Cheats + チートをダウンロード - Delete File - ファイルを削除 + Delete File + ファイルを削除 - No files selected. - ファイルが選択されていません。 + No files selected. + ファイルが選択されていません。 - You can delete the cheats you don't want after downloading them. - ダウンロード後に不要なチートを削除できます。 + You can delete the cheats you don't want after downloading them. + ダウンロード後に不要なチートを削除できます。 - Do you want to delete the selected file?\n%1 - 選択したファイルを削除しますか?\n%1 + Do you want to delete the selected file?\n%1 + 選択したファイルを削除しますか?\n%1 - Select Patch File: - パッチファイルを選択: + Select Patch File: + パッチファイルを選択: - Download Patches - パッチをダウンロード + Download Patches + パッチをダウンロード - Save - 保存 + Save + 保存 - Cheats - チート + Cheats + チート - Patches - パッチ + Patches + パッチ - Error - エラー + Error + エラー - No patch selected. - パッチが選択されていません。 + No patch selected. + パッチが選択されていません。 - Unable to open files.json for reading. - files.jsonを読み取りのために開く事が出来ませんでした。 + Unable to open files.json for reading. + files.jsonを読み取りのために開く事が出来ませんでした。 - No patch file found for the current serial. - 現在のシリアルに対するパッチファイルが見つかりません。 + No patch file found for the current serial. + 現在のシリアルに対するパッチファイルが見つかりません。 - Unable to open the file for reading. - ファイルを読み取りのために開く事が出来ませんでした。 + Unable to open the file for reading. + ファイルを読み取りのために開く事が出来ませんでした。 - Unable to open the file for writing. - ファイルをを書き込みのために開く事が出来ませんでした。 + Unable to open the file for writing. + ファイルをを書き込みのために開く事が出来ませんでした。 - Failed to parse XML: - XMLの解析に失敗しました: + Failed to parse XML: + XMLの解析に失敗しました: - Success - 成功 + Success + 成功 - Options saved successfully. - オプションが正常に保存されました。 + Options saved successfully. + オプションが正常に保存されました。 - Invalid Source - 無効なソース + Invalid Source + 無効なソース - The selected source is invalid. - 選択されたソースは無効です。 + The selected source is invalid. + 選択されたソースは無効です。 - File Exists - ファイルが存在します + File Exists + ファイルが存在します - File already exists. Do you want to replace it? - ファイルはすでに存在します。置き換えますか? + File already exists. Do you want to replace it? + ファイルはすでに存在します。置き換えますか? - Failed to save file: - ファイルの保存に失敗しました: + Failed to save file: + ファイルの保存に失敗しました: - Failed to download file: - ファイルのダウンロードに失敗しました: + Failed to download file: + ファイルのダウンロードに失敗しました: - Cheats Not Found - チートが見つかりません + Cheats Not Found + チートが見つかりません - CheatsNotFound_MSG - このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 + CheatsNotFound_MSG + このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 - Cheats Downloaded Successfully - チートが正常にダウンロードされました + Cheats Downloaded Successfully + チートが正常にダウンロードされました - CheatsDownloadedSuccessfully_MSG - このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 + CheatsDownloadedSuccessfully_MSG + このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 - Failed to save: - 保存に失敗しました: + Failed to save: + 保存に失敗しました: - Failed to download: - ダウンロードに失敗しました: + Failed to download: + ダウンロードに失敗しました: - Download Complete - ダウンロード完了 + Download Complete + ダウンロード完了 - DownloadComplete_MSG - パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。 + DownloadComplete_MSG + パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。 - Failed to parse JSON data from HTML. - HTMLからJSONデータの解析に失敗しました。 + Failed to parse JSON data from HTML. + HTMLからJSONデータの解析に失敗しました。 - Failed to retrieve HTML page. - HTMLページの取得に失敗しました。 + Failed to retrieve HTML page. + HTMLページの取得に失敗しました。 - The game is in version: %1 - ゲームのバージョン: %1 + The game is in version: %1 + ゲームのバージョン: %1 - The downloaded patch only works on version: %1 - ダウンロードしたパッチはバージョン: %1 のみ機能します + The downloaded patch only works on version: %1 + ダウンロードしたパッチはバージョン: %1 のみ機能します - You may need to update your game. - ゲームを更新する必要があるかもしれません。 + You may need to update your game. + ゲームを更新する必要があるかもしれません。 - Incompatibility Notice - 互換性のない通知 + Incompatibility Notice + 互換性のない通知 - Failed to open file: - ファイルを開くのに失敗しました: + Failed to open file: + ファイルを開くのに失敗しました: - XML ERROR: - XMLエラー: + XML ERROR: + XMLエラー: - Failed to open files.json for writing - files.jsonを読み取りのために開く事が出来ませんでした。 + Failed to open files.json for writing + files.jsonを読み取りのために開く事が出来ませんでした。 - Author: - 著者: + Author: + 著者: - Directory does not exist: - ディレクトリが存在しません: + Directory does not exist: + ディレクトリが存在しません: - Failed to open files.json for reading. - files.jsonを読み取りのために開く事が出来ませんでした。 + Failed to open files.json for reading. + files.jsonを読み取りのために開く事が出来ませんでした。 - Name: - 名前: + Name: + 名前: - Can't apply cheats before the game is started - ゲームが開始される前にチートを適用することはできません。 + Can't apply cheats before the game is started + ゲームが開始される前にチートを適用することはできません。 - Close - 閉じる + Close + 閉じる - - + + CheckUpdate - Auto Updater - 自動アップデーター + Auto Updater + 自動アップデーター - Error - エラー + Error + エラー - Network error: - ネットワークエラー: + Network error: + ネットワークエラー: - Error_Github_limit_MSG - 自動アップデーターは1時間に最大60回の更新チェックを許可します。\nこの制限に達しました。後でもう一度お試しください。 + Error_Github_limit_MSG + 自動アップデーターは1時間に最大60回の更新チェックを許可します。\nこの制限に達しました。後でもう一度お試しください。 - Failed to parse update information. - アップデート情報の解析に失敗しました。 + Failed to parse update information. + アップデート情報の解析に失敗しました。 - No pre-releases found. - プレリリースは見つかりませんでした。 + No pre-releases found. + プレリリースは見つかりませんでした。 - Invalid release data. - リリースデータが無効です。 + Invalid release data. + リリースデータが無効です。 - No download URL found for the specified asset. - 指定されたアセットのダウンロードURLが見つかりませんでした。 + No download URL found for the specified asset. + 指定されたアセットのダウンロードURLが見つかりませんでした。 - Your version is already up to date! - あなたのバージョンはすでに最新です! + Your version is already up to date! + あなたのバージョンはすでに最新です! - Update Available - アップデートがあります + Update Available + アップデートがあります - Update Channel - アップデートチャネル + Update Channel + アップデートチャネル - Current Version - 現在のバージョン + Current Version + 現在のバージョン - Latest Version - 最新バージョン + Latest Version + 最新バージョン - Do you want to update? - アップデートしますか? + Do you want to update? + アップデートしますか? - Show Changelog - 変更ログを表示 + Show Changelog + 変更ログを表示 - Check for Updates at Startup - 起動時に更新確認 + Check for Updates at Startup + 起動時に更新確認 - Update - アップデート + Update + アップデート - No - いいえ + No + いいえ - Hide Changelog - 変更ログを隠す + Hide Changelog + 変更ログを隠す - Changes - 変更点 + Changes + 変更点 - Network error occurred while trying to access the URL - URLにアクセス中にネットワークエラーが発生しました + Network error occurred while trying to access the URL + URLにアクセス中にネットワークエラーが発生しました - Download Complete - ダウンロード完了 + Download Complete + ダウンロード完了 - The update has been downloaded, press OK to install. - アップデートがダウンロードされました。インストールするにはOKを押してください。 + The update has been downloaded, press OK to install. + アップデートがダウンロードされました。インストールするにはOKを押してください。 - Failed to save the update file at - 更新ファイルの保存に失敗しました + Failed to save the update file at + 更新ファイルの保存に失敗しました - Starting Update... - アップデートを開始しています... + Starting Update... + アップデートを開始しています... - Failed to create the update script file - アップデートスクリプトファイルの作成に失敗しました + Failed to create the update script file + アップデートスクリプトファイルの作成に失敗しました - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - 互換性データを取得しています。少々お待ちください。 + Fetching compatibility data, please wait + 互換性データを取得しています。少々お待ちください。 - Cancel - キャンセル + Cancel + キャンセル - Loading... - 読み込み中... + Loading... + 読み込み中... - Error - エラー + Error + エラー - Unable to update compatibility data! Try again later. - 互換性データを更新できませんでした!後で再試行してください。 + Unable to update compatibility data! Try again later. + 互換性データを更新できませんでした!後で再試行してください。 - Unable to open compatibility_data.json for writing. - compatibility_data.jsonを開いて書き込むことができませんでした。 + Unable to open compatibility_data.json for writing. + compatibility_data.jsonを開いて書き込むことができませんでした。 - Unknown - 不明 + Unknown + 不明 - Nothing - 何もない + Nothing + 何もない - Boots - ブーツ + Boots + ブーツ - Menus - メニュー + Menus + メニュー - Ingame - ゲーム内 + Ingame + ゲーム内 - Playable - プレイ可能 + Playable + プレイ可能 - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - フォルダを開く + Open Folder + フォルダを開く - - + + GameInfoClass - Loading game list, please wait :3 - ゲームリストを読み込み中です。しばらくお待ちください :3 + Loading game list, please wait :3 + ゲームリストを読み込み中です。しばらくお待ちください :3 - Cancel - キャンセル + Cancel + キャンセル - Loading... - 読み込み中... + Loading... + 読み込み中... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - ディレクトリを選択 + shadPS4 - Choose directory + shadPS4 - ディレクトリを選択 - Directory to install games - ゲームをインストールするディレクトリ + Directory to install games + ゲームをインストールするディレクトリ - Browse - 参照 + Browse + 参照 - Error - エラー + Error + エラー - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - アイコン + Icon + アイコン - Name - 名前 + Name + 名前 - Serial - シリアル + Serial + シリアル - Compatibility - Compatibility + Compatibility + Compatibility - Region - 地域 + Region + 地域 - Firmware - ファームウェア + Firmware + ファームウェア - Size - サイズ + Size + サイズ - Version - バージョン + Version + バージョン - Path - パス + Path + パス - Play Time - プレイ時間 + Play Time + プレイ時間 - Never Played - 未プレイ + Never Played + 未プレイ - h - 時間 + h + 時間 - m - + m + - s - + s + - Compatibility is untested - 互換性は未検証です + Compatibility is untested + 互換性は未検証です - Game does not initialize properly / crashes the emulator - ゲームが正常に初期化されない/エミュレーターがクラッシュする + Game does not initialize properly / crashes the emulator + ゲームが正常に初期化されない/エミュレーターがクラッシュする - Game boots, but only displays a blank screen - ゲームは起動しますが、空のスクリーンが表示されます + Game boots, but only displays a blank screen + ゲームは起動しますが、空のスクリーンが表示されます - Game displays an image but does not go past the menu - 正常にゲーム画面が表示されますが、メニューから先に進むことができません + Game displays an image but does not go past the menu + 正常にゲーム画面が表示されますが、メニューから先に進むことができません - Game has game-breaking glitches or unplayable performance - ゲームを壊すような不具合や、プレイが不可能なほどのパフォーマンスの問題があります + Game has game-breaking glitches or unplayable performance + ゲームを壊すような不具合や、プレイが不可能なほどのパフォーマンスの問題があります - Game can be completed with playable performance and no major glitches - パフォーマンスに問題はなく、大きな不具合なしでゲームをプレイすることができます + Game can be completed with playable performance and no major glitches + パフォーマンスに問題はなく、大きな不具合なしでゲームをプレイすることができます - Click to see details on github - 詳細を見るにはGitHubをクリックしてください + Click to see details on github + 詳細を見るにはGitHubをクリックしてください - Last updated - 最終更新 + Last updated + 最終更新 - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - ショートカットを作成 + Create Shortcut + ショートカットを作成 - Cheats / Patches - チート / パッチ + Cheats / Patches + チート / パッチ - SFO Viewer - SFOビューワー + SFO Viewer + SFOビューワー - Trophy Viewer - トロフィービューワー + Trophy Viewer + トロフィービューワー - Open Folder... - フォルダを開く... + Open Folder... + フォルダを開く... - Open Game Folder - ゲームフォルダを開く + Open Game Folder + ゲームフォルダを開く - Open Save Data Folder - セーブデータフォルダを開く + Open Save Data Folder + セーブデータフォルダを開く - Open Log Folder - ログフォルダを開く + Open Log Folder + ログフォルダを開く - Copy info... - 情報をコピー... + Copy info... + 情報をコピー... - Copy Name - 名前をコピー + Copy Name + 名前をコピー - Copy Serial - シリアルをコピー + Copy Serial + シリアルをコピー - Copy All - すべてコピー + Copy Version + Copy Version - Delete... - 削除... + Copy Size + Copy Size - Delete Game - ゲームを削除 + Copy All + すべてコピー - Delete Update - アップデートを削除 + Delete... + 削除... - Delete DLC - DLCを削除 + Delete Game + ゲームを削除 - Compatibility... - 互換性... + Delete Update + アップデートを削除 - Update database - データベースを更新 + Delete DLC + DLCを削除 - View report - レポートを表示 + Compatibility... + 互換性... - Submit a report - レポートを送信 + Update database + データベースを更新 - Shortcut creation - ショートカットの作成 + View report + レポートを表示 - Shortcut created successfully! - ショートカットが正常に作成されました! + Submit a report + レポートを送信 - Error - エラー + Shortcut creation + ショートカットの作成 - Error creating shortcut! - ショートカットの作成に失敗しました! + Shortcut created successfully! + ショートカットが正常に作成されました! - Install PKG - PKGをインストール + Error + エラー - Game - ゲーム + Error creating shortcut! + ショートカットの作成に失敗しました! - This game has no update to delete! - このゲームにはアップデートがないため削除することができません! + Install PKG + PKGをインストール - Update - アップデート + Game + ゲーム - This game has no DLC to delete! - このゲームにはDLCがないため削除することができません! + This game has no update to delete! + このゲームにはアップデートがないため削除することができません! - DLC - DLC + Update + アップデート - Delete %1 - %1 を削除 + This game has no DLC to delete! + このゲームにはDLCがないため削除することができません! - Are you sure you want to delete %1's %2 directory? - %1 の %2 ディレクトリを本当に削除しますか? + DLC + DLC - Open Update Folder - + Delete %1 + %1 を削除 - Copy Version - + Are you sure you want to delete %1's %2 directory? + %1 の %2 ディレクトリを本当に削除しますか? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - ディレクトリを選択 + shadPS4 - Choose directory + shadPS4 - ディレクトリを選択 - Select which directory you want to install to. - インストール先のディレクトリを選択してください。 + Select which directory you want to install to. + インストール先のディレクトリを選択してください。 - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Elfフォルダを開く/追加する + Open/Add Elf Folder + Elfフォルダを開く/追加する - Install Packages (PKG) - パッケージをインストール (PKG) + Install Packages (PKG) + パッケージをインストール (PKG) - Boot Game - ゲームを起動 + Boot Game + ゲームを起動 - Check for Updates - 更新を確認する + Check for Updates + 更新を確認する - About shadPS4 - shadPS4について + About shadPS4 + shadPS4について - Configure... - 設定... + Configure... + 設定... - Install application from a .pkg file - .pkgファイルからアプリケーションをインストール + Install application from a .pkg file + .pkgファイルからアプリケーションをインストール - Recent Games - 最近プレイしたゲーム + Recent Games + 最近プレイしたゲーム - Open shadPS4 Folder - shadPS4フォルダを開く + Open shadPS4 Folder + shadPS4フォルダを開く - Exit - 終了 + Exit + 終了 - Exit shadPS4 - shadPS4を終了 + Exit shadPS4 + shadPS4を終了 - Exit the application. - アプリケーションを終了します。 + Exit the application. + アプリケーションを終了します。 - Show Game List - ゲームリストを表示 + Show Game List + ゲームリストを表示 - Game List Refresh - ゲームリストの更新 + Game List Refresh + ゲームリストの更新 - Tiny - 最小 + Tiny + 最小 - Small - + Small + - Medium - + Medium + - Large - + Large + - List View - リストビュー + List View + リストビュー - Grid View - グリッドビュー + Grid View + グリッドビュー - Elf Viewer - Elfビューアー + Elf Viewer + Elfビューアー - Game Install Directory - ゲームインストールディレクトリ + Game Install Directory + ゲームインストールディレクトリ - Download Cheats/Patches - チート / パッチをダウンロード + Download Cheats/Patches + チート / パッチをダウンロード - Dump Game List - ゲームリストをダンプ + Dump Game List + ゲームリストをダンプ - PKG Viewer - PKGビューアー + PKG Viewer + PKGビューアー - Search... - 検索... + Search... + 検索... - File - ファイル + File + ファイル - View - 表示 + View + 表示 - Game List Icons - ゲームリストアイコン + Game List Icons + ゲームリストアイコン - Game List Mode - ゲームリストモード + Game List Mode + ゲームリストモード - Settings - 設定 + Settings + 設定 - Utils - ユーティリティ + Utils + ユーティリティ - Themes - テーマ + Themes + テーマ - Help - ヘルプ + Help + ヘルプ - Dark - ダーク + Dark + ダーク - Light - ライト + Light + ライト - Green - グリーン + Green + グリーン - Blue - ブルー + Blue + ブルー - Violet - バイオレット + Violet + バイオレット - toolBar - ツールバー + toolBar + ツールバー - Game List - ゲームリスト + Game List + ゲームリスト - * Unsupported Vulkan Version - * サポートされていないVulkanバージョン + * Unsupported Vulkan Version + * サポートされていないVulkanバージョン - Download Cheats For All Installed Games - すべてのインストール済みゲームのチートをダウンロード + Download Cheats For All Installed Games + すべてのインストール済みゲームのチートをダウンロード - Download Patches For All Games - すべてのゲームのパッチをダウンロード + Download Patches For All Games + すべてのゲームのパッチをダウンロード - Download Complete - ダウンロード完了 + Download Complete + ダウンロード完了 - You have downloaded cheats for all the games you have installed. - インストールされているすべてのゲームのチートをダウンロードしました。 + You have downloaded cheats for all the games you have installed. + インストールされているすべてのゲームのチートをダウンロードしました。 - Patches Downloaded Successfully! - パッチが正常にダウンロードされました! + Patches Downloaded Successfully! + パッチが正常にダウンロードされました! - All Patches available for all games have been downloaded. - すべてのゲームに利用可能なパッチがダウンロードされました。 + All Patches available for all games have been downloaded. + すべてのゲームに利用可能なパッチがダウンロードされました。 - Games: - ゲーム: + Games: + ゲーム: - ELF files (*.bin *.elf *.oelf) - ELFファイル (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELFファイル (*.bin *.elf *.oelf) - Game Boot - ゲームブート + Game Boot + ゲームブート - Only one file can be selected! - 1つのファイルしか選択できません! + Only one file can be selected! + 1つのファイルしか選択できません! - PKG Extraction - PKGの抽出 + PKG Extraction + PKGの抽出 - Patch detected! - パッチが検出されました! + Patch detected! + パッチが検出されました! - PKG and Game versions match: - PKGとゲームのバージョンが一致しています: + PKG and Game versions match: + PKGとゲームのバージョンが一致しています: - Would you like to overwrite? - 上書きしてもよろしいですか? + Would you like to overwrite? + 上書きしてもよろしいですか? - PKG Version %1 is older than installed version: - PKGバージョン %1 はインストールされているバージョンよりも古いです: + PKG Version %1 is older than installed version: + PKGバージョン %1 はインストールされているバージョンよりも古いです: - Game is installed: - ゲームはインストール済みです: + Game is installed: + ゲームはインストール済みです: - Would you like to install Patch: - パッチをインストールしてもよろしいですか: + Would you like to install Patch: + パッチをインストールしてもよろしいですか: - DLC Installation - DLCのインストール + DLC Installation + DLCのインストール - Would you like to install DLC: %1? - DLCをインストールしてもよろしいですか: %1? + Would you like to install DLC: %1? + DLCをインストールしてもよろしいですか: %1? - DLC already installed: - DLCはすでにインストールされています: + DLC already installed: + DLCはすでにインストールされています: - Game already installed - ゲームはすでにインストールされています + Game already installed + ゲームはすでにインストールされています - PKG ERROR - PKGエラー + PKG ERROR + PKGエラー - Extracting PKG %1/%2 - PKGを抽出中 %1/%2 + Extracting PKG %1/%2 + PKGを抽出中 %1/%2 - Extraction Finished - 抽出完了 + Extraction Finished + 抽出完了 - Game successfully installed at %1 - ゲームが %1 に正常にインストールされました + Game successfully installed at %1 + ゲームが %1 に正常にインストールされました - File doesn't appear to be a valid PKG file - ファイルが有効なPKGファイルでないようです + File doesn't appear to be a valid PKG file + ファイルが有効なPKGファイルでないようです - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - フォルダーを開く + Open Folder + フォルダーを開く - Name - 名前 + PKG ERROR + PKGエラー - Serial - シリアル + Name + 名前 - Installed - + Serial + シリアル - Size - サイズ + Installed + Installed - Category - + Size + サイズ - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - 地域 + FW + FW - Flags - + Region + 地域 - Path - パス + Flags + Flags - File - ファイル + Path + パス - PKG ERROR - PKGエラー + File + ファイル - Unknown - 不明 + Unknown + 不明 - Package - + Package + Package - - + + SettingsDialog - Settings - 設定 + Settings + 設定 - General - 一般 + General + 一般 - System - システム + System + システム - Console Language - コンソールの言語 + Console Language + コンソールの言語 - Emulator Language - エミュレーターの言語 + Emulator Language + エミュレーターの言語 - Emulator - エミュレーター + Emulator + エミュレーター - Enable Fullscreen - フルスクリーンを有効にする + Enable Fullscreen + フルスクリーンを有効にする - Fullscreen Mode - 全画面モード + Fullscreen Mode + 全画面モード - Enable Separate Update Folder - アップデートフォルダの分離を有効化 + Enable Separate Update Folder + アップデートフォルダの分離を有効化 - Default tab when opening settings - 設定を開くときのデフォルトタブ + Default tab when opening settings + 設定を開くときのデフォルトタブ - Show Game Size In List - ゲームサイズをリストに表示 + Show Game Size In List + ゲームサイズをリストに表示 - Show Splash - スプラッシュ画面を表示する + Show Splash + スプラッシュ画面を表示する - Enable Discord Rich Presence - Discord Rich Presenceを有効にする + Enable Discord Rich Presence + Discord Rich Presenceを有効にする - Username - ユーザー名 + Username + ユーザー名 - Trophy Key - トロフィーキー + Trophy Key + トロフィーキー - Trophy - トロフィー + Trophy + トロフィー - Logger - ロガー + Logger + ロガー - Log Type - ログタイプ + Log Type + ログタイプ - Log Filter - ログフィルター + Log Filter + ログフィルター - Open Log Location - ログの場所を開く + Open Log Location + ログの場所を開く - Input - 入力 + Input + 入力 - Cursor - カーソル + Cursor + カーソル - Hide Cursor - カーソルを隠す + Hide Cursor + カーソルを隠す - Hide Cursor Idle Timeout - カーソルを隠すまでの非アクティブ期間 + Hide Cursor Idle Timeout + カーソルを隠すまでの非アクティブ期間 - s - s + s + s - Controller - コントローラー + Controller + コントローラー - Back Button Behavior - 戻るボタンの動作 + Back Button Behavior + 戻るボタンの動作 - Graphics - グラフィックス + Graphics + グラフィックス - GUI - インターフェース + GUI + インターフェース - User - ユーザー + User + ユーザー - Graphics Device - グラフィックスデバイス + Graphics Device + グラフィックスデバイス - Width - + Width + - Height - 高さ + Height + 高さ - Vblank Divider - Vblankディバイダー + Vblank Divider + Vblankディバイダー - Advanced - 高度な設定 + Advanced + 高度な設定 - Enable Shaders Dumping - シェーダーのダンプを有効にする + Enable Shaders Dumping + シェーダーのダンプを有効にする - Enable NULL GPU - NULL GPUを有効にする + Enable NULL GPU + NULL GPUを有効にする - Paths - パス + Enable HDR + Enable HDR - Game Folders - ゲームフォルダ + Paths + パス - Add... - 追加... + Game Folders + ゲームフォルダ - Remove - 削除 + Add... + 追加... - Debug - デバッグ + Remove + 削除 - Enable Debug Dumping - デバッグダンプを有効にする + Debug + デバッグ - Enable Vulkan Validation Layers - Vulkan検証レイヤーを有効にする + Enable Debug Dumping + デバッグダンプを有効にする - Enable Vulkan Synchronization Validation - Vulkan同期検証を有効にする + Enable Vulkan Validation Layers + Vulkan検証レイヤーを有効にする - Enable RenderDoc Debugging - RenderDocデバッグを有効にする + Enable Vulkan Synchronization Validation + Vulkan同期検証を有効にする - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + RenderDocデバッグを有効にする - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - 更新 + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - 起動時に更新確認 + Update + 更新 - Always Show Changelog - 常に変更履歴を表示 + Check for Updates at Startup + 起動時に更新確認 - Update Channel - アップデートチャネル + Always Show Changelog + 常に変更履歴を表示 - Check for Updates - 更新を確認 + Update Channel + アップデートチャネル - GUI Settings - GUI設定 + Check for Updates + 更新を確認 - Title Music - Title Music + GUI Settings + GUI設定 - Disable Trophy Pop-ups - トロフィーのポップアップを無効化 + Title Music + Title Music - Play title music - タイトル音楽を再生する + Disable Trophy Pop-ups + トロフィーのポップアップを無効化 - Update Compatibility Database On Startup - 起動時に互換性データベースを更新する + Background Image + Background Image - Game Compatibility - ゲームの互換性 + Show Background Image + Show Background Image - Display Compatibility Data - 互換性に関するデータを表示 + Opacity + Opacity - Update Compatibility Database - 互換性データベースを更新 + Play title music + タイトル音楽を再生する - Volume - 音量 + Update Compatibility Database On Startup + 起動時に互換性データベースを更新する - Save - 保存 + Game Compatibility + ゲームの互換性 - Apply - 適用 + Display Compatibility Data + 互換性に関するデータを表示 - Restore Defaults - デフォルトに戻す + Update Compatibility Database + 互換性データベースを更新 - Close - 閉じる + Volume + 音量 - Point your mouse at an option to display its description. - 設定項目にマウスをホバーすると、説明が表示されます。 + Save + 保存 - consoleLanguageGroupBox - コンソールの言語:\nPS4ゲームが使用する言語を設定します。\nゲームでサポートされている言語に設定することをお勧めしますが、地域によって異なる場合があります。 + Apply + 適用 - emulatorLanguageGroupBox - エミュレーターの言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 + Restore Defaults + デフォルトに戻す - fullscreenCheckBox - 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 + Close + 閉じる - separateUpdatesCheckBox - Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで、管理が容易になります。 + Point your mouse at an option to display its description. + 設定項目にマウスをホバーすると、説明が表示されます。 - showSplashCheckBox - スプラッシュスクリーンを表示:\nゲーム起動中にゲームのスプラッシュスクリーン(特別な画像)を表示します。 + consoleLanguageGroupBox + コンソールの言語:\nPS4ゲームが使用する言語を設定します。\nゲームでサポートされている言語に設定することをお勧めしますが、地域によって異なる場合があります。 - discordRPCCheckbox - Discord Rich Presenceを有効にする:\nエミュレーターのアイコンと関連情報をDiscordプロフィールに表示します。 + emulatorLanguageGroupBox + エミュレーターの言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 - userName - ユーザー名:\nPS4のアカウントユーザー名を設定します。これは、一部のゲームで表示される場合があります。 + fullscreenCheckBox + 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 - TrophyKey - トロフィーキー:\nトロフィーの復号に使用されるキーです。脱獄済みのコンソールから取得することができます。\n16進数のみを受け入れます。 + separateUpdatesCheckBox + Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで、管理が容易になります。 - logTypeGroupBox - ログタイプ:\nパフォーマンスのためにログウィンドウの出力を同期させるかどうかを設定します。エミュレーションに悪影響を及ぼす可能性があります。 + showSplashCheckBox + スプラッシュスクリーンを表示:\nゲーム起動中にゲームのスプラッシュスクリーン(特別な画像)を表示します。 - logFilter - ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" \nレベル: Trace, Debug, Info, Warning, Error, Critical - レベルはこの並び通りに処理され、指定されたレベルより前のレベル ログを抑制し、それ以外のすべてのレベルをログに記録します。 + discordRPCCheckbox + Discord Rich Presenceを有効にする:\nエミュレーターのアイコンと関連情報をDiscordプロフィールに表示します。 - updaterGroupBox - 更新:\nRelease: 最新の機能を利用できない可能性がありますが、より信頼性が高くテストされた公式バージョンが毎月リリースされます。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 + userName + ユーザー名:\nPS4のアカウントユーザー名を設定します。これは、一部のゲームで表示される場合があります。 - GUIMusicGroupBox - タイトルミュージックを再生:\nゲームでサポートされている場合に、GUIでゲームを選択したときに特別な音楽を再生する機能を有効にします。 + TrophyKey + トロフィーキー:\nトロフィーの復号に使用されるキーです。脱獄済みのコンソールから取得することができます。\n16進数のみを受け入れます。 - disableTrophycheckBox - トロフィーのポップアップを無効化:\nゲーム内でのトロフィー通知を無効化します。 トロフィーの進行状況は、トロフィービューアーを使用して確認できます。(メインウィンドウでゲームを右クリック) + logTypeGroupBox + ログタイプ:\nパフォーマンスのためにログウィンドウの出力を同期させるかどうかを設定します。エミュレーションに悪影響を及ぼす可能性があります。 - hideCursorGroupBox - カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n無効: 常にカーソルが表示されます。\n非アクティブ時: カーソルの非アクティブ期間が指定した時間を超えた場合にカーソルを隠します。\n常に: カーソルは常に隠れた状態になります。 + logFilter + ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" \nレベル: Trace, Debug, Info, Warning, Error, Critical - レベルはこの並び通りに処理され、指定されたレベルより前のレベル ログを抑制し、それ以外のすべてのレベルをログに記録します。 - idleTimeoutGroupBox - カーソルが非アクティブになってから隠すまでの時間を設定します。 + updaterGroupBox + 更新:\nRelease: 最新の機能を利用できない可能性がありますが、より信頼性が高くテストされた公式バージョンが毎月リリースされます。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 - backButtonBehaviorGroupBox - 戻るボタンの動作:\nコントローラーの戻るボタンを、PS4のタッチパッドの指定された位置をタッチするように設定します。 + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - 互換性に関するデータを表示:\nゲームの互換性に関する情報を表として表示します。常に最新情報を取得したい場合、"起動時に互換性データベースを更新する" を有効化してください。 + GUIMusicGroupBox + タイトルミュージックを再生:\nゲームでサポートされている場合に、GUIでゲームを選択したときに特別な音楽を再生する機能を有効にします。 - checkCompatibilityOnStartupCheckBox - 起動時に互換性データベースを更新する:\nshadPS4の起動時に自動で互換性データベースを更新します。 + disableTrophycheckBox + トロフィーのポップアップを無効化:\nゲーム内でのトロフィー通知を無効化します。 トロフィーの進行状況は、トロフィービューアーを使用して確認できます。(メインウィンドウでゲームを右クリック) - updateCompatibilityButton - 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 + hideCursorGroupBox + カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n無効: 常にカーソルが表示されます。\n非アクティブ時: カーソルの非アクティブ期間が指定した時間を超えた場合にカーソルを隠します。\n常に: カーソルは常に隠れた状態になります。 - Never - 無効 + idleTimeoutGroupBox + カーソルが非アクティブになってから隠すまでの時間を設定します。 - Idle - 非アクティブ時 + backButtonBehaviorGroupBox + 戻るボタンの動作:\nコントローラーの戻るボタンを、PS4のタッチパッドの指定された位置をタッチするように設定します。 - Always - 常に + enableCompatibilityCheckBox + 互換性に関するデータを表示:\nゲームの互換性に関する情報を表として表示します。常に最新情報を取得したい場合、"起動時に互換性データベースを更新する" を有効化してください。 - Touchpad Left - 左タッチパッド + checkCompatibilityOnStartupCheckBox + 起動時に互換性データベースを更新する:\nshadPS4の起動時に自動で互換性データベースを更新します。 - Touchpad Right - 右タッチパッド + updateCompatibilityButton + 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 - Touchpad Center - タッチパッド中央 + Never + 無効 - None - なし + Idle + 非アクティブ時 - graphicsAdapterGroupBox - グラフィックデバイス:\nシステムに複数のGPUが搭載されている場合、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 + Always + 常に - resolutionLayout - 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中でもサイズを変更することができます。\nこれはゲーム内の解像度とは異なります。 + Touchpad Left + 左タッチパッド - heightDivider - Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! + Touchpad Right + 右タッチパッド - dumpShadersCheckBox - シェーダーダンプを有効にする:\n技術的なデバッグの目的で、レンダリング中にゲームのシェーダーをフォルダーに保存します。 + Touchpad Center + タッチパッド中央 - nullGpuCheckBox - Null GPUを有効にする:\n技術的なデバッグの目的で、グラフィックスカードがないかのようにゲームのレンダリングを無効にします。 + None + なし - gameFoldersBox - ゲームフォルダ:\nインストールされたゲームを確認するためのフォルダのリスト。 + graphicsAdapterGroupBox + グラフィックデバイス:\nシステムに複数のGPUが搭載されている場合、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 - addFolderButton - 追加:\nリストにフォルダを追加します。 + resolutionLayout + 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中でもサイズを変更することができます。\nこれはゲーム内の解像度とは異なります。 - removeFolderButton - 削除:\nリストからフォルダを削除します。 + heightDivider + Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! - debugDump - デバッグダンプを有効にする:\n現在実行中のPS4プログラムのインポートおよびエクスポートシンボルとファイルヘッダー情報をディレクトリに保存します。 + dumpShadersCheckBox + シェーダーダンプを有効にする:\n技術的なデバッグの目的で、レンダリング中にゲームのシェーダーをフォルダーに保存します。 - vkValidationCheckBox - Vulkanバリデーションレイヤーを有効にする:\nVulkanのレンダリングステータスを検証し、内部状態に関する情報をログに記録するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 + nullGpuCheckBox + Null GPUを有効にする:\n技術的なデバッグの目的で、グラフィックスカードがないかのようにゲームのレンダリングを無効にします。 - vkSyncValidationCheckBox - Vulkan同期バリデーションを有効にする:\nVulkanのレンダリングタスクのタイミングを検証するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 + gameFoldersBox + ゲームフォルダ:\nインストールされたゲームを確認するためのフォルダのリスト。 - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + 追加:\nリストにフォルダを追加します。 - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + 削除:\nリストからフォルダを削除します。 - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + デバッグダンプを有効にする:\n現在実行中のPS4プログラムのインポートおよびエクスポートシンボルとファイルヘッダー情報をディレクトリに保存します。 - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Vulkanバリデーションレイヤーを有効にする:\nVulkanのレンダリングステータスを検証し、内部状態に関する情報をログに記録するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Vulkan同期バリデーションを有効にする:\nVulkanのレンダリングタスクのタイミングを検証するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - Borderless - + rdocCheckBox + RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - 参照 + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - ゲームをインストールするディレクトリ + Browse + 参照 - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + ゲームをインストールするディレクトリ - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - トロフィービューアー + Trophy Viewer + トロフィービューアー - + diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index d7122dbd6..f598896a4 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - No Image Available + No Image Available + No Image Available - Serial: - Serial: + Serial: + Serial: - Version: - Version: + Version: + Version: - Size: - Size: + Size: + Size: - Select Cheat File: - Select Cheat File: + Select Cheat File: + Select Cheat File: - Repository: - Repository: + Repository: + Repository: - Download Cheats - Download Cheats + Download Cheats + Download Cheats - Delete File - Delete File + Delete File + Delete File - No files selected. - No files selected. + No files selected. + No files selected. - You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. - Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 - Select Patch File: - Select Patch File: + Select Patch File: + Select Patch File: - Download Patches - Download Patches + Download Patches + Download Patches - Save - Save + Save + Save - Cheats - Cheats + Cheats + Cheats - Patches - Patches + Patches + Patches - Error - Error + Error + Error - No patch selected. - No patch selected. + No patch selected. + No patch selected. - Unable to open files.json for reading. - Unable to open files.json for reading. + Unable to open files.json for reading. + Unable to open files.json for reading. - No patch file found for the current serial. - No patch file found for the current serial. + No patch file found for the current serial. + No patch file found for the current serial. - Unable to open the file for reading. - Unable to open the file for reading. + Unable to open the file for reading. + Unable to open the file for reading. - Unable to open the file for writing. - Unable to open the file for writing. + Unable to open the file for writing. + Unable to open the file for writing. - Failed to parse XML: - Failed to parse XML: + Failed to parse XML: + Failed to parse XML: - Success - Success + Success + Success - Options saved successfully. - Options saved successfully. + Options saved successfully. + Options saved successfully. - Invalid Source - Invalid Source + Invalid Source + Invalid Source - The selected source is invalid. - The selected source is invalid. + The selected source is invalid. + The selected source is invalid. - File Exists - File Exists + File Exists + File Exists - File already exists. Do you want to replace it? - File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? - Failed to save file: - Failed to save file: + Failed to save file: + Failed to save file: - Failed to download file: - Failed to download file: + Failed to download file: + Failed to download file: - Cheats Not Found - Cheats Not Found + Cheats Not Found + Cheats Not Found - CheatsNotFound_MSG - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - Cheats Downloaded Successfully - Cheats Downloaded Successfully + Cheats Downloaded Successfully + Cheats Downloaded Successfully - CheatsDownloadedSuccessfully_MSG - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - Failed to save: - Failed to save: + Failed to save: + Failed to save: - Failed to download: - Failed to download: + Failed to download: + Failed to download: - Download Complete - Download Complete + Download Complete + Download Complete - DownloadComplete_MSG - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. - Failed to retrieve HTML page. - Failed to retrieve HTML page. + Failed to retrieve HTML page. + Failed to retrieve HTML page. - The game is in version: %1 - The game is in version: %1 + The game is in version: %1 + The game is in version: %1 - The downloaded patch only works on version: %1 - The downloaded patch only works on version: %1 + The downloaded patch only works on version: %1 + The downloaded patch only works on version: %1 - You may need to update your game. - You may need to update your game. + You may need to update your game. + You may need to update your game. - Incompatibility Notice - Incompatibility Notice + Incompatibility Notice + Incompatibility Notice - Failed to open file: - Failed to open file: + Failed to open file: + Failed to open file: - XML ERROR: - XML ERROR: + XML ERROR: + XML ERROR: - Failed to open files.json for writing - Failed to open files.json for writing + Failed to open files.json for writing + Failed to open files.json for writing - Author: - Author: + Author: + Author: - Directory does not exist: - Directory does not exist: + Directory does not exist: + Directory does not exist: - Failed to open files.json for reading. - Failed to open files.json for reading. + Failed to open files.json for reading. + Failed to open files.json for reading. - Name: - Name: + Name: + Name: - Can't apply cheats before the game is started - Can't apply cheats before the game is started. + Can't apply cheats before the game is started + Can't apply cheats before the game is started. - Close - Close + Close + Close - - + + CheckUpdate - Auto Updater - Auto Updater + Auto Updater + Auto Updater - Error - Error + Error + Error - Network error: - Network error: + Network error: + Network error: - Error_Github_limit_MSG - 자동 업데이트는 시간당 최대 60회의 업데이트 확인을 허용합니다.\n이 제한에 도달했습니다. 나중에 다시 시도해 주세요. + Error_Github_limit_MSG + 자동 업데이트는 시간당 최대 60회의 업데이트 확인을 허용합니다.\n이 제한에 도달했습니다. 나중에 다시 시도해 주세요. - Failed to parse update information. - Failed to parse update information. + Failed to parse update information. + Failed to parse update information. - No pre-releases found. - No pre-releases found. + No pre-releases found. + No pre-releases found. - Invalid release data. - Invalid release data. + Invalid release data. + Invalid release data. - No download URL found for the specified asset. - No download URL found for the specified asset. + No download URL found for the specified asset. + No download URL found for the specified asset. - Your version is already up to date! - Your version is already up to date! + Your version is already up to date! + Your version is already up to date! - Update Available - Update Available + Update Available + Update Available - Update Channel - Update Channel + Update Channel + Update Channel - Current Version - Current Version + Current Version + Current Version - Latest Version - Latest Version + Latest Version + Latest Version - Do you want to update? - Do you want to update? + Do you want to update? + Do you want to update? - Show Changelog - Show Changelog + Show Changelog + Show Changelog - Check for Updates at Startup - Check for Updates at Startup + Check for Updates at Startup + Check for Updates at Startup - Update - Update + Update + Update - No - No + No + No - Hide Changelog - Hide Changelog + Hide Changelog + Hide Changelog - Changes - Changes + Changes + Changes - Network error occurred while trying to access the URL - Network error occurred while trying to access the URL + Network error occurred while trying to access the URL + Network error occurred while trying to access the URL - Download Complete - Download Complete + Download Complete + Download Complete - The update has been downloaded, press OK to install. - The update has been downloaded, press OK to install. + The update has been downloaded, press OK to install. + The update has been downloaded, press OK to install. - Failed to save the update file at - Failed to save the update file at + Failed to save the update file at + Failed to save the update file at - Starting Update... - Starting Update... + Starting Update... + Starting Update... - Failed to create the update script file - Failed to create the update script file + Failed to create the update script file + Failed to create the update script file - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - 호환성 데이터를 가져오는 중, 잠시만 기다려 주세요 + Fetching compatibility data, please wait + 호환성 데이터를 가져오는 중, 잠시만 기다려 주세요 - Cancel - 취소 + Cancel + 취소 - Loading... - 로딩 중... + Loading... + 로딩 중... - Error - 오류 + Error + 오류 - Unable to update compatibility data! Try again later. - 호환성 데이터를 업데이트할 수 없습니다! 나중에 다시 시도해 주세요. + Unable to update compatibility data! Try again later. + 호환성 데이터를 업데이트할 수 없습니다! 나중에 다시 시도해 주세요. - Unable to open compatibility_data.json for writing. - compatibility_data.json을 열어 쓸 수 없습니다. + Unable to open compatibility_data.json for writing. + compatibility_data.json을 열어 쓸 수 없습니다. - Unknown - 알 수 없음 + Unknown + 알 수 없음 - Nothing - 없음 + Nothing + 없음 - Boots - 부츠 + Boots + 부츠 - Menus - 메뉴 + Menus + 메뉴 - Ingame - 게임 내 + Ingame + 게임 내 - Playable - 플레이 가능 + Playable + 플레이 가능 - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Icon + Icon + Icon - Name - Name + Name + Name - Serial - Serial + Serial + Serial - Compatibility - Compatibility + Compatibility + Compatibility - Region - Region + Region + Region - Firmware - Firmware + Firmware + Firmware - Size - Size + Size + Size - Version - Version + Version + Version - Path - Path + Path + Path - Play Time - Play Time + Play Time + Play Time - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - GitHub에서 세부 정보를 보려면 클릭하세요 + Click to see details on github + GitHub에서 세부 정보를 보려면 클릭하세요 - Last updated - 마지막 업데이트 + Last updated + 마지막 업데이트 - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - Cheats / Patches - 치트 / 패치 + Cheats / Patches + 치트 / 패치 - SFO Viewer - SFO Viewer + SFO Viewer + SFO Viewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - Open Folder... - Open Folder... + Open Folder... + Open Folder... - Open Game Folder - Open Game Folder + Open Game Folder + Open Game Folder - Open Save Data Folder - Open Save Data Folder + Open Save Data Folder + Open Save Data Folder - Open Log Folder - Open Log Folder + Open Log Folder + Open Log Folder - Copy info... - Copy info... + Copy info... + Copy info... - Copy Name - Copy Name + Copy Name + Copy Name - Copy Serial - Copy Serial + Copy Serial + Copy Serial - Copy All - Copy All + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copy All - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Shortcut creation + View report + View report - Shortcut created successfully! - Shortcut created successfully! + Submit a report + Submit a report - Error - Error + Shortcut creation + Shortcut creation - Error creating shortcut! - Error creating shortcut! + Shortcut created successfully! + Shortcut created successfully! - Install PKG - Install PKG + Error + Error - Game - Game + Error creating shortcut! + Error creating shortcut! - This game has no update to delete! - This game has no update to delete! + Install PKG + Install PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Check for Updates + Check for Updates + Check for Updates - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - 치트 / 패치 다운로드 + Download Cheats/Patches + 치트 / 패치 다운로드 - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Help + Help + Help - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Game List + Game List + Game List - * Unsupported Vulkan Version - * Unsupported Vulkan Version + * Unsupported Vulkan Version + * Unsupported Vulkan Version - Download Cheats For All Installed Games - Download Cheats For All Installed Games + Download Cheats For All Installed Games + Download Cheats For All Installed Games - Download Patches For All Games - Download Patches For All Games + Download Patches For All Games + Download Patches For All Games - Download Complete - Download Complete + Download Complete + Download Complete - You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. - Patches Downloaded Successfully! - Patches Downloaded Successfully! + Patches Downloaded Successfully! + Patches Downloaded Successfully! - All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. - Games: - Games: + Games: + Games: - ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) - Game Boot - Game Boot + Game Boot + Game Boot - Only one file can be selected! - Only one file can be selected! + Only one file can be selected! + Only one file can be selected! - PKG Extraction - PKG Extraction + PKG Extraction + PKG Extraction - Patch detected! - Patch detected! + Patch detected! + Patch detected! - PKG and Game versions match: - PKG and Game versions match: + PKG and Game versions match: + PKG and Game versions match: - Would you like to overwrite? - Would you like to overwrite? + Would you like to overwrite? + Would you like to overwrite? - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: - Game is installed: - Game is installed: + Game is installed: + Game is installed: - Would you like to install Patch: - Would you like to install Patch: + Would you like to install Patch: + Would you like to install Patch: - DLC Installation - DLC Installation + DLC Installation + DLC Installation - Would you like to install DLC: %1? - Would you like to install DLC: %1? + Would you like to install DLC: %1? + Would you like to install DLC: %1? - DLC already installed: - DLC already installed: + DLC already installed: + DLC already installed: - Game already installed - Game already installed + Game already installed + Game already installed - PKG ERROR - PKG ERROR + PKG ERROR + PKG ERROR - Extracting PKG %1/%2 - Extracting PKG %1/%2 + Extracting PKG %1/%2 + Extracting PKG %1/%2 - Extraction Finished - Extraction Finished + Extraction Finished + Extraction Finished - Game successfully installed at %1 - Game successfully installed at %1 + Game successfully installed at %1 + Game successfully installed at %1 - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Name + PKG ERROR + PKG ERROR - Serial - Serial + Name + Name - Installed - + Serial + Serial - Size - Size + Installed + Installed - Category - + Size + Size - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Region + FW + FW - Flags - + Region + Region - Path - Path + Flags + Flags - File - File + Path + Path - PKG ERROR - PKG ERROR + File + File - Unknown - 알 수 없음 + Unknown + 알 수 없음 - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - 전체 화면 모드 + Fullscreen Mode + 전체 화면 모드 - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - 설정 열기 시 기본 탭 + Default tab when opening settings + 설정 열기 시 기본 탭 - Show Game Size In List - 게임 크기를 목록에 표시 + Show Game Size In List + 게임 크기를 목록에 표시 - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Enable Discord Rich Presence + Enable Discord Rich Presence + Enable Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - 로그 위치 열기 + Open Log Location + 로그 위치 열기 - Input - Input + Input + Input - Cursor - Cursor + Cursor + Cursor - Hide Cursor - Hide Cursor + Hide Cursor + Hide Cursor - Hide Cursor Idle Timeout - Hide Cursor Idle Timeout + Hide Cursor Idle Timeout + Hide Cursor Idle Timeout - s - s + s + s - Controller - Controller + Controller + Controller - Back Button Behavior - Back Button Behavior + Back Button Behavior + Back Button Behavior - Graphics - Graphics + Graphics + Graphics - GUI - 인터페이스 + GUI + 인터페이스 - User - 사용자 + User + 사용자 - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Paths + Enable HDR + Enable HDR - Game Folders - Game Folders + Paths + Paths - Add... - Add... + Game Folders + Game Folders - Remove - Remove + Add... + Add... - Debug - Debug + Remove + Remove - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Update + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Check for Updates at Startup + Update + Update - Always Show Changelog - 항상 변경 사항 표시 + Check for Updates at Startup + Check for Updates at Startup - Update Channel - Update Channel + Always Show Changelog + 항상 변경 사항 표시 - Check for Updates - Check for Updates + Update Channel + Update Channel - GUI Settings - GUI Settings + Check for Updates + Check for Updates - Title Music - Title Music + GUI Settings + GUI Settings - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Play title music + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Play title music - Volume - 음량 + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Save + Game Compatibility + Game Compatibility - Apply - Apply + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Restore Defaults + Update Compatibility Database + Update Compatibility Database - Close - Close + Volume + 음량 - Point your mouse at an option to display its description. - Point your mouse at an option to display its description. + Save + Save - consoleLanguageGroupBox - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + Apply + Apply - emulatorLanguageGroupBox - Emulator Language:\nSets the language of the emulator's user interface. + Restore Defaults + Restore Defaults - fullscreenCheckBox - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + Close + Close - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Point your mouse at an option to display its description. - showSplashCheckBox - Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - discordRPCCheckbox - Discord Rich Presence 활성화:\nDiscord 프로필에 에뮬레이터 아이콘과 관련 정보를 표시합니다. + emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. - userName - Username:\nSets the PS4's account username, which may be displayed by some games. + fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - logFilter - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + discordRPCCheckbox + Discord Rich Presence 활성화:\nDiscord 프로필에 에뮬레이터 아이콘과 관련 정보를 표시합니다. - updaterGroupBox - Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + userName + Username:\nSets the PS4's account username, which may be displayed by some games. - GUIMusicGroupBox - Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - hideCursorGroupBox - Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - idleTimeoutGroupBox - Set a time for the mouse to disappear after being after being idle. + updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - backButtonBehaviorGroupBox - Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - Never - Never + idleTimeoutGroupBox + Set a time for the mouse to disappear after being after being idle. - Idle - Idle + backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - Always - Always + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Touchpad Left + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Touchpad Right + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Touchpad Center + Never + Never - None - None + Idle + Idle - graphicsAdapterGroupBox - Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + Always + Always - resolutionLayout - Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + Touchpad Left + Touchpad Left - heightDivider - Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + Touchpad Right + Touchpad Right - dumpShadersCheckBox - Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + Touchpad Center + Touchpad Center - nullGpuCheckBox - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + None + None - gameFoldersBox - Game Folders:\nThe list of folders to check for installed games. + graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - addFolderButton - Add:\nAdd a folder to the list. + resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - removeFolderButton - Remove:\nRemove a folder from the list. + heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - debugDump - Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - vkValidationCheckBox - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - vkSyncValidationCheckBox - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Add:\nAdd a folder to the list. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Remove:\nRemove a folder from the list. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - Borderless - + rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 27587f25e..bdcc6452f 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Nuotrauka neprieinama + No Image Available + Nuotrauka neprieinama - Serial: - Seriinis numeris: + Serial: + Seriinis numeris: - Version: - Versija: + Version: + Versija: - Size: - Dydis: + Size: + Dydis: - Select Cheat File: - Pasirinkite sukčiavimo failą: + Select Cheat File: + Pasirinkite sukčiavimo failą: - Repository: - Saugykla: + Repository: + Saugykla: - Download Cheats - Atsisiųsti sukčiavimus + Download Cheats + Atsisiųsti sukčiavimus - Delete File - Pašalinti failą + Delete File + Pašalinti failą - No files selected. - Failai nepasirinkti. + No files selected. + Failai nepasirinkti. - You can delete the cheats you don't want after downloading them. - Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. + You can delete the cheats you don't want after downloading them. + Galite pašalinti sukčiavimus, kurių nenorite, juos atsisiuntę. - Do you want to delete the selected file?\n%1 - Ar norite ištrinti pasirinktą failą?\n%1 + Do you want to delete the selected file?\n%1 + Ar norite ištrinti pasirinktą failą?\n%1 - Select Patch File: - Pasirinkite pataisos failą: + Select Patch File: + Pasirinkite pataisos failą: - Download Patches - Atsisiųsti pataisas + Download Patches + Atsisiųsti pataisas - Save - Įrašyti + Save + Įrašyti - Cheats - Sukčiavimai + Cheats + Sukčiavimai - Patches - Pataisos + Patches + Pataisos - Error - Klaida + Error + Klaida - No patch selected. - Nieko nepataisyta. + No patch selected. + Nieko nepataisyta. - Unable to open files.json for reading. - Neįmanoma atidaryti files.json skaitymui. + Unable to open files.json for reading. + Neįmanoma atidaryti files.json skaitymui. - No patch file found for the current serial. - Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. + No patch file found for the current serial. + Nepavyko rasti pataisos failo dabartiniam serijiniam numeriui. - Unable to open the file for reading. - Neįmanoma atidaryti failo skaitymui. + Unable to open the file for reading. + Neįmanoma atidaryti failo skaitymui. - Unable to open the file for writing. - Neįmanoma atidaryti failo rašymui. + Unable to open the file for writing. + Neįmanoma atidaryti failo rašymui. - Failed to parse XML: - Nepavyko išanalizuoti XML: + Failed to parse XML: + Nepavyko išanalizuoti XML: - Success - Sėkmė + Success + Sėkmė - Options saved successfully. - Nustatymai sėkmingai išsaugoti. + Options saved successfully. + Nustatymai sėkmingai išsaugoti. - Invalid Source - Netinkamas šaltinis + Invalid Source + Netinkamas šaltinis - The selected source is invalid. - Pasirinktas šaltinis yra netinkamas. + The selected source is invalid. + Pasirinktas šaltinis yra netinkamas. - File Exists - Failas egzistuoja + File Exists + Failas egzistuoja - File already exists. Do you want to replace it? - Failas jau egzistuoja. Ar norite jį pakeisti? + File already exists. Do you want to replace it? + Failas jau egzistuoja. Ar norite jį pakeisti? - Failed to save file: - Nepavyko išsaugoti failo: + Failed to save file: + Nepavyko išsaugoti failo: - Failed to download file: - Nepavyko atsisiųsti failo: + Failed to download file: + Nepavyko atsisiųsti failo: - Cheats Not Found - Sukčiavimai nerasti + Cheats Not Found + Sukčiavimai nerasti - CheatsNotFound_MSG - Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. + CheatsNotFound_MSG + Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. - Cheats Downloaded Successfully - Sukčiavimai sėkmingai atsisiųsti + Cheats Downloaded Successfully + Sukčiavimai sėkmingai atsisiųsti - CheatsDownloadedSuccessfully_MSG - Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. + CheatsDownloadedSuccessfully_MSG + Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. - Failed to save: - Nepavyko išsaugoti: + Failed to save: + Nepavyko išsaugoti: - Failed to download: - Nepavyko atsisiųsti: + Failed to download: + Nepavyko atsisiųsti: - Download Complete - Atsisiuntimas baigtas + Download Complete + Atsisiuntimas baigtas - DownloadComplete_MSG - Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. + DownloadComplete_MSG + Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. - Failed to parse JSON data from HTML. - Nepavyko išanalizuoti JSON duomenų iš HTML. + Failed to parse JSON data from HTML. + Nepavyko išanalizuoti JSON duomenų iš HTML. - Failed to retrieve HTML page. - Nepavyko gauti HTML puslapio. + Failed to retrieve HTML page. + Nepavyko gauti HTML puslapio. - The game is in version: %1 - Žaidimas yra versijoje: %1 + The game is in version: %1 + Žaidimas yra versijoje: %1 - The downloaded patch only works on version: %1 - Parsisiųstas pataisas veikia tik versijoje: %1 + The downloaded patch only works on version: %1 + Parsisiųstas pataisas veikia tik versijoje: %1 - You may need to update your game. - Gali tekti atnaujinti savo žaidimą. + You may need to update your game. + Gali tekti atnaujinti savo žaidimą. - Incompatibility Notice - Suderinamumo pranešimas + Incompatibility Notice + Suderinamumo pranešimas - Failed to open file: - Nepavyko atidaryti failo: + Failed to open file: + Nepavyko atidaryti failo: - XML ERROR: - XML KLAIDA: + XML ERROR: + XML KLAIDA: - Failed to open files.json for writing - Nepavyko atidaryti files.json rašymui + Failed to open files.json for writing + Nepavyko atidaryti files.json rašymui - Author: - Autorius: + Author: + Autorius: - Directory does not exist: - Katalogas neegzistuoja: + Directory does not exist: + Katalogas neegzistuoja: - Failed to open files.json for reading. - Nepavyko atidaryti files.json skaitymui. + Failed to open files.json for reading. + Nepavyko atidaryti files.json skaitymui. - Name: - Pavadinimas: + Name: + Pavadinimas: - Can't apply cheats before the game is started - Negalima taikyti sukčiavimų prieš pradedant žaidimą. + Can't apply cheats before the game is started + Negalima taikyti sukčiavimų prieš pradedant žaidimą. - Close - Uždaryti + Close + Uždaryti - - + + CheckUpdate - Auto Updater - Automatinis atnaujinimas + Auto Updater + Automatinis atnaujinimas - Error - Klaida + Error + Klaida - Network error: - Tinklo klaida: + Network error: + Tinklo klaida: - Error_Github_limit_MSG - Automatinis atnaujinimas leidžia iki 60 atnaujinimų patikrinimų per valandą.\nJūs pasiekėte šią ribą. Bandykite dar kartą vėliau. + Error_Github_limit_MSG + Automatinis atnaujinimas leidžia iki 60 atnaujinimų patikrinimų per valandą.\nJūs pasiekėte šią ribą. Bandykite dar kartą vėliau. - Failed to parse update information. - Nepavyko išanalizuoti atnaujinimo informacijos. + Failed to parse update information. + Nepavyko išanalizuoti atnaujinimo informacijos. - No pre-releases found. - Išankstinių leidimų nerasta. + No pre-releases found. + Išankstinių leidimų nerasta. - Invalid release data. - Neteisingi leidimo duomenys. + Invalid release data. + Neteisingi leidimo duomenys. - No download URL found for the specified asset. - Nerasta atsisiuntimo URL nurodytam turtui. + No download URL found for the specified asset. + Nerasta atsisiuntimo URL nurodytam turtui. - Your version is already up to date! - Jūsų versija jau atnaujinta! + Your version is already up to date! + Jūsų versija jau atnaujinta! - Update Available - Prieinama atnaujinimas + Update Available + Prieinama atnaujinimas - Update Channel - Atnaujinimo Kanalas + Update Channel + Atnaujinimo Kanalas - Current Version - Esama versija + Current Version + Esama versija - Latest Version - Paskutinė versija + Latest Version + Paskutinė versija - Do you want to update? - Ar norite atnaujinti? + Do you want to update? + Ar norite atnaujinti? - Show Changelog - Rodyti pakeitimų sąrašą + Show Changelog + Rodyti pakeitimų sąrašą - Check for Updates at Startup - Tikrinti naujinimus paleidus + Check for Updates at Startup + Tikrinti naujinimus paleidus - Update - Atnaujinti + Update + Atnaujinti - No - Ne + No + Ne - Hide Changelog - Slėpti pakeitimų sąrašą + Hide Changelog + Slėpti pakeitimų sąrašą - Changes - Pokyčiai + Changes + Pokyčiai - Network error occurred while trying to access the URL - Tinklo klaida bandant pasiekti URL + Network error occurred while trying to access the URL + Tinklo klaida bandant pasiekti URL - Download Complete - Atsisiuntimas baigtas + Download Complete + Atsisiuntimas baigtas - The update has been downloaded, press OK to install. - Atnaujinimas buvo atsisiųstas, paspauskite OK, kad įdiegtumėte. + The update has been downloaded, press OK to install. + Atnaujinimas buvo atsisiųstas, paspauskite OK, kad įdiegtumėte. - Failed to save the update file at - Nepavyko išsaugoti atnaujinimo failo + Failed to save the update file at + Nepavyko išsaugoti atnaujinimo failo - Starting Update... - Pradedama atnaujinimas... + Starting Update... + Pradedama atnaujinimas... - Failed to create the update script file - Nepavyko sukurti atnaujinimo scenarijaus failo + Failed to create the update script file + Nepavyko sukurti atnaujinimo scenarijaus failo - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Naudojamos suderinamumo duomenis, prašome palaukti + Fetching compatibility data, please wait + Naudojamos suderinamumo duomenis, prašome palaukti - Cancel - Atšaukti + Cancel + Atšaukti - Loading... - Kraunama... + Loading... + Kraunama... - Error - Klaida + Error + Klaida - Unable to update compatibility data! Try again later. - Negalima atnaujinti suderinamumo duomenų! Bandykite vėliau. + Unable to update compatibility data! Try again later. + Negalima atnaujinti suderinamumo duomenų! Bandykite vėliau. - Unable to open compatibility_data.json for writing. - Negalima atidaryti compatibility_data.json failo rašymui. + Unable to open compatibility_data.json for writing. + Negalima atidaryti compatibility_data.json failo rašymui. - Unknown - Nežinoma + Unknown + Nežinoma - Nothing - Nėra + Nothing + Nėra - Boots - Batai + Boots + Batai - Menus - Meniu + Menus + Meniu - Ingame - Žaidime + Ingame + Žaidime - Playable - Žaidžiamas + Playable + Žaidžiamas - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikona + Icon + Ikona - Name - Vardas + Name + Vardas - Serial - Serijinis numeris + Serial + Serijinis numeris - Compatibility - Compatibility + Compatibility + Compatibility - Region - Regionas + Region + Regionas - Firmware - Firmvare + Firmware + Firmvare - Size - Dydis + Size + Dydis - Version - Versija + Version + Versija - Path - Kelias + Path + Kelias - Play Time - Žaidimo laikas + Play Time + Žaidimo laikas - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Spustelėkite, kad pamatytumėte detales GitHub + Click to see details on github + Spustelėkite, kad pamatytumėte detales GitHub - Last updated - Paskutinį kartą atnaujinta + Last updated + Paskutinį kartą atnaujinta - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - SFO Viewer - SFO Viewer + Cheats / Patches + Cheats / Patches - Trophy Viewer - Trophy Viewer + SFO Viewer + SFO Viewer - Open Folder... - Atidaryti Katalogą... + Trophy Viewer + Trophy Viewer - Open Game Folder - Atidaryti Žaidimo Katalogą + Open Folder... + Atidaryti Katalogą... - Open Save Data Folder - Atidaryti Išsaugotų Duomenų Katalogą + Open Game Folder + Atidaryti Žaidimo Katalogą - Open Log Folder - Atidaryti Žurnalų Katalogą + Open Save Data Folder + Atidaryti Išsaugotų Duomenų Katalogą - Copy info... - Copy info... + Open Log Folder + Atidaryti Žurnalų Katalogą - Copy Name - Copy Name + Copy info... + Copy info... - Copy Serial - Copy Serial + Copy Name + Copy Name - Copy All - Copy All + Copy Serial + Copy Serial - Delete... - Delete... + Copy Version + Copy Version - Delete Game - Delete Game + Copy Size + Copy Size - Delete Update - Delete Update + Copy All + Copy All - Delete DLC - Delete DLC + Delete... + Delete... - Compatibility... - Compatibility... + Delete Game + Delete Game - Update database - Update database + Delete Update + Delete Update - View report - View report + Delete DLC + Delete DLC - Submit a report - Submit a report + Compatibility... + Compatibility... - Shortcut creation - Shortcut creation + Update database + Update database - Shortcut created successfully! - Shortcut created successfully! + View report + View report - Error - Error + Submit a report + Submit a report - Error creating shortcut! - Error creating shortcut! + Shortcut creation + Shortcut creation - Install PKG - Install PKG + Shortcut created successfully! + Shortcut created successfully! - Game - Game + Error + Error - This game has no update to delete! - This game has no update to delete! + Error creating shortcut! + Error creating shortcut! - Update - Update + Install PKG + Install PKG - This game has no DLC to delete! - This game has no DLC to delete! + Game + Game - DLC - DLC + This game has no update to delete! + This game has no update to delete! - Delete %1 - Delete %1 + Update + Update - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + This game has no DLC to delete! + This game has no DLC to delete! - Open Update Folder - + DLC + DLC - Cheats / Patches - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Patikrinti atnaujinimus + Check for Updates + Patikrinti atnaujinimus - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Atsisiųsti Apgaules / Pleistrus + Download Cheats/Patches + Atsisiųsti Apgaules / Pleistrus - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Pagalba + Help + Pagalba - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Žaidimų sąrašas + Game List + Žaidimų sąrašas - * Unsupported Vulkan Version - * Nepalaikoma Vulkan versija + * Unsupported Vulkan Version + * Nepalaikoma Vulkan versija - Download Cheats For All Installed Games - Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams + Download Cheats For All Installed Games + Atsisiųsti sukčiavimus visiems įdiegtiems žaidimams - Download Patches For All Games - Atsisiųsti pataisas visiems žaidimams + Download Patches For All Games + Atsisiųsti pataisas visiems žaidimams - Download Complete - Atsisiuntimas baigtas + Download Complete + Atsisiuntimas baigtas - You have downloaded cheats for all the games you have installed. - Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. + You have downloaded cheats for all the games you have installed. + Jūs atsisiuntėte sukčiavimus visiems jūsų įdiegtiesiems žaidimams. - Patches Downloaded Successfully! - Pataisos sėkmingai atsisiųstos! + Patches Downloaded Successfully! + Pataisos sėkmingai atsisiųstos! - All Patches available for all games have been downloaded. - Visos pataisos visiems žaidimams buvo atsisiųstos. + All Patches available for all games have been downloaded. + Visos pataisos visiems žaidimams buvo atsisiųstos. - Games: - Žaidimai: + Games: + Žaidimai: - ELF files (*.bin *.elf *.oelf) - ELF failai (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF failai (*.bin *.elf *.oelf) - Game Boot - Žaidimo paleidimas + Game Boot + Žaidimo paleidimas - Only one file can be selected! - Galite pasirinkti tik vieną failą! + Only one file can be selected! + Galite pasirinkti tik vieną failą! - PKG Extraction - PKG ištraukimas + PKG Extraction + PKG ištraukimas - Patch detected! - Rasta atnaujinimą! + Patch detected! + Rasta atnaujinimą! - PKG and Game versions match: - PKG ir žaidimo versijos sutampa: + PKG and Game versions match: + PKG ir žaidimo versijos sutampa: - Would you like to overwrite? - Ar norite perrašyti? + Would you like to overwrite? + Ar norite perrašyti? - PKG Version %1 is older than installed version: - PKG versija %1 yra senesnė nei įdiegta versija: + PKG Version %1 is older than installed version: + PKG versija %1 yra senesnė nei įdiegta versija: - Game is installed: - Žaidimas įdiegtas: + Game is installed: + Žaidimas įdiegtas: - Would you like to install Patch: - Ar norite įdiegti atnaujinimą: + Would you like to install Patch: + Ar norite įdiegti atnaujinimą: - DLC Installation - DLC diegimas + DLC Installation + DLC diegimas - Would you like to install DLC: %1? - Ar norite įdiegti DLC: %1? + Would you like to install DLC: %1? + Ar norite įdiegti DLC: %1? - DLC already installed: - DLC jau įdiegtas: + DLC already installed: + DLC jau įdiegtas: - Game already installed - Žaidimas jau įdiegtas + Game already installed + Žaidimas jau įdiegtas - PKG ERROR - PKG KLAIDA + PKG ERROR + PKG KLAIDA - Extracting PKG %1/%2 - Ekstrakcinis PKG %1/%2 + Extracting PKG %1/%2 + Ekstrakcinis PKG %1/%2 - Extraction Finished - Ekstrakcija baigta + Extraction Finished + Ekstrakcija baigta - Game successfully installed at %1 - Žaidimas sėkmingai įdiegtas %1 + Game successfully installed at %1 + Žaidimas sėkmingai įdiegtas %1 - File doesn't appear to be a valid PKG file - Failas atrodo, kad nėra galiojantis PKG failas + File doesn't appear to be a valid PKG file + Failas atrodo, kad nėra galiojantis PKG failas - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Vardas + PKG ERROR + PKG KLAIDA - Serial - Serijinis numeris + Name + Vardas - Installed - + Serial + Serijinis numeris - Size - Dydis + Installed + Installed - Category - + Size + Dydis - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Regionas + FW + FW - Flags - + Region + Regionas - Path - Kelias + Flags + Flags - File - File + Path + Kelias - PKG ERROR - PKG KLAIDA + File + File - Unknown - Nežinoma + Unknown + Nežinoma - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - Viso ekranas + Fullscreen Mode + Viso ekranas - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Numatytoji kortelė atidarius nustatymus + Default tab when opening settings + Numatytoji kortelė atidarius nustatymus - Show Game Size In List - Rodyti žaidimo dydį sąraše + Show Game Size In List + Rodyti žaidimo dydį sąraše - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Įjungti Discord Rich Presence + Enable Discord Rich Presence + Įjungti Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - Atidaryti žurnalo vietą + Open Log Location + Atidaryti žurnalo vietą - Input - Įvestis + Input + Įvestis - Cursor - Žymeklis + Cursor + Žymeklis - Hide Cursor - Slėpti žymeklį + Hide Cursor + Slėpti žymeklį - Hide Cursor Idle Timeout - Žymeklio paslėpimo neveikimo laikas + Hide Cursor Idle Timeout + Žymeklio paslėpimo neveikimo laikas - s - s + s + s - Controller - Valdiklis + Controller + Valdiklis - Back Button Behavior - Atgal mygtuko elgsena + Back Button Behavior + Atgal mygtuko elgsena - Graphics - Graphics + Graphics + Graphics - GUI - Interfeisa + GUI + Interfeisa - User - Naudotojas + User + Naudotojas - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Keliai + Enable HDR + Enable HDR - Game Folders - Žaidimų aplankai + Paths + Keliai - Add... - Pridėti... + Game Folders + Žaidimų aplankai - Remove - Pašalinti + Add... + Pridėti... - Debug - Debug + Remove + Pašalinti - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Atnaujinimas + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Tikrinti naujinimus paleidus + Update + Atnaujinimas - Always Show Changelog - Visada rodyti pakeitimų žurnalą + Check for Updates at Startup + Tikrinti naujinimus paleidus - Update Channel - Atnaujinimo Kanalas + Always Show Changelog + Visada rodyti pakeitimų žurnalą - Check for Updates - Patikrinkite atnaujinimus + Update Channel + Atnaujinimo Kanalas - GUI Settings - GUI Nustatymai + Check for Updates + Patikrinkite atnaujinimus - Title Music - Title Music + GUI Settings + GUI Nustatymai - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Groti antraštės muziką + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Groti antraštės muziką - Volume - Garsumas + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Įrašyti + Game Compatibility + Game Compatibility - Apply - Taikyti + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Atkurti numatytuosius nustatymus + Update Compatibility Database + Update Compatibility Database - Close - Uždaryti + Volume + Garsumas - Point your mouse at an option to display its description. - Žymeklį nukreipkite ant pasirinkimo, kad pamatytumėte jo aprašymą. + Save + Įrašyti - consoleLanguageGroupBox - Konsole kalba:\nNustato kalbą, kurią naudoja PS4 žaidimai.\nRekomenduojama nustatyti kalbą, kurią palaiko žaidimas, priklausomai nuo regiono. + Apply + Taikyti - emulatorLanguageGroupBox - Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. + Restore Defaults + Atkurti numatytuosius nustatymus - fullscreenCheckBox - Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. + Close + Uždaryti - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Žymeklį nukreipkite ant pasirinkimo, kad pamatytumėte jo aprašymą. - showSplashCheckBox - Rodyti paleidimo ekraną:\nPaleidimo metu rodo žaidimo paleidimo ekraną (ypatingą vaizdą). + consoleLanguageGroupBox + Konsole kalba:\nNustato kalbą, kurią naudoja PS4 žaidimai.\nRekomenduojama nustatyti kalbą, kurią palaiko žaidimas, priklausomai nuo regiono. - discordRPCCheckbox - Įjungti Discord Rich Presence:\nRodo emuliatoriaus ikoną ir susijusią informaciją jūsų Discord profilyje. + emulatorLanguageGroupBox + Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. - userName - Vartotojo vardas:\nNustato PS4 paskyros vartotojo vardą, kuris gali būti rodomas kai kuriuose žaidimuose. + fullscreenCheckBox + Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Žurnalo tipas:\nNustato, ar sinchronizuoti žurnalo lango išvestį našumui. Tai gali turėti neigiamą poveikį emuliacijai. + showSplashCheckBox + Rodyti paleidimo ekraną:\nPaleidimo metu rodo žaidimo paleidimo ekraną (ypatingą vaizdą). - logFilter - Žurnalo filtras:\nFiltruojamas žurnalas, kad būtų spausdinama tik konkreti informacija.\nPavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius. + discordRPCCheckbox + Įjungti Discord Rich Presence:\nRodo emuliatoriaus ikoną ir susijusią informaciją jūsų Discord profilyje. - updaterGroupBox - Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. + userName + Vartotojo vardas:\nNustato PS4 paskyros vartotojo vardą, kuris gali būti rodomas kai kuriuose žaidimuose. - GUIMusicGroupBox - Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Žurnalo tipas:\nNustato, ar sinchronizuoti žurnalo lango išvestį našumui. Tai gali turėti neigiamą poveikį emuliacijai. - hideCursorGroupBox - Slėpti žymeklį:\nPasirinkite, kada žymeklis dings:\nNiekuomet: Visada matysite pelę.\nNeaktyvus: Nustatykite laiką, po kurio ji dings, kai bus neaktyvi.\nVisada: niekada nematysite pelės. + logFilter + Žurnalo filtras:\nFiltruojamas žurnalas, kad būtų spausdinama tik konkreti informacija.\nPavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius. - idleTimeoutGroupBox - Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi. + updaterGroupBox + Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. - backButtonBehaviorGroupBox - Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Slėpti žymeklį:\nPasirinkite, kada žymeklis dings:\nNiekuomet: Visada matysite pelę.\nNeaktyvus: Nustatykite laiką, po kurio ji dings, kai bus neaktyvi.\nVisada: niekada nematysite pelės. - Never - Niekada + idleTimeoutGroupBox + Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi. - Idle - Neaktyvus + backButtonBehaviorGroupBox + Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje. - Always - Visada + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Jutiklinis Paviršius Kairėje + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Jutiklinis Paviršius Dešinėje + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Jutiklinis Paviršius Centre + Never + Niekada - None - Nieko + Idle + Neaktyvus - graphicsAdapterGroupBox - Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos iš išskleidžiamojo sąrašo,\n arba pasirinkite "Auto Select", kad jis būtų nustatytas automatiškai. + Always + Visada - resolutionLayout - Plotis/Aukštis:\nNustato emuliatoriaus lango dydį paleidimo metu, kurį galima keisti žaidimo metu.\nTai skiriasi nuo žaidimo rezoliucijos. + Touchpad Left + Jutiklinis Paviršius Kairėje - heightDivider - Vblank daliklis:\nKadrų dažnis, kuriuo emuliatorius atnaujinamas, dauginamas iš šio skaičiaus. Pakeitus tai gali turėti neigiamą poveikį, pvz., padidinti žaidimo greitį arba sukelti kritinių žaidimo funkcijų sugadinimą, kurios to nesitikėjo! + Touchpad Right + Jutiklinis Paviršius Dešinėje - dumpShadersCheckBox - Įjungti šešėlių išmetimą:\nTechninio derinimo tikslais saugo žaidimo šešėlius į aplanką juos renderuojant. + Touchpad Center + Jutiklinis Paviršius Centre - nullGpuCheckBox - Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės. + None + Nieko - gameFoldersBox - Žaidimų aplankai:\nAplankų sąrašas, kurį reikia patikrinti, ar yra įdiegtų žaidimų. + graphicsAdapterGroupBox + Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos iš išskleidžiamojo sąrašo,\n arba pasirinkite "Auto Select", kad jis būtų nustatytas automatiškai. - addFolderButton - Pridėti:\nPridėti aplanką į sąrašą. + resolutionLayout + Plotis/Aukštis:\nNustato emuliatoriaus lango dydį paleidimo metu, kurį galima keisti žaidimo metu.\nTai skiriasi nuo žaidimo rezoliucijos. - removeFolderButton - Pašalinti:\nPašalinti aplanką iš sąrašo. + heightDivider + Vblank daliklis:\nKadrų dažnis, kuriuo emuliatorius atnaujinamas, dauginamas iš šio skaičiaus. Pakeitus tai gali turėti neigiamą poveikį, pvz., padidinti žaidimo greitį arba sukelti kritinių žaidimo funkcijų sugadinimą, kurios to nesitikėjo! - debugDump - Įjungti derinimo išmetimą:\nIšsaugo importo ir eksporto simbolius bei failo antraštės informaciją apie šiuo metu vykdomą PS4 programą į katalogą. + dumpShadersCheckBox + Įjungti šešėlių išmetimą:\nTechninio derinimo tikslais saugo žaidimo šešėlius į aplanką juos renderuojant. - vkValidationCheckBox - Įjungti Vulkan patvirtinimo sluoksnius:\nĮjungia sistemą, kuri patvirtina Vulkan renderio būseną ir registruoja informaciją apie jo vidinę būseną. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. + nullGpuCheckBox + Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės. - vkSyncValidationCheckBox - Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. + gameFoldersBox + Žaidimų aplankai:\nAplankų sąrašas, kurį reikia patikrinti, ar yra įdiegtų žaidimų. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Pridėti:\nPridėti aplanką į sąrašą. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Pašalinti:\nPašalinti aplanką iš sąrašo. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Įjungti derinimo išmetimą:\nIšsaugo importo ir eksporto simbolius bei failo antraštės informaciją apie šiuo metu vykdomą PS4 programą į katalogą. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Įjungti Vulkan patvirtinimo sluoksnius:\nĮjungia sistemą, kuri patvirtina Vulkan renderio būseną ir registruoja informaciją apie jo vidinę būseną. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - Borderless - + rdocCheckBox + Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index ce00ca4f8..018e900d3 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Geen afbeelding beschikbaar + No Image Available + Geen afbeelding beschikbaar - Serial: - Serie: + Serial: + Serie: - Version: - Versie: + Version: + Versie: - Size: - Grootte: + Size: + Grootte: - Select Cheat File: - Selecteer cheatbestand: + Select Cheat File: + Selecteer cheatbestand: - Repository: - Repository: + Repository: + Repository: - Download Cheats - Download cheats + Download Cheats + Download cheats - Delete File - Bestand verwijderen + Delete File + Bestand verwijderen - No files selected. - Geen bestanden geselecteerd. + No files selected. + Geen bestanden geselecteerd. - You can delete the cheats you don't want after downloading them. - Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. + You can delete the cheats you don't want after downloading them. + Je kunt de cheats die je niet wilt verwijderen nadat je ze hebt gedownload. - Do you want to delete the selected file?\n%1 - Wil je het geselecteerde bestand verwijderen?\n%1 + Do you want to delete the selected file?\n%1 + Wil je het geselecteerde bestand verwijderen?\n%1 - Select Patch File: - Selecteer patchbestand: + Select Patch File: + Selecteer patchbestand: - Download Patches - Download patches + Download Patches + Download patches - Save - Opslaan + Save + Opslaan - Cheats - Cheats + Cheats + Cheats - Patches - Patches + Patches + Patches - Error - Fout + Error + Fout - No patch selected. - Geen patch geselecteerd. + No patch selected. + Geen patch geselecteerd. - Unable to open files.json for reading. - Kan files.json niet openen voor lezen. + Unable to open files.json for reading. + Kan files.json niet openen voor lezen. - No patch file found for the current serial. - Geen patchbestand gevonden voor het huidige serienummer. + No patch file found for the current serial. + Geen patchbestand gevonden voor het huidige serienummer. - Unable to open the file for reading. - Kan het bestand niet openen voor lezen. + Unable to open the file for reading. + Kan het bestand niet openen voor lezen. - Unable to open the file for writing. - Kan het bestand niet openen voor schrijven. + Unable to open the file for writing. + Kan het bestand niet openen voor schrijven. - Failed to parse XML: - XML parsing mislukt: + Failed to parse XML: + XML parsing mislukt: - Success - Succes + Success + Succes - Options saved successfully. - Opties succesvol opgeslagen. + Options saved successfully. + Opties succesvol opgeslagen. - Invalid Source - Ongeldige bron + Invalid Source + Ongeldige bron - The selected source is invalid. - De geselecteerde bron is ongeldig. + The selected source is invalid. + De geselecteerde bron is ongeldig. - File Exists - Bestand bestaat + File Exists + Bestand bestaat - File already exists. Do you want to replace it? - Bestand bestaat al. Wil je het vervangen? + File already exists. Do you want to replace it? + Bestand bestaat al. Wil je het vervangen? - Failed to save file: - Kan bestand niet opslaan: + Failed to save file: + Kan bestand niet opslaan: - Failed to download file: - Kan bestand niet downloaden: + Failed to download file: + Kan bestand niet downloaden: - Cheats Not Found - Cheats niet gevonden + Cheats Not Found + Cheats niet gevonden - CheatsNotFound_MSG - Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. + CheatsNotFound_MSG + Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. - Cheats Downloaded Successfully - Cheats succesvol gedownload + Cheats Downloaded Successfully + Cheats succesvol gedownload - CheatsDownloadedSuccessfully_MSG - Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. + CheatsDownloadedSuccessfully_MSG + Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. - Failed to save: - Opslaan mislukt: + Failed to save: + Opslaan mislukt: - Failed to download: - Downloaden mislukt: + Failed to download: + Downloaden mislukt: - Download Complete - Download voltooid + Download Complete + Download voltooid - DownloadComplete_MSG - Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. + DownloadComplete_MSG + Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. - Failed to parse JSON data from HTML. - Kan JSON-gegevens uit HTML niet parseren. + Failed to parse JSON data from HTML. + Kan JSON-gegevens uit HTML niet parseren. - Failed to retrieve HTML page. - Kan HTML-pagina niet ophalen. + Failed to retrieve HTML page. + Kan HTML-pagina niet ophalen. - The game is in version: %1 - Het spel is in versie: %1 + The game is in version: %1 + Het spel is in versie: %1 - The downloaded patch only works on version: %1 - De gedownloade patch werkt alleen op versie: %1 + The downloaded patch only works on version: %1 + De gedownloade patch werkt alleen op versie: %1 - You may need to update your game. - Misschien moet je je spel bijwerken. + You may need to update your game. + Misschien moet je je spel bijwerken. - Incompatibility Notice - Incompatibiliteitsmelding + Incompatibility Notice + Incompatibiliteitsmelding - Failed to open file: - Kan bestand niet openen: + Failed to open file: + Kan bestand niet openen: - XML ERROR: - XML FOUT: + XML ERROR: + XML FOUT: - Failed to open files.json for writing - Kan files.json niet openen voor schrijven + Failed to open files.json for writing + Kan files.json niet openen voor schrijven - Author: - Auteur: + Author: + Auteur: - Directory does not exist: - Map bestaat niet: + Directory does not exist: + Map bestaat niet: - Failed to open files.json for reading. - Kan files.json niet openen voor lezen. + Failed to open files.json for reading. + Kan files.json niet openen voor lezen. - Name: - Naam: + Name: + Naam: - Can't apply cheats before the game is started - Je kunt geen cheats toepassen voordat het spel is gestart. + Can't apply cheats before the game is started + Je kunt geen cheats toepassen voordat het spel is gestart. - Close - Sluiten + Close + Sluiten - - + + CheckUpdate - Auto Updater - Automatische updater + Auto Updater + Automatische updater - Error - Fout + Error + Fout - Network error: - Netwerkfout: + Network error: + Netwerkfout: - Error_Github_limit_MSG - De automatische updater staat tot 60 updatecontroles per uur toe.\nJe hebt deze limiet bereikt. Probeer het later opnieuw. + Error_Github_limit_MSG + De automatische updater staat tot 60 updatecontroles per uur toe.\nJe hebt deze limiet bereikt. Probeer het later opnieuw. - Failed to parse update information. - Kon update-informatie niet parseren. + Failed to parse update information. + Kon update-informatie niet parseren. - No pre-releases found. - Geen pre-releases gevonden. + No pre-releases found. + Geen pre-releases gevonden. - Invalid release data. - Ongeldige releasegegevens. + Invalid release data. + Ongeldige releasegegevens. - No download URL found for the specified asset. - Geen download-URL gevonden voor het opgegeven bestand. + No download URL found for the specified asset. + Geen download-URL gevonden voor het opgegeven bestand. - Your version is already up to date! - Uw versie is al up-to-date! + Your version is already up to date! + Uw versie is al up-to-date! - Update Available - Update beschikbaar + Update Available + Update beschikbaar - Update Channel - Updatekanaal + Update Channel + Updatekanaal - Current Version - Huidige versie + Current Version + Huidige versie - Latest Version - Laatste versie + Latest Version + Laatste versie - Do you want to update? - Wilt u updaten? + Do you want to update? + Wilt u updaten? - Show Changelog - Toon changelog + Show Changelog + Toon changelog - Check for Updates at Startup - Bij opstart op updates controleren + Check for Updates at Startup + Bij opstart op updates controleren - Update - Bijwerken + Update + Bijwerken - No - Nee + No + Nee - Hide Changelog - Verberg changelog + Hide Changelog + Verberg changelog - Changes - Wijzigingen + Changes + Wijzigingen - Network error occurred while trying to access the URL - Netwerkfout opgetreden tijdens toegang tot de URL + Network error occurred while trying to access the URL + Netwerkfout opgetreden tijdens toegang tot de URL - Download Complete - Download compleet + Download Complete + Download compleet - The update has been downloaded, press OK to install. - De update is gedownload, druk op OK om te installeren. + The update has been downloaded, press OK to install. + De update is gedownload, druk op OK om te installeren. - Failed to save the update file at - Kon het updatebestand niet opslaan op + Failed to save the update file at + Kon het updatebestand niet opslaan op - Starting Update... - Starten van update... + Starting Update... + Starten van update... - Failed to create the update script file - Kon het update-scriptbestand niet maken + Failed to create the update script file + Kon het update-scriptbestand niet maken - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Compatibiliteitsgegevens ophalen, even geduld + Fetching compatibility data, please wait + Compatibiliteitsgegevens ophalen, even geduld - Cancel - Annuleren + Cancel + Annuleren - Loading... - Laden... + Loading... + Laden... - Error - Fout + Error + Fout - Unable to update compatibility data! Try again later. - Kan compatibiliteitsgegevens niet bijwerken! Probeer het later opnieuw. + Unable to update compatibility data! Try again later. + Kan compatibiliteitsgegevens niet bijwerken! Probeer het later opnieuw. - Unable to open compatibility_data.json for writing. - Kan compatibility_data.json niet openen voor schrijven. + Unable to open compatibility_data.json for writing. + Kan compatibility_data.json niet openen voor schrijven. - Unknown - Onbekend + Unknown + Onbekend - Nothing - Niets + Nothing + Niets - Boots - Laarsjes + Boots + Laarsjes - Menus - Menu's + Menus + Menu's - Ingame - In het spel + Ingame + In het spel - Playable - Speelbaar + Playable + Speelbaar - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Pictogram + Icon + Pictogram - Name - Naam + Name + Naam - Serial - Serienummer + Serial + Serienummer - Compatibility - Compatibility + Compatibility + Compatibility - Region - Regio + Region + Regio - Firmware - Firmware + Firmware + Firmware - Size - Grootte + Size + Grootte - Version - Versie + Version + Versie - Path - Pad + Path + Pad - Play Time - Speeltijd + Play Time + Speeltijd - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Klik om details op GitHub te bekijken + Click to see details on github + Klik om details op GitHub te bekijken - Last updated - Laatst bijgewerkt + Last updated + Laatst bijgewerkt - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - Cheats / Patches - Cheats / Patches + Cheats / Patches + Cheats / Patches - SFO Viewer - SFO Viewer + SFO Viewer + SFO Viewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - Open Folder... - Map openen... + Open Folder... + Map openen... - Open Game Folder - Open Spelmap + Open Game Folder + Open Spelmap - Open Save Data Folder - Open Map voor Opslagdata + Open Save Data Folder + Open Map voor Opslagdata - Open Log Folder - Open Logmap + Open Log Folder + Open Logmap - Copy info... - Copy info... + Copy info... + Copy info... - Copy Name - Copy Name + Copy Name + Copy Name - Copy Serial - Copy Serial + Copy Serial + Copy Serial - Copy All - Copy All + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copy All - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Shortcut creation + View report + View report - Shortcut created successfully! - Shortcut created successfully! + Submit a report + Submit a report - Error - Error + Shortcut creation + Shortcut creation - Error creating shortcut! - Error creating shortcut! + Shortcut created successfully! + Shortcut created successfully! - Install PKG - Install PKG + Error + Error - Game - Game + Error creating shortcut! + Error creating shortcut! - This game has no update to delete! - This game has no update to delete! + Install PKG + Install PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Controleren op updates + Check for Updates + Controleren op updates - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Download Cheats/Patches + Download Cheats/Patches + Download Cheats/Patches - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Help + Help + Help - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Lijst met spellen + Game List + Lijst met spellen - * Unsupported Vulkan Version - * Niet ondersteunde Vulkan-versie + * Unsupported Vulkan Version + * Niet ondersteunde Vulkan-versie - Download Cheats For All Installed Games - Download cheats voor alle geïnstalleerde spellen + Download Cheats For All Installed Games + Download cheats voor alle geïnstalleerde spellen - Download Patches For All Games - Download patches voor alle spellen + Download Patches For All Games + Download patches voor alle spellen - Download Complete - Download voltooid + Download Complete + Download voltooid - You have downloaded cheats for all the games you have installed. - Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. + You have downloaded cheats for all the games you have installed. + Je hebt cheats gedownload voor alle spellen die je hebt geïnstalleerd. - Patches Downloaded Successfully! - Patches succesvol gedownload! + Patches Downloaded Successfully! + Patches succesvol gedownload! - All Patches available for all games have been downloaded. - Alle patches voor alle spellen zijn gedownload. + All Patches available for all games have been downloaded. + Alle patches voor alle spellen zijn gedownload. - Games: - Spellen: + Games: + Spellen: - ELF files (*.bin *.elf *.oelf) - ELF-bestanden (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF-bestanden (*.bin *.elf *.oelf) - Game Boot - Spelopstart + Game Boot + Spelopstart - Only one file can be selected! - Je kunt slechts één bestand selecteren! + Only one file can be selected! + Je kunt slechts één bestand selecteren! - PKG Extraction - PKG-extractie + PKG Extraction + PKG-extractie - Patch detected! - Patch gedetecteerd! + Patch detected! + Patch gedetecteerd! - PKG and Game versions match: - PKG- en gameversies komen overeen: + PKG and Game versions match: + PKG- en gameversies komen overeen: - Would you like to overwrite? - Wilt u overschrijven? + Would you like to overwrite? + Wilt u overschrijven? - PKG Version %1 is older than installed version: - PKG-versie %1 is ouder dan de geïnstalleerde versie: + PKG Version %1 is older than installed version: + PKG-versie %1 is ouder dan de geïnstalleerde versie: - Game is installed: - Game is geïnstalleerd: + Game is installed: + Game is geïnstalleerd: - Would you like to install Patch: - Wilt u de patch installeren: + Would you like to install Patch: + Wilt u de patch installeren: - DLC Installation - DLC-installatie + DLC Installation + DLC-installatie - Would you like to install DLC: %1? - Wilt u DLC installeren: %1? + Would you like to install DLC: %1? + Wilt u DLC installeren: %1? - DLC already installed: - DLC al geïnstalleerd: + DLC already installed: + DLC al geïnstalleerd: - Game already installed - Game al geïnstalleerd + Game already installed + Game al geïnstalleerd - PKG ERROR - PKG FOUT + PKG ERROR + PKG FOUT - Extracting PKG %1/%2 - PKG %1/%2 aan het extraheren + Extracting PKG %1/%2 + PKG %1/%2 aan het extraheren - Extraction Finished - Extractie voltooid + Extraction Finished + Extractie voltooid - Game successfully installed at %1 - Spel succesvol geïnstalleerd op %1 + Game successfully installed at %1 + Spel succesvol geïnstalleerd op %1 - File doesn't appear to be a valid PKG file - Het bestand lijkt geen geldig PKG-bestand te zijn + File doesn't appear to be a valid PKG file + Het bestand lijkt geen geldig PKG-bestand te zijn - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Naam + PKG ERROR + PKG FOUT - Serial - Serienummer + Name + Naam - Installed - + Serial + Serienummer - Size - Grootte + Installed + Installed - Category - + Size + Grootte - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Regio + FW + FW - Flags - + Region + Regio - Path - Pad + Flags + Flags - File - File + Path + Pad - PKG ERROR - PKG FOUT + File + File - Unknown - Onbekend + Unknown + Onbekend - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - Volledig schermmodus + Fullscreen Mode + Volledig schermmodus - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Standaardtabblad bij het openen van instellingen + Default tab when opening settings + Standaardtabblad bij het openen van instellingen - Show Game Size In List - Toon grootte van het spel in de lijst + Show Game Size In List + Toon grootte van het spel in de lijst - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Discord Rich Presence inschakelen + Enable Discord Rich Presence + Discord Rich Presence inschakelen - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - Loglocatie openen + Open Log Location + Loglocatie openen - Input - Invoer + Input + Invoer - Cursor - Cursor + Cursor + Cursor - Hide Cursor - Cursor verbergen + Hide Cursor + Cursor verbergen - Hide Cursor Idle Timeout - Inactiviteit timeout voor het verbergen van de cursor + Hide Cursor Idle Timeout + Inactiviteit timeout voor het verbergen van de cursor - s - s + s + s - Controller - Controller + Controller + Controller - Back Button Behavior - Achterknop gedrag + Back Button Behavior + Achterknop gedrag - Graphics - Graphics + Graphics + Graphics - GUI - Interface + GUI + Interface - User - Gebruiker + User + Gebruiker - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Pad + Enable HDR + Enable HDR - Game Folders - Spelmappen + Paths + Pad - Add... - Toevoegen... + Game Folders + Spelmappen - Remove - Verwijderen + Add... + Toevoegen... - Debug - Debug + Remove + Verwijderen - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Bijwerken + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Bij opstart op updates controleren + Update + Bijwerken - Always Show Changelog - Altijd changelog tonen + Check for Updates at Startup + Bij opstart op updates controleren - Update Channel - Updatekanaal + Always Show Changelog + Altijd changelog tonen - Check for Updates - Controleren op updates + Update Channel + Updatekanaal - GUI Settings - GUI-Instellingen + Check for Updates + Controleren op updates - Title Music - Title Music + GUI Settings + GUI-Instellingen - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Titelmuziek afspelen + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Titelmuziek afspelen - Volume - Volume + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Opslaan + Game Compatibility + Game Compatibility - Apply - Toepassen + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Standaardinstellingen herstellen + Update Compatibility Database + Update Compatibility Database - Close - Sluiten + Volume + Volume - Point your mouse at an option to display its description. - Wijzig de muisaanwijzer naar een optie om de beschrijving weer te geven. + Save + Opslaan - consoleLanguageGroupBox - Console Taal:\nStelt de taal in die het PS4-spel gebruikt.\nHet wordt aanbevolen om dit in te stellen op een taal die het spel ondersteunt, wat kan variëren per regio. + Apply + Toepassen - emulatorLanguageGroupBox - Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. + Restore Defaults + Standaardinstellingen herstellen - fullscreenCheckBox - Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. + Close + Sluiten - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Wijzig de muisaanwijzer naar een optie om de beschrijving weer te geven. - showSplashCheckBox - Opstartscherm weergeven:\nToont het opstartscherm van het spel (een speciale afbeelding) tijdens het starten van het spel. + consoleLanguageGroupBox + Console Taal:\nStelt de taal in die het PS4-spel gebruikt.\nHet wordt aanbevolen om dit in te stellen op een taal die het spel ondersteunt, wat kan variëren per regio. - discordRPCCheckbox - Discord Rich Presence inschakelen:\nToont het emulatoricoon en relevante informatie op je Discord-profiel. + emulatorLanguageGroupBox + Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. - userName - Gebruikersnaam:\nStelt de gebruikersnaam van het PS4-account in, die door sommige games kan worden weergegeven. + fullscreenCheckBox + Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Logtype:\nStelt in of de uitvoer van het logvenster moet worden gesynchroniseerd voor prestaties. Kan nadelige effecten hebben op emulatie. + showSplashCheckBox + Opstartscherm weergeven:\nToont het opstartscherm van het spel (een speciale afbeelding) tijdens het starten van het spel. - logFilter - Logfilter:\nFiltert het logboek om alleen specifieke informatie af te drukken.\nVoorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna. + discordRPCCheckbox + Discord Rich Presence inschakelen:\nToont het emulatoricoon en relevante informatie op je Discord-profiel. - updaterGroupBox - Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. + userName + Gebruikersnaam:\nStelt de gebruikersnaam van het PS4-account in, die door sommige games kan worden weergegeven. - GUIMusicGroupBox - Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Logtype:\nStelt in of de uitvoer van het logvenster moet worden gesynchroniseerd voor prestaties. Kan nadelige effecten hebben op emulatie. - hideCursorGroupBox - Verberg cursor:\nKies wanneer de cursor verdwijnt:\nNooit: Je ziet altijd de muis.\nInactief: Stel een tijd in waarna deze verdwijnt na inactiviteit.\nAltijd: je ziet de muis nooit. + logFilter + Logfilter:\nFiltert het logboek om alleen specifieke informatie af te drukken.\nVoorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna. - idleTimeoutGroupBox - Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit. + updaterGroupBox + Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. - backButtonBehaviorGroupBox - Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Verberg cursor:\nKies wanneer de cursor verdwijnt:\nNooit: Je ziet altijd de muis.\nInactief: Stel een tijd in waarna deze verdwijnt na inactiviteit.\nAltijd: je ziet de muis nooit. - Never - Nooit + idleTimeoutGroupBox + Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit. - Idle - Inactief + backButtonBehaviorGroupBox + Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen. - Always - Altijd + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Touchpad Links + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Touchpad Rechts + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Touchpad Midden + Never + Nooit - None - Geen + Idle + Inactief - graphicsAdapterGroupBox - Grafische adapter:\nIn systemen met meerdere GPU's, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies "Auto Select" om dit automatisch in te stellen. + Always + Altijd - resolutionLayout - Breedte/Hoogte:\nStelt de grootte van het emulatorvenster bij het opstarten in, wat tijdens het spelen kan worden gewijzigd.\nDit is anders dan de resolutie in de game. + Touchpad Left + Touchpad Links - heightDivider - Vblank deler:\nDe frame-rate waartegen de emulator wordt vernieuwd, vermenigvuldigd met dit getal. Dit veranderen kan nadelige effecten hebben, zoals het versnellen van het spel of het verpesten van kritieke gamefunctionaliteiten die niet verwachtten dat dit zou veranderen! + Touchpad Right + Touchpad Rechts - dumpShadersCheckBox - Shaderdump inschakelen:\nVoor technische foutopsporing slaat het de shaders van de game op in een map terwijl ze worden gerenderd. + Touchpad Center + Touchpad Midden - nullGpuCheckBox - Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is. + None + Geen - gameFoldersBox - Spelmap:\nDe lijst met mappen om te controleren op geïnstalleerde spellen. + graphicsAdapterGroupBox + Grafische adapter:\nIn systemen met meerdere GPU's, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies "Auto Select" om dit automatisch in te stellen. - addFolderButton - Toevoegen:\nVoeg een map toe aan de lijst. + resolutionLayout + Breedte/Hoogte:\nStelt de grootte van het emulatorvenster bij het opstarten in, wat tijdens het spelen kan worden gewijzigd.\nDit is anders dan de resolutie in de game. - removeFolderButton - Verwijderen:\nVerwijder een map uit de lijst. + heightDivider + Vblank deler:\nDe frame-rate waartegen de emulator wordt vernieuwd, vermenigvuldigd met dit getal. Dit veranderen kan nadelige effecten hebben, zoals het versnellen van het spel of het verpesten van kritieke gamefunctionaliteiten die niet verwachtten dat dit zou veranderen! - debugDump - Foutopsporing dump inschakelen:\nSlaat de import- en export-symbolen en de bestandsheaderinformatie van de momenteel draaiende PS4-toepassing op in een map. + dumpShadersCheckBox + Shaderdump inschakelen:\nVoor technische foutopsporing slaat het de shaders van de game op in een map terwijl ze worden gerenderd. - vkValidationCheckBox - Vulkan validatielaag inschakelen:\nSchakelt een systeem in dat de status van de Vulkan-renderer valideert en informatie over de interne status ervan logt. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. + nullGpuCheckBox + Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is. - vkSyncValidationCheckBox - Vulkan synchronisatievalidatie inschakelen:\nSchakelt een systeem in dat de timing van Vulkan-renderingtaken valideert. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. + gameFoldersBox + Spelmap:\nDe lijst met mappen om te controleren op geïnstalleerde spellen. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Toevoegen:\nVoeg een map toe aan de lijst. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Verwijderen:\nVerwijder een map uit de lijst. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Foutopsporing dump inschakelen:\nSlaat de import- en export-symbolen en de bestandsheaderinformatie van de momenteel draaiende PS4-toepassing op in een map. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Vulkan validatielaag inschakelen:\nSchakelt een systeem in dat de status van de Vulkan-renderer valideert en informatie over de interne status ervan logt. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Vulkan synchronisatievalidatie inschakelen:\nSchakelt een systeem in dat de timing van Vulkan-renderingtaken valideert. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - Borderless - + rdocCheckBox + RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/no_NO.ts b/src/qt_gui/translations/no_NO.ts index 60bc73fd8..4e6c2aea3 100644 --- a/src/qt_gui/translations/no_NO.ts +++ b/src/qt_gui/translations/no_NO.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Om shadPS4 + About shadPS4 + Om shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. - This software should not be used to play games you have not legally obtained. - Denne programvaren skal ikke brukes til å spille spill du ikke har fått lovlig. + This software should not be used to play games you have not legally obtained. + Denne programvaren skal ikke brukes til å spille spill du ikke har fått lovlig. - - + + CheatsPatches - Cheats / Patches for - Juks / Programrettelser for + Cheats / Patches for + Juks / Programrettelser for - defaultTextEdit_MSG - Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Ingen bilde tilgjengelig + No Image Available + Ingen bilde tilgjengelig - Serial: - Serienummer: + Serial: + Serienummer: - Version: - Versjon: + Version: + Versjon: - Size: - Størrelse: + Size: + Størrelse: - Select Cheat File: - Velg juksefil: + Select Cheat File: + Velg juksefil: - Repository: - Pakkebrønn: + Repository: + Pakkebrønn: - Download Cheats - Last ned juks + Download Cheats + Last ned juks - Delete File - Slett fil + Delete File + Slett fil - Close - Lukk + No files selected. + Ingen filer valgt. - No files selected. - Ingen filer valgt. + You can delete the cheats you don't want after downloading them. + Du kan slette juks du ikke ønsker etter å ha lastet dem ned. - You can delete the cheats you don't want after downloading them. - Du kan slette juks du ikke ønsker etter å ha lastet dem ned. + Do you want to delete the selected file?\n%1 + Ønsker du å slette den valgte filen?\n%1 - Do you want to delete the selected file?\n%1 - Ønsker du å slette den valgte filen?\n%1 + Select Patch File: + Velg programrettelse-filen: - Select Patch File: - Velg programrettelse-filen: + Download Patches + Last ned programrettelser - Download Patches - Last ned programrettelser + Save + Lagre - Save - Lagre + Cheats + Juks - Cheats - Juks + Patches + Programrettelse - Patches - Programrettelse + Error + Feil - Error - Feil + No patch selected. + Ingen programrettelse valgt. - No patch selected. - Ingen programrettelse valgt. + Unable to open files.json for reading. + Kan ikke åpne files.json for lesing. - Unable to open files.json for reading. - Kan ikke åpne files.json for lesing. + No patch file found for the current serial. + Ingen programrettelse-fil funnet for det aktuelle serienummeret. - No patch file found for the current serial. - Ingen programrettelse-fil funnet for det aktuelle serienummeret. + Unable to open the file for reading. + Kan ikke åpne filen for lesing. - Unable to open the file for reading. - Kan ikke åpne filen for lesing. + Unable to open the file for writing. + Kan ikke åpne filen for skriving. - Unable to open the file for writing. - Kan ikke åpne filen for skriving. + Failed to parse XML: + Feil ved tolkning av XML: - Failed to parse XML: - Feil ved tolkning av XML: + Success + Vellykket - Success - Vellykket + Options saved successfully. + Alternativer ble lagret. - Options saved successfully. - Alternativer ble lagret. + Invalid Source + Ugyldig kilde - Invalid Source - Ugyldig kilde + The selected source is invalid. + Den valgte kilden er ugyldig. - The selected source is invalid. - Den valgte kilden er ugyldig. + File Exists + Filen eksisterer - File Exists - Filen eksisterer + File already exists. Do you want to replace it? + Filen eksisterer allerede. Ønsker du å erstatte den? - File already exists. Do you want to replace it? - Filen eksisterer allerede. Ønsker du å erstatte den? + Failed to save file: + Kunne ikke lagre filen: - Failed to save file: - Kunne ikke lagre filen: + Failed to download file: + Kunne ikke laste ned filen: - Failed to download file: - Kunne ikke laste ned filen: + Cheats Not Found + Fant ikke juks - Cheats Not Found - Fant ikke juks + CheatsNotFound_MSG + Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. - CheatsNotFound_MSG - Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. + Cheats Downloaded Successfully + Juks ble lastet ned - Cheats Downloaded Successfully - Juks ble lastet ned + CheatsDownloadedSuccessfully_MSG + Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. - CheatsDownloadedSuccessfully_MSG - Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. + Failed to save: + Kunne ikke lagre: - Failed to save: - Kunne ikke lagre: + Failed to download: + Kunne ikke laste ned: - Failed to download: - Kunne ikke laste ned: + Download Complete + Nedlasting fullført - Download Complete - Nedlasting fullført + DownloadComplete_MSG + Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. - DownloadComplete_MSG - Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. + The game is in version: %1 + Spillet er i versjon: %1 - The game is in version: %1 - Spillet er i versjon: %1 + The downloaded patch only works on version: %1 + Den nedlastede programrettelsen fungerer bare på versjon: %1 - The downloaded patch only works on version: %1 - Den nedlastede programrettelsen fungerer bare på versjon: %1 + You may need to update your game. + Du må kanskje oppdatere spillet ditt. - You may need to update your game. - Du må kanskje oppdatere spillet ditt. + Incompatibility Notice + Inkompatibilitets-varsel - Incompatibility Notice - Inkompatibilitets-varsel + Failed to open file: + Kunne ikke åpne filen: - Failed to open file: - Kunne ikke åpne filen: + XML ERROR: + XML FEIL: - XML ERROR: - XML FEIL: + Failed to open files.json for writing + Kunne ikke åpne files.json for skriving - Failed to open files.json for writing - Kunne ikke åpne files.json for skriving + Author: + Forfatter: - Author: - Forfatter: + Directory does not exist: + Mappen eksisterer ikke: - Directory does not exist: - Mappen eksisterer ikke: + Failed to open files.json for reading. + Kunne ikke åpne files.json for lesing. - Failed to open files.json for reading. - Kunne ikke åpne files.json for lesing. + Name: + Navn: - Name: - Navn: + Can't apply cheats before the game is started + Kan ikke bruke juks før spillet er startet. - Can't apply cheats before the game is started - Kan ikke bruke juks før spillet er startet. + Close + Lukk - - + + CheckUpdate - Auto Updater - Automatisk oppdatering + Auto Updater + Automatisk oppdatering - Error - Feil + Error + Feil - Network error: - Nettverksfeil: + Network error: + Nettverksfeil: - Error_Github_limit_MSG - Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. + Error_Github_limit_MSG + Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. - Failed to parse update information. - Kunne ikke analysere oppdaterings-informasjonen. + Failed to parse update information. + Kunne ikke analysere oppdaterings-informasjonen. - No pre-releases found. - Fant ingen forhåndsutgivelser. + No pre-releases found. + Fant ingen forhåndsutgivelser. - Invalid release data. - Ugyldige utgivelsesdata. + Invalid release data. + Ugyldige utgivelsesdata. - No download URL found for the specified asset. - Ingen nedlastings-URL funnet for den spesifiserte ressursen. + No download URL found for the specified asset. + Ingen nedlastings-URL funnet for den spesifiserte ressursen. - Your version is already up to date! - Din versjon er allerede oppdatert! + Your version is already up to date! + Din versjon er allerede oppdatert! - Update Available - Oppdatering tilgjengelig + Update Available + Oppdatering tilgjengelig - Update Channel - Oppdateringskanal + Update Channel + Oppdateringskanal - Current Version - Gjeldende versjon + Current Version + Gjeldende versjon - Latest Version - Nyeste versjon + Latest Version + Nyeste versjon - Do you want to update? - Vil du oppdatere? + Do you want to update? + Vil du oppdatere? - Show Changelog - Vis endringslogg + Show Changelog + Vis endringslogg - Check for Updates at Startup - Se etter oppdateringer ved oppstart + Check for Updates at Startup + Se etter oppdateringer ved oppstart - Update - Oppdater + Update + Oppdater - No - Nei + No + Nei - Hide Changelog - Skjul endringslogg + Hide Changelog + Skjul endringslogg - Changes - Endringer + Changes + Endringer - Network error occurred while trying to access the URL - Nettverksfeil oppstod mens vi prøvde å få tilgang til URL + Network error occurred while trying to access the URL + Nettverksfeil oppstod mens vi prøvde å få tilgang til URL - Download Complete - Nedlasting fullført + Download Complete + Nedlasting fullført - The update has been downloaded, press OK to install. - Oppdateringen har blitt lastet ned, trykk OK for å installere. + The update has been downloaded, press OK to install. + Oppdateringen har blitt lastet ned, trykk OK for å installere. - Failed to save the update file at - Kunne ikke lagre oppdateringsfilen på + Failed to save the update file at + Kunne ikke lagre oppdateringsfilen på - Starting Update... - Starter oppdatering... + Starting Update... + Starter oppdatering... - Failed to create the update script file - Kunne ikke opprette oppdateringsskriptfilen + Failed to create the update script file + Kunne ikke opprette oppdateringsskriptfilen - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Henter kompatibilitetsdata, vennligst vent + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vennligst vent - Cancel - Avbryt + Cancel + Avbryt - Loading... - Laster... + Loading... + Laster... - Error - Feil + Error + Feil - Unable to update compatibility data! Try again later. - Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. + Unable to update compatibility data! Try again later. + Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. - Unable to open compatibility_data.json for writing. - Kan ikke åpne compatibility_data.json for skriving. + Unable to open compatibility_data.json for writing. + Kan ikke åpne compatibility_data.json for skriving. - Unknown - Ukjent + Unknown + Ukjent - Nothing - Ingenting + Nothing + Ingenting - Boots - Starter opp + Boots + Starter opp - Menus - Menyene + Menus + Menyene - Ingame - I spill + Ingame + I spill - Playable - Spillbar + Playable + Spillbar - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Åpne mappe + Open Folder + Åpne mappe - - + + GameInfoClass - Loading game list, please wait :3 - Laster spill-liste, vennligst vent :3 + Loading game list, please wait :3 + Laster spill-liste, vennligst vent :3 - Cancel - Avbryt + Cancel + Avbryt - Loading... - Laster... + Loading... + Laster... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Velg mappe + shadPS4 - Choose directory + shadPS4 - Velg mappe - Directory to install games - Mappe for å installere spill + Directory to install games + Mappe for å installere spill - Browse - Bla gjennom + Browse + Bla gjennom - Error - Feil + Error + Feil - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikon + Icon + Ikon - Name - Navn + Name + Navn - Serial - Serienummer + Serial + Serienummer - Compatibility - Kompatibilitet + Compatibility + Kompatibilitet - Region - Region + Region + Region - Firmware - Fastvare + Firmware + Fastvare - Size - Størrelse + Size + Størrelse - Version - Versjon + Version + Versjon - Path - Adresse + Path + Adresse - Play Time - Spilletid + Play Time + Spilletid - Never Played - Aldri spilt + Never Played + Aldri spilt - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - kompatibilitet er utestet + Compatibility is untested + kompatibilitet er utestet - Game does not initialize properly / crashes the emulator - Spillet initialiseres ikke riktig / krasjer emulatoren + Game does not initialize properly / crashes the emulator + Spillet initialiseres ikke riktig / krasjer emulatoren - Game boots, but only displays a blank screen - Spillet starter, men viser bare en tom skjerm + Game boots, but only displays a blank screen + Spillet starter, men viser bare en tom skjerm - Game displays an image but does not go past the menu - Spillet viser et bilde, men går ikke forbi menyen + Game displays an image but does not go past the menu + Spillet viser et bilde, men går ikke forbi menyen - Game has game-breaking glitches or unplayable performance - Spillet har spillbrytende feil eller uspillbar ytelse + Game has game-breaking glitches or unplayable performance + Spillet har spillbrytende feil eller uspillbar ytelse - Game can be completed with playable performance and no major glitches - Spillet kan fullføres med spillbar ytelse og uten store feil + Game can be completed with playable performance and no major glitches + Spillet kan fullføres med spillbar ytelse og uten store feil - Click to see details on github - Klikk for å se detaljer på GitHub + Click to see details on github + Klikk for å se detaljer på GitHub - Last updated - Sist oppdatert + Last updated + Sist oppdatert - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Lag snarvei + Create Shortcut + Lag snarvei - Cheats / Patches - Juks / Programrettelse + Cheats / Patches + Juks / Programrettelse - SFO Viewer - SFO viser + SFO Viewer + SFO viser - Trophy Viewer - Trofé viser + Trophy Viewer + Trofé viser - Open Folder... - Åpne mappe... + Open Folder... + Åpne mappe... - Open Game Folder - Åpne spillmappen + Open Game Folder + Åpne spillmappen - Open Save Data Folder - Åpne lagrede datamappen + Open Save Data Folder + Åpne lagrede datamappen - Open Log Folder - Åpne loggmappen + Open Log Folder + Åpne loggmappen - Copy info... - Kopier info... + Copy info... + Kopier info... - Copy Name - Kopier navn + Copy Name + Kopier navn - Copy Serial - Kopier serienummer + Copy Serial + Kopier serienummer - Copy Version - Kopier versjon + Copy Version + Kopier versjon - Copy Size - Kopier størrelse + Copy Size + Kopier størrelse - Copy All - Kopier alt + Copy All + Kopier alt - Delete... - Slett... + Delete... + Slett... - Delete Game - Slett spill + Delete Game + Slett spill - Delete Update - Slett oppdatering + Delete Update + Slett oppdatering - Delete DLC - Slett DLC + Delete DLC + Slett DLC - Compatibility... - Kompatibilitet... + Compatibility... + Kompatibilitet... - Update database - Oppdater database + Update database + Oppdater database - View report - Vis rapport + View report + Vis rapport - Submit a report - Send inn en rapport + Submit a report + Send inn en rapport - Shortcut creation - Snarvei opprettelse + Shortcut creation + Snarvei opprettelse - Shortcut created successfully! - Snarvei opprettet! + Shortcut created successfully! + Snarvei opprettet! - Error - Feil + Error + Feil - Error creating shortcut! - Feil ved opprettelse av snarvei! + Error creating shortcut! + Feil ved opprettelse av snarvei! - Install PKG - Installer PKG + Install PKG + Installer PKG - Game - Spill + Game + Spill - This game has no update to delete! - Dette spillet har ingen oppdatering å slette! + This game has no update to delete! + Dette spillet har ingen oppdatering å slette! - Update - Oppdater + Update + Oppdater - This game has no DLC to delete! - Dette spillet har ingen DLC å slette! + This game has no DLC to delete! + Dette spillet har ingen DLC å slette! - DLC - DLC + DLC + DLC - Delete %1 - Slett %1 + Delete %1 + Slett %1 - Are you sure you want to delete %1's %2 directory? - Er du sikker på at du vil slette %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + Er du sikker på at du vil slette %1's %2 directory? - Open Update Folder - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Velg mappe + shadPS4 - Choose directory + shadPS4 - Velg mappe - Select which directory you want to install to. - Velg hvilken mappe du vil installere til. + Select which directory you want to install to. + Velg hvilken mappe du vil installere til. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Åpne/Legg til Elf-mappe + Open/Add Elf Folder + Åpne/Legg til Elf-mappe - Install Packages (PKG) - Installer pakker (PKG) + Install Packages (PKG) + Installer pakker (PKG) - Boot Game - Start spill + Boot Game + Start spill - Check for Updates - Se etter oppdateringer + Check for Updates + Se etter oppdateringer - About shadPS4 - Om shadPS4 + About shadPS4 + Om shadPS4 - Configure... - Konfigurer... + Configure... + Konfigurer... - Install application from a .pkg file - Installer fra en .pkg fil + Install application from a .pkg file + Installer fra en .pkg fil - Recent Games - Nylige spill + Recent Games + Nylige spill - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Avslutt + Exit + Avslutt - Exit shadPS4 - Avslutt shadPS4 + Exit shadPS4 + Avslutt shadPS4 - Exit the application. - Avslutt programmet. + Exit the application. + Avslutt programmet. - Show Game List - Vis spill-listen + Show Game List + Vis spill-listen - Game List Refresh - Oppdater spill-listen + Game List Refresh + Oppdater spill-listen - Tiny - Bitteliten + Tiny + Bitteliten - Small - Liten + Small + Liten - Medium - Medium + Medium + Medium - Large - Stor + Large + Stor - List View - Liste-visning + List View + Liste-visning - Grid View - Rute-visning + Grid View + Rute-visning - Elf Viewer - Elf-visning + Elf Viewer + Elf-visning - Game Install Directory - Spillinstallasjons-mappe + Game Install Directory + Spillinstallasjons-mappe - Download Cheats/Patches - Last ned juks/programrettelse + Download Cheats/Patches + Last ned juks/programrettelse - Dump Game List - Dump spill-liste + Dump Game List + Dump spill-liste - PKG Viewer - PKG viser + PKG Viewer + PKG viser - Search... - Søk... + Search... + Søk... - File - Fil + File + Fil - View - Oversikt + View + Oversikt - Game List Icons - Spill-liste ikoner + Game List Icons + Spill-liste ikoner - Game List Mode - Spill-liste modus + Game List Mode + Spill-liste modus - Settings - Innstillinger + Settings + Innstillinger - Utils - Verktøy + Utils + Verktøy - Themes - Tema + Themes + Tema - Help - Hjelp + Help + Hjelp - Dark - Mørk + Dark + Mørk - Light - Lys + Light + Lys - Green - Grønn + Green + Grønn - Blue - Blå + Blue + Blå - Violet - Lilla + Violet + Lilla - toolBar - Verktøylinje + toolBar + Verktøylinje - Game List - Spill-liste + Game List + Spill-liste - * Unsupported Vulkan Version - * Ustøttet Vulkan-versjon + * Unsupported Vulkan Version + * Ustøttet Vulkan-versjon - Download Cheats For All Installed Games - Last ned juks for alle installerte spill + Download Cheats For All Installed Games + Last ned juks for alle installerte spill - Download Patches For All Games - Last ned programrettelser for alle spill + Download Patches For All Games + Last ned programrettelser for alle spill - Download Complete - Nedlasting fullført + Download Complete + Nedlasting fullført - You have downloaded cheats for all the games you have installed. - Du har lastet ned juks for alle spillene du har installert. + You have downloaded cheats for all the games you have installed. + Du har lastet ned juks for alle spillene du har installert. - Patches Downloaded Successfully! - Programrettelser ble lastet ned! + Patches Downloaded Successfully! + Programrettelser ble lastet ned! - All Patches available for all games have been downloaded. - Programrettelser tilgjengelige for alle spill har blitt lastet ned. + All Patches available for all games have been downloaded. + Programrettelser tilgjengelige for alle spill har blitt lastet ned. - Games: - Spill: + Games: + Spill: - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) - Game Boot - Spilloppstart + Game Boot + Spilloppstart - Only one file can be selected! - Kun én fil kan velges! + Only one file can be selected! + Kun én fil kan velges! - PKG Extraction - PKG-utpakking + PKG Extraction + PKG-utpakking - Patch detected! - Programrettelse oppdaget! + Patch detected! + Programrettelse oppdaget! - PKG and Game versions match: - PKG og spillversjoner stemmer overens: + PKG and Game versions match: + PKG og spillversjoner stemmer overens: - Would you like to overwrite? - Ønsker du å overskrive? + Would you like to overwrite? + Ønsker du å overskrive? - PKG Version %1 is older than installed version: - PKG-versjon %1 er eldre enn installert versjon: + PKG Version %1 is older than installed version: + PKG-versjon %1 er eldre enn installert versjon: - Game is installed: - Spillet er installert: + Game is installed: + Spillet er installert: - Would you like to install Patch: - Ønsker du å installere programrettelsen: + Would you like to install Patch: + Ønsker du å installere programrettelsen: - DLC Installation - DLC installasjon + DLC Installation + DLC installasjon - Would you like to install DLC: %1? - Ønsker du å installere DLC: %1? + Would you like to install DLC: %1? + Ønsker du å installere DLC: %1? - DLC already installed: - DLC allerede installert: + DLC already installed: + DLC allerede installert: - Game already installed - Spillet er allerede installert + Game already installed + Spillet er allerede installert - PKG ERROR - PKG FEIL + PKG ERROR + PKG FEIL - Extracting PKG %1/%2 - Pakker ut PKG %1/%2 + Extracting PKG %1/%2 + Pakker ut PKG %1/%2 - Extraction Finished - Utpakking fullført + Extraction Finished + Utpakking fullført - Game successfully installed at %1 - Spillet ble installert i %1 + Game successfully installed at %1 + Spillet ble installert i %1 - File doesn't appear to be a valid PKG file - Filen ser ikke ut til å være en gyldig PKG-fil + File doesn't appear to be a valid PKG file + Filen ser ikke ut til å være en gyldig PKG-fil - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Åpne mappe + Open Folder + Åpne mappe - Name - Navn + PKG ERROR + PKG FEIL - Serial - Serienummer + Name + Navn - Installed - + Serial + Serienummer - Size - Størrelse + Installed + Installed - Category - + Size + Størrelse - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Region + FW + FW - Flags - + Region + Region - Path - Adresse + Flags + Flags - File - Fil + Path + Adresse - PKG ERROR - PKG FEIL + File + Fil - Unknown - Ukjent + Unknown + Ukjent - Package - + Package + Package - - + + SettingsDialog - Settings - Innstillinger + Settings + Innstillinger - General - Generell + General + Generell - System - System + System + System - Console Language - Konsollspråk + Console Language + Konsollspråk - Emulator Language - Emulatorspråk + Emulator Language + Emulatorspråk - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Aktiver fullskjerm + Enable Fullscreen + Aktiver fullskjerm - Fullscreen Mode - Fullskjermmodus + Fullscreen Mode + Fullskjermmodus - Enable Separate Update Folder - Aktiver seperat oppdateringsmappe + Enable Separate Update Folder + Aktiver seperat oppdateringsmappe - Default tab when opening settings - Standardfanen når innstillingene åpnes + Default tab when opening settings + Standardfanen når innstillingene åpnes - Show Game Size In List - Vis spillstørrelse i listen + Show Game Size In List + Vis spillstørrelse i listen - Show Splash - Vis velkomstbilde + Show Splash + Vis velkomstbilde - Enable Discord Rich Presence - Aktiver Discord Rich Presence + Enable Discord Rich Presence + Aktiver Discord Rich Presence - Username - Brukernavn + Username + Brukernavn - Trophy Key - Trofénøkkel + Trophy Key + Trofénøkkel - Trophy - Trofé + Trophy + Trofé - Logger - Logger + Logger + Logger - Log Type - Logg type + Log Type + Logg type - Log Filter - Logg filter + Log Filter + Logg filter - Open Log Location - Åpne loggplassering + Open Log Location + Åpne loggplassering - Input - Inndata + Input + Inndata - Cursor - Musepeker + Cursor + Musepeker - Hide Cursor - Skjul musepeker + Hide Cursor + Skjul musepeker - Hide Cursor Idle Timeout - Skjul musepeker ved inaktivitet + Hide Cursor Idle Timeout + Skjul musepeker ved inaktivitet - s - s + s + s - Controller - Kontroller + Controller + Kontroller - Back Button Behavior - Tilbakeknapp atferd + Back Button Behavior + Tilbakeknapp atferd - Graphics - Grafikk + Graphics + Grafikk - GUI - Grensesnitt + GUI + Grensesnitt - User - Bruker + User + Bruker - Graphics Device - Grafikkenhet + Graphics Device + Grafikkenhet - Width - Bredde + Width + Bredde - Height - Høyde + Height + Høyde - Vblank Divider - Vblank skillelinje + Vblank Divider + Vblank skillelinje - Advanced - Avansert + Advanced + Avansert - Enable Shaders Dumping - Aktiver skyggeleggerdumping + Enable Shaders Dumping + Aktiver skyggeleggerdumping - Enable NULL GPU - Aktiver NULL GPU + Enable NULL GPU + Aktiver NULL GPU - Paths - Mapper + Enable HDR + Enable HDR - Game Folders - Spillmapper + Paths + Mapper - Add... - Legg til... + Game Folders + Spillmapper - Remove - Fjern + Add... + Legg til... - Save Data Path - Lagrede datamappe + Remove + Fjern - Browse - Endre mappe + Debug + Feilretting - saveDataBox - Lagrede datamappe:\nListe over data shadPS4 lagrer. + Enable Debug Dumping + Aktiver feilrettingsdumping - browseButton - Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. + Enable Vulkan Validation Layers + Aktiver Vulkan Validation Layers - Debug - Feilretting + Enable Vulkan Synchronization Validation + Aktiver Vulkan synkroniseringslag - Enable Debug Dumping - Aktiver feilrettingsdumping + Enable RenderDoc Debugging + Aktiver RenderDoc feilretting - Enable Vulkan Validation Layers - Aktiver Vulkan Validation Layers + Enable Crash Diagnostics + Aktiver krasjdiagnostikk - Enable Vulkan Synchronization Validation - Aktiver Vulkan synkroniseringslag + Collect Shaders + Lagre skyggeleggere - Enable RenderDoc Debugging - Aktiver RenderDoc feilretting + Copy GPU Buffers + Kopier GPU-buffere - Enable Crash Diagnostics - Aktiver krasjdiagnostikk + Host Debug Markers + Vertsfeilsøkingsmarkører - Collect Shaders - Lagre skyggeleggere + Guest Debug Markers + Gjestefeilsøkingsmarkører - Copy GPU Buffers - Kopier GPU-buffere + Update + Oppdatering - Host Debug Markers - Vertsfeilsøkingsmarkører + Check for Updates at Startup + Se etter oppdateringer ved oppstart - Guest Debug Markers - Gjestefeilsøkingsmarkører + Always Show Changelog + Always Show Changelog - Update - Oppdatering + Update Channel + Oppdateringskanal - Check for Updates at Startup - Se etter oppdateringer ved oppstart + Check for Updates + Se etter oppdateringer - Update Channel - Oppdateringskanal + GUI Settings + Grensesnitt-innstillinger - Check for Updates - Se etter oppdateringer + Title Music + Tittelmusikk - GUI Settings - Grensesnitt-innstillinger + Disable Trophy Pop-ups + Deaktiver trofé hurtigmeny - Title Music - Tittelmusikk + Background Image + Bakgrunnsbilde - Disable Trophy Pop-ups - Deaktiver trofé hurtigmeny + Show Background Image + Vis bakgrunnsbilde - Background Image - Bakgrunnsbilde + Opacity + Synlighet - Show Background Image - Vis bakgrunnsbilde + Play title music + Spill tittelmusikk - Opacity - Synlighet + Update Compatibility Database On Startup + Oppdater database ved oppstart - Play title music - Spill tittelmusikk + Game Compatibility + Spill kompatibilitet - Update Compatibility Database On Startup - Oppdater database ved oppstart + Display Compatibility Data + Vis kompatibilitets-data - Game Compatibility - Spill kompatibilitet + Update Compatibility Database + Oppdater kompatibilitets-database - Display Compatibility Data - Vis kompatibilitets-data + Volume + Volum - Update Compatibility Database - Oppdater kompatibilitets-database + Save + Lagre - Volume - Volum + Apply + Bruk - Save - Lagre + Restore Defaults + Gjenopprett standardinnstillinger - Apply - Bruk + Close + Lukk - Restore Defaults - Gjenopprett standardinnstillinger + Point your mouse at an option to display its description. + Pek musen over et alternativ for å vise beskrivelsen. - Close - Lukk + consoleLanguageGroupBox + Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. - Point your mouse at an option to display its description. - Pek musen over et alternativ for å vise beskrivelsen. + emulatorLanguageGroupBox + Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. - consoleLanguageGroupBox - Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. + fullscreenCheckBox + Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. - emulatorLanguageGroupBox - Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. + separateUpdatesCheckBox + Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. - fullscreenCheckBox - Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. + showSplashCheckBox + Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. - separateUpdatesCheckBox - Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. + discordRPCCheckbox + Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. - showSplashCheckBox - Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. + userName + Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. - discordRPCCheckbox - Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. + TrophyKey + Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. - userName - Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. + logTypeGroupBox + Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. - TrophyKey - Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. + logFilter + Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. - logTypeGroupBox - Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. + updaterGroupBox + Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. - logFilter - Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. + GUIBackgroundImageGroupBox + Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. - updaterGroupBox - Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. + GUIMusicGroupBox + Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. - GUIBackgroundImageGroupBox - Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. + disableTrophycheckBox + Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). - GUIMusicGroupBox - Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. + hideCursorGroupBox + Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. - disableTrophycheckBox - Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). + idleTimeoutGroupBox + Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. - hideCursorGroupBox - Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. + backButtonBehaviorGroupBox + Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. - idleTimeoutGroupBox - Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. + enableCompatibilityCheckBox + Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. - backButtonBehaviorGroupBox - Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. + checkCompatibilityOnStartupCheckBox + Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. - enableCompatibilityCheckBox - Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. + updateCompatibilityButton + Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. - checkCompatibilityOnStartupCheckBox - Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. + Never + Aldri - updateCompatibilityButton - Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. + Idle + Inaktiv - Never - Aldri + Always + Alltid - Idle - Inaktiv + Touchpad Left + Berøringsplate Venstre - Always - Alltid + Touchpad Right + Berøringsplate Høyre - Touchpad Left - Berøringsplate Venstre + Touchpad Center + Berøringsplate Midt - Touchpad Right - Berøringsplate Høyre + None + Ingen - Touchpad Center - Berøringsplate Midt + graphicsAdapterGroupBox + Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. - None - Ingen + resolutionLayout + Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. - graphicsAdapterGroupBox - Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. + heightDivider + Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! - resolutionLayout - Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. + dumpShadersCheckBox + Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. - heightDivider - Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! + nullGpuCheckBox + Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. - dumpShadersCheckBox - Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. + enableHDRCheckBox + enableHDRCheckBox - nullGpuCheckBox - Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. + gameFoldersBox + Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. - gameFoldersBox - Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. + addFolderButton + Legg til:\nLegg til en mappe til listen. - addFolderButton - Legg til:\nLegg til en mappe til listen. + removeFolderButton + Fjern:\nFjern en mappe fra listen. - removeFolderButton - Fjern:\nFjern en mappe fra listen. + debugDump + Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. - debugDump - Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. + vkValidationCheckBox + Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - vkValidationCheckBox - Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + vkSyncValidationCheckBox + Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - vkSyncValidationCheckBox - Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + rdocCheckBox + Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. - rdocCheckBox - Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. + collectShaderCheckBox + Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). - collectShaderCheckBox - Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). + crashDiagnosticsCheckBox + Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. - crashDiagnosticsCheckBox - Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. + copyGPUBuffersCheckBox + Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. - copyGPUBuffersCheckBox - Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. + hostMarkersCheckBox + Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - hostMarkersCheckBox - Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + guestMarkersCheckBox + Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - guestMarkersCheckBox - Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + saveDataBox + Lagrede datamappe:\nListe over data shadPS4 lagrer. - Borderless - + browseButton + Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. - True - + Borderless + Borderless - Enable HDR - + True + True - Release - + Release + Release - Nightly - + Nightly + Nightly - Always Show Changelog - + Set the volume of the background music. + Set the volume of the background music. - Set the volume of the background music. - + Enable Motion Controls + Enable Motion Controls - Enable Motion Controls - + Save Data Path + Lagrede datamappe - async - + Browse + Endre mappe - sync - + async + async - Auto Select - + sync + sync - Directory to install games - Mappe for å installere spill + Auto Select + Auto Select - Directory to save data - + Directory to install games + Mappe for å installere spill - enableHDRCheckBox - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trofé viser + Trophy Viewer + Trofé viser - + diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 99420f89e..d34d38112 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - O programie + About shadPS4 + O programie - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. - This software should not be used to play games you have not legally obtained. - To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła. + This software should not be used to play games you have not legally obtained. + To oprogramowanie nie służy do grania w gry pochodzące z nielegalnego źródła. - - + + CheatsPatches - Cheats / Patches for - Kody / Łatki dla + Cheats / Patches for + Kody / Łatki dla - defaultTextEdit_MSG - Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Brak dostępnego obrazu + No Image Available + Brak dostępnego obrazu - Serial: - Numer seryjny: + Serial: + Numer seryjny: - Version: - Wersja: + Version: + Wersja: - Size: - Rozmiar: + Size: + Rozmiar: - Select Cheat File: - Wybierz plik kodu: + Select Cheat File: + Wybierz plik kodu: - Repository: - Repozytorium: + Repository: + Repozytorium: - Download Cheats - Pobierz kody + Download Cheats + Pobierz kody - Do you want to delete the selected file?\n%1 - Czy chcesz usunąć wybrany plik?\n%1 + Delete File + Delete File - Select Patch File: - Wybierz plik poprawki: + No files selected. + No files selected. - Download Patches - Pobierz poprawki + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. - Save - Zapisz + Do you want to delete the selected file?\n%1 + Czy chcesz usunąć wybrany plik?\n%1 - Cheats - Kody + Select Patch File: + Wybierz plik poprawki: - Patches - Poprawki + Download Patches + Pobierz poprawki - Error - Błąd + Save + Zapisz - No patch selected. - Nie wybrano poprawki. + Cheats + Kody - Unable to open files.json for reading. - Nie można otworzyć pliku files.json do odczytu. + Patches + Poprawki - No patch file found for the current serial. - Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. + Error + Błąd - Unable to open the file for reading. - Nie można otworzyć pliku do odczytu. + No patch selected. + Nie wybrano poprawki. - Unable to open the file for writing. - Nie można otworzyć pliku do zapisu. + Unable to open files.json for reading. + Nie można otworzyć pliku files.json do odczytu. - Failed to parse XML: - Nie udało się przeanalizować XML: + No patch file found for the current serial. + Nie znaleziono pliku poprawki dla bieżącego numeru seryjnego. - Success - Sukces + Unable to open the file for reading. + Nie można otworzyć pliku do odczytu. - Options saved successfully. - Opcje zostały pomyślnie zapisane. + Unable to open the file for writing. + Nie można otworzyć pliku do zapisu. - Invalid Source - Nieprawidłowe źródło + Failed to parse XML: + Nie udało się przeanalizować XML: - The selected source is invalid. - Wybrane źródło jest nieprawidłowe. + Success + Sukces - File Exists - Plik istnieje + Options saved successfully. + Opcje zostały pomyślnie zapisane. - File already exists. Do you want to replace it? - Plik już istnieje. Czy chcesz go zastąpić? + Invalid Source + Nieprawidłowe źródło - Failed to save file: - Nie udało się zapisać pliku: + The selected source is invalid. + Wybrane źródło jest nieprawidłowe. - Failed to download file: - Nie udało się pobrać pliku: + File Exists + Plik istnieje - Cheats Not Found - Nie znaleziono kodów + File already exists. Do you want to replace it? + Plik już istnieje. Czy chcesz go zastąpić? - CheatsNotFound_MSG - Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. + Failed to save file: + Nie udało się zapisać pliku: - Cheats Downloaded Successfully - Kody pobrane pomyślnie + Failed to download file: + Nie udało się pobrać pliku: - CheatsDownloadedSuccessfully_MSG - Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. + Cheats Not Found + Nie znaleziono kodów - Failed to save: - Nie udało się zapisać: + CheatsNotFound_MSG + Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. - Failed to download: - Nie udało się pobrać: + Cheats Downloaded Successfully + Kody pobrane pomyślnie - Download Complete - Pobieranie zakończone + CheatsDownloadedSuccessfully_MSG + Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. - DownloadComplete_MSG - Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. + Failed to save: + Nie udało się zapisać: - Failed to parse JSON data from HTML. - Nie udało się przeanalizować danych JSON z HTML. + Failed to download: + Nie udało się pobrać: - Failed to retrieve HTML page. - Nie udało się pobrać strony HTML. + Download Complete + Pobieranie zakończone - The game is in version: %1 - Gra jest w wersji: %1 + DownloadComplete_MSG + Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. - The downloaded patch only works on version: %1 - Pobrana łatka działa tylko w wersji: %1 + Failed to parse JSON data from HTML. + Nie udało się przeanalizować danych JSON z HTML. - You may need to update your game. - Możesz potrzebować zaktualizować swoją grę. + Failed to retrieve HTML page. + Nie udało się pobrać strony HTML. - Incompatibility Notice - Powiadomienie o niezgodności + The game is in version: %1 + Gra jest w wersji: %1 - Failed to open file: - Nie udało się otworzyć pliku: + The downloaded patch only works on version: %1 + Pobrana łatka działa tylko w wersji: %1 - XML ERROR: - BŁĄD XML: + You may need to update your game. + Możesz potrzebować zaktualizować swoją grę. - Failed to open files.json for writing - Nie udało się otworzyć pliku files.json do zapisu + Incompatibility Notice + Powiadomienie o niezgodności - Author: - Autor: + Failed to open file: + Nie udało się otworzyć pliku: - Directory does not exist: - Katalog nie istnieje: + XML ERROR: + BŁĄD XML: - Can't apply cheats before the game is started - Nie można zastosować kodów przed uruchomieniem gry. + Failed to open files.json for writing + Nie udało się otworzyć pliku files.json do zapisu - Delete File - + Author: + Autor: - No files selected. - + Directory does not exist: + Katalog nie istnieje: - You can delete the cheats you don't want after downloading them. - + Failed to open files.json for reading. + Failed to open files.json for reading. - Close - Zamknij + Name: + Name: - Failed to open files.json for reading. - + Can't apply cheats before the game is started + Nie można zastosować kodów przed uruchomieniem gry. - Name: - + Close + Zamknij - - + + CheckUpdate - Auto Updater - Automatyczne aktualizacje + Auto Updater + Automatyczne aktualizacje - Error - Błąd + Error + Błąd - Network error: - Błąd sieci: + Network error: + Błąd sieci: - Error_Github_limit_MSG - Automatyczna aktualizacja umożliwia maksymalnie 60 sprawdzeń aktualizacji na godzinę.\nOsiągnąłeś ten limit. Spróbuj ponownie później. + Error_Github_limit_MSG + Automatyczna aktualizacja umożliwia maksymalnie 60 sprawdzeń aktualizacji na godzinę.\nOsiągnąłeś ten limit. Spróbuj ponownie później. - Failed to parse update information. - Nie udało się sparsować informacji o aktualizacji. + Failed to parse update information. + Nie udało się sparsować informacji o aktualizacji. - No pre-releases found. - Nie znaleziono wersji przedpremierowych. + No pre-releases found. + Nie znaleziono wersji przedpremierowych. - Invalid release data. - Nieprawidłowe dane wydania. + Invalid release data. + Nieprawidłowe dane wydania. - No download URL found for the specified asset. - Nie znaleziono adresu URL do pobrania dla określonego zasobu. + No download URL found for the specified asset. + Nie znaleziono adresu URL do pobrania dla określonego zasobu. - Your version is already up to date! - Twoja wersja jest już aktualna! + Your version is already up to date! + Twoja wersja jest już aktualna! - Update Available - Dostępna aktualizacja + Update Available + Dostępna aktualizacja - Update Channel - Kanał Aktualizacji + Update Channel + Kanał Aktualizacji - Current Version - Aktualna wersja + Current Version + Aktualna wersja - Latest Version - Ostatnia wersja + Latest Version + Ostatnia wersja - Do you want to update? - Czy chcesz zaktualizować? + Do you want to update? + Czy chcesz zaktualizować? - Show Changelog - Pokaż zmiany + Show Changelog + Pokaż zmiany - Check for Updates at Startup - Sprawdź aktualizacje przy starcie + Check for Updates at Startup + Sprawdź aktualizacje przy starcie - Update - Aktualizuj + Update + Aktualizuj - No - Nie + No + Nie - Hide Changelog - Ukryj zmiany + Hide Changelog + Ukryj zmiany - Changes - Zmiany + Changes + Zmiany - Network error occurred while trying to access the URL - Błąd sieci wystąpił podczas próby uzyskania dostępu do URL + Network error occurred while trying to access the URL + Błąd sieci wystąpił podczas próby uzyskania dostępu do URL - Download Complete - Pobieranie zakończone + Download Complete + Pobieranie zakończone - The update has been downloaded, press OK to install. - Aktualizacja została pobrana, naciśnij OK, aby zainstalować. + The update has been downloaded, press OK to install. + Aktualizacja została pobrana, naciśnij OK, aby zainstalować. - Failed to save the update file at - Nie udało się zapisać pliku aktualizacji w + Failed to save the update file at + Nie udało się zapisać pliku aktualizacji w - Starting Update... - Rozpoczynanie aktualizacji... + Starting Update... + Rozpoczynanie aktualizacji... - Failed to create the update script file - Nie udało się utworzyć pliku skryptu aktualizacji + Failed to create the update script file + Nie udało się utworzyć pliku skryptu aktualizacji - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Pobieranie danych o kompatybilności, proszę czekać + Fetching compatibility data, please wait + Pobieranie danych o kompatybilności, proszę czekać - Cancel - Anuluj + Cancel + Anuluj - Loading... - Ładowanie... + Loading... + Ładowanie... - Error - Błąd + Error + Błąd - Unable to update compatibility data! Try again later. - Nie można zaktualizować danych o kompatybilności! Spróbuj ponownie później. + Unable to update compatibility data! Try again later. + Nie można zaktualizować danych o kompatybilności! Spróbuj ponownie później. - Unable to open compatibility_data.json for writing. - Nie można otworzyć pliku compatibility_data.json do zapisu. + Unable to open compatibility_data.json for writing. + Nie można otworzyć pliku compatibility_data.json do zapisu. - Unknown - Nieznany + Unknown + Nieznany - Nothing - Nic + Nothing + Nic - Boots - Buty + Boots + Buty - Menus - Menu + Menus + Menu - Ingame - W grze + Ingame + W grze - Playable - Do grania + Playable + Do grania - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Otwórz folder + Open Folder + Otwórz folder - - + + GameInfoClass - Loading game list, please wait :3 - Ładowanie listy gier, proszę poczekaj :3 + Loading game list, please wait :3 + Ładowanie listy gier, proszę poczekaj :3 - Cancel - Anuluj + Cancel + Anuluj - Loading... - Ładowanie... + Loading... + Ładowanie... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Wybierz katalog + shadPS4 - Choose directory + shadPS4 - Wybierz katalog - Directory to install games - Katalog do instalacji gier + Directory to install games + Katalog do instalacji gier - Browse - Przeglądaj + Browse + Przeglądaj - Error - Błąd + Error + Błąd - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikona + Icon + Ikona - Name - Nazwa + Name + Nazwa - Serial - Numer seryjny + Serial + Numer seryjny - Compatibility - Zgodność + Compatibility + Zgodność - Region - Region + Region + Region - Firmware - Oprogramowanie + Firmware + Oprogramowanie - Size - Rozmiar + Size + Rozmiar - Version - Wersja + Version + Wersja - Path - Ścieżka + Path + Ścieżka - Play Time - Czas gry + Play Time + Czas gry - Never Played - Nigdy nie grane + Never Played + Nigdy nie grane - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Kompatybilność nie została przetestowana + Compatibility is untested + Kompatybilność nie została przetestowana - Game does not initialize properly / crashes the emulator - Gra nie inicjuje się poprawnie / zawiesza się emulator + Game does not initialize properly / crashes the emulator + Gra nie inicjuje się poprawnie / zawiesza się emulator - Game boots, but only displays a blank screen - Gra uruchamia się, ale wyświetla tylko pusty ekran + Game boots, but only displays a blank screen + Gra uruchamia się, ale wyświetla tylko pusty ekran - Game displays an image but does not go past the menu - Gra wyświetla obraz, ale nie przechodzi do menu + Game displays an image but does not go past the menu + Gra wyświetla obraz, ale nie przechodzi do menu - Game has game-breaking glitches or unplayable performance - Gra ma usterki przerywające rozgrywkę lub niegrywalną wydajność + Game has game-breaking glitches or unplayable performance + Gra ma usterki przerywające rozgrywkę lub niegrywalną wydajność - Game can be completed with playable performance and no major glitches - Grę można ukończyć z grywalną wydajnością i bez większych usterek + Game can be completed with playable performance and no major glitches + Grę można ukończyć z grywalną wydajnością i bez większych usterek - Click to see details on github - Kliknij, aby zobaczyć szczegóły na GitHub + Click to see details on github + Kliknij, aby zobaczyć szczegóły na GitHub - Last updated - Ostatnia aktualizacja + Last updated + Ostatnia aktualizacja - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Utwórz skrót + Create Shortcut + Utwórz skrót - Cheats / Patches - Kody / poprawki + Cheats / Patches + Kody / poprawki - SFO Viewer - Menedżer plików SFO + SFO Viewer + Menedżer plików SFO - Trophy Viewer - Menedżer trofeów + Trophy Viewer + Menedżer trofeów - Open Folder... - Otwórz Folder... + Open Folder... + Otwórz Folder... - Open Game Folder - Otwórz Katalog Gry + Open Game Folder + Otwórz Katalog Gry - Open Save Data Folder - Otwórz Folder Danych Zapisów + Open Save Data Folder + Otwórz Folder Danych Zapisów - Open Log Folder - Otwórz Folder Dziennika + Open Log Folder + Otwórz Folder Dziennika - Copy info... - Kopiuj informacje... + Copy info... + Kopiuj informacje... - Copy Name - Kopiuj nazwę + Copy Name + Kopiuj nazwę - Copy Serial - Kopiuj numer seryjny + Copy Serial + Kopiuj numer seryjny - Copy All - Kopiuj wszystko + Copy Version + Copy Version - Delete... - Usuń... + Copy Size + Copy Size - Delete Game - Usuń Grę + Copy All + Kopiuj wszystko - Delete Update - Usuń Aktualizację + Delete... + Usuń... - Delete DLC - Usuń DLC + Delete Game + Usuń Grę - Compatibility... - kompatybilność... + Delete Update + Usuń Aktualizację - Update database - Zaktualizuj bazę danych + Delete DLC + Usuń DLC - View report - Wyświetl zgłoszenie + Compatibility... + kompatybilność... - Submit a report - Wyślij zgłoszenie + Update database + Zaktualizuj bazę danych - Shortcut creation - Tworzenie skrótu + View report + Wyświetl zgłoszenie - Shortcut created successfully! - Utworzenie skrótu zakończone pomyślnie! + Submit a report + Wyślij zgłoszenie - Error - Błąd + Shortcut creation + Tworzenie skrótu - Error creating shortcut! - Utworzenie skrótu zakończone niepowodzeniem! + Shortcut created successfully! + Utworzenie skrótu zakończone pomyślnie! - Install PKG - Zainstaluj PKG + Error + Błąd - Game - Gra + Error creating shortcut! + Utworzenie skrótu zakończone niepowodzeniem! - This game has no update to delete! - Ta gra nie ma aktualizacji do usunięcia! + Install PKG + Zainstaluj PKG - Update - Aktualizacja + Game + Gra - This game has no DLC to delete! - Ta gra nie ma DLC do usunięcia! + This game has no update to delete! + Ta gra nie ma aktualizacji do usunięcia! - DLC - DLC + Update + Aktualizacja - Delete %1 - Usuń %1 + This game has no DLC to delete! + Ta gra nie ma DLC do usunięcia! - Are you sure you want to delete %1's %2 directory? - Czy na pewno chcesz usunąć katalog %1 z %2? + DLC + DLC - Open Update Folder - + Delete %1 + Usuń %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Czy na pewno chcesz usunąć katalog %1 z %2? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Wybierz katalog + shadPS4 - Choose directory + shadPS4 - Wybierz katalog - Select which directory you want to install to. - Wybierz katalog, do którego chcesz zainstalować. + Select which directory you want to install to. + Wybierz katalog, do którego chcesz zainstalować. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Otwórz/Dodaj folder Elf + Open/Add Elf Folder + Otwórz/Dodaj folder Elf - Install Packages (PKG) - Zainstaluj paczkę (PKG) + Install Packages (PKG) + Zainstaluj paczkę (PKG) - Boot Game - Uruchom grę + Boot Game + Uruchom grę - Check for Updates - Sprawdź aktualizacje + Check for Updates + Sprawdź aktualizacje - About shadPS4 - O programie + About shadPS4 + O programie - Configure... - Konfiguruj... + Configure... + Konfiguruj... - Install application from a .pkg file - Zainstaluj aplikacje z pliku .pkg + Install application from a .pkg file + Zainstaluj aplikacje z pliku .pkg - Recent Games - Ostatnie gry + Recent Games + Ostatnie gry - Open shadPS4 Folder - Otwórz folder shadPS4 + Open shadPS4 Folder + Otwórz folder shadPS4 - Exit - Wyjdź + Exit + Wyjdź - Exit shadPS4 - Wyjdź z shadPS4 + Exit shadPS4 + Wyjdź z shadPS4 - Exit the application. - Wyjdź z aplikacji. + Exit the application. + Wyjdź z aplikacji. - Show Game List - Pokaż listę gier + Show Game List + Pokaż listę gier - Game List Refresh - Odśwież listę gier + Game List Refresh + Odśwież listę gier - Tiny - Malutkie + Tiny + Malutkie - Small - Małe + Small + Małe - Medium - Średnie + Medium + Średnie - Large - Wielkie + Large + Wielkie - List View - Widok listy + List View + Widok listy - Grid View - Widok siatki + Grid View + Widok siatki - Elf Viewer - Menedżer plików ELF + Elf Viewer + Menedżer plików ELF - Game Install Directory - Katalog zainstalowanych gier + Game Install Directory + Katalog zainstalowanych gier - Download Cheats/Patches - Pobierz kody / poprawki + Download Cheats/Patches + Pobierz kody / poprawki - Dump Game List - Zgraj listę gier + Dump Game List + Zgraj listę gier - PKG Viewer - Menedżer plików PKG + PKG Viewer + Menedżer plików PKG - Search... - Szukaj... + Search... + Szukaj... - File - Plik + File + Plik - View - Widok + View + Widok - Game List Icons - Ikony w widoku listy + Game List Icons + Ikony w widoku listy - Game List Mode - Tryb listy gier + Game List Mode + Tryb listy gier - Settings - Ustawienia + Settings + Ustawienia - Utils - Narzędzia + Utils + Narzędzia - Themes - Motywy + Themes + Motywy - Help - Pomoc + Help + Pomoc - Dark - Ciemny + Dark + Ciemny - Light - Jasny + Light + Jasny - Green - Zielony + Green + Zielony - Blue - Niebieski + Blue + Niebieski - Violet - Fioletowy + Violet + Fioletowy - toolBar - Pasek narzędzi + toolBar + Pasek narzędzi - Game List - Lista gier + Game List + Lista gier - * Unsupported Vulkan Version - * Nieobsługiwana wersja Vulkan + * Unsupported Vulkan Version + * Nieobsługiwana wersja Vulkan - Download Cheats For All Installed Games - Pobierz kody do wszystkich zainstalowanych gier + Download Cheats For All Installed Games + Pobierz kody do wszystkich zainstalowanych gier - Download Patches For All Games - Pobierz poprawki do wszystkich gier + Download Patches For All Games + Pobierz poprawki do wszystkich gier - Download Complete - Pobieranie zakończone + Download Complete + Pobieranie zakończone - You have downloaded cheats for all the games you have installed. - Pobrałeś kody do wszystkich zainstalowanych gier. + You have downloaded cheats for all the games you have installed. + Pobrałeś kody do wszystkich zainstalowanych gier. - Patches Downloaded Successfully! - Poprawki pobrane pomyślnie! + Patches Downloaded Successfully! + Poprawki pobrane pomyślnie! - All Patches available for all games have been downloaded. - Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. + All Patches available for all games have been downloaded. + Wszystkie poprawki dostępne dla wszystkich gier zostały pobrane. - Games: - Gry: + Games: + Gry: - ELF files (*.bin *.elf *.oelf) - Pliki ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Pliki ELF (*.bin *.elf *.oelf) - Game Boot - Uruchomienie gry + Game Boot + Uruchomienie gry - Only one file can be selected! - Można wybrać tylko jeden plik! + Only one file can be selected! + Można wybrać tylko jeden plik! - PKG Extraction - Wypakowywanie PKG + PKG Extraction + Wypakowywanie PKG - Patch detected! - Wykryto łatkę! + Patch detected! + Wykryto łatkę! - PKG and Game versions match: - Wersje PKG i gry są zgodne: + PKG and Game versions match: + Wersje PKG i gry są zgodne: - Would you like to overwrite? - Czy chcesz nadpisać? + Would you like to overwrite? + Czy chcesz nadpisać? - PKG Version %1 is older than installed version: - Wersja PKG %1 jest starsza niż zainstalowana wersja: + PKG Version %1 is older than installed version: + Wersja PKG %1 jest starsza niż zainstalowana wersja: - Game is installed: - Gra jest zainstalowana: + Game is installed: + Gra jest zainstalowana: - Would you like to install Patch: - Czy chcesz zainstalować łatkę: + Would you like to install Patch: + Czy chcesz zainstalować łatkę: - DLC Installation - Instalacja DLC + DLC Installation + Instalacja DLC - Would you like to install DLC: %1? - Czy chcesz zainstalować DLC: %1? + Would you like to install DLC: %1? + Czy chcesz zainstalować DLC: %1? - DLC already installed: - DLC już zainstalowane: + DLC already installed: + DLC już zainstalowane: - Game already installed - Gra już zainstalowana + Game already installed + Gra już zainstalowana - PKG ERROR - BŁĄD PKG + PKG ERROR + BŁĄD PKG - Extracting PKG %1/%2 - Wypakowywanie PKG %1/%2 + Extracting PKG %1/%2 + Wypakowywanie PKG %1/%2 - Extraction Finished - Wypakowywanie zakończone + Extraction Finished + Wypakowywanie zakończone - Game successfully installed at %1 - Gra pomyślnie zainstalowana w %1 + Game successfully installed at %1 + Gra pomyślnie zainstalowana w %1 - File doesn't appear to be a valid PKG file - Plik nie wydaje się być prawidłowym plikiem PKG + File doesn't appear to be a valid PKG file + Plik nie wydaje się być prawidłowym plikiem PKG - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Otwórz folder + Open Folder + Otwórz folder - Name - Nazwa + PKG ERROR + BŁĄD PKG - Serial - Numer seryjny + Name + Nazwa - Installed - + Serial + Numer seryjny - Size - Rozmiar + Installed + Installed - Category - + Size + Rozmiar - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Region + FW + FW - Flags - + Region + Region - Path - Ścieżka + Flags + Flags - File - Plik + Path + Ścieżka - PKG ERROR - BŁĄD PKG + File + Plik - Unknown - Nieznany + Unknown + Nieznany - Package - + Package + Package - - + + SettingsDialog - Settings - Ustawienia + Settings + Ustawienia - General - Ogólne + General + Ogólne - System - System + System + System - Console Language - Język konsoli + Console Language + Język konsoli - Emulator Language - Język emulatora + Emulator Language + Język emulatora - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Włącz pełny ekran + Enable Fullscreen + Włącz pełny ekran - Fullscreen Mode - Tryb Pełnoekranowy + Fullscreen Mode + Tryb Pełnoekranowy - Enable Separate Update Folder - Włącz oddzielny folder aktualizacji + Enable Separate Update Folder + Włącz oddzielny folder aktualizacji - Default tab when opening settings - Domyślna zakładka podczas otwierania ustawień + Default tab when opening settings + Domyślna zakładka podczas otwierania ustawień - Show Game Size In List - Pokaż rozmiar gry na liście + Show Game Size In List + Pokaż rozmiar gry na liście - Show Splash - Pokaż ekran powitania + Show Splash + Pokaż ekran powitania - Enable Discord Rich Presence - Włącz Discord Rich Presence + Enable Discord Rich Presence + Włącz Discord Rich Presence - Username - Nazwa użytkownika + Username + Nazwa użytkownika - Trophy Key - Klucz trofeów + Trophy Key + Klucz trofeów - Trophy - Trofeum + Trophy + Trofeum - Logger - Dziennik zdarzeń + Logger + Dziennik zdarzeń - Log Type - Typ dziennika + Log Type + Typ dziennika - Log Filter - Filtrowanie dziennika + Log Filter + Filtrowanie dziennika - Open Log Location - Otwórz lokalizację dziennika + Open Log Location + Otwórz lokalizację dziennika - Input - Wejście + Input + Wejście - Cursor - Kursor + Cursor + Kursor - Hide Cursor - Ukryj kursor + Hide Cursor + Ukryj kursor - Hide Cursor Idle Timeout - Czas oczekiwania na ukrycie kursora przy bezczynności + Hide Cursor Idle Timeout + Czas oczekiwania na ukrycie kursora przy bezczynności - s - s + s + s - Controller - Kontroler + Controller + Kontroler - Back Button Behavior - Zachowanie przycisku wstecz + Back Button Behavior + Zachowanie przycisku wstecz - Graphics - Grafika + Graphics + Grafika - GUI - Interfejs + GUI + Interfejs - User - Użytkownik + User + Użytkownik - Graphics Device - Karta graficzna + Graphics Device + Karta graficzna - Width - Szerokość + Width + Szerokość - Height - Wysokość + Height + Wysokość - Vblank Divider - Dzielnik przerwy pionowej (Vblank) + Vblank Divider + Dzielnik przerwy pionowej (Vblank) - Advanced - Zaawansowane + Advanced + Zaawansowane - Enable Shaders Dumping - Włącz zgrywanie cieni + Enable Shaders Dumping + Włącz zgrywanie cieni - Enable NULL GPU - Wyłącz kartę graficzną + Enable NULL GPU + Wyłącz kartę graficzną - Paths - Ścieżki + Enable HDR + Enable HDR - Game Folders - Foldery gier + Paths + Ścieżki - Add... - Dodaj... + Game Folders + Foldery gier - Remove - Usuń + Add... + Dodaj... - Debug - Debugowanie + Remove + Usuń - Enable Debug Dumping - Włącz zgrywanie debugowania + Debug + Debugowanie - Enable Vulkan Validation Layers - Włącz warstwy walidacji Vulkan + Enable Debug Dumping + Włącz zgrywanie debugowania - Enable Vulkan Synchronization Validation - Włącz walidację synchronizacji Vulkan + Enable Vulkan Validation Layers + Włącz warstwy walidacji Vulkan - Enable RenderDoc Debugging - Włącz debugowanie RenderDoc + Enable Vulkan Synchronization Validation + Włącz walidację synchronizacji Vulkan - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Włącz debugowanie RenderDoc - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Aktualizacja + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Sprawdź aktualizacje przy starcie + Update + Aktualizacja - Always Show Changelog - Zawsze pokazuj dziennik zmian + Check for Updates at Startup + Sprawdź aktualizacje przy starcie - Update Channel - Kanał Aktualizacji + Always Show Changelog + Zawsze pokazuj dziennik zmian - Check for Updates - Sprawdź aktualizacje + Update Channel + Kanał Aktualizacji - GUI Settings - Ustawienia Interfejsu + Check for Updates + Sprawdź aktualizacje - Title Music - Title Music + GUI Settings + Ustawienia Interfejsu - Disable Trophy Pop-ups - Wyłącz wyskakujące okienka trofeów + Title Music + Title Music - Play title music - Odtwórz muzykę tytułową + Disable Trophy Pop-ups + Wyłącz wyskakujące okienka trofeów - Update Compatibility Database On Startup - Aktualizuj bazę danych zgodności podczas uruchamiania + Background Image + Background Image - Game Compatibility - Kompatybilność gier + Show Background Image + Show Background Image - Display Compatibility Data - Wyświetl dane zgodności + Opacity + Opacity - Update Compatibility Database - Aktualizuj bazę danych zgodności + Play title music + Odtwórz muzykę tytułową - Volume - Głośność + Update Compatibility Database On Startup + Aktualizuj bazę danych zgodności podczas uruchamiania - Save - Zapisz + Game Compatibility + Kompatybilność gier - Apply - Zastosuj + Display Compatibility Data + Wyświetl dane zgodności - Restore Defaults - Przywróć ustawienia domyślne + Update Compatibility Database + Aktualizuj bazę danych zgodności - Close - Zamknij + Volume + Głośność - Point your mouse at an option to display its description. - Najedź kursorem na opcję, aby wyświetlić jej opis. + Save + Zapisz - consoleLanguageGroupBox - Język konsoli:\nUstala język, który używa gra PS4.\nZaleca się ustawienie tego na język, który obsługuje gra, co może się różnić w zależności od regionu. + Apply + Zastosuj - emulatorLanguageGroupBox - Język emulatora:\nUstala język interfejsu użytkownika emulatora. + Restore Defaults + Przywróć ustawienia domyślne - fullscreenCheckBox - Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. + Close + Zamknij - separateUpdatesCheckBox - Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania. + Point your mouse at an option to display its description. + Najedź kursorem na opcję, aby wyświetlić jej opis. - showSplashCheckBox - Wyświetl ekran powitalny:\nPodczas uruchamiania gry wyświetla ekran powitalny (specjalny obraz). + consoleLanguageGroupBox + Język konsoli:\nUstala język, który używa gra PS4.\nZaleca się ustawienie tego na język, który obsługuje gra, co może się różnić w zależności od regionu. - discordRPCCheckbox - Włącz Discord Rich Presence:\nWyświetla ikonę emulatora i odpowiednie informacje na twoim profilu Discord. + emulatorLanguageGroupBox + Język emulatora:\nUstala język interfejsu użytkownika emulatora. - userName - Nazwa użytkownika:\nUstala nazwę użytkownika konta PS4, która może być wyświetlana w niektórych grach. + fullscreenCheckBox + Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. - TrophyKey - Klucz trofeów:\nKlucz używany do odszyfrowywania trofeów. Musi być uzyskany z konsoli po jailbreaku. Musi zawierać tylko znaki w kodzie szesnastkowym. + separateUpdatesCheckBox + Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania. - logTypeGroupBox - Typ logu:\nUstala, czy synchronizować wyjście okna dziennika dla wydajności. Może to mieć negatywny wpływ na emulację. + showSplashCheckBox + Wyświetl ekran powitalny:\nPodczas uruchamiania gry wyświetla ekran powitalny (specjalny obraz). - logFilter - Filtr logu:\nFiltruje dziennik, aby drukować tylko określone informacje.\nPrzykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później. + discordRPCCheckbox + Włącz Discord Rich Presence:\nWyświetla ikonę emulatora i odpowiednie informacje na twoim profilu Discord. - updaterGroupBox - Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. + userName + Nazwa użytkownika:\nUstala nazwę użytkownika konta PS4, która może być wyświetlana w niektórych grach. - GUIMusicGroupBox - Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. + TrophyKey + Klucz trofeów:\nKlucz używany do odszyfrowywania trofeów. Musi być uzyskany z konsoli po jailbreaku. Musi zawierać tylko znaki w kodzie szesnastkowym. - disableTrophycheckBox - Wyłącz wyskakujące okienka trofeów:\nWyłącz powiadomienia o trofeach w grze. Postępy w zdobywaniu trofeów można nadal śledzić za pomocą przeglądarki trofeów (kliknij prawym przyciskiem myszy grę w oknie głównym). + logTypeGroupBox + Typ logu:\nUstala, czy synchronizować wyjście okna dziennika dla wydajności. Może to mieć negatywny wpływ na emulację. - hideCursorGroupBox - Ukryj kursor:\nWybierz, kiedy kursor zniknie:\nNigdy: Zawsze będziesz widział myszkę.\nNieaktywny: Ustaw czas, po którym zniknie po bezczynności.\nZawsze: nigdy nie zobaczysz myszki. + logFilter + Filtr logu:\nFiltruje dziennik, aby drukować tylko określone informacje.\nPrzykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później. - idleTimeoutGroupBox - Ustaw czas, po którym mysz zniknie po bezczynności. + updaterGroupBox + Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. - backButtonBehaviorGroupBox - Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję „Aktualizuj zgodność przy uruchomieniu”, aby uzyskać aktualne informacje. + GUIMusicGroupBox + Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. - checkCompatibilityOnStartupCheckBox - Aktualizuj zgodność przy uruchomieniu:\nAutomatycznie aktualizuj bazę danych kompatybilności podczas uruchamiania shadPS4. + disableTrophycheckBox + Wyłącz wyskakujące okienka trofeów:\nWyłącz powiadomienia o trofeach w grze. Postępy w zdobywaniu trofeów można nadal śledzić za pomocą przeglądarki trofeów (kliknij prawym przyciskiem myszy grę w oknie głównym). - updateCompatibilityButton - Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. + hideCursorGroupBox + Ukryj kursor:\nWybierz, kiedy kursor zniknie:\nNigdy: Zawsze będziesz widział myszkę.\nNieaktywny: Ustaw czas, po którym zniknie po bezczynności.\nZawsze: nigdy nie zobaczysz myszki. - Never - Nigdy + idleTimeoutGroupBox + Ustaw czas, po którym mysz zniknie po bezczynności. - Idle - Bezczynny + backButtonBehaviorGroupBox + Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4. - Always - Zawsze + enableCompatibilityCheckBox + Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję „Aktualizuj zgodność przy uruchomieniu”, aby uzyskać aktualne informacje. - Touchpad Left - Touchpad Lewy + checkCompatibilityOnStartupCheckBox + Aktualizuj zgodność przy uruchomieniu:\nAutomatycznie aktualizuj bazę danych kompatybilności podczas uruchamiania shadPS4. - Touchpad Right - Touchpad Prawy + updateCompatibilityButton + Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. - Touchpad Center - Touchpad Środkowy + Never + Nigdy - None - Brak + Idle + Bezczynny - graphicsAdapterGroupBox - Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz "Auto Select", aby ustawić go automatycznie. + Always + Zawsze - resolutionLayout - Szerokość/Wysokość:\nUstala rozmiar okna emulatora podczas uruchamiania, który może być zmieniany w trakcie gry.\nTo różni się od rozdzielczości w grze. + Touchpad Left + Touchpad Lewy - heightDivider - Dzielnik Vblank:\nWskaźnik klatek, z jakim emulator jest odświeżany, pomnożony przez tę liczbę. Zmiana tego może mieć negatywne skutki, takie jak przyspieszenie gry lub zniszczenie krytycznej funkcjonalności gry, która nie spodziewa się, że to zostanie zmienione! + Touchpad Right + Touchpad Prawy - dumpShadersCheckBox - Włącz zrzucanie shaderów:\nDla technicznego debugowania zapisuje shadery z gry w folderze podczas renderowania. + Touchpad Center + Touchpad Środkowy - nullGpuCheckBox - Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej. + None + Brak - gameFoldersBox - Foldery gier:\nLista folderów do sprawdzenia zainstalowanych gier. + graphicsAdapterGroupBox + Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz "Auto Select", aby ustawić go automatycznie. - addFolderButton - Dodaj:\nDodaj folder do listy. + resolutionLayout + Szerokość/Wysokość:\nUstala rozmiar okna emulatora podczas uruchamiania, który może być zmieniany w trakcie gry.\nTo różni się od rozdzielczości w grze. - removeFolderButton - Usuń:\nUsuń folder z listy. + heightDivider + Dzielnik Vblank:\nWskaźnik klatek, z jakim emulator jest odświeżany, pomnożony przez tę liczbę. Zmiana tego może mieć negatywne skutki, takie jak przyspieszenie gry lub zniszczenie krytycznej funkcjonalności gry, która nie spodziewa się, że to zostanie zmienione! - debugDump - Włącz zrzut debugowania:\nZapisuje symbole importu i eksportu oraz informacje nagłówkowe pliku dla aktualnie działającej aplikacji PS4 w katalogu. + dumpShadersCheckBox + Włącz zrzucanie shaderów:\nDla technicznego debugowania zapisuje shadery z gry w folderze podczas renderowania. - vkValidationCheckBox - Włącz warstwę walidacji Vulkan:\nWłącza system, który waliduje stan renderera Vulkan i loguje informacje o jego wewnętrznym stanie. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. + nullGpuCheckBox + Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej. - vkSyncValidationCheckBox - Włącz walidację synchronizacji Vulkan:\nWłącza system, który waliduje timing zadań renderowania Vulkan. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. + gameFoldersBox + Foldery gier:\nLista folderów do sprawdzenia zainstalowanych gier. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Dodaj:\nDodaj folder do listy. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Usuń:\nUsuń folder z listy. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Włącz zrzut debugowania:\nZapisuje symbole importu i eksportu oraz informacje nagłówkowe pliku dla aktualnie działającej aplikacji PS4 w katalogu. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Włącz warstwę walidacji Vulkan:\nWłącza system, który waliduje stan renderera Vulkan i loguje informacje o jego wewnętrznym stanie. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Włącz walidację synchronizacji Vulkan:\nWłącza system, który waliduje timing zadań renderowania Vulkan. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - Borderless - + rdocCheckBox + Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Przeglądaj + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Katalog do instalacji gier + Browse + Przeglądaj - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Katalog do instalacji gier - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Menedżer trofeów + Trophy Viewer + Menedżer trofeów - + diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index b0dff3d20..ae9bfe68f 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Sobre o shadPS4 + About shadPS4 + Sobre o shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. - This software should not be used to play games you have not legally obtained. - Este software não deve ser usado para jogar jogos piratas. + This software should not be used to play games you have not legally obtained. + Este software não deve ser usado para jogar jogos piratas. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches para + Cheats / Patches for + Cheats / Patches para - defaultTextEdit_MSG - Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Imagem Não Disponível + No Image Available + Imagem Não Disponível - Serial: - Serial: + Serial: + Serial: - Version: - Versão: + Version: + Versão: - Size: - Tamanho: + Size: + Tamanho: - Select Cheat File: - Selecione o Arquivo de Cheat: + Select Cheat File: + Selecione o Arquivo de Cheat: - Repository: - Repositório: + Repository: + Repositório: - Download Cheats - Baixar Cheats + Download Cheats + Baixar Cheats - Delete File - Excluir Arquivo + Delete File + Excluir Arquivo - No files selected. - Nenhum arquivo selecionado. + No files selected. + Nenhum arquivo selecionado. - You can delete the cheats you don't want after downloading them. - Você pode excluir os cheats que não deseja após baixá-las. + You can delete the cheats you don't want after downloading them. + Você pode excluir os cheats que não deseja após baixá-las. - Do you want to delete the selected file?\n%1 - Deseja excluir o arquivo selecionado?\n%1 + Do you want to delete the selected file?\n%1 + Deseja excluir o arquivo selecionado?\n%1 - Select Patch File: - Selecione o Arquivo de Patch: + Select Patch File: + Selecione o Arquivo de Patch: - Download Patches - Baixar Patches + Download Patches + Baixar Patches - Save - Salvar + Save + Salvar - Cheats - Cheats + Cheats + Cheats - Patches - Patches + Patches + Patches - Error - Erro + Error + Erro - No patch selected. - Nenhum patch selecionado. + No patch selected. + Nenhum patch selecionado. - Unable to open files.json for reading. - Não foi possível abrir files.json para leitura. + Unable to open files.json for reading. + Não foi possível abrir files.json para leitura. - No patch file found for the current serial. - Nenhum arquivo de patch encontrado para o serial atual. + No patch file found for the current serial. + Nenhum arquivo de patch encontrado para o serial atual. - Unable to open the file for reading. - Não foi possível abrir o arquivo para leitura. + Unable to open the file for reading. + Não foi possível abrir o arquivo para leitura. - Unable to open the file for writing. - Não foi possível abrir o arquivo para gravação. + Unable to open the file for writing. + Não foi possível abrir o arquivo para gravação. - Failed to parse XML: - Falha ao analisar XML: + Failed to parse XML: + Falha ao analisar XML: - Success - Sucesso + Success + Sucesso - Options saved successfully. - Opções salvas com sucesso. + Options saved successfully. + Opções salvas com sucesso. - Invalid Source - Fonte Inválida + Invalid Source + Fonte Inválida - The selected source is invalid. - A fonte selecionada é inválida. + The selected source is invalid. + A fonte selecionada é inválida. - File Exists - Arquivo Existe + File Exists + Arquivo Existe - File already exists. Do you want to replace it? - O arquivo já existe. Deseja substituí-lo? + File already exists. Do you want to replace it? + O arquivo já existe. Deseja substituí-lo? - Failed to save file: - Falha ao salvar o arquivo: + Failed to save file: + Falha ao salvar o arquivo: - Failed to download file: - Falha ao baixar o arquivo: + Failed to download file: + Falha ao baixar o arquivo: - Cheats Not Found - Cheats Não Encontrados + Cheats Not Found + Cheats Não Encontrados - CheatsNotFound_MSG - Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. + CheatsNotFound_MSG + Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. - Cheats Downloaded Successfully - Cheats Baixados com Sucesso + Cheats Downloaded Successfully + Cheats Baixados com Sucesso - CheatsDownloadedSuccessfully_MSG - Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. + CheatsDownloadedSuccessfully_MSG + Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. - Failed to save: - Falha ao salvar: + Failed to save: + Falha ao salvar: - Failed to download: - Falha ao baixar: + Failed to download: + Falha ao baixar: - Download Complete - Download Completo + Download Complete + Download Completo - DownloadComplete_MSG - Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. + DownloadComplete_MSG + Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. - Failed to parse JSON data from HTML. - Falha ao analisar dados JSON do HTML. + Failed to parse JSON data from HTML. + Falha ao analisar dados JSON do HTML. - Failed to retrieve HTML page. - Falha ao recuperar a página HTML. + Failed to retrieve HTML page. + Falha ao recuperar a página HTML. - The game is in version: %1 - O jogo está na versão: %1 + The game is in version: %1 + O jogo está na versão: %1 - The downloaded patch only works on version: %1 - O patch baixado só funciona na versão: %1 + The downloaded patch only works on version: %1 + O patch baixado só funciona na versão: %1 - You may need to update your game. - Talvez você precise atualizar seu jogo. + You may need to update your game. + Talvez você precise atualizar seu jogo. - Incompatibility Notice - Aviso de incompatibilidade + Incompatibility Notice + Aviso de incompatibilidade - Failed to open file: - Falha ao abrir o arquivo: + Failed to open file: + Falha ao abrir o arquivo: - XML ERROR: - ERRO de XML: + XML ERROR: + ERRO de XML: - Failed to open files.json for writing - Falha ao abrir files.json para gravação + Failed to open files.json for writing + Falha ao abrir files.json para gravação - Author: - Autor: + Author: + Autor: - Directory does not exist: - O Diretório não existe: + Directory does not exist: + O Diretório não existe: - Failed to open files.json for reading. - Falha ao abrir files.json para leitura. + Failed to open files.json for reading. + Falha ao abrir files.json para leitura. - Name: - Nome: + Name: + Nome: - Can't apply cheats before the game is started - Não é possível aplicar cheats antes que o jogo comece. + Can't apply cheats before the game is started + Não é possível aplicar cheats antes que o jogo comece. - Close - Fechar + Close + Fechar - - + + CheckUpdate - Auto Updater - Atualizador automático + Auto Updater + Atualizador automático - Error - Erro + Error + Erro - Network error: - Erro de rede: + Network error: + Erro de rede: - Error_Github_limit_MSG - O Atualizador Automático permite até 60 verificações de atualização por hora.\nVocê atingiu esse limite. Por favor, tente novamente mais tarde. + Error_Github_limit_MSG + O Atualizador Automático permite até 60 verificações de atualização por hora.\nVocê atingiu esse limite. Por favor, tente novamente mais tarde. - Failed to parse update information. - Falha ao analisar as informações de atualização. + Failed to parse update information. + Falha ao analisar as informações de atualização. - No pre-releases found. - Nenhuma pre-release encontrada. + No pre-releases found. + Nenhuma pre-release encontrada. - Invalid release data. - Dados da release inválidos. + Invalid release data. + Dados da release inválidos. - No download URL found for the specified asset. - Nenhuma URL de download encontrada para o asset especificado. + No download URL found for the specified asset. + Nenhuma URL de download encontrada para o asset especificado. - Your version is already up to date! - Sua versão já está atualizada! + Your version is already up to date! + Sua versão já está atualizada! - Update Available - Atualização disponível + Update Available + Atualização disponível - Update Channel - Canal de Atualização + Update Channel + Canal de Atualização - Current Version - Versão atual + Current Version + Versão atual - Latest Version - Última versão + Latest Version + Última versão - Do you want to update? - Você quer atualizar? + Do you want to update? + Você quer atualizar? - Show Changelog - Mostrar Changelog + Show Changelog + Mostrar Changelog - Check for Updates at Startup - Verificar Atualizações ao Iniciar + Check for Updates at Startup + Verificar Atualizações ao Iniciar - Update - Atualizar + Update + Atualizar - No - Não + No + Não - Hide Changelog - Ocultar Changelog + Hide Changelog + Ocultar Changelog - Changes - Alterações + Changes + Alterações - Network error occurred while trying to access the URL - Ocorreu um erro de rede ao tentar acessar o URL + Network error occurred while trying to access the URL + Ocorreu um erro de rede ao tentar acessar o URL - Download Complete - Download Completo + Download Complete + Download Completo - The update has been downloaded, press OK to install. - A atualização foi baixada, pressione OK para instalar. + The update has been downloaded, press OK to install. + A atualização foi baixada, pressione OK para instalar. - Failed to save the update file at - Falha ao salvar o arquivo de atualização em + Failed to save the update file at + Falha ao salvar o arquivo de atualização em - Starting Update... - Iniciando atualização... + Starting Update... + Iniciando atualização... - Failed to create the update script file - Falha ao criar o arquivo de script de atualização + Failed to create the update script file + Falha ao criar o arquivo de script de atualização - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Obtendo dados de compatibilidade, por favor aguarde + Fetching compatibility data, please wait + Obtendo dados de compatibilidade, por favor aguarde - Cancel - Cancelar + Cancel + Cancelar - Loading... - Carregando... + Loading... + Carregando... - Error - Erro + Error + Erro - Unable to update compatibility data! Try again later. - Não foi possível atualizar os dados de compatibilidade! Tente novamente mais tarde. + Unable to update compatibility data! Try again later. + Não foi possível atualizar os dados de compatibilidade! Tente novamente mais tarde. - Unable to open compatibility_data.json for writing. - Não foi possível abrir o compatibility_data.json para escrita. + Unable to open compatibility_data.json for writing. + Não foi possível abrir o compatibility_data.json para escrita. - Unknown - Desconhecido + Unknown + Desconhecido - Nothing - Nada + Nothing + Nada - Boots - Boot + Boots + Boot - Menus - Menus + Menus + Menus - Ingame - Em jogo + Ingame + Em jogo - Playable - Jogável + Playable + Jogável - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Abrir Pasta + Open Folder + Abrir Pasta - - + + GameInfoClass - Loading game list, please wait :3 - Carregando a lista de jogos, por favor aguarde :3 + Loading game list, please wait :3 + Carregando a lista de jogos, por favor aguarde :3 - Cancel - Cancelar + Cancel + Cancelar - Loading... - Carregando... + Loading... + Carregando... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Escolha o diretório + shadPS4 - Choose directory + shadPS4 - Escolha o diretório - Directory to install games - Diretório para instalar jogos + Directory to install games + Diretório para instalar jogos - Browse - Procurar + Browse + Procurar - Error - Erro + Error + Erro - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Icone + Icon + Icone - Name - Nome + Name + Nome - Serial - Serial + Serial + Serial - Compatibility - Compatibilidade + Compatibility + Compatibilidade - Region - Região + Region + Região - Firmware - Firmware + Firmware + Firmware - Size - Tamanho + Size + Tamanho - Version - Versão + Version + Versão - Path - Diretório + Path + Diretório - Play Time - Tempo Jogado + Play Time + Tempo Jogado - Never Played - Nunca jogado + Never Played + Nunca jogado - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibilidade não testada + Compatibility is untested + Compatibilidade não testada - Game does not initialize properly / crashes the emulator - Jogo não inicializa corretamente / trava o emulador + Game does not initialize properly / crashes the emulator + Jogo não inicializa corretamente / trava o emulador - Game boots, but only displays a blank screen - O jogo inicializa, mas exibe apenas uma tela vazia + Game boots, but only displays a blank screen + O jogo inicializa, mas exibe apenas uma tela vazia - Game displays an image but does not go past the menu - Jogo exibe imagem mas não passa do menu + Game displays an image but does not go past the menu + Jogo exibe imagem mas não passa do menu - Game has game-breaking glitches or unplayable performance - O jogo tem falhas que interrompem o jogo ou desempenho injogável + Game has game-breaking glitches or unplayable performance + O jogo tem falhas que interrompem o jogo ou desempenho injogável - Game can be completed with playable performance and no major glitches - O jogo pode ser concluído com desempenho jogável e sem grandes falhas + Game can be completed with playable performance and no major glitches + O jogo pode ser concluído com desempenho jogável e sem grandes falhas - Click to see details on github - Clique para ver detalhes no github + Click to see details on github + Clique para ver detalhes no github - Last updated - Última atualização + Last updated + Última atualização - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Criar Atalho + Create Shortcut + Criar Atalho - Cheats / Patches - Cheats / Patches + Cheats / Patches + Cheats / Patches - SFO Viewer - Visualizador de SFO + SFO Viewer + Visualizador de SFO - Trophy Viewer - Visualizador de Troféu + Trophy Viewer + Visualizador de Troféu - Open Folder... - Abrir Pasta... + Open Folder... + Abrir Pasta... - Open Game Folder - Abrir Pasta do Jogo + Open Game Folder + Abrir Pasta do Jogo - Open Save Data Folder - Abrir Pasta de Save + Open Save Data Folder + Abrir Pasta de Save - Open Log Folder - Abrir Pasta de Log + Open Log Folder + Abrir Pasta de Log - Copy info... - Copiar informação... + Copy info... + Copiar informação... - Copy Name - Copiar Nome + Copy Name + Copiar Nome - Copy Serial - Copiar Serial + Copy Serial + Copiar Serial - Copy All - Copiar Tudo + Copy Version + Copy Version - Delete... - Deletar... + Copy Size + Copy Size - Delete Game - Deletar Jogo + Copy All + Copiar Tudo - Delete Update - Deletar Atualização + Delete... + Deletar... - Delete DLC - Deletar DLC + Delete Game + Deletar Jogo - Compatibility... - Compatibilidade... + Delete Update + Deletar Atualização - Update database - Atualizar banco de dados + Delete DLC + Deletar DLC - View report - Ver status + Compatibility... + Compatibilidade... - Submit a report - Enviar status + Update database + Atualizar banco de dados - Shortcut creation - Criação de atalho + View report + Ver status - Shortcut created successfully! - Atalho criado com sucesso! + Submit a report + Enviar status - Error - Erro + Shortcut creation + Criação de atalho - Error creating shortcut! - Erro ao criar atalho! + Shortcut created successfully! + Atalho criado com sucesso! - Install PKG - Instalar PKG + Error + Erro - Game - Jogo + Error creating shortcut! + Erro ao criar atalho! - This game has no update to delete! - Este jogo não tem atualização para excluir! + Install PKG + Instalar PKG - Update - Atualização + Game + Jogo - This game has no DLC to delete! - Este jogo não tem DLC para excluir! + This game has no update to delete! + Este jogo não tem atualização para excluir! - DLC - DLC + Update + Atualização - Delete %1 - Deletar %1 + This game has no DLC to delete! + Este jogo não tem DLC para excluir! - Are you sure you want to delete %1's %2 directory? - Tem certeza de que deseja excluir o diretório %2 de %1 ? + DLC + DLC - Open Update Folder - + Delete %1 + Deletar %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Tem certeza de que deseja excluir o diretório %2 de %1 ? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Escolha o diretório + shadPS4 - Choose directory + shadPS4 - Escolha o diretório - Select which directory you want to install to. - Selecione o diretório em que você deseja instalar. + Select which directory you want to install to. + Selecione o diretório em que você deseja instalar. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Abrir/Adicionar pasta Elf + Open/Add Elf Folder + Abrir/Adicionar pasta Elf - Install Packages (PKG) - Instalar Pacotes (PKG) + Install Packages (PKG) + Instalar Pacotes (PKG) - Boot Game - Iniciar Jogo + Boot Game + Iniciar Jogo - Check for Updates - Verificar atualizações + Check for Updates + Verificar atualizações - About shadPS4 - Sobre o shadPS4 + About shadPS4 + Sobre o shadPS4 - Configure... - Configurar... + Configure... + Configurar... - Install application from a .pkg file - Instalar aplicação de um arquivo .pkg + Install application from a .pkg file + Instalar aplicação de um arquivo .pkg - Recent Games - Jogos Recentes + Recent Games + Jogos Recentes - Open shadPS4 Folder - Abrir pasta shadPS4 + Open shadPS4 Folder + Abrir pasta shadPS4 - Exit - Sair + Exit + Sair - Exit shadPS4 - Sair do shadPS4 + Exit shadPS4 + Sair do shadPS4 - Exit the application. - Sair da aplicação. + Exit the application. + Sair da aplicação. - Show Game List - Mostrar Lista de Jogos + Show Game List + Mostrar Lista de Jogos - Game List Refresh - Atualizar Lista de Jogos + Game List Refresh + Atualizar Lista de Jogos - Tiny - Muito pequeno + Tiny + Muito pequeno - Small - Pequeno + Small + Pequeno - Medium - Médio + Medium + Médio - Large - Grande + Large + Grande - List View - Visualizar em Lista + List View + Visualizar em Lista - Grid View - Visualizar em Grade + Grid View + Visualizar em Grade - Elf Viewer - Visualizador de Elf + Elf Viewer + Visualizador de Elf - Game Install Directory - Diretório de Instalação de Jogos + Game Install Directory + Diretório de Instalação de Jogos - Download Cheats/Patches - Baixar Cheats/Patches + Download Cheats/Patches + Baixar Cheats/Patches - Dump Game List - Dumpar Lista de Jogos + Dump Game List + Dumpar Lista de Jogos - PKG Viewer - Visualizador de PKG + PKG Viewer + Visualizador de PKG - Search... - Pesquisar... + Search... + Pesquisar... - File - Arquivo + File + Arquivo - View - Ver + View + Ver - Game List Icons - Ícones da Lista de Jogos + Game List Icons + Ícones da Lista de Jogos - Game List Mode - Modo da Lista de Jogos + Game List Mode + Modo da Lista de Jogos - Settings - Configurações + Settings + Configurações - Utils - Utilitários + Utils + Utilitários - Themes - Temas + Themes + Temas - Help - Ajuda + Help + Ajuda - Dark - Escuro + Dark + Escuro - Light - Claro + Light + Claro - Green - Verde + Green + Verde - Blue - Azul + Blue + Azul - Violet - Violeta + Violet + Violeta - toolBar - Barra de Ferramentas + toolBar + Barra de Ferramentas - Game List - Lista de Jogos + Game List + Lista de Jogos - * Unsupported Vulkan Version - * Versão Vulkan não suportada + * Unsupported Vulkan Version + * Versão Vulkan não suportada - Download Cheats For All Installed Games - Baixar Cheats para Todos os Jogos Instalados + Download Cheats For All Installed Games + Baixar Cheats para Todos os Jogos Instalados - Download Patches For All Games - Baixar Patches para Todos os Jogos + Download Patches For All Games + Baixar Patches para Todos os Jogos - Download Complete - Download Completo + Download Complete + Download Completo - You have downloaded cheats for all the games you have installed. - Você baixou cheats para todos os jogos que instalou. + You have downloaded cheats for all the games you have installed. + Você baixou cheats para todos os jogos que instalou. - Patches Downloaded Successfully! - Patches Baixados com Sucesso! + Patches Downloaded Successfully! + Patches Baixados com Sucesso! - All Patches available for all games have been downloaded. - Todos os patches disponíveis para todos os jogos foram baixados. + All Patches available for all games have been downloaded. + Todos os patches disponíveis para todos os jogos foram baixados. - Games: - Jogos: + Games: + Jogos: - ELF files (*.bin *.elf *.oelf) - Arquivos ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Arquivos ELF (*.bin *.elf *.oelf) - Game Boot - Inicialização do Jogo + Game Boot + Inicialização do Jogo - Only one file can be selected! - Apenas um arquivo pode ser selecionado! + Only one file can be selected! + Apenas um arquivo pode ser selecionado! - PKG Extraction - Extração de PKG + PKG Extraction + Extração de PKG - Patch detected! - Atualização detectada! + Patch detected! + Atualização detectada! - PKG and Game versions match: - As versões do PKG e do Jogo são igual: + PKG and Game versions match: + As versões do PKG e do Jogo são igual: - Would you like to overwrite? - Gostaria de substituir? + Would you like to overwrite? + Gostaria de substituir? - PKG Version %1 is older than installed version: - Versão do PKG %1 é mais antiga do que a versão instalada: + PKG Version %1 is older than installed version: + Versão do PKG %1 é mais antiga do que a versão instalada: - Game is installed: - Jogo instalado: + Game is installed: + Jogo instalado: - Would you like to install Patch: - Você gostaria de instalar a atualização: + Would you like to install Patch: + Você gostaria de instalar a atualização: - DLC Installation - Instalação de DLC + DLC Installation + Instalação de DLC - Would you like to install DLC: %1? - Você gostaria de instalar o DLC: %1? + Would you like to install DLC: %1? + Você gostaria de instalar o DLC: %1? - DLC already installed: - DLC já instalada: + DLC already installed: + DLC já instalada: - Game already installed - O jogo já está instalado: + Game already installed + O jogo já está instalado: - PKG ERROR - ERRO de PKG + PKG ERROR + ERRO de PKG - Extracting PKG %1/%2 - Extraindo PKG %1/%2 + Extracting PKG %1/%2 + Extraindo PKG %1/%2 - Extraction Finished - Extração Concluída + Extraction Finished + Extração Concluída - Game successfully installed at %1 - Jogo instalado com sucesso em %1 + Game successfully installed at %1 + Jogo instalado com sucesso em %1 - File doesn't appear to be a valid PKG file - O arquivo não parece ser um arquivo PKG válido + File doesn't appear to be a valid PKG file + O arquivo não parece ser um arquivo PKG válido - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Abrir Pasta + Open Folder + Abrir Pasta - Name - Nome + PKG ERROR + ERRO de PKG - Serial - Serial + Name + Nome - Installed - + Serial + Serial - Size - Tamanho + Installed + Installed - Category - + Size + Tamanho - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Região + FW + FW - Flags - + Region + Região - Path - Diretório + Flags + Flags - File - Arquivo + Path + Diretório - PKG ERROR - ERRO de PKG + File + Arquivo - Unknown - Desconhecido + Unknown + Desconhecido - Package - + Package + Package - - + + SettingsDialog - Settings - Configurações + Settings + Configurações - General - Geral + General + Geral - System - Sistema + System + Sistema - Console Language - Idioma do Console + Console Language + Idioma do Console - Emulator Language - Idioma do Emulador + Emulator Language + Idioma do Emulador - Emulator - Emulador + Emulator + Emulador - Enable Fullscreen - Habilitar Tela Cheia + Enable Fullscreen + Habilitar Tela Cheia - Fullscreen Mode - Modo de Tela Cheia + Fullscreen Mode + Modo de Tela Cheia - Enable Separate Update Folder - Habilitar pasta de atualização separada + Enable Separate Update Folder + Habilitar pasta de atualização separada - Default tab when opening settings - Aba padrão ao abrir as configurações + Default tab when opening settings + Aba padrão ao abrir as configurações - Show Game Size In List - Mostrar Tamanho do Jogo na Lista + Show Game Size In List + Mostrar Tamanho do Jogo na Lista - Show Splash - Mostrar Splash Inicial + Show Splash + Mostrar Splash Inicial - Enable Discord Rich Presence - Habilitar Discord Rich Presence + Enable Discord Rich Presence + Habilitar Discord Rich Presence - Username - Nome de usuário + Username + Nome de usuário - Trophy Key - Chave de Troféu + Trophy Key + Chave de Troféu - Trophy - Troféus + Trophy + Troféus - Logger - Registro-Log + Logger + Registro-Log - Log Type - Tipo de Registro + Log Type + Tipo de Registro - Log Filter - Filtro do Registro + Log Filter + Filtro do Registro - Open Log Location - Abrir local do registro + Open Log Location + Abrir local do registro - Input - Entradas + Input + Entradas - Cursor - Cursor + Cursor + Cursor - Hide Cursor - Ocultar Cursor + Hide Cursor + Ocultar Cursor - Hide Cursor Idle Timeout - Tempo de Inatividade para Ocultar Cursor + Hide Cursor Idle Timeout + Tempo de Inatividade para Ocultar Cursor - s - s + s + s - Controller - Controle + Controller + Controle - Back Button Behavior - Comportamento do botão Voltar + Back Button Behavior + Comportamento do botão Voltar - Graphics - Gráficos + Graphics + Gráficos - GUI - Interface + GUI + Interface - User - Usuário + User + Usuário - Graphics Device - Placa de Vídeo + Graphics Device + Placa de Vídeo - Width - Largura + Width + Largura - Height - Altura + Height + Altura - Vblank Divider - Divisor Vblank + Vblank Divider + Divisor Vblank - Advanced - Avançado + Advanced + Avançado - Enable Shaders Dumping - Habilitar Dumping de Shaders + Enable Shaders Dumping + Habilitar Dumping de Shaders - Enable NULL GPU - Habilitar GPU NULA + Enable NULL GPU + Habilitar GPU NULA - Paths - Pastas + Enable HDR + Enable HDR - Game Folders - Pastas dos Jogos + Paths + Pastas - Add... - Adicionar... + Game Folders + Pastas dos Jogos - Remove - Remover + Add... + Adicionar... - Debug - Depuração + Remove + Remover - Enable Debug Dumping - Habilitar Depuração de Dumping + Debug + Depuração - Enable Vulkan Validation Layers - Habilitar Camadas de Validação do Vulkan + Enable Debug Dumping + Habilitar Depuração de Dumping - Enable Vulkan Synchronization Validation - Habilitar Validação de Sincronização do Vulkan + Enable Vulkan Validation Layers + Habilitar Camadas de Validação do Vulkan - Enable RenderDoc Debugging - Habilitar Depuração do RenderDoc + Enable Vulkan Synchronization Validation + Habilitar Validação de Sincronização do Vulkan - Enable Crash Diagnostics - Habilitar Diagnóstico de Falhas + Enable RenderDoc Debugging + Habilitar Depuração do RenderDoc - Collect Shaders - Coletar Shaders + Enable Crash Diagnostics + Habilitar Diagnóstico de Falhas - Copy GPU Buffers - Copiar Buffers de GPU + Collect Shaders + Coletar Shaders - Host Debug Markers - Marcadores de Depuração do Host + Copy GPU Buffers + Copiar Buffers de GPU - Guest Debug Markers - Marcadores de Depuração do Convidado + Host Debug Markers + Marcadores de Depuração do Host - Update - Atualização + Guest Debug Markers + Marcadores de Depuração do Convidado - Check for Updates at Startup - Verificar Atualizações ao Iniciar + Update + Atualização - Always Show Changelog - Sempre Mostrar o Changelog + Check for Updates at Startup + Verificar Atualizações ao Iniciar - Update Channel - Canal de Atualização + Always Show Changelog + Sempre Mostrar o Changelog - Check for Updates - Verificar atualizações + Update Channel + Canal de Atualização - GUI Settings - Configurações da Interface + Check for Updates + Verificar atualizações - Title Music - Música no Menu + GUI Settings + Configurações da Interface - Disable Trophy Pop-ups - Desabilitar Pop-ups dos Troféus + Title Music + Música no Menu - Play title music - Reproduzir música de abertura + Disable Trophy Pop-ups + Desabilitar Pop-ups dos Troféus - Update Compatibility Database On Startup - Atualizar Compatibilidade ao Inicializar + Background Image + Background Image - Game Compatibility - Compatibilidade dos Jogos + Show Background Image + Show Background Image - Display Compatibility Data - Exibir Dados de Compatibilidade + Opacity + Opacity - Update Compatibility Database - Atualizar Lista de Compatibilidade + Play title music + Reproduzir música de abertura - Volume - Volume + Update Compatibility Database On Startup + Atualizar Compatibilidade ao Inicializar - Save - Salvar + Game Compatibility + Compatibilidade dos Jogos - Apply - Aplicar + Display Compatibility Data + Exibir Dados de Compatibilidade - Restore Defaults - Restaurar Padrões + Update Compatibility Database + Atualizar Lista de Compatibilidade - Close - Fechar + Volume + Volume - Point your mouse at an option to display its description. - Passe o mouse sobre uma opção para exibir sua descrição. + Save + Salvar - consoleLanguageGroupBox - Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. + Apply + Aplicar - emulatorLanguageGroupBox - Idioma do emulador:\nDefine o idioma da interface do emulador. + Restore Defaults + Restaurar Padrões - fullscreenCheckBox - Habilitar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. + Close + Fechar - separateUpdatesCheckBox - Habilitar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento. + Point your mouse at an option to display its description. + Passe o mouse sobre uma opção para exibir sua descrição. - showSplashCheckBox - Mostrar Splash Inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo. + consoleLanguageGroupBox + Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. - discordRPCCheckbox - Habilitar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. + emulatorLanguageGroupBox + Idioma do emulador:\nDefine o idioma da interface do emulador. - userName - Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. + fullscreenCheckBox + Habilitar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Habilitar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento. - logTypeGroupBox - Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. + showSplashCheckBox + Mostrar Splash Inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo. - logFilter - Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. + discordRPCCheckbox + Habilitar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. - updaterGroupBox - Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. + userName + Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. - GUIMusicGroupBox - Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal). + logTypeGroupBox + Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. - hideCursorGroupBox - Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Você sempre verá o mouse.\nParado: Defina um tempo para ele desaparecer após ficar inativo.\nSempre: Você nunca verá o mouse. + logFilter + Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. - idleTimeoutGroupBox - Defina um tempo em segundos para o mouse desaparecer após ficar inativo. + updaterGroupBox + Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. - backButtonBehaviorGroupBox - Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. + GUIMusicGroupBox + Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. - checkCompatibilityOnStartupCheckBox - Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado. + disableTrophycheckBox + Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal). - updateCompatibilityButton - Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade. + hideCursorGroupBox + Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Você sempre verá o mouse.\nParado: Defina um tempo para ele desaparecer após ficar inativo.\nSempre: Você nunca verá o mouse. - Never - Nunca + idleTimeoutGroupBox + Defina um tempo em segundos para o mouse desaparecer após ficar inativo. - Idle - Parado + backButtonBehaviorGroupBox + Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4. - Always - Sempre + enableCompatibilityCheckBox + Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. - Touchpad Left - Touchpad Esquerdo + checkCompatibilityOnStartupCheckBox + Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado. - Touchpad Right - Touchpad Direito + updateCompatibilityButton + Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade. - Touchpad Center - Touchpad Centro + Never + Nunca - None - Nenhum + Idle + Parado - graphicsAdapterGroupBox - Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. + Always + Sempre - resolutionLayout - Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. + Touchpad Left + Touchpad Esquerdo - heightDivider - Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! + Touchpad Right + Touchpad Direito - dumpShadersCheckBox - Habilitar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. + Touchpad Center + Touchpad Centro - nullGpuCheckBox - Habilitar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. + None + Nenhum - gameFoldersBox - Pastas dos jogos:\nA lista de pastas para verificar se há jogos instalados. + graphicsAdapterGroupBox + Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. - addFolderButton - Adicionar:\nAdicione uma pasta à lista. + resolutionLayout + Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. - removeFolderButton - Remover:\nRemove uma pasta da lista. + heightDivider + Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! - debugDump - Habilitar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. + dumpShadersCheckBox + Habilitar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. - vkValidationCheckBox - Habilitar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + nullGpuCheckBox + Habilitar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. - vkSyncValidationCheckBox - Habilitar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Habilitar Depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. + gameFoldersBox + Pastas dos jogos:\nA lista de pastas para verificar se há jogos instalados. - collectShaderCheckBox - Coletar Shaders:\nVocê precisa habilitar isso para editar shaders com o menu de depuração (Ctrl + F10). + addFolderButton + Adicionar:\nAdicione uma pasta à lista. - crashDiagnosticsCheckBox - Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depurar erros de 'Device lost'. Se você tiver isso habilitado, você deve habilitar os Marcadores de Depuração de Host e de Convidado.\nNão funciona em GPUs da Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o SDK do Vulkan para que isso funcione. + removeFolderButton + Remover:\nRemove uma pasta da lista. - copyGPUBuffersCheckBox - Copiar Buffers de GPU:\nContorna condições de corrida envolvendo envios de GPU.\nPode ou não ajudar com travamentos do PM4 tipo 0. + debugDump + Habilitar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. - hostMarkersCheckBox - Marcadores de Depuração de Host:\nInsere informações do lado do emulador, como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, você deve habilitar o "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. + vkValidationCheckBox + Habilitar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - guestMarkersCheckBox - Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, você deve habilitar "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. + vkSyncValidationCheckBox + Habilitar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - Borderless - + rdocCheckBox + Habilitar Depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. - True - + collectShaderCheckBox + Coletar Shaders:\nVocê precisa habilitar isso para editar shaders com o menu de depuração (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depurar erros de 'Device lost'. Se você tiver isso habilitado, você deve habilitar os Marcadores de Depuração de Host e de Convidado.\nNão funciona em GPUs da Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o SDK do Vulkan para que isso funcione. - Release - + copyGPUBuffersCheckBox + Copiar Buffers de GPU:\nContorna condições de corrida envolvendo envios de GPU.\nPode ou não ajudar com travamentos do PM4 tipo 0. - Nightly - + hostMarkersCheckBox + Marcadores de Depuração de Host:\nInsere informações do lado do emulador, como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, você deve habilitar o "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. - Background Image - + guestMarkersCheckBox + Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, você deve habilitar "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Procurar + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Diretório para instalar jogos + Browse + Procurar - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Diretório para instalar jogos - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Visualizador de Troféu + Trophy Viewer + Visualizador de Troféu - + diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index c07aa99c4..ab8d450fd 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Nu este disponibilă imaginea + No Image Available + Nu este disponibilă imaginea - Serial: - Serial: + Serial: + Serial: - Version: - Versiune: + Version: + Versiune: - Size: - Dimensiune: + Size: + Dimensiune: - Select Cheat File: - Selectează fișierul Cheat: + Select Cheat File: + Selectează fișierul Cheat: - Repository: - Repository: + Repository: + Repository: - Download Cheats - Descarcă Cheats + Download Cheats + Descarcă Cheats - Delete File - Șterge Fișierul + Delete File + Șterge Fișierul - No files selected. - Nu sunt fișiere selectate. + No files selected. + Nu sunt fișiere selectate. - You can delete the cheats you don't want after downloading them. - Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. + You can delete the cheats you don't want after downloading them. + Poti șterge cheats-urile pe care nu le dorești după ce le-ai descărcat. - Do you want to delete the selected file?\n%1 - Vrei să ștergi fișierul selectat?\n%1 + Do you want to delete the selected file?\n%1 + Vrei să ștergi fișierul selectat?\n%1 - Select Patch File: - Selectează fișierul Patch: + Select Patch File: + Selectează fișierul Patch: - Download Patches - Descarcă Patches + Download Patches + Descarcă Patches - Save - Salvează + Save + Salvează - Cheats - Cheats + Cheats + Cheats - Patches - Patches + Patches + Patches - Error - Eroare + Error + Eroare - No patch selected. - Nu este selectat niciun patch. + No patch selected. + Nu este selectat niciun patch. - Unable to open files.json for reading. - Imposibil de deschis files.json pentru citire. + Unable to open files.json for reading. + Imposibil de deschis files.json pentru citire. - No patch file found for the current serial. - Nu s-a găsit niciun fișier patch pentru serialul curent. + No patch file found for the current serial. + Nu s-a găsit niciun fișier patch pentru serialul curent. - Unable to open the file for reading. - Imposibil de deschis fișierul pentru citire. + Unable to open the file for reading. + Imposibil de deschis fișierul pentru citire. - Unable to open the file for writing. - Imposibil de deschis fișierul pentru scriere. + Unable to open the file for writing. + Imposibil de deschis fișierul pentru scriere. - Failed to parse XML: - Nu s-a reușit pararea XML: + Failed to parse XML: + Nu s-a reușit pararea XML: - Success - Succes + Success + Succes - Options saved successfully. - Opțiunile au fost salvate cu succes. + Options saved successfully. + Opțiunile au fost salvate cu succes. - Invalid Source - Sursă invalidă + Invalid Source + Sursă invalidă - The selected source is invalid. - Sursa selectată este invalidă. + The selected source is invalid. + Sursa selectată este invalidă. - File Exists - Fișier existent + File Exists + Fișier existent - File already exists. Do you want to replace it? - Fișierul există deja. Vrei să-l înlocuiești? + File already exists. Do you want to replace it? + Fișierul există deja. Vrei să-l înlocuiești? - Failed to save file: - Nu s-a reușit salvarea fișierului: + Failed to save file: + Nu s-a reușit salvarea fișierului: - Failed to download file: - Nu s-a reușit descărcarea fișierului: + Failed to download file: + Nu s-a reușit descărcarea fișierului: - Cheats Not Found - Cheats Nu au fost găsite + Cheats Not Found + Cheats Nu au fost găsite - CheatsNotFound_MSG - Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. + CheatsNotFound_MSG + Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. - Cheats Downloaded Successfully - Cheats descărcate cu succes + Cheats Downloaded Successfully + Cheats descărcate cu succes - CheatsDownloadedSuccessfully_MSG - Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. + CheatsDownloadedSuccessfully_MSG + Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. - Failed to save: - Nu s-a reușit salvarea: + Failed to save: + Nu s-a reușit salvarea: - Failed to download: - Nu s-a reușit descărcarea: + Failed to download: + Nu s-a reușit descărcarea: - Download Complete - Descărcare completă + Download Complete + Descărcare completă - DownloadComplete_MSG - Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. + DownloadComplete_MSG + Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. - Failed to parse JSON data from HTML. - Nu s-a reușit pararea datelor JSON din HTML. + Failed to parse JSON data from HTML. + Nu s-a reușit pararea datelor JSON din HTML. - Failed to retrieve HTML page. - Nu s-a reușit obținerea paginii HTML. + Failed to retrieve HTML page. + Nu s-a reușit obținerea paginii HTML. - The game is in version: %1 - Jocul este în versiunea: %1 + The game is in version: %1 + Jocul este în versiunea: %1 - The downloaded patch only works on version: %1 - Patch-ul descărcat funcționează doar pe versiunea: %1 + The downloaded patch only works on version: %1 + Patch-ul descărcat funcționează doar pe versiunea: %1 - You may need to update your game. - Este posibil să trebuiască să actualizezi jocul tău. + You may need to update your game. + Este posibil să trebuiască să actualizezi jocul tău. - Incompatibility Notice - Avertizare de incompatibilitate + Incompatibility Notice + Avertizare de incompatibilitate - Failed to open file: - Nu s-a reușit deschiderea fișierului: + Failed to open file: + Nu s-a reușit deschiderea fișierului: - XML ERROR: - EROARE XML: + XML ERROR: + EROARE XML: - Failed to open files.json for writing - Nu s-a reușit deschiderea files.json pentru scriere + Failed to open files.json for writing + Nu s-a reușit deschiderea files.json pentru scriere - Author: - Autor: + Author: + Autor: - Directory does not exist: - Directorul nu există: + Directory does not exist: + Directorul nu există: - Failed to open files.json for reading. - Nu s-a reușit deschiderea files.json pentru citire. + Failed to open files.json for reading. + Nu s-a reușit deschiderea files.json pentru citire. - Name: - Nume: + Name: + Nume: - Can't apply cheats before the game is started - Nu poți aplica cheats înainte ca jocul să înceapă. + Can't apply cheats before the game is started + Nu poți aplica cheats înainte ca jocul să înceapă. - Close - Închide + Close + Închide - - + + CheckUpdate - Auto Updater - Actualizator automat + Auto Updater + Actualizator automat - Error - Eroare + Error + Eroare - Network error: - Eroare de rețea: + Network error: + Eroare de rețea: - Error_Github_limit_MSG - Actualizatorul automat permite până la 60 de verificări de actualizare pe oră.\nAți atins această limită. Vă rugăm să încercați din nou mai târziu. + Error_Github_limit_MSG + Actualizatorul automat permite până la 60 de verificări de actualizare pe oră.\nAți atins această limită. Vă rugăm să încercați din nou mai târziu. - Failed to parse update information. - Nu s-au putut analiza informațiile de actualizare. + Failed to parse update information. + Nu s-au putut analiza informațiile de actualizare. - No pre-releases found. - Nu au fost găsite pre-lansări. + No pre-releases found. + Nu au fost găsite pre-lansări. - Invalid release data. - Datele versiunii sunt invalide. + Invalid release data. + Datele versiunii sunt invalide. - No download URL found for the specified asset. - Nu s-a găsit URL de descărcare pentru resursa specificată. + No download URL found for the specified asset. + Nu s-a găsit URL de descărcare pentru resursa specificată. - Your version is already up to date! - Versiunea ta este deja actualizată! + Your version is already up to date! + Versiunea ta este deja actualizată! - Update Available - Actualizare disponibilă + Update Available + Actualizare disponibilă - Update Channel - Canal de Actualizare + Update Channel + Canal de Actualizare - Current Version - Versiunea curentă + Current Version + Versiunea curentă - Latest Version - Ultima versiune + Latest Version + Ultima versiune - Do you want to update? - Doriți să actualizați? + Do you want to update? + Doriți să actualizați? - Show Changelog - Afișați jurnalul de modificări + Show Changelog + Afișați jurnalul de modificări - Check for Updates at Startup - Verifică actualizări la pornire + Check for Updates at Startup + Verifică actualizări la pornire - Update - Actualizare + Update + Actualizare - No - Nu + No + Nu - Hide Changelog - Ascunde jurnalul de modificări + Hide Changelog + Ascunde jurnalul de modificări - Changes - Modificări + Changes + Modificări - Network error occurred while trying to access the URL - A apărut o eroare de rețea în timpul încercării de a accesa URL-ul + Network error occurred while trying to access the URL + A apărut o eroare de rețea în timpul încercării de a accesa URL-ul - Download Complete - Descărcare completă + Download Complete + Descărcare completă - The update has been downloaded, press OK to install. - Actualizarea a fost descărcată, apăsați OK pentru a instala. + The update has been downloaded, press OK to install. + Actualizarea a fost descărcată, apăsați OK pentru a instala. - Failed to save the update file at - Nu s-a putut salva fișierul de actualizare la + Failed to save the update file at + Nu s-a putut salva fișierul de actualizare la - Starting Update... - Încep actualizarea... + Starting Update... + Încep actualizarea... - Failed to create the update script file - Nu s-a putut crea fișierul script de actualizare + Failed to create the update script file + Nu s-a putut crea fișierul script de actualizare - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Se colectează datele de compatibilitate, vă rugăm să așteptați + Fetching compatibility data, please wait + Se colectează datele de compatibilitate, vă rugăm să așteptați - Cancel - Anulează + Cancel + Anulează - Loading... - Se încarcă... + Loading... + Se încarcă... - Error - Eroare + Error + Eroare - Unable to update compatibility data! Try again later. - Nu se poate actualiza datele de compatibilitate! Încercați din nou mai târziu. + Unable to update compatibility data! Try again later. + Nu se poate actualiza datele de compatibilitate! Încercați din nou mai târziu. - Unable to open compatibility_data.json for writing. - Nu se poate deschide compatibility_data.json pentru scriere. + Unable to open compatibility_data.json for writing. + Nu se poate deschide compatibility_data.json pentru scriere. - Unknown - Necunoscut + Unknown + Necunoscut - Nothing - Nimic + Nothing + Nimic - Boots - Botine + Boots + Botine - Menus - Meniuri + Menus + Meniuri - Ingame - În joc + Ingame + În joc - Playable - Jucabil + Playable + Jucabil - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Icon + Icon + Icon - Name - Nume + Name + Nume - Serial - Serie + Serial + Serie - Compatibility - Compatibility + Compatibility + Compatibility - Region - Regiune + Region + Regiune - Firmware - Firmware + Firmware + Firmware - Size - Dimensiune + Size + Dimensiune - Version - Versiune + Version + Versiune - Path - Drum + Path + Drum - Play Time - Timp de Joacă + Play Time + Timp de Joacă - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Faceți clic pentru a vedea detalii pe GitHub + Click to see details on github + Faceți clic pentru a vedea detalii pe GitHub - Last updated - Ultima actualizare + Last updated + Ultima actualizare - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - SFO Viewer - SFO Viewer + Cheats / Patches + Cheats / Patches - Trophy Viewer - Trophy Viewer + SFO Viewer + SFO Viewer - Open Folder... - Deschide Folder... + Trophy Viewer + Trophy Viewer - Open Game Folder - Deschide Folder Joc + Open Folder... + Deschide Folder... - Open Save Data Folder - Deschide Folder Date Salvate + Open Game Folder + Deschide Folder Joc - Open Log Folder - Deschide Folder Jurnal + Open Save Data Folder + Deschide Folder Date Salvate - Copy info... - Copy info... + Open Log Folder + Deschide Folder Jurnal - Copy Name - Copy Name + Copy info... + Copy info... - Copy Serial - Copy Serial + Copy Name + Copy Name - Copy All - Copy All + Copy Serial + Copy Serial - Delete... - Delete... + Copy Version + Copy Version - Delete Game - Delete Game + Copy Size + Copy Size - Delete Update - Delete Update + Copy All + Copy All - Delete DLC - Delete DLC + Delete... + Delete... - Compatibility... - Compatibility... + Delete Game + Delete Game - Update database - Update database + Delete Update + Delete Update - View report - View report + Delete DLC + Delete DLC - Submit a report - Submit a report + Compatibility... + Compatibility... - Shortcut creation - Shortcut creation + Update database + Update database - Shortcut created successfully! - Shortcut created successfully! + View report + View report - Error - Error + Submit a report + Submit a report - Error creating shortcut! - Error creating shortcut! + Shortcut creation + Shortcut creation - Install PKG - Install PKG + Shortcut created successfully! + Shortcut created successfully! - Game - Game + Error + Error - This game has no update to delete! - This game has no update to delete! + Error creating shortcut! + Error creating shortcut! - Update - Update + Install PKG + Install PKG - This game has no DLC to delete! - This game has no DLC to delete! + Game + Game - DLC - DLC + This game has no update to delete! + This game has no update to delete! - Delete %1 - Delete %1 + Update + Update - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + This game has no DLC to delete! + This game has no DLC to delete! - Open Update Folder - + DLC + DLC - Cheats / Patches - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Verifică actualizările + Check for Updates + Verifică actualizările - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Descarcă Coduri / Patch-uri + Download Cheats/Patches + Descarcă Coduri / Patch-uri - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Ajutor + Help + Ajutor - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Lista jocurilor + Game List + Lista jocurilor - * Unsupported Vulkan Version - * Versiune Vulkan nesuportată + * Unsupported Vulkan Version + * Versiune Vulkan nesuportată - Download Cheats For All Installed Games - Descarcă Cheats pentru toate jocurile instalate + Download Cheats For All Installed Games + Descarcă Cheats pentru toate jocurile instalate - Download Patches For All Games - Descarcă Patches pentru toate jocurile + Download Patches For All Games + Descarcă Patches pentru toate jocurile - Download Complete - Descărcare completă + Download Complete + Descărcare completă - You have downloaded cheats for all the games you have installed. - Ai descărcat cheats pentru toate jocurile instalate. + You have downloaded cheats for all the games you have installed. + Ai descărcat cheats pentru toate jocurile instalate. - Patches Downloaded Successfully! - Patches descărcate cu succes! + Patches Downloaded Successfully! + Patches descărcate cu succes! - All Patches available for all games have been downloaded. - Toate Patches disponibile pentru toate jocurile au fost descărcate. + All Patches available for all games have been downloaded. + Toate Patches disponibile pentru toate jocurile au fost descărcate. - Games: - Jocuri: + Games: + Jocuri: - ELF files (*.bin *.elf *.oelf) - Fișiere ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Fișiere ELF (*.bin *.elf *.oelf) - Game Boot - Boot Joc + Game Boot + Boot Joc - Only one file can be selected! - Numai un fișier poate fi selectat! + Only one file can be selected! + Numai un fișier poate fi selectat! - PKG Extraction - Extracție PKG + PKG Extraction + Extracție PKG - Patch detected! - Patch detectat! + Patch detected! + Patch detectat! - PKG and Game versions match: - Versiunile PKG și ale jocului sunt compatibile: + PKG and Game versions match: + Versiunile PKG și ale jocului sunt compatibile: - Would you like to overwrite? - Doriți să suprascrieți? + Would you like to overwrite? + Doriți să suprascrieți? - PKG Version %1 is older than installed version: - Versiunea PKG %1 este mai veche decât versiunea instalată: + PKG Version %1 is older than installed version: + Versiunea PKG %1 este mai veche decât versiunea instalată: - Game is installed: - Jocul este instalat: + Game is installed: + Jocul este instalat: - Would you like to install Patch: - Doriți să instalați patch-ul: + Would you like to install Patch: + Doriți să instalați patch-ul: - DLC Installation - Instalare DLC + DLC Installation + Instalare DLC - Would you like to install DLC: %1? - Doriți să instalați DLC-ul: %1? + Would you like to install DLC: %1? + Doriți să instalați DLC-ul: %1? - DLC already installed: - DLC deja instalat: + DLC already installed: + DLC deja instalat: - Game already installed - Jocul deja instalat + Game already installed + Jocul deja instalat - PKG ERROR - EROARE PKG + PKG ERROR + EROARE PKG - Extracting PKG %1/%2 - Extracție PKG %1/%2 + Extracting PKG %1/%2 + Extracție PKG %1/%2 - Extraction Finished - Extracție terminată + Extraction Finished + Extracție terminată - Game successfully installed at %1 - Jocul a fost instalat cu succes la %1 + Game successfully installed at %1 + Jocul a fost instalat cu succes la %1 - File doesn't appear to be a valid PKG file - Fișierul nu pare să fie un fișier PKG valid + File doesn't appear to be a valid PKG file + Fișierul nu pare să fie un fișier PKG valid - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Nume + PKG ERROR + EROARE PKG - Serial - Serie + Name + Nume - Installed - + Serial + Serie - Size - Dimensiune + Installed + Installed - Category - + Size + Dimensiune - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Regiune + FW + FW - Flags - + Region + Regiune - Path - Drum + Flags + Flags - File - File + Path + Drum - PKG ERROR - EROARE PKG + File + File - Unknown - Necunoscut + Unknown + Necunoscut - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - Mod Ecran Complet + Fullscreen Mode + Mod Ecran Complet - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Tab-ul implicit la deschiderea setărilor + Default tab when opening settings + Tab-ul implicit la deschiderea setărilor - Show Game Size In List - Afișează dimensiunea jocului în listă + Show Game Size In List + Afișează dimensiunea jocului în listă - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Activați Discord Rich Presence + Enable Discord Rich Presence + Activați Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - Deschide locația jurnalului + Open Log Location + Deschide locația jurnalului - Input - Introducere + Input + Introducere - Cursor - Cursor + Cursor + Cursor - Hide Cursor - Ascunde cursorul + Hide Cursor + Ascunde cursorul - Hide Cursor Idle Timeout - Timeout pentru ascunderea cursorului inactiv + Hide Cursor Idle Timeout + Timeout pentru ascunderea cursorului inactiv - s - s + s + s - Controller - Controler + Controller + Controler - Back Button Behavior - Comportament buton înapoi + Back Button Behavior + Comportament buton înapoi - Graphics - Graphics + Graphics + Graphics - GUI - Interfață + GUI + Interfață - User - Utilizator + User + Utilizator - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Trasee + Enable HDR + Enable HDR - Game Folders - Dosare de joc + Paths + Trasee - Add... - Adaugă... + Game Folders + Dosare de joc - Remove - Eliminare + Add... + Adaugă... - Debug - Debug + Remove + Eliminare - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Actualizare + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Verifică actualizări la pornire + Update + Actualizare - Always Show Changelog - Arată întotdeauna jurnalul modificărilor + Check for Updates at Startup + Verifică actualizări la pornire - Update Channel - Canal de Actualizare + Always Show Changelog + Arată întotdeauna jurnalul modificărilor - Check for Updates - Verifică actualizări + Update Channel + Canal de Actualizare - GUI Settings - Setări GUI + Check for Updates + Verifică actualizări - Title Music - Title Music + GUI Settings + Setări GUI - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Redă muzica titlului + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Redă muzica titlului - Volume - Volum + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Salvează + Game Compatibility + Game Compatibility - Apply - Aplică + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Restabilește Impozitivele + Update Compatibility Database + Update Compatibility Database - Close - Închide + Volume + Volum - Point your mouse at an option to display its description. - Indicați mouse-ul asupra unei opțiuni pentru a afișa descrierea acesteia. + Save + Salvează - consoleLanguageGroupBox - Limba consolei:\nSetează limba pe care o folosește jocul PS4.\nSe recomandă să setezi această opțiune pe o limbă pe care jocul o suportă, ceea ce poate varia în funcție de regiune. + Apply + Aplică - emulatorLanguageGroupBox - Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. + Restore Defaults + Restabilește Impozitivele - fullscreenCheckBox - Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. + Close + Închide - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Indicați mouse-ul asupra unei opțiuni pentru a afișa descrierea acesteia. - showSplashCheckBox - Afișează ecranul de încărcare:\nAfișează ecranul de încărcare al jocului (o imagine specială) în timp ce jocul pornește. + consoleLanguageGroupBox + Limba consolei:\nSetează limba pe care o folosește jocul PS4.\nSe recomandă să setezi această opțiune pe o limbă pe care jocul o suportă, ceea ce poate varia în funcție de regiune. - discordRPCCheckbox - Activați Discord Rich Presence:\nAfișează pictograma emulatorului și informații relevante pe profilul dumneavoastră Discord. + emulatorLanguageGroupBox + Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. - userName - Nume utilizator:\nSetează numele de utilizator al contului PS4, care poate fi afișat de unele jocuri. + fullscreenCheckBox + Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Tip jurnal:\nSetează dacă să sincronizezi ieșirea ferestrei de jurnal pentru performanță. Aceasta poate avea efecte adverse asupra emulării. + showSplashCheckBox + Afișează ecranul de încărcare:\nAfișează ecranul de încărcare al jocului (o imagine specială) în timp ce jocul pornește. - logFilter - Filtrul jurnalului:\nFiltrează jurnalul pentru a imprima doar informații specifice.\nExemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare. + discordRPCCheckbox + Activați Discord Rich Presence:\nAfișează pictograma emulatorului și informații relevante pe profilul dumneavoastră Discord. - updaterGroupBox - Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. + userName + Nume utilizator:\nSetează numele de utilizator al contului PS4, care poate fi afișat de unele jocuri. - GUIMusicGroupBox - Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Tip jurnal:\nSetează dacă să sincronizezi ieșirea ferestrei de jurnal pentru performanță. Aceasta poate avea efecte adverse asupra emulării. - hideCursorGroupBox - Ascunde cursorul:\nAlegeți când va dispărea cursorul:\nNiciodată: Vei vedea întotdeauna mouse-ul.\nInactiv: Setează un timp pentru a dispărea după inactivitate.\nÎntotdeauna: nu vei vedea niciodată mouse-ul. + logFilter + Filtrul jurnalului:\nFiltrează jurnalul pentru a imprima doar informații specifice.\nExemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare. - idleTimeoutGroupBox - Setați un timp pentru ca mouse-ul să dispară după ce a fost inactiv. + updaterGroupBox + Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. - backButtonBehaviorGroupBox - Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului să imite atingerea poziției specificate pe touchpad-ul PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Ascunde cursorul:\nAlegeți când va dispărea cursorul:\nNiciodată: Vei vedea întotdeauna mouse-ul.\nInactiv: Setează un timp pentru a dispărea după inactivitate.\nÎntotdeauna: nu vei vedea niciodată mouse-ul. - Never - Niciodată + idleTimeoutGroupBox + Setați un timp pentru ca mouse-ul să dispară după ce a fost inactiv. - Idle - Inactiv + backButtonBehaviorGroupBox + Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului să imite atingerea poziției specificate pe touchpad-ul PS4. - Always - Întotdeauna + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Touchpad Stânga + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Touchpad Dreapta + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Centru Touchpad + Never + Niciodată - None - Niciunul + Idle + Inactiv - graphicsAdapterGroupBox - Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează "Auto Select" pentru a-l determina automat. + Always + Întotdeauna - resolutionLayout - Lățime/Înălțime:\nSetează dimensiunea ferestrei emulatorului la lansare, care poate fi redimensionată în timpul jocului.\nAceasta este diferită de rezoluția din joc. + Touchpad Left + Touchpad Stânga - heightDivider - Împărțitor Vblank:\nRata de cadre cu care emulatorul se reîmprospătează este multiplicată cu acest număr. Schimbarea acestuia poate avea efecte adverse, cum ar fi creșterea vitezei jocului sau distrugerea funcționalității critice a jocului care nu se așteaptă ca aceasta să se schimbe! + Touchpad Right + Touchpad Dreapta - dumpShadersCheckBox - Activează salvarea shaderelor:\nÎn scopuri de depanare tehnică, salvează shader-urile jocului într-un folder pe măsură ce sunt randate. + Touchpad Center + Centru Touchpad - nullGpuCheckBox - Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică. + None + Niciunul - gameFoldersBox - Folderele jocurilor:\nLista folderelor pentru a verifica jocurile instalate. + graphicsAdapterGroupBox + Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează "Auto Select" pentru a-l determina automat. - addFolderButton - Adăugați:\nAdăugați un folder la listă. + resolutionLayout + Lățime/Înălțime:\nSetează dimensiunea ferestrei emulatorului la lansare, care poate fi redimensionată în timpul jocului.\nAceasta este diferită de rezoluția din joc. - removeFolderButton - Eliminați:\nÎndepărtați un folder din listă. + heightDivider + Împărțitor Vblank:\nRata de cadre cu care emulatorul se reîmprospătează este multiplicată cu acest număr. Schimbarea acestuia poate avea efecte adverse, cum ar fi creșterea vitezei jocului sau distrugerea funcționalității critice a jocului care nu se așteaptă ca aceasta să se schimbe! - debugDump - Activează salvarea pentru depanare:\nSalvează simbolurile de import și export și informațiile din antetul fișierului pentru aplicația PS4 care rulează în prezent într-un director. + dumpShadersCheckBox + Activează salvarea shaderelor:\nÎn scopuri de depanare tehnică, salvează shader-urile jocului într-un folder pe măsură ce sunt randate. - vkValidationCheckBox - Activează straturile de validare Vulkan:\nActivează un sistem care validează starea renderer-ului Vulkan și înregistrează informații despre starea sa internă. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. + nullGpuCheckBox + Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică. - vkSyncValidationCheckBox - Activează validarea sincronizării Vulkan:\nActivează un sistem care validează sincronizarea sarcinilor de redare Vulkan. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. + gameFoldersBox + Folderele jocurilor:\nLista folderelor pentru a verifica jocurile instalate. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Adăugați:\nAdăugați un folder la listă. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Eliminați:\nÎndepărtați un folder din listă. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Activează salvarea pentru depanare:\nSalvează simbolurile de import și export și informațiile din antetul fișierului pentru aplicația PS4 care rulează în prezent într-un director. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Activează straturile de validare Vulkan:\nActivează un sistem care validează starea renderer-ului Vulkan și înregistrează informații despre starea sa internă. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Activează validarea sincronizării Vulkan:\nActivează un sistem care validează sincronizarea sarcinilor de redare Vulkan. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - Borderless - + rdocCheckBox + Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 2e15297e1..70294e896 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - О shadPS4 + About shadPS4 + О shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. - This software should not be used to play games you have not legally obtained. - Это программное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. + This software should not be used to play games you have not legally obtained. + Это программное обеспечение не должно использоваться для запуска игр, которые вы получили нелегально. - - + + CheatsPatches - Cheats / Patches for - Читы и патчи для + Cheats / Patches for + Читы и патчи для - defaultTextEdit_MSG - Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Изображение недоступно + No Image Available + Изображение недоступно - Serial: - Серийный номер: + Serial: + Серийный номер: - Version: - Версия: + Version: + Версия: - Size: - Размер: + Size: + Размер: - Select Cheat File: - Выберите файл чита: + Select Cheat File: + Выберите файл чита: - Repository: - Репозиторий: + Repository: + Репозиторий: - Download Cheats - Скачать читы + Download Cheats + Скачать читы - Delete File - Удалить файл + Delete File + Удалить файл - No files selected. - Файлы не выбраны. + No files selected. + Файлы не выбраны. - You can delete the cheats you don't want after downloading them. - Вы можете удалить ненужные читы после их скачивания. + You can delete the cheats you don't want after downloading them. + Вы можете удалить ненужные читы после их скачивания. - Do you want to delete the selected file?\n%1 - Вы хотите удалить выбранный файл?\n%1 + Do you want to delete the selected file?\n%1 + Вы хотите удалить выбранный файл?\n%1 - Select Patch File: - Выберите файл патча: + Select Patch File: + Выберите файл патча: - Download Patches - Скачать патчи + Download Patches + Скачать патчи - Save - Сохранить + Save + Сохранить - Cheats - Читы + Cheats + Читы - Patches - Патчи + Patches + Патчи - Error - Ошибка + Error + Ошибка - No patch selected. - Патч не выбран. + No patch selected. + Патч не выбран. - Unable to open files.json for reading. - Не удалось открыть файл files.json для чтения. + Unable to open files.json for reading. + Не удалось открыть файл files.json для чтения. - No patch file found for the current serial. - Не найден файл патча для текущего серийного номера. + No patch file found for the current serial. + Не найден файл патча для текущего серийного номера. - Unable to open the file for reading. - Не удалось открыть файл для чтения. + Unable to open the file for reading. + Не удалось открыть файл для чтения. - Unable to open the file for writing. - Не удалось открыть файл для записи. + Unable to open the file for writing. + Не удалось открыть файл для записи. - Failed to parse XML: - Не удалось разобрать XML: + Failed to parse XML: + Не удалось разобрать XML: - Success - Успех + Success + Успех - Options saved successfully. - Опции успешно сохранены. + Options saved successfully. + Опции успешно сохранены. - Invalid Source - Неверный источник + Invalid Source + Неверный источник - The selected source is invalid. - Выбранный источник недействителен. + The selected source is invalid. + Выбранный источник недействителен. - File Exists - Файл существует + File Exists + Файл существует - File already exists. Do you want to replace it? - Файл уже существует. Хотите заменить его? + File already exists. Do you want to replace it? + Файл уже существует. Хотите заменить его? - Failed to save file: - Не удалось сохранить файл: + Failed to save file: + Не удалось сохранить файл: - Failed to download file: - Не удалось скачать файл: + Failed to download file: + Не удалось скачать файл: - Cheats Not Found - Читы не найдены + Cheats Not Found + Читы не найдены - CheatsNotFound_MSG - Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. + CheatsNotFound_MSG + Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. - Cheats Downloaded Successfully - Читы успешно скачаны + Cheats Downloaded Successfully + Читы успешно скачаны - CheatsDownloadedSuccessfully_MSG - Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. + CheatsDownloadedSuccessfully_MSG + Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. - Failed to save: - Не удалось сохранить: + Failed to save: + Не удалось сохранить: - Failed to download: - Не удалось скачать: + Failed to download: + Не удалось скачать: - Download Complete - Скачивание завершено + Download Complete + Скачивание завершено - DownloadComplete_MSG - Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. + DownloadComplete_MSG + Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. - Failed to parse JSON data from HTML. - Не удалось разобрать данные JSON из HTML. + Failed to parse JSON data from HTML. + Не удалось разобрать данные JSON из HTML. - Failed to retrieve HTML page. - Не удалось получить HTML-страницу. + Failed to retrieve HTML page. + Не удалось получить HTML-страницу. - The game is in version: %1 - Игра в версии: %1 + The game is in version: %1 + Игра в версии: %1 - The downloaded patch only works on version: %1 - Скачанный патч работает только на версии: %1 + The downloaded patch only works on version: %1 + Скачанный патч работает только на версии: %1 - You may need to update your game. - Вам может понадобиться обновить игру. + You may need to update your game. + Вам может понадобиться обновить игру. - Incompatibility Notice - Уведомление о несовместимости + Incompatibility Notice + Уведомление о несовместимости - Failed to open file: - Не удалось открыть файл: + Failed to open file: + Не удалось открыть файл: - XML ERROR: - ОШИБКА XML: + XML ERROR: + ОШИБКА XML: - Failed to open files.json for writing - Не удалось открыть файл files.json для записи + Failed to open files.json for writing + Не удалось открыть файл files.json для записи - Author: - Автор: + Author: + Автор: - Directory does not exist: - Каталог не существует: + Directory does not exist: + Каталог не существует: - Failed to open files.json for reading. - Не удалось открыть файл files.json для чтения. + Failed to open files.json for reading. + Не удалось открыть файл files.json для чтения. - Name: - Имя: + Name: + Имя: - Can't apply cheats before the game is started - Невозможно применить читы до начала игры + Can't apply cheats before the game is started + Невозможно применить читы до начала игры - Close - Закрыть + Close + Закрыть - - + + CheckUpdate - Auto Updater - Автообновление + Auto Updater + Автообновление - Error - Ошибка + Error + Ошибка - Network error: - Сетевая ошибка: + Network error: + Сетевая ошибка: - Error_Github_limit_MSG - Автообновление позволяет выполнять до 60 проверок обновлений в час.\nВы достигли этого лимита. Пожалуйста, попробуйте позже. + Error_Github_limit_MSG + Автообновление позволяет выполнять до 60 проверок обновлений в час.\nВы достигли этого лимита. Пожалуйста, попробуйте позже. - Failed to parse update information. - Не удалось разобрать информацию об обновлении. + Failed to parse update information. + Не удалось разобрать информацию об обновлении. - No pre-releases found. - Предварительных версий не найдено. + No pre-releases found. + Предварительных версий не найдено. - Invalid release data. - Недопустимые данные релиза. + Invalid release data. + Недопустимые данные релиза. - No download URL found for the specified asset. - Не найден URL для загрузки указанного ресурса. + No download URL found for the specified asset. + Не найден URL для загрузки указанного ресурса. - Your version is already up to date! - Ваша версия уже обновлена! + Your version is already up to date! + Ваша версия уже обновлена! - Update Available - Доступно обновление + Update Available + Доступно обновление - Update Channel - Канал обновления + Update Channel + Канал обновления - Current Version - Текущая версия + Current Version + Текущая версия - Latest Version - Последняя версия + Latest Version + Последняя версия - Do you want to update? - Вы хотите обновиться? + Do you want to update? + Вы хотите обновиться? - Show Changelog - Показать журнал изменений + Show Changelog + Показать журнал изменений - Check for Updates at Startup - Проверка при запуске + Check for Updates at Startup + Проверка при запуске - Update - Обновить + Update + Обновить - No - Нет + No + Нет - Hide Changelog - Скрыть журнал изменений + Hide Changelog + Скрыть журнал изменений - Changes - Журнал изменений + Changes + Журнал изменений - Network error occurred while trying to access the URL - Произошла сетевая ошибка при попытке доступа к URL + Network error occurred while trying to access the URL + Произошла сетевая ошибка при попытке доступа к URL - Download Complete - Скачивание завершено + Download Complete + Скачивание завершено - The update has been downloaded, press OK to install. - Обновление загружено, нажмите OK для установки. + The update has been downloaded, press OK to install. + Обновление загружено, нажмите OK для установки. - Failed to save the update file at - Не удалось сохранить файл обновления в + Failed to save the update file at + Не удалось сохранить файл обновления в - Starting Update... - Начинаем обновление... + Starting Update... + Начинаем обновление... - Failed to create the update script file - Не удалось создать файл скрипта обновления + Failed to create the update script file + Не удалось создать файл скрипта обновления - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Загрузка данных о совместимости, пожалуйста, подождите + Fetching compatibility data, please wait + Загрузка данных о совместимости, пожалуйста, подождите - Cancel - Отмена + Cancel + Отмена - Loading... - Загрузка... + Loading... + Загрузка... - Error - Ошибка + Error + Ошибка - Unable to update compatibility data! Try again later. - Не удалось обновить данные совместимости! Повторите попытку позже. + Unable to update compatibility data! Try again later. + Не удалось обновить данные совместимости! Повторите попытку позже. - Unable to open compatibility_data.json for writing. - Не удалось открыть файл compatibility_data.json для записи. + Unable to open compatibility_data.json for writing. + Не удалось открыть файл compatibility_data.json для записи. - Unknown - Неизвестно + Unknown + Неизвестно - Nothing - Ничего + Nothing + Ничего - Boots - Запускается + Boots + Запускается - Menus - В меню + Menus + В меню - Ingame - В игре + Ingame + В игре - Playable - Играбельно + Playable + Играбельно - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Открыть папку + Open Folder + Открыть папку - - + + GameInfoClass - Loading game list, please wait :3 - Загрузка списка игр, пожалуйста подождите :3 + Loading game list, please wait :3 + Загрузка списка игр, пожалуйста подождите :3 - Cancel - Отмена + Cancel + Отмена - Loading... - Загрузка... + Loading... + Загрузка... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Выберите папку + shadPS4 - Choose directory + shadPS4 - Выберите папку - Directory to install games - Каталог для установки игр + Directory to install games + Каталог для установки игр - Browse - Обзор + Browse + Обзор - Error - Ошибка + Error + Ошибка - Directory to install DLC - Каталог для установки DLC + Directory to install DLC + Каталог для установки DLC - - + + GameListFrame - Icon - Иконка + Icon + Иконка - Name - Название + Name + Название - Serial - Серийный номер + Serial + Серийный номер - Compatibility - Совместимость + Compatibility + Совместимость - Region - Регион + Region + Регион - Firmware - Прошивка + Firmware + Прошивка - Size - Размер + Size + Размер - Version - Версия + Version + Версия - Path - Путь + Path + Путь - Play Time - Время в игре + Play Time + Время в игре - Never Played - Нет + Never Played + Нет - h - ч + h + ч - m - м + m + м - s - с + s + с - Compatibility is untested - Совместимость не проверена + Compatibility is untested + Совместимость не проверена - Game does not initialize properly / crashes the emulator - Игра не инициализируется правильно / эмулятор вылетает + Game does not initialize properly / crashes the emulator + Игра не инициализируется правильно / эмулятор вылетает - Game boots, but only displays a blank screen - Игра запускается, но показывает только пустой экран + Game boots, but only displays a blank screen + Игра запускается, но показывает только пустой экран - Game displays an image but does not go past the menu - Игра показывает картинку, но не проходит дальше меню + Game displays an image but does not go past the menu + Игра показывает картинку, но не проходит дальше меню - Game has game-breaking glitches or unplayable performance - Игра имеет ломающие игру глюки или плохую производительность + Game has game-breaking glitches or unplayable performance + Игра имеет ломающие игру глюки или плохую производительность - Game can be completed with playable performance and no major glitches - Игра может быть пройдена с хорошей производительностью и без серьезных сбоев + Game can be completed with playable performance and no major glitches + Игра может быть пройдена с хорошей производительностью и без серьезных сбоев - Click to see details on github - Нажмите, чтобы увидеть детали на GitHub + Click to see details on github + Нажмите, чтобы увидеть детали на GitHub - Last updated - Последнее обновление + Last updated + Последнее обновление - - + + GameListUtils - B - Б + B + Б - KB - КБ + KB + КБ - MB - МБ + MB + МБ - GB - ГБ + GB + ГБ - TB - ТБ + TB + ТБ - - + + GuiContextMenus - Create Shortcut - Создать ярлык + Create Shortcut + Создать ярлык - Cheats / Patches - Читы и патчи + Cheats / Patches + Читы и патчи - SFO Viewer - Просмотр SFO + SFO Viewer + Просмотр SFO - Trophy Viewer - Просмотр трофеев + Trophy Viewer + Просмотр трофеев - Open Folder... - Открыть папку... + Open Folder... + Открыть папку... - Open Game Folder - Открыть папку с игрой + Open Game Folder + Открыть папку с игрой - Open Save Data Folder - Открыть папку сохранений + Open Save Data Folder + Открыть папку сохранений - Open Log Folder - Открыть папку логов + Open Log Folder + Открыть папку логов - Copy info... - Копировать информацию... + Copy info... + Копировать информацию... - Copy Name - Копировать имя + Copy Name + Копировать имя - Copy Serial - Копировать серийный номер + Copy Serial + Копировать серийный номер - Copy All - Копировать всё + Copy Version + Copy Version - Delete... - Удалить... + Copy Size + Copy Size - Delete Game - Удалить игру + Copy All + Копировать всё - Delete Update - Удалить обновление + Delete... + Удалить... - Delete DLC - Удалить DLC + Delete Game + Удалить игру - Compatibility... - Совместимость... + Delete Update + Удалить обновление - Update database - Обновить базу данных + Delete DLC + Удалить DLC - View report - Посмотреть отчет + Compatibility... + Совместимость... - Submit a report - Отправить отчёт + Update database + Обновить базу данных - Shortcut creation - Создание ярлыка + View report + Посмотреть отчет - Shortcut created successfully! - Ярлык создан успешно! + Submit a report + Отправить отчёт - Error - Ошибка + Shortcut creation + Создание ярлыка - Error creating shortcut! - Ошибка создания ярлыка! + Shortcut created successfully! + Ярлык создан успешно! - Install PKG - Установить PKG + Error + Ошибка - Game - Игры + Error creating shortcut! + Ошибка создания ярлыка! - This game has no update to delete! - У этой игры нет обновлений для удаления! + Install PKG + Установить PKG - Update - Обновления + Game + Игры - This game has no DLC to delete! - У этой игры нет DLC для удаления! + This game has no update to delete! + У этой игры нет обновлений для удаления! - DLC - DLC + Update + Обновления - Delete %1 - Удалить %1 + This game has no DLC to delete! + У этой игры нет DLC для удаления! - Are you sure you want to delete %1's %2 directory? - Вы уверены, что хотите удалить папку %2 %1? + DLC + DLC - Open Update Folder - Открыть папку обновлений + Delete %1 + Удалить %1 - Delete Save Data - Удалить сохранения + Are you sure you want to delete %1's %2 directory? + Вы уверены, что хотите удалить папку %2 %1? - This game has no update folder to open! - У этой игры нет папки обновлений, которую можно открыть! + Open Update Folder + Открыть папку обновлений - Failed to convert icon. - Не удалось преобразовать иконку. + Delete Save Data + Удалить сохранения - This game has no save data to delete! - У этой игры нет сохранений, которые можно удалить! + This game has no update folder to open! + У этой игры нет папки обновлений, которую можно открыть! - Save Data - Сохранения + Failed to convert icon. + Не удалось преобразовать иконку. - Copy Version - + This game has no save data to delete! + У этой игры нет сохранений, которые можно удалить! - Copy Size - + Save Data + Сохранения - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Выберите папку + shadPS4 - Choose directory + shadPS4 - Выберите папку - Select which directory you want to install to. - Выберите папку, в которую вы хотите установить. + Select which directory you want to install to. + Выберите папку, в которую вы хотите установить. - Install All Queued to Selected Folder - Установить все из очереди в выбранную папку + Install All Queued to Selected Folder + Установить все из очереди в выбранную папку - Delete PKG File on Install - Удалить файл PKG при установке + Delete PKG File on Install + Удалить файл PKG при установке - - + + MainWindow - Open/Add Elf Folder - Открыть/Добавить папку Elf + Open/Add Elf Folder + Открыть/Добавить папку Elf - Install Packages (PKG) - Установить пакеты (PKG) + Install Packages (PKG) + Установить пакеты (PKG) - Boot Game - Запустить игру + Boot Game + Запустить игру - Check for Updates - Проверить обновления + Check for Updates + Проверить обновления - About shadPS4 - О shadPS4 + About shadPS4 + О shadPS4 - Configure... - Настроить... + Configure... + Настроить... - Install application from a .pkg file - Установить приложение из файла .pkg + Install application from a .pkg file + Установить приложение из файла .pkg - Recent Games - Недавние игры + Recent Games + Недавние игры - Open shadPS4 Folder - Открыть папку shadPS4 + Open shadPS4 Folder + Открыть папку shadPS4 - Exit - Выход + Exit + Выход - Exit shadPS4 - Выйти из shadPS4 + Exit shadPS4 + Выйти из shadPS4 - Exit the application. - Выйти из приложения. + Exit the application. + Выйти из приложения. - Show Game List - Показать список игр + Show Game List + Показать список игр - Game List Refresh - Обновить список игр + Game List Refresh + Обновить список игр - Tiny - Крошечный + Tiny + Крошечный - Small - Маленький + Small + Маленький - Medium - Средний + Medium + Средний - Large - Большой + Large + Большой - List View - Список + List View + Список - Grid View - Сетка + Grid View + Сетка - Elf Viewer - Исполняемый файл + Elf Viewer + Исполняемый файл - Game Install Directory - Каталог установки игры + Game Install Directory + Каталог установки игры - Download Cheats/Patches - Скачать читы или патчи + Download Cheats/Patches + Скачать читы или патчи - Dump Game List - Дамп списка игр + Dump Game List + Дамп списка игр - PKG Viewer - Просмотр PKG + PKG Viewer + Просмотр PKG - Search... - Поиск... + Search... + Поиск... - File - Файл + File + Файл - View - Вид + View + Вид - Game List Icons - Размер иконок списка игр + Game List Icons + Размер иконок списка игр - Game List Mode - Вид списка игр + Game List Mode + Вид списка игр - Settings - Настройки + Settings + Настройки - Utils - Утилиты + Utils + Утилиты - Themes - Темы + Themes + Темы - Help - Помощь + Help + Помощь - Dark - Темная + Dark + Темная - Light - Светлая + Light + Светлая - Green - Зеленая + Green + Зеленая - Blue - Синяя + Blue + Синяя - Violet - Фиолетовая + Violet + Фиолетовая - toolBar - Панель инструментов + toolBar + Панель инструментов - Game List - Список игр + Game List + Список игр - * Unsupported Vulkan Version - * Неподдерживаемая версия Vulkan + * Unsupported Vulkan Version + * Неподдерживаемая версия Vulkan - Download Cheats For All Installed Games - Скачать читы для всех установленных игр + Download Cheats For All Installed Games + Скачать читы для всех установленных игр - Download Patches For All Games - Скачать патчи для всех игр + Download Patches For All Games + Скачать патчи для всех игр - Download Complete - Скачивание завершено + Download Complete + Скачивание завершено - You have downloaded cheats for all the games you have installed. - Вы скачали читы для всех установленных игр. + You have downloaded cheats for all the games you have installed. + Вы скачали читы для всех установленных игр. - Patches Downloaded Successfully! - Патчи успешно скачаны! + Patches Downloaded Successfully! + Патчи успешно скачаны! - All Patches available for all games have been downloaded. - Все доступные патчи для всех игр были скачаны. + All Patches available for all games have been downloaded. + Все доступные патчи для всех игр были скачаны. - Games: - Игры: + Games: + Игры: - ELF files (*.bin *.elf *.oelf) - Файлы ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Файлы ELF (*.bin *.elf *.oelf) - Game Boot - Запуск игры + Game Boot + Запуск игры - Only one file can be selected! - Можно выбрать только один файл! + Only one file can be selected! + Можно выбрать только один файл! - PKG Extraction - Извлечение PKG + PKG Extraction + Извлечение PKG - Patch detected! - Обнаружен патч! + Patch detected! + Обнаружен патч! - PKG and Game versions match: - Версии PKG и игры совпадают: + PKG and Game versions match: + Версии PKG и игры совпадают: - Would you like to overwrite? - Хотите перезаписать? + Would you like to overwrite? + Хотите перезаписать? - PKG Version %1 is older than installed version: - Версия PKG %1 старше установленной версии: + PKG Version %1 is older than installed version: + Версия PKG %1 старше установленной версии: - Game is installed: - Игра установлена: + Game is installed: + Игра установлена: - Would you like to install Patch: - Хотите установить патч: + Would you like to install Patch: + Хотите установить патч: - DLC Installation - Установка DLC + DLC Installation + Установка DLC - Would you like to install DLC: %1? - Вы хотите установить DLC: %1? + Would you like to install DLC: %1? + Вы хотите установить DLC: %1? - DLC already installed: - DLC уже установлен: + DLC already installed: + DLC уже установлен: - Game already installed - Игра уже установлена + Game already installed + Игра уже установлена - PKG ERROR - ОШИБКА PKG + PKG ERROR + ОШИБКА PKG - Extracting PKG %1/%2 - Извлечение PKG %1/%2 + Extracting PKG %1/%2 + Извлечение PKG %1/%2 - Extraction Finished - Извлечение завершено + Extraction Finished + Извлечение завершено - Game successfully installed at %1 - Игра успешно установлена в %1 + Game successfully installed at %1 + Игра успешно установлена в %1 - File doesn't appear to be a valid PKG file - Файл не является допустимым файлом PKG + File doesn't appear to be a valid PKG file + Файл не является допустимым файлом PKG - Run Game - Запустить игру + Run Game + Запустить игру - Eboot.bin file not found - Файл eboot.bin не найден + Eboot.bin file not found + Файл eboot.bin не найден - PKG File (*.PKG *.pkg) - Файл PKG (*.PKG *.pkg) + PKG File (*.PKG *.pkg) + Файл PKG (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - Выбранный PKG является патчем или DLC, пожалуйста, сначала установите игру! + PKG is a patch or DLC, please install the game first! + Выбранный PKG является патчем или DLC, пожалуйста, сначала установите игру! - Game is already running! - Игра уже запущена! + Game is already running! + Игра уже запущена! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Открыть папку + Open Folder + Открыть папку - PKG ERROR - ОШИБКА PKG + PKG ERROR + ОШИБКА PKG - Name - Название + Name + Название - Serial - Серийный номер + Serial + Серийный номер - Installed - + Installed + Installed - Size - Размер + Size + Размер - Category - + Category + Category - Type - + Type + Type - App Ver - + App Ver + App Ver - FW - + FW + FW - Region - Регион + Region + Регион - Flags - + Flags + Flags - Path - Путь + Path + Путь - File - Файл + File + Файл - Unknown - Неизвестно + Unknown + Неизвестно - Package - + Package + Package - - + + SettingsDialog - Settings - Настройки + Settings + Настройки - General - Общее + General + Общее - System - Система + System + Система - Console Language - Язык консоли + Console Language + Язык консоли - Emulator Language - Язык эмулятора + Emulator Language + Язык эмулятора - Emulator - Эмулятор + Emulator + Эмулятор - Enable Fullscreen - Полноэкранный режим + Enable Fullscreen + Полноэкранный режим - Fullscreen Mode - Тип полноэкранного режима + Fullscreen Mode + Тип полноэкранного режима - Enable Separate Update Folder - Отдельная папка обновлений + Enable Separate Update Folder + Отдельная папка обновлений - Default tab when opening settings - Вкладка по умолчанию при открытии настроек + Default tab when opening settings + Вкладка по умолчанию при открытии настроек - Show Game Size In List - Показать размер игры в списке + Show Game Size In List + Показать размер игры в списке - Show Splash - Показывать заставку + Show Splash + Показывать заставку - Enable Discord Rich Presence - Включить Discord Rich Presence + Enable Discord Rich Presence + Включить Discord Rich Presence - Username - Имя пользователя + Username + Имя пользователя - Trophy Key - Ключ трофеев + Trophy Key + Ключ трофеев - Trophy - Трофеи + Trophy + Трофеи - Logger - Логирование + Logger + Логирование - Log Type - Тип логов + Log Type + Тип логов - Log Filter - Фильтр логов + Log Filter + Фильтр логов - Open Log Location - Открыть местоположение журнала + Open Log Location + Открыть местоположение журнала - Input - Ввод + Input + Ввод - Cursor - Курсор мыши + Cursor + Курсор мыши - Hide Cursor - Скрывать курсор + Hide Cursor + Скрывать курсор - Hide Cursor Idle Timeout - Время скрытия курсора при бездействии + Hide Cursor Idle Timeout + Время скрытия курсора при бездействии - s - сек + s + сек - Controller - Контроллер + Controller + Контроллер - Back Button Behavior - Поведение кнопки назад + Back Button Behavior + Поведение кнопки назад - Graphics - Графика + Graphics + Графика - GUI - Интерфейс + GUI + Интерфейс - User - Пользователь + User + Пользователь - Graphics Device - Графическое устройство + Graphics Device + Графическое устройство - Width - Ширина + Width + Ширина - Height - Высота + Height + Высота - Vblank Divider - Делитель Vblank + Vblank Divider + Делитель Vblank - Advanced - Продвинутые + Advanced + Продвинутые - Enable Shaders Dumping - Включить дамп шейдеров + Enable Shaders Dumping + Включить дамп шейдеров - Enable NULL GPU - Включить NULL GPU + Enable NULL GPU + Включить NULL GPU - Paths - Пути + Enable HDR + Enable HDR - Game Folders - Игровые папки + Paths + Пути - Add... - Добавить... + Game Folders + Игровые папки - Remove - Удалить + Add... + Добавить... - Debug - Отладка + Remove + Удалить - Enable Debug Dumping - Включить отладочные дампы + Debug + Отладка - Enable Vulkan Validation Layers - Включить слои валидации Vulkan + Enable Debug Dumping + Включить отладочные дампы - Enable Vulkan Synchronization Validation - Включить валидацию синхронизации Vulkan + Enable Vulkan Validation Layers + Включить слои валидации Vulkan - Enable RenderDoc Debugging - Включить отладку RenderDoc + Enable Vulkan Synchronization Validation + Включить валидацию синхронизации Vulkan - Enable Crash Diagnostics - Включить диагностику сбоев + Enable RenderDoc Debugging + Включить отладку RenderDoc - Collect Shaders - Собирать шейдеры + Enable Crash Diagnostics + Включить диагностику сбоев - Copy GPU Buffers - Копировать буферы GPU + Collect Shaders + Собирать шейдеры - Host Debug Markers - Маркеры отладки хоста + Copy GPU Buffers + Копировать буферы GPU - Guest Debug Markers - Маркеры отладки гостя + Host Debug Markers + Маркеры отладки хоста - Update - Обновление + Guest Debug Markers + Маркеры отладки гостя - Check for Updates at Startup - Проверка при запуске + Update + Обновление - Always Show Changelog - Всегда показывать журнал изменений + Check for Updates at Startup + Проверка при запуске - Update Channel - Канал обновления + Always Show Changelog + Всегда показывать журнал изменений - Check for Updates - Проверить обновления + Update Channel + Канал обновления - GUI Settings - Настройки интерфейса + Check for Updates + Проверить обновления - Title Music - Заглавная музыка + GUI Settings + Настройки интерфейса - Disable Trophy Pop-ups - Отключить уведомления о трофеях + Title Music + Заглавная музыка - Play title music - Играть заглавную музыку + Disable Trophy Pop-ups + Отключить уведомления о трофеях - Update Compatibility Database On Startup - Обновлять базу совместимости при запуске + Background Image + Background Image - Game Compatibility - Совместимость игр + Show Background Image + Show Background Image - Display Compatibility Data - Показывать данные совместимости + Opacity + Opacity - Update Compatibility Database - Обновить базу совместимости + Play title music + Играть заглавную музыку - Volume - Громкость + Update Compatibility Database On Startup + Обновлять базу совместимости при запуске - Save - Сохранить + Game Compatibility + Совместимость игр - Apply - Применить + Display Compatibility Data + Показывать данные совместимости - Restore Defaults - По умолчанию + Update Compatibility Database + Обновить базу совместимости - Close - Закрыть + Volume + Громкость - Point your mouse at an option to display its description. - Наведите указатель мыши на опцию, чтобы отобразить ее описание. + Save + Сохранить - consoleLanguageGroupBox - Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. + Apply + Применить - emulatorLanguageGroupBox - Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. + Restore Defaults + По умолчанию - fullscreenCheckBox - Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11. + Close + Закрыть - separateUpdatesCheckBox - Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем "CUSA00000-UPDATE", где идентификатор CUSA совпадает с идентификатором игры. + Point your mouse at an option to display its description. + Наведите указатель мыши на опцию, чтобы отобразить ее описание. - showSplashCheckBox - Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. + consoleLanguageGroupBox + Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. - discordRPCCheckbox - Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. + emulatorLanguageGroupBox + Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. - userName - Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. + fullscreenCheckBox + Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11. - TrophyKey - Ключ трофеев:\nКлюч, используемый для расшифровки трофеев. Должен быть получен из вашей взломанной консоли.\nДолжен содержать только шестнадцатеричные символы. + separateUpdatesCheckBox + Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем "CUSA00000-UPDATE", где идентификатор CUSA совпадает с идентификатором игры. - logTypeGroupBox - Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. + showSplashCheckBox + Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. - logFilter - Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. + discordRPCCheckbox + Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. - updaterGroupBox - Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. + userName + Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. - GUIMusicGroupBox - Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. + TrophyKey + Ключ трофеев:\nКлюч, используемый для расшифровки трофеев. Должен быть получен из вашей взломанной консоли.\nДолжен содержать только шестнадцатеричные символы. - disableTrophycheckBox - Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по-прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). + logTypeGroupBox + Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. - hideCursorGroupBox - Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. + logFilter + Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. - idleTimeoutGroupBox - Время скрытия курсора при бездействии:\nУстановите время, через которое курсор исчезнет при бездействии. + updaterGroupBox + Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. - backButtonBehaviorGroupBox - Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. + GUIMusicGroupBox + Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. - checkCompatibilityOnStartupCheckBox - Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. + disableTrophycheckBox + Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по-прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). - updateCompatibilityButton - Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. + hideCursorGroupBox + Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. - Never - Никогда + idleTimeoutGroupBox + Время скрытия курсора при бездействии:\nУстановите время, через которое курсор исчезнет при бездействии. - Idle - При бездействии + backButtonBehaviorGroupBox + Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. - Always - Всегда + enableCompatibilityCheckBox + Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. - Touchpad Left - Тачпад слева + checkCompatibilityOnStartupCheckBox + Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. - Touchpad Right - Тачпад справа + updateCompatibilityButton + Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. - Touchpad Center - Центр тачпада + Never + Никогда - None - Нет + Idle + При бездействии - graphicsAdapterGroupBox - Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите "Автовыбор", чтобы определить GPU автоматически. + Always + Всегда - resolutionLayout - Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. + Touchpad Left + Тачпад слева - heightDivider - Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! + Touchpad Right + Тачпад справа - dumpShadersCheckBox - Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. + Touchpad Center + Центр тачпада - nullGpuCheckBox - Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. + None + Нет - gameFoldersBox - Игровые папки:\nСписок папок для проверки установленных игр. + graphicsAdapterGroupBox + Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите "Автовыбор", чтобы определить GPU автоматически. - addFolderButton - Добавить:\nДобавить папку в список. + resolutionLayout + Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. - removeFolderButton - Удалить:\nУдалить папку из списка. + heightDivider + Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! - debugDump - Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. + dumpShadersCheckBox + Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. - vkValidationCheckBox - Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. + nullGpuCheckBox + Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. - vkSyncValidationCheckBox - Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с RenderDoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. + gameFoldersBox + Игровые папки:\nСписок папок для проверки установленных игр. - collectShaderCheckBox - Собирать шейдеры:\nВам необходимо включить эту функцию для редактирования шейдеров с помощью меню отладки (Ctrl + F10). + addFolderButton + Добавить:\nДобавить папку в список. - crashDiagnosticsCheckBox - Диагностика сбоев:\nСоздает .yaml файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. + removeFolderButton + Удалить:\nУдалить папку из списка. - copyGPUBuffersCheckBox - Копировать буферы GPU:\nПозволяет обойти состояния гонки, связанные с отправками GPU.\nМожет помочь или не помочь при сбоях PM4 типа 0. + debugDump + Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. - hostMarkersCheckBox - Маркеры отладки хоста:\nДобавляет информацию на стороне эмулятора, например маркеры для определенных команд AMDGPU, вокруг команд Vulkan, а также присваивает ресурсам отладочные имена.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. + vkValidationCheckBox + Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. - guestMarkersCheckBox - Маркеры отладки гостя:\nДобавляет любые отладочные маркеры, добавленные самой игрой, в буфер команд.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. + vkSyncValidationCheckBox + Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. - saveDataBox - Путь сохранений:\nПапка, в которой будут храниться сохранения игр. + rdocCheckBox + Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с RenderDoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. - browseButton - Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений. + collectShaderCheckBox + Собирать шейдеры:\nВам необходимо включить эту функцию для редактирования шейдеров с помощью меню отладки (Ctrl + F10). - Borderless - Без полей + crashDiagnosticsCheckBox + Диагностика сбоев:\nСоздает .yaml файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. - True - Истинный + copyGPUBuffersCheckBox + Копировать буферы GPU:\nПозволяет обойти состояния гонки, связанные с отправками GPU.\nМожет помочь или не помочь при сбоях PM4 типа 0. - Release - Release + hostMarkersCheckBox + Маркеры отладки хоста:\nДобавляет информацию на стороне эмулятора, например маркеры для определенных команд AMDGPU, вокруг команд Vulkan, а также присваивает ресурсам отладочные имена.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. - Nightly - Nightly + guestMarkersCheckBox + Маркеры отладки гостя:\nДобавляет любые отладочные маркеры, добавленные самой игрой, в буфер команд.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. - Set the volume of the background music. - Установите громкость фоновой музыки. + saveDataBox + Путь сохранений:\nПапка, в которой будут храниться сохранения игр. - Enable Motion Controls - Включить управление движением + browseButton + Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений. - Save Data Path - Путь сохранений + Borderless + Без полей - Browse - Обзор + True + Истинный - async - асинхронный + Release + Release - sync - синхронный + Nightly + Nightly - Directory to install games - Каталог для установки игр + Set the volume of the background music. + Установите громкость фоновой музыки. - Directory to save data - Каталог для сохранений + Enable Motion Controls + Включить управление движением - Auto Select - Автовыбор + Save Data Path + Путь сохранений - Enable HDR - + Browse + Обзор - Background Image - + async + асинхронный - Show Background Image - + sync + синхронный - Opacity - + Auto Select + Автовыбор - GUIBackgroundImageGroupBox - + Directory to install games + Каталог для установки игр - enableHDRCheckBox - + Directory to save data + Каталог для сохранений - - + + TrophyViewer - Trophy Viewer - Просмотр трофеев + Trophy Viewer + Просмотр трофеев - + diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index ebd67452f..6a2fbaa5d 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Rreth shadPS4 + About shadPS4 + Rreth shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. - This software should not be used to play games you have not legally obtained. - Ky program nuk duhet përdorur për të luajtur lojëra që nuk ke marrë ligjërisht. + This software should not be used to play games you have not legally obtained. + Ky program nuk duhet përdorur për të luajtur lojëra që nuk ke marrë ligjërisht. - - + + CheatsPatches - Cheats / Patches for - Mashtrime / Arna për + Cheats / Patches for + Mashtrime / Arna për - defaultTextEdit_MSG - Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Nuk ofrohet asnjë imazh + No Image Available + Nuk ofrohet asnjë imazh - Serial: - Seriku: + Serial: + Seriku: - Version: - Versioni: + Version: + Versioni: - Size: - Madhësia: + Size: + Madhësia: - Select Cheat File: - Përzgjidh Skedarin e Mashtrimit: + Select Cheat File: + Përzgjidh Skedarin e Mashtrimit: - Repository: - Depo: + Repository: + Depo: - Download Cheats - Shkarko Mashtrimet + Download Cheats + Shkarko Mashtrimet - Delete File - Fshi Skedarin + Delete File + Fshi Skedarin - No files selected. - Nuk u zgjodh asnjë skedar. + No files selected. + Nuk u zgjodh asnjë skedar. - You can delete the cheats you don't want after downloading them. - Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. + You can delete the cheats you don't want after downloading them. + Mund t'i fshish mashtrimet që nuk dëshiron pasi t'i kesh shkarkuar. - Do you want to delete the selected file?\n%1 - Dëshiron të fshish skedarin e përzgjedhur?\n%1 + Do you want to delete the selected file?\n%1 + Dëshiron të fshish skedarin e përzgjedhur?\n%1 - Select Patch File: - Përzgjidh Skedarin e Arnës: + Select Patch File: + Përzgjidh Skedarin e Arnës: - Download Patches - Shkarko Arnat + Download Patches + Shkarko Arnat - Save - Ruaj + Save + Ruaj - Cheats - Mashtrime + Cheats + Mashtrime - Patches - Arna + Patches + Arna - Error - Gabim + Error + Gabim - No patch selected. - Asnjë arnë e përzgjedhur. + No patch selected. + Asnjë arnë e përzgjedhur. - Unable to open files.json for reading. - files.json nuk mund të hapet për lexim. + Unable to open files.json for reading. + files.json nuk mund të hapet për lexim. - No patch file found for the current serial. - Nuk u gjet asnjë skedar patch për serikun aktual. + No patch file found for the current serial. + Nuk u gjet asnjë skedar patch për serikun aktual. - Unable to open the file for reading. - Skedari nuk mund të hapet për lexim. + Unable to open the file for reading. + Skedari nuk mund të hapet për lexim. - Unable to open the file for writing. - Skedari nuk mund të hapet për shkrim. + Unable to open the file for writing. + Skedari nuk mund të hapet për shkrim. - Failed to parse XML: - Analiza e XML-së dështoi: + Failed to parse XML: + Analiza e XML-së dështoi: - Success - Sukses + Success + Sukses - Options saved successfully. - Rregullimet u ruajtën me sukses. + Options saved successfully. + Rregullimet u ruajtën me sukses. - Invalid Source - Burim i pavlefshëm + Invalid Source + Burim i pavlefshëm - The selected source is invalid. - Burimi i përzgjedhur është i pavlefshëm. + The selected source is invalid. + Burimi i përzgjedhur është i pavlefshëm. - File Exists - Skedari Ekziston + File Exists + Skedari Ekziston - File already exists. Do you want to replace it? - Skedari ekziston tashmë. Dëshiron ta zëvendësosh? + File already exists. Do you want to replace it? + Skedari ekziston tashmë. Dëshiron ta zëvendësosh? - Failed to save file: - Ruajtja e skedarit dështoi: + Failed to save file: + Ruajtja e skedarit dështoi: - Failed to download file: - Shkarkimi i skedarit dështoi: + Failed to download file: + Shkarkimi i skedarit dështoi: - Cheats Not Found - Mashtrimet nuk u gjetën + Cheats Not Found + Mashtrimet nuk u gjetën - CheatsNotFound_MSG - Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. + CheatsNotFound_MSG + Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. - Cheats Downloaded Successfully - Mashtrimet u shkarkuan me sukses + Cheats Downloaded Successfully + Mashtrimet u shkarkuan me sukses - CheatsDownloadedSuccessfully_MSG - Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. + CheatsDownloadedSuccessfully_MSG + Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. - Failed to save: - Ruajtja dështoi: + Failed to save: + Ruajtja dështoi: - Failed to download: - Shkarkimi dështoi: + Failed to download: + Shkarkimi dështoi: - Download Complete - Shkarkimi përfundoi + Download Complete + Shkarkimi përfundoi - DownloadComplete_MSG - Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse arna nuk shfaqet, mund të mos ekzistojë për numrin e serikut dhe versionin specifik të lojës. + DownloadComplete_MSG + Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse arna nuk shfaqet, mund të mos ekzistojë për numrin e serikut dhe versionin specifik të lojës. - Failed to parse JSON data from HTML. - Analiza e të dhënave JSON nga HTML dështoi. + Failed to parse JSON data from HTML. + Analiza e të dhënave JSON nga HTML dështoi. - Failed to retrieve HTML page. - Gjetja e faqes HTML dështoi. + Failed to retrieve HTML page. + Gjetja e faqes HTML dështoi. - The game is in version: %1 - Loja është në versionin: %1 + The game is in version: %1 + Loja është në versionin: %1 - The downloaded patch only works on version: %1 - Arna e shkarkuar funksionon vetëm në versionin: %1 + The downloaded patch only works on version: %1 + Arna e shkarkuar funksionon vetëm në versionin: %1 - You may need to update your game. - Mund të duhet të përditësosh lojën tënde. + You may need to update your game. + Mund të duhet të përditësosh lojën tënde. - Incompatibility Notice - Njoftim për mospërputhje + Incompatibility Notice + Njoftim për mospërputhje - Failed to open file: - Hapja e skedarit dështoi: + Failed to open file: + Hapja e skedarit dështoi: - XML ERROR: - GABIM XML: + XML ERROR: + GABIM XML: - Failed to open files.json for writing - Hapja e files.json për shkrim dështoi + Failed to open files.json for writing + Hapja e files.json për shkrim dështoi - Author: - Autori: + Author: + Autori: - Directory does not exist: - Dosja nuk ekziston: + Directory does not exist: + Dosja nuk ekziston: - Failed to open files.json for reading. - Hapja e files.json për lexim dështoi. + Failed to open files.json for reading. + Hapja e files.json për lexim dështoi. - Name: - Emri: + Name: + Emri: - Can't apply cheats before the game is started - Nuk mund të zbatohen mashtrime para fillimit të lojës. + Can't apply cheats before the game is started + Nuk mund të zbatohen mashtrime para fillimit të lojës. - Close - Mbyll + Close + Mbyll - - + + CheckUpdate - Auto Updater - Përditësues automatik + Auto Updater + Përditësues automatik - Error - Gabim + Error + Gabim - Network error: - Gabim rrjeti: + Network error: + Gabim rrjeti: - Error_Github_limit_MSG - Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nKe arritur këtë kufi. Të lutem provo përsëri më vonë. + Error_Github_limit_MSG + Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nKe arritur këtë kufi. Të lutem provo përsëri më vonë. - Failed to parse update information. - Analizimi i informacionit të përditësimit deshtoi. + Failed to parse update information. + Analizimi i informacionit të përditësimit deshtoi. - No pre-releases found. - Nuk u gjetën botime paraprake. + No pre-releases found. + Nuk u gjetën botime paraprake. - Invalid release data. - Të dhënat e lëshimit janë të pavlefshme. + Invalid release data. + Të dhënat e lëshimit janë të pavlefshme. - No download URL found for the specified asset. - Nuk u gjet URL-ja e shkarkimit për burimin e specifikuar. + No download URL found for the specified asset. + Nuk u gjet URL-ja e shkarkimit për burimin e specifikuar. - Your version is already up to date! - Versioni jotë është i përditësuar tashmë! + Your version is already up to date! + Versioni jotë është i përditësuar tashmë! - Update Available - Ofrohet një përditësim + Update Available + Ofrohet një përditësim - Update Channel - Kanali i përditësimit + Update Channel + Kanali i përditësimit - Current Version - Versioni i tanishëm + Current Version + Versioni i tanishëm - Latest Version - Versioni më i fundit + Latest Version + Versioni më i fundit - Do you want to update? - Do të përditësosh? + Do you want to update? + Do të përditësosh? - Show Changelog - Trego ndryshimet + Show Changelog + Trego ndryshimet - Check for Updates at Startup - Kontrollo për përditësime në nisje + Check for Updates at Startup + Kontrollo për përditësime në nisje - Update - Përditëso + Update + Përditëso - No - Jo + No + Jo - Hide Changelog - Fshih ndryshimet + Hide Changelog + Fshih ndryshimet - Changes - Ndryshimet + Changes + Ndryshimet - Network error occurred while trying to access the URL - Ka ndodhur një gabim rrjeti gjatë përpjekjes për të qasur në URL-në + Network error occurred while trying to access the URL + Ka ndodhur një gabim rrjeti gjatë përpjekjes për të qasur në URL-në - Download Complete - Shkarkimi përfundoi + Download Complete + Shkarkimi përfundoi - The update has been downloaded, press OK to install. - Përditësimi është shkarkuar, shtyp OK për ta instaluar. + The update has been downloaded, press OK to install. + Përditësimi është shkarkuar, shtyp OK për ta instaluar. - Failed to save the update file at - Dështoi ruajtja e skedarit të përditësimit në + Failed to save the update file at + Dështoi ruajtja e skedarit të përditësimit në - Starting Update... - Po fillon përditësimi... + Starting Update... + Po fillon përditësimi... - Failed to create the update script file - Krijimi i skedarit skript të përditësimit dështoi + Failed to create the update script file + Krijimi i skedarit skript të përditësimit dështoi - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Duke marrë të dhënat e përputhshmërisë, të lutem prit + Fetching compatibility data, please wait + Duke marrë të dhënat e përputhshmërisë, të lutem prit - Cancel - Anulo + Cancel + Anulo - Loading... - Po ngarkohet... + Loading... + Po ngarkohet... - Error - Gabim + Error + Gabim - Unable to update compatibility data! Try again later. - Nuk mund të përditësohen të dhënat e përputhshmërisë! Provo përsëri më vonë. + Unable to update compatibility data! Try again later. + Nuk mund të përditësohen të dhënat e përputhshmërisë! Provo përsëri më vonë. - Unable to open compatibility_data.json for writing. - Nuk mund të hapet compatibility_data.json për të shkruar. + Unable to open compatibility_data.json for writing. + Nuk mund të hapet compatibility_data.json për të shkruar. - Unknown - E panjohur + Unknown + E panjohur - Nothing - Asgjë + Nothing + Asgjë - Boots - Niset + Boots + Niset - Menus - Meny + Menus + Meny - Ingame - Në lojë + Ingame + Në lojë - Playable - E luajtshme + Playable + E luajtshme - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Hap Dosjen + Open Folder + Hap Dosjen - - + + GameInfoClass - Loading game list, please wait :3 - Po ngarkohet lista e lojërave, të lutem prit :3 + Loading game list, please wait :3 + Po ngarkohet lista e lojërave, të lutem prit :3 - Cancel - Anulo + Cancel + Anulo - Loading... - Duke ngarkuar... + Loading... + Duke ngarkuar... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Përzgjidh dosjen + shadPS4 - Choose directory + shadPS4 - Përzgjidh dosjen - Directory to install games - Dosja ku do instalohen lojërat + Directory to install games + Dosja ku do instalohen lojërat - Browse - Shfleto + Browse + Shfleto - Error - Gabim + Error + Gabim - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Ikona + Icon + Ikona - Name - Emri + Name + Emri - Serial - Seriku + Serial + Seriku - Compatibility - Përputhshmëria + Compatibility + Përputhshmëria - Region - Rajoni + Region + Rajoni - Firmware - Firmueri + Firmware + Firmueri - Size - Madhësia + Size + Madhësia - Version - Versioni + Version + Versioni - Path - Shtegu + Path + Shtegu - Play Time - Koha e luajtjes + Play Time + Koha e luajtjes - Never Played - Nuk është luajtur kurrë + Never Played + Nuk është luajtur kurrë - h - o + h + o - m - m + m + m - s - s + s + s - Compatibility is untested - Përputhshmëria nuk është e testuar + Compatibility is untested + Përputhshmëria nuk është e testuar - Game does not initialize properly / crashes the emulator - Loja nuk niset siç duhet / rrëzon emulatorin + Game does not initialize properly / crashes the emulator + Loja nuk niset siç duhet / rrëzon emulatorin - Game boots, but only displays a blank screen - Loja niset, por shfaq vetëm një ekran të zbrazët + Game boots, but only displays a blank screen + Loja niset, por shfaq vetëm një ekran të zbrazët - Game displays an image but does not go past the menu - Loja shfaq një imazh, por nuk kalon përtej menysë + Game displays an image but does not go past the menu + Loja shfaq një imazh, por nuk kalon përtej menysë - Game has game-breaking glitches or unplayable performance - Loja ka probleme kritike ose performancë të papërshtatshme për lojë + Game has game-breaking glitches or unplayable performance + Loja ka probleme kritike ose performancë të papërshtatshme për lojë - Game can be completed with playable performance and no major glitches - Loja mund të përfundohet me performancë të luajtshme dhe pa probleme të mëdha + Game can be completed with playable performance and no major glitches + Loja mund të përfundohet me performancë të luajtshme dhe pa probleme të mëdha - Click to see details on github - Kliko për të parë detajet në GitHub + Click to see details on github + Kliko për të parë detajet në GitHub - Last updated - Përditësuar për herë të fundit + Last updated + Përditësuar për herë të fundit - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Krijo Shkurtore + Create Shortcut + Krijo Shkurtore - Cheats / Patches - Mashtrime / Arna + Cheats / Patches + Mashtrime / Arna - SFO Viewer - Shikuesi i SFO + SFO Viewer + Shikuesi i SFO - Trophy Viewer - Shikuesi i Trofeve + Trophy Viewer + Shikuesi i Trofeve - Open Folder... - Hap Dosjen... + Open Folder... + Hap Dosjen... - Open Game Folder - Hap Dosjen e Lojës + Open Game Folder + Hap Dosjen e Lojës - Open Save Data Folder - Hap Dosjen e të Dhënave të Ruajtura + Open Save Data Folder + Hap Dosjen e të Dhënave të Ruajtura - Open Log Folder - Hap Dosjen e Ditarit + Open Log Folder + Hap Dosjen e Ditarit - Copy info... - Kopjo informacionin... + Copy info... + Kopjo informacionin... - Copy Name - Kopjo Emrin + Copy Name + Kopjo Emrin - Copy Serial - Kopjo Serikun + Copy Serial + Kopjo Serikun - Copy Version - Kopjo Versionin + Copy Version + Kopjo Versionin - Copy Size - Kopjo Madhësinë + Copy Size + Kopjo Madhësinë - Copy All - Kopjo të Gjitha + Copy All + Kopjo të Gjitha - Delete... - Fshi... + Delete... + Fshi... - Delete Game - Fshi lojën + Delete Game + Fshi lojën - Delete Update - Fshi përditësimin + Delete Update + Fshi përditësimin - Delete DLC - Fshi DLC-në + Delete DLC + Fshi DLC-në - Compatibility... - Përputhshmëria... + Compatibility... + Përputhshmëria... - Update database - Përditëso bazën e të dhënave + Update database + Përditëso bazën e të dhënave - View report - Shiko raportin + View report + Shiko raportin - Submit a report - Paraqit një raport + Submit a report + Paraqit një raport - Shortcut creation - Krijimi i shkurtores + Shortcut creation + Krijimi i shkurtores - Shortcut created successfully! - Shkurtorja u krijua me sukses! + Shortcut created successfully! + Shkurtorja u krijua me sukses! - Error - Gabim + Error + Gabim - Error creating shortcut! - Gabim në krijimin e shkurtores! + Error creating shortcut! + Gabim në krijimin e shkurtores! - Install PKG - Instalo PKG + Install PKG + Instalo PKG - Game - Loja + Game + Loja - This game has no update to delete! - Kjo lojë nuk ka përditësim për të fshirë! + This game has no update to delete! + Kjo lojë nuk ka përditësim për të fshirë! - Update - Përditësim + Update + Përditësim - This game has no DLC to delete! - Kjo lojë nuk ka DLC për të fshirë! + This game has no DLC to delete! + Kjo lojë nuk ka DLC për të fshirë! - DLC - DLC + DLC + DLC - Delete %1 - Fshi %1 + Delete %1 + Fshi %1 - Are you sure you want to delete %1's %2 directory? - Je i sigurt që do të fsish dosjen %2 të %1? + Are you sure you want to delete %1's %2 directory? + Je i sigurt që do të fsish dosjen %2 të %1? - Open Update Folder - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Përzgjidh dosjen + shadPS4 - Choose directory + shadPS4 - Përzgjidh dosjen - Select which directory you want to install to. - Përzgjidh në cilën dosje do që të instalosh. + Select which directory you want to install to. + Përzgjidh në cilën dosje do që të instalosh. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Hap/Shto Dosje ELF + Open/Add Elf Folder + Hap/Shto Dosje ELF - Install Packages (PKG) - Instalo Paketat (PKG) + Install Packages (PKG) + Instalo Paketat (PKG) - Boot Game - Nis Lojën + Boot Game + Nis Lojën - Check for Updates - Kontrollo për përditësime + Check for Updates + Kontrollo për përditësime - About shadPS4 - Rreth shadPS4 + About shadPS4 + Rreth shadPS4 - Configure... - Konfiguro... + Configure... + Konfiguro... - Install application from a .pkg file - Instalo aplikacionin nga një skedar .pkg + Install application from a .pkg file + Instalo aplikacionin nga një skedar .pkg - Recent Games - Lojërat e fundit + Recent Games + Lojërat e fundit - Open shadPS4 Folder - Hap dosjen e shadPS4 + Open shadPS4 Folder + Hap dosjen e shadPS4 - Exit - Dil + Exit + Dil - Exit shadPS4 - Dil nga shadPS4 + Exit shadPS4 + Dil nga shadPS4 - Exit the application. - Dil nga aplikacioni. + Exit the application. + Dil nga aplikacioni. - Show Game List - Shfaq Listën e Lojërave + Show Game List + Shfaq Listën e Lojërave - Game List Refresh - Rifresko Listën e Lojërave + Game List Refresh + Rifresko Listën e Lojërave - Tiny - Të vockla + Tiny + Të vockla - Small - Të vogla + Small + Të vogla - Medium - Të mesme + Medium + Të mesme - Large - Të mëdha + Large + Të mëdha - List View - Pamja me List + List View + Pamja me List - Grid View - Pamja me Rrjetë + Grid View + Pamja me Rrjetë - Elf Viewer - Shikuesi i ELF + Elf Viewer + Shikuesi i ELF - Game Install Directory - Dosja e Instalimit të Lojës + Game Install Directory + Dosja e Instalimit të Lojës - Download Cheats/Patches - Shkarko Mashtrime/Arna + Download Cheats/Patches + Shkarko Mashtrime/Arna - Dump Game List - Zbraz Listën e Lojërave + Dump Game List + Zbraz Listën e Lojërave - PKG Viewer - Shikuesi i PKG + PKG Viewer + Shikuesi i PKG - Search... - Kërko... + Search... + Kërko... - File - Skedari + File + Skedari - View - Pamja + View + Pamja - Game List Icons - Ikonat e Listës së Lojërave + Game List Icons + Ikonat e Listës së Lojërave - Game List Mode - Mënyra e Listës së Lojërave + Game List Mode + Mënyra e Listës së Lojërave - Settings - Cilësimet + Settings + Cilësimet - Utils - Shërbimet + Utils + Shërbimet - Themes - Motivet + Themes + Motivet - Help - Ndihmë + Help + Ndihmë - Dark - E errët + Dark + E errët - Light - E çelët + Light + E çelët - Green - E gjelbër + Green + E gjelbër - Blue - E kaltër + Blue + E kaltër - Violet - Vjollcë + Violet + Vjollcë - toolBar - Shiriti i veglave + toolBar + Shiriti i veglave - Game List - Lista e lojërave + Game List + Lista e lojërave - * Unsupported Vulkan Version - * Version i pambështetur i Vulkan + * Unsupported Vulkan Version + * Version i pambështetur i Vulkan - Download Cheats For All Installed Games - Shkarko mashtrime për të gjitha lojërat e instaluara + Download Cheats For All Installed Games + Shkarko mashtrime për të gjitha lojërat e instaluara - Download Patches For All Games - Shkarko arna për të gjitha lojërat e instaluara + Download Patches For All Games + Shkarko arna për të gjitha lojërat e instaluara - Download Complete - Shkarkimi përfundoi + Download Complete + Shkarkimi përfundoi - You have downloaded cheats for all the games you have installed. - Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. + You have downloaded cheats for all the games you have installed. + Ke shkarkuar mashtrimet për të gjitha lojërat që ke instaluar. - Patches Downloaded Successfully! - Arnat u shkarkuan me sukses! + Patches Downloaded Successfully! + Arnat u shkarkuan me sukses! - All Patches available for all games have been downloaded. - Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. + All Patches available for all games have been downloaded. + Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar. - Games: - Lojërat: + Games: + Lojërat: - ELF files (*.bin *.elf *.oelf) - Skedarë ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Skedarë ELF (*.bin *.elf *.oelf) - Game Boot - Nis Lojën + Game Boot + Nis Lojën - Only one file can be selected! - Mund të përzgjidhet vetëm një skedar! + Only one file can be selected! + Mund të përzgjidhet vetëm një skedar! - PKG Extraction - Nxjerrja e PKG-së + PKG Extraction + Nxjerrja e PKG-së - Patch detected! - U zbulua një arnë! + Patch detected! + U zbulua një arnë! - PKG and Game versions match: - PKG-ja dhe versioni i Lojës përputhen: + PKG and Game versions match: + PKG-ja dhe versioni i Lojës përputhen: - Would you like to overwrite? - Dëshiron të mbishkruash? + Would you like to overwrite? + Dëshiron të mbishkruash? - PKG Version %1 is older than installed version: - Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: + PKG Version %1 is older than installed version: + Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: - Game is installed: - Loja është instaluar: + Game is installed: + Loja është instaluar: - Would you like to install Patch: - Dëshiron të instalosh Arnën: + Would you like to install Patch: + Dëshiron të instalosh Arnën: - DLC Installation - Instalimi i DLC-ve + DLC Installation + Instalimi i DLC-ve - Would you like to install DLC: %1? - Dëshiron të instalosh DLC-në: %1? + Would you like to install DLC: %1? + Dëshiron të instalosh DLC-në: %1? - DLC already installed: - DLC-ja është instaluar tashmë: + DLC already installed: + DLC-ja është instaluar tashmë: - Game already installed - Loja është instaluar tashmë + Game already installed + Loja është instaluar tashmë - PKG ERROR - GABIM PKG + PKG ERROR + GABIM PKG - Extracting PKG %1/%2 - Po nxirret PKG-ja %1/%2 + Extracting PKG %1/%2 + Po nxirret PKG-ja %1/%2 - Extraction Finished - Nxjerrja Përfundoi + Extraction Finished + Nxjerrja Përfundoi - Game successfully installed at %1 - Loja u instalua me sukses në %1 + Game successfully installed at %1 + Loja u instalua me sukses në %1 - File doesn't appear to be a valid PKG file - Skedari nuk duket si skedar PKG i vlefshëm + File doesn't appear to be a valid PKG file + Skedari nuk duket si skedar PKG i vlefshëm - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Hap Dosjen + Open Folder + Hap Dosjen - Name - Emri + PKG ERROR + GABIM PKG - Serial - Seriku + Name + Emri - Installed - + Serial + Seriku - Size - Madhësia + Installed + Installed - Category - + Size + Madhësia - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Rajoni + FW + FW - Flags - + Region + Rajoni - Path - Shtegu + Flags + Flags - File - Skedari + Path + Shtegu - PKG ERROR - GABIM PKG + File + Skedari - Unknown - E panjohur + Unknown + E panjohur - Package - + Package + Package - - + + SettingsDialog - Settings - Cilësimet + Settings + Cilësimet - General - Të përgjithshme + General + Të përgjithshme - System - Sistemi + System + Sistemi - Console Language - Gjuha e Konsolës + Console Language + Gjuha e Konsolës - Emulator Language - Gjuha e emulatorit + Emulator Language + Gjuha e emulatorit - Emulator - Emulatori + Emulator + Emulatori - Enable Fullscreen - Aktivizo Ekranin e plotë + Enable Fullscreen + Aktivizo Ekranin e plotë - Fullscreen Mode - Mënyra me ekran të plotë + Fullscreen Mode + Mënyra me ekran të plotë - Enable Separate Update Folder - Aktivizo dosjen e ndarë të përditësimit + Enable Separate Update Folder + Aktivizo dosjen e ndarë të përditësimit - Default tab when opening settings - Skeda e parazgjedhur kur hapen cilësimet + Default tab when opening settings + Skeda e parazgjedhur kur hapen cilësimet - Show Game Size In List - Shfaq madhësinë e lojës në listë + Show Game Size In List + Shfaq madhësinë e lojës në listë - Show Splash - Shfaq Pamjen e nisjes + Show Splash + Shfaq Pamjen e nisjes - Enable Discord Rich Presence - Aktivizo Discord Rich Presence + Enable Discord Rich Presence + Aktivizo Discord Rich Presence - Username - Përdoruesi + Username + Përdoruesi - Trophy Key - Çelësi i Trofeve + Trophy Key + Çelësi i Trofeve - Trophy - Trofeu + Trophy + Trofeu - Logger - Regjistruesi i ditarit + Logger + Regjistruesi i ditarit - Log Type - Lloji i Ditarit + Log Type + Lloji i Ditarit - Log Filter - Filtri i Ditarit + Log Filter + Filtri i Ditarit - Open Log Location - Hap vendndodhjen e Ditarit + Open Log Location + Hap vendndodhjen e Ditarit - Input - Hyrja + Input + Hyrja - Cursor - Kursori + Cursor + Kursori - Hide Cursor - Fshih kursorin + Hide Cursor + Fshih kursorin - Hide Cursor Idle Timeout - Koha për fshehjen e kursorit joaktiv + Hide Cursor Idle Timeout + Koha për fshehjen e kursorit joaktiv - s - s + s + s - Controller - Dorezë + Controller + Dorezë - Back Button Behavior - Sjellja e butonit mbrapa + Back Button Behavior + Sjellja e butonit mbrapa - Graphics - Grafika + Graphics + Grafika - GUI - Ndërfaqja + GUI + Ndërfaqja - User - Përdoruesi + User + Përdoruesi - Graphics Device - Pajisja e Grafikës + Graphics Device + Pajisja e Grafikës - Width - Gjerësia + Width + Gjerësia - Height - Lartësia + Height + Lartësia - Vblank Divider - Ndarës Vblank + Vblank Divider + Ndarës Vblank - Advanced - Të përparuara + Advanced + Të përparuara - Enable Shaders Dumping - Aktivizo Zbrazjen e Shaders-ave + Enable Shaders Dumping + Aktivizo Zbrazjen e Shaders-ave - Enable NULL GPU - Aktivizo GPU-në NULL + Enable NULL GPU + Aktivizo GPU-në NULL - Paths - Shtigjet + Enable HDR + Enable HDR - Game Folders - Dosjet e lojës + Paths + Shtigjet - Add... - Shto... + Game Folders + Dosjet e lojës - Remove - Hiq + Add... + Shto... - Debug - Korrigjim + Remove + Hiq - Enable Debug Dumping - Aktivizo Zbrazjen për Korrigjim + Debug + Korrigjim - Enable Vulkan Validation Layers - Aktivizo Shtresat e Vlefshmërisë Vulkan + Enable Debug Dumping + Aktivizo Zbrazjen për Korrigjim - Enable Vulkan Synchronization Validation - Aktivizo Vërtetimin e Sinkronizimit Vulkan + Enable Vulkan Validation Layers + Aktivizo Shtresat e Vlefshmërisë Vulkan - Enable RenderDoc Debugging - Aktivizo Korrigjimin RenderDoc + Enable Vulkan Synchronization Validation + Aktivizo Vërtetimin e Sinkronizimit Vulkan - Enable Crash Diagnostics - Aktivizo Diagnozën e Rënies + Enable RenderDoc Debugging + Aktivizo Korrigjimin RenderDoc - Collect Shaders - Mblidh Shader-at + Enable Crash Diagnostics + Aktivizo Diagnozën e Rënies - Copy GPU Buffers - Kopjo buffer-ët e GPU-së + Collect Shaders + Mblidh Shader-at - Host Debug Markers - Shënjuesit e korrigjimit të host-it + Copy GPU Buffers + Kopjo buffer-ët e GPU-së - Guest Debug Markers - Shënjuesit e korrigjimit të guest-it + Host Debug Markers + Shënjuesit e korrigjimit të host-it - Update - Përditëso + Guest Debug Markers + Shënjuesit e korrigjimit të guest-it - Check for Updates at Startup - Kontrollo për përditësime në nisje + Update + Përditëso - Always Show Changelog - Shfaq gjithmonë regjistrin e ndryshimeve + Check for Updates at Startup + Kontrollo për përditësime në nisje - Update Channel - Kanali i përditësimit + Always Show Changelog + Shfaq gjithmonë regjistrin e ndryshimeve - Check for Updates - Kontrollo për përditësime + Update Channel + Kanali i përditësimit - GUI Settings - Cilësimet e GUI-së + Check for Updates + Kontrollo për përditësime - Title Music - Muzika e titullit + GUI Settings + Cilësimet e GUI-së - Disable Trophy Pop-ups - Çaktivizo njoftimet për Trofetë + Title Music + Muzika e titullit - Background Image - Imazhi i sfondit + Disable Trophy Pop-ups + Çaktivizo njoftimet për Trofetë - Show Background Image - Shfaq imazhin e sfondit + Background Image + Imazhi i sfondit - Opacity - Tejdukshmëria + Show Background Image + Shfaq imazhin e sfondit - Play title music - Luaj muzikën e titullit + Opacity + Tejdukshmëria - Update Compatibility Database On Startup - Përditëso bazën e të dhënave të përputhshmërisë gjatë nisjes + Play title music + Luaj muzikën e titullit - Game Compatibility - Përputhshmëria e lojës + Update Compatibility Database On Startup + Përditëso bazën e të dhënave të përputhshmërisë gjatë nisjes - Display Compatibility Data - Shfaq të dhënat e përputhshmërisë + Game Compatibility + Përputhshmëria e lojës - Update Compatibility Database - Përditëso bazën e të dhënave të përputhshmërisë + Display Compatibility Data + Shfaq të dhënat e përputhshmërisë - Volume - Vëllimi i zërit + Update Compatibility Database + Përditëso bazën e të dhënave të përputhshmërisë - Save - Ruaj + Volume + Vëllimi i zërit - Apply - Zbato + Save + Ruaj - Restore Defaults - Rikthe paracaktimet + Apply + Zbato - Close - Mbyll + Restore Defaults + Rikthe paracaktimet - Point your mouse at an option to display its description. - Vendos miun mbi një rregullim për të shfaqur përshkrimin e tij. + Close + Mbyll - consoleLanguageGroupBox - Gjuha e konsolës:\nPërcakton gjuhën që përdor loja PS4.\nKëshillohet të caktosh një gjuhë që loja mbështet, e cila do të ndryshojë sipas rajonit. + Point your mouse at an option to display its description. + Vendos miun mbi një rregullim për të shfaqur përshkrimin e tij. - emulatorLanguageGroupBox - Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. + consoleLanguageGroupBox + Gjuha e konsolës:\nPërcakton gjuhën që përdor loja PS4.\nKëshillohet të caktosh një gjuhë që loja mbështet, e cila do të ndryshojë sipas rajonit. - fullscreenCheckBox - Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës në mënyrën e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur tastin F11. + emulatorLanguageGroupBox + Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. - separateUpdatesCheckBox - Aktivizo dosjen e ndarë të përditësimit:\nAktivizon instalimin e përditësimeve të lojërave në dosje të veçanta për menaxhim më të lehtë.\nKjo mund të krijohet manualisht duke shtuar përditësimin e shpaketuar në dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID-në e lojës. + fullscreenCheckBox + Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës në mënyrën e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur tastin F11. - showSplashCheckBox - Shfaq ekranin e ngarkesës:\nShfaq ekranin e ngarkesës së lojës (një pamje e veçantë) gjatë fillimit të lojës. + separateUpdatesCheckBox + Aktivizo dosjen e ndarë të përditësimit:\nAktivizon instalimin e përditësimeve të lojërave në dosje të veçanta për menaxhim më të lehtë.\nKjo mund të krijohet manualisht duke shtuar përditësimin e shpaketuar në dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID-në e lojës. - discordRPCCheckbox - Aktivizo Discord Rich Presence:\nShfaq ikonën e emulatorit dhe informacionin përkatës në profilin tënd në Discord. + showSplashCheckBox + Shfaq ekranin e ngarkesës:\nShfaq ekranin e ngarkesës së lojës (një pamje e veçantë) gjatë fillimit të lojës. - userName - Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. + discordRPCCheckbox + Aktivizo Discord Rich Presence:\nShfaq ikonën e emulatorit dhe informacionin përkatës në profilin tënd në Discord. - TrophyKey - Çelësi i Trofeve:\nÇelësi përdoret për të deshifruar trofetë. Duhet të merret nga konsola jote me jailbreak.\nDuhet të përmbajë vetëm karaktere hex. + userName + Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. - logTypeGroupBox - Lloji i ditarit:\nPërcakton nëse të sinkronizohet dalja e dritares së ditarit për performancë. Mund të ketë efekte të këqija në emulim. + TrophyKey + Çelësi i Trofeve:\nÇelësi përdoret për të deshifruar trofetë. Duhet të merret nga konsola jote me jailbreak.\nDuhet të përmbajë vetëm karaktere hex. - logFilter - Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. + logTypeGroupBox + Lloji i ditarit:\nPërcakton nëse të sinkronizohet dalja e dritares së ditarit për performancë. Mund të ketë efekte të këqija në emulim. - updaterGroupBox - Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. + logFilter + Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. - GUIBackgroundImageGroupBox - Imazhi i Sfondit:\nKontrollo tejdukshmërinë e imazhit të sfondit të lojës. + updaterGroupBox + Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. - GUIMusicGroupBox - Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në ndërfaqe. + GUIBackgroundImageGroupBox + Imazhi i Sfondit:\nKontrollo tejdukshmërinë e imazhit të sfondit të lojës. - disableTrophycheckBox - Çaktivizo njoftimet për Trofetë:\nÇaktivizo njoftimet për trofetë gjatë lojës. Përparimi i trofeve mund të ndiqet duke përdorur Shikuesin e Trofeve (kliko me të djathtën mbi lojën në dritaren kryesore). + GUIMusicGroupBox + Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në ndërfaqe. - hideCursorGroupBox - Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nJoaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. + disableTrophycheckBox + Çaktivizo njoftimet për Trofetë:\nÇaktivizo njoftimet për trofetë gjatë lojës. Përparimi i trofeve mund të ndiqet duke përdorur Shikuesin e Trofeve (kliko me të djathtën mbi lojën në dritaren kryesore). - idleTimeoutGroupBox - Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja (në sekonda) pas së cilës kursori që nuk ka qënë në veprim fshihet. + hideCursorGroupBox + Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nJoaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. - backButtonBehaviorGroupBox - Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mprapa. + idleTimeoutGroupBox + Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja (në sekonda) pas së cilës kursori që nuk ka qënë në veprim fshihet. - enableCompatibilityCheckBox - Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për të marrë informacion të përditësuar. + backButtonBehaviorGroupBox + Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mprapa. - checkCompatibilityOnStartupCheckBox - Përditëso përputhshmërinë gjatë nisjes:\nPërditëson automatikisht bazën e të dhënave të përputhshmërisë kur shadPS4 niset. + enableCompatibilityCheckBox + Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për të marrë informacion të përditësuar. - updateCompatibilityButton - Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. + checkCompatibilityOnStartupCheckBox + Përditëso përputhshmërinë gjatë nisjes:\nPërditëson automatikisht bazën e të dhënave të përputhshmërisë kur shadPS4 niset. - Never - Kurrë + updateCompatibilityButton + Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. - Idle - Joaktiv + Never + Kurrë - Always - Gjithmonë + Idle + Joaktiv - Touchpad Left - Tastiera prekëse majtas + Always + Gjithmonë - Touchpad Right - Tastiera prekëse djathtas + Touchpad Left + Tastiera prekëse majtas - Touchpad Center - Tastiera prekëse në qendër + Touchpad Right + Tastiera prekëse djathtas - None - Asnjë + Touchpad Center + Tastiera prekëse në qendër - graphicsAdapterGroupBox - Pajisja grafike:\nNë sistemet me GPU të shumëfishta, zgjidh GPU-në që do të përdorë emulatori nga lista rënëse,\nose zgjidh "Auto Select" për ta përcaktuar automatikisht. + None + Asnjë - resolutionLayout - Gjerësia/Lartësia:\nPërcakton madhësinë e dritares së emulatorit në nisje, e cila mund të rregullohet gjatë lojës.\nKjo është ndryshe nga rezolucioni në lojë. + graphicsAdapterGroupBox + Pajisja grafike:\nNë sistemet me GPU të shumëfishta, zgjidh GPU-në që do të përdorë emulatori nga lista rënëse,\nose zgjidh "Auto Select" për ta përcaktuar automatikisht. - heightDivider - Ndarësi Vblank:\nFrekuenca pamore me të cilën rifreskohet emulatori shumëzohet me këtë numër. Ndryshimi i këtij mund të ketë efekte të këqija, si rritja e shpejtësisë së lojës ose prishja e punimit thelbësor të lojës që nuk e pret këtë ndryshim! + resolutionLayout + Gjerësia/Lartësia:\nPërcakton madhësinë e dritares së emulatorit në nisje, e cila mund të rregullohet gjatë lojës.\nKjo është ndryshe nga rezolucioni në lojë. - dumpShadersCheckBox - Aktivizo zbrazjen e shaders-ave:\nPër qëllime të korrigjimit teknik, ruan shaders-at e lojës në një dosje ndërsa ato pasqyrohen. + heightDivider + Ndarësi Vblank:\nFrekuenca pamore me të cilën rifreskohet emulatori shumëzohet me këtë numër. Ndryshimi i këtij mund të ketë efekte të këqija, si rritja e shpejtësisë së lojës ose prishja e punimit thelbësor të lojës që nuk e pret këtë ndryshim! - nullGpuCheckBox - Aktivizo GPU-në Null:\nPër qëllime të korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike. + dumpShadersCheckBox + Aktivizo zbrazjen e shaders-ave:\nPër qëllime të korrigjimit teknik, ruan shaders-at e lojës në një dosje ndërsa ato pasqyrohen. - gameFoldersBox - Dosjet e lojërave:\nLista e dosjeve për të kontrolluar lojërat e instaluara. + nullGpuCheckBox + Aktivizo GPU-në Null:\nPër qëllime të korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike. - addFolderButton - Shto:\nShto një dosje në listë. + enableHDRCheckBox + enableHDRCheckBox - removeFolderButton - Hiq:\nHiq një dosje nga lista. + gameFoldersBox + Dosjet e lojërave:\nLista e dosjeve për të kontrolluar lojërat e instaluara. - debugDump - Aktivizo zbrazjen për korrigjim:\nRuan simbolet e importit dhe eksportit dhe informacionin e kreut të skedarit për aplikacionin PS4 që po ekzekutohet në një dosje. + addFolderButton + Shto:\nShto një dosje në listë. - vkValidationCheckBox - Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + removeFolderButton + Hiq:\nHiq një dosje nga lista. - vkSyncValidationCheckBox - Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + debugDump + Aktivizo zbrazjen për korrigjim:\nRuan simbolet e importit dhe eksportit dhe informacionin e kreut të skedarit për aplikacionin PS4 që po ekzekutohet në një dosje. - rdocCheckBox - Aktivizo korrigjimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e pamjes të pasqyruar në moment. + vkValidationCheckBox + Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - collectShaderCheckBox - Mblidh Shader-at:\nDuhet ta aktivizosh këtë për të redaktuar shader-at me menynë e korrigjimit (Ctrl + F10). + vkSyncValidationCheckBox + Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - crashDiagnosticsCheckBox - Diagnoza e rënies:\nKrijon një skedar .yaml me informacion rreth gjendjes së Vulkan-it në momentin e rënies.\nE dobishme për zgjidhjen e gabimeve 'Device lost'. Nëse e ke aktivizuar këtë, duhet të aktivizosh Shënjuesit e korrigjimit të host-it DHE të guest-it.\nNuk punon me GPU-t Intel.\nDuhet të kesh aktivizuar Shtresat e Vlefshmërisë Vulkan dhe Vulkan SDK që kjo të punojë. + rdocCheckBox + Aktivizo korrigjimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e pamjes të pasqyruar në moment. - copyGPUBuffersCheckBox - Kopjo buffer-ët e GPU-së:\nShmang kushtet e garës (race conditions) që lidhen me dërgimet e GPU-së.\nMund të ndihmojë, ose jo, në rast rëniesh të llojit PM4 0. + collectShaderCheckBox + Mblidh Shader-at:\nDuhet ta aktivizosh këtë për të redaktuar shader-at me menynë e korrigjimit (Ctrl + F10). - hostMarkersCheckBox - Shënjuesit e korrigjimit të host-it:\nShton informacion nga ana e emulatorit, si shënjues për komandat specifike AMDGPU rreth komandave Vulkan, si dhe jep burimeve emra korrigjimi.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. + crashDiagnosticsCheckBox + Diagnoza e rënies:\nKrijon një skedar .yaml me informacion rreth gjendjes së Vulkan-it në momentin e rënies.\nE dobishme për zgjidhjen e gabimeve 'Device lost'. Nëse e ke aktivizuar këtë, duhet të aktivizosh Shënjuesit e korrigjimit të host-it DHE të guest-it.\nNuk punon me GPU-t Intel.\nDuhet të kesh aktivizuar Shtresat e Vlefshmërisë Vulkan dhe Vulkan SDK që kjo të punojë. - guestMarkersCheckBox - Shënjuesit e korrigjimit të guest-it:\nShton çdo shënjues për korrigjim që loja vetë ka shtuar në buffer-in e komandave.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. + copyGPUBuffersCheckBox + Kopjo buffer-ët e GPU-së:\nShmang kushtet e garës (race conditions) që lidhen me dërgimet e GPU-së.\nMund të ndihmojë, ose jo, në rast rëniesh të llojit PM4 0. - saveDataBox - Shtegu i Ruajtjes së të Dhënave:\nDosja ku do të ruhen të dhënat e ruajtjes së lojës. + hostMarkersCheckBox + Shënjuesit e korrigjimit të host-it:\nShton informacion nga ana e emulatorit, si shënjues për komandat specifike AMDGPU rreth komandave Vulkan, si dhe jep burimeve emra korrigjimi.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. - browseButton - Shfleto:\nShfleto për të vendosur një dosje si shteg të ruajtjes së të dhënave. + guestMarkersCheckBox + Shënjuesit e korrigjimit të guest-it:\nShton çdo shënjues për korrigjim që loja vetë ka shtuar në buffer-in e komandave.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. - Borderless - + saveDataBox + Shtegu i Ruajtjes së të Dhënave:\nDosja ku do të ruhen të dhënat e ruajtjes së lojës. - True - + browseButton + Shfleto:\nShfleto për të vendosur një dosje si shteg të ruajtjes së të dhënave. - Enable HDR - + Borderless + Borderless - Release - + True + True - Nightly - + Release + Release - Set the volume of the background music. - + Nightly + Nightly - Enable Motion Controls - + Set the volume of the background music. + Set the volume of the background music. - Save Data Path - + Enable Motion Controls + Enable Motion Controls - Browse - Shfleto + Save Data Path + Save Data Path - async - + Browse + Shfleto - sync - + async + async - Auto Select - + sync + sync - Directory to install games - Dosja ku do instalohen lojërat + Auto Select + Auto Select - Directory to save data - + Directory to install games + Dosja ku do instalohen lojërat - enableHDRCheckBox - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Shikuesi i Trofeve + Trophy Viewer + Shikuesi i Trofeve - + diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 858bcd47c..853208a45 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Om shadPS4 + About shadPS4 + Om shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 är en experimentell emulator för PlayStation 4 baserad på öppen källkod. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 är en experimentell emulator för PlayStation 4 baserad på öppen källkod. - This software should not be used to play games you have not legally obtained. - Denna programvara bör inte användas för att spela spel som du inte legalt äger. + This software should not be used to play games you have not legally obtained. + Denna programvara bör inte användas för att spela spel som du inte legalt äger. - - + + CheatsPatches - Cheats / Patches for - Fusk / Patchar för + Cheats / Patches for + Fusk / Patchar för - defaultTextEdit_MSG - Fusk/Patchar är experimentella.\nAnvänd med försiktighet.\n\nHämta fusk individuellt genom att välja förrådet och klicka på hämtningsknappen.\nUnder Patchar-fliken kan du hämta alla patchar på en gång, välj vilken du vill använda och spara ditt val.\n\nEftersom vi inte utvecklar fusk eller patchar,\nrapportera gärna problem till fuskets upphovsperson.\n\nSkapat ett nytt fusk? Besök:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Fusk/Patchar är experimentella.\nAnvänd med försiktighet.\n\nHämta fusk individuellt genom att välja förrådet och klicka på hämtningsknappen.\nUnder Patchar-fliken kan du hämta alla patchar på en gång, välj vilken du vill använda och spara ditt val.\n\nEftersom vi inte utvecklar fusk eller patchar,\nrapportera gärna problem till fuskets upphovsperson.\n\nSkapat ett nytt fusk? Besök:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Ingen bild tillgänglig + No Image Available + Ingen bild tillgänglig - Serial: - Serienummer: + Serial: + Serienummer: - Version: - Version: + Version: + Version: - Size: - Storlek: + Size: + Storlek: - Select Cheat File: - Välj fuskfil: + Select Cheat File: + Välj fuskfil: - Repository: - Förråd: + Repository: + Förråd: - Download Cheats - Hämta fusk + Download Cheats + Hämta fusk - Delete File - Ta bort fil + Delete File + Ta bort fil - No files selected. - Inga filer valda. + No files selected. + Inga filer valda. - You can delete the cheats you don't want after downloading them. - Du kan ta bort fusk som du inte vill ha efter de hämtats ner. + You can delete the cheats you don't want after downloading them. + Du kan ta bort fusk som du inte vill ha efter de hämtats ner. - Do you want to delete the selected file?\n%1 - Vill du ta bort markerade filen?\n%1 + Do you want to delete the selected file?\n%1 + Vill du ta bort markerade filen?\n%1 - Select Patch File: - Välj patchfil: + Select Patch File: + Välj patchfil: - Download Patches - Hämta patchar + Download Patches + Hämta patchar - Save - Spara + Save + Spara - Cheats - Fusk + Cheats + Fusk - Patches - Patchar + Patches + Patchar - Error - Fel + Error + Fel - No patch selected. - Ingen patch vald. + No patch selected. + Ingen patch vald. - Unable to open files.json for reading. - Kunde inte öppna files.json för läsning. + Unable to open files.json for reading. + Kunde inte öppna files.json för läsning. - No patch file found for the current serial. - Ingen patchfil hittades för aktuella serienumret. + No patch file found for the current serial. + Ingen patchfil hittades för aktuella serienumret. - Unable to open the file for reading. - Kunde inte öppna filen för läsning. + Unable to open the file for reading. + Kunde inte öppna filen för läsning. - Unable to open the file for writing. - Kunde inte öppna filen för skrivning. + Unable to open the file for writing. + Kunde inte öppna filen för skrivning. - Failed to parse XML: - Misslyckades med att tolka XML: + Failed to parse XML: + Misslyckades med att tolka XML: - Success - Lyckades + Success + Lyckades - Options saved successfully. - Inställningarna sparades. + Options saved successfully. + Inställningarna sparades. - Invalid Source - Ogiltig källa + Invalid Source + Ogiltig källa - The selected source is invalid. - Vald källa är ogiltig. + The selected source is invalid. + Vald källa är ogiltig. - File Exists - Filen finns + File Exists + Filen finns - File already exists. Do you want to replace it? - Filen finns redan. Vill du ersätta den? + File already exists. Do you want to replace it? + Filen finns redan. Vill du ersätta den? - Failed to save file: - Misslyckades med att spara fil: + Failed to save file: + Misslyckades med att spara fil: - Failed to download file: - Misslyckades med att hämta filen: + Failed to download file: + Misslyckades med att hämta filen: - Cheats Not Found - Fusk hittades inte + Cheats Not Found + Fusk hittades inte - CheatsNotFound_MSG - Inga fusk hittades för detta spel i denna version av det valda förrådet. Prova ett annat förråd eller en annan version av spelet + CheatsNotFound_MSG + Inga fusk hittades för detta spel i denna version av det valda förrådet. Prova ett annat förråd eller en annan version av spelet - Cheats Downloaded Successfully - Fusk hämtades ner + Cheats Downloaded Successfully + Fusk hämtades ner - CheatsDownloadedSuccessfully_MSG - Du har hämtat ner fusken för denna version av spelet från valt förråd. Du kan försöka att hämta från andra förråd, om de är tillgängliga så kan det vara möjligt att använda det genom att välja det genom att välja filen från listan + CheatsDownloadedSuccessfully_MSG + Du har hämtat ner fusken för denna version av spelet från valt förråd. Du kan försöka att hämta från andra förråd, om de är tillgängliga så kan det vara möjligt att använda det genom att välja det genom att välja filen från listan - Failed to save: - Misslyckades med att spara: + Failed to save: + Misslyckades med att spara: - Failed to download: - Misslyckades med att hämta: + Failed to download: + Misslyckades med att hämta: - Download Complete - Hämtning färdig + Download Complete + Hämtning färdig - DownloadComplete_MSG - Patchhämtningen är färdig! Alla patchar tillgängliga för alla spel har hämtats och de behövs inte hämtas individuellt för varje spel som med fusk. Om patchen inte dyker upp kan det bero på att den inte finns för det specifika serienumret och versionen av spelet + DownloadComplete_MSG + Patchhämtningen är färdig! Alla patchar tillgängliga för alla spel har hämtats och de behövs inte hämtas individuellt för varje spel som med fusk. Om patchen inte dyker upp kan det bero på att den inte finns för det specifika serienumret och versionen av spelet - Failed to parse JSON data from HTML. - Misslyckades med att tolka JSON-data från HTML. + Failed to parse JSON data from HTML. + Misslyckades med att tolka JSON-data från HTML. - Failed to retrieve HTML page. - Misslyckades med att hämta HTML-sida. + Failed to retrieve HTML page. + Misslyckades med att hämta HTML-sida. - The game is in version: %1 - Spelet är i version: %1 + The game is in version: %1 + Spelet är i version: %1 - The downloaded patch only works on version: %1 - Hämtad patch fungerar endast på version: %1 + The downloaded patch only works on version: %1 + Hämtad patch fungerar endast på version: %1 - You may need to update your game. - Du kan behöva uppdatera ditt spel. + You may need to update your game. + Du kan behöva uppdatera ditt spel. - Incompatibility Notice - Meddelande om inkompatibilitet + Incompatibility Notice + Meddelande om inkompatibilitet - Failed to open file: - Misslyckades med att öppna filen: + Failed to open file: + Misslyckades med att öppna filen: - XML ERROR: - XML-FEL: + XML ERROR: + XML-FEL: - Failed to open files.json for writing - Misslyckades med att öppna files.json för skrivning + Failed to open files.json for writing + Misslyckades med att öppna files.json för skrivning - Author: - Upphovsperson: + Author: + Upphovsperson: - Directory does not exist: - Katalogen finns inte: + Directory does not exist: + Katalogen finns inte: - Failed to open files.json for reading. - Misslyckades med att öppna files.json för läsning. + Failed to open files.json for reading. + Misslyckades med att öppna files.json för läsning. - Name: - Namn: + Name: + Namn: - Can't apply cheats before the game is started - Kan inte tillämpa fusk innan spelet är startat + Can't apply cheats before the game is started + Kan inte tillämpa fusk innan spelet är startat - Close - Stäng + Close + Stäng - - + + CheckUpdate - Auto Updater - Automatisk uppdatering + Auto Updater + Automatisk uppdatering - Error - Fel + Error + Fel - Network error: - Nätverksfel: + Network error: + Nätverksfel: - Failed to parse update information. - Misslyckades med att tolka uppdateringsinformationen. + Error_Github_limit_MSG + Den automatiska uppdateraren tillåter upp till 60 uppdateringskontroller per timme.\nDu har uppnått denna gräns. Försök igen senare - No pre-releases found. - Inga förutgåva hittades. + Failed to parse update information. + Misslyckades med att tolka uppdateringsinformationen. - Invalid release data. - Ogiltig release-data. + No pre-releases found. + Inga förutgåva hittades. - No download URL found for the specified asset. - Ingen hämtnings-URL hittades för angiven tillgång. + Invalid release data. + Ogiltig release-data. - Your version is already up to date! - Din version är redan den senaste! + No download URL found for the specified asset. + Ingen hämtnings-URL hittades för angiven tillgång. - Update Available - Uppdatering tillgänglig + Your version is already up to date! + Din version är redan den senaste! - Update Channel - Uppdateringskanal + Update Available + Uppdatering tillgänglig - Current Version - Aktuell version + Update Channel + Uppdateringskanal - Latest Version - Senaste version + Current Version + Aktuell version - Do you want to update? - Vill du uppdatera? + Latest Version + Senaste version - Show Changelog - Visa ändringslogg + Do you want to update? + Vill du uppdatera? - Check for Updates at Startup - Leta efter uppdateringar vid uppstart + Show Changelog + Visa ändringslogg - Update - Uppdatera + Check for Updates at Startup + Leta efter uppdateringar vid uppstart - No - Nej + Update + Uppdatera - Hide Changelog - Dölj ändringslogg + No + Nej - Changes - Ändringar + Hide Changelog + Dölj ändringslogg - Network error occurred while trying to access the URL - Nätverksfel inträffade vid försök att komma åt URL:en + Changes + Ändringar - Download Complete - Hämtning färdig + Network error occurred while trying to access the URL + Nätverksfel inträffade vid försök att komma åt URL:en - The update has been downloaded, press OK to install. - Uppdateringen har hämtats. Tryck på Ok för att installera. + Download Complete + Hämtning färdig - Failed to save the update file at - Misslyckades med att spara uppdateringsfilen i + The update has been downloaded, press OK to install. + Uppdateringen har hämtats. Tryck på Ok för att installera. - Starting Update... - Startar uppdatering... + Failed to save the update file at + Misslyckades med att spara uppdateringsfilen i - Failed to create the update script file - Misslyckades med att skapa uppdateringsskriptfil + Starting Update... + Startar uppdatering... - Error_Github_limit_MSG - Den automatiska uppdateraren tillåter upp till 60 uppdateringskontroller per timme.\nDu har uppnått denna gräns. Försök igen senare + Failed to create the update script file + Misslyckades med att skapa uppdateringsskriptfil - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Hämtar kompatibilitetsdata, vänta + Fetching compatibility data, please wait + Hämtar kompatibilitetsdata, vänta - Cancel - Avbryt + Cancel + Avbryt - Loading... - Läser in... + Loading... + Läser in... - Error - Fel + Error + Fel - Unable to update compatibility data! Try again later. - Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. + Unable to update compatibility data! Try again later. + Kunde inte uppdatera kompatibilitetsdata! Försök igen senare. - Unknown - Okänt + Unable to open compatibility_data.json for writing. + Kunde inte öppna compatibility_data.json för skrivning. - Nothing - Ingenting + Unknown + Okänt - Boots - Startar upp + Nothing + Ingenting - Menus - Menyer + Boots + Startar upp - Ingame - Problem + Menus + Menyer - Playable - Spelbart + Ingame + Problem - Unable to open compatibility_data.json for writing. - Kunde inte öppna compatibility_data.json för skrivning. + Playable + Spelbart - - + + ControlSettings - Configure Controls - Konfigurera kontroller + Configure Controls + Konfigurera kontroller - Control Settings - Kontrollerinställningar + Control Settings + Kontrollerinställningar - D-Pad - Riktningsknappar + D-Pad + Riktningsknappar - Up - Upp + Up + Upp - Left - Vänster + Left + Vänster - Right - Höger + Right + Höger - Down - Ner + Down + Ner - Left Stick Deadzone (def:2 max:127) - Dödläge för vänster spak (standard:2 max:127) + Left Stick Deadzone (def:2 max:127) + Dödläge för vänster spak (standard:2 max:127) - Left Deadzone - Vänster dödläge + Left Deadzone + Vänster dödläge - Left Stick - Vänster spak + Left Stick + Vänster spak - Config Selection - Konfigurationsval + Config Selection + Konfigurationsval - Common Config - Allmän konfiguration + Common Config + Allmän konfiguration - Use per-game configs - Använd konfigurationer per spel + Use per-game configs + Använd konfigurationer per spel - L1 / LB - L1 / LB + L1 / LB + L1 / LB - L2 / LT - L2 / LT + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - Bakåt + Back + Bakåt - R1 / RB - R1 / RB + R1 / RB + R1 / RB - R2 / RT - R2 / RT + R2 / RT + R2 / RT - L3 - L3 + L3 + L3 - Options / Start - Options / Start + Options / Start + Options / Start - R3 - R3 + R3 + R3 - Face Buttons - Handlingsknappar + Face Buttons + Handlingsknappar - Triangle / Y - Triangel / Y + Triangle / Y + Triangel / Y - Square / X - Fyrkant / X + Square / X + Fyrkant / X - Circle / B - Cirkel / B + Circle / B + Cirkel / B - Cross / A - Kryss / A + Cross / A + Kryss / A - Right Stick Deadzone (def:2, max:127) - Dödläge för höger spak (standard:2, max:127) + Right Stick Deadzone (def:2, max:127) + Dödläge för höger spak (standard:2, max:127) - Right Deadzone - Höger dödläge + Right Deadzone + Höger dödläge - Right Stick - Höger spak + Right Stick + Höger spak - - + + ElfViewer - Open Folder - Öppna mapp + Open Folder + Öppna mapp - - + + GameInfoClass - Loading game list, please wait :3 - Läser in spellistan, vänta :3 + Loading game list, please wait :3 + Läser in spellistan, vänta :3 - Cancel - Avbryt + Cancel + Avbryt - Loading... - Läser in... + Loading... + Läser in... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Välj katalog + shadPS4 - Choose directory + shadPS4 - Välj katalog - Directory to install games - Katalog att installera spel till + Directory to install games + Katalog att installera spel till - Browse - Bläddra + Browse + Bläddra - Error - Fel + Error + Fel - Directory to install DLC - Katalog för att installera DLC + Directory to install DLC + Katalog för att installera DLC - - + + GameListFrame - Icon - Ikon + Icon + Ikon - Name - Namn + Name + Namn - Serial - Serienummer + Serial + Serienummer - Compatibility - Kompatibilitet + Compatibility + Kompatibilitet - Region - Region + Region + Region - Firmware - Firmware + Firmware + Firmware - Size - Storlek + Size + Storlek - Version - Version + Version + Version - Path - Sökväg + Path + Sökväg - Play Time - Speltid + Play Time + Speltid - Never Played - Aldrig spelat + Never Played + Aldrig spelat - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Kompatibilitet är otestat + Compatibility is untested + Kompatibilitet är otestat - Game does not initialize properly / crashes the emulator - Spelet initierar inte korrekt / kraschar emulatorn + Game does not initialize properly / crashes the emulator + Spelet initierar inte korrekt / kraschar emulatorn - Game boots, but only displays a blank screen - Spelet startar men visar endast en blank skärm + Game boots, but only displays a blank screen + Spelet startar men visar endast en blank skärm - Game displays an image but does not go past the menu - Spelet visar en bild men kommer inte förbi menyn + Game displays an image but does not go past the menu + Spelet visar en bild men kommer inte förbi menyn - Game has game-breaking glitches or unplayable performance - Spelet har allvarliga problem eller ospelbar prestanda + Game has game-breaking glitches or unplayable performance + Spelet har allvarliga problem eller ospelbar prestanda - Game can be completed with playable performance and no major glitches - Spelet kan spelas klart med spelbar prestanda och utan större problem + Game can be completed with playable performance and no major glitches + Spelet kan spelas klart med spelbar prestanda och utan större problem - Last updated - Senast uppdaterad + Click to see details on github + Klicka för att se detaljer på Github - Click to see details on github - Klicka för att se detaljer på Github + Last updated + Senast uppdaterad - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Skapa genväg + Create Shortcut + Skapa genväg - Cheats / Patches - Fusk / Patchar + Cheats / Patches + Fusk / Patchar - SFO Viewer - SFO-visare + SFO Viewer + SFO-visare - Trophy Viewer - Trofé-visare + Trophy Viewer + Trofé-visare - Open Folder... - Öppna mapp... + Open Folder... + Öppna mapp... - Open Game Folder - Öppna spelmapp + Open Game Folder + Öppna spelmapp - Open Save Data Folder - Öppna mapp för sparat data + Open Save Data Folder + Öppna mapp för sparat data - Open Log Folder - Öppna loggmapp + Open Log Folder + Öppna loggmapp - Copy info... - Kopiera till... + Copy info... + Kopiera till... - Copy Name - Kopiera namn + Copy Name + Kopiera namn - Copy Serial - Kopiera serienummer + Copy Serial + Kopiera serienummer - Copy All - Kopiera alla + Copy Version + Kopiera version - Delete... - Ta bort... + Copy Size + Kopiera storlek - Delete Game - Ta bort spel + Copy All + Kopiera alla - Delete Update - Ta bort uppdatering + Delete... + Ta bort... - Delete DLC - Ta bort DLC + Delete Game + Ta bort spel - Compatibility... - Kompatibilitet... + Delete Update + Ta bort uppdatering - Update database - Uppdatera databasen + Delete DLC + Ta bort DLC - View report - Visa rapport + Compatibility... + Kompatibilitet... - Submit a report - Skicka en rapport + Update database + Uppdatera databasen - Shortcut creation - Skapa genväg + View report + Visa rapport - Shortcut created successfully! - Genvägen skapades! + Submit a report + Skicka en rapport - Error - Fel + Shortcut creation + Skapa genväg - Error creating shortcut! - Fel vid skapandet av genväg! + Shortcut created successfully! + Genvägen skapades! - Install PKG - Installera PKG + Error + Fel - Game - Spel + Error creating shortcut! + Fel vid skapandet av genväg! - This game has no update to delete! - Detta spel har ingen uppdatering att ta bort! + Install PKG + Installera PKG - Update - Uppdatera + Game + Spel - This game has no DLC to delete! - Detta spel har inga DLC att ta bort! + This game has no update to delete! + Detta spel har ingen uppdatering att ta bort! - DLC - DLC + Update + Uppdatera - Delete %1 - Ta bort %1 + This game has no DLC to delete! + Detta spel har inga DLC att ta bort! - Are you sure you want to delete %1's %2 directory? - Är du säker på att du vill ta bort %1s %2-katalog? + DLC + DLC - Failed to convert icon. - Misslyckades med att konvertera ikon. + Delete %1 + Ta bort %1 - Open Update Folder - Öppna uppdateringsmapp + Are you sure you want to delete %1's %2 directory? + Är du säker på att du vill ta bort %1s %2-katalog? - Delete Save Data - Ta bort sparat data + Open Update Folder + Öppna uppdateringsmapp - This game has no update folder to open! - Detta spel har ingen uppdateringsmapp att öppna! + Delete Save Data + Ta bort sparat data - This game has no save data to delete! - Detta spel har inget sparat data att ta bort! + This game has no update folder to open! + Detta spel har ingen uppdateringsmapp att öppna! - Save Data - Sparat data + Failed to convert icon. + Misslyckades med att konvertera ikon. - Copy Version - Kopiera version + This game has no save data to delete! + Detta spel har inget sparat data att ta bort! - Copy Size - Kopiera storlek + Save Data + Sparat data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Välj katalog + shadPS4 - Choose directory + shadPS4 - Välj katalog - Select which directory you want to install to. - Välj vilken katalog som du vill installera till. + Select which directory you want to install to. + Välj vilken katalog som du vill installera till. - Install All Queued to Selected Folder - Installera alla köade till markerad mapp + Install All Queued to Selected Folder + Installera alla köade till markerad mapp - Delete PKG File on Install - Ta bort PKG-fil efter installation + Delete PKG File on Install + Ta bort PKG-fil efter installation - - + + MainWindow - Open/Add Elf Folder - Öppna/Lägg till Elf-mapp + Open/Add Elf Folder + Öppna/Lägg till Elf-mapp - Install Packages (PKG) - Installera paket (PKG) + Install Packages (PKG) + Installera paket (PKG) - Boot Game - Starta spel + Boot Game + Starta spel - Check for Updates - Leta efter uppdateringar + Check for Updates + Leta efter uppdateringar - About shadPS4 - Om shadPS4 + About shadPS4 + Om shadPS4 - Configure... - Konfigurera... + Configure... + Konfigurera... - Install application from a .pkg file - Installera program från en .pkg-fil + Install application from a .pkg file + Installera program från en .pkg-fil - Recent Games - Senaste spel + Recent Games + Senaste spel - Open shadPS4 Folder - Öppna shadPS4-mapp + Open shadPS4 Folder + Öppna shadPS4-mapp - Exit - Avsluta + Exit + Avsluta - Exit shadPS4 - Avsluta shadPS4 + Exit shadPS4 + Avsluta shadPS4 - Exit the application. - Avsluta programmet. + Exit the application. + Avsluta programmet. - Show Game List - Visa spellista + Show Game List + Visa spellista - Game List Refresh - Uppdatera spellista + Game List Refresh + Uppdatera spellista - Tiny - Mycket små + Tiny + Mycket små - Small - Små + Small + Små - Medium - Medelstora + Medium + Medelstora - Large - Stora + Large + Stora - List View - Listvy + List View + Listvy - Grid View - Rutnätsvy + Grid View + Rutnätsvy - Elf Viewer - Elf-visare + Elf Viewer + Elf-visare - Game Install Directory - Installationskatalog för spel + Game Install Directory + Installationskatalog för spel - Download Cheats/Patches - Hämta fusk/patchar + Download Cheats/Patches + Hämta fusk/patchar - Dump Game List - Dumpa spellista + Dump Game List + Dumpa spellista - PKG Viewer - PKG-visare + PKG Viewer + PKG-visare - Search... - Sök... + Search... + Sök... - File - Arkiv + File + Arkiv - View - Visa + View + Visa - Game List Icons - Ikoner för spellista + Game List Icons + Ikoner för spellista - Game List Mode - Läge för spellista + Game List Mode + Läge för spellista - Settings - Inställningar + Settings + Inställningar - Utils - Verktyg + Utils + Verktyg - Themes - Teman + Themes + Teman - Help - Hjälp + Help + Hjälp - Dark - Mörkt + Dark + Mörkt - Light - Ljust + Light + Ljust - Green - Grönt + Green + Grönt - Blue - Blått + Blue + Blått - Violet - Lila + Violet + Lila - toolBar - Verktygsrad + toolBar + Verktygsrad - Game List - Spellista + Game List + Spellista - * Unsupported Vulkan Version - * Vulkan-versionen stöds inte + * Unsupported Vulkan Version + * Vulkan-versionen stöds inte - Download Cheats For All Installed Games - Hämta fusk för alla installerade spel + Download Cheats For All Installed Games + Hämta fusk för alla installerade spel - Download Patches For All Games - Hämta patchar för alla spel + Download Patches For All Games + Hämta patchar för alla spel - Download Complete - Hämtning färdig + Download Complete + Hämtning färdig - You have downloaded cheats for all the games you have installed. - Du har hämtat fusk till alla spelen som du har installerade. + You have downloaded cheats for all the games you have installed. + Du har hämtat fusk till alla spelen som du har installerade. - Patches Downloaded Successfully! - Patchar hämtades ner! + Patches Downloaded Successfully! + Patchar hämtades ner! - All Patches available for all games have been downloaded. - Alla patchar tillgängliga för alla spel har hämtats ner. + All Patches available for all games have been downloaded. + Alla patchar tillgängliga för alla spel har hämtats ner. - Games: - Spel: + Games: + Spel: - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) - Game Boot - Starta spel + Game Boot + Starta spel - Only one file can be selected! - Endast en fil kan väljas! + Only one file can be selected! + Endast en fil kan väljas! - PKG Extraction - PKG-extrahering + PKG Extraction + PKG-extrahering - Patch detected! - Patch upptäcktes! + Patch detected! + Patch upptäcktes! - PKG and Game versions match: - PKG och spelversioner matchar: + PKG and Game versions match: + PKG och spelversioner matchar: - Would you like to overwrite? - Vill du skriva över? + Would you like to overwrite? + Vill du skriva över? - PKG Version %1 is older than installed version: - PKG-versionen %1 är äldre än installerad version: + PKG Version %1 is older than installed version: + PKG-versionen %1 är äldre än installerad version: - Game is installed: - Spelet är installerat: + Game is installed: + Spelet är installerat: - Would you like to install Patch: - Vill du installera patch: + Would you like to install Patch: + Vill du installera patch: - DLC Installation - DLC-installation + DLC Installation + DLC-installation - Would you like to install DLC: %1? - Vill du installera DLC: %1? + Would you like to install DLC: %1? + Vill du installera DLC: %1? - DLC already installed: - DLC redan installerat: + DLC already installed: + DLC redan installerat: - Game already installed - Spelet redan installerat + Game already installed + Spelet redan installerat - PKG ERROR - PKG-FEL + PKG ERROR + PKG-FEL - Extracting PKG %1/%2 - Extraherar PKG %1/%2 + Extracting PKG %1/%2 + Extraherar PKG %1/%2 - Extraction Finished - Extrahering färdig + Extraction Finished + Extrahering färdig - Game successfully installed at %1 - Spelet installerades i %1 + Game successfully installed at %1 + Spelet installerades i %1 - File doesn't appear to be a valid PKG file - Filen verkar inte vara en giltig PKG-fil + File doesn't appear to be a valid PKG file + Filen verkar inte vara en giltig PKG-fil - Run Game - Kör spel + Run Game + Kör spel - Eboot.bin file not found - Filen eboot.bin hittades inte + Eboot.bin file not found + Filen eboot.bin hittades inte - PKG File (*.PKG *.pkg) - PKG-fil (*.PKG *.pkg) + PKG File (*.PKG *.pkg) + PKG-fil (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - PKG är en patch eller DLC. Installera spelet först! + PKG is a patch or DLC, please install the game first! + PKG är en patch eller DLC. Installera spelet först! - Game is already running! - Spelet är redan igång! + Game is already running! + Spelet är redan igång! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Öppna mapp + Open Folder + Öppna mapp - PKG ERROR - PKG-FEL + PKG ERROR + PKG-FEL - Name - Namn + Name + Namn - Serial - Serienummer + Serial + Serienummer - Installed - + Installed + Installed - Size - Storlek + Size + Storlek - Category - + Category + Category - Type - + Type + Type - App Ver - + App Ver + App Ver - FW - + FW + FW - Region - Region + Region + Region - Flags - + Flags + Flags - Path - Sökväg + Path + Sökväg - File - Arkiv + File + Arkiv - Unknown - Okänt + Unknown + Okänt - Package - + Package + Package - - + + SettingsDialog - Settings - Inställningar + Settings + Inställningar - General - Allmänt + General + Allmänt - System - System + System + System - Console Language - Konsollspråk + Console Language + Konsollspråk - Emulator Language - Emulatorspråk + Emulator Language + Emulatorspråk - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Aktivera helskärm + Enable Fullscreen + Aktivera helskärm - Fullscreen Mode - Helskärmsläge + Fullscreen Mode + Helskärmsläge - Enable Separate Update Folder - Aktivera separat uppdateringsmapp + Enable Separate Update Folder + Aktivera separat uppdateringsmapp - Default tab when opening settings - Standardflik när inställningar öppnas + Default tab when opening settings + Standardflik när inställningar öppnas - Show Game Size In List - Visa spelstorlek i listan + Show Game Size In List + Visa spelstorlek i listan - Show Splash - Visa startskärm + Show Splash + Visa startskärm - Enable Discord Rich Presence - Aktivera Discord Rich Presence + Enable Discord Rich Presence + Aktivera Discord Rich Presence - Username - Användarnamn + Username + Användarnamn - Trophy Key - Trofényckel + Trophy Key + Trofényckel - Trophy - Troféer + Trophy + Troféer - Logger - Loggning + Logger + Loggning - Log Type - Loggtyp + Log Type + Loggtyp - Log Filter - Loggfilter + Log Filter + Loggfilter - Open Log Location - Öppna loggplats + Open Log Location + Öppna loggplats - Input - Inmatning + Input + Inmatning - Cursor - Muspekare + Cursor + Muspekare - Hide Cursor - Dölj muspekare + Hide Cursor + Dölj muspekare - Hide Cursor Idle Timeout - Dölj muspekare vid overksam + Hide Cursor Idle Timeout + Dölj muspekare vid overksam - s - s + s + s - Controller - Handkontroller + Controller + Handkontroller - Back Button Behavior - Beteende för bakåtknapp + Back Button Behavior + Beteende för bakåtknapp - Graphics - Grafik + Graphics + Grafik - User - Användare + GUI + Gränssnitt - Graphics Device - Grafikenhet + User + Användare - Width - Bredd + Graphics Device + Grafikenhet - Height - Höjd + Width + Bredd - Vblank Divider - Vblank Divider + Height + Höjd - Advanced - Avancerat + Vblank Divider + Vblank Divider - Enable Shaders Dumping - Aktivera Shaders Dumping + Advanced + Avancerat - Enable NULL GPU - Aktivera NULL GPU + Enable Shaders Dumping + Aktivera Shaders Dumping - Paths - Sökvägar + Enable NULL GPU + Aktivera NULL GPU - Game Folders - Spelmappar + Enable HDR + Enable HDR - Add... - Lägg till... + Paths + Sökvägar - Remove - Ta bort + Game Folders + Spelmappar - Debug - Felsök + Add... + Lägg till... - Enable Debug Dumping - Aktivera felsökningsdumpning + Remove + Ta bort - Enable Vulkan Validation Layers - Aktivera Vulkan Validation Layers + Debug + Felsök - Enable Vulkan Synchronization Validation - Aktivera Vulkan Synchronization Validation + Enable Debug Dumping + Aktivera felsökningsdumpning - Enable RenderDoc Debugging - Aktivera RenderDoc-felsökning + Enable Vulkan Validation Layers + Aktivera Vulkan Validation Layers - Enable Crash Diagnostics - Aktivera kraschdiagnostik + Enable Vulkan Synchronization Validation + Aktivera Vulkan Synchronization Validation - Collect Shaders - Samla shaders + Enable RenderDoc Debugging + Aktivera RenderDoc-felsökning - Copy GPU Buffers - Kopiera GPU-buffertar + Enable Crash Diagnostics + Aktivera kraschdiagnostik - Host Debug Markers - Felsökningsmarkörer för värd + Collect Shaders + Samla shaders - Guest Debug Markers - Felsökningsmarkörer för gäst + Copy GPU Buffers + Kopiera GPU-buffertar - Update - Uppdatera + Host Debug Markers + Felsökningsmarkörer för värd - Check for Updates at Startup - Leta efter uppdateringar vid uppstart + Guest Debug Markers + Felsökningsmarkörer för gäst - Always Show Changelog - Visa alltid ändringsloggen + Update + Uppdatera - Update Channel - Uppdateringskanal + Check for Updates at Startup + Leta efter uppdateringar vid uppstart - Check for Updates - Leta efter uppdateringar + Always Show Changelog + Visa alltid ändringsloggen - GUI Settings - Gränssnittsinställningar + Update Channel + Uppdateringskanal - Title Music - Titelmusik + Check for Updates + Leta efter uppdateringar - Disable Trophy Pop-ups - Inaktivera popup för troféer + GUI Settings + Gränssnittsinställningar - Play title music - Spela titelmusik + Title Music + Titelmusik - Update Compatibility Database On Startup - Uppdatera databas vid uppstart + Disable Trophy Pop-ups + Inaktivera popup för troféer - Game Compatibility - Spelkompatibilitet + Background Image + Bakgrundsbild - Display Compatibility Data - Visa kompatibilitetsdata + Show Background Image + Visa bakgrundsbild - Update Compatibility Database - Uppdatera kompatibilitetsdatabasen + Opacity + Opacitet - Volume - Volym + Play title music + Spela titelmusik - Save - Spara + Update Compatibility Database On Startup + Uppdatera databas vid uppstart - Apply - Verkställ + Game Compatibility + Spelkompatibilitet - Restore Defaults - Återställ till standard + Display Compatibility Data + Visa kompatibilitetsdata - Close - Stäng + Update Compatibility Database + Uppdatera kompatibilitetsdatabasen - Point your mouse at an option to display its description. - Flytta muspekaren till ett alternativ för att visa dess beskrivning. + Volume + Volym - consoleLanguageGroupBox - Konsollspråk:\nStäller in språket som PS4-spelet använder.\nDet rekommenderas att ställa in detta till ett språk som spelet har stöd för, vilket kan skilja sig mellan regioner + Save + Spara - emulatorLanguageGroupBox - Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt + Apply + Verkställ - fullscreenCheckBox - Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka på F11-tangenten + Restore Defaults + Återställ till standard - separateUpdatesCheckBox - Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id + Close + Stäng - showSplashCheckBox - Visa startskärm:\nVisar spelets startskärm (en speciell bild) när spelet startas + Point your mouse at an option to display its description. + Flytta muspekaren till ett alternativ för att visa dess beskrivning. - discordRPCCheckbox - Aktivera Discord Rich Presence:\nVisar emulatorikonen och relevant information på din Discord-profil + consoleLanguageGroupBox + Konsollspråk:\nStäller in språket som PS4-spelet använder.\nDet rekommenderas att ställa in detta till ett språk som spelet har stöd för, vilket kan skilja sig mellan regioner - userName - Användarnamn:\nStäller in PS4ans användarkonto, som kan visas av vissa spel + emulatorLanguageGroupBox + Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt - TrophyKey - Trofényckel:\nNyckel som används för att avkryptera troféer. Måste hämtas från din konsoll (jailbroken).\nMåste innehålla endast hex-tecken + fullscreenCheckBox + Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka på F11-tangenten - logTypeGroupBox - Loggtyp:\nStäller in huruvida synkronisering av utdata för loggfönstret för prestanda. Kan ha inverkan på emulationen + separateUpdatesCheckBox + Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id - logFilter - Loggfilter:\nFiltrera loggen till att endast skriva ut specifik information.\nExempel: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNivåer: Trace, Debug, Info, Warning, Error, Critical - i den ordningen, en specifik nivå som tystar alla nivåer före den i listan och loggar allting efter den + showSplashCheckBox + Visa startskärm:\nVisar spelets startskärm (en speciell bild) när spelet startas - updaterGroupBox - Uppdatering:\nRelease: Officiella versioner som släpps varje månad som kan vara mycket utdaterade, men är mer pålitliga och testade.\nNightly: Utvecklingsversioner som har de senaste funktionerna och fixarna, men kan innehålla fel och är mindre stabila + discordRPCCheckbox + Aktivera Discord Rich Presence:\nVisar emulatorikonen och relevant information på din Discord-profil - GUIMusicGroupBox - Spela upp titelmusik:\nOm ett spel har stöd för det kan speciell musik spelas upp från spelet i gränssnittet + userName + Användarnamn:\nStäller in PS4ans användarkonto, som kan visas av vissa spel - disableTrophycheckBox - Inaktivera popup för troféer:\nInaktivera troféeaviseringar i spel. Troféförlopp kan fortfarande följas med Troféevisaren (högerklicka på spelet i huvudfönstret) + TrophyKey + Trofényckel:\nNyckel som används för att avkryptera troféer. Måste hämtas från din konsoll (jailbroken).\nMåste innehålla endast hex-tecken - hideCursorGroupBox - Dölj pekare:\nVälj när muspekaren ska försvinna:\nAldrig: Du kommer alltid se muspekaren.\nOverksam: Ställ in en tid för när den ska försvinna efter den inte använts.\nAlltid: du kommer aldrig se muspekaren + logTypeGroupBox + Loggtyp:\nStäller in huruvida synkronisering av utdata för loggfönstret för prestanda. Kan ha inverkan på emulationen - idleTimeoutGroupBox - Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv + logFilter + Loggfilter:\nFiltrera loggen till att endast skriva ut specifik information.\nExempel: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNivåer: Trace, Debug, Info, Warning, Error, Critical - i den ordningen, en specifik nivå som tystar alla nivåer före den i listan och loggar allting efter den - backButtonBehaviorGroupBox - Beteende för bakåtknapp:\nStäller in handkontrollerns bakåtknapp för att emulera ett tryck på angivna positionen på PS4ns touchpad + updaterGroupBox + Uppdatering:\nRelease: Officiella versioner som släpps varje månad som kan vara mycket utdaterade, men är mer pålitliga och testade.\nNightly: Utvecklingsversioner som har de senaste funktionerna och fixarna, men kan innehålla fel och är mindre stabila - enableCompatibilityCheckBox - Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera "Uppdatera kompatibilitet vid uppstart" för att få uppdaterad information + GUIBackgroundImageGroupBox + Bakgrundsbild:\nKontrollerar opaciteten för spelets bakgrundsbild - checkCompatibilityOnStartupCheckBox - Uppdatera kompatibilitet vid uppstart:\nUppdatera automatiskt kompatibilitetsdatabasen när shadPS4 startar + GUIMusicGroupBox + Spela upp titelmusik:\nOm ett spel har stöd för det kan speciell musik spelas upp från spelet i gränssnittet - updateCompatibilityButton - Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt + disableTrophycheckBox + Inaktivera popup för troféer:\nInaktivera troféeaviseringar i spel. Troféförlopp kan fortfarande följas med Troféevisaren (högerklicka på spelet i huvudfönstret) - Never - Aldrig + hideCursorGroupBox + Dölj pekare:\nVälj när muspekaren ska försvinna:\nAldrig: Du kommer alltid se muspekaren.\nOverksam: Ställ in en tid för när den ska försvinna efter den inte använts.\nAlltid: du kommer aldrig se muspekaren - Idle - Overksam + idleTimeoutGroupBox + Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv - Always - Alltid + backButtonBehaviorGroupBox + Beteende för bakåtknapp:\nStäller in handkontrollerns bakåtknapp för att emulera ett tryck på angivna positionen på PS4ns touchpad - Touchpad Left - Touchpad vänster + enableCompatibilityCheckBox + Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera "Uppdatera kompatibilitet vid uppstart" för att få uppdaterad information - Touchpad Right - Touchpad höger + checkCompatibilityOnStartupCheckBox + Uppdatera kompatibilitet vid uppstart:\nUppdatera automatiskt kompatibilitetsdatabasen när shadPS4 startar - Touchpad Center - Touchpad mitten + updateCompatibilityButton + Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt - None - Ingen + Never + Aldrig - graphicsAdapterGroupBox - Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja "Auto Select" för att automatiskt bestämma det + Idle + Overksam - resolutionLayout - Bredd/Höjd:\nStäller in storleken för emulatorfönstret vid uppstart, som kan storleksändras under spelning.\nDetta är inte det samma som spelupplösningen + Always + Alltid - heightDivider - Vblank Divider:\nBildfrekvensen som emulatorn uppdaterar vid multipliceras med detta tal. Ändra detta kan ha inverkan på saker, såsom ökad spelhastighet eller göra sönder kritisk spelfunktionalitet, som inte förväntar sig denna ändring + Touchpad Left + Touchpad vänster - dumpShadersCheckBox - Aktivera Shaders Dumping:\nFör teknisk felsökning, sparar spelets shaders till en mapp när de renderas + Touchpad Right + Touchpad höger - nullGpuCheckBox - Aktivera Null GPU:\nFör teknisk felsökning, inaktiverar spelrenderingen som om det inte fanns något grafikkort + Touchpad Center + Touchpad mitten - gameFoldersBox - Spelmappar:\nListan över mappar att leta i efter installerade spel + None + Ingen - addFolderButton - Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar till en separat mapp för enkel hantering.\nDetta kan manuellt skapas genom att lägga till den uppackade uppdateringen till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id + graphicsAdapterGroupBox + Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja "Auto Select" för att automatiskt bestämma det - removeFolderButton - Ta bort:\nTa bort en mapp från listan + resolutionLayout + Bredd/Höjd:\nStäller in storleken för emulatorfönstret vid uppstart, som kan storleksändras under spelning.\nDetta är inte det samma som spelupplösningen - debugDump - Aktivera felsökningsdumpning:\nSparar import och export av symboler och fil-header-information för aktuellt körande PS4-program till en katalog + heightDivider + Vblank Divider:\nBildfrekvensen som emulatorn uppdaterar vid multipliceras med detta tal. Ändra detta kan ha inverkan på saker, såsom ökad spelhastighet eller göra sönder kritisk spelfunktionalitet, som inte förväntar sig denna ändring - vkValidationCheckBox - Aktivera Vulkan Validation Layers:\nAktiverar ett system som validerar tillståndet för Vulkan renderer och loggar information om dess interna tillstånd.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen + dumpShadersCheckBox + Aktivera Shaders Dumping:\nFör teknisk felsökning, sparar spelets shaders till en mapp när de renderas - vkSyncValidationCheckBox - Aktivera Vulkan Synchronization Validation:\nAktiverar ett system som validerar timing för Vulkan rendering tasks.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen + nullGpuCheckBox + Aktivera Null GPU:\nFör teknisk felsökning, inaktiverar spelrenderingen som om det inte fanns något grafikkort - rdocCheckBox - Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta + enableHDRCheckBox + enableHDRCheckBox - collectShaderCheckBox - Samla shaders:\nDu behöver aktivera detta för att redigera shaders med felsökningsmenyn (Ctrl + F10) + gameFoldersBox + Spelmappar:\nListan över mappar att leta i efter installerade spel - crashDiagnosticsCheckBox - Krashdiagnostik:\nSkapar en .yaml-fil med information om Vulkan-tillståndet vid tid för kraschen.\nAnvändbart för felsökning av 'Device lost'-fel. Om du har aktiverat detta bör du aktivera felsökningsmarkörer för Värd OCH Gäst.\nFungerar inte på Intel GPUer.\nDu behöver aktivera Vulkan Validation Layers och Vulkan SDK för att detta ska fungera + addFolderButton + Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar till en separat mapp för enkel hantering.\nDetta kan manuellt skapas genom att lägga till den uppackade uppdateringen till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id - copyGPUBuffersCheckBox - Kopiera GPU-buffertar:\nGör att man kan komma runt race conditions som involverar GPU submits.\nKan eller kan inte hjälpa med PM4 type 0-kraschar + removeFolderButton + Ta bort:\nTa bort en mapp från listan - hostMarkersCheckBox - Felsökningsmarkörer för värd:\nInfogar informationsliknande markörer i emulatorn för specifika AMDGPU-kommandon runt Vulkan-kommandon, så väl som ger resurser felsökningsnamn.\nOm du har detta aktiverat bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc + debugDump + Aktivera felsökningsdumpning:\nSparar import och export av symboler och fil-header-information för aktuellt körande PS4-program till en katalog - guestMarkersCheckBox - Felsökningsmarkörer för gäst:\nInfogar felsökningsmarkörer som själva spelet har lagt till i kommandobufferten.\nOm du har aktiverat detta bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc + vkValidationCheckBox + Aktivera Vulkan Validation Layers:\nAktiverar ett system som validerar tillståndet för Vulkan renderer och loggar information om dess interna tillstånd.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen - Release - Release + vkSyncValidationCheckBox + Aktivera Vulkan Synchronization Validation:\nAktiverar ett system som validerar timing för Vulkan rendering tasks.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen - Nightly - Nightly + rdocCheckBox + Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta - Set the volume of the background music. - Ställ in volymen för bakgrundsmusiken. + collectShaderCheckBox + Samla shaders:\nDu behöver aktivera detta för att redigera shaders med felsökningsmenyn (Ctrl + F10) - async - asynk + crashDiagnosticsCheckBox + Krashdiagnostik:\nSkapar en .yaml-fil med information om Vulkan-tillståndet vid tid för kraschen.\nAnvändbart för felsökning av 'Device lost'-fel. Om du har aktiverat detta bör du aktivera felsökningsmarkörer för Värd OCH Gäst.\nFungerar inte på Intel GPUer.\nDu behöver aktivera Vulkan Validation Layers och Vulkan SDK för att detta ska fungera - sync - synk + copyGPUBuffersCheckBox + Kopiera GPU-buffertar:\nGör att man kan komma runt race conditions som involverar GPU submits.\nKan eller kan inte hjälpa med PM4 type 0-kraschar - Directory to install games - Katalog att installera spel till + hostMarkersCheckBox + Felsökningsmarkörer för värd:\nInfogar informationsliknande markörer i emulatorn för specifika AMDGPU-kommandon runt Vulkan-kommandon, så väl som ger resurser felsökningsnamn.\nOm du har detta aktiverat bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc - Borderless - Fönster utan kanter + guestMarkersCheckBox + Felsökningsmarkörer för gäst:\nInfogar felsökningsmarkörer som själva spelet har lagt till i kommandobufferten.\nOm du har aktiverat detta bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc - True - Sant + saveDataBox + Sökväg för sparat data:\nSökvägen där spelets sparade data kommer att sparas - Enable Motion Controls - Aktivera rörelsekontroller + browseButton + Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data - Save Data Path - Sökväg för sparat data + Borderless + Fönster utan kanter - Browse - Bläddra + True + Sant - Directory to save data - Katalog för sparat data + Release + Release - saveDataBox - Sökväg för sparat data:\nSökvägen där spelets sparade data kommer att sparas + Nightly + Nightly - browseButton - Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data + Set the volume of the background music. + Ställ in volymen för bakgrundsmusiken. - GUI - Gränssnitt + Enable Motion Controls + Aktivera rörelsekontroller - Background Image - Bakgrundsbild + Save Data Path + Sökväg för sparat data - Show Background Image - Visa bakgrundsbild + Browse + Bläddra - Opacity - Opacitet + async + asynk - Auto Select - Välj automatiskt + sync + synk - GUIBackgroundImageGroupBox - Bakgrundsbild:\nKontrollerar opaciteten för spelets bakgrundsbild + Auto Select + Välj automatiskt - Enable HDR - + Directory to install games + Katalog att installera spel till - enableHDRCheckBox - + Directory to save data + Katalog för sparat data - - + + TrophyViewer - Trophy Viewer - Trofé-visare + Trophy Viewer + Trofé-visare - + diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 7c8d078db..760fda1f2 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - shadPS4 Hakkında + About shadPS4 + shadPS4 Hakkında - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. - This software should not be used to play games you have not legally obtained. - Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır. + This software should not be used to play games you have not legally obtained. + Bu yazılım, yasal olarak edinmediğiniz oyunları oynamak için kullanılmamalıdır. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Görüntü Mevcut Değil + No Image Available + Görüntü Mevcut Değil - Serial: - Seri Numarası: + Serial: + Seri Numarası: - Version: - Sürüm: + Version: + Sürüm: - Size: - Boyut: + Size: + Boyut: - Select Cheat File: - Hile Dosyasını Seçin: + Select Cheat File: + Hile Dosyasını Seçin: - Repository: - Depo: + Repository: + Depo: - Download Cheats - Hileleri İndir + Download Cheats + Hileleri İndir - Delete File - Dosyayı Sil + Delete File + Dosyayı Sil - No files selected. - Hiçbir dosya seçilmedi. + No files selected. + Hiçbir dosya seçilmedi. - You can delete the cheats you don't want after downloading them. - İndirdikten sonra istemediğiniz hileleri silebilirsiniz. + You can delete the cheats you don't want after downloading them. + İndirdikten sonra istemediğiniz hileleri silebilirsiniz. - Do you want to delete the selected file?\n%1 - Seçilen dosyayı silmek istiyor musunuz?\n%1 + Do you want to delete the selected file?\n%1 + Seçilen dosyayı silmek istiyor musunuz?\n%1 - Select Patch File: - Yama Dosyasını Seçin: + Select Patch File: + Yama Dosyasını Seçin: - Download Patches - Yamaları İndir + Download Patches + Yamaları İndir - Save - Kaydet + Save + Kaydet - Cheats - Hileler + Cheats + Hileler - Patches - Yamalar + Patches + Yamalar - Error - Hata + Error + Hata - No patch selected. - Hiç yama seçilmedi. + No patch selected. + Hiç yama seçilmedi. - Unable to open files.json for reading. - files.json dosyası okumak için açılamadı. + Unable to open files.json for reading. + files.json dosyası okumak için açılamadı. - No patch file found for the current serial. - Mevcut seri numarası için hiç yama dosyası bulunamadı. + No patch file found for the current serial. + Mevcut seri numarası için hiç yama dosyası bulunamadı. - Unable to open the file for reading. - Dosya okumak için açılamadı. + Unable to open the file for reading. + Dosya okumak için açılamadı. - Unable to open the file for writing. - Dosya yazmak için açılamadı. + Unable to open the file for writing. + Dosya yazmak için açılamadı. - Failed to parse XML: - XML ayrıştırılamadı: + Failed to parse XML: + XML ayrıştırılamadı: - Success - Başarı + Success + Başarı - Options saved successfully. - Ayarlar başarıyla kaydedildi. + Options saved successfully. + Ayarlar başarıyla kaydedildi. - Invalid Source - Geçersiz Kaynak + Invalid Source + Geçersiz Kaynak - The selected source is invalid. - Seçilen kaynak geçersiz. + The selected source is invalid. + Seçilen kaynak geçersiz. - File Exists - Dosya Var + File Exists + Dosya Var - File already exists. Do you want to replace it? - Dosya zaten var. Üzerine yazmak ister misiniz? + File already exists. Do you want to replace it? + Dosya zaten var. Üzerine yazmak ister misiniz? - Failed to save file: - Dosya kaydedilemedi: + Failed to save file: + Dosya kaydedilemedi: - Failed to download file: - Dosya indirilemedi: + Failed to download file: + Dosya indirilemedi: - Cheats Not Found - Hileler Bulunamadı + Cheats Not Found + Hileler Bulunamadı - CheatsNotFound_MSG - Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. + CheatsNotFound_MSG + Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. - Cheats Downloaded Successfully - Hileler Başarıyla İndirildi + Cheats Downloaded Successfully + Hileler Başarıyla İndirildi - CheatsDownloadedSuccessfully_MSG - Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. + CheatsDownloadedSuccessfully_MSG + Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. - Failed to save: - Kaydedilemedi: + Failed to save: + Kaydedilemedi: - Failed to download: - İndirilemedi: + Failed to download: + İndirilemedi: - Download Complete - İndirme Tamamlandı + Download Complete + İndirme Tamamlandı - DownloadComplete_MSG - Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. + DownloadComplete_MSG + Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. - Failed to parse JSON data from HTML. - HTML'den JSON verileri ayrıştırılamadı. + Failed to parse JSON data from HTML. + HTML'den JSON verileri ayrıştırılamadı. - Failed to retrieve HTML page. - HTML sayfası alınamadı. + Failed to retrieve HTML page. + HTML sayfası alınamadı. - The game is in version: %1 - Oyun sürümü: %1 + The game is in version: %1 + Oyun sürümü: %1 - The downloaded patch only works on version: %1 - İndirilen yama sadece şu sürümde çalışıyor: %1 + The downloaded patch only works on version: %1 + İndirilen yama sadece şu sürümde çalışıyor: %1 - You may need to update your game. - Oyunuzu güncellemeniz gerekebilir. + You may need to update your game. + Oyunuzu güncellemeniz gerekebilir. - Incompatibility Notice - Uyumsuzluk Bildirimi + Incompatibility Notice + Uyumsuzluk Bildirimi - Failed to open file: - Dosya açılamadı: + Failed to open file: + Dosya açılamadı: - XML ERROR: - XML HATASI: + XML ERROR: + XML HATASI: - Failed to open files.json for writing - files.json dosyası yazmak için açılamadı + Failed to open files.json for writing + files.json dosyası yazmak için açılamadı - Author: - Yazar: + Author: + Yazar: - Directory does not exist: - Klasör mevcut değil: + Directory does not exist: + Klasör mevcut değil: - Failed to open files.json for reading. - files.json dosyası okumak için açılamadı. + Failed to open files.json for reading. + files.json dosyası okumak için açılamadı. - Name: - İsim: + Name: + İsim: - Can't apply cheats before the game is started - Hileleri oyuna başlamadan önce uygulayamazsınız. + Can't apply cheats before the game is started + Hileleri oyuna başlamadan önce uygulayamazsınız. - Close - Kapat + Close + Kapat - - + + CheckUpdate - Auto Updater - Otomatik Güncelleyici + Auto Updater + Otomatik Güncelleyici - Error - Hata + Error + Hata - Network error: - Ağ hatası: + Network error: + Ağ hatası: - Error_Github_limit_MSG - Otomatik Güncelleyici, saat başına en fazla 60 güncelleme kontrolüne izin verir.\nBu sınıra ulaştınız. Lütfen daha sonra tekrar deneyin. + Error_Github_limit_MSG + Otomatik Güncelleyici, saat başına en fazla 60 güncelleme kontrolüne izin verir.\nBu sınıra ulaştınız. Lütfen daha sonra tekrar deneyin. - Failed to parse update information. - Güncelleme bilgilerini ayrıştırma başarısız oldu. + Failed to parse update information. + Güncelleme bilgilerini ayrıştırma başarısız oldu. - No pre-releases found. - Ön sürüm bulunamadı. + No pre-releases found. + Ön sürüm bulunamadı. - Invalid release data. - Geçersiz sürüm verisi. + Invalid release data. + Geçersiz sürüm verisi. - No download URL found for the specified asset. - Belirtilen varlık için hiçbir indirme URL'si bulunamadı. + No download URL found for the specified asset. + Belirtilen varlık için hiçbir indirme URL'si bulunamadı. - Your version is already up to date! - Sürümünüz zaten güncel! + Your version is already up to date! + Sürümünüz zaten güncel! - Update Available - Güncelleme Mevcut + Update Available + Güncelleme Mevcut - Update Channel - Güncelleme Kanalı + Update Channel + Güncelleme Kanalı - Current Version - Mevcut Sürüm + Current Version + Mevcut Sürüm - Latest Version - Son Sürüm + Latest Version + Son Sürüm - Do you want to update? - Güncellemek istiyor musunuz? + Do you want to update? + Güncellemek istiyor musunuz? - Show Changelog - Değişiklik Günlüğünü Göster + Show Changelog + Değişiklik Günlüğünü Göster - Check for Updates at Startup - Başlangıçta güncellemeleri kontrol et + Check for Updates at Startup + Başlangıçta güncellemeleri kontrol et - Update - Güncelle + Update + Güncelle - No - Hayır + No + Hayır - Hide Changelog - Değişiklik Günlüğünü Gizle + Hide Changelog + Değişiklik Günlüğünü Gizle - Changes - Değişiklikler + Changes + Değişiklikler - Network error occurred while trying to access the URL - URL'ye erişmeye çalışırken bir ağ hatası oluştu + Network error occurred while trying to access the URL + URL'ye erişmeye çalışırken bir ağ hatası oluştu - Download Complete - İndirme Tamamlandı + Download Complete + İndirme Tamamlandı - The update has been downloaded, press OK to install. - Güncelleme indirildi, yüklemek için Tamam'a basın. + The update has been downloaded, press OK to install. + Güncelleme indirildi, yüklemek için Tamam'a basın. - Failed to save the update file at - Güncelleme dosyası kaydedilemedi + Failed to save the update file at + Güncelleme dosyası kaydedilemedi - Starting Update... - Güncelleme Başlatılıyor... + Starting Update... + Güncelleme Başlatılıyor... - Failed to create the update script file - Güncelleme komut dosyası oluşturulamadı + Failed to create the update script file + Güncelleme komut dosyası oluşturulamadı - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Uyumluluk verileri alınıyor, lütfen bekleyin + Fetching compatibility data, please wait + Uyumluluk verileri alınıyor, lütfen bekleyin - Cancel - İptal + Cancel + İptal - Loading... - Yükleniyor... + Loading... + Yükleniyor... - Error - Hata + Error + Hata - Unable to update compatibility data! Try again later. - Uyumluluk verileri güncellenemedi! Lütfen daha sonra tekrar deneyin. + Unable to update compatibility data! Try again later. + Uyumluluk verileri güncellenemedi! Lütfen daha sonra tekrar deneyin. - Unable to open compatibility_data.json for writing. - compatibility_data.json dosyasını yazmak için açamadık. + Unable to open compatibility_data.json for writing. + compatibility_data.json dosyasını yazmak için açamadık. - Unknown - Bilinmeyen + Unknown + Bilinmeyen - Nothing - Hiçbir şey + Nothing + Hiçbir şey - Boots - Botlar + Boots + Botlar - Menus - Menüler + Menus + Menüler - Ingame - Oyunda + Ingame + Oyunda - Playable - Oynanabilir + Playable + Oynanabilir - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Klasörü Aç + Open Folder + Klasörü Aç - - + + GameInfoClass - Loading game list, please wait :3 - Oyun listesi yükleniyor, lütfen bekleyin :3 + Loading game list, please wait :3 + Oyun listesi yükleniyor, lütfen bekleyin :3 - Cancel - İptal + Cancel + İptal - Loading... - Yükleniyor... + Loading... + Yükleniyor... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Klasörü Seç + shadPS4 - Choose directory + shadPS4 - Klasörü Seç - Directory to install games - Oyunların yükleneceği klasör + Directory to install games + Oyunların yükleneceği klasör - Browse - Gözat + Browse + Gözat - Error - Hata + Error + Hata - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Simge + Icon + Simge - Name - Ad + Name + Ad - Serial - Seri Numarası + Serial + Seri Numarası - Compatibility - Uyumluluk + Compatibility + Uyumluluk - Region - Bölge + Region + Bölge - Firmware - Yazılım + Firmware + Yazılım - Size - Boyut + Size + Boyut - Version - Sürüm + Version + Sürüm - Path - Yol + Path + Yol - Play Time - Oynama Süresi + Play Time + Oynama Süresi - Never Played - Hiç Oynanmadı + Never Played + Hiç Oynanmadı - h - sa + h + sa - m - dk + m + dk - s - sn + s + sn - Compatibility is untested - Uyumluluk test edilmemiş + Compatibility is untested + Uyumluluk test edilmemiş - Game does not initialize properly / crashes the emulator - Oyun düzgün bir şekilde başlatılamıyor / emülatörü çökertiyor + Game does not initialize properly / crashes the emulator + Oyun düzgün bir şekilde başlatılamıyor / emülatörü çökertiyor - Game boots, but only displays a blank screen - Oyun başlatılabiliyor ancak yalnızca boş bir ekran gösteriyor + Game boots, but only displays a blank screen + Oyun başlatılabiliyor ancak yalnızca boş bir ekran gösteriyor - Game displays an image but does not go past the menu - Oyun bir resim gösteriyor ancak menüleri geçemiyor + Game displays an image but does not go past the menu + Oyun bir resim gösteriyor ancak menüleri geçemiyor - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Oyun, oynanabilir performansla tamamlanabilir ve büyük aksaklık yok + Game can be completed with playable performance and no major glitches + Oyun, oynanabilir performansla tamamlanabilir ve büyük aksaklık yok - Click to see details on github - Detayları görmek için GitHub’a tıklayın + Click to see details on github + Detayları görmek için GitHub’a tıklayın - Last updated - Son güncelleme + Last updated + Son güncelleme - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Kısayol Oluştur + Create Shortcut + Kısayol Oluştur - Cheats / Patches - Hileler / Yamanlar + Cheats / Patches + Hileler / Yamanlar - SFO Viewer - SFO Görüntüleyici + SFO Viewer + SFO Görüntüleyici - Trophy Viewer - Kupa Görüntüleyici + Trophy Viewer + Kupa Görüntüleyici - Open Folder... - Klasörü Aç... + Open Folder... + Klasörü Aç... - Open Game Folder - Oyun Klasörünü Aç + Open Game Folder + Oyun Klasörünü Aç - Open Save Data Folder - Kaydetme Verileri Klasörünü Aç + Open Save Data Folder + Kaydetme Verileri Klasörünü Aç - Open Log Folder - Log Klasörünü Aç + Open Log Folder + Log Klasörünü Aç - Copy info... - Bilgiyi Kopyala... + Copy info... + Bilgiyi Kopyala... - Copy Name - Adı Kopyala + Copy Name + Adı Kopyala - Copy Serial - Seri Numarasını Kopyala + Copy Serial + Seri Numarasını Kopyala - Copy All - Tümünü Kopyala + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Tümünü Kopyala - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Kısayol oluşturma + View report + View report - Shortcut created successfully! - Kısayol başarıyla oluşturuldu! + Submit a report + Submit a report - Error - Hata + Shortcut creation + Kısayol oluşturma - Error creating shortcut! - Kısayol oluşturulurken hata oluştu! + Shortcut created successfully! + Kısayol başarıyla oluşturuldu! - Install PKG - PKG Yükle + Error + Hata - Game - Game + Error creating shortcut! + Kısayol oluşturulurken hata oluştu! - This game has no update to delete! - This game has no update to delete! + Install PKG + PKG Yükle - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Klasörü Seç + shadPS4 - Choose directory + shadPS4 - Klasörü Seç - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Elf Klasörünü Aç/Ekle + Open/Add Elf Folder + Elf Klasörünü Aç/Ekle - Install Packages (PKG) - Paketleri Kur (PKG) + Install Packages (PKG) + Paketleri Kur (PKG) - Boot Game - Oyunu Başlat + Boot Game + Oyunu Başlat - Check for Updates - Güncellemeleri kontrol et + Check for Updates + Güncellemeleri kontrol et - About shadPS4 - shadPS4 Hakkında + About shadPS4 + shadPS4 Hakkında - Configure... - Yapılandır... + Configure... + Yapılandır... - Install application from a .pkg file - .pkg dosyasından uygulama yükle + Install application from a .pkg file + .pkg dosyasından uygulama yükle - Recent Games - Son Oyunlar + Recent Games + Son Oyunlar - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Çıkış + Exit + Çıkış - Exit shadPS4 - shadPS4'ten Çık + Exit shadPS4 + shadPS4'ten Çık - Exit the application. - Uygulamadan çık. + Exit the application. + Uygulamadan çık. - Show Game List - Oyun Listesini Göster + Show Game List + Oyun Listesini Göster - Game List Refresh - Oyun Listesini Yenile + Game List Refresh + Oyun Listesini Yenile - Tiny - Küçük + Tiny + Küçük - Small - Ufak + Small + Ufak - Medium - Orta + Medium + Orta - Large - Büyük + Large + Büyük - List View - Liste Görünümü + List View + Liste Görünümü - Grid View - Izgara Görünümü + Grid View + Izgara Görünümü - Elf Viewer - Elf Görüntüleyici + Elf Viewer + Elf Görüntüleyici - Game Install Directory - Oyun Kurulum Klasörü + Game Install Directory + Oyun Kurulum Klasörü - Download Cheats/Patches - Hileleri/Yamaları İndir + Download Cheats/Patches + Hileleri/Yamaları İndir - Dump Game List - Oyun Listesini Kaydet + Dump Game List + Oyun Listesini Kaydet - PKG Viewer - PKG Görüntüleyici + PKG Viewer + PKG Görüntüleyici - Search... - Ara... + Search... + Ara... - File - Dosya + File + Dosya - View - Görünüm + View + Görünüm - Game List Icons - Oyun Listesi Simgeleri + Game List Icons + Oyun Listesi Simgeleri - Game List Mode - Oyun Listesi Modu + Game List Mode + Oyun Listesi Modu - Settings - Ayarlar + Settings + Ayarlar - Utils - Yardımcı Araçlar + Utils + Yardımcı Araçlar - Themes - Temalar + Themes + Temalar - Help - Yardım + Help + Yardım - Dark - Koyu + Dark + Koyu - Light - Açık + Light + Açık - Green - Yeşil + Green + Yeşil - Blue - Mavi + Blue + Mavi - Violet - Mor + Violet + Mor - toolBar - Araç Çubuğu + toolBar + Araç Çubuğu - Game List - Oyun Listesi + Game List + Oyun Listesi - * Unsupported Vulkan Version - * Desteklenmeyen Vulkan Sürümü + * Unsupported Vulkan Version + * Desteklenmeyen Vulkan Sürümü - Download Cheats For All Installed Games - Tüm Yüklenmiş Oyunlar İçin Hileleri İndir + Download Cheats For All Installed Games + Tüm Yüklenmiş Oyunlar İçin Hileleri İndir - Download Patches For All Games - Tüm Oyunlar İçin Yamaları İndir + Download Patches For All Games + Tüm Oyunlar İçin Yamaları İndir - Download Complete - İndirme Tamamlandı + Download Complete + İndirme Tamamlandı - You have downloaded cheats for all the games you have installed. - Yüklediğiniz tüm oyunlar için hileleri indirdiniz. + You have downloaded cheats for all the games you have installed. + Yüklediğiniz tüm oyunlar için hileleri indirdiniz. - Patches Downloaded Successfully! - Yamalar Başarıyla İndirildi! + Patches Downloaded Successfully! + Yamalar Başarıyla İndirildi! - All Patches available for all games have been downloaded. - Tüm oyunlar için mevcut tüm yamalar indirildi. + All Patches available for all games have been downloaded. + Tüm oyunlar için mevcut tüm yamalar indirildi. - Games: - Oyunlar: + Games: + Oyunlar: - ELF files (*.bin *.elf *.oelf) - ELF Dosyaları (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF Dosyaları (*.bin *.elf *.oelf) - Game Boot - Oyun Başlatma + Game Boot + Oyun Başlatma - Only one file can be selected! - Sadece bir dosya seçilebilir! + Only one file can be selected! + Sadece bir dosya seçilebilir! - PKG Extraction - PKG Çıkartma + PKG Extraction + PKG Çıkartma - Patch detected! - Yama tespit edildi! + Patch detected! + Yama tespit edildi! - PKG and Game versions match: - PKG ve oyun sürümleri uyumlu: + PKG and Game versions match: + PKG ve oyun sürümleri uyumlu: - Would you like to overwrite? - Üzerine yazmak ister misiniz? + Would you like to overwrite? + Üzerine yazmak ister misiniz? - PKG Version %1 is older than installed version: - PKG Sürümü %1, kurulu sürümden daha eski: + PKG Version %1 is older than installed version: + PKG Sürümü %1, kurulu sürümden daha eski: - Game is installed: - Oyun yüklendi: + Game is installed: + Oyun yüklendi: - Would you like to install Patch: - Yamanın yüklenmesini ister misiniz: + Would you like to install Patch: + Yamanın yüklenmesini ister misiniz: - DLC Installation - DLC Yükleme + DLC Installation + DLC Yükleme - Would you like to install DLC: %1? - DLC'yi yüklemek ister misiniz: %1? + Would you like to install DLC: %1? + DLC'yi yüklemek ister misiniz: %1? - DLC already installed: - DLC zaten yüklü: + DLC already installed: + DLC zaten yüklü: - Game already installed - Oyun zaten yüklü + Game already installed + Oyun zaten yüklü - PKG ERROR - PKG HATASI + PKG ERROR + PKG HATASI - Extracting PKG %1/%2 - PKG Çıkarılıyor %1/%2 + Extracting PKG %1/%2 + PKG Çıkarılıyor %1/%2 - Extraction Finished - Çıkarma Tamamlandı + Extraction Finished + Çıkarma Tamamlandı - Game successfully installed at %1 - Oyun başarıyla %1 konumuna yüklendi + Game successfully installed at %1 + Oyun başarıyla %1 konumuna yüklendi - File doesn't appear to be a valid PKG file - Dosya geçerli bir PKG dosyası gibi görünmüyor + File doesn't appear to be a valid PKG file + Dosya geçerli bir PKG dosyası gibi görünmüyor - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Klasörü Aç + Open Folder + Klasörü Aç - Name - Ad + PKG ERROR + PKG HATASI - Serial - Seri Numarası + Name + Ad - Installed - + Serial + Seri Numarası - Size - Boyut + Installed + Installed - Category - + Size + Boyut - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Bölge + FW + FW - Flags - + Region + Bölge - Path - Yol + Flags + Flags - File - Dosya + Path + Yol - PKG ERROR - PKG HATASI + File + Dosya - Unknown - Bilinmeyen + Unknown + Bilinmeyen - Package - + Package + Package - - + + SettingsDialog - Settings - Ayarlar + Settings + Ayarlar - General - Genel + General + Genel - System - Sistem + System + Sistem - Console Language - Konsol Dili + Console Language + Konsol Dili - Emulator Language - Emülatör Dili + Emulator Language + Emülatör Dili - Emulator - Emülatör + Emulator + Emülatör - Enable Fullscreen - Tam Ekranı Etkinleştir + Enable Fullscreen + Tam Ekranı Etkinleştir - Fullscreen Mode - Tam Ekran Modu + Fullscreen Mode + Tam Ekran Modu - Enable Separate Update Folder - Ayrı Güncelleme Klasörünü Etkinleştir + Enable Separate Update Folder + Ayrı Güncelleme Klasörünü Etkinleştir - Default tab when opening settings - Ayarlar açıldığında varsayılan sekme + Default tab when opening settings + Ayarlar açıldığında varsayılan sekme - Show Game Size In List - Oyun Boyutunu Listede Göster + Show Game Size In List + Oyun Boyutunu Listede Göster - Show Splash - Başlangıç Ekranını Göster + Show Splash + Başlangıç Ekranını Göster - Enable Discord Rich Presence - Discord Rich Presence'i etkinleştir + Enable Discord Rich Presence + Discord Rich Presence'i etkinleştir - Username - Kullanıcı Adı + Username + Kullanıcı Adı - Trophy Key - Kupa Anahtarı + Trophy Key + Kupa Anahtarı - Trophy - Kupa + Trophy + Kupa - Logger - Kayıt Tutucu + Logger + Kayıt Tutucu - Log Type - Kayıt Türü + Log Type + Kayıt Türü - Log Filter - Kayıt Filtresi + Log Filter + Kayıt Filtresi - Open Log Location - Günlük Konumunu Aç + Open Log Location + Günlük Konumunu Aç - Input - Girdi + Input + Girdi - Cursor - İmleç + Cursor + İmleç - Hide Cursor - İmleci Gizle + Hide Cursor + İmleci Gizle - Hide Cursor Idle Timeout - İmleç İçin Hareketsizlik Zaman Aşımı + Hide Cursor Idle Timeout + İmleç İçin Hareketsizlik Zaman Aşımı - s - s + s + s - Controller - Kontrolcü + Controller + Kontrolcü - Back Button Behavior - Geri Dön Butonu Davranışı + Back Button Behavior + Geri Dön Butonu Davranışı - Graphics - Grafikler + Graphics + Grafikler - GUI - Arayüz + GUI + Arayüz - User - Kullanıcı + User + Kullanıcı - Graphics Device - Grafik Cihazı + Graphics Device + Grafik Cihazı - Width - Genişlik + Width + Genişlik - Height - Yükseklik + Height + Yükseklik - Vblank Divider - Vblank Bölücü + Vblank Divider + Vblank Bölücü - Advanced - Gelişmiş + Advanced + Gelişmiş - Enable Shaders Dumping - Shader Kaydını Etkinleştir + Enable Shaders Dumping + Shader Kaydını Etkinleştir - Enable NULL GPU - NULL GPU'yu Etkinleştir + Enable NULL GPU + NULL GPU'yu Etkinleştir - Paths - Yollar + Enable HDR + Enable HDR - Game Folders - Oyun Klasörleri + Paths + Yollar - Add... - Ekle... + Game Folders + Oyun Klasörleri - Remove - Kaldır + Add... + Ekle... - Debug - Hata Ayıklama + Remove + Kaldır - Enable Debug Dumping - Hata Ayıklama Dökümü Etkinleştir + Debug + Hata Ayıklama - Enable Vulkan Validation Layers - Vulkan Doğrulama Katmanlarını Etkinleştir + Enable Debug Dumping + Hata Ayıklama Dökümü Etkinleştir - Enable Vulkan Synchronization Validation - Vulkan Senkronizasyon Doğrulamasını Etkinleştir + Enable Vulkan Validation Layers + Vulkan Doğrulama Katmanlarını Etkinleştir - Enable RenderDoc Debugging - RenderDoc Hata Ayıklamayı Etkinleştir + Enable Vulkan Synchronization Validation + Vulkan Senkronizasyon Doğrulamasını Etkinleştir - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + RenderDoc Hata Ayıklamayı Etkinleştir - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Güncelle + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Başlangıçta güncellemeleri kontrol et + Update + Güncelle - Always Show Changelog - Her zaman değişiklik günlüğünü göster + Check for Updates at Startup + Başlangıçta güncellemeleri kontrol et - Update Channel - Güncelleme Kanalı + Always Show Changelog + Her zaman değişiklik günlüğünü göster - Check for Updates - Güncellemeleri Kontrol Et + Update Channel + Güncelleme Kanalı - GUI Settings - GUI Ayarları + Check for Updates + Güncellemeleri Kontrol Et - Title Music - Title Music + GUI Settings + GUI Ayarları - Disable Trophy Pop-ups - Kupa Açılır Pencerelerini Devre Dışı Bırak + Title Music + Title Music - Play title music - Başlık müziğini çal + Disable Trophy Pop-ups + Kupa Açılır Pencerelerini Devre Dışı Bırak - Update Compatibility Database On Startup - Başlangıçta Uyumluluk Veritabanını Güncelle + Background Image + Background Image - Game Compatibility - Oyun Uyumluluğu + Show Background Image + Show Background Image - Display Compatibility Data - Uyumluluk Verilerini Göster + Opacity + Opacity - Update Compatibility Database - Uyumluluk Veritabanını Güncelle + Play title music + Başlık müziğini çal - Volume - Ses Seviyesi + Update Compatibility Database On Startup + Başlangıçta Uyumluluk Veritabanını Güncelle - Save - Kaydet + Game Compatibility + Oyun Uyumluluğu - Apply - Uygula + Display Compatibility Data + Uyumluluk Verilerini Göster - Restore Defaults - Varsayılanları Geri Yükle + Update Compatibility Database + Uyumluluk Veritabanını Güncelle - Close - Kapat + Volume + Ses Seviyesi - Point your mouse at an option to display its description. - Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. + Save + Kaydet - consoleLanguageGroupBox - Konsol Dili:\nPS4 oyununun kullandığı dili ayarlar.\nBu seçeneği, oyunun desteklediği bir dilde ayarlamanız önerilir; bu durum bölgeye göre değişebilir. + Apply + Uygula - emulatorLanguageGroupBox - Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. + Restore Defaults + Varsayılanları Geri Yükle - fullscreenCheckBox - Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. + Close + Kapat - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. - showSplashCheckBox - Açılış Ekranını Göster:\nOyun açılırken (özel bir görüntü) açılış ekranını gösterir. + consoleLanguageGroupBox + Konsol Dili:\nPS4 oyununun kullandığı dili ayarlar.\nBu seçeneği, oyunun desteklediği bir dilde ayarlamanız önerilir; bu durum bölgeye göre değişebilir. - discordRPCCheckbox - Discord Rich Presence'i etkinleştir:\nEmülatör simgesini ve Discord profilinizdeki ilgili bilgileri gösterir. + emulatorLanguageGroupBox + Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. - userName - Kullanıcı Adı:\nBazı oyunlar tarafından gösterilebilen PS4 hesabının kullanıcı adını ayarlar. + fullscreenCheckBox + Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Günlük Türü:\nPerformans için günlük penceresi çıkışını senkronize etme durumunu ayarlar. Bu, emülasyonda olumsuz etkilere yol açabilir. + showSplashCheckBox + Açılış Ekranını Göster:\nOyun açılırken (özel bir görüntü) açılış ekranını gösterir. - logFilter - Günlük Filtre:\nSadece belirli bilgileri yazdırmak için günlüğü filtreler.\nÖrnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder. + discordRPCCheckbox + Discord Rich Presence'i etkinleştir:\nEmülatör simgesini ve Discord profilinizdeki ilgili bilgileri gösterir. - updaterGroupBox - Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. + userName + Kullanıcı Adı:\nBazı oyunlar tarafından gösterilebilen PS4 hesabının kullanıcı adını ayarlar. - GUIMusicGroupBox - Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Günlük Türü:\nPerformans için günlük penceresi çıkışını senkronize etme durumunu ayarlar. Bu, emülasyonda olumsuz etkilere yol açabilir. - hideCursorGroupBox - İmleci gizle:\nİmlecin ne zaman kaybolacağını seçin:\nAsla: Fareyi her zaman göreceksiniz.\nPasif: Hareketsiz kaldıktan sonra kaybolması için bir süre belirleyin.\nHer zaman: fareyi asla göremeyeceksiniz. + logFilter + Günlük Filtre:\nSadece belirli bilgileri yazdırmak için günlüğü filtreler.\nÖrnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder. - idleTimeoutGroupBox - Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın. + updaterGroupBox + Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. - backButtonBehaviorGroupBox - Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + İmleci gizle:\nİmlecin ne zaman kaybolacağını seçin:\nAsla: Fareyi her zaman göreceksiniz.\nPasif: Hareketsiz kaldıktan sonra kaybolması için bir süre belirleyin.\nHer zaman: fareyi asla göremeyeceksiniz. - Never - Asla + idleTimeoutGroupBox + Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın. - Idle - Boşta + backButtonBehaviorGroupBox + Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar. - Always - Her zaman + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Dokunmatik Yüzey Sol + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Dokunmatik Yüzey Sağ + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Dokunmatik Yüzey Orta + Never + Asla - None - Yok + Idle + Boşta - graphicsAdapterGroupBox - Grafik Aygıtı:\nBirden fazla GPU'ya sahip sistemlerde, emülatörün kullanacağı GPU'yu açılır listeden seçin,\nor "Auto Select" seçeneğini seçerek otomatik olarak belirlenmesini sağlayın. + Always + Her zaman - resolutionLayout - Genişlik/Yükseklik:\nEmülatör penceresinin açılışta boyutunu ayarlar; bu, oyun sırasında yeniden boyutlandırılabilir.\nBu, oyundaki çözünürlükten farklıdır. + Touchpad Left + Dokunmatik Yüzey Sol - heightDivider - Vblank Bölücü:\nEmülatörün yenileme hızı bu sayı ile çarpılır. Bu değerin değiştirilmesi olumsuz etkilere yol açabilir; oyun hızını artırabilir veya oyunun beklemediği kritik işlevselliği bozabilir! + Touchpad Right + Dokunmatik Yüzey Sağ - dumpShadersCheckBox - Shader'ları Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, shader'ları render edildikçe bir klasöre kaydeder. + Touchpad Center + Dokunmatik Yüzey Orta - nullGpuCheckBox - Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır. + None + Yok - gameFoldersBox - Oyun klasörleri:\nYüklenmiş oyunları kontrol etmek için klasörlerin listesi. + graphicsAdapterGroupBox + Grafik Aygıtı:\nBirden fazla GPU'ya sahip sistemlerde, emülatörün kullanacağı GPU'yu açılır listeden seçin,\nor "Auto Select" seçeneğini seçerek otomatik olarak belirlenmesini sağlayın. - addFolderButton - Ekle:\nListeye bir klasör ekle. + resolutionLayout + Genişlik/Yükseklik:\nEmülatör penceresinin açılışta boyutunu ayarlar; bu, oyun sırasında yeniden boyutlandırılabilir.\nBu, oyundaki çözünürlükten farklıdır. - removeFolderButton - Kaldır:\nListeden bir klasörü kaldır. + heightDivider + Vblank Bölücü:\nEmülatörün yenileme hızı bu sayı ile çarpılır. Bu değerin değiştirilmesi olumsuz etkilere yol açabilir; oyun hızını artırabilir veya oyunun beklemediği kritik işlevselliği bozabilir! - debugDump - Hata Ayıklama için Dışa Aktarmayı Etkinleştir:\nŞu anda çalışan PS4 uygulaması için içe aktarılan ve dışa aktarılan sembolleri ve dosya başlık bilgilerini bir dizine kaydedin. + dumpShadersCheckBox + Shader'ları Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, shader'ları render edildikçe bir klasöre kaydeder. - vkValidationCheckBox - Vulkan Doğrulama Katmanlarını Etkinleştir:\nVulkan renderlayıcısının durumunu doğrulayan ve iç durum hakkında bilgi kaydeden bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. + nullGpuCheckBox + Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır. - vkSyncValidationCheckBox - Vulkan Senkronizasyon Doğrulamasını Etkinleştir:\nVulkan renderlama görevlerinin senkronizasyonunu doğrulayan bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. + gameFoldersBox + Oyun klasörleri:\nYüklenmiş oyunları kontrol etmek için klasörlerin listesi. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Ekle:\nListeye bir klasör ekle. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Kaldır:\nListeden bir klasörü kaldır. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Hata Ayıklama için Dışa Aktarmayı Etkinleştir:\nŞu anda çalışan PS4 uygulaması için içe aktarılan ve dışa aktarılan sembolleri ve dosya başlık bilgilerini bir dizine kaydedin. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Vulkan Doğrulama Katmanlarını Etkinleştir:\nVulkan renderlayıcısının durumunu doğrulayan ve iç durum hakkında bilgi kaydeden bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Vulkan Senkronizasyon Doğrulamasını Etkinleştir:\nVulkan renderlama görevlerinin senkronizasyonunu doğrulayan bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - Borderless - + rdocCheckBox + RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Gözat + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Oyunların yükleneceği klasör + Browse + Gözat - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Oyunların yükleneceği klasör - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Kupa Görüntüleyici + Trophy Viewer + Kupa Görüntüleyici - + diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index e1b2e2fa3..50d1e0f10 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - Про shadPS4 + About shadPS4 + Про shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 - це експериментальний емулятор з відкритим вихідним кодом для PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 - це експериментальний емулятор з відкритим вихідним кодом для PlayStation 4. - This software should not be used to play games you have not legally obtained. - Це програмне забезпечення не повинно використовуватися для запуску ігор, котрі ви отримали не легально. + This software should not be used to play games you have not legally obtained. + Це програмне забезпечення не повинно використовуватися для запуску ігор, котрі ви отримали не легально. - - + + CheatsPatches - Cheats / Patches for - Чити та Патчі для + Cheats / Patches for + Чити та Патчі для - defaultTextEdit_MSG - Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Зображення відсутнє + No Image Available + Зображення відсутнє - Serial: - Серійний номер: + Serial: + Серійний номер: - Version: - Версія: + Version: + Версія: - Size: - Розмір: + Size: + Розмір: - Select Cheat File: - Виберіть файл читу: + Select Cheat File: + Виберіть файл читу: - Repository: - Репозиторій: + Repository: + Репозиторій: - Download Cheats - Завантажити чити + Download Cheats + Завантажити чити - Delete File - Видалити файл + Delete File + Видалити файл - No files selected. - Файли не вибрані. + No files selected. + Файли не вибрані. - You can delete the cheats you don't want after downloading them. - Ви можете видалити непотрібні чити після їх завантаження. + You can delete the cheats you don't want after downloading them. + Ви можете видалити непотрібні чити після їх завантаження. - Do you want to delete the selected file?\n%1 - Ви хочете видалити вибраний файл?\n%1 + Do you want to delete the selected file?\n%1 + Ви хочете видалити вибраний файл?\n%1 - Select Patch File: - Виберіть файл патчу: + Select Patch File: + Виберіть файл патчу: - Download Patches - Завантажити патчі + Download Patches + Завантажити патчі - Save - Зберегти + Save + Зберегти - Cheats - Чити + Cheats + Чити - Patches - Патчі + Patches + Патчі - Error - Помилка + Error + Помилка - No patch selected. - Патч не вибрано. + No patch selected. + Патч не вибрано. - Unable to open files.json for reading. - Не вдалось відкрити files.json для читання. + Unable to open files.json for reading. + Не вдалось відкрити files.json для читання. - No patch file found for the current serial. - Файл патча для поточного серійного номера не знайдено. + No patch file found for the current serial. + Файл патча для поточного серійного номера не знайдено. - Unable to open the file for reading. - Не вдалося відкрити файл для читання. + Unable to open the file for reading. + Не вдалося відкрити файл для читання. - Unable to open the file for writing. - Не вдалось відкрити файл для запису. + Unable to open the file for writing. + Не вдалось відкрити файл для запису. - Failed to parse XML: - Не вдалося розібрати XML: + Failed to parse XML: + Не вдалося розібрати XML: - Success - Успіх + Success + Успіх - Options saved successfully. - Параметри успішно збережено. + Options saved successfully. + Параметри успішно збережено. - Invalid Source - Неправильне джерело + Invalid Source + Неправильне джерело - The selected source is invalid. - Вибране джерело є недійсним. + The selected source is invalid. + Вибране джерело є недійсним. - File Exists - Файл існує + File Exists + Файл існує - File already exists. Do you want to replace it? - Файл вже існує. Ви хочете замінити його? + File already exists. Do you want to replace it? + Файл вже існує. Ви хочете замінити його? - Failed to save file: - Не вдалося зберегти файл: + Failed to save file: + Не вдалося зберегти файл: - Failed to download file: - Не вдалося завантажити файл: + Failed to download file: + Не вдалося завантажити файл: - Cheats Not Found - Читів не знайдено + Cheats Not Found + Читів не знайдено - CheatsNotFound_MSG - У вибраному репозиторії не знайдено Читів для цієї гри, спробуйте інший репозиторій або іншу версію гри. + CheatsNotFound_MSG + У вибраному репозиторії не знайдено Читів для цієї гри, спробуйте інший репозиторій або іншу версію гри. - Cheats Downloaded Successfully - Чити успішно завантажено + Cheats Downloaded Successfully + Чити успішно завантажено - CheatsDownloadedSuccessfully_MSG - Ви успішно завантажили чити для цієї версії гри з обраного репозиторія. Ви можете спробувати завантажити з іншого репозиторія, якщо він буде доступним, ви також зможете скористатися ним, вибравши файл зі списку. + CheatsDownloadedSuccessfully_MSG + Ви успішно завантажили чити для цієї версії гри з обраного репозиторія. Ви можете спробувати завантажити з іншого репозиторія, якщо він буде доступним, ви також зможете скористатися ним, вибравши файл зі списку. - Failed to save: - Не вдалося зберегти: + Failed to save: + Не вдалося зберегти: - Failed to download: - Не вдалося завантажити: + Failed to download: + Не вдалося завантажити: - Download Complete - Заватнаження завершено + Download Complete + Заватнаження завершено - DownloadComplete_MSG - Патчі успішно завантажено! Всі доступні патчі для усіх ігор, завантажено, немає необхідності завантажувати їх окремо для кожної гри, як це відбувається у випадку з читами. Якщо патч не з’являється, можливо, його не існує для конкретного серійного номера та версії гри. Можливо, необхідно оновити гру. + DownloadComplete_MSG + Патчі успішно завантажено! Всі доступні патчі для усіх ігор, завантажено, немає необхідності завантажувати їх окремо для кожної гри, як це відбувається у випадку з читами. Якщо патч не з’являється, можливо, його не існує для конкретного серійного номера та версії гри. Можливо, необхідно оновити гру. - Failed to parse JSON data from HTML. - Не вдалося розібрати JSON-дані з HTML. + Failed to parse JSON data from HTML. + Не вдалося розібрати JSON-дані з HTML. - Failed to retrieve HTML page. - Не вдалося отримати HTML-сторінку. + Failed to retrieve HTML page. + Не вдалося отримати HTML-сторінку. - The game is in version: %1 - Версія гри: %1 + The game is in version: %1 + Версія гри: %1 - The downloaded patch only works on version: %1 - Завантажений патч працює лише на версії: %1 + The downloaded patch only works on version: %1 + Завантажений патч працює лише на версії: %1 - You may need to update your game. - Можливо, вам потрібно оновити гру. + You may need to update your game. + Можливо, вам потрібно оновити гру. - Incompatibility Notice - Повідомлення про несумісність + Incompatibility Notice + Повідомлення про несумісність - Failed to open file: - Не вдалося відкрити файл: + Failed to open file: + Не вдалося відкрити файл: - XML ERROR: - ПОМИЛКА XML: + XML ERROR: + ПОМИЛКА XML: - Failed to open files.json for writing - Не вдалося відкрити files.json для запису + Failed to open files.json for writing + Не вдалося відкрити files.json для запису - Author: - Автор: + Author: + Автор: - Directory does not exist: - Каталогу не існує: + Directory does not exist: + Каталогу не існує: - Failed to open files.json for reading. - Не вдалося відкрити files.json для читання. + Failed to open files.json for reading. + Не вдалося відкрити files.json для читання. - Name: - Назва: + Name: + Назва: - Can't apply cheats before the game is started - Неможливо застосовувати чити до початку гри. + Can't apply cheats before the game is started + Неможливо застосовувати чити до початку гри. - Close - Закрити + Close + Закрити - - + + CheckUpdate - Auto Updater - Автооновлення + Auto Updater + Автооновлення - Error - Помилка + Error + Помилка - Network error: - Мережева помилка: + Network error: + Мережева помилка: - Error_Github_limit_MSG - Автооновлення дозволяє до 60 перевірок оновлень на годину.\nВи досягли цього ліміту. Будь ласка, спробуйте пізніше. + Error_Github_limit_MSG + Автооновлення дозволяє до 60 перевірок оновлень на годину.\nВи досягли цього ліміту. Будь ласка, спробуйте пізніше. - Failed to parse update information. - Не вдалося розібрати інформацію про оновлення. + Failed to parse update information. + Не вдалося розібрати інформацію про оновлення. - No pre-releases found. - Попередніх версій не знайдено. + No pre-releases found. + Попередніх версій не знайдено. - Invalid release data. - Некоректні дані про випуск. + Invalid release data. + Некоректні дані про випуск. - No download URL found for the specified asset. - Не знайдено URL для завантаження зазначеного ресурсу. + No download URL found for the specified asset. + Не знайдено URL для завантаження зазначеного ресурсу. - Your version is already up to date! - У вас актуальна версія! + Your version is already up to date! + У вас актуальна версія! - Update Available - Доступне оновлення + Update Available + Доступне оновлення - Update Channel - Канал оновлення + Update Channel + Канал оновлення - Current Version - Поточна версія + Current Version + Поточна версія - Latest Version - Остання версія + Latest Version + Остання версія - Do you want to update? - Ви хочете оновитися? + Do you want to update? + Ви хочете оновитися? - Show Changelog - Показати журнал змін + Show Changelog + Показати журнал змін - Check for Updates at Startup - Перевірка оновлень під час запуску + Check for Updates at Startup + Перевірка оновлень під час запуску - Update - Оновитись + Update + Оновитись - No - Ні + No + Ні - Hide Changelog - Приховати журнал змін + Hide Changelog + Приховати журнал змін - Changes - Журнал змін + Changes + Журнал змін - Network error occurred while trying to access the URL - Сталася мережева помилка під час спроби доступу до URL + Network error occurred while trying to access the URL + Сталася мережева помилка під час спроби доступу до URL - Download Complete - Завантаження завершено + Download Complete + Завантаження завершено - The update has been downloaded, press OK to install. - Оновлення завантажено, натисніть OK для встановлення. + The update has been downloaded, press OK to install. + Оновлення завантажено, натисніть OK для встановлення. - Failed to save the update file at - Не вдалося зберегти файл оновлення в + Failed to save the update file at + Не вдалося зберегти файл оновлення в - Starting Update... - Початок оновлення... + Starting Update... + Початок оновлення... - Failed to create the update script file - Не вдалося створити файл скрипта оновлення + Failed to create the update script file + Не вдалося створити файл скрипта оновлення - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Отримання даних про сумісність. Будь ласка, зачекайте + Fetching compatibility data, please wait + Отримання даних про сумісність. Будь ласка, зачекайте - Cancel - Відмінити + Cancel + Відмінити - Loading... - Завантаження... + Loading... + Завантаження... - Error - Помилка + Error + Помилка - Unable to update compatibility data! Try again later. - Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. + Unable to update compatibility data! Try again later. + Не вдалося оновити дані про сумісність! Спробуйте ще раз пізніше. - Unable to open compatibility_data.json for writing. - Не вдалося відкрити файл compatibility_data.json для запису. + Unable to open compatibility_data.json for writing. + Не вдалося відкрити файл compatibility_data.json для запису. - Unknown - Невідомо + Unknown + Невідомо - Nothing - Не працює + Nothing + Не працює - Boots - Запускається + Boots + Запускається - Menus - У меню + Menus + У меню - Ingame - У грі + Ingame + У грі - Playable - Іграбельно + Playable + Іграбельно - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Відкрити папку + Open Folder + Відкрити папку - - + + GameInfoClass - Loading game list, please wait :3 - Завантажуємо список ігор, будь ласка, зачекайте :3 + Loading game list, please wait :3 + Завантажуємо список ігор, будь ласка, зачекайте :3 - Cancel - Відмінити + Cancel + Відмінити - Loading... - Завантаження... + Loading... + Завантаження... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Виберіть папку + shadPS4 - Choose directory + shadPS4 - Виберіть папку - Directory to install games - Папка для встановлення ігор + Directory to install games + Папка для встановлення ігор - Browse - Обрати + Browse + Обрати - Error - Помилка + Error + Помилка - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Значок + Icon + Значок - Name - Назва + Name + Назва - Serial - Серійний номер + Serial + Серійний номер - Compatibility - Сумісність + Compatibility + Сумісність - Region - Регіон + Region + Регіон - Firmware - Прошивка + Firmware + Прошивка - Size - Розмір + Size + Розмір - Version - Версія + Version + Версія - Path - Шлях + Path + Шлях - Play Time - Час у грі + Play Time + Час у грі - Never Played - Ніколи не запускалась + Never Played + Ніколи не запускалась - h - год + h + год - m - хв + m + хв - s - сек + s + сек - Compatibility is untested - Сумісність не перевірена + Compatibility is untested + Сумісність не перевірена - Game does not initialize properly / crashes the emulator - Гра не ініціалізується належним чином або спричиняє збій емулятора. + Game does not initialize properly / crashes the emulator + Гра не ініціалізується належним чином або спричиняє збій емулятора. - Game boots, but only displays a blank screen - Гра запускається, але відображає лише чорний екран. + Game boots, but only displays a blank screen + Гра запускається, але відображає лише чорний екран. - Game displays an image but does not go past the menu - Гра відображає зображення, але не проходить далі меню. + Game displays an image but does not go past the menu + Гра відображає зображення, але не проходить далі меню. - Game has game-breaking glitches or unplayable performance - У грі є критичні баги або погана продуктивність + Game has game-breaking glitches or unplayable performance + У грі є критичні баги або погана продуктивність - Game can be completed with playable performance and no major glitches - Гру можна пройти з хорошою продуктивністю та без серйозних глюків. + Game can be completed with playable performance and no major glitches + Гру можна пройти з хорошою продуктивністю та без серйозних глюків. - Click to see details on github - Натисніть, щоб переглянути деталі на GitHub + Click to see details on github + Натисніть, щоб переглянути деталі на GitHub - Last updated - Останнє оновлення + Last updated + Останнє оновлення - - + + GameListUtils - B - Б + B + Б - KB - КБ + KB + КБ - MB - + MB + - GB - ГБ + GB + ГБ - TB - ТБ + TB + ТБ - - + + GuiContextMenus - Create Shortcut - Створити Ярлик + Create Shortcut + Створити Ярлик - Cheats / Patches - Чити та Патчі + Cheats / Patches + Чити та Патчі - SFO Viewer - Перегляд SFO + SFO Viewer + Перегляд SFO - Trophy Viewer - Перегляд трофеїв + Trophy Viewer + Перегляд трофеїв - Open Folder... - Відкрити Папку... + Open Folder... + Відкрити Папку... - Open Game Folder - Відкрити папку гри + Open Game Folder + Відкрити папку гри - Open Update Folder - Відкрити папку оновлень + Open Save Data Folder + Відкрити папку збережень гри - Open Save Data Folder - Відкрити папку збережень гри + Open Log Folder + Відкрити папку логів - Open Log Folder - Відкрити папку логів + Copy info... + Копіювати інформацію... - Copy info... - Копіювати інформацію... + Copy Name + Копіювати назву гри - Copy Name - Копіювати назву гри + Copy Serial + Копіювати серійний номер - Copy Serial - Копіювати серійний номер + Copy Version + Копіювати версію - Copy Version - Копіювати версію + Copy Size + Копіювати розмір - Copy Size - Копіювати розмір + Copy All + Копіювати все - Copy All - Копіювати все + Delete... + Видалити... - Delete... - Видалити... + Delete Game + Видалити гру - Delete Game - Видалити гру + Delete Update + Видалити оновлення - Delete Update - Видалити оновлення + Delete DLC + Видалити DLC - Delete Save Data - Видалити збереження + Compatibility... + Сумісність... - Delete DLC - Видалити DLC + Update database + Оновити базу даних - Compatibility... - Сумісність... + View report + Переглянути звіт - Update database - Оновити базу даних + Submit a report + Створити звіт - View report - Переглянути звіт + Shortcut creation + Створення ярлика - Submit a report - Створити звіт + Shortcut created successfully! + Ярлик створений успішно! - Shortcut creation - Створення ярлика + Error + Помилка - Shortcut created successfully! - Ярлик створений успішно! + Error creating shortcut! + Помилка при створенні ярлика! - Error - Помилка + Install PKG + Встановити PKG - Error creating shortcut! - Помилка при створенні ярлика! + Game + гри - Install PKG - Встановити PKG + This game has no update to delete! + Ця гра не має оновлень для видалення! - Game - гри + Update + Оновлення - This game has no update to delete! - Ця гра не має оновлень для видалення! + This game has no DLC to delete! + Ця гра не має DLC для видалення! - This game has no update folder to open! - Ця гра не має папки оновленнь, щоб відкрити її! + DLC + DLC - Update - Оновлення + Delete %1 + Видалення %1 - This game has no save data to delete! - Ця гра не містить збережень, які можна видалити! + Are you sure you want to delete %1's %2 directory? + Ви впевнені, що хочете видалити %1 з папки %2? - Save Data - Збереження + Open Update Folder + Відкрити папку оновлень - This game has no DLC to delete! - Ця гра не має DLC для видалення! + Delete Save Data + Видалити збереження - DLC - DLC + This game has no update folder to open! + Ця гра не має папки оновленнь, щоб відкрити її! - Delete %1 - Видалення %1 + Failed to convert icon. + Failed to convert icon. - Are you sure you want to delete %1's %2 directory? - Ви впевнені, що хочете видалити %1 з папки %2? + This game has no save data to delete! + Ця гра не містить збережень, які можна видалити! - Failed to convert icon. - + Save Data + Збереження - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Виберіть папку + shadPS4 - Choose directory + shadPS4 - Виберіть папку - Select which directory you want to install to. - Виберіть папку, до якої ви хочете встановити. + Select which directory you want to install to. + Виберіть папку, до якої ви хочете встановити. - Install All Queued to Selected Folder - Встановити все з черги до вибраної папки + Install All Queued to Selected Folder + Встановити все з черги до вибраної папки - Delete PKG File on Install - Видалити файл PKG під час встановлення + Delete PKG File on Install + Видалити файл PKG під час встановлення - - + + MainWindow - Open/Add Elf Folder - Відкрити/Додати папку Elf + Open/Add Elf Folder + Відкрити/Додати папку Elf - Install Packages (PKG) - Встановити пакети (PKG) + Install Packages (PKG) + Встановити пакети (PKG) - Boot Game - Запустити гру + Boot Game + Запустити гру - Check for Updates - Перевірити наявність оновлень + Check for Updates + Перевірити наявність оновлень - About shadPS4 - Про shadPS4 + About shadPS4 + Про shadPS4 - Configure... - Налаштувати... + Configure... + Налаштувати... - Install application from a .pkg file - Встановити додаток з файлу .pkg + Install application from a .pkg file + Встановити додаток з файлу .pkg - Recent Games - Нещодавні ігри + Recent Games + Нещодавні ігри - Open shadPS4 Folder - Відкрити папку shadPS4 + Open shadPS4 Folder + Відкрити папку shadPS4 - Exit - Вихід + Exit + Вихід - Exit shadPS4 - Вийти з shadPS4 + Exit shadPS4 + Вийти з shadPS4 - Exit the application. - Вийти з додатку. + Exit the application. + Вийти з додатку. - Show Game List - Показати список ігор + Show Game List + Показати список ігор - Game List Refresh - Оновити список ігор + Game List Refresh + Оновити список ігор - Tiny - Крихітний + Tiny + Крихітний - Small - Маленький + Small + Маленький - Medium - Середній + Medium + Середній - Large - Великий + Large + Великий - List View - Список + List View + Список - Grid View - Сітка + Grid View + Сітка - Elf Viewer - Виконуваний файл + Elf Viewer + Виконуваний файл - Game Install Directory - Каталоги встановлення ігор та оновлень + Game Install Directory + Каталоги встановлення ігор та оновлень - Download Cheats/Patches - Завантажити Чити/Патчі + Download Cheats/Patches + Завантажити Чити/Патчі - Dump Game List - Дамп списку ігор + Dump Game List + Дамп списку ігор - PKG Viewer - Перегляд PKG + PKG Viewer + Перегляд PKG - Search... - Пошук... + Search... + Пошук... - File - Файл + File + Файл - View - Вид + View + Вид - Game List Icons - Розмір значків списку ігор + Game List Icons + Розмір значків списку ігор - Game List Mode - Вид списку ігор + Game List Mode + Вид списку ігор - Settings - Налаштування + Settings + Налаштування - Utils - Утиліти + Utils + Утиліти - Themes - Теми + Themes + Теми - Help - Допомога + Help + Допомога - Dark - Темна + Dark + Темна - Light - Світла + Light + Світла - Green - Зелена + Green + Зелена - Blue - Синя + Blue + Синя - Violet - Фіолетова + Violet + Фіолетова - toolBar - Панель інструментів + toolBar + Панель інструментів - Game List - Список ігор + Game List + Список ігор - * Unsupported Vulkan Version - * Непідтримувана версія Vulkan + * Unsupported Vulkan Version + * Непідтримувана версія Vulkan - Download Cheats For All Installed Games - Завантажити чити для усіх встановлених ігор + Download Cheats For All Installed Games + Завантажити чити для усіх встановлених ігор - Download Patches For All Games - Завантажити патчі для всіх ігор + Download Patches For All Games + Завантажити патчі для всіх ігор - Download Complete - Завантаження завершено + Download Complete + Завантаження завершено - You have downloaded cheats for all the games you have installed. - Ви завантажили чити для усіх встановлених ігор. + You have downloaded cheats for all the games you have installed. + Ви завантажили чити для усіх встановлених ігор. - Patches Downloaded Successfully! - Патчі успішно завантажено! + Patches Downloaded Successfully! + Патчі успішно завантажено! - All Patches available for all games have been downloaded. - Завантажено всі доступні патчі для всіх ігор. + All Patches available for all games have been downloaded. + Завантажено всі доступні патчі для всіх ігор. - Games: - Ігри: + Games: + Ігри: - ELF files (*.bin *.elf *.oelf) - Файли ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Файли ELF (*.bin *.elf *.oelf) - Game Boot - Запуск гри + Game Boot + Запуск гри - Only one file can be selected! - Можна вибрати лише один файл! + Only one file can be selected! + Можна вибрати лише один файл! - PKG Extraction - Розпакування PKG + PKG Extraction + Розпакування PKG - Patch detected! - Виявлено патч! + Patch detected! + Виявлено патч! - PKG and Game versions match: - Версії PKG та гри збігаються: + PKG and Game versions match: + Версії PKG та гри збігаються: - Would you like to overwrite? - Бажаєте перезаписати? + Would you like to overwrite? + Бажаєте перезаписати? - PKG Version %1 is older than installed version: - Версія PKG %1 старіша за встановлену версію: + PKG Version %1 is older than installed version: + Версія PKG %1 старіша за встановлену версію: - Game is installed: - Встановлена гра: + Game is installed: + Встановлена гра: - Would you like to install Patch: - Бажаєте встановити патч: + Would you like to install Patch: + Бажаєте встановити патч: - DLC Installation - Встановлення DLC + DLC Installation + Встановлення DLC - Would you like to install DLC: %1? - Ви бажаєте встановити DLC: %1? + Would you like to install DLC: %1? + Ви бажаєте встановити DLC: %1? - DLC already installed: - DLC вже встановлено: + DLC already installed: + DLC вже встановлено: - Game already installed - Гра вже встановлена + Game already installed + Гра вже встановлена - PKG ERROR - ПОМИЛКА PKG + PKG ERROR + ПОМИЛКА PKG - Extracting PKG %1/%2 - Витягування PKG %1/%2 + Extracting PKG %1/%2 + Витягування PKG %1/%2 - Extraction Finished - Розпакування завершено + Extraction Finished + Розпакування завершено - Game successfully installed at %1 - Гру успішно встановлено у %1 + Game successfully installed at %1 + Гру успішно встановлено у %1 - File doesn't appear to be a valid PKG file - Файл не є дійсним PKG-файлом + File doesn't appear to be a valid PKG file + Файл не є дійсним PKG-файлом - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Відкрити папку + Open Folder + Відкрити папку - Name - Назва + PKG ERROR + ПОМИЛКА PKG - Serial - Серійний номер + Name + Назва - Installed - + Serial + Серійний номер - Size - Розмір + Installed + Installed - Category - + Size + Розмір - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Регіон + FW + FW - Flags - + Region + Регіон - Path - Шлях + Flags + Flags - File - Файл + Path + Шлях - PKG ERROR - ПОМИЛКА PKG + File + Файл - Unknown - Невідомо + Unknown + Невідомо - Package - + Package + Package - - + + SettingsDialog - Settings - Налаштування + Settings + Налаштування - General - Загальні + General + Загальні - System - Система + System + Система - Console Language - Мова консолі + Console Language + Мова консолі - Emulator Language - Мова емулятора + Emulator Language + Мова емулятора - Emulator - Емулятор + Emulator + Емулятор - Enable Fullscreen - Увімкнути повноекранний режим + Enable Fullscreen + Увімкнути повноекранний режим - Fullscreen Mode - Тип повноекранного режиму + Fullscreen Mode + Тип повноекранного режиму - Borderless - Без рамок + Enable Separate Update Folder + Увімкнути окрему папку оновлень - True - Повний екран + Default tab when opening settings + Вкладка за замовчуванням при відкритті налаштувань - Enable Separate Update Folder - Увімкнути окрему папку оновлень + Show Game Size In List + Показати розмір гри у списку - Default tab when opening settings - Вкладка за замовчуванням при відкритті налаштувань + Show Splash + Показувати заставку - Show Game Size In List - Показати розмір гри у списку + Enable Discord Rich Presence + Увімкнути Discord Rich Presence - Show Splash - Показувати заставку + Username + Ім'я користувача - Enable Discord Rich Presence - Увімкнути Discord Rich Presence + Trophy Key + Ключ трофеїв - Username - Ім'я користувача + Trophy + Трофеї - Trophy Key - Ключ трофеїв + Logger + Логування - Trophy - Трофеї + Log Type + Тип логів - Logger - Логування + Log Filter + Фільтр логів - Log Type - Тип логів + Open Log Location + Відкрити місце розташування журналу - async - Асинхронний + Input + Введення - sync - Синхронний + Cursor + Курсор миші - Log Filter - Фільтр логів + Hide Cursor + Приховати курсор - Open Log Location - Відкрити місце розташування журналу + Hide Cursor Idle Timeout + Тайм-аут приховування курсора при бездіяльності - Input - Введення + s + сек - Cursor - Курсор миші + Controller + Контролер - Hide Cursor - Приховати курсор + Back Button Behavior + Перепризначення кнопки назад - Hide Cursor Idle Timeout - Тайм-аут приховування курсора при бездіяльності + Graphics + Графіка - s - сек + GUI + Інтерфейс - Controller - Контролер + User + Користувач - Back Button Behavior - Перепризначення кнопки назад + Graphics Device + Графічний пристрій - Enable Motion Controls - Увімкнути керування рухом + Width + Ширина - Graphics - Графіка + Height + Висота - GUI - Інтерфейс + Vblank Divider + Розділювач Vblank - User - Користувач + Advanced + Розширені - Graphics Device - Графічний пристрій + Enable Shaders Dumping + Увімкнути дамп шейдерів - Width - Ширина + Enable NULL GPU + Увімкнути NULL GPU - Height - Висота + Enable HDR + Enable HDR - Vblank Divider - Розділювач Vblank + Paths + Шляхи - Advanced - Розширені + Game Folders + Ігрові папки - Enable Shaders Dumping - Увімкнути дамп шейдерів + Add... + Додати... - Auto Select - Автовибір + Remove + Вилучити - Enable NULL GPU - Увімкнути NULL GPU + Debug + Налагодження - Paths - Шляхи + Enable Debug Dumping + Увімкнути налагоджувальні дампи - Game Folders - Ігрові папки + Enable Vulkan Validation Layers + Увімкнути шари валідації Vulkan - Add... - Додати... + Enable Vulkan Synchronization Validation + Увімкнути валідацію синхронізації Vulkan - Remove - Вилучити + Enable RenderDoc Debugging + Увімкнути налагодження RenderDoc - Save Data Path - Шлях до файлів збережень + Enable Crash Diagnostics + Увімкнути діагностику збоїв - Debug - Налагодження + Collect Shaders + Збирати шейдери - Enable Debug Dumping - Увімкнути налагоджувальні дампи + Copy GPU Buffers + Копіювати буфери GPU - Enable Vulkan Validation Layers - Увімкнути шари валідації Vulkan + Host Debug Markers + Хостові маркери налагодження - Enable Vulkan Synchronization Validation - Увімкнути валідацію синхронізації Vulkan + Guest Debug Markers + Гостьові маркери налагодження - Enable RenderDoc Debugging - Увімкнути налагодження RenderDoc + Update + Оновлення - Enable Crash Diagnostics - Увімкнути діагностику збоїв + Check for Updates at Startup + Перевіряти оновлення під час запуску - Collect Shaders - Збирати шейдери + Always Show Changelog + Завжди показувати журнал змін - Copy GPU Buffers - Копіювати буфери GPU + Update Channel + Канал оновлення - Host Debug Markers - Хостові маркери налагодження + Check for Updates + Перевірити оновлення - Guest Debug Markers - Гостьові маркери налагодження + GUI Settings + Інтерфейс - Update - Оновлення + Title Music + Титульна музика - Check for Updates at Startup - Перевіряти оновлення під час запуску + Disable Trophy Pop-ups + Вимкнути спливаючі вікна трофеїв - Always Show Changelog - Завжди показувати журнал змін + Background Image + Фонове зображення - Update Channel - Канал оновлення + Show Background Image + Показувати фонове зображення - Release - Релізний + Opacity + Непрозорість - Nightly - Тестовий + Play title music + Програвати титульну музику - Check for Updates - Перевірити оновлення + Update Compatibility Database On Startup + Оновлення даних ігрової сумісності під час запуску - GUI Settings - Інтерфейс + Game Compatibility + Сумісність з іграми - Title Music - Титульна музика + Display Compatibility Data + Відображати данні ігрової сумістністі - Disable Trophy Pop-ups - Вимкнути спливаючі вікна трофеїв + Update Compatibility Database + Оновити данні ігрової сумістності - Background Image - Фонове зображення + Volume + Гучність - Show Background Image - Показувати фонове зображення + Save + Зберегти - Opacity - Непрозорість + Apply + Застосувати - Play title music - Програвати титульну музику + Restore Defaults + За замовчуванням - Update Compatibility Database On Startup - Оновлення даних ігрової сумісності під час запуску + Close + Закрити - Game Compatibility - Сумісність з іграми + Point your mouse at an option to display its description. + Наведіть курсор миші на опцію, щоб відобразити її опис. - Display Compatibility Data - Відображати данні ігрової сумістністі + consoleLanguageGroupBox + Мова консолі:\nВстановіть мову, яка буде використовуватись у іграх PS4.\nРекомендується встановити мову котра підтримується грою, оскільки вона може відрізнятися в залежності від регіону. - Update Compatibility Database - Оновити данні ігрової сумістності + emulatorLanguageGroupBox + Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора. - Volume - Гучність + fullscreenCheckBox + Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11. - Save - Зберегти + separateUpdatesCheckBox + Окрема папка для оновлень:\nДає змогу встановлювати оновлення гри в окрему папку для зручності. - Apply - Застосувати + showSplashCheckBox + Показувати заставку:\nВідображає заставку гри (спеціальне зображення) під час запуску гри. - Restore Defaults - За замовчуванням + discordRPCCheckbox + Увімкнути Discord Rich Presence:\nВідображає значок емулятора та відповідну інформацію у вашому профілі Discord. - Close - Закрити + userName + Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Воно може відображатися в деяких іграх. - Point your mouse at an option to display its description. - Наведіть курсор миші на опцію, щоб відобразити її опис. + TrophyKey + Ключ трофеїв:\nКлюч для розшифровки трофеїв. Може бути отриманий зі зламаної консолі.\nПовинен містити лише шістнадцяткові символи. - consoleLanguageGroupBox - Мова консолі:\nВстановіть мову, яка буде використовуватись у іграх PS4.\nРекомендується встановити мову котра підтримується грою, оскільки вона може відрізнятися в залежності від регіону. + logTypeGroupBox + Тип логів:\nВстановіть, чи синхронізувати виведення вікна логів заради продуктивності. Це може негативно вплинути на емуляцію. - emulatorLanguageGroupBox - Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора. + logFilter + Фільтр логів:\nФільтрує логи, щоб показувати тільки певну інформацію.\nПриклади: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Рівні: Trace, Debug, Info, Warning, Error, Critical - у цьому порядку, конкретний рівень глушить усі попередні рівні у списку і показує всі наступні рівні. - fullscreenCheckBox - Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11. + updaterGroupBox + Оновлення:\nРелізний: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nТестовий: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. - separateUpdatesCheckBox - Окрема папка для оновлень:\nДає змогу встановлювати оновлення гри в окрему папку для зручності. + GUIBackgroundImageGroupBox + Фонове зображення:\nКерує непрозорістю фонового зображення гри. - showSplashCheckBox - Показувати заставку:\nВідображає заставку гри (спеціальне зображення) під час запуску гри. + GUIMusicGroupBox + Грати титульну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. - discordRPCCheckbox - Увімкнути Discord Rich Presence:\nВідображає значок емулятора та відповідну інформацію у вашому профілі Discord. + disableTrophycheckBox + Вимкнути спливаючі вікна трофеїв:\nВимикає сповіщення про ігрові трофеї. Прогрес трофея все ще можна відстежувати за допомогою "Перегляд трофеїв" (клацніть правою кнопкою миші на грі у головному вікні). - userName - Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Воно може відображатися в деяких іграх. + hideCursorGroupBox + Приховувати курсор:\nВиберіть, коли курсор зникатиме:\nНіколи: Курсор миші завжди буде видимий.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Курсор миші завжди буде прихований. - TrophyKey - Ключ трофеїв:\nКлюч для розшифровки трофеїв. Може бути отриманий зі зламаної консолі.\nПовинен містити лише шістнадцяткові символи. + idleTimeoutGroupBox + Встановіть час, через який курсор зникне в разі бездіяльності. - logTypeGroupBox - Тип логів:\nВстановіть, чи синхронізувати виведення вікна логів заради продуктивності. Це може негативно вплинути на емуляцію. + backButtonBehaviorGroupBox + Перепризначення кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. - logFilter - Фільтр логів:\nФільтрує логи, щоб показувати тільки певну інформацію.\nПриклади: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Рівні: Trace, Debug, Info, Warning, Error, Critical - у цьому порядку, конкретний рівень глушить усі попередні рівні у списку і показує всі наступні рівні. + enableCompatibilityCheckBox + Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть "Оновлення даних ігрової сумісності під час запуску" для отримання актуальної інформації. - updaterGroupBox - Оновлення:\nРелізний: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nТестовий: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. + checkCompatibilityOnStartupCheckBox + Оновлення даних ігрової сумісності під час запуску:\nАвтоматично оновлює базу даних ігрової сумісності під час запуску shadPS4. - GUIBackgroundImageGroupBox - Фонове зображення:\nКерує непрозорістю фонового зображення гри. + updateCompatibilityButton + Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. - GUIMusicGroupBox - Грати титульну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. + Never + Ніколи - disableTrophycheckBox - Вимкнути спливаючі вікна трофеїв:\nВимикає сповіщення про ігрові трофеї. Прогрес трофея все ще можна відстежувати за допомогою "Перегляд трофеїв" (клацніть правою кнопкою миші на грі у головному вікні). + Idle + При бездіяльності - hideCursorGroupBox - Приховувати курсор:\nВиберіть, коли курсор зникатиме:\nНіколи: Курсор миші завжди буде видимий.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Курсор миші завжди буде прихований. + Always + Завжди - idleTimeoutGroupBox - Встановіть час, через який курсор зникне в разі бездіяльності. + Touchpad Left + Ліва сторона тачпаду - backButtonBehaviorGroupBox - Перепризначення кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. + Touchpad Right + Права сторона тачпаду - enableCompatibilityCheckBox - Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть "Оновлення даних ігрової сумісності під час запуску" для отримання актуальної інформації. + Touchpad Center + Середина тачпаду - checkCompatibilityOnStartupCheckBox - Оновлення даних ігрової сумісності під час запуску:\nАвтоматично оновлює базу даних ігрової сумісності під час запуску shadPS4. + None + Без змін - updateCompatibilityButton - Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. + graphicsAdapterGroupBox + Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Автовибір", щоб визначити його автоматично. - Never - Ніколи + resolutionLayout + Ширина/Висота:\nВстановіть розмір вікна емулятора під час запуску, який може бути змінений під час гри.\nЦе відрізняється від роздільної здатності в грі. - Idle - При бездіяльності + heightDivider + Розділювач Vblank:\nЧастота кадрів, з якою оновлюється емулятор, множиться на це число. Зміна цього параметра може мати негативні наслідки, такі як збільшення швидкості гри або порушення критичних функцій гри, які цього не очікують! - Always - Завжди + dumpShadersCheckBox + Увімкнути дамп шейдерів:\nДля технічного налагодження зберігає шейдери ігор у папку під час рендерингу. - Touchpad Left - Ліва сторона тачпаду + nullGpuCheckBox + Увімкнути NULL GPU:\nДля технічного налагодження відключає рендеринг гри так, ніби графічної карти немає. - Touchpad Right - Права сторона тачпаду + enableHDRCheckBox + enableHDRCheckBox - Touchpad Center - Середина тачпаду + gameFoldersBox + Ігрові папки:\nСписок папок, що скануватимуться для виявлення ігор. - None - Без змін + addFolderButton + Додати:\nДодати папку в список. - graphicsAdapterGroupBox - Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Автовибір", щоб визначити його автоматично. + removeFolderButton + Вилучити:\nВилучити папку зі списку. - resolutionLayout - Ширина/Висота:\nВстановіть розмір вікна емулятора під час запуску, який може бути змінений під час гри.\nЦе відрізняється від роздільної здатності в грі. + debugDump + Увімкнути налагоджувальні дампи:\nЗберігає символи імпорту, експорту та інформацію про заголовок файлу поточної виконуваної програми PS4 у папку. - heightDivider - Розділювач Vblank:\nЧастота кадрів, з якою оновлюється емулятор, множиться на це число. Зміна цього параметра може мати негативні наслідки, такі як збільшення швидкості гри або порушення критичних функцій гри, які цього не очікують! + vkValidationCheckBox + Увімкнути шари валідації Vulkan:\nВключає систему, яка перевіряє стан рендерера Vulkan і логує інформацію про його внутрішній стан. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - dumpShadersCheckBox - Увімкнути дамп шейдерів:\nДля технічного налагодження зберігає шейдери ігор у папку під час рендерингу. + vkSyncValidationCheckBox + Увімкнути валідацію синхронізації Vulkan:\nВключає систему, яка перевіряє таймінг завдань рендерингу Vulkan. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - nullGpuCheckBox - Увімкнути NULL GPU:\nДля технічного налагодження відключає рендеринг гри так, ніби графічної карти немає. + rdocCheckBox + Увімкнути налагодження RenderDoc:\nЯкщо увімкнено, емулятор забезпечить сумісність із Renderdoc, даючи змогу захоплювати й аналізувати поточні кадри під час рендерингу. - gameFoldersBox - Ігрові папки:\nСписок папок, що скануватимуться для виявлення ігор. + collectShaderCheckBox + Збирати шейдери:\nВам потрібно увімкнути цю опцію, щоб редагувати шейдери за допомогою меню налагодження (Ctrl + F10). - addFolderButton - Додати:\nДодати папку в список. + crashDiagnosticsCheckBox + Діагностика збоїв:\nСтворює .yaml файл з інформацією про стан Vulkan на момент збою.\nКорисно для налагодження помилок 'Device lost'. Якщо у вас увімкнено цей параметр, вам слід увімкнути маркери налагодження Хоста ТА Гостя.\nНе працює на графічних процесорах Intel.\nДля цього вам потрібно увімкнути шари валідації Vulkan і мати Vulkan SDK. - removeFolderButton - Вилучити:\nВилучити папку зі списку. + copyGPUBuffersCheckBox + Копіювати буфери GPU:\nДозволяє обійти проблеми синхронізації, пов'язані з відправленням даних на GPU\nМоже як допомогти, так і не вплинути на збої типу PM4 (тип 0). - debugDump - Увімкнути налагоджувальні дампи:\nЗберігає символи імпорту, експорту та інформацію про заголовок файлу поточної виконуваної програми PS4 у папку. + hostMarkersCheckBox + Хостові маркери налагодження:\nДодає інформацію емулятора, наприклад маркери для конкретних команд AMDGPU у Vulkan, також присвоює ресурсам налагоджувані назви.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. - vkValidationCheckBox - Увімкнути шари валідації Vulkan:\nВключає систему, яка перевіряє стан рендерера Vulkan і логує інформацію про його внутрішній стан. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. + guestMarkersCheckBox + Гостьові маркери налагодження:\nВставляє налагоджувані маркери, які сама гра додала до командного буфера.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. - vkSyncValidationCheckBox - Увімкнути валідацію синхронізації Vulkan:\nВключає систему, яка перевіряє таймінг завдань рендерингу Vulkan. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. + saveDataBox + Шлях до файлів збережень:\nПапка, де будуть зберігатися ігрові збереження. - rdocCheckBox - Увімкнути налагодження RenderDoc:\nЯкщо увімкнено, емулятор забезпечить сумісність із Renderdoc, даючи змогу захоплювати й аналізувати поточні кадри під час рендерингу. + browseButton + Вибрати:\nВиберіть папку для ігрових збережень. - collectShaderCheckBox - Збирати шейдери:\nВам потрібно увімкнути цю опцію, щоб редагувати шейдери за допомогою меню налагодження (Ctrl + F10). + Borderless + Без рамок - crashDiagnosticsCheckBox - Діагностика збоїв:\nСтворює .yaml файл з інформацією про стан Vulkan на момент збою.\nКорисно для налагодження помилок 'Device lost'. Якщо у вас увімкнено цей параметр, вам слід увімкнути маркери налагодження Хоста ТА Гостя.\nНе працює на графічних процесорах Intel.\nДля цього вам потрібно увімкнути шари валідації Vulkan і мати Vulkan SDK. + True + Повний екран - copyGPUBuffersCheckBox - Копіювати буфери GPU:\nДозволяє обійти проблеми синхронізації, пов'язані з відправленням даних на GPU\nМоже як допомогти, так і не вплинути на збої типу PM4 (тип 0). + Release + Релізний - hostMarkersCheckBox - Хостові маркери налагодження:\nДодає інформацію емулятора, наприклад маркери для конкретних команд AMDGPU у Vulkan, також присвоює ресурсам налагоджувані назви.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. + Nightly + Тестовий - guestMarkersCheckBox - Гостьові маркери налагодження:\nВставляє налагоджувані маркери, які сама гра додала до командного буфера.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. + Set the volume of the background music. + Set the volume of the background music. - saveDataBox - Шлях до файлів збережень:\nПапка, де будуть зберігатися ігрові збереження. + Enable Motion Controls + Увімкнути керування рухом - browseButton - Вибрати:\nВиберіть папку для ігрових збережень. + Save Data Path + Шлях до файлів збережень - Enable HDR - + Browse + Обрати - Set the volume of the background music. - + async + Асинхронний - Browse - Обрати + sync + Синхронний - Directory to install games - Папка для встановлення ігор + Auto Select + Автовибір - Directory to save data - + Directory to install games + Папка для встановлення ігор - enableHDRCheckBox - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Трофеї + Trophy Viewer + Трофеї - + diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index dddc7bfe0..b4f800711 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - Không có hình ảnh + No Image Available + Không có hình ảnh - Serial: - Số seri: + Serial: + Số seri: - Version: - Phiên bản: + Version: + Phiên bản: - Size: - Kích thước: + Size: + Kích thước: - Select Cheat File: - Chọn tệp Cheat: + Select Cheat File: + Chọn tệp Cheat: - Repository: - Kho lưu trữ: + Repository: + Kho lưu trữ: - Download Cheats - Tải xuống Cheat + Download Cheats + Tải xuống Cheat - Delete File - Xóa tệp + Delete File + Xóa tệp - No files selected. - Không có tệp nào được chọn. + No files selected. + Không có tệp nào được chọn. - You can delete the cheats you don't want after downloading them. - Bạn có thể xóa các cheat không muốn sau khi tải xuống. + You can delete the cheats you don't want after downloading them. + Bạn có thể xóa các cheat không muốn sau khi tải xuống. - Do you want to delete the selected file?\n%1 - Bạn có muốn xóa tệp đã chọn?\n%1 + Do you want to delete the selected file?\n%1 + Bạn có muốn xóa tệp đã chọn?\n%1 - Select Patch File: - Chọn tệp Bản vá: + Select Patch File: + Chọn tệp Bản vá: - Download Patches - Tải xuống Bản vá + Download Patches + Tải xuống Bản vá - Save - Lưu + Save + Lưu - Cheats - Cheat + Cheats + Cheat - Patches - Bản vá + Patches + Bản vá - Error - Lỗi + Error + Lỗi - No patch selected. - Không có bản vá nào được chọn. + No patch selected. + Không có bản vá nào được chọn. - Unable to open files.json for reading. - Không thể mở files.json để đọc. + Unable to open files.json for reading. + Không thể mở files.json để đọc. - No patch file found for the current serial. - Không tìm thấy tệp bản vá cho số seri hiện tại. + No patch file found for the current serial. + Không tìm thấy tệp bản vá cho số seri hiện tại. - Unable to open the file for reading. - Không thể mở tệp để đọc. + Unable to open the file for reading. + Không thể mở tệp để đọc. - Unable to open the file for writing. - Không thể mở tệp để ghi. + Unable to open the file for writing. + Không thể mở tệp để ghi. - Failed to parse XML: - Không thể phân tích XML: + Failed to parse XML: + Không thể phân tích XML: - Success - Thành công + Success + Thành công - Options saved successfully. - Các tùy chọn đã được lưu thành công. + Options saved successfully. + Các tùy chọn đã được lưu thành công. - Invalid Source - Nguồn không hợp lệ + Invalid Source + Nguồn không hợp lệ - The selected source is invalid. - Nguồn đã chọn không hợp lệ. + The selected source is invalid. + Nguồn đã chọn không hợp lệ. - File Exists - Tệp đã tồn tại + File Exists + Tệp đã tồn tại - File already exists. Do you want to replace it? - Tệp đã tồn tại. Bạn có muốn thay thế nó không? + File already exists. Do you want to replace it? + Tệp đã tồn tại. Bạn có muốn thay thế nó không? - Failed to save file: - Không thể lưu tệp: + Failed to save file: + Không thể lưu tệp: - Failed to download file: - Không thể tải xuống tệp: + Failed to download file: + Không thể tải xuống tệp: - Cheats Not Found - Không tìm thấy Cheat + Cheats Not Found + Không tìm thấy Cheat - CheatsNotFound_MSG - Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. + CheatsNotFound_MSG + Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. - Cheats Downloaded Successfully - Cheat đã tải xuống thành công + Cheats Downloaded Successfully + Cheat đã tải xuống thành công - CheatsDownloadedSuccessfully_MSG - Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. + CheatsDownloadedSuccessfully_MSG + Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. - Failed to save: - Không thể lưu: + Failed to save: + Không thể lưu: - Failed to download: - Không thể tải xuống: + Failed to download: + Không thể tải xuống: - Download Complete - Tải xuống hoàn tất + Download Complete + Tải xuống hoàn tất - DownloadComplete_MSG - Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. + DownloadComplete_MSG + Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. - Failed to parse JSON data from HTML. - Không thể phân tích dữ liệu JSON từ HTML. + Failed to parse JSON data from HTML. + Không thể phân tích dữ liệu JSON từ HTML. - Failed to retrieve HTML page. - Không thể lấy trang HTML. + Failed to retrieve HTML page. + Không thể lấy trang HTML. - The game is in version: %1 - Trò chơi đang ở phiên bản: %1 + The game is in version: %1 + Trò chơi đang ở phiên bản: %1 - The downloaded patch only works on version: %1 - Patch đã tải về chỉ hoạt động trên phiên bản: %1 + The downloaded patch only works on version: %1 + Patch đã tải về chỉ hoạt động trên phiên bản: %1 - You may need to update your game. - Bạn có thể cần cập nhật trò chơi của mình. + You may need to update your game. + Bạn có thể cần cập nhật trò chơi của mình. - Incompatibility Notice - Thông báo không tương thích + Incompatibility Notice + Thông báo không tương thích - Failed to open file: - Không thể mở tệp: + Failed to open file: + Không thể mở tệp: - XML ERROR: - LỖI XML: + XML ERROR: + LỖI XML: - Failed to open files.json for writing - Không thể mở files.json để ghi + Failed to open files.json for writing + Không thể mở files.json để ghi - Author: - Tác giả: + Author: + Tác giả: - Directory does not exist: - Thư mục không tồn tại: + Directory does not exist: + Thư mục không tồn tại: - Failed to open files.json for reading. - Không thể mở files.json để đọc. + Failed to open files.json for reading. + Không thể mở files.json để đọc. - Name: - Tên: + Name: + Tên: - Can't apply cheats before the game is started - Không thể áp dụng cheat trước khi trò chơi bắt đầu. + Can't apply cheats before the game is started + Không thể áp dụng cheat trước khi trò chơi bắt đầu. - Close - Đóng + Close + Đóng - - + + CheckUpdate - Auto Updater - Trình cập nhật tự động + Auto Updater + Trình cập nhật tự động - Error - Lỗi + Error + Lỗi - Network error: - Lỗi mạng: + Network error: + Lỗi mạng: - Error_Github_limit_MSG - Trình cập nhật tự động cho phép tối đa 60 lần kiểm tra cập nhật mỗi giờ.\nBạn đã đạt đến giới hạn này. Vui lòng thử lại sau. + Error_Github_limit_MSG + Trình cập nhật tự động cho phép tối đa 60 lần kiểm tra cập nhật mỗi giờ.\nBạn đã đạt đến giới hạn này. Vui lòng thử lại sau. - Failed to parse update information. - Không thể phân tích thông tin cập nhật. + Failed to parse update information. + Không thể phân tích thông tin cập nhật. - No pre-releases found. - Không tìm thấy bản phát hành trước. + No pre-releases found. + Không tìm thấy bản phát hành trước. - Invalid release data. - Dữ liệu bản phát hành không hợp lệ. + Invalid release data. + Dữ liệu bản phát hành không hợp lệ. - No download URL found for the specified asset. - Không tìm thấy URL tải xuống cho tài sản đã chỉ định. + No download URL found for the specified asset. + Không tìm thấy URL tải xuống cho tài sản đã chỉ định. - Your version is already up to date! - Phiên bản của bạn đã được cập nhật! + Your version is already up to date! + Phiên bản của bạn đã được cập nhật! - Update Available - Có bản cập nhật + Update Available + Có bản cập nhật - Update Channel - Kênh Cập Nhật + Update Channel + Kênh Cập Nhật - Current Version - Phiên bản hiện tại + Current Version + Phiên bản hiện tại - Latest Version - Phiên bản mới nhất + Latest Version + Phiên bản mới nhất - Do you want to update? - Bạn có muốn cập nhật không? + Do you want to update? + Bạn có muốn cập nhật không? - Show Changelog - Hiện nhật ký thay đổi + Show Changelog + Hiện nhật ký thay đổi - Check for Updates at Startup - Kiểm tra cập nhật khi khởi động + Check for Updates at Startup + Kiểm tra cập nhật khi khởi động - Update - Cập nhật + Update + Cập nhật - No - Không + No + Không - Hide Changelog - Ẩn nhật ký thay đổi + Hide Changelog + Ẩn nhật ký thay đổi - Changes - Thay đổi + Changes + Thay đổi - Network error occurred while trying to access the URL - Xảy ra lỗi mạng khi cố gắng truy cập URL + Network error occurred while trying to access the URL + Xảy ra lỗi mạng khi cố gắng truy cập URL - Download Complete - Tải xuống hoàn tất + Download Complete + Tải xuống hoàn tất - The update has been downloaded, press OK to install. - Bản cập nhật đã được tải xuống, nhấn OK để cài đặt. + The update has been downloaded, press OK to install. + Bản cập nhật đã được tải xuống, nhấn OK để cài đặt. - Failed to save the update file at - Không thể lưu tệp cập nhật tại + Failed to save the update file at + Không thể lưu tệp cập nhật tại - Starting Update... - Đang bắt đầu cập nhật... + Starting Update... + Đang bắt đầu cập nhật... - Failed to create the update script file - Không thể tạo tệp kịch bản cập nhật + Failed to create the update script file + Không thể tạo tệp kịch bản cập nhật - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - Đang tải dữ liệu tương thích, vui lòng chờ + Fetching compatibility data, please wait + Đang tải dữ liệu tương thích, vui lòng chờ - Cancel - Hủy bỏ + Cancel + Hủy bỏ - Loading... - Đang tải... + Loading... + Đang tải... - Error - Lỗi + Error + Lỗi - Unable to update compatibility data! Try again later. - Không thể cập nhật dữ liệu tương thích! Vui lòng thử lại sau. + Unable to update compatibility data! Try again later. + Không thể cập nhật dữ liệu tương thích! Vui lòng thử lại sau. - Unable to open compatibility_data.json for writing. - Không thể mở compatibility_data.json để ghi. + Unable to open compatibility_data.json for writing. + Không thể mở compatibility_data.json để ghi. - Unknown - Không xác định + Unknown + Không xác định - Nothing - Không có gì + Nothing + Không có gì - Boots - Giày ủng + Boots + Giày ủng - Menus - Menu + Menus + Menu - Ingame - Trong game + Ingame + Trong game - Playable - Có thể chơi + Playable + Có thể chơi - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - Biểu tượng + Icon + Biểu tượng - Name - Tên + Name + Tên - Serial - Số seri + Serial + Số seri - Compatibility - Compatibility + Compatibility + Compatibility - Region - Khu vực + Region + Khu vực - Firmware - Phần mềm + Firmware + Phần mềm - Size - Kích thước + Size + Kích thước - Version - Phiên bản + Version + Phiên bản - Path - Đường dẫn + Path + Đường dẫn - Play Time - Thời gian chơi + Play Time + Thời gian chơi - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - Nhấp để xem chi tiết trên GitHub + Click to see details on github + Nhấp để xem chi tiết trên GitHub - Last updated - Cập nhật lần cuối + Last updated + Cập nhật lần cuối - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - Cheats / Patches - Mẹo / Bản vá + Cheats / Patches + Mẹo / Bản vá - SFO Viewer - SFO Viewer + SFO Viewer + SFO Viewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - Open Folder... - Mở Thư Mục... + Open Folder... + Mở Thư Mục... - Open Game Folder - Mở Thư Mục Trò Chơi + Open Game Folder + Mở Thư Mục Trò Chơi - Open Save Data Folder - Mở Thư Mục Dữ Liệu Lưu + Open Save Data Folder + Mở Thư Mục Dữ Liệu Lưu - Open Log Folder - Mở Thư Mục Nhật Ký + Open Log Folder + Mở Thư Mục Nhật Ký - Copy info... - Copy info... + Copy info... + Copy info... - Copy Name - Copy Name + Copy Name + Copy Name - Copy Serial - Copy Serial + Copy Serial + Copy Serial - Copy All - Copy All + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copy All - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Shortcut creation + View report + View report - Shortcut created successfully! - Shortcut created successfully! + Submit a report + Submit a report - Error - Error + Shortcut creation + Shortcut creation - Error creating shortcut! - Error creating shortcut! + Shortcut created successfully! + Shortcut created successfully! - Install PKG - Install PKG + Error + Error - Game - Game + Error creating shortcut! + Error creating shortcut! - This game has no update to delete! - This game has no update to delete! + Install PKG + Install PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - Kiểm tra bản cập nhật + Check for Updates + Kiểm tra bản cập nhật - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Tải Mẹo / Bản vá + Download Cheats/Patches + Tải Mẹo / Bản vá - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - Giúp đỡ + Help + Giúp đỡ - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - Danh sách trò chơi + Game List + Danh sách trò chơi - * Unsupported Vulkan Version - * Phiên bản Vulkan không được hỗ trợ + * Unsupported Vulkan Version + * Phiên bản Vulkan không được hỗ trợ - Download Cheats For All Installed Games - Tải xuống cheat cho tất cả các trò chơi đã cài đặt + Download Cheats For All Installed Games + Tải xuống cheat cho tất cả các trò chơi đã cài đặt - Download Patches For All Games - Tải xuống bản vá cho tất cả các trò chơi + Download Patches For All Games + Tải xuống bản vá cho tất cả các trò chơi - Download Complete - Tải xuống hoàn tất + Download Complete + Tải xuống hoàn tất - You have downloaded cheats for all the games you have installed. - Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. + You have downloaded cheats for all the games you have installed. + Bạn đã tải xuống cheat cho tất cả các trò chơi mà bạn đã cài đặt. - Patches Downloaded Successfully! - Bản vá đã tải xuống thành công! + Patches Downloaded Successfully! + Bản vá đã tải xuống thành công! - All Patches available for all games have been downloaded. - Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. + All Patches available for all games have been downloaded. + Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống. - Games: - Trò chơi: + Games: + Trò chơi: - ELF files (*.bin *.elf *.oelf) - Tệp ELF (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + Tệp ELF (*.bin *.elf *.oelf) - Game Boot - Khởi động trò chơi + Game Boot + Khởi động trò chơi - Only one file can be selected! - Chỉ có thể chọn một tệp duy nhất! + Only one file can be selected! + Chỉ có thể chọn một tệp duy nhất! - PKG Extraction - Giải nén PKG + PKG Extraction + Giải nén PKG - Patch detected! - Đã phát hiện bản vá! + Patch detected! + Đã phát hiện bản vá! - PKG and Game versions match: - Các phiên bản PKG và trò chơi khớp nhau: + PKG and Game versions match: + Các phiên bản PKG và trò chơi khớp nhau: - Would you like to overwrite? - Bạn có muốn ghi đè không? + Would you like to overwrite? + Bạn có muốn ghi đè không? - PKG Version %1 is older than installed version: - Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: + PKG Version %1 is older than installed version: + Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: - Game is installed: - Trò chơi đã được cài đặt: + Game is installed: + Trò chơi đã được cài đặt: - Would you like to install Patch: - Bạn có muốn cài đặt bản vá: + Would you like to install Patch: + Bạn có muốn cài đặt bản vá: - DLC Installation - Cài đặt DLC + DLC Installation + Cài đặt DLC - Would you like to install DLC: %1? - Bạn có muốn cài đặt DLC: %1? + Would you like to install DLC: %1? + Bạn có muốn cài đặt DLC: %1? - DLC already installed: - DLC đã được cài đặt: + DLC already installed: + DLC đã được cài đặt: - Game already installed - Trò chơi đã được cài đặt + Game already installed + Trò chơi đã được cài đặt - PKG ERROR - LOI PKG + PKG ERROR + LOI PKG - Extracting PKG %1/%2 - Đang giải nén PKG %1/%2 + Extracting PKG %1/%2 + Đang giải nén PKG %1/%2 - Extraction Finished - Giải nén hoàn tất + Extraction Finished + Giải nén hoàn tất - Game successfully installed at %1 - Trò chơi đã được cài đặt thành công tại %1 + Game successfully installed at %1 + Trò chơi đã được cài đặt thành công tại %1 - File doesn't appear to be a valid PKG file - Tệp không có vẻ là tệp PKG hợp lệ + File doesn't appear to be a valid PKG file + Tệp không có vẻ là tệp PKG hợp lệ - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - Tên + PKG ERROR + LOI PKG - Serial - Số seri + Name + Tên - Installed - + Serial + Số seri - Size - Kích thước + Installed + Installed - Category - + Size + Kích thước - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - Khu vực + FW + FW - Flags - + Region + Khu vực - Path - Đường dẫn + Flags + Flags - File - File + Path + Đường dẫn - PKG ERROR - LOI PKG + File + File - Unknown - Không xác định + Unknown + Không xác định - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - Chế độ Toàn màn hình + Fullscreen Mode + Chế độ Toàn màn hình - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - Tab mặc định khi mở cài đặt + Default tab when opening settings + Tab mặc định khi mở cài đặt - Show Game Size In List - Hiển thị Kích thước Game trong Danh sách + Show Game Size In List + Hiển thị Kích thước Game trong Danh sách - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - Bật Discord Rich Presence + Enable Discord Rich Presence + Bật Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - Mở vị trí nhật ký + Open Log Location + Mở vị trí nhật ký - Input - Đầu vào + Input + Đầu vào - Cursor - Con trỏ + Cursor + Con trỏ - Hide Cursor - Ẩn con trỏ + Hide Cursor + Ẩn con trỏ - Hide Cursor Idle Timeout - Thời gian chờ ẩn con trỏ + Hide Cursor Idle Timeout + Thời gian chờ ẩn con trỏ - s - s + s + s - Controller - Điều khiển + Controller + Điều khiển - Back Button Behavior - Hành vi nút quay lại + Back Button Behavior + Hành vi nút quay lại - Graphics - Graphics + Graphics + Graphics - GUI - Giao diện + GUI + Giao diện - User - Người dùng + User + Người dùng - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - Đường dẫn + Enable HDR + Enable HDR - Game Folders - Thư mục trò chơi + Paths + Đường dẫn - Add... - Thêm... + Game Folders + Thư mục trò chơi - Remove - Xóa + Add... + Thêm... - Debug - Debug + Remove + Xóa - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - Cập nhật + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - Kiểm tra cập nhật khi khởi động + Update + Cập nhật - Always Show Changelog - Luôn hiển thị nhật ký thay đổi + Check for Updates at Startup + Kiểm tra cập nhật khi khởi động - Update Channel - Kênh Cập Nhật + Always Show Changelog + Luôn hiển thị nhật ký thay đổi - Check for Updates - Kiểm tra cập nhật + Update Channel + Kênh Cập Nhật - GUI Settings - Cài đặt GUI + Check for Updates + Kiểm tra cập nhật - Title Music - Title Music + GUI Settings + Cài đặt GUI - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - Phát nhạc tiêu đề + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + Phát nhạc tiêu đề - Volume - Âm lượng + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - Lưu + Game Compatibility + Game Compatibility - Apply - Áp dụng + Display Compatibility Data + Display Compatibility Data - Restore Defaults - Khôi phục cài đặt mặc định + Update Compatibility Database + Update Compatibility Database - Close - Đóng + Volume + Âm lượng - Point your mouse at an option to display its description. - Di chuyển chuột đến tùy chọn để hiển thị mô tả của nó. + Save + Lưu - consoleLanguageGroupBox - Ngôn ngữ console:\nChọn ngôn ngữ mà trò chơi PS4 sẽ sử dụng.\nKhuyên bạn nên đặt tùy chọn này thành một ngôn ngữ mà trò chơi hỗ trợ, có thể thay đổi tùy theo vùng. + Apply + Áp dụng - emulatorLanguageGroupBox - Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. + Restore Defaults + Khôi phục cài đặt mặc định - fullscreenCheckBox - Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. + Close + Đóng - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + Di chuyển chuột đến tùy chọn để hiển thị mô tả của nó. - showSplashCheckBox - Hiển thị màn hình khởi động:\nHiển thị màn hình khởi động của trò chơi (một hình ảnh đặc biệt) trong khi trò chơi khởi động. + consoleLanguageGroupBox + Ngôn ngữ console:\nChọn ngôn ngữ mà trò chơi PS4 sẽ sử dụng.\nKhuyên bạn nên đặt tùy chọn này thành một ngôn ngữ mà trò chơi hỗ trợ, có thể thay đổi tùy theo vùng. - discordRPCCheckbox - Bật Discord Rich Presence:\nHiển thị biểu tượng trình giả lập và thông tin liên quan trên hồ sơ Discord của bạn. + emulatorLanguageGroupBox + Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. - userName - Tên người dùng:\nChọn tên người dùng của tài khoản PS4, có thể được một số trò chơi hiển thị. + fullscreenCheckBox + Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - Loại nhật ký:\nChọn xem có đồng bộ hóa đầu ra cửa sổ nhật ký cho hiệu suất hay không. Điều này có thể có tác động tiêu cực đến việc giả lập. + showSplashCheckBox + Hiển thị màn hình khởi động:\nHiển thị màn hình khởi động của trò chơi (một hình ảnh đặc biệt) trong khi trò chơi khởi động. - logFilter - Bộ lọc nhật ký:\nLọc nhật ký để in chỉ thông tin cụ thể.\nVí dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách và ghi lại tất cả các mức sau đó. + discordRPCCheckbox + Bật Discord Rich Presence:\nHiển thị biểu tượng trình giả lập và thông tin liên quan trên hồ sơ Discord của bạn. - updaterGroupBox - Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. + userName + Tên người dùng:\nChọn tên người dùng của tài khoản PS4, có thể được một số trò chơi hiển thị. - GUIMusicGroupBox - Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + Loại nhật ký:\nChọn xem có đồng bộ hóa đầu ra cửa sổ nhật ký cho hiệu suất hay không. Điều này có thể có tác động tiêu cực đến việc giả lập. - hideCursorGroupBox - Ẩn con trỏ:\nChọn khi nào con trỏ sẽ biến mất:\nKhông bao giờ: Bạn sẽ luôn thấy chuột.\nKhông hoạt động: Đặt một khoảng thời gian để nó biến mất sau khi không hoạt động.\nLuôn luôn: bạn sẽ không bao giờ thấy chuột. + logFilter + Bộ lọc nhật ký:\nLọc nhật ký để in chỉ thông tin cụ thể.\nVí dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách và ghi lại tất cả các mức sau đó. - idleTimeoutGroupBox - Đặt thời gian để chuột biến mất sau khi không hoạt động. + updaterGroupBox + Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. - backButtonBehaviorGroupBox - Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm để mô phỏng việc chạm vào vị trí đã chỉ định trên touchpad của PS4. + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + Ẩn con trỏ:\nChọn khi nào con trỏ sẽ biến mất:\nKhông bao giờ: Bạn sẽ luôn thấy chuột.\nKhông hoạt động: Đặt một khoảng thời gian để nó biến mất sau khi không hoạt động.\nLuôn luôn: bạn sẽ không bao giờ thấy chuột. - Never - Không bao giờ + idleTimeoutGroupBox + Đặt thời gian để chuột biến mất sau khi không hoạt động. - Idle - Nhàn rỗi + backButtonBehaviorGroupBox + Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm để mô phỏng việc chạm vào vị trí đã chỉ định trên touchpad của PS4. - Always - Luôn luôn + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - Touchpad Trái + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - Touchpad Phải + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - Giữa Touchpad + Never + Không bao giờ - None - Không có + Idle + Nhàn rỗi - graphicsAdapterGroupBox - Thiết bị đồ họa:\nTrên các hệ thống có GPU đa năng, hãy chọn GPU mà trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn "Auto Select" để tự động xác định. + Always + Luôn luôn - resolutionLayout - Chiều rộng/Cao:\nChọn kích thước cửa sổ của trình giả lập khi khởi động, có thể điều chỉnh trong quá trình chơi.\nĐiều này khác với độ phân giải trong trò chơi. + Touchpad Left + Touchpad Trái - heightDivider - Bộ chia Vblank:\nTốc độ khung hình mà trình giả lập làm mới được nhân với số này. Thay đổi này có thể có tác động tiêu cực như tăng tốc độ trò chơi hoặc làm hỏng chức năng quan trọng mà trò chơi không mong đợi thay đổi điều này! + Touchpad Right + Touchpad Phải - dumpShadersCheckBox - Bật xuất shader:\nĐể mục đích gỡ lỗi kỹ thuật, lưu shader của trò chơi vào một thư mục khi chúng được kết xuất. + Touchpad Center + Giữa Touchpad - nullGpuCheckBox - Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, vô hiệu hóa việc kết xuất trò chơi như thể không có card đồ họa. + None + Không có - gameFoldersBox - Thư mục trò chơi:\nDanh sách các thư mục để kiểm tra các trò chơi đã cài đặt. + graphicsAdapterGroupBox + Thiết bị đồ họa:\nTrên các hệ thống có GPU đa năng, hãy chọn GPU mà trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn "Auto Select" để tự động xác định. - addFolderButton - Thêm:\nThêm một thư mục vào danh sách. + resolutionLayout + Chiều rộng/Cao:\nChọn kích thước cửa sổ của trình giả lập khi khởi động, có thể điều chỉnh trong quá trình chơi.\nĐiều này khác với độ phân giải trong trò chơi. - removeFolderButton - Xóa:\nXóa một thư mục khỏi danh sách. + heightDivider + Bộ chia Vblank:\nTốc độ khung hình mà trình giả lập làm mới được nhân với số này. Thay đổi này có thể có tác động tiêu cực như tăng tốc độ trò chơi hoặc làm hỏng chức năng quan trọng mà trò chơi không mong đợi thay đổi điều này! - debugDump - Bật xuất gỡ lỗi:\nLưu biểu tượng nhập và xuất và thông tin tiêu đề tệp cho ứng dụng PS4 hiện đang chạy vào một thư mục. + dumpShadersCheckBox + Bật xuất shader:\nĐể mục đích gỡ lỗi kỹ thuật, lưu shader của trò chơi vào một thư mục khi chúng được kết xuất. - vkValidationCheckBox - Bật lớp xác thực Vulkan:\nKích hoạt một hệ thống xác thực trạng thái của bộ kết xuất Vulkan và ghi lại thông tin về trạng thái nội bộ của nó. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. + nullGpuCheckBox + Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, vô hiệu hóa việc kết xuất trò chơi như thể không có card đồ họa. - vkSyncValidationCheckBox - Bật xác thực đồng bộ Vulkan:\nKích hoạt một hệ thống xác thực thời gian của nhiệm vụ kết xuất Vulkan. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. + gameFoldersBox + Thư mục trò chơi:\nDanh sách các thư mục để kiểm tra các trò chơi đã cài đặt. - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + Thêm:\nThêm một thư mục vào danh sách. - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + Xóa:\nXóa một thư mục khỏi danh sách. - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + Bật xuất gỡ lỗi:\nLưu biểu tượng nhập và xuất và thông tin tiêu đề tệp cho ứng dụng PS4 hiện đang chạy vào một thư mục. - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + Bật lớp xác thực Vulkan:\nKích hoạt một hệ thống xác thực trạng thái của bộ kết xuất Vulkan và ghi lại thông tin về trạng thái nội bộ của nó. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + Bật xác thực đồng bộ Vulkan:\nKích hoạt một hệ thống xác thực thời gian của nhiệm vụ kết xuất Vulkan. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - Borderless - + rdocCheckBox + Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 8bc8d16a3..5328ce605 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - 关于 shadPS4 + About shadPS4 + 关于 shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 是一款实验性质的开源 PlayStation 4 模拟器软件。 + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 是一款实验性质的开源 PlayStation 4 模拟器软件。 - This software should not be used to play games you have not legally obtained. - 本软件不得用于运行未经合法授权而获得的游戏。 + This software should not be used to play games you have not legally obtained. + 本软件不得用于运行未经合法授权而获得的游戏。 - - + + CheatsPatches - Cheats / Patches for - 作弊码/补丁: + Cheats / Patches for + 作弊码/补丁: - defaultTextEdit_MSG - 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - 没有可用的图片 + No Image Available + 没有可用的图片 - Serial: - 序列号: + Serial: + 序列号: - Version: - 版本: + Version: + 版本: - Size: - 大小: + Size: + 大小: - Select Cheat File: - 选择作弊码文件: + Select Cheat File: + 选择作弊码文件: - Repository: - 存储库: + Repository: + 存储库: - Download Cheats - 下载作弊码 + Download Cheats + 下载作弊码 - Delete File - 删除文件 + Delete File + 删除文件 - No files selected. - 没有选择文件。 + No files selected. + 没有选择文件。 - You can delete the cheats you don't want after downloading them. - 您可以在下载后删除不想要的作弊码。 + You can delete the cheats you don't want after downloading them. + 您可以在下载后删除不想要的作弊码。 - Do you want to delete the selected file?\n%1 - 您要删除选中的文件吗?\n%1 + Do you want to delete the selected file?\n%1 + 您要删除选中的文件吗?\n%1 - Select Patch File: - 选择补丁文件: + Select Patch File: + 选择补丁文件: - Download Patches - 下载补丁 + Download Patches + 下载补丁 - Save - 保存 + Save + 保存 - Cheats - 作弊码 + Cheats + 作弊码 - Patches - 补丁 + Patches + 补丁 - Error - 错误 + Error + 错误 - No patch selected. - 没有选择补丁。 + No patch selected. + 没有选择补丁。 - Unable to open files.json for reading. - 无法打开 files.json 进行读取。 + Unable to open files.json for reading. + 无法打开 files.json 进行读取。 - No patch file found for the current serial. - 未找到当前序列号的补丁文件。 + No patch file found for the current serial. + 未找到当前序列号的补丁文件。 - Unable to open the file for reading. - 无法打开文件进行读取。 + Unable to open the file for reading. + 无法打开文件进行读取。 - Unable to open the file for writing. - 无法打开文件进行写入。 + Unable to open the file for writing. + 无法打开文件进行写入。 - Failed to parse XML: - 解析 XML 失败: + Failed to parse XML: + 解析 XML 失败: - Success - 成功 + Success + 成功 - Options saved successfully. - 选项已成功保存。 + Options saved successfully. + 选项已成功保存。 - Invalid Source - 无效的来源 + Invalid Source + 无效的来源 - The selected source is invalid. - 选择的来源无效。 + The selected source is invalid. + 选择的来源无效。 - File Exists - 文件已存在 + File Exists + 文件已存在 - File already exists. Do you want to replace it? - 文件已存在,您要替换它吗? + File already exists. Do you want to replace it? + 文件已存在,您要替换它吗? - Failed to save file: - 保存文件失败: + Failed to save file: + 保存文件失败: - Failed to download file: - 下载文件失败: + Failed to download file: + 下载文件失败: - Cheats Not Found - 未找到作弊码 + Cheats Not Found + 未找到作弊码 - CheatsNotFound_MSG - 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 + CheatsNotFound_MSG + 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 - Cheats Downloaded Successfully - 作弊码下载成功 + Cheats Downloaded Successfully + 作弊码下载成功 - CheatsDownloadedSuccessfully_MSG - 您已从所选存储库中成功下载了该游戏版本的作弊码。您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 + CheatsDownloadedSuccessfully_MSG + 您已从所选存储库中成功下载了该游戏版本的作弊码。您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 - Failed to save: - 保存失败: + Failed to save: + 保存失败: - Failed to download: - 下载失败: + Failed to download: + 下载失败: - Download Complete - 下载完成 + Download Complete + 下载完成 - DownloadComplete_MSG - 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不适用于当前游戏的序列号和版本。 + DownloadComplete_MSG + 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不适用于当前游戏的序列号和版本。 - Failed to parse JSON data from HTML. - 无法解析 HTML 中的 JSON 数据。 + Failed to parse JSON data from HTML. + 无法解析 HTML 中的 JSON 数据。 - Failed to retrieve HTML page. - 无法获取 HTML 页面。 + Failed to retrieve HTML page. + 无法获取 HTML 页面。 - The game is in version: %1 - 游戏版本:%1 + The game is in version: %1 + 游戏版本:%1 - The downloaded patch only works on version: %1 - 下载的补丁仅适用于版本:%1 + The downloaded patch only works on version: %1 + 下载的补丁仅适用于版本:%1 - You may need to update your game. - 您可能需要更新您的游戏。 + You may need to update your game. + 您可能需要更新您的游戏。 - Incompatibility Notice - 不兼容通知 + Incompatibility Notice + 不兼容通知 - Failed to open file: - 无法打开文件: + Failed to open file: + 无法打开文件: - XML ERROR: - XML 错误: + XML ERROR: + XML 错误: - Failed to open files.json for writing - 无法打开 files.json 进行写入 + Failed to open files.json for writing + 无法打开 files.json 进行写入 - Author: - 作者: + Author: + 作者: - Directory does not exist: - 目录不存在: + Directory does not exist: + 目录不存在: - Failed to open files.json for reading. - 无法打开 files.json 进行读取。 + Failed to open files.json for reading. + 无法打开 files.json 进行读取。 - Name: - 名称: + Name: + 名称: - Can't apply cheats before the game is started - 在游戏启动之前无法应用作弊码。 + Can't apply cheats before the game is started + 在游戏启动之前无法应用作弊码。 - Close - 关闭 + Close + 关闭 - - + + CheckUpdate - Auto Updater - 自动更新程序 + Auto Updater + 自动更新程序 - Error - 错误 + Error + 错误 - Network error: - 网络错误: + Network error: + 网络错误: - Error_Github_limit_MSG - 自动更新程序每小时最多允许 60 次更新检查。\n您已达到此限制。请稍后再试。 + Error_Github_limit_MSG + 自动更新程序每小时最多允许 60 次更新检查。\n您已达到此限制。请稍后再试。 - Failed to parse update information. - 无法解析更新信息。 + Failed to parse update information. + 无法解析更新信息。 - No pre-releases found. - 未找到预发布版本。 + No pre-releases found. + 未找到预发布版本。 - Invalid release data. - 无效的发布数据。 + Invalid release data. + 无效的发布数据。 - No download URL found for the specified asset. - 未找到指定资源的下载地址。 + No download URL found for the specified asset. + 未找到指定资源的下载地址。 - Your version is already up to date! - 您的版本已经是最新的! + Your version is already up to date! + 您的版本已经是最新的! - Update Available - 可用更新 + Update Available + 可用更新 - Update Channel - 更新频道 + Update Channel + 更新频道 - Current Version - 当前版本 + Current Version + 当前版本 - Latest Version - 最新版本 + Latest Version + 最新版本 - Do you want to update? - 您想要更新吗? + Do you want to update? + 您想要更新吗? - Show Changelog - 显示更新日志 + Show Changelog + 显示更新日志 - Check for Updates at Startup - 启动时检查更新 + Check for Updates at Startup + 启动时检查更新 - Update - 更新 + Update + 更新 - No - + No + - Hide Changelog - 隐藏更新日志 + Hide Changelog + 隐藏更新日志 - Changes - 更新日志 + Changes + 更新日志 - Network error occurred while trying to access the URL - 尝试访问网址时发生网络错误 + Network error occurred while trying to access the URL + 尝试访问网址时发生网络错误 - Download Complete - 下载完成 + Download Complete + 下载完成 - The update has been downloaded, press OK to install. - 更新已下载,请按 OK 安装。 + The update has been downloaded, press OK to install. + 更新已下载,请按 OK 安装。 - Failed to save the update file at - 无法保存更新文件到 + Failed to save the update file at + 无法保存更新文件到 - Starting Update... - 正在开始更新... + Starting Update... + 正在开始更新... - Failed to create the update script file - 无法创建更新脚本文件 + Failed to create the update script file + 无法创建更新脚本文件 - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - 正在获取兼容性数据,请稍等 + Fetching compatibility data, please wait + 正在获取兼容性数据,请稍等 - Cancel - 取消 + Cancel + 取消 - Loading... - 加载中... + Loading... + 加载中... - Error - 错误 + Error + 错误 - Unable to update compatibility data! Try again later. - 无法更新兼容性数据!稍后再试。 + Unable to update compatibility data! Try again later. + 无法更新兼容性数据!稍后再试。 - Unable to open compatibility_data.json for writing. - 无法打开 compatibility_data.json 进行写入。 + Unable to open compatibility_data.json for writing. + 无法打开 compatibility_data.json 进行写入。 - Unknown - 未知 + Unknown + 未知 - Nothing - 无法启动 + Nothing + 无法启动 - Boots - 可启动 + Boots + 可启动 - Menus - 可进入菜单 + Menus + 可进入菜单 - Ingame - 可进入游戏内 + Ingame + 可进入游戏内 - Playable - 可通关 + Playable + 可通关 - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - 打开文件夹 + Open Folder + 打开文件夹 - - + + GameInfoClass - Loading game list, please wait :3 - 加载游戏列表中, 请稍等 :3 + Loading game list, please wait :3 + 加载游戏列表中, 请稍等 :3 - Cancel - 取消 + Cancel + 取消 - Loading... - 加载中... + Loading... + 加载中... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - 选择文件目录 + shadPS4 - Choose directory + shadPS4 - 选择文件目录 - Directory to install games - 要安装游戏的目录 + Directory to install games + 要安装游戏的目录 - Browse - 浏览 + Browse + 浏览 - Error - 错误 + Error + 错误 - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - 图标 + Icon + 图标 - Name - 名称 + Name + 名称 - Serial - 序列号 + Serial + 序列号 - Compatibility - 兼容性 + Compatibility + 兼容性 - Region - 区域 + Region + 区域 - Firmware - 固件 + Firmware + 固件 - Size - 大小 + Size + 大小 - Version - 版本 + Version + 版本 - Path - 路径 + Path + 路径 - Play Time - 游戏时间 + Play Time + 游戏时间 - Never Played - 未玩过 + Never Played + 未玩过 - h - 小时 + h + 小时 - m - 分钟 + m + 分钟 - s - + s + - Compatibility is untested - 兼容性未经测试 + Compatibility is untested + 兼容性未经测试 - Game does not initialize properly / crashes the emulator - 游戏无法正确初始化/模拟器崩溃 + Game does not initialize properly / crashes the emulator + 游戏无法正确初始化/模拟器崩溃 - Game boots, but only displays a blank screen - 游戏启动,但只显示白屏 + Game boots, but only displays a blank screen + 游戏启动,但只显示白屏 - Game displays an image but does not go past the menu - 游戏显示图像但无法通过菜单页面 + Game displays an image but does not go past the menu + 游戏显示图像但无法通过菜单页面 - Game has game-breaking glitches or unplayable performance - 游戏有严重的 Bug 或太卡无法游玩 + Game has game-breaking glitches or unplayable performance + 游戏有严重的 Bug 或太卡无法游玩 - Game can be completed with playable performance and no major glitches - 游戏能在可玩的性能下通关且没有重大 Bug + Game can be completed with playable performance and no major glitches + 游戏能在可玩的性能下通关且没有重大 Bug - Click to see details on github - 点击查看 GitHub 上的详细信息 + Click to see details on github + 点击查看 GitHub 上的详细信息 - Last updated - 最后更新 + Last updated + 最后更新 - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - 创建快捷方式 + Create Shortcut + 创建快捷方式 - Cheats / Patches - 作弊码/补丁 + Cheats / Patches + 作弊码/补丁 - SFO Viewer - SFO 查看器 + SFO Viewer + SFO 查看器 - Trophy Viewer - 奖杯查看器 + Trophy Viewer + 奖杯查看器 - Open Folder... - 打开文件夹... + Open Folder... + 打开文件夹... - Open Game Folder - 打开游戏文件夹 + Open Game Folder + 打开游戏文件夹 - Open Save Data Folder - 打开存档数据文件夹 + Open Save Data Folder + 打开存档数据文件夹 - Open Log Folder - 打开日志文件夹 + Open Log Folder + 打开日志文件夹 - Copy info... - 复制信息... + Copy info... + 复制信息... - Copy Name - 复制名称 + Copy Name + 复制名称 - Copy Serial - 复制序列号 + Copy Serial + 复制序列号 - Copy Version - 复制版本 + Copy Version + 复制版本 - Copy Size - 复制大小 + Copy Size + 复制大小 - Copy All - 复制全部 + Copy All + 复制全部 - Delete... - 删除... + Delete... + 删除... - Delete Game - 删除游戏 + Delete Game + 删除游戏 - Delete Update - 删除更新 + Delete Update + 删除更新 - Delete DLC - 删除 DLC + Delete DLC + 删除 DLC - Compatibility... - 兼容性... + Compatibility... + 兼容性... - Update database - 更新数据库 + Update database + 更新数据库 - View report - 查看报告 + View report + 查看报告 - Submit a report - 提交报告 + Submit a report + 提交报告 - Shortcut creation - 创建快捷方式 + Shortcut creation + 创建快捷方式 - Shortcut created successfully! - 创建快捷方式成功! + Shortcut created successfully! + 创建快捷方式成功! - Error - 错误 + Error + 错误 - Error creating shortcut! - 创建快捷方式出错! + Error creating shortcut! + 创建快捷方式出错! - Install PKG - 安装 PKG + Install PKG + 安装 PKG - Game - 游戏 + Game + 游戏 - This game has no update to delete! - 这个游戏没有更新可以删除! + This game has no update to delete! + 这个游戏没有更新可以删除! - Update - 更新 + Update + 更新 - This game has no DLC to delete! - 这个游戏没有 DLC 可以删除! + This game has no DLC to delete! + 这个游戏没有 DLC 可以删除! - DLC - DLC + DLC + DLC - Delete %1 - 删除 %1 + Delete %1 + 删除 %1 - Are you sure you want to delete %1's %2 directory? - 您确定要删除 %1 的%2目录? + Are you sure you want to delete %1's %2 directory? + 您确定要删除 %1 的%2目录? - Open Update Folder - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - 选择文件目录 + shadPS4 - Choose directory + shadPS4 - 选择文件目录 - Select which directory you want to install to. - 选择您想要安装到的目录。 + Select which directory you want to install to. + 选择您想要安装到的目录。 - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - 打开/添加 Elf 文件夹 + Open/Add Elf Folder + 打开/添加 Elf 文件夹 - Install Packages (PKG) - 安装 Packages (PKG) + Install Packages (PKG) + 安装 Packages (PKG) - Boot Game - 启动游戏 + Boot Game + 启动游戏 - Check for Updates - 检查更新 + Check for Updates + 检查更新 - About shadPS4 - 关于 shadPS4 + About shadPS4 + 关于 shadPS4 - Configure... - 设置... + Configure... + 设置... - Install application from a .pkg file - 从 .pkg 文件安装应用程序 + Install application from a .pkg file + 从 .pkg 文件安装应用程序 - Recent Games - 最近启动的游戏 + Recent Games + 最近启动的游戏 - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - 退出 + Exit + 退出 - Exit shadPS4 - 退出 shadPS4 + Exit shadPS4 + 退出 shadPS4 - Exit the application. - 退出应用程序。 + Exit the application. + 退出应用程序。 - Show Game List - 显示游戏列表 + Show Game List + 显示游戏列表 - Game List Refresh - 刷新游戏列表 + Game List Refresh + 刷新游戏列表 - Tiny - 微小 + Tiny + 微小 - Small - + Small + - Medium - + Medium + - Large - + Large + - List View - 列表视图 + List View + 列表视图 - Grid View - 表格视图 + Grid View + 表格视图 - Elf Viewer - Elf 查看器 + Elf Viewer + Elf 查看器 - Game Install Directory - 游戏安装目录 + Game Install Directory + 游戏安装目录 - Download Cheats/Patches - 下载作弊码/补丁 + Download Cheats/Patches + 下载作弊码/补丁 - Dump Game List - 导出游戏列表 + Dump Game List + 导出游戏列表 - PKG Viewer - PKG 查看器 + PKG Viewer + PKG 查看器 - Search... - 搜索... + Search... + 搜索... - File - 文件 + File + 文件 - View - 显示 + View + 显示 - Game List Icons - 游戏列表图标 + Game List Icons + 游戏列表图标 - Game List Mode - 游戏列表模式 + Game List Mode + 游戏列表模式 - Settings - 设置 + Settings + 设置 - Utils - 工具 + Utils + 工具 - Themes - 主题 + Themes + 主题 - Help - 帮助 + Help + 帮助 - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - 工具栏 + toolBar + 工具栏 - Game List - 游戏列表 + Game List + 游戏列表 - * Unsupported Vulkan Version - * 不支持的 Vulkan 版本 + * Unsupported Vulkan Version + * 不支持的 Vulkan 版本 - Download Cheats For All Installed Games - 下载所有已安装游戏的作弊码 + Download Cheats For All Installed Games + 下载所有已安装游戏的作弊码 - Download Patches For All Games - 下载所有游戏的补丁 + Download Patches For All Games + 下载所有游戏的补丁 - Download Complete - 下载完成 + Download Complete + 下载完成 - You have downloaded cheats for all the games you have installed. - 您已下载了所有已安装游戏的作弊码。 + You have downloaded cheats for all the games you have installed. + 您已下载了所有已安装游戏的作弊码。 - Patches Downloaded Successfully! - 补丁下载成功! + Patches Downloaded Successfully! + 补丁下载成功! - All Patches available for all games have been downloaded. - 所有游戏的可用补丁都已下载。 + All Patches available for all games have been downloaded. + 所有游戏的可用补丁都已下载。 - Games: - 游戏: + Games: + 游戏: - ELF files (*.bin *.elf *.oelf) - ELF 文件 (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF 文件 (*.bin *.elf *.oelf) - Game Boot - 启动游戏 + Game Boot + 启动游戏 - Only one file can be selected! - 只能选择一个文件! + Only one file can be selected! + 只能选择一个文件! - PKG Extraction - PKG 解压 + PKG Extraction + PKG 解压 - Patch detected! - 检测到补丁! + Patch detected! + 检测到补丁! - PKG and Game versions match: - PKG 和游戏版本匹配: + PKG and Game versions match: + PKG 和游戏版本匹配: - Would you like to overwrite? - 您想要覆盖吗? + Would you like to overwrite? + 您想要覆盖吗? - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安装版本更旧: + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安装版本更旧: - Game is installed: - 游戏已安装: + Game is installed: + 游戏已安装: - Would you like to install Patch: - 您想安装补丁吗: + Would you like to install Patch: + 您想安装补丁吗: - DLC Installation - DLC 安装 + DLC Installation + DLC 安装 - Would you like to install DLC: %1? - 您想安装 DLC:%1 吗? + Would you like to install DLC: %1? + 您想安装 DLC:%1 吗? - DLC already installed: - DLC 已经安装: + DLC already installed: + DLC 已经安装: - Game already installed - 游戏已经安装 + Game already installed + 游戏已经安装 - PKG ERROR - PKG 错误 + PKG ERROR + PKG 错误 - Extracting PKG %1/%2 - 正在解压 PKG %1/%2 + Extracting PKG %1/%2 + 正在解压 PKG %1/%2 - Extraction Finished - 解压完成 + Extraction Finished + 解压完成 - Game successfully installed at %1 - 游戏成功安装在 %1 + Game successfully installed at %1 + 游戏成功安装在 %1 - File doesn't appear to be a valid PKG file - 文件似乎不是有效的 PKG 文件 + File doesn't appear to be a valid PKG file + 文件似乎不是有效的 PKG 文件 - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - 打开文件夹 + Open Folder + 打开文件夹 - Name - 名称 + PKG ERROR + PKG 错误 - Serial - 序列号 + Name + 名称 - Installed - + Serial + 序列号 - Size - 大小 + Installed + Installed - Category - + Size + 大小 - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - 区域 + FW + FW - Flags - + Region + 区域 - Path - 路径 + Flags + Flags - File - 文件 + Path + 路径 - PKG ERROR - PKG 错误 + File + 文件 - Unknown - 未知 + Unknown + 未知 - Package - + Package + Package - - + + SettingsDialog - Settings - 设置 + Settings + 设置 - General - 常规 + General + 常规 - System - 系统 + System + 系统 - Console Language - 主机语言 + Console Language + 主机语言 - Emulator Language - 模拟器语言 + Emulator Language + 模拟器语言 - Emulator - 模拟器 + Emulator + 模拟器 - Enable Fullscreen - 启用全屏 + Enable Fullscreen + 启用全屏 - Fullscreen Mode - 全屏模式 + Fullscreen Mode + 全屏模式 - Enable Separate Update Folder - 启用单独的更新目录 + Enable Separate Update Folder + 启用单独的更新目录 - Default tab when opening settings - 打开设置时的默认选项卡 + Default tab when opening settings + 打开设置时的默认选项卡 - Show Game Size In List - 在列表中显示游戏大小 + Show Game Size In List + 在列表中显示游戏大小 - Show Splash - 显示启动画面 + Show Splash + 显示启动画面 - Enable Discord Rich Presence - 启用 Discord Rich Presence + Enable Discord Rich Presence + 启用 Discord Rich Presence - Username - 用户名 + Username + 用户名 - Trophy Key - 奖杯密钥 + Trophy Key + 奖杯密钥 - Trophy - 奖杯 + Trophy + 奖杯 - Logger - 日志 + Logger + 日志 - Log Type - 日志类型 + Log Type + 日志类型 - Log Filter - 日志过滤 + Log Filter + 日志过滤 - Open Log Location - 打开日志位置 + Open Log Location + 打开日志位置 - Input - 输入 + Input + 输入 - Cursor - 光标 + Cursor + 光标 - Hide Cursor - 隐藏光标 + Hide Cursor + 隐藏光标 - Hide Cursor Idle Timeout - 光标隐藏闲置时长 + Hide Cursor Idle Timeout + 光标隐藏闲置时长 - s - + s + - Controller - 手柄 + Controller + 手柄 - Back Button Behavior - 返回按钮行为 + Back Button Behavior + 返回按钮行为 - Graphics - 图像 + Graphics + 图像 - GUI - 界面 + GUI + 界面 - User - 用户 + User + 用户 - Graphics Device - 图形设备 + Graphics Device + 图形设备 - Width - 宽度 + Width + 宽度 - Height - 高度 + Height + 高度 - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - 高级 + Advanced + 高级 - Enable Shaders Dumping - 启用着色器转储 + Enable Shaders Dumping + 启用着色器转储 - Enable NULL GPU - 启用 NULL GPU + Enable NULL GPU + 启用 NULL GPU - Paths - 路径 + Enable HDR + Enable HDR - Game Folders - 游戏文件夹 + Paths + 路径 - Add... - 添加... + Game Folders + 游戏文件夹 - Remove - 删除 + Add... + 添加... - Debug - 调试 + Remove + 删除 - Enable Debug Dumping - 启用调试转储 + Debug + 调试 - Enable Vulkan Validation Layers - 启用 Vulkan 验证层 + Enable Debug Dumping + 启用调试转储 - Enable Vulkan Synchronization Validation - 启用 Vulkan 同步验证 + Enable Vulkan Validation Layers + 启用 Vulkan 验证层 - Enable RenderDoc Debugging - 启用 RenderDoc 调试 + Enable Vulkan Synchronization Validation + 启用 Vulkan 同步验证 - Enable Crash Diagnostics - 启用崩溃诊断 + Enable RenderDoc Debugging + 启用 RenderDoc 调试 - Collect Shaders - 收集着色器 + Enable Crash Diagnostics + 启用崩溃诊断 - Copy GPU Buffers - 复制 GPU 缓冲区 + Collect Shaders + 收集着色器 - Host Debug Markers - Host 调试标记 + Copy GPU Buffers + 复制 GPU 缓冲区 - Guest Debug Markers - Geust 调试标记 + Host Debug Markers + Host 调试标记 - Update - 更新 + Guest Debug Markers + Geust 调试标记 - Check for Updates at Startup - 启动时检查更新 + Update + 更新 - Always Show Changelog - 始终显示变更日志 + Check for Updates at Startup + 启动时检查更新 - Update Channel - 更新频道 + Always Show Changelog + 始终显示变更日志 - Check for Updates - 检查更新 + Update Channel + 更新频道 - GUI Settings - 界面设置 + Check for Updates + 检查更新 - Title Music - 标题音乐 + GUI Settings + 界面设置 - Disable Trophy Pop-ups - 禁止弹出奖杯 + Title Music + 标题音乐 - Background Image - 背景图片 + Disable Trophy Pop-ups + 禁止弹出奖杯 - Show Background Image - 显示背景图片 + Background Image + 背景图片 - Opacity - 可见度 + Show Background Image + 显示背景图片 - Play title music - 播放标题音乐 + Opacity + 可见度 - Update Compatibility Database On Startup - 启动时更新兼容性数据库 + Play title music + 播放标题音乐 - Game Compatibility - 游戏兼容性 + Update Compatibility Database On Startup + 启动时更新兼容性数据库 - Display Compatibility Data - 显示兼容性数据 + Game Compatibility + 游戏兼容性 - Update Compatibility Database - 更新兼容性数据库 + Display Compatibility Data + 显示兼容性数据 - Volume - 音量 + Update Compatibility Database + 更新兼容性数据库 - Save - 保存 + Volume + 音量 - Apply - 应用 + Save + 保存 - Restore Defaults - 恢复默认 + Apply + 应用 - Close - 关闭 + Restore Defaults + 恢复默认 - Point your mouse at an option to display its description. - 将鼠标指针指向选项以显示其描述。 + Close + 关闭 - consoleLanguageGroupBox - 主机语言:\n设置 PS4 游戏中使用的语言。\n建议设置为支持的语言,这将因地区而异。 + Point your mouse at an option to display its description. + 将鼠标指针指向选项以显示其描述。 - emulatorLanguageGroupBox - 模拟器语言:\n设置模拟器用户界面的语言。 + consoleLanguageGroupBox + 主机语言:\n设置 PS4 游戏中使用的语言。\n建议设置为支持的语言,这将因地区而异。 - fullscreenCheckBox - 启用全屏:\n以全屏模式启动游戏。\n您可以按 F11 键切换回窗口模式。 + emulatorLanguageGroupBox + 模拟器语言:\n设置模拟器用户界面的语言。 - separateUpdatesCheckBox - 启用单独的更新目录:\n启用安装游戏更新到一个单独的目录中以更便于管理。 + fullscreenCheckBox + 启用全屏:\n以全屏模式启动游戏。\n您可以按 F11 键切换回窗口模式。 - showSplashCheckBox - 显示启动画面:\n在游戏启动时显示游戏的启动画面(特殊图像)。 + separateUpdatesCheckBox + 启用单独的更新目录:\n启用安装游戏更新到一个单独的目录中以更便于管理。 - discordRPCCheckbox - 启用 Discord Rich Presence:\n在您的 Discord 个人资料上显示模拟器图标和相关信息。 + showSplashCheckBox + 显示启动画面:\n在游戏启动时显示游戏的启动画面(特殊图像)。 - userName - 用户名:\n设置 PS4 帐户的用户名,某些游戏中可能会显示此名称。 + discordRPCCheckbox + 启用 Discord Rich Presence:\n在您的 Discord 个人资料上显示模拟器图标和相关信息。 - TrophyKey - 奖杯密钥:\n用于解密奖杯的密钥。必须从您的越狱主机中获得。\n仅包含十六进制字符。 + userName + 用户名:\n设置 PS4 帐户的用户名,某些游戏中可能会显示此名称。 - logTypeGroupBox - 日志类型:\n设置日志窗口输出的同步方式以提高性能。可能会对模拟产生不良影响。 + TrophyKey + 奖杯密钥:\n用于解密奖杯的密钥。必须从您的越狱主机中获得。\n仅包含十六进制字符。 - logFilter - 日志过滤器:\n过滤日志,仅打印特定信息。\n例如:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - 按此顺序,特定级别将静默列表中所有先前的级别,并记录所有后续级别。 + logTypeGroupBox + 日志类型:\n设置日志窗口输出的同步方式以提高性能。可能会对模拟产生不良影响。 - updaterGroupBox - 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 + logFilter + 日志过滤器:\n过滤日志,仅打印特定信息。\n例如:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - 按此顺序,特定级别将静默列表中所有先前的级别,并记录所有后续级别。 - GUIBackgroundImageGroupBox - 背景图片:\n控制游戏背景图片的可见度。 + updaterGroupBox + 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 - GUIMusicGroupBox - 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 + GUIBackgroundImageGroupBox + 背景图片:\n控制游戏背景图片的可见度。 - disableTrophycheckBox - 禁止弹出奖杯:\n禁用游戏内奖杯通知。可以在奖杯查看器中继续跟踪奖杯进度(在主窗口中右键点击游戏)。 + GUIMusicGroupBox + 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 - hideCursorGroupBox - 隐藏光标:\n选择光标何时消失:\n从不: 从不隐藏光标。\n闲置:光标在闲置若干秒后消失。\n始终:始终隐藏光标。 + disableTrophycheckBox + 禁止弹出奖杯:\n禁用游戏内奖杯通知。可以在奖杯查看器中继续跟踪奖杯进度(在主窗口中右键点击游戏)。 - idleTimeoutGroupBox - 光标隐藏闲置时长:\n光标自动隐藏之前的闲置时长。 + hideCursorGroupBox + 隐藏光标:\n选择光标何时消失:\n从不: 从不隐藏光标。\n闲置:光标在闲置若干秒后消失。\n始终:始终隐藏光标。 - backButtonBehaviorGroupBox - 返回按钮行为:\n设置手柄的返回按钮模拟在 PS4 触控板上指定位置的点击。 + idleTimeoutGroupBox + 光标隐藏闲置时长:\n光标自动隐藏之前的闲置时长。 - enableCompatibilityCheckBox - 显示兼容性数据:\n在列表视图中显示游戏兼容性信息。启用“启动时更新兼容性数据库”以获取最新信息。 + backButtonBehaviorGroupBox + 返回按钮行为:\n设置手柄的返回按钮模拟在 PS4 触控板上指定位置的点击。 - checkCompatibilityOnStartupCheckBox - 启动时更新兼容性数据库:\n当 shadPS4 启动时自动更新兼容性数据库。 + enableCompatibilityCheckBox + 显示兼容性数据:\n在列表视图中显示游戏兼容性信息。启用“启动时更新兼容性数据库”以获取最新信息。 - updateCompatibilityButton - 更新兼容性数据库:\n立即更新兼容性数据库。 + checkCompatibilityOnStartupCheckBox + 启动时更新兼容性数据库:\n当 shadPS4 启动时自动更新兼容性数据库。 - Never - 从不 + updateCompatibilityButton + 更新兼容性数据库:\n立即更新兼容性数据库。 - Idle - 闲置 + Never + 从不 - Always - 始终 + Idle + 闲置 - Touchpad Left - 触控板左侧 + Always + 始终 - Touchpad Right - 触控板右侧 + Touchpad Left + 触控板左侧 - Touchpad Center - 触控板中间 + Touchpad Right + 触控板右侧 - None - + Touchpad Center + 触控板中间 - graphicsAdapterGroupBox - 图形设备:\n在具有多个 GPU 的系统中,从下拉列表中选择要使用的 GPU,\n或者选择“自动选择”由模拟器决定。 + None + - resolutionLayout - 宽度/高度:\n设置启动游戏时的窗口大小,游戏过程中可以调整。\n这与游戏内的分辨率不同。 + graphicsAdapterGroupBox + 图形设备:\n在具有多个 GPU 的系统中,从下拉列表中选择要使用的 GPU,\n或者选择“自动选择”由模拟器决定。 - heightDivider - Vblank Divider:\n模拟器刷新的帧率会乘以此数字。改变此项可能会导致游戏速度加快,或破坏游戏中不期望此变化的关键功能! + resolutionLayout + 宽度/高度:\n设置启动游戏时的窗口大小,游戏过程中可以调整。\n这与游戏内的分辨率不同。 - dumpShadersCheckBox - 启用着色器转储:\n用于技术调试,在渲染期间将游戏着色器保存到文件夹中。 + heightDivider + Vblank Divider:\n模拟器刷新的帧率会乘以此数字。改变此项可能会导致游戏速度加快,或破坏游戏中不期望此变化的关键功能! - nullGpuCheckBox - 启用 NULL GPU:\n用于技术调试,禁用游戏渲染,就像没有显卡一样。 + dumpShadersCheckBox + 启用着色器转储:\n用于技术调试,在渲染期间将游戏着色器保存到文件夹中。 - gameFoldersBox - 游戏文件夹:\n检查已安装游戏的文件夹列表。 + nullGpuCheckBox + 启用 NULL GPU:\n用于技术调试,禁用游戏渲染,就像没有显卡一样。 - addFolderButton - 添加:\n将文件夹添加到列表。 + enableHDRCheckBox + enableHDRCheckBox - removeFolderButton - 移除:\n从列表中移除文件夹。 + gameFoldersBox + 游戏文件夹:\n检查已安装游戏的文件夹列表。 - debugDump - 启用调试转储:\n将当前正在运行的 PS4 程序的导入和导出符号及文件头信息保存到目录中。 + addFolderButton + 添加:\n将文件夹添加到列表。 - vkValidationCheckBox - 启用 Vulkan 验证层:\n启用一个系统来验证 Vulkan 渲染器的状态并记录其内部状态的信息。\n这将降低性能并可能改变模拟的行为。 + removeFolderButton + 移除:\n从列表中移除文件夹。 - vkSyncValidationCheckBox - 启用 Vulkan 同步验证:\n启用一个系统来验证 Vulkan 渲染任务的时间。\n这将降低性能并可能改变模拟的行为。 + debugDump + 启用调试转储:\n将当前正在运行的 PS4 程序的导入和导出符号及文件头信息保存到目录中。 - rdocCheckBox - 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 + vkValidationCheckBox + 启用 Vulkan 验证层:\n启用一个系统来验证 Vulkan 渲染器的状态并记录其内部状态的信息。\n这将降低性能并可能改变模拟的行为。 - collectShaderCheckBox - 收集着色器:\n您需要启用此功能才能使用调试菜单(Ctrl + F10)编辑着色器。 + vkSyncValidationCheckBox + 启用 Vulkan 同步验证:\n启用一个系统来验证 Vulkan 渲染任务的时间。\n这将降低性能并可能改变模拟的行为。 - crashDiagnosticsCheckBox - 崩溃诊断:\n创建一个包含崩溃时 Vulkan 状态的 .yaml 文件。\n对于调试“Device lost”错误很有用。如果您启用了此功能,您应该同时启用 Host 和 Guest 调试标记。\n此功能在 Intel 显卡上不可用。\n您需要启用 Vulkan 验证层并安装 Vulkan SDK 才能使用此功能。 + rdocCheckBox + 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 - copyGPUBuffersCheckBox - 复制 GPU 缓冲区:\n绕过涉及 GPU 提交的竞态条件。\n对于 PM4 type 0 崩溃可能有帮助,也可能没有帮助。 + collectShaderCheckBox + 收集着色器:\n您需要启用此功能才能使用调试菜单(Ctrl + F10)编辑着色器。 - hostMarkersCheckBox - Host 调试标记:\n在 Vulkan 命令周围插入模拟器端信息,如特定 AMD GPU 命令的标记,以及为资源提供调试名称。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 + crashDiagnosticsCheckBox + 崩溃诊断:\n创建一个包含崩溃时 Vulkan 状态的 .yaml 文件。\n对于调试“Device lost”错误很有用。如果您启用了此功能,您应该同时启用 Host 和 Guest 调试标记。\n此功能在 Intel 显卡上不可用。\n您需要启用 Vulkan 验证层并安装 Vulkan SDK 才能使用此功能。 - guestMarkersCheckBox - Guest 调试标记:\n在命令缓冲区中插入游戏本身添加的任何调试标记。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 + copyGPUBuffersCheckBox + 复制 GPU 缓冲区:\n绕过涉及 GPU 提交的竞态条件。\n对于 PM4 type 0 崩溃可能有帮助,也可能没有帮助。 - saveDataBox - 存档数据路径:\n保存游戏存档数据的目录。 + hostMarkersCheckBox + Host 调试标记:\n在 Vulkan 命令周围插入模拟器端信息,如特定 AMD GPU 命令的标记,以及为资源提供调试名称。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 - browseButton - 浏览:\n选择一个目录保存游戏存档数据。 + guestMarkersCheckBox + Guest 调试标记:\n在命令缓冲区中插入游戏本身添加的任何调试标记。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 - Borderless - + saveDataBox + 存档数据路径:\n保存游戏存档数据的目录。 - True - + browseButton + 浏览:\n选择一个目录保存游戏存档数据。 - Enable HDR - + Borderless + Borderless - Release - + True + True - Nightly - + Release + Release - Set the volume of the background music. - + Nightly + Nightly - Enable Motion Controls - + Set the volume of the background music. + Set the volume of the background music. - Save Data Path - + Enable Motion Controls + Enable Motion Controls - Browse - 浏览 + Save Data Path + Save Data Path - async - + Browse + 浏览 - sync - + async + async - Auto Select - + sync + sync - Directory to install games - 要安装游戏的目录 + Auto Select + Auto Select - Directory to save data - + Directory to install games + 要安装游戏的目录 - enableHDRCheckBox - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - 奖杯查看器 + Trophy Viewer + 奖杯查看器 - + diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index c54eee4c0..d3414f3a4 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -2,1789 +2,1789 @@ - - + + AboutDialog - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - shadPS4 - shadPS4 + shadPS4 + shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 is an experimental open-source emulator for the PlayStation 4. - This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. + This software should not be used to play games you have not legally obtained. - - + + CheatsPatches - Cheats / Patches for - Cheats / Patches for + Cheats / Patches for + Cheats / Patches for - defaultTextEdit_MSG - 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats + defaultTextEdit_MSG + 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats - No Image Available - 沒有可用的圖片 + No Image Available + 沒有可用的圖片 - Serial: - 序號: + Serial: + 序號: - Version: - 版本: + Version: + 版本: - Size: - 大小: + Size: + 大小: - Select Cheat File: - 選擇作弊檔案: + Select Cheat File: + 選擇作弊檔案: - Repository: - 儲存庫: + Repository: + 儲存庫: - Download Cheats - 下載作弊碼 + Download Cheats + 下載作弊碼 - Delete File - 刪除檔案 + Delete File + 刪除檔案 - No files selected. - 沒有選擇檔案。 + No files selected. + 沒有選擇檔案。 - You can delete the cheats you don't want after downloading them. - 您可以在下載後刪除不需要的作弊碼。 + You can delete the cheats you don't want after downloading them. + 您可以在下載後刪除不需要的作弊碼。 - Do you want to delete the selected file?\n%1 - 您是否要刪除選定的檔案?\n%1 + Do you want to delete the selected file?\n%1 + 您是否要刪除選定的檔案?\n%1 - Select Patch File: - 選擇修補檔案: + Select Patch File: + 選擇修補檔案: - Download Patches - 下載修補檔 + Download Patches + 下載修補檔 - Save - 儲存 + Save + 儲存 - Cheats - 作弊碼 + Cheats + 作弊碼 - Patches - 修補檔 + Patches + 修補檔 - Error - 錯誤 + Error + 錯誤 - No patch selected. - 未選擇修補檔。 + No patch selected. + 未選擇修補檔。 - Unable to open files.json for reading. - 無法打開 files.json 進行讀取。 + Unable to open files.json for reading. + 無法打開 files.json 進行讀取。 - No patch file found for the current serial. - 找不到當前序號的修補檔。 + No patch file found for the current serial. + 找不到當前序號的修補檔。 - Unable to open the file for reading. - 無法打開檔案進行讀取。 + Unable to open the file for reading. + 無法打開檔案進行讀取。 - Unable to open the file for writing. - 無法打開檔案進行寫入。 + Unable to open the file for writing. + 無法打開檔案進行寫入。 - Failed to parse XML: - 解析 XML 失敗: + Failed to parse XML: + 解析 XML 失敗: - Success - 成功 + Success + 成功 - Options saved successfully. - 選項已成功儲存。 + Options saved successfully. + 選項已成功儲存。 - Invalid Source - 無效的來源 + Invalid Source + 無效的來源 - The selected source is invalid. - 選擇的來源無效。 + The selected source is invalid. + 選擇的來源無效。 - File Exists - 檔案已存在 + File Exists + 檔案已存在 - File already exists. Do you want to replace it? - 檔案已存在。您是否希望替換它? + File already exists. Do you want to replace it? + 檔案已存在。您是否希望替換它? - Failed to save file: - 無法儲存檔案: + Failed to save file: + 無法儲存檔案: - Failed to download file: - 無法下載檔案: + Failed to download file: + 無法下載檔案: - Cheats Not Found - 未找到作弊碼 + Cheats Not Found + 未找到作弊碼 - CheatsNotFound_MSG - 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 + CheatsNotFound_MSG + 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 - Cheats Downloaded Successfully - 作弊碼下載成功 + Cheats Downloaded Successfully + 作弊碼下載成功 - CheatsDownloadedSuccessfully_MSG - 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 + CheatsDownloadedSuccessfully_MSG + 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 - Failed to save: - 儲存失敗: + Failed to save: + 儲存失敗: - Failed to download: - 下載失敗: + Failed to download: + 下載失敗: - Download Complete - 下載完成 + Download Complete + 下載完成 - DownloadComplete_MSG - 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。 + DownloadComplete_MSG + 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。 - Failed to parse JSON data from HTML. - 無法從 HTML 解析 JSON 數據。 + Failed to parse JSON data from HTML. + 無法從 HTML 解析 JSON 數據。 - Failed to retrieve HTML page. - 無法檢索 HTML 頁面。 + Failed to retrieve HTML page. + 無法檢索 HTML 頁面。 - The game is in version: %1 - 遊戲版本: %1 + The game is in version: %1 + 遊戲版本: %1 - The downloaded patch only works on version: %1 - 下載的補丁僅適用於版本: %1 + The downloaded patch only works on version: %1 + 下載的補丁僅適用於版本: %1 - You may need to update your game. - 您可能需要更新遊戲。 + You may need to update your game. + 您可能需要更新遊戲。 - Incompatibility Notice - 不相容通知 + Incompatibility Notice + 不相容通知 - Failed to open file: - 無法打開檔案: + Failed to open file: + 無法打開檔案: - XML ERROR: - XML 錯誤: + XML ERROR: + XML 錯誤: - Failed to open files.json for writing - 無法打開 files.json 進行寫入 + Failed to open files.json for writing + 無法打開 files.json 進行寫入 - Author: - 作者: + Author: + 作者: - Directory does not exist: - 目錄不存在: + Directory does not exist: + 目錄不存在: - Failed to open files.json for reading. - 無法打開 files.json 進行讀取。 + Failed to open files.json for reading. + 無法打開 files.json 進行讀取。 - Name: - 名稱: + Name: + 名稱: - Can't apply cheats before the game is started - 在遊戲開始之前無法應用作弊。 + Can't apply cheats before the game is started + 在遊戲開始之前無法應用作弊。 - Close - 關閉 + Close + 關閉 - - + + CheckUpdate - Auto Updater - 自動更新程式 + Auto Updater + 自動更新程式 - Error - 錯誤 + Error + 錯誤 - Network error: - 網路錯誤: + Network error: + 網路錯誤: - Error_Github_limit_MSG - 自動更新程式每小時最多允許 60 次更新檢查。\n您已達到此限制。請稍後再試。 + Error_Github_limit_MSG + 自動更新程式每小時最多允許 60 次更新檢查。\n您已達到此限制。請稍後再試。 - Failed to parse update information. - 無法解析更新資訊。 + Failed to parse update information. + 無法解析更新資訊。 - No pre-releases found. - 未找到預發布版本。 + No pre-releases found. + 未找到預發布版本。 - Invalid release data. - 無效的發行數據。 + Invalid release data. + 無效的發行數據。 - No download URL found for the specified asset. - 未找到指定資產的下載 URL。 + No download URL found for the specified asset. + 未找到指定資產的下載 URL。 - Your version is already up to date! - 您的版本已經是最新的! + Your version is already up to date! + 您的版本已經是最新的! - Update Available - 可用更新 + Update Available + 可用更新 - Update Channel - 更新頻道 + Update Channel + 更新頻道 - Current Version - 當前版本 + Current Version + 當前版本 - Latest Version - 最新版本 + Latest Version + 最新版本 - Do you want to update? - 您想要更新嗎? + Do you want to update? + 您想要更新嗎? - Show Changelog - 顯示變更日誌 + Show Changelog + 顯示變更日誌 - Check for Updates at Startup - 啟動時檢查更新 + Check for Updates at Startup + 啟動時檢查更新 - Update - 更新 + Update + 更新 - No - + No + - Hide Changelog - 隱藏變更日誌 + Hide Changelog + 隱藏變更日誌 - Changes - 變更 + Changes + 變更 - Network error occurred while trying to access the URL - 嘗試訪問 URL 時發生網路錯誤 + Network error occurred while trying to access the URL + 嘗試訪問 URL 時發生網路錯誤 - Download Complete - 下載完成 + Download Complete + 下載完成 - The update has been downloaded, press OK to install. - 更新已下載,按 OK 安裝。 + The update has been downloaded, press OK to install. + 更新已下載,按 OK 安裝。 - Failed to save the update file at - 無法將更新文件保存到 + Failed to save the update file at + 無法將更新文件保存到 - Starting Update... - 正在開始更新... + Starting Update... + 正在開始更新... - Failed to create the update script file - 無法創建更新腳本文件 + Failed to create the update script file + 無法創建更新腳本文件 - - + + CompatibilityInfoClass - Fetching compatibility data, please wait - 正在取得相容性資料,請稍候 + Fetching compatibility data, please wait + 正在取得相容性資料,請稍候 - Cancel - 取消 + Cancel + 取消 - Loading... - 載入中... + Loading... + 載入中... - Error - 錯誤 + Error + 錯誤 - Unable to update compatibility data! Try again later. - 無法更新相容性資料!請稍後再試。 + Unable to update compatibility data! Try again later. + 無法更新相容性資料!請稍後再試。 - Unable to open compatibility_data.json for writing. - 無法開啟 compatibility_data.json 進行寫入。 + Unable to open compatibility_data.json for writing. + 無法開啟 compatibility_data.json 進行寫入。 - Unknown - 未知 + Unknown + 未知 - Nothing - + Nothing + - Boots - 靴子 + Boots + 靴子 - Menus - 選單 + Menus + 選單 - Ingame - 遊戲內 + Ingame + 遊戲內 - Playable - 可玩 + Playable + 可玩 - - + + ControlSettings - Configure Controls - + Configure Controls + Configure Controls - Control Settings - + Control Settings + Control Settings - D-Pad - + D-Pad + D-Pad - Up - + Up + Up - Left - + Left + Left - Right - + Right + Right - Down - + Down + Down - Left Stick Deadzone (def:2 max:127) - + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) - Left Deadzone - + Left Deadzone + Left Deadzone - Left Stick - + Left Stick + Left Stick - Config Selection - + Config Selection + Config Selection - Common Config - + Common Config + Common Config - Use per-game configs - + Use per-game configs + Use per-game configs - L1 / LB - + L1 / LB + L1 / LB - L2 / LT - + L2 / LT + L2 / LT - KBM Controls - + KBM Controls + KBM Controls - KBM Editor - + KBM Editor + KBM Editor - Back - + Back + Back - R1 / RB - + R1 / RB + R1 / RB - R2 / RT - + R2 / RT + R2 / RT - L3 - + L3 + L3 - Options / Start - + Options / Start + Options / Start - R3 - + R3 + R3 - Face Buttons - + Face Buttons + Face Buttons - Triangle / Y - + Triangle / Y + Triangle / Y - Square / X - + Square / X + Square / X - Circle / B - + Circle / B + Circle / B - Cross / A - + Cross / A + Cross / A - Right Stick Deadzone (def:2, max:127) - + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) - Right Deadzone - + Right Deadzone + Right Deadzone - Right Stick - + Right Stick + Right Stick - - + + ElfViewer - Open Folder - Open Folder + Open Folder + Open Folder - - + + GameInfoClass - Loading game list, please wait :3 - Loading game list, please wait :3 + Loading game list, please wait :3 + Loading game list, please wait :3 - Cancel - Cancel + Cancel + Cancel - Loading... - Loading... + Loading... + Loading... - - + + GameInstallDialog - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Directory to install games - Directory to install games + Directory to install games + Directory to install games - Browse - Browse + Browse + Browse - Error - Error + Error + Error - Directory to install DLC - + Directory to install DLC + Directory to install DLC - - + + GameListFrame - Icon - 圖示 + Icon + 圖示 - Name - 名稱 + Name + 名稱 - Serial - 序號 + Serial + 序號 - Compatibility - Compatibility + Compatibility + Compatibility - Region - 區域 + Region + 區域 - Firmware - 固件 + Firmware + 固件 - Size - 大小 + Size + 大小 - Version - 版本 + Version + 版本 - Path - 路徑 + Path + 路徑 - Play Time - 遊玩時間 + Play Time + 遊玩時間 - Never Played - Never Played + Never Played + Never Played - h - h + h + h - m - m + m + m - s - s + s + s - Compatibility is untested - Compatibility is untested + Compatibility is untested + Compatibility is untested - Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator - Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen - Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu - Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance - Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches - Click to see details on github - 點擊查看 GitHub 上的詳細資訊 + Click to see details on github + 點擊查看 GitHub 上的詳細資訊 - Last updated - 最後更新 + Last updated + 最後更新 - - + + GameListUtils - B - B + B + B - KB - KB + KB + KB - MB - MB + MB + MB - GB - GB + GB + GB - TB - TB + TB + TB - - + + GuiContextMenus - Create Shortcut - Create Shortcut + Create Shortcut + Create Shortcut - Cheats / Patches - Zuòbì / Xiūbǔ chéngshì + Cheats / Patches + Zuòbì / Xiūbǔ chéngshì - SFO Viewer - SFO Viewer + SFO Viewer + SFO Viewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - Open Folder... - 打開資料夾... + Open Folder... + 打開資料夾... - Open Game Folder - 打開遊戲資料夾 + Open Game Folder + 打開遊戲資料夾 - Open Save Data Folder - 打開存檔資料夾 + Open Save Data Folder + 打開存檔資料夾 - Open Log Folder - 打開日誌資料夾 + Open Log Folder + 打開日誌資料夾 - Copy info... - Copy info... + Copy info... + Copy info... - Copy Name - Copy Name + Copy Name + Copy Name - Copy Serial - Copy Serial + Copy Serial + Copy Serial - Copy All - Copy All + Copy Version + Copy Version - Delete... - Delete... + Copy Size + Copy Size - Delete Game - Delete Game + Copy All + Copy All - Delete Update - Delete Update + Delete... + Delete... - Delete DLC - Delete DLC + Delete Game + Delete Game - Compatibility... - Compatibility... + Delete Update + Delete Update - Update database - Update database + Delete DLC + Delete DLC - View report - View report + Compatibility... + Compatibility... - Submit a report - Submit a report + Update database + Update database - Shortcut creation - Shortcut creation + View report + View report - Shortcut created successfully! - Shortcut created successfully! + Submit a report + Submit a report - Error - Error + Shortcut creation + Shortcut creation - Error creating shortcut! - Error creating shortcut! + Shortcut created successfully! + Shortcut created successfully! - Install PKG - Install PKG + Error + Error - Game - Game + Error creating shortcut! + Error creating shortcut! - This game has no update to delete! - This game has no update to delete! + Install PKG + Install PKG - Update - Update + Game + Game - This game has no DLC to delete! - This game has no DLC to delete! + This game has no update to delete! + This game has no update to delete! - DLC - DLC + Update + Update - Delete %1 - Delete %1 + This game has no DLC to delete! + This game has no DLC to delete! - Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + DLC + DLC - Open Update Folder - + Delete %1 + Delete %1 - Copy Version - + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? - Copy Size - + Open Update Folder + Open Update Folder - Delete Save Data - + Delete Save Data + Delete Save Data - This game has no update folder to open! - + This game has no update folder to open! + This game has no update folder to open! - Failed to convert icon. - + Failed to convert icon. + Failed to convert icon. - This game has no save data to delete! - + This game has no save data to delete! + This game has no save data to delete! - Save Data - + Save Data + Save Data - - + + InstallDirSelect - shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Choose directory + shadPS4 - Choose directory - Select which directory you want to install to. - Select which directory you want to install to. + Select which directory you want to install to. + Select which directory you want to install to. - Install All Queued to Selected Folder - + Install All Queued to Selected Folder + Install All Queued to Selected Folder - Delete PKG File on Install - + Delete PKG File on Install + Delete PKG File on Install - - + + MainWindow - Open/Add Elf Folder - Open/Add Elf Folder + Open/Add Elf Folder + Open/Add Elf Folder - Install Packages (PKG) - Install Packages (PKG) + Install Packages (PKG) + Install Packages (PKG) - Boot Game - Boot Game + Boot Game + Boot Game - Check for Updates - 檢查更新 + Check for Updates + 檢查更新 - About shadPS4 - About shadPS4 + About shadPS4 + About shadPS4 - Configure... - Configure... + Configure... + Configure... - Install application from a .pkg file - Install application from a .pkg file + Install application from a .pkg file + Install application from a .pkg file - Recent Games - Recent Games + Recent Games + Recent Games - Open shadPS4 Folder - Open shadPS4 Folder + Open shadPS4 Folder + Open shadPS4 Folder - Exit - Exit + Exit + Exit - Exit shadPS4 - Exit shadPS4 + Exit shadPS4 + Exit shadPS4 - Exit the application. - Exit the application. + Exit the application. + Exit the application. - Show Game List - Show Game List + Show Game List + Show Game List - Game List Refresh - Game List Refresh + Game List Refresh + Game List Refresh - Tiny - Tiny + Tiny + Tiny - Small - Small + Small + Small - Medium - Medium + Medium + Medium - Large - Large + Large + Large - List View - List View + List View + List View - Grid View - Grid View + Grid View + Grid View - Elf Viewer - Elf Viewer + Elf Viewer + Elf Viewer - Game Install Directory - Game Install Directory + Game Install Directory + Game Install Directory - Download Cheats/Patches - Xiàzài Zuòbì / Xiūbǔ chéngshì + Download Cheats/Patches + Xiàzài Zuòbì / Xiūbǔ chéngshì - Dump Game List - Dump Game List + Dump Game List + Dump Game List - PKG Viewer - PKG Viewer + PKG Viewer + PKG Viewer - Search... - Search... + Search... + Search... - File - File + File + File - View - View + View + View - Game List Icons - Game List Icons + Game List Icons + Game List Icons - Game List Mode - Game List Mode + Game List Mode + Game List Mode - Settings - Settings + Settings + Settings - Utils - Utils + Utils + Utils - Themes - Themes + Themes + Themes - Help - 幫助 + Help + 幫助 - Dark - Dark + Dark + Dark - Light - Light + Light + Light - Green - Green + Green + Green - Blue - Blue + Blue + Blue - Violet - Violet + Violet + Violet - toolBar - toolBar + toolBar + toolBar - Game List - 遊戲列表 + Game List + 遊戲列表 - * Unsupported Vulkan Version - * 不支援的 Vulkan 版本 + * Unsupported Vulkan Version + * 不支援的 Vulkan 版本 - Download Cheats For All Installed Games - 下載所有已安裝遊戲的作弊碼 + Download Cheats For All Installed Games + 下載所有已安裝遊戲的作弊碼 - Download Patches For All Games - 下載所有遊戲的修補檔 + Download Patches For All Games + 下載所有遊戲的修補檔 - Download Complete - 下載完成 + Download Complete + 下載完成 - You have downloaded cheats for all the games you have installed. - 您已經下載了所有已安裝遊戲的作弊碼。 + You have downloaded cheats for all the games you have installed. + 您已經下載了所有已安裝遊戲的作弊碼。 - Patches Downloaded Successfully! - 修補檔下載成功! + Patches Downloaded Successfully! + 修補檔下載成功! - All Patches available for all games have been downloaded. - 所有遊戲的修補檔已經下載完成。 + All Patches available for all games have been downloaded. + 所有遊戲的修補檔已經下載完成。 - Games: - 遊戲: + Games: + 遊戲: - ELF files (*.bin *.elf *.oelf) - ELF 檔案 (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + ELF 檔案 (*.bin *.elf *.oelf) - Game Boot - 遊戲啟動 + Game Boot + 遊戲啟動 - Only one file can be selected! - 只能選擇一個檔案! + Only one file can be selected! + 只能選擇一個檔案! - PKG Extraction - PKG 解壓縮 + PKG Extraction + PKG 解壓縮 - Patch detected! - 檢測到補丁! + Patch detected! + 檢測到補丁! - PKG and Game versions match: - PKG 和遊戲版本匹配: + PKG and Game versions match: + PKG 和遊戲版本匹配: - Would you like to overwrite? - 您想要覆蓋嗎? + Would you like to overwrite? + 您想要覆蓋嗎? - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安裝版本更舊: + PKG Version %1 is older than installed version: + PKG 版本 %1 比已安裝版本更舊: - Game is installed: - 遊戲已安裝: + Game is installed: + 遊戲已安裝: - Would you like to install Patch: - 您想要安裝補丁嗎: + Would you like to install Patch: + 您想要安裝補丁嗎: - DLC Installation - DLC 安裝 + DLC Installation + DLC 安裝 - Would you like to install DLC: %1? - 您想要安裝 DLC: %1 嗎? + Would you like to install DLC: %1? + 您想要安裝 DLC: %1 嗎? - DLC already installed: - DLC 已經安裝: + DLC already installed: + DLC 已經安裝: - Game already installed - 遊戲已經安裝 + Game already installed + 遊戲已經安裝 - PKG ERROR - PKG 錯誤 + PKG ERROR + PKG 錯誤 - Extracting PKG %1/%2 - 正在解壓縮 PKG %1/%2 + Extracting PKG %1/%2 + 正在解壓縮 PKG %1/%2 - Extraction Finished - 解壓縮完成 + Extraction Finished + 解壓縮完成 - Game successfully installed at %1 - 遊戲成功安裝於 %1 + Game successfully installed at %1 + 遊戲成功安裝於 %1 - File doesn't appear to be a valid PKG file - 檔案似乎不是有效的 PKG 檔案 + File doesn't appear to be a valid PKG file + 檔案似乎不是有效的 PKG 檔案 - Run Game - + Run Game + Run Game - Eboot.bin file not found - + Eboot.bin file not found + Eboot.bin file not found - PKG File (*.PKG *.pkg) - + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) - PKG is a patch or DLC, please install the game first! - + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! - Game is already running! - + Game is already running! + Game is already running! - shadPS4 - shadPS4 + shadPS4 + shadPS4 - - + + PKGViewer - Open Folder - Open Folder + Open Folder + Open Folder - Name - 名稱 + PKG ERROR + PKG 錯誤 - Serial - 序號 + Name + 名稱 - Installed - + Serial + 序號 - Size - 大小 + Installed + Installed - Category - + Size + 大小 - Type - + Category + Category - App Ver - + Type + Type - FW - + App Ver + App Ver - Region - 區域 + FW + FW - Flags - + Region + 區域 - Path - 路徑 + Flags + Flags - File - File + Path + 路徑 - PKG ERROR - PKG 錯誤 + File + File - Unknown - 未知 + Unknown + 未知 - Package - + Package + Package - - + + SettingsDialog - Settings - Settings + Settings + Settings - General - General + General + General - System - System + System + System - Console Language - Console Language + Console Language + Console Language - Emulator Language - Emulator Language + Emulator Language + Emulator Language - Emulator - Emulator + Emulator + Emulator - Enable Fullscreen - Enable Fullscreen + Enable Fullscreen + Enable Fullscreen - Fullscreen Mode - 全螢幕模式 + Fullscreen Mode + 全螢幕模式 - Enable Separate Update Folder - Enable Separate Update Folder + Enable Separate Update Folder + Enable Separate Update Folder - Default tab when opening settings - 打開設置時的默認選項卡 + Default tab when opening settings + 打開設置時的默認選項卡 - Show Game Size In List - 顯示遊戲大小在列表中 + Show Game Size In List + 顯示遊戲大小在列表中 - Show Splash - Show Splash + Show Splash + Show Splash - Enable Discord Rich Presence - 啟用 Discord Rich Presence + Enable Discord Rich Presence + 啟用 Discord Rich Presence - Username - Username + Username + Username - Trophy Key - Trophy Key + Trophy Key + Trophy Key - Trophy - Trophy + Trophy + Trophy - Logger - Logger + Logger + Logger - Log Type - Log Type + Log Type + Log Type - Log Filter - Log Filter + Log Filter + Log Filter - Open Log Location - 開啟日誌位置 + Open Log Location + 開啟日誌位置 - Input - 輸入 + Input + 輸入 - Cursor - 游標 + Cursor + 游標 - Hide Cursor - 隱藏游標 + Hide Cursor + 隱藏游標 - Hide Cursor Idle Timeout - 游標空閒超時隱藏 + Hide Cursor Idle Timeout + 游標空閒超時隱藏 - s - s + s + s - Controller - 控制器 + Controller + 控制器 - Back Button Behavior - 返回按鈕行為 + Back Button Behavior + 返回按鈕行為 - Graphics - Graphics + Graphics + Graphics - GUI - 介面 + GUI + 介面 - User - 使用者 + User + 使用者 - Graphics Device - Graphics Device + Graphics Device + Graphics Device - Width - Width + Width + Width - Height - Height + Height + Height - Vblank Divider - Vblank Divider + Vblank Divider + Vblank Divider - Advanced - Advanced + Advanced + Advanced - Enable Shaders Dumping - Enable Shaders Dumping + Enable Shaders Dumping + Enable Shaders Dumping - Enable NULL GPU - Enable NULL GPU + Enable NULL GPU + Enable NULL GPU - Paths - 路徑 + Enable HDR + Enable HDR - Game Folders - 遊戲資料夾 + Paths + 路徑 - Add... - 添加... + Game Folders + 遊戲資料夾 - Remove - 刪除 + Add... + 添加... - Debug - Debug + Remove + 刪除 - Enable Debug Dumping - Enable Debug Dumping + Debug + Debug - Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Enable Debug Dumping + Enable Debug Dumping - Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers - Enable RenderDoc Debugging - Enable RenderDoc Debugging + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation - Enable Crash Diagnostics - Enable Crash Diagnostics + Enable RenderDoc Debugging + Enable RenderDoc Debugging - Collect Shaders - Collect Shaders + Enable Crash Diagnostics + Enable Crash Diagnostics - Copy GPU Buffers - Copy GPU Buffers + Collect Shaders + Collect Shaders - Host Debug Markers - Host Debug Markers + Copy GPU Buffers + Copy GPU Buffers - Guest Debug Markers - Guest Debug Markers + Host Debug Markers + Host Debug Markers - Update - 更新 + Guest Debug Markers + Guest Debug Markers - Check for Updates at Startup - 啟動時檢查更新 + Update + 更新 - Always Show Changelog - 始終顯示變更紀錄 + Check for Updates at Startup + 啟動時檢查更新 - Update Channel - 更新頻道 + Always Show Changelog + 始終顯示變更紀錄 - Check for Updates - 檢查更新 + Update Channel + 更新頻道 - GUI Settings - 介面設置 + Check for Updates + 檢查更新 - Title Music - Title Music + GUI Settings + 介面設置 - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Title Music + Title Music - Play title music - 播放標題音樂 + Disable Trophy Pop-ups + Disable Trophy Pop-ups - Update Compatibility Database On Startup - Update Compatibility Database On Startup + Background Image + Background Image - Game Compatibility - Game Compatibility + Show Background Image + Show Background Image - Display Compatibility Data - Display Compatibility Data + Opacity + Opacity - Update Compatibility Database - Update Compatibility Database + Play title music + 播放標題音樂 - Volume - 音量 + Update Compatibility Database On Startup + Update Compatibility Database On Startup - Save - 儲存 + Game Compatibility + Game Compatibility - Apply - 應用 + Display Compatibility Data + Display Compatibility Data - Restore Defaults - 還原預設值 + Update Compatibility Database + Update Compatibility Database - Close - 關閉 + Volume + 音量 - Point your mouse at an option to display its description. - 將鼠標指向選項以顯示其描述。 + Save + 儲存 - consoleLanguageGroupBox - 主機語言:\n設定PS4遊戲使用的語言。\n建議將其設置為遊戲支持的語言,這會因地區而異。 + Apply + 應用 - emulatorLanguageGroupBox - 模擬器語言:\n設定模擬器的用戶介面的語言。 + Restore Defaults + 還原預設值 - fullscreenCheckBox - 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 + Close + 關閉 - separateUpdatesCheckBox - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Point your mouse at an option to display its description. + 將鼠標指向選項以顯示其描述。 - showSplashCheckBox - 顯示啟動畫面:\n在遊戲啟動時顯示遊戲的啟動畫面(特殊圖片)。 + consoleLanguageGroupBox + 主機語言:\n設定PS4遊戲使用的語言。\n建議將其設置為遊戲支持的語言,這會因地區而異。 - discordRPCCheckbox - 啟用 Discord Rich Presence:\n在您的 Discord 個人檔案上顯示模擬器圖標和相關信息。 + emulatorLanguageGroupBox + 模擬器語言:\n設定模擬器的用戶介面的語言。 - userName - 用戶名:\n設定PS4帳號的用戶名,某些遊戲中可能會顯示。 + fullscreenCheckBox + 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 - TrophyKey - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - logTypeGroupBox - 日誌類型:\n設定是否同步日誌窗口的輸出以提高性能。可能對模擬產生不良影響。 + showSplashCheckBox + 顯示啟動畫面:\n在遊戲啟動時顯示遊戲的啟動畫面(特殊圖片)。 - logFilter - 日誌過濾器:\n過濾日誌以僅打印特定信息。\n範例:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - 以此順序,特定級別靜音所有前面的級別,並記錄其後的每個級別。 + discordRPCCheckbox + 啟用 Discord Rich Presence:\n在您的 Discord 個人檔案上顯示模擬器圖標和相關信息。 - updaterGroupBox - 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 + userName + 用戶名:\n設定PS4帳號的用戶名,某些遊戲中可能會顯示。 - GUIMusicGroupBox - 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 + TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - disableTrophycheckBox - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + logTypeGroupBox + 日誌類型:\n設定是否同步日誌窗口的輸出以提高性能。可能對模擬產生不良影響。 - hideCursorGroupBox - 隱藏游標:\n選擇游標何時消失:\n從不: 您將始終看到滑鼠。\n閒置: 設定在閒置後消失的時間。\n始終: 您將永遠看不到滑鼠。 + logFilter + 日誌過濾器:\n過濾日誌以僅打印特定信息。\n範例:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - 以此順序,特定級別靜音所有前面的級別,並記錄其後的每個級別。 - idleTimeoutGroupBox - 設定滑鼠在閒置後消失的時間。 + updaterGroupBox + 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 - backButtonBehaviorGroupBox - 返回按鈕行為:\n設定控制器的返回按鈕模擬在 PS4 觸控板上指定位置的觸碰。 + GUIBackgroundImageGroupBox + GUIBackgroundImageGroupBox - enableCompatibilityCheckBox - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + GUIMusicGroupBox + 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 - checkCompatibilityOnStartupCheckBox - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - updateCompatibilityButton - Update Compatibility Database:\nImmediately update the compatibility database. + hideCursorGroupBox + 隱藏游標:\n選擇游標何時消失:\n從不: 您將始終看到滑鼠。\n閒置: 設定在閒置後消失的時間。\n始終: 您將永遠看不到滑鼠。 - Never - 從不 + idleTimeoutGroupBox + 設定滑鼠在閒置後消失的時間。 - Idle - 閒置 + backButtonBehaviorGroupBox + 返回按鈕行為:\n設定控制器的返回按鈕模擬在 PS4 觸控板上指定位置的觸碰。 - Always - 始終 + enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Touchpad Left - 觸控板左側 + checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Touchpad Right - 觸控板右側 + updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. - Touchpad Center - 觸控板中間 + Never + 從不 - None - + Idle + 閒置 - graphicsAdapterGroupBox - 圖形設備:\n在多GPU系統中,從下拉列表中選擇模擬器將使用的GPU,\n或選擇「自動選擇」以自動確定。 + Always + 始終 - resolutionLayout - 寬度/高度:\n設定模擬器啟動時的窗口大小,可以在遊戲過程中調整。\n這與遊戲內解析度不同。 + Touchpad Left + 觸控板左側 - heightDivider - Vblank分隔符:\n模擬器的幀速率將乘以這個數字。更改此數字可能會有不良影響,例如增加遊戲速度,或破壞不預期此變化的關鍵遊戲功能! + Touchpad Right + 觸控板右側 - dumpShadersCheckBox - 啟用著色器轉儲:\n為了技術調試,將遊戲的著色器在渲染時保存到文件夾中。 + Touchpad Center + 觸控板中間 - nullGpuCheckBox - 啟用空GPU:\n為了技術調試,禁用遊戲渲染,彷彿沒有顯示卡。 + None + - gameFoldersBox - 遊戲資料夾:\n檢查已安裝遊戲的資料夾列表。 + graphicsAdapterGroupBox + 圖形設備:\n在多GPU系統中,從下拉列表中選擇模擬器將使用的GPU,\n或選擇「自動選擇」以自動確定。 - addFolderButton - 添加:\n將資料夾添加到列表。 + resolutionLayout + 寬度/高度:\n設定模擬器啟動時的窗口大小,可以在遊戲過程中調整。\n這與遊戲內解析度不同。 - removeFolderButton - 移除:\n從列表中移除資料夾。 + heightDivider + Vblank分隔符:\n模擬器的幀速率將乘以這個數字。更改此數字可能會有不良影響,例如增加遊戲速度,或破壞不預期此變化的關鍵遊戲功能! - debugDump - 啟用調試轉儲:\n將當前運行的PS4程序的輸入和輸出符號及文件頭信息保存到目錄中。 + dumpShadersCheckBox + 啟用著色器轉儲:\n為了技術調試,將遊戲的著色器在渲染時保存到文件夾中。 - vkValidationCheckBox - 啟用Vulkan驗證層:\n啟用一個系統來驗證Vulkan渲染器的狀態並記錄其內部狀態的信息。這將降低性能並可能改變模擬行為。 + nullGpuCheckBox + 啟用空GPU:\n為了技術調試,禁用遊戲渲染,彷彿沒有顯示卡。 - vkSyncValidationCheckBox - 啟用Vulkan同步驗證:\n啟用一個系統來驗證Vulkan渲染任務的時間。這將降低性能並可能改變模擬行為。 + enableHDRCheckBox + enableHDRCheckBox - rdocCheckBox - 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 + gameFoldersBox + 遊戲資料夾:\n檢查已安裝遊戲的資料夾列表。 - collectShaderCheckBox - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + addFolderButton + 添加:\n將資料夾添加到列表。 - crashDiagnosticsCheckBox - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + removeFolderButton + 移除:\n從列表中移除資料夾。 - copyGPUBuffersCheckBox - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + debugDump + 啟用調試轉儲:\n將當前運行的PS4程序的輸入和輸出符號及文件頭信息保存到目錄中。 - hostMarkersCheckBox - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkValidationCheckBox + 啟用Vulkan驗證層:\n啟用一個系統來驗證Vulkan渲染器的狀態並記錄其內部狀態的信息。這將降低性能並可能改變模擬行為。 - guestMarkersCheckBox - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + vkSyncValidationCheckBox + 啟用Vulkan同步驗證:\n啟用一個系統來驗證Vulkan渲染任務的時間。這將降低性能並可能改變模擬行為。 - Borderless - + rdocCheckBox + 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 - True - + collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Enable HDR - + crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Release - + copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Nightly - + hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Background Image - + guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Show Background Image - + saveDataBox + saveDataBox - Opacity - + browseButton + browseButton - Set the volume of the background music. - + Borderless + Borderless - Enable Motion Controls - + True + True - Save Data Path - + Release + Release - Browse - Browse + Nightly + Nightly - async - + Set the volume of the background music. + Set the volume of the background music. - sync - + Enable Motion Controls + Enable Motion Controls - Auto Select - + Save Data Path + Save Data Path - Directory to install games - Directory to install games + Browse + Browse - Directory to save data - + async + async - GUIBackgroundImageGroupBox - + sync + sync - enableHDRCheckBox - + Auto Select + Auto Select - saveDataBox - + Directory to install games + Directory to install games - browseButton - + Directory to save data + Directory to save data - - + + TrophyViewer - Trophy Viewer - Trophy Viewer + Trophy Viewer + Trophy Viewer - + From 1e7f651b1baf8273c6a20af65e535b4bc97aa7b5 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 13 Feb 2025 15:50:55 +0200 Subject: [PATCH 275/455] Auto update of english translation file based on sources (#2349) * added auto-translation action * made scripts executable * reuse * no-obsolete - reuse (#2392) * other languages - reuse * no-obsolete see everything that is 'vanished', because it does not exist * Update update_translation.sh * + --------- Co-authored-by: DanielSvoboda --- .../workflows/scripts/update_translation.sh | 11 +++++++ .github/workflows/update_translation.yml | 31 +++++++++++++++++++ REUSE.toml | 3 ++ src/qt_gui/translations/update_translation.sh | 13 ++++++++ 4 files changed, 58 insertions(+) create mode 100755 .github/workflows/scripts/update_translation.sh create mode 100644 .github/workflows/update_translation.yml create mode 100755 src/qt_gui/translations/update_translation.sh diff --git a/.github/workflows/scripts/update_translation.sh b/.github/workflows/scripts/update_translation.sh new file mode 100755 index 000000000..6b8c76d22 --- /dev/null +++ b/.github/workflows/scripts/update_translation.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -e + +sudo apt-get -y install qt6-l10n-tools python3 + +SCRIPT_PATH="src/qt_gui/translations/update_translation.sh" + +chmod +x "$SCRIPT_PATH" + +PATH=/usr/lib/qt6/bin:$PATH "$SCRIPT_PATH" \ No newline at end of file diff --git a/.github/workflows/update_translation.yml b/.github/workflows/update_translation.yml new file mode 100644 index 000000000..06564d175 --- /dev/null +++ b/.github/workflows/update_translation.yml @@ -0,0 +1,31 @@ +name: Update Translation + +on: + schedule: + - cron: "0 0 * * *" # Every day at 12am UTC. + workflow_dispatch: # As well as manually. + +jobs: + update: + if: github.repository == 'shadps4-emu/shadPS4' + name: "Update Translation" + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Set execution permissions for the script + run: chmod +x ./.github/workflows/scripts/update_translation.sh + + - name: Update Base Translation + run: ./.github/workflows/scripts/update_translation.sh + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + with: + title: "Qt GUI: Update Translation" + commit-message: "[ci skip] Qt GUI: Update Translation." + committer: "shadPS4 Bot " + author: "shadPS4 Bot " + body: "Daily update of translation sources." + branch: update-translation + delete-branch: true \ No newline at end of file diff --git a/REUSE.toml b/REUSE.toml index 3c5a0dc59..dc5149e8f 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -7,6 +7,8 @@ path = [ "CMakeSettings.json", ".github/FUNDING.yml", ".github/shadps4.png", + ".github/workflows/scripts/update_translation.sh", + ".github/workflows/update_translation.yml", ".gitmodules", "dist/MacOSBundleInfo.plist.in", "dist/net.shadps4.shadPS4.desktop", @@ -53,6 +55,7 @@ path = [ "src/images/website.png", "src/shadps4.qrc", "src/shadps4.rc", + "src/qt_gui/translations/update_translation.sh", ] precedence = "aggregate" SPDX-FileCopyrightText = "shadPS4 Emulator Project" diff --git a/src/qt_gui/translations/update_translation.sh b/src/qt_gui/translations/update_translation.sh new file mode 100755 index 000000000..e1f70b993 --- /dev/null +++ b/src/qt_gui/translations/update_translation.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") + +OPTS="-tr-function-alias QT_TRANSLATE_NOOP+=TRANSLATE,QT_TRANSLATE_NOOP+=TRANSLATE_SV,QT_TRANSLATE_NOOP+=TRANSLATE_STR,QT_TRANSLATE_NOOP+=TRANSLATE_FS,QT_TRANSLATE_N_NOOP3+=TRANSLATE_FMT,QT_TRANSLATE_NOOP+=TRANSLATE_NOOP,translate+=TRANSLATE_PLURAL_STR,translate+=TRANSLATE_PLURAL_FS -no-obsolete" +SRCDIRS=$(realpath "$SCRIPTDIR/..")/\ $(realpath "$SCRIPTDIR/../..")/ +OUTDIR=$(realpath "$SCRIPTDIR") + +lupdate $SRCDIRS $OPTS -locations none -source-language en_US -ts "$OUTDIR/en_US.ts" + +if ! head -n 2 "$OUTDIR/en_US.ts" | grep -q "SPDX-FileCopyrightText"; then + sed -i '2i\' "$OUTDIR/en_US.ts" +fi From b2fb004414c779a0b36ec2940f2e2ae82b924f7a Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 13 Feb 2025 16:13:33 +0200 Subject: [PATCH 276/455] Update README.md with crowdin link --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 97e3ab383..523eb1d90 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,9 @@ Logo is done by [**Xphalnos**](https://github.com/Xphalnos) If you want to contribute, please look the [**CONTRIBUTING.md**](https://github.com/shadps4-emu/shadPS4/blob/main/CONTRIBUTING.md) file.\ Open a PR and we'll check it :) +# Translations + +If you want to translate shadPS4 to your language we use [**crowdin**](https://crowdin.com/project/shadps4-emulator). # Contributors
From 455b23c6f1caab3d43c1510277ed2d8506c08cda Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Thu, 13 Feb 2025 08:29:26 -0600 Subject: [PATCH 277/455] Update video_out.cpp (#2416) --- src/core/libraries/videoout/video_out.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 090ed8624..91616a5ae 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -199,10 +199,15 @@ int PS4_SYSV_ABI sceVideoOutGetEventData(const Kernel::SceKernelEvent* ev, int64 return ORBIS_VIDEO_OUT_ERROR_INVALID_ADDRESS; } if (ev->filter != Kernel::SceKernelEvent::Filter::VideoOut) { - return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT_QUEUE; + return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT; } - *data = ev->data; + auto event_data = ev->data >> 0x10; + if (ev->ident != static_cast(OrbisVideoOutInternalEventId::Flip) || ev->data == 0) { + *data = event_data; + } else { + *data = event_data | 0xFFFF000000000000; + } return ORBIS_OK; } From 3634026436e7945ebe5cf60867f0b222a98f2c94 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Thu, 13 Feb 2025 14:54:50 -0300 Subject: [PATCH 278/455] Standard language fix (#2420) * Standard language fix * + --- src/common/config.cpp | 6 +++--- src/qt_gui/settings_dialog.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 048571a5a..b61f92043 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -96,7 +96,7 @@ u32 m_window_size_H = 720; std::vector m_pkg_viewer; std::vector m_elf_viewer; std::vector m_recent_files; -std::string emulator_language = "en"; +std::string emulator_language = "en_US"; static int backgroundImageOpacity = 50; static bool showBackgroundImage = true; @@ -768,7 +768,7 @@ void load(const std::filesystem::path& path) { m_elf_viewer = toml::find_or>(gui, "elfDirs", {}); m_recent_files = toml::find_or>(gui, "recentFiles", {}); m_table_mode = toml::find_or(gui, "gameTableMode", 0); - emulator_language = toml::find_or(gui, "emulatorLanguage", "en"); + emulator_language = toml::find_or(gui, "emulatorLanguage", "en_US"); backgroundImageOpacity = toml::find_or(gui, "backgroundImageOpacity", 50); showBackgroundImage = toml::find_or(gui, "showBackgroundImage", true); } @@ -954,7 +954,7 @@ void setDefaultValues() { vkHostMarkers = false; vkGuestMarkers = false; rdocEnable = false; - emulator_language = "en"; + emulator_language = "en_US"; m_language = 1; gpuId = -1; separateupdatefolder = false; diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index e546e0997..63b5bb384 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -347,7 +347,7 @@ void SettingsDialog::LoadValuesFromConfig() { toml::find_or(data, "Settings", "consoleLanguage", 6))) % languageIndexes.size()); ui->emulatorLanguageComboBox->setCurrentIndex( - languages[toml::find_or(data, "GUI", "emulatorLanguage", "en")]); + languages[toml::find_or(data, "GUI", "emulatorLanguage", "en_US")]); ui->hideCursorComboBox->setCurrentIndex(toml::find_or(data, "Input", "cursorState", 1)); OnCursorStateChanged(toml::find_or(data, "Input", "cursorState", 1)); ui->idleTimeoutSpinBox->setValue(toml::find_or(data, "Input", "cursorHideTimeout", 5)); From 4dfe05db24a8a34d2c441b213cdd21c6be49b92b Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Thu, 13 Feb 2025 15:01:35 -0300 Subject: [PATCH 279/455] language fix (#2421) --- src/core/libraries/save_data/save_instance.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/libraries/save_data/save_instance.cpp b/src/core/libraries/save_data/save_instance.cpp index 26708d2d6..a7ce3d35f 100644 --- a/src/core/libraries/save_data/save_instance.cpp +++ b/src/core/libraries/save_data/save_instance.cpp @@ -24,17 +24,17 @@ namespace fs = std::filesystem; // clang-format off static const std::unordered_map default_title = { {"ja_JP", "セーブデータ"}, - {"en", "Saved Data"}, - {"fr", "Données sauvegardées"}, + {"en_US", "Saved Data"}, + {"fr_FR", "Données sauvegardées"}, {"es_ES", "Datos guardados"}, - {"de", "Gespeicherte Daten"}, - {"it", "Dati salvati"}, - {"nl", "Opgeslagen data"}, + {"de_DE", "Gespeicherte Daten"}, + {"it_IT", "Dati salvati"}, + {"nl_NL", "Opgeslagen data"}, {"pt_PT", "Dados guardados"}, - {"ru", "Сохраненные данные"}, + {"ru_RU", "Сохраненные данные"}, {"ko_KR", "저장 데이터"}, {"zh_CN", "保存数据"}, - {"fi", "Tallennetut tiedot"}, + {"fi_FI", "Tallennetut tiedot"}, {"sv_SE", "Sparade data"}, {"da_DK", "Gemte data"}, {"no_NO", "Lagrede data"}, @@ -73,7 +73,7 @@ void SaveInstance::SetupDefaultParamSFO(PSF& param_sfo, std::string dir_name, std::string game_serial) { std::string locale = Config::getEmulatorLanguage(); if (!default_title.contains(locale)) { - locale = "en"; + locale = "en_US"; } #define P(type, key, ...) param_sfo.Add##type(std::string{key}, __VA_ARGS__) @@ -222,4 +222,4 @@ void SaveInstance::CreateFiles() { } } -} // namespace Libraries::SaveData \ No newline at end of file +} // namespace Libraries::SaveData From d76210d24fb2a98151d866b8179da8a1a26f6eca Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Thu, 13 Feb 2025 17:23:19 -0300 Subject: [PATCH 280/455] Set language to en_US if value is incorrect (#2422) --- src/common/config.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/common/config.cpp b/src/common/config.cpp index b61f92043..82eba2a4e 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -768,7 +768,21 @@ void load(const std::filesystem::path& path) { m_elf_viewer = toml::find_or>(gui, "elfDirs", {}); m_recent_files = toml::find_or>(gui, "recentFiles", {}); m_table_mode = toml::find_or(gui, "gameTableMode", 0); + emulator_language = toml::find_or(gui, "emulatorLanguage", "en_US"); + + // Check if the loaded language is in the allowed list + const std::vector allowed_languages = { + "ar_SA", "da_DK", "de_DE", "el_GR", "en_US", "es_ES", "fa_IR", + "fi_FI", "fr_FR", "hu_HU", "id_ID", "it_IT", "ja_JP", "ko_KR", + "lt_LT", "nl_NL", "no_NO", "pl_PL", "pt_BR", "ro_RO", "ru_RU", + "sq_AL", "sv_SE", "tr_TR", "uk_UA", "vi_VN", "zh_CN", "zh_TW"}; + + if (std::find(allowed_languages.begin(), allowed_languages.end(), emulator_language) == + allowed_languages.end()) { + emulator_language = "en_US"; // Default to en_US if not in the list + save(path); + } backgroundImageOpacity = toml::find_or(gui, "backgroundImageOpacity", 50); showBackgroundImage = toml::find_or(gui, "showBackgroundImage", true); } From 46ef678f55346cc93400d88ffb84804e9c1d7d07 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 14 Feb 2025 00:51:20 -0300 Subject: [PATCH 281/455] Fix PR 2422 (#2425) --- src/common/config.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 82eba2a4e..e26a998f5 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -768,21 +768,7 @@ void load(const std::filesystem::path& path) { m_elf_viewer = toml::find_or>(gui, "elfDirs", {}); m_recent_files = toml::find_or>(gui, "recentFiles", {}); m_table_mode = toml::find_or(gui, "gameTableMode", 0); - emulator_language = toml::find_or(gui, "emulatorLanguage", "en_US"); - - // Check if the loaded language is in the allowed list - const std::vector allowed_languages = { - "ar_SA", "da_DK", "de_DE", "el_GR", "en_US", "es_ES", "fa_IR", - "fi_FI", "fr_FR", "hu_HU", "id_ID", "it_IT", "ja_JP", "ko_KR", - "lt_LT", "nl_NL", "no_NO", "pl_PL", "pt_BR", "ro_RO", "ru_RU", - "sq_AL", "sv_SE", "tr_TR", "uk_UA", "vi_VN", "zh_CN", "zh_TW"}; - - if (std::find(allowed_languages.begin(), allowed_languages.end(), emulator_language) == - allowed_languages.end()) { - emulator_language = "en_US"; // Default to en_US if not in the list - save(path); - } backgroundImageOpacity = toml::find_or(gui, "backgroundImageOpacity", 50); showBackgroundImage = toml::find_or(gui, "showBackgroundImage", true); } @@ -797,6 +783,18 @@ void load(const std::filesystem::path& path) { const toml::value& keys = data.at("Keys"); trophyKey = toml::find_or(keys, "TrophyKey", ""); } + + // Check if the loaded language is in the allowed list + const std::vector allowed_languages = { + "ar_SA", "da_DK", "de_DE", "el_GR", "en_US", "es_ES", "fa_IR", "fi_FI", "fr_FR", "hu_HU", + "id_ID", "it_IT", "ja_JP", "ko_KR", "lt_LT", "nl_NL", "no_NO", "pl_PL", "pt_BR", "ro_RO", + "ru_RU", "sq_AL", "sv_SE", "tr_TR", "uk_UA", "vi_VN", "zh_CN", "zh_TW"}; + + if (std::find(allowed_languages.begin(), allowed_languages.end(), emulator_language) == + allowed_languages.end()) { + emulator_language = "en_US"; // Default to en_US if not in the list + save(path); + } } void save(const std::filesystem::path& path) { From d1e88c40d8077784a340977a7818d66843c2b176 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 14 Feb 2025 02:23:11 -0300 Subject: [PATCH 282/455] Displays translation in interface, not logs or config (#2424) Release/Nightly async/sync --- src/qt_gui/settings_dialog.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 63b5bb384..d34dd0856 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -58,6 +58,7 @@ QStringList languageNames = {"Arabic", const QVector languageIndexes = {21, 23, 14, 6, 18, 1, 12, 22, 2, 4, 25, 24, 29, 5, 0, 9, 15, 16, 17, 7, 26, 8, 11, 20, 3, 13, 27, 10, 19, 30, 28}; +QMap channelMap; SettingsDialog::SettingsDialog(std::span physical_devices, std::shared_ptr m_compat_info, @@ -71,6 +72,8 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->buttonBox->button(QDialogButtonBox::StandardButton::Close)->setFocus(); + channelMap = {{tr("Release"), "Release"}, {tr("Nightly"), "Nightly"}}; + // Add list of available GPUs ui->graphicsAdapterBox->addItem(tr("Auto Select")); // -1, auto selection for (const auto& device : physical_devices) { @@ -149,7 +152,11 @@ SettingsDialog::SettingsDialog(std::span physical_devices, #endif connect(ui->updateComboBox, &QComboBox::currentTextChanged, this, - [](const QString& channel) { Config::setUpdateChannel(channel.toStdString()); }); + [this](const QString& channel) { + if (channelMap.contains(channel)) { + Config::setUpdateChannel(channelMap.value(channel).toStdString()); + } + }); connect(ui->checkUpdateButton, &QPushButton::clicked, this, []() { auto checkUpdate = new CheckUpdate(true); @@ -373,8 +380,9 @@ void SettingsDialog::LoadValuesFromConfig() { toml::find_or(data, "General", "separateUpdateEnabled", false)); ui->gameSizeCheckBox->setChecked(toml::find_or(data, "GUI", "loadGameSizeEnabled", true)); ui->showSplashCheckBox->setChecked(toml::find_or(data, "General", "showSplash", false)); - ui->logTypeComboBox->setCurrentText( - QString::fromStdString(toml::find_or(data, "General", "logType", "async"))); + std::string logType = Config::getLogType(); + ui->logTypeComboBox->setCurrentText(logType == "async" ? tr("async") + : (logType == "sync" ? tr("sync") : "")); ui->logFilterLineEdit->setText( QString::fromStdString(toml::find_or(data, "General", "logFilter", ""))); ui->userNameLineEdit->setText( @@ -405,15 +413,12 @@ void SettingsDialog::LoadValuesFromConfig() { ui->updateCheckBox->setChecked(toml::find_or(data, "General", "autoUpdate", false)); ui->changelogCheckBox->setChecked( toml::find_or(data, "General", "alwaysShowChangelog", false)); - std::string updateChannel = toml::find_or(data, "General", "updateChannel", ""); - if (updateChannel != "Release" && updateChannel != "Nightly") { - if (Common::isRelease) { - updateChannel = "Release"; - } else { - updateChannel = "Nightly"; - } - } - ui->updateComboBox->setCurrentText(QString::fromStdString(updateChannel)); + + QString updateChannel = QString::fromStdString(Config::getUpdateChannel()); + ui->updateComboBox->setCurrentText( + channelMap.key(updateChannel != "Release" && updateChannel != "Nightly" + ? (Common::isRelease ? "Release" : "Nightly") + : updateChannel)); #endif std::string chooseHomeTab = toml::find_or(data, "General", "chooseHomeTab", ""); @@ -637,7 +642,7 @@ void SettingsDialog::UpdateSettings() { Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); Config::setAllowHDR(ui->enableHDRCheckBox->isChecked()); - Config::setLogType(ui->logTypeComboBox->currentText().toStdString()); + Config::setLogType((ui->logTypeComboBox->currentText() == tr("async") ? "async" : "sync")); Config::setLogFilter(ui->logFilterLineEdit->text().toStdString()); Config::setUserName(ui->userNameLineEdit->text().toStdString()); Config::setTrophyKey(ui->trophyKeyLineEdit->text().toStdString()); @@ -666,7 +671,7 @@ void SettingsDialog::UpdateSettings() { Config::setCopyGPUCmdBuffers(ui->copyGPUBuffersCheckBox->isChecked()); Config::setAutoUpdate(ui->updateCheckBox->isChecked()); Config::setAlwaysShowChangelog(ui->changelogCheckBox->isChecked()); - Config::setUpdateChannel(ui->updateComboBox->currentText().toStdString()); + Config::setUpdateChannel(channelMap.value(ui->updateComboBox->currentText()).toStdString()); Config::setChooseHomeTab(ui->chooseHomeTabComboBox->currentText().toStdString()); Config::setCompatibilityEnabled(ui->enableCompatibilityCheckBox->isChecked()); Config::setCheckCompatibilityOnStartup(ui->checkCompatibilityOnStartupCheckBox->isChecked()); From 0f8bd509b2514a25aefcd6c35eb27d3f28a152ac Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 14 Feb 2025 02:23:24 -0300 Subject: [PATCH 283/455] Crowdin translation adjustments (#2426) * Fix TR * + --- src/qt_gui/cheats_patches.cpp | 23 ++++--- src/qt_gui/cheats_patches.h | 6 +- src/qt_gui/check_update.cpp | 7 ++- src/qt_gui/settings_dialog.cpp | 93 ++++++++++++++-------------- src/qt_gui/translations/ar_SA.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/da_DK.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/de_DE.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/el_GR.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/en_US.ts | 92 ++++++++++++++-------------- src/qt_gui/translations/es_ES.ts | 98 +++++++++++++++--------------- src/qt_gui/translations/fa_IR.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/fi_FI.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/fr_FR.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/hu_HU.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/id_ID.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/it_IT.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/ja_JP.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/ko_KR.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/lt_LT.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/nl_NL.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/no_NO.ts | 94 ++++++++++++++--------------- src/qt_gui/translations/pl_PL.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/pt_BR.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/ro_RO.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/ru_RU.ts | 96 ++++++++++++++--------------- src/qt_gui/translations/sq_AL.ts | 94 ++++++++++++++--------------- src/qt_gui/translations/sv_SE.ts | 94 ++++++++++++++--------------- src/qt_gui/translations/tr_TR.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/uk_UA.ts | 94 ++++++++++++++--------------- src/qt_gui/translations/vi_VN.ts | 100 +++++++++++++++---------------- src/qt_gui/translations/zh_CN.ts | 94 ++++++++++++++--------------- src/qt_gui/translations/zh_TW.ts | 100 +++++++++++++++---------------- 32 files changed, 1447 insertions(+), 1438 deletions(-) diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index 34a5a6760..866ab3ca0 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -45,8 +45,13 @@ CheatsPatches::CheatsPatches(const QString& gameName, const QString& gameSerial, CheatsPatches::~CheatsPatches() {} void CheatsPatches::setupUI() { - defaultTextEdit = tr("defaultTextEdit_MSG"); - defaultTextEdit.replace("\\n", "\n"); + + // clang-format off + defaultTextEdit_MSG = tr("Cheats/Patches are experimental.\\nUse with caution.\\n\\nDownload cheats individually by selecting the repository and clicking the download button.\\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\\n\\nSince we do not develop the Cheats/Patches,\\nplease report issues to the cheat author.\\n\\nCreated a new cheat? Visit:\\n").replace("\\n", "\n")+"https://github.com/shadps4-emu/ps4_cheats"; + CheatsNotFound_MSG = tr("No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game."); + CheatsDownloadedSuccessfully_MSG = tr("You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list."); + DownloadComplete_MSG = tr("Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game."); + // clang-format on QString CHEATS_DIR_QString; Common::FS::PathToQString(CHEATS_DIR_QString, @@ -92,7 +97,7 @@ void CheatsPatches::setupUI() { // Add a text area for instructions and 'Patch' descriptions instructionsTextEdit = new QTextEdit(); - instructionsTextEdit->setText(defaultTextEdit); + instructionsTextEdit->setText(defaultTextEdit_MSG); instructionsTextEdit->setReadOnly(true); instructionsTextEdit->setFixedHeight(290); gameInfoLayout->addWidget(instructionsTextEdit); @@ -579,7 +584,7 @@ void CheatsPatches::downloadCheats(const QString& source, const QString& gameSer } } if (!foundFiles && showMessageBox) { - QMessageBox::warning(this, tr("Cheats Not Found"), tr("CheatsNotFound_MSG")); + QMessageBox::warning(this, tr("Cheats Not Found"), CheatsNotFound_MSG); } } else if (source == "GoldHEN" || source == "shadPS4") { QString textContent(jsonData); @@ -655,18 +660,18 @@ void CheatsPatches::downloadCheats(const QString& source, const QString& gameSer } } if (!foundFiles && showMessageBox) { - QMessageBox::warning(this, tr("Cheats Not Found"), tr("CheatsNotFound_MSG")); + QMessageBox::warning(this, tr("Cheats Not Found"), CheatsNotFound_MSG); } } if (foundFiles && showMessageBox) { QMessageBox::information(this, tr("Cheats Downloaded Successfully"), - tr("CheatsDownloadedSuccessfully_MSG")); + CheatsDownloadedSuccessfully_MSG); populateFileListCheats(); } } else { if (showMessageBox) { - QMessageBox::warning(this, tr("Cheats Not Found"), tr("CheatsNotFound_MSG")); + QMessageBox::warning(this, tr("Cheats Not Found"), CheatsNotFound_MSG); } } reply->deleteLater(); @@ -816,7 +821,7 @@ void CheatsPatches::downloadPatches(const QString repository, const bool showMes } if (showMessageBox) { QMessageBox::information(this, tr("Download Complete"), - QString(tr("DownloadComplete_MSG"))); + QString(DownloadComplete_MSG)); } // Create the files.json file with the identification of which file to open createFilesJson(repository); @@ -1422,6 +1427,6 @@ void CheatsPatches::onPatchCheckBoxHovered(QCheckBox* checkBox, bool hovered) { updateNoteTextEdit(patchName.toString()); } } else { - instructionsTextEdit->setText(defaultTextEdit); + instructionsTextEdit->setText(defaultTextEdit_MSG); } } \ No newline at end of file diff --git a/src/qt_gui/cheats_patches.h b/src/qt_gui/cheats_patches.h index 4217436f6..0f793b774 100644 --- a/src/qt_gui/cheats_patches.h +++ b/src/qt_gui/cheats_patches.h @@ -110,7 +110,11 @@ private: QComboBox* patchesComboBox; QListView* patchesListView; - QString defaultTextEdit; + // Strings + QString defaultTextEdit_MSG; + QString CheatsNotFound_MSG; + QString CheatsDownloadedSuccessfully_MSG; + QString DownloadComplete_MSG; }; #endif // CHEATS_PATCHES_H \ No newline at end of file diff --git a/src/qt_gui/check_update.cpp b/src/qt_gui/check_update.cpp index ac1aa9279..5cae6c41a 100644 --- a/src/qt_gui/check_update.cpp +++ b/src/qt_gui/check_update.cpp @@ -70,8 +70,11 @@ void CheckUpdate::CheckForUpdates(const bool showMessage) { if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 403) { QString response = reply->readAll(); if (response.startsWith("{\"message\":\"API rate limit exceeded for")) { - QMessageBox::warning(this, tr("Auto Updater"), - tr("Error_Github_limit_MSG").replace("\\n", "\n")); + QMessageBox::warning( + this, tr("Auto Updater"), + // clang-format off +tr("The Auto Updater allows up to 60 update checks per hour.\\nYou have reached this limit. Please try again later.").replace("\\n", "\n")); + // clang-format on } else { QMessageBox::warning( this, tr("Error"), diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index d34dd0856..c2962ebf9 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -506,112 +506,109 @@ int SettingsDialog::exec() { SettingsDialog::~SettingsDialog() {} void SettingsDialog::updateNoteTextEdit(const QString& elementName) { - QString text; // texts are only in .ts translation files for better formatting + QString text; + // clang-format off // General if (elementName == "consoleLanguageGroupBox") { - text = tr("consoleLanguageGroupBox"); + text = tr("Console Language:\\nSets the language that the PS4 game uses.\\nIt's recommended to set this to a language the game supports, which will vary by region."); } else if (elementName == "emulatorLanguageGroupBox") { - text = tr("emulatorLanguageGroupBox"); + text = tr("Emulator Language:\\nSets the language of the emulator's user interface."); } else if (elementName == "fullscreenCheckBox") { - text = tr("fullscreenCheckBox"); + text = tr("Enable Full Screen:\\nAutomatically puts the game window into full-screen mode.\\nThis can be toggled by pressing the F11 key."); } else if (elementName == "separateUpdatesCheckBox") { - text = tr("separateUpdatesCheckBox"); + text = tr("Enable Separate Update Folder:\\nEnables installing game updates into a separate folder for easy management.\\nThis can be manually created by adding the extracted update to the game folder with the name 'CUSA00000-UPDATE' where the CUSA ID matches the game's ID."); } else if (elementName == "showSplashCheckBox") { - text = tr("showSplashCheckBox"); + text = tr("Show Splash Screen:\\nShows the game's splash screen (a special image) while the game is starting."); } else if (elementName == "discordRPCCheckbox") { - text = tr("discordRPCCheckbox"); + text = tr("Enable Discord Rich Presence:\\nDisplays the emulator icon and relevant information on your Discord profile."); } else if (elementName == "userName") { - text = tr("userName"); - } else if (elementName == "label_Trophy") { - text = tr("TrophyKey"); - } else if (elementName == "trophyKeyLineEdit") { - text = tr("TrophyKey"); + text = tr("Username:\\nSets the PS4's account username, which may be displayed by some games."); + } else if (elementName == "label_Trophy" || elementName == "trophyKeyLineEdit") { + text = tr("Trophy Key:\\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\\nMust contain only hex characters."); } else if (elementName == "logTypeGroupBox") { - text = tr("logTypeGroupBox"); + text = tr("Log Type:\\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation."); } else if (elementName == "logFilter") { - text = tr("logFilter"); + text = tr("Log Filter:\nFilters the log to only print specific information.\nExamples: 'Core:Trace' 'Lib.Pad:Debug Common.Filesystem:Error' '*:Critical'\\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it."); #ifdef ENABLE_UPDATER } else if (elementName == "updaterGroupBox") { - text = tr("updaterGroupBox"); + text = tr("Update:\\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable."); #endif } else if (elementName == "GUIBackgroundImageGroupBox") { - text = tr("GUIBackgroundImageGroupBox"); + text = tr("Background Image:\\nControl the opacity of the game background image."); } else if (elementName == "GUIMusicGroupBox") { - text = tr("GUIMusicGroupBox"); + text = tr("Play Title Music:\\nIf a game supports it, enable playing special music when selecting the game in the GUI."); } else if (elementName == "enableHDRCheckBox") { - text = tr("enableHDRCheckBox"); + text = tr("Enable HDR:\\nEnables HDR in games that support it.\\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format."); } else if (elementName == "disableTrophycheckBox") { - text = tr("disableTrophycheckBox"); + text = tr("Disable Trophy Pop-ups:\\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window)."); } else if (elementName == "enableCompatibilityCheckBox") { - text = tr("enableCompatibilityCheckBox"); + text = tr("Display Compatibility Data:\\nDisplays game compatibility information in table view. Enable 'Update Compatibility On Startup' to get up-to-date information."); } else if (elementName == "checkCompatibilityOnStartupCheckBox") { - text = tr("checkCompatibilityOnStartupCheckBox"); + text = tr("Update Compatibility On Startup:\\nAutomatically update the compatibility database when shadPS4 starts."); } else if (elementName == "updateCompatibilityButton") { - text = tr("updateCompatibilityButton"); + text = tr("Update Compatibility Database:\\nImmediately update the compatibility database."); } // Input if (elementName == "hideCursorGroupBox") { - text = tr("hideCursorGroupBox"); + text = tr("Hide Cursor:\\nChoose when the cursor will disappear:\\nNever: You will always see the mouse.\\nidle: Set a time for it to disappear after being idle.\\nAlways: you will never see the mouse."); } else if (elementName == "idleTimeoutGroupBox") { - text = tr("idleTimeoutGroupBox"); + text = tr("Hide Idle Cursor Timeout:\\nThe duration (seconds) after which the cursor that has been idle hides itself."); } else if (elementName == "backButtonBehaviorGroupBox") { - text = tr("backButtonBehaviorGroupBox"); + text = tr("Back Button Behavior:\\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad."); } // Graphics if (elementName == "graphicsAdapterGroupBox") { - text = tr("graphicsAdapterGroupBox"); - } else if (elementName == "widthGroupBox") { - text = tr("resolutionLayout"); - } else if (elementName == "heightGroupBox") { - text = tr("resolutionLayout"); + text = tr("Graphics Device:\\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\\nor select 'Auto Select' to automatically determine it."); + } else if (elementName == "widthGroupBox" || elementName == "heightGroupBox") { + text = tr("Width/Height:\\nSets the size of the emulator window at launch, which can be resized during gameplay.\\nThis is different from the in-game resolution."); } else if (elementName == "heightDivider") { - text = tr("heightDivider"); + text = tr("Vblank Divider:\\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change!"); } else if (elementName == "dumpShadersCheckBox") { - text = tr("dumpShadersCheckBox"); + text = tr("Enable Shaders Dumping:\\nFor the sake of technical debugging, saves the games shaders to a folder as they render."); } else if (elementName == "nullGpuCheckBox") { - text = tr("nullGpuCheckBox"); + text = tr("Enable Null GPU:\\nFor the sake of technical debugging, disables game rendering as if there were no graphics card."); } // Path if (elementName == "gameFoldersGroupBox" || elementName == "gameFoldersListWidget") { - text = tr("gameFoldersBox"); + text = tr("Game Folders:\\nThe list of folders to check for installed games."); } else if (elementName == "addFolderButton") { - text = tr("addFolderButton"); + text = tr("Add:\\nAdd a folder to the list."); } else if (elementName == "removeFolderButton") { - text = tr("removeFolderButton"); + text = tr("Remove:\\nRemove a folder from the list."); } // Save Data if (elementName == "saveDataGroupBox" || elementName == "currentSaveDataPath") { - text = tr("saveDataBox"); + text = tr("Save Data Path:\\nThe folder where game save data will be saved."); } else if (elementName == "browseButton") { - text = tr("browseButton"); + text = tr("Browse:\\nBrowse for a folder to set as the save data path."); } // Debug if (elementName == "debugDump") { - text = tr("debugDump"); + text = tr("Enable Debug Dumping:\\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory."); } else if (elementName == "vkValidationCheckBox") { - text = tr("vkValidationCheckBox"); + text = tr("Enable Vulkan Validation Layers:\\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\\nThis will reduce performance and likely change the behavior of emulation."); } else if (elementName == "vkSyncValidationCheckBox") { - text = tr("vkSyncValidationCheckBox"); + text = tr("Enable Vulkan Synchronization Validation:\\nEnables a system that validates the timing of Vulkan rendering tasks.\\nThis will reduce performance and likely change the behavior of emulation."); } else if (elementName == "rdocCheckBox") { - text = tr("rdocCheckBox"); + text = tr("Enable RenderDoc Debugging:\\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame."); } else if (elementName == "crashDiagnosticsCheckBox") { - text = tr("crashDiagnosticsCheckBox"); + text = tr("Crash Diagnostics:\\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\\nDoes not work on Intel GPUs.\\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work."); } else if (elementName == "guestMarkersCheckBox") { - text = tr("guestMarkersCheckBox"); + text = tr("Guest Debug Markers:\\nInserts any debug markers the game itself has added to the command buffer.\\nIf you have this enabled, you should enable Crash Diagnostics.\\nUseful for programs like RenderDoc."); } else if (elementName == "hostMarkersCheckBox") { - text = tr("hostMarkersCheckBox"); + text = tr("Host Debug Markers:\\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\\nIf you have this enabled, you should enable Crash Diagnostics.\\nUseful for programs like RenderDoc."); } else if (elementName == "copyGPUBuffersCheckBox") { - text = tr("copyGPUBuffersCheckBox"); + text = tr("Copy GPU Buffers:\\nGets around race conditions involving GPU submits.\\nMay or may not help with PM4 type 0 crashes."); } else if (elementName == "collectShaderCheckBox") { - text = tr("collectShaderCheckBox"); + text = tr("Collect Shaders:\\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10)."); } - + // clang-format on ui->descriptionText->setText(text.replace("\\n", "\n")); } diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 0235a242d..f6d42c1c7 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + الغش والتصحيحات هي ميزات تجريبية.\nاستخدمها بحذر.\n\nقم بتنزيل الغش بشكل فردي عن طريق اختيار المستودع والنقر على زر التنزيل.\nفي علامة تبويب التصحيحات، يمكنك تنزيل جميع التصحيحات دفعة واحدة، واختيار ما تريد استخدامه، وحفظ اختياراتك.\n\nنظرًا لأننا لا نقوم بتطوير الغش/التصحيحات،\nيرجى الإبلاغ عن أي مشاكل إلى مؤلف الغش.\n\nهل قمت بإنشاء غش جديد؟ قم بزيارة:\n No Image Available @@ -161,7 +161,7 @@ لم يتم العثور على الغش - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. لم يتم العثور على غش لهذه اللعبة في هذا الإصدار من المستودع المحدد. حاول استخدام مستودع آخر أو إصدار آخر من اللعبة. @@ -169,7 +169,7 @@ تم تنزيل الغش بنجاح - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. لقد نجحت في تنزيل الغش لهذا الإصدار من اللعبة من المستودع المحدد. يمكنك محاولة التنزيل من مستودع آخر. إذا كان متاحًا، يمكنك اختياره عن طريق تحديد الملف من القائمة. @@ -185,7 +185,7 @@ اكتمل التنزيل - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. تم تنزيل التصحيحات بنجاح! تم تنزيل جميع التصحيحات لجميع الألعاب، ولا داعي لتنزيلها بشكل فردي لكل لعبة كما هو الحال مع الغش. إذا لم يظهر التحديث، قد يكون السبب أنه غير متوفر للإصدار وسيريال اللعبة المحدد. @@ -264,7 +264,7 @@ خطأ في الشبكة: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. يتيح التحديث التلقائي ما يصل إلى 60 عملية تحقق من التحديث في الساعة.\nلقد وصلت إلى هذا الحد. الرجاء المحاولة مرة أخرى لاحقًا. @@ -1540,83 +1540,83 @@ وجّه الماوس نحو خيار لعرض وصفه. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. لغة الجهاز:\nتحدد لغة اللعبة التي يستخدمها جهاز PS4.\nيوصى بضبطها على لغة يدعمها الجهاز، والتي قد تختلف حسب المنطقة. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. إظهار شاشة البداية:\nيعرض شاشة البداية الخاصة باللعبة (صورة خاصة) أثناء بدء التشغيل. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. تفعيل حالة الثراء في ديسكورد:\nيعرض أيقونة المحاكي ومعلومات ذات صلة على ملفك الشخصي في ديسكورد. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. اسم المستخدم:\nيضبط اسم حساب PS4، الذي قد يتم عرضه في بعض الألعاب. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. نوع السجل:\nيضبط ما إذا كان سيتم مزامنة مخرجات نافذة السجل للأداء. قد يؤثر سلبًا على المحاكاة. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. فلتر السجل:\nيقوم بتصفية السجل لطباعة معلومات محددة فقط.\nأمثلة: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" المستويات: Trace, Debug, Info, Warning, Error, Critical - بالترتيب، مستوى محدد يخفي جميع المستويات التي تسبقه ويعرض جميع المستويات بعده. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. تحديث: Release: إصدارات رسمية تصدر شهريًا، قد تكون قديمة بعض الشيء، لكنها أكثر استقرارًا واختبارًا. Nightly: إصدارات تطوير تحتوي على أحدث الميزات والإصلاحات، لكنها قد تحتوي على أخطاء وأقل استقرارًا. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. تشغيل موسيقى العنوان:\nإذا كانت اللعبة تدعم ذلك، قم بتمكين تشغيل موسيقى خاصة عند اختيار اللعبة في واجهة المستخدم. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. إخفاء المؤشر:\nاختر متى سيختفي المؤشر:\nأبداً: سترى الفأرة دائماً.\nعاطل: حدد وقتاً لاختفائه بعد أن يكون غير مستخدم.\nدائماً: لن ترى الفأرة أبداً. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. حدد وقتاً لاختفاء الفأرة بعد أن تكون غير مستخدم. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. سلوك زر العودة:\nيضبط زر العودة في وحدة التحكم ليحاكي الضغط على الموضع المحدد على لوحة اللمس في PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ لا شيء - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. جهاز الرسومات:\nعلى الأنظمة متعددة وحدات معالجة الرسومات، اختر وحدة معالجة الرسومات التي سيستخدمها المحاكي من قائمة منسدلة،\nأو اختر "Auto Select" لتحديدها تلقائيًا. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. العرض / الارتفاع:\nيضبط حجم نافذة المحاكي عند التشغيل، والذي يمكن تغيير حجمه أثناء اللعب.\nهذا يختلف عن دقة اللعبة نفسها. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! مقسم معدل التحديث:\nيتم مضاعفة معدل الإطارات الذي يتم تحديث المحاكي به بواسطة هذا الرقم. قد يؤدي تغيير هذا إلى آثار سلبية، مثل زيادة سرعة اللعبة أو كسر الوظائف الأساسية التي لا تتوقع هذا التغيير! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. تمكين تفريغ الـ Shaders:\nلأغراض تصحيح الأخطاء التقنية، يحفظ الـ Shaders الخاصة باللعبة في مجلد أثناء التشغيل. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. تمكين GPU الافتراضية:\nلأغراض تصحيح الأخطاء التقنية، يقوم بتعطيل عرض اللعبة كما لو لم يكن هناك بطاقة رسومات. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. مجلدات اللعبة:\nقائمة بالمجلدات للتحقق من الألعاب المثبتة. - addFolderButton + Add:\nAdd a folder to the list. إضافة:\nأضف مجلداً إلى القائمة. - removeFolderButton + Remove:\nRemove a folder from the list. إزالة:\nأزل مجلداً من القائمة. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. تمكين تفريغ التصحيح:\nيحفظ رموز الاستيراد والتصدير ومعلومات رأس الملف للبرنامج الحالي لجهاز PS4 إلى دليل. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. تمكين طبقات التحقق من Vulkan:\nيتيح نظام يتحقق من حالة مشغل Vulkan ويسجل معلومات حول حالته الداخلية. سيؤدي هذا إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. تمكين التحقق من تزامن Vulkan:\nيتيح نظام يتحقق من توقيت مهام عرض Vulkan. سيؤدي ذلك إلى تقليل الأداء ومن المحتمل تغيير سلوك المحاكاة. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. تمكين تصحيح RenderDoc:\nإذا تم التمكين، سيوفر المحاكي توافقًا مع Renderdoc لالتقاط وتحليل الإطار الذي يتم عرضه حاليًا. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index ed9e854a3..9f6cf8550 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches er eksperimentelle.\nBrug med forsigtighed.\n\nDownload cheats individuelt ved at vælge lageret og klikke på download-knappen.\nUnder fanen Patches kan du downloade alle patches på én gang, vælge hvilke du vil bruge og gemme valget.\n\nDa vi ikke udvikler cheats/patches,\nvenligst rapporter problemer til cheat-udvikleren.\n\nHar du lavet en ny cheat? Besøg:\n No Image Available @@ -161,7 +161,7 @@ Snyd ikke fundet - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Ingen snyd fundet til dette spil i denne version af det valgte repository, prøv et andet repository eller en anden version af spillet. @@ -169,7 +169,7 @@ Snyd hentet med succes - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Du har succesfuldt hentet snyd for denne version af spillet fra det valgte repository. Du kan prøve at hente fra et andet repository, hvis det er tilgængeligt, vil det også være muligt at bruge det ved at vælge filen fra listen. @@ -185,7 +185,7 @@ Download fuldført - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patcher hentet med succes! Alle patches til alle spil er blevet hentet, der er ikke behov for at hente dem individuelt for hvert spil, som det sker med snyd. Hvis opdateringen ikke vises, kan det være, at den ikke findes for den specifikke serie og version af spillet. @@ -264,7 +264,7 @@ Netsværksfejl: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Autoopdateren tillader op til 60 opdateringstjek i timen.\nDu har nået denne grænse. Prøv igen senere. @@ -1540,83 +1540,83 @@ Peg musen over et valg for at vise dets beskrivelse. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konsolsprog:\nIndstiller sproget, som PS4-spillet bruger.\nDet anbefales at indstille dette til et sprog, som spillet understøtter, hvilket kan variere efter region. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Vis startskærm:\nViser en startskærm (speciel grafik) under opstarten. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Aktiver Discord Rich Presence:\nViser emulatorikonet og relevante oplysninger på din Discord-profil. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Brugernavn:\nIndstiller PS4-kontoens navn, som kan blive vist i nogle spil. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Logtype:\nIndstiller, om logvinduets output vil blive synkroniseret for at øge ydeevnen. Dette kan påvirke emulatorens ydeevne negativt. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Logfilter:\nFiltrerer loggen for kun at udskrive bestemte oplysninger.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Warning, Error, Critical - i rækkefølge, et valgt niveau skjuler alle forudgående niveauer og viser alle efterfølgende niveauer. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Opdatering:\nRelease: Officielle builds, der frigives månedligt, som kan være meget ældre, men mere stabile og testet.\nNightly: Udviklerbuilds med de nyeste funktioner og rettelser, men som kan indeholde fejl og være mindre stabile. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Titelsmusikafspilning:\nHvis spillet understøtter det, aktiver speciel musik, når spillet vælges i brugergrænsefladen. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Skjul Cursor:\nVælg hvornår cursoren skal forsvinde:\nAldrig: Du vil altid se musen.\nInaktiv: Indstil en tid for, hvornår den skal forsvinde efter at være inaktiv.\nAltid: du vil aldrig se musen. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Indstil en tid for, at musen skal forsvinde efter at være inaktiv. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Tilbageknap Adfærd:\nIndstiller controllerens tilbageknap til at efterligne tryk på den angivne position på PS4 berøringsflade. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Ingen - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafikadapter:\nPå systemer med flere GPU'er skal du vælge den GPU, emulatoren vil bruge fra en rullemenu,\neller vælge "Auto Select" for at vælge den automatisk. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Skærmopløsning:\nIndstiller emulatorvinduets størrelse under afspilning, som kan ændres under afspilning.\nDette er forskelligt fra selve spillets opløsning. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Opdateringshastighedsdeler:\nMultiplicerer den frekvens, som emulatoren opdaterer billedet med, med dette tal. Ændring af dette kan have negative effekter, såsom hurtigere spil eller ødelagte funktioner! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Aktiver dumping af Shaders:\nTil teknisk fejlfinding gemmer det spillets shaders i en mappe under afspilning. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Aktiver virtuel GPU:\nTil teknisk fejlfinding deaktiverer det spilvisning, som om der ikke var et grafikkort. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Spilmappen:\nListen over mapper til at tjekke for installerede spil. - addFolderButton + Add:\nAdd a folder to the list. Tilføj:\nTilføj en mappe til listen. - removeFolderButton + Remove:\nRemove a folder from the list. Fjern:\nFjern en mappe fra listen. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Aktiver debugging-dump:\nGemmer import/export-symboler og headeroplysninger for det aktuelle PS4-program til en mappe. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Aktiver Vulkan-valideringslag:\nAktiverer et system, der validerer Vulkan-driverens tilstand og logger oplysninger om dens interne tilstand. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Aktiver Vulkan-synkroniseringsvalidering:\nAktiverer et system, der validerer tidspunktet for Vulkan's renderingsopgaver. Dette vil reducere ydeevnen og kan muligvis ændre emulatorens adfærd. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Aktiver RenderDoc-fejlfinding:\nHvis aktiveret, giver det emulatoren mulighed for kompatibilitet med Renderdoc til at fange og analysere det aktuelle gengivne billede. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 696c434d1..047a25b76 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -29,8 +29,8 @@ Cheats / Patches für - defaultTextEdit_MSG - Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches sind experimentell.\nVerwende sie mit Vorsicht.\n\nLade Cheats einzeln herunter, indem du das Repository auswählst und auf die Download-Schaltfläche klickst.\nAuf der Registerkarte Patches kannst du alle Patches auf einmal herunterladen, auswählen, welche du verwenden möchtest, und die Auswahl speichern.\n\nDa wir die Cheats/Patches nicht entwickeln,\nbitte melde Probleme an den Cheat-Autor.\n\nHast du einen neuen Cheat erstellt? Besuche:\n No Image Available @@ -161,7 +161,7 @@ Cheats nicht gefunden - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Keine Cheats für dieses Spiel in dieser Version des gewählten Repositories gefunden. Versuche es mit einem anderen Repository oder einer anderen Version des Spiels. @@ -169,7 +169,7 @@ Cheats erfolgreich heruntergeladen - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Du hast erfolgreich Cheats für diese Version des Spiels aus dem gewählten Repository heruntergeladen. Du kannst auch versuchen, Cheats von einem anderen Repository herunterzuladen. Wenn verfügbar, kannst du sie auswählen, indem du die Datei aus der Liste auswählst. @@ -185,7 +185,7 @@ Download abgeschlossen - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patches erfolgreich heruntergeladen! Alle Patches für alle Spiele wurden heruntergeladen, es ist nicht notwendig, sie einzeln für jedes Spiel herunterzuladen, wie es bei Cheats der Fall ist. Wenn der Patch nicht angezeigt wird, könnte es sein, dass er für die spezifische Seriennummer und Version des Spiels nicht existiert. @@ -264,7 +264,7 @@ Netzwerkfehler: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Der Auto-Updater erlaubt bis zu 60 Update-Überprüfungen pro Stunde.\nDu hast dieses Limit erreicht. Bitte versuche es später erneut. @@ -1540,83 +1540,83 @@ Bewege die Maus über eine Option, um deren Beschreibung anzuzeigen. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konsolensprache:\nLegt die Sprache fest, die das PS4-Spiel verwendet.\nEs wird empfohlen, diese auf eine vom Spiel unterstützte Sprache einzustellen, die je nach Region unterschiedlich sein kann. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Startbildschirm anzeigen:\nZeigt beim Start einen speziellen Bildschirm (Splash) des Spiels an. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Discord Rich Presence aktivieren:\nZeigt das Emulator-Icon und relevante Informationen in deinem Discord-Profil an. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Benutzername:\nLegt den Namen des PS4-Kontos fest, der in einigen Spielen angezeigt werden kann. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophäenschlüssel:\nSchlüssel zum Entschlüsseln von Trophäen. Muss von Ihrer gejailbreakten Konsole abgerufen werden.\nDarf nur Hex-Zeichen enthalten. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Protokolltyp:\nLegt fest, ob die Ausgabe des Protokollfensters synchronisiert wird, um die Leistung zu verbessern. Dies kann sich negativ auf die Emulation auswirken. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Protokollfilter:\nFiltert das Protokoll so, dass nur bestimmte Informationen ausgegeben werden.\nBeispiele: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Ebenen: Trace, Debug, Info, Warning, Error, Critical - in dieser Reihenfolge, ein ausgewähltes Level blendet alle vorherigen Ebenen aus und zeigt alle nachfolgenden an. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Update:\nRelease: Offizielle Builds, die monatlich veröffentlicht werden, können viel älter sein, aber stabiler und getestet.\nNightly: Entwickler-Builds, die die neuesten Funktionen und Fehlerbehebungen enthalten, aber Fehler enthalten und weniger stabil sein können. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Wiedergabe der Titelmusik:\nWenn das Spiel dies unterstützt, wird beim Auswählen des Spiels in der Benutzeroberfläche spezielle Musik abgespielt. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Trophäen-Popups deaktivieren:\nDeaktivieren Sie Trophäenbenachrichtigungen im Spiel. Der Trophäenfortschritt kann weiterhin mit dem Trophäen-Viewer verfolgt werden (klicken Sie mit der rechten Maustaste auf das Spiel im Hauptfenster).. - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Maus ausblenden:\nWählen Sie, wann der Cursor verschwinden soll:\nNie: Sie sehen die Maus immer.\nInaktiv: Legen Sie eine Zeit fest, nach der sie nach Inaktivität verschwindet.\nImmer: Sie sehen die Maus niemals. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Stellen Sie eine Zeit ein, nach der die Maus nach Inaktivität verschwinden soll. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Zurück-Button Verhalten:\nStellt die Zurück-Taste des Controllers so ein, dass sie das Antippen der angegebenen Position auf dem PS4-Touchpad emuliert. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Kompatibilitätsdaten anzeigen:\nZeigt Spielkompatibilitätsinformationen in Tabellenansicht an. Aktivieren Sie „Aktualisiere Kompatibilitätsdatenbank beim Start“, um aktuelle Informationen zu erhalten. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Kompatibilität beim Start aktualisieren:\nAktualisiert die Kompatibilitätsdatenbank automatisch, wenn shadPS4 startet. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. @@ -1648,84 +1648,84 @@ Keine - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafikkarte:\nAuf Systemen mit mehreren GPUs wählen Sie aus einem Dropdown-Menü die GPU aus, die der Emulator verwenden wird,\noder wählen Sie "Auto Select", um sie automatisch auszuwählen. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Auflösung:\nLegt die Größe des Emulator-Fensters während der Wiedergabe fest, die während der Wiedergabe geändert werden kann.\nDies unterscheidet sich von der tatsächlichen Spielauflösung. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Framerate-Teiler:\nMultipliziert die Bildrate, mit der der Emulator aktualisiert wird, mit diesem Wert. Dies kann sich negativ auswirken, wie z.B. beschleunigtes Gameplay oder Funktionsstörungen! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Shader-Dumping aktivieren:\nZum technischen Debuggen speichert es die Shaders des Spiels in einem Ordner während der Wiedergabe. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Virtuelle GPU aktivieren:\nFür das technische Debugging deaktiviert es die Spielanzeige, als ob keine Grafikkarte vorhanden wäre. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Spieleordner:\nDie Liste der Ordner, in denen nach installierten Spielen gesucht wird. - addFolderButton + Add:\nAdd a folder to the list. Hinzufügen:\nFügen Sie einen Ordner zur Liste hinzu. - removeFolderButton + Remove:\nRemove a folder from the list. Entfernen:\nEntfernen Sie einen Ordner aus der Liste. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Debug-Dump aktivieren:\nSpeichert Import-/Exportsymbole und Headerinformationen des aktuellen PS4-Programms in einem Verzeichnis. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Vulkan-Validierungsebenen aktivieren:\nAktiviert ein System, das den Zustand des Vulkan-Treibers validiert und Informationen über dessen internen Zustand protokolliert. Dies verringert die Leistung und kann möglicherweise das Verhalten der Emulation ändern. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Vulkan-Synchronisationsvalidierung aktivieren:\nAktiviert ein System, das die Zeitplanung der Rendering-Aufgaben von Vulkan validiert. Dies wird die Leistung verringern und kann möglicherweise das Verhalten der Emulation ändern. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. RenderDoc-Debugging aktivieren:\nWenn aktiviert, bietet der Emulator Kompatibilität mit Renderdoc zur Erfassung und Analyse des aktuell gerenderten Frames. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Shader sammeln:\nSie müssen diese Option aktivieren, um Shader mit dem Debug-Menü (Strg + F10) bearbeiten zu können. - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Absturzdiagnose:\nErstellt eine .yaml-Datei mit Informationen über den Vulkan-Status zum Zeitpunkt des Absturzes.\nNützlich zum Debuggen von „Gerät verloren“-Fehlern. Wenn Sie dies aktiviert haben, sollten Sie Host- UND Gast-Debug-Markierungen aktivieren.\nFunktioniert nicht auf Intel-GPUs.\nDamit dies funktioniert, müssen Vulkan Validationsschichten aktiviert und das Vulkan SDK installiert sein. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. GPU-Puffer kopieren:\nUmgeht Race-Bedingungen mit GPU-Übermittlungen.\nKann bei PM4-Abstürzen vom Typ 0 hilfreich sein oder auch nicht. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host-Debug-Marker:\nFügt emulatorseitige Informationen wie Marker für bestimmte AMDGPU-Befehle rund um Vulkan-Befehle ein und gibt Ressourcen-Debug-Namen an.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Gast-Debug-Markierer:\nFügt alle Debug-Markierer, die das Spiel selbst hinzugefügt hat, in den Befehlspuffer ein.\nWenn Sie dies aktiviert haben, sollten Sie die Absturzdiagnose aktivieren.\nNützlich für Programme wie RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index f27f2911e..e3892006f 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Οι cheats/patches είναι πειραματικά.\nΧρησιμοποιήστε τα με προσοχή.\n\nΚατεβάστε τους cheats μεμονωμένα επιλέγοντας το αποθετήριο και κάνοντας κλικ στο κουμπί λήψης.\nΣτην καρτέλα Patches, μπορείτε να κατεβάσετε όλα τα patches ταυτόχρονα, να επιλέξετε ποια θέλετε να χρησιμοποιήσετε και να αποθηκεύσετε την επιλογή.\n\nΔεδομένου ότι δεν αναπτύσσουμε τους cheats/patches,\nπαρακαλώ αναφέρετε προβλήματα στον δημιουργό του cheat.\n\nΔημιουργήσατε ένα νέο cheat; Επισκεφθείτε:\n No Image Available @@ -161,7 +161,7 @@ Δεν βρέθηκαν Cheats - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Δεν βρέθηκαν cheats για αυτό το παιχνίδι στην τρέχουσα έκδοση του επιλεγμένου αποθετηρίου. Δοκιμάστε να κατεβάσετε από άλλο αποθετήριο ή άλλη έκδοση του παιχνιδιού. @@ -169,7 +169,7 @@ Cheats κατεβάστηκαν επιτυχώς - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Κατεβάσατε επιτυχώς cheats για αυτή την έκδοση του παιχνιδιού από το επιλεγμένο αποθετήριο. Μπορείτε να δοκιμάσετε να κατεβάσετε από άλλο αποθετήριο. Αν είναι διαθέσιμο, μπορείτε να το επιλέξετε επιλέγοντας το αρχείο από τη λίστα. @@ -185,7 +185,7 @@ Η λήψη ολοκληρώθηκε - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Τα Patches κατεβάστηκαν επιτυχώς! Όλα τα Patches για όλα τα παιχνίδια έχουν κατέβει, δεν είναι απαραίτητο να τα κατεβάσετε ένα-ένα για κάθε παιχνίδι, όπως με τα Cheats. Εάν η ενημέρωση δεν εμφανίζεται, μπορεί να μην υπάρχει για τον συγκεκριμένο σειριακό αριθμό και έκδοση του παιχνιδιού. @@ -264,7 +264,7 @@ Σφάλμα δικτύου: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Ο Αυτόματος Ενημερωτής επιτρέπει έως και 60 ελέγχους ενημερώσεων ανά ώρα.\nΈχετε φτάσει αυτό το όριο. Παρακαλώ δοκιμάστε ξανά αργότερα. @@ -1540,83 +1540,83 @@ Τοποθετήστε το ποντίκι σας πάνω σε μια επιλογή για να εμφανίσετε την περιγραφή της. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Γλώσσα Κονσόλας:\nΡυθμίζει τη γλώσσα που θα χρησιμοποιήσει το παιχνίδι PS4.\nΣυνιστάται να επιλέξετε μία από τις γλώσσες που υποστηρίζονται από το παιχνίδι, η οποία ενδέχεται να διαφέρει ανάλογα με την περιοχή. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Εμφάνιση Splash Screen:\nΕμφανίζει ειδική γραφική οθόνη κατά την εκκίνηση. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Ενεργοποίηση Discord Rich Presence:\nΕμφανίζει το εικονίδιο του emulator και σχετικές πληροφορίες στο προφίλ σας στο Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Όνομα Χρήστη:\nΟρίζει το όνομα του λογαριασμού PS4, το οποίο μπορεί να εμφανιστεί σε ορισμένα παιχνίδια. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Τύπος Καταγραφής:\nΚαθορίζει αν η έξοδος του παραθύρου καταγραφής θα συγχρονιστεί για αύξηση της απόδοσης. Αυτό μπορεί να επηρεάσει αρνητικά τις επιδόσεις του εξομοιωτή. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Φίλτρο Καταγραφής:\nΦιλτράρει τις καταγραφές ώστε να εκτυπώνονται μόνο συγκεκριμένες πληροφορίες.\nΠαραδείγματα: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Επίπεδα: Trace, Debug, Info, Warning, Error, Critical - με τη σειρά αυτή, κάθε επίπεδο που επιλέγεται αποκλείει τα προηγούμενα και εμφανίζει τα επόμενα επίπεδα. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Ενημερώσεις:\nRelease: Επίσημες εκδόσεις που κυκλοφορούν μηνιαίως, είναι παλαιότερες αλλά πιο σταθερές και δοκιμασμένες.\nNightly: Εκδόσεις προγραμματιστών με νέες δυνατότητες και διορθώσεις, αλλά μπορεί να περιέχουν σφάλματα και να είναι λιγότερο σταθερές. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Αναπαραγωγή Μουσικής Τίτλων:\nΕάν το παιχνίδι το υποστηρίζει, ενεργοποιεί ειδική μουσική κατά την επιλογή του παιχνιδιού από τη διεπαφή χρήστη. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Απόκρυψη Κέρσορα:\nΕπιλέξτε πότε θα εξαφανιστεί ο κέρσορας:\nΠοτέ: θα βλέπετε πάντα το ποντίκι.\nΑδρανές: ορίστε έναν χρόνο για να εξαφανιστεί μετά από αδράνεια.\nΠάντα: δεν θα δείτε ποτέ το ποντίκι. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Ορίστε έναν χρόνο για να εξαφανιστεί το ποντίκι μετά από αδράνεια. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Συμπεριφορά Κουμπιού Επιστροφής:\nΟρίζει το κουμπί επιστροφής του ελεγκτή να προσομοιώνει το πάτημα της καθορισμένης θέσης στην οθόνη αφής PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Κανένα - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Προσαρμογέας Γραφικών:\nΣε συστήματα με πολλές GPU, επιλέξτε από το μενού την GPU που θα χρησιμοποιήσει ο εξομοιωτής,\nή επιλέξτε "Auto Select" για αυτόματη επιλογή. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Ανάλυση Οθόνης:\nΚαθορίζει το μέγεθος του παραθύρου του εξομοιωτή κατά την αναπαραγωγή, το οποίο μπορεί να αλλάξει κατά τη διάρκεια του παιχνιδιού.\nΑυτό είναι διαφορετικό από την ανάλυση του ίδιου του παιχνιδιού. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Διαιρέτης Συχνότητας Ανανέωσης:\nΠολλαπλασιάζει τον ρυθμό με τον οποίο ο εξομοιωτής ενημερώνει την εικόνα με αυτόν τον αριθμό. Η αλλαγή αυτής της ρύθμισης μπορεί να έχει αρνητικές επιπτώσεις, όπως ταχύτερο παιχνίδι ή σπασμένες λειτουργίες! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Ενεργοποίηση Καταγραφής Σκιάσεων (Shaders):\nΓια τεχνικό εντοπισμό σφαλμάτων, αποθηκεύει τις σκιάσεις του παιχνιδιού σε φάκελο κατά τη διάρκεια της αναπαραγωγής. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Ενεργοποίηση Εικονικής GPU:\nΓια τεχνικό εντοπισμό σφαλμάτων, απενεργοποιεί την εμφάνιση του παιχνιδιού σαν να μην υπάρχει κάρτα γραφικών. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Φάκελοι Παιχνιδιών:\nΗ λίστα των φακέλων για έλεγχο των εγκατεστημένων παιχνιδιών. - addFolderButton + Add:\nAdd a folder to the list. Προσθήκη:\nΠροσθέστε έναν φάκελο στη λίστα. - removeFolderButton + Remove:\nRemove a folder from the list. Αφαίρεση:\nΑφαιρέστε έναν φάκελο από τη λίστα. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Ενεργοποίηση Καταγραφής Αποσφαλμάτωσης:\nΑποθηκεύει τα σύμβολα εισαγωγής/εξαγωγής και τις κεφαλίδες πληροφοριών του τρέχοντος προγράμματος PS4 σε έναν φάκελο. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Ενεργοποίηση Επικύρωσης Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει την κατάσταση του προγράμματος οδήγησης Vulkan και καταγράφει πληροφορίες για την εσωτερική του κατάσταση. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Ενεργοποίηση Επικύρωσης Συγχρονισμού Vulkan:\nΕνεργοποιεί ένα σύστημα που επικυρώνει τον συγχρονισμό των εργασιών απόδοσης του Vulkan. Αυτό θα μειώσει την απόδοση και ενδέχεται να αλλάξει τη συμπεριφορά του εξομοιωτή. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Ενεργοποίηση Καταγραφής RenderDoc:\nΌταν είναι ενεργοποιημένο, ο εξομοιωτής είναι συμβατός με το RenderDoc για τη λήψη και ανάλυση του τρέχοντος καρέ. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index db28dc7cb..e2b56c983 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n No Image Available @@ -161,7 +161,7 @@ Cheats Not Found - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. @@ -169,7 +169,7 @@ Cheats Downloaded Successfully - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. @@ -185,7 +185,7 @@ Download Complete - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. @@ -264,7 +264,7 @@ Network error: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. @@ -1540,83 +1540,83 @@ Point your mouse at an option to display its description. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulator Language:\nSets the language of the emulator's user interface. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Username:\nSets the PS4's account username, which may be displayed by some games. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,83 +1648,83 @@ None - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Game Folders:\nThe list of folders to check for installed games. - addFolderButton + Add:\nAdd a folder to the list. Add:\nAdd a folder to the list. - removeFolderButton + Remove:\nRemove a folder from the list. Remove:\nRemove a folder from the list. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. Save Data Path:\nThe folder where game save data will be saved. - browseButton + Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index af7e5012f..809d64578 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Los cheats/patches son experimentales.\nÚselos con precaución.\n\nDescargue los cheats individualmente seleccionando el repositorio y haciendo clic en el botón de descarga.\nEn la pestaña Patches, puede descargar todos los patches a la vez, elegir cuáles desea usar y guardar la selección.\n\nComo no desarrollamos los Cheats/Patches,\npor favor informe los problemas al autor del cheat.\n\n¿Creaste un nuevo cheat? Visita:\n No Image Available @@ -161,7 +161,7 @@ Trucos no encontrados - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. No se encontraron trucos para este juego en esta versión del repositorio seleccionado,intenta con otro repositorio o con una versión diferente del juego. @@ -169,7 +169,7 @@ Trucos descargados exitosamente - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Has descargado exitosamente los trucos para esta versión del juego desde el repositorio seleccionado. Puedes intentar descargar desde otro repositorio; si está disponible, también será posible usarlo seleccionando el archivo de la lista. @@ -185,7 +185,7 @@ Descarga completa - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. @@ -264,7 +264,7 @@ Error de red: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. El actualizador automático permite hasta 60 comprobaciones de actualización por hora.\nHas alcanzado este límite. Por favor, inténtalo de nuevo más tarde. @@ -1540,83 +1540,83 @@ Coloque el mouse sobre una opción para mostrar su descripción. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Idioma de la Consola:\nEstablece el idioma que utiliza el juego de PS4.\nSe recomienda configurarlo a un idioma que el juego soporte, lo cual varía por región. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Mostrar Pantalla de Inicio:\nMuestra la pantalla de inicio del juego (una imagen especial) mientras el juego se está iniciando. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Habilitar Discord Rich Presence:\nMuestra el ícono del emulador y la información relevante en tu perfil de Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Nombre de Usuario:\nEstablece el nombre de usuario de la cuenta de PS4, que puede ser mostrado por algunos juegos. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Tipo de Registro:\nEstablece si sincronizar la salida de la ventana de registro para mejorar el rendimiento. Puede tener efectos adversos en la emulación. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filtro de Registro:\nFiltra el registro para imprimir solo información específica.\nEjemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveles: Trace, Debug, Info, Warning, Error, Critical - en este orden, un nivel específico silencia todos los niveles anteriores en la lista y registra cada nivel posterior. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Actualización:\nRelease: Versiones oficiales lanzadas cada mes que pueden estar muy desactualizadas, pero son más confiables y están probadas.\nNightly: Versiones de desarrollo que tienen todas las últimas funciones y correcciones, pero pueden contener errores y son menos estables. - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. Imagen de fondo:\nControle la opacidad de la imagen de fondo del juego. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Reproducir Música del Título:\nSi un juego lo admite, habilita la reproducción de música especial al seleccionar el juego en la interfaz gráfica. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Establezca un tiempo para que el mouse desaparezca después de estar inactivo. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Comportamiento del Botón Atrás:\nEstablece el botón atrás del controlador para emular el toque en la posición especificada en el touchpad del PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Ninguno - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Dispositivo Gráfico:\nEn sistemas con múltiples GPU, selecciona la GPU que el emulador utilizará de la lista desplegable,\o selecciona "Auto Select" para determinarla automáticamente. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Anchura/Altura:\nEstablece el tamaño de la ventana del emulador al iniciar, que se puede redimensionar durante el juego.\nEsto es diferente de la resolución en el juego. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Divisor de Vblank:\nLa tasa de cuadros a la que se refresca el emulador se multiplica por este número. Cambiar esto puede tener efectos adversos, como aumentar la velocidad del juego, o romper la funcionalidad crítica del juego que no espera que esto cambie. - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Habilitar GPU Nula:\nPor el bien de la depuración técnica, desactiva el renderizado del juego como si no hubiera tarjeta gráfica. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Carpetas de Juegos:\nLa lista de carpetas para verificar los juegos instalados. - addFolderButton + Add:\nAdd a folder to the list. Añadir:\nAgregar una carpeta a la lista. - removeFolderButton + Remove:\nRemove a folder from the list. Eliminar:\nEliminar una carpeta de la lista. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Habilitar la Volcadura de Depuración:\nGuarda los símbolos de importación y exportación y la información del encabezado del archivo del programa de PS4 que se está ejecutando actualmente en un directorio. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Habilitar Capas de Validación de Vulkan:\nHabilita un sistema que valida el estado del renderizador de Vulkan y registra información sobre su estado interno. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Habilitar Validación de Sincronización de Vulkan:\nHabilita un sistema que valida el tiempo de las tareas de renderizado de Vulkan. Esto reducirá el rendimiento y probablemente cambiará el comportamiento de la emulación. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Habilitar Depuración de RenderDoc:\nSi se habilita, el emulador proporcionará compatibilidad con Renderdoc para permitir la captura y análisis del fotograma actualmente renderizado. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index cc5e2e762..b4f469f26 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -29,8 +29,8 @@ چیت / پچ برای - defaultTextEdit_MSG - defaultTextEdit_MSG + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n No Image Available @@ -161,7 +161,7 @@ چیت یافت نشد - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. متاسفانه هیچ چیتی از منبع انتخاب شده پیدا نشد! شما میتوانید منابع دیگری را برای دانلود انتخاب و یا چیت های خود را به صورت دستی واردکنید. @@ -169,7 +169,7 @@ دانلود چیت ها موفقیت آمیز بود✅ - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. تمامی چیت های موجود برای این بازی از منبع انتخاب شده دانلود شد! شما همچنان میتوانید چیت های دیگری را ازمنابع مختلف دانلود کنید و درصورت موجود بودن از آنها استفاده کنید. @@ -185,7 +185,7 @@ دانلود کامل شد - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. پچ ها با موفقیت بارگیری شدند! تمام وصله های موجود برای همه بازی ها دانلود شده اند، نیازی به دانلود جداگانه آنها برای هر بازی نیست، همانطور که در Cheats اتفاق می افتد. اگر پچ ظاهر نشد، ممکن است برای سریال و نسخه خاصی از بازی وجود نداشته باشد. @@ -264,7 +264,7 @@ خطای شبکه: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. به‌روزرسانی خودکار حداکثر ۶۰ بررسی به‌روزرسانی در ساعت را مجاز می‌داند.\nشما به این محدودیت رسیده‌اید. لطفاً بعداً دوباره امتحان کنید. @@ -1540,83 +1540,83 @@ ماوس خود را بر روی یک گزینه قرار دهید تا توضیحات آن نمایش داده شود. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. زبان شبیه‌ساز:\nزبان رابط کاربری شبیه‌ساز را انتخاب می‌کند. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. فعال‌سازی تمام صفحه:\nپنجره بازی را به‌طور خودکار به حالت تمام صفحه در می‌آورد.\nبرای تغییر این حالت می‌توانید کلید F11 را فشار دهید. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. فعال‌سازی پوشه جداگانه برای به‌روزرسانی:\nامکان نصب به‌روزرسانی‌های بازی در یک پوشه جداگانه برای مدیریت راحت‌تر را فراهم می‌کند. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. نمایش صفحه شروع:\nصفحه شروع بازی (تصویری ویژه) را هنگام بارگذاری بازی نمایش می‌دهد. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. فعال کردن Discord Rich Presence:\nآیکون شبیه ساز و اطلاعات مربوطه را در نمایه Discord شما نمایش می دهد. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. نام کاربری:\nنام کاربری حساب PS4 را تنظیم می‌کند که ممکن است توسط برخی بازی‌ها نمایش داده شود. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. نوع لاگ:\nتنظیم می‌کند که آیا خروجی پنجره لاگ برای بهبود عملکرد همگام‌سازی شود یا خیر. این ممکن است تأثیر منفی بر شبیه‌سازی داشته باشد. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. به‌روزرسانی:\nانتشار: نسخه‌های رسمی که هر ماه منتشر می‌شوند و ممکن است بسیار قدیمی باشند، اما پایدارتر و تست‌ شده‌تر هستند.\nشبانه: نسخه‌های توسعه‌ای که شامل جدیدترین ویژگی‌ها و اصلاحات هستند، اما ممکن است دارای اشکال باشند و کمتر پایدار باشند. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. پخش موسیقی عنوان:\nIدر صورتی که بازی از آن پشتیبانی کند، پخش موسیقی ویژه هنگام انتخاب بازی در رابط کاربری را فعال می‌کند. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). غیرفعال کردن نمایش جوایز:\nنمایش اعلان‌های جوایز درون بازی را غیرفعال می‌کند. پیشرفت جوایز همچنان از طریق نمایشگر جوایز (کلیک راست روی بازی در پنجره اصلی) قابل پیگیری است.. - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. پنهان کردن نشانگر:\nانتخاب کنید که نشانگر چه زمانی ناپدید شود:\nهرگز: شما همیشه ماوس را خواهید دید.\nغیرفعال: زمانی را برای ناپدید شدن بعد از غیرفعالی تعیین کنید.\nهمیشه: شما هرگز ماوس را نخواهید دید. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. زمانی را برای ناپدید شدن ماوس بعد از غیرفعالی تعیین کنید. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. رفتار دکمه برگشت:\nدکمه برگشت کنترلر را طوری تنظیم می کند که ضربه زدن روی موقعیت مشخص شده روی صفحه لمسی PS4 را شبیه سازی کند. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. نمایش داده‌های سازگاری:\nاطلاعات سازگاری بازی را به صورت جدول نمایش می‌دهد. برای دریافت اطلاعات به‌روز، گزینه "به‌روزرسانی سازگاری هنگام راه‌اندازی" را فعال کنید. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. به‌روزرسانی سازگاری هنگام راه‌اندازی:\nبه‌طور خودکار پایگاه داده سازگاری را هنگام راه‌اندازی ShadPS4 به‌روزرسانی می‌کند. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. @@ -1648,84 +1648,84 @@ هیچ کدام - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. دستگاه گرافیکی:\nدر سیستم‌های با چندین پردازنده گرافیکی، از فهرست کشویی، پردازنده گرافیکی که شبیه‌ساز از آن استفاده می‌کند را انتخاب کنید، یا گزینه "انتخاب خودکار" را انتخاب کنید تا به طور خودکار تعیین شود. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. عرض/ارتفاع:\nاندازه پنجره شبیه‌ساز را در هنگام راه‌اندازی تنظیم می‌کند، که در حین بازی قابل تغییر اندازه است.\nاین با وضوح داخل بازی متفاوت است. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! تقسیم‌کننده Vblank:\nمیزان فریم ریت که شبیه‌ساز با آن به‌روزرسانی می‌شود، در این عدد ضرب می‌شود. تغییر این مقدار ممکن است تأثیرات منفی داشته باشد، مانند افزایش سرعت بازی یا خراب شدن عملکردهای حیاتی بازی که انتظار تغییر آن را ندارند! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. فعال‌سازی ذخیره‌سازی شیدرها:\nبه‌منظور اشکال‌زدایی فنی، شیدرهای بازی را هنگام رندر شدن در یک پوشه ذخیره می‌کند. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. پوشه های بازی:\nلیست پوشه هایی که باید بازی های نصب شده را بررسی کنید. - addFolderButton + Add:\nAdd a folder to the list. اضافه کردن:\nیک پوشه به لیست اضافه کنید. - removeFolderButton + Remove:\nRemove a folder from the list. حذف:\nیک پوشه را از لیست حذف کنید. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. فعال‌سازی ذخیره‌سازی دیباگ:\nنمادهای import و export و اطلاعات هدر فایل برنامه در حال اجرای PS4 را در یک پوشه ذخیره می‌کند. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index eb9e02c04..1ca07a92b 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -29,8 +29,8 @@ Huijaukset / Paikkaukset pelille - defaultTextEdit_MSG - Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Huijaukset/Paikkaukset ovat kokeellisia.\nKäytä varoen.\n\nLataa huijaukset yksitellen valitsemalla repositorion ja napsauttamalla latauspainiketta.\nPaikkaukset-välilehdessä voit ladata kaikki paikkaukset kerralla, valita, mitä haluat käyttää ja tallentaa valinnan.\n\nKoska me emme kehitä Huijauksia/Paikkauksia,\nole hyvä ja ilmoita ongelmista huijauksen tekijälle.\n\nLoitko uuden huijauksen? Käy osoitteessa:\n No Image Available @@ -161,7 +161,7 @@ Huijauksia Ei Löytynyt - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Huijauksia ei löytynyt tälle pelin versiolle valitusta repositoriosta. Kokeile toista repositoriota tai eri versiota pelistä. @@ -169,7 +169,7 @@ Huijaukset Ladattu Onnistuneesti - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Olet ladannut huijaukset onnistuneesti valitusta repositoriosta tälle pelin versiolle. Voit yrittää ladata toisesta repositoriosta. Jos se on saatavilla, voit myös käyttää sitä valitsemalla tiedoston listasta. @@ -185,7 +185,7 @@ Lataus valmis - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Paikkaukset ladattu onnistuneesti! Kaikki saatavilla olevat paikkaukset kaikille peleille on ladattu, eikä niitä tarvitse ladata yksittäin jokaiselle pelille, kuten huijausten kohdalla. Jos paikkausta ei näy, saattaa olla, että sitä ei ole saatavilla kyseiselle sarjanumerolle ja peliversiolle. @@ -264,7 +264,7 @@ Verkkovirhe: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Automaattinen päivitys sallii enintään 60 päivitystarkistusta tunnissa.\nOlet saavuttanut tämän rajan. Yritä myöhemmin uudelleen. @@ -1540,83 +1540,83 @@ Siirrä hiiri vaihtoehdon päälle näyttääksesi sen kuvauksen. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konsolin Kieli:\nAseta PS4-pelin käyttämä kieli.\nOn suositeltavaa asettaa tämä kieleksi, jota peli tukee, mikä vaihtelee alueittain. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Näytä Aloitusnäyttö:\nNäyttää pelin aloitusnäytön (erityinen kuva) pelin käynnistyessä. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Ota käyttöön Discord Rich Presence:\nNäyttää emulaattorin kuvakkeen ja asiaankuuluvat tiedot Discord-profiilissasi. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Käyttäjänimi:\nAsettaa PS4-tilin käyttäjänimen, joka voi näkyä joissain peleissä. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Avain:\nThrophyjen dekryptoinnissa käytetty avain. Pitää hankkia jailbreakatusta konsolista.\nSaa sisältää vain hex-merkkejä. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Lokityyppi:\nAsettaa, synkronoidaanko loki-ikkunan ulostulo suorituskyvyn vuoksi. Tämä voi vaikuttaa haitallisesti emulointiin. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Lokisuodatin:\nSuodattaa lokia tulostamaan vain määrättyä tietoa.\nEsimerkkejä: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nTasot: Trace, Debug, Info, Warning, Error, Critical - tässä järjestyksessä. Valittu taso vaientaa kaikki edeltävät tasot luettelossa ja kirjaa kaikki tasot sen jälkeen. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Päivitys:\nRelease: Viralliset versiot, jotka julkaistaan kuukausittain ja saattavat olla hyvin vanhoja, mutta ovat luotettavampia ja testatumpia.\nNightly: Kehitysversiot, joissa on kaikki uusimmat ominaisuudet ja korjaukset, mutta ne saattavat sisältää virheitä ja ovat vähemmän vakaita. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Soita Otsikkomusiikkia:\nJos peli tukee sitä, ota käyttöön erityisen musiikin soittaminen pelin valinnan yhteydessä käyttöliittymässä. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Poista Trophy Pop-upit Käytöstä:\nPoista trophy ilmoitukset pelin aikana. Trophyjen edistystä voi silti seurata Trophy Selainta käyttämällä (klikkaa peliä hiiren oikealla emulaattorin pääikkunassa). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Piilota kursori:\nValitse, milloin kursori häviää:\nEi koskaan: Näet hiiren aina.\nInaktiivinen: Aseta aika, jolloin se häviää oltuaan aktiivinen.\nAina: et koskaan näe hiirtä. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Aseta aika, milloin hiiri häviää oltuaan aktiivinen. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Takaisin-napin käyttäytyminen:\nAsettaa ohjaimen takaisin-napin jäljittelemään kosketusta PS4:n kosketuslevyn määritettyyn kohtaan. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Näytä Yhteensopivuustiedot:\nNäyttää pelien yhteensopivuustiedot listanäkymässä. Ota käyttöön "Päivitä Yhteensopivuustietokanta Käynnistäessä" saadaksesi ajantasaista tietoa. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Päivitä Yhteensopivuustiedot Käynnistäessä:\nPäivitä yhteensopivuustiedot automaattisesti shadPS4:n käynnistyessä. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. @@ -1648,84 +1648,84 @@ Ei mitään - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Näytönohjain:\nUseamman näytönohjaimen järjestelmissä, valitse pudotusvalikosta, mitä näytönohjainta emulaattori käyttää,\n tai valitse "Auto Select" automaattiseen määritykseen. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Leveys/Korkeus:\nAsettaa käynnistetyn emulaattori-ikkunan koon, jota voidaan muuttaa pelin aikana.\nTämä on eri, kuin pelin sisäinen resoluutio. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank Jakaja:\nEmulaattorin virkistystaajuus kerrotaan tällä numerolla. Tämän muuttaminen voi vaikuttaa haitallisesti, kuten lisätä pelin nopeutta tai rikkoa kriittisiä pelitoimintoja, jotka eivät odota tämän muuttuvan! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Ota Käyttöön Varjostinvedokset:\nTeknistä vianetsintää varten. Pelin varjostimia tallennetaan hakemistoon niiden renderöityessä. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Ota Null GPU käyttöön:\nTeknistä vianetsintää varten. Pelin renderöinti estetään, ikään kuin näytönohjainta ei olisi. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Pelihakemistot:\nLista hakemistoista, joista pelejä haetaan. - addFolderButton + Add:\nAdd a folder to the list. Lisää:\nLisää hakemisto listalle. - removeFolderButton + Remove:\nRemove a folder from the list. Poista:\nPoista hakemisto listalta. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Ota Käyttöön Virheenkorjausvedokset:\nTallentaa käynnissä olevan PS4-ohjelman tuonti- ja vientisymbolit ja tiedosto-otsikkotiedot hakemistoon. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Ota Käyttöön Vulkan-validointikerrokset:\nAktivoi järjestelmä, joka validoi Vulkan-renderöijän tilan ja kirjaa tietoa sen sisäisestä tilasta. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Ota Käyttöön Vulkan-synkronointivalidointi:\nAktivoi järjestelmä, joka validoi Vulkan-renderöinnin tehtävien aikataulutuksen. Tämä heikentää suorituskykyä ja todennäköisesti muuttaa emulaation käyttäytymistä. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Ota Käyttöön RenderDoc Virheenkorjaus:\nJos käytössä, emulaattori tarjoaa Renderdoc-yhteensopivuuden, mikä mahdollistaa renderöidyn kehyksen tallennuksen ja analysoinnin. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index ca6a3cc35..21d7884d8 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -29,8 +29,8 @@ Cheats / Patchs pour - defaultTextEdit_MSG - Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Les Cheats/Patchs sont expérimentaux.\nUtilisez-les avec précaution.\n\nTéléchargez les Cheats individuellement en sélectionnant le dépôt et en cliquant sur le bouton de téléchargement.\nDans l'onglet Patchs, vous pouvez télécharger tous les patchs en une seule fois, choisir lesquels vous souhaitez utiliser et enregistrer votre sélection.\n\nComme nous ne développons pas les Cheats/Patches,\nmerci de signaler les problèmes à l'auteur du Cheat.\n\nVous avez créé un nouveau cheat ? Visitez:\n No Image Available @@ -161,7 +161,7 @@ Cheats non trouvés - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Aucun Cheat trouvé pour ce jeu dans cette version du dépôt sélectionné, essayez un autre dépôt ou une version différente du jeu. @@ -169,7 +169,7 @@ Cheats téléchargés avec succès - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Vous avez téléchargé les cheats avec succès pour cette version du jeu depuis le dépôt sélectionné. Vous pouvez essayer de télécharger depuis un autre dépôt, si disponible, il sera également possible de l'utiliser en sélectionnant le fichier dans la liste. @@ -185,7 +185,7 @@ Téléchargement terminé - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patchs téléchargés avec succès ! Tous les patches disponibles pour tous les jeux ont été téléchargés, il n'est pas nécessaire de les télécharger individuellement pour chaque jeu comme c'est le cas pour les Cheats. Si le correctif n'apparaît pas, il se peut qu'il n'existe pas pour la série et la version spécifiques du jeu. @@ -264,7 +264,7 @@ Erreur réseau: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Le programme de mise à jour automatique permet jusqu'à 60 vérifications de mise à jour par heure.\nVous avez atteint cette limite. Veuillez réessayer plus tard. @@ -1540,83 +1540,83 @@ Pointez votre souris sur une option pour afficher sa description. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Langue de la console:\nDéfinit la langue utilisée par le jeu PS4.\nIl est recommandé de le définir sur une langue que le jeu prend en charge, ce qui variera selon la région. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Afficher l'écran de démarrage:\nAffiche l'écran de démarrage du jeu (une image spéciale) lors du démarrage du jeu. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Activer Discord Rich Presence:\nAffiche l'icône de l'émulateur et les informations pertinentes sur votre profil Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Nom d'utilisateur:\nDéfinit le nom d'utilisateur du compte PS4, qui peut être affiché par certains jeux. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Clé de trophées:\nClé utilisée pour décrypter les trophées. Doit être obtenu à partir de votre console jailbreakée.\nDoit contenir des caractères hexadécimaux uniquement. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Type de journal:\nDétermine si la sortie de la fenêtre de journalisation est synchronisée pour des raisons de performance. Cela peut avoir un impact négatif sur l'émulation. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filtre de journal:\n n'imprime que des informations spécifiques.\nExemples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaux: Trace, Debug, Info, Avertissement, Erreur, Critique - dans cet ordre, un niveau particulier désactive tous les niveaux précédents de la liste et enregistre tous les niveaux suivants. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Mise à jour:\nRelease: versions officielles publiées chaque mois qui peuvent être très anciennes, mais plus fiables et testées.\nNightly: versions de développement avec toutes les dernières fonctionnalités et correctifs, mais pouvant avoir des bogues et être moins stables. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Jouer de la musique de titre:\nSi le jeu le prend en charge, cela active la musique spéciale lorsque vous sélectionnez le jeu dans l'interface utilisateur. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Désactiver les notifications de trophées:\nDésactive les notifications de trophées en jeu. La progression des trophées peut toujours être suivie à l'aide de la Visionneuse de trophées (clique droit sur le jeu sur la fenêtre principale). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Masquer le curseur:\nChoisissez quand le curseur disparaîtra:\nJamais: Vous verrez toujours la souris.\nInactif: Définissez un temps pour qu'il disparaisse après inactivité.\nToujours: vous ne verrez jamais la souris. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Définissez un temps pour que la souris disparaisse après être inactif. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Comportement du bouton retour:\nDéfinit le bouton de retour de la manette pour imiter le toucher de la position spécifiée sur le pavé tactile PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Afficher les données de compatibilité:\nAffiche les informations de compatibilité des jeux dans une colonne dédiée. Activez "Mettre à jour la compatibilité au démarrage" pour avoir des informations à jour. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Mettre à jour la compatibilité au démarrage:\nMettre à jour automatiquement la base de données de compatibilité au démarrage de shadPS4. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. @@ -1648,84 +1648,84 @@ Aucun - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Adaptateur graphique:\nSélectionnez le GPU que l'émulateur utilisera dans les systèmes multi-GPU à partir de la liste déroulante,\nou choisissez "Auto Select" pour le déterminer automatiquement. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Largeur/Hauteur:\nDéfinit la taille de la fenêtre de l'émulateur au démarrage, qui peut être redimensionnée pendant le jeu.\nCela diffère de la résolution interne du jeu. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Diviseur Vblank:\nLe taux de rafraîchissement de l'émulateur est multiplié par ce nombre. Changer cela peut avoir des effets négatifs, tels qu'une augmentation de la vitesse du jeu ou la rupture de fonctionnalités critiques du jeu qui ne s'attendent pas à ce changement ! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Activer l'exportation de shaders:\nPour le débogage technique, les shaders du jeu sont enregistrés dans un dossier lors du rendu. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Activer le GPU nul:\nPour le débogage technique, désactive le rendu du jeu comme s'il n'y avait pas de carte graphique. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Dossiers de jeux:\nLa liste des dossiers à vérifier pour les jeux installés. - addFolderButton + Add:\nAdd a folder to the list. Ajouter:\nAjouter un dossier à la liste. - removeFolderButton + Remove:\nRemove a folder from the list. Supprimer:\nSupprimer un dossier de la liste. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Activer l'exportation de débogage:\nEnregistre les symboles d'importation et d'exportation et les informations d'en-tête du fichier du programme PS4 actuel dans un répertoire. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Activer les couches de validation Vulkan:\nActive un système qui valide l'état du rendu Vulkan et enregistre des informations sur son état interne. Cela réduit les performances et peut changer le comportement de l'émulation. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Activer la validation de synchronisation Vulkan:\nActive un système qui valide la planification des tâches de rendu Vulkan. Cela réduit les performances et peut changer le comportement de l'émulation. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Activer le débogage RenderDoc:\nS'il est activé, l'émulateur fournit une compatibilité avec Renderdoc, permettant d'enregistrer et d'analyser la trame rendue actuelle. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collecter les Shaders:\nVous devez activer cette option pour modifier les shaders avec le menu de débogage (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Diagnostic de crash:\nCrée un fichier .yaml avec des informations sur l'état de Vulkan au moment du crash.\nUtile pour déboguer les erreurs "Device lost". Si cette option est activée, vous devez aussi activer Marqueur de débogage hôte ET invité.\nNe marche pas pour les GPUs Intel.\nVous devez activer la couche de validation Vulkan ainsi que le Vulkan SDK pour que cela fonctionne. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copier la mémoire tampon GPU:\nContourne les conditions de course impliquant des soumissions GPU.\nPeut aider ou non en cas de crash PM4 type 0. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Marqueur de débogage hôte:\nInsère des informations côté émulateur telles que des marqueurs pour des commandes spécifiques AMDGPU autour des commandes Vulkan, ainsi que donner les noms de débogages des ressources.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Marqueur de débogage invité:\nInsère tous les marqueurs de débogage que le jeu a ajouté a la commande mémoire tampon.\nSi cette option est activée, vous devriez activer "Diagnostic de crash".\nUtile pour des programmes comme RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 5feb7cf25..a932337c6 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + A csalások/javítások kísérleti jellegűek.\nHasználja őket óvatosan.\n\nTöltse le a csalásokat egyesével a tároló kiválasztásával és a letöltés gombra kattintással.\nA Javítások fül alatt egyszerre letöltheti az összes javítást, majd választhat, melyeket szeretné használni, és elmentheti a választását.\n\nMivel nem mi fejlesztjük a csalásokat/patch-eket,\nkérjük, jelentse a problémákat a csalás szerzőjének.\n\nKészített egy új csalást? Látogasson el ide:\n No Image Available @@ -161,7 +161,7 @@ Csalások nem találhatóak - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Nincs található csalás ezen a játékverzión ebben a kiválasztott tárolóban, próbálj meg egy másik tárolót vagy a játék egy másik verzióját. @@ -169,7 +169,7 @@ Csalások sikeresen letöltve - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Sikeresen letöltötted a csalásokat ennek a játéknak a verziójához a kiválasztott tárolóból. Próbálhatsz letölteni egy másik tárolóból is, ha az elérhető, akkor a fájl kiválasztásával az is használható lesz. @@ -185,7 +185,7 @@ Letöltés befejezve - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Frissítések sikeresen letöltve! Minden elérhető frissítés letöltésre került, nem szükséges egyesével letölteni őket minden játékhoz, mint a csalások esetében. Ha a javítások nem jelennek meg, lehet, hogy nem léteznek a játék adott sorozatszámához és verziójához. @@ -264,7 +264,7 @@ Hálózati hiba: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Az automatikus frissítő óránként legfeljebb 60 frissítésellenőrzést engedélyez.\nElérte ezt a korlátot. Kérjük, próbálja újra később. @@ -1540,83 +1540,83 @@ Helyezze az egérmutatót egy lehetőség fölé, hogy megjelenítse annak leírását. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konzol nyelve:\nBeállítja a PS4 játék nyelvét.\nAjánlott a játék által támogatott nyelvre állítani, amely régiónként változhat. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Indítóképernyő megjelenítése:\nMegjeleníti a játék indítóképernyőjét (különleges képet) a játék elindításakor. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. A Discord Rich Presence engedélyezése:\nMegjeleníti az emulator ikonját és a kapcsolódó információkat a Discord profilján. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Felhasználónév:\nBeállítja a PS4 fiók felhasználónevét, amelyet egyes játékok megjeleníthetnek. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Napló típusa:\nBeállítja, hogy szinkronizálja-e a naplóablak kimenetét a teljesítmény érdekében. Ennek kedvezőtlen hatásai lehetnek az emulációra. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Napló szűrő:\nCsak bizonyos információk megjelenítésére szűri a naplót.\nPéldák: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Szintek: Trace, Debug, Info, Warning, Error, Critical - ebben a sorrendben, egy konkrét szint elnémítja az előtte lévő összes szintet, és naplózza az utána következő szinteket. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Frissítés:\nRelease: Hivatalos verziók, amelyeket havonta adnak ki, és amelyek nagyon elavultak lehetnek, de megbízhatóbbak és teszteltek.\nNightly: Fejlesztési verziók, amelyek az összes legújabb funkciót és javítást tartalmazzák, de hibákat tartalmazhatnak és kevésbé stabilak. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Játék címzene lejátszása:\nHa a játék támogatja, engedélyezze egy speciális zene lejátszását, amikor a játékot kiválasztja a GUI-ban. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Kurzor elrejtése:\nVálassza ki, mikor tűnjön el az egérmutató:\nSoha: Az egér mindig látható.\nInaktív: Állítson be egy időt, amennyi idő mozdulatlanság után eltűnik.\nMindig: az egér mindig el lesz rejtve. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Állítson be egy időt, ami után egér inaktív állapotban eltűnik. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Vissza gomb viselkedés:\nBeállítja a vezérlő vissza gombját, hogy utánozza a PS4 érintőpadján megadott pozíció megérintését. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Semmi - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafikus eszköz:\nTöbb GPU-s rendszereken válassza ki, melyik GPU-t használja az emulátor a legördülő listából,\nvagy válassza az "Auto Select" lehetőséget, hogy automatikusan kiválassza azt. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Szélesség/Magasság:\nBeállítja az emulátor ablakának méretét induláskor, amely a játék során átméretezhető.\nEz különbözik a játékbeli felbontástól. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank elosztó:\nAz emulátor frissítési sebessége e számot megszorozva működik. Ennek megváltoztatása kedvezőtlen hatásokat okozhat, például növelheti a játék sebességét, vagy megszakíthat kritikus játékfunkciókat, amelyek nem számítanak arra, hogy ez megváltozik! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Shader dumping engedélyezése:\nMűszaki hibaelhárítás céljából a játékok shaderjeit elmenti egy mappába, ahogy renderelődnek. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Null GPU engedélyezése:\nMűszaki hibaelhárítás céljából letiltja a játék renderelését, mintha nem lenne grafikus kártya. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Játék mappák:\nA mappák listája, ahol telepített játékok vannak. - addFolderButton + Add:\nAdd a folder to the list. Hozzáadás:\nHozzon létre egy mappát a listában. - removeFolderButton + Remove:\nRemove a folder from the list. Eltávolítás:\nTávolítson el egy mappát a listából. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Debug dumpolás engedélyezése:\nElmenti a futó PS4 program import- és exportszimbólumait, valamint a fájl fejlécinformációit egy könyvtárba. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Vulkan validációs rétegek engedélyezése:\nEngedélyezi a Vulkan renderelő állapotának validálását és információk naplózását annak belső állapotáról. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Vulkan szinkronizációs validáció engedélyezése:\nEngedélyezi a Vulkan renderelési feladatok időzítésének validálását. Ez csökkenti a teljesítményt és valószínűleg megváltoztatja az emuláció viselkedését. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. RenderDoc hibakeresés engedélyezése:\nHa engedélyezve van, az emulátor kompatibilitást biztosít a Renderdoc számára, hogy lehetővé tegye a jelenleg renderelt keret rögzítését és elemzését. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 6ca56e729..e1791ee70 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches bersifat eksperimental.\nGunakan dengan hati-hati.\n\nUnduh cheats satu per satu dengan memilih repositori dan mengklik tombol unduh.\nDi tab Patches, Anda dapat mengunduh semua patch sekaligus, memilih yang ingin digunakan, dan menyimpan pilihan Anda.\n\nKarena kami tidak mengembangkan Cheats/Patches,\nharap laporkan masalah kepada pembuat cheat.\n\nMembuat cheat baru? Kunjungi:\n No Image Available @@ -161,7 +161,7 @@ Cheat Tidak Ditemukan - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Cheat tidak ditemukan untuk game ini dalam versi repositori yang dipilih,cobalah repositori lain atau versi game yang berbeda. @@ -169,7 +169,7 @@ Cheat Berhasil Diunduh - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Anda telah berhasil mengunduh cheat untuk versi game ini dari repositori yang dipilih. Anda bisa mencoba mengunduh dari repositori lain, jika tersedia akan juga memungkinkan untuk menggunakannya dengan memilih file dari daftar. @@ -185,7 +185,7 @@ Unduhan Selesai - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patch Berhasil Diunduh! Semua Patch yang tersedia untuk semua game telah diunduh, tidak perlu mengunduhnya satu per satu seperti yang terjadi pada Cheat. Jika patch tidak muncul, mungkin patch tersebut tidak ada untuk nomor seri dan versi game yang spesifik. @@ -264,7 +264,7 @@ Kesalahan jaringan: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Pembaruan Otomatis memungkinkan hingga 60 pemeriksaan pembaruan per jam.\nAnda telah mencapai batas ini. Silakan coba lagi nanti. @@ -1540,83 +1540,83 @@ Arahkan mouse Anda pada opsi untuk menampilkan deskripsinya. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Bahasa Konsol:\nMenetapkan bahasa yang digunakan oleh permainan PS4.\nDisarankan untuk mengatur ini ke bahasa yang didukung oleh permainan, yang dapat bervariasi berdasarkan wilayah. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Tampilkan Layar Pembuka:\nMenampilkan layar pembuka permainan (gambar khusus) saat permainan dimulai. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Aktifkan Discord Rich Presence:\nMenampilkan ikon emulator dan informasi relevan di profil Discord Anda. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Nama Pengguna:\nMenetapkan nama pengguna akun PS4, yang mungkin ditampilkan oleh beberapa permainan. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Jenis Log:\nMenetapkan apakah untuk menyinkronkan output jendela log untuk kinerja. Dapat memiliki efek buruk pada emulasi. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filter Log:\nMenyaring log untuk hanya mencetak informasi tertentu.\nContoh: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Tingkatan: Trace, Debug, Info, Warning, Error, Critical - dalam urutan ini, tingkat tertentu membungkam semua tingkat sebelumnya dalam daftar dan mencatat setiap tingkat setelahnya. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Pembaruan:\nRelease: Versi resmi yang dirilis setiap bulan yang mungkin sangat ketinggalan zaman, tetapi lebih dapat diandalkan dan teruji.\nNightly: Versi pengembangan yang memiliki semua fitur dan perbaikan terbaru, tetapi mungkin mengandung bug dan kurang stabil. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Putar Musik Judul Permainan:\nJika permainan mendukungnya, aktifkan pemutaran musik khusus saat memilih permainan di GUI. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Sembunyikan Kursor:\nPilih kapan kursor akan menghilang:\nTidak Pernah: Anda akan selalu melihat mouse.\nTidak Aktif: Tetapkan waktu untuk menghilang setelah tidak aktif.\nSelalu: Anda tidak akan pernah melihat mouse. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Tetapkan waktu untuk mouse menghilang setelah tidak aktif. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Perilaku Tombol Kembali:\nMengatur tombol kembali pada pengontrol untuk meniru ketukan di posisi yang ditentukan di touchpad PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Tidak Ada - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Perangkat Grafis:\nPada sistem GPU ganda, pilih GPU yang akan digunakan emulator dari daftar dropdown,\natau pilih "Auto Select" untuk menentukan secara otomatis. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Lebar/Tinggi:\nMenetapkan ukuran jendela emulator saat diluncurkan, yang dapat diubah ukurannya selama permainan.\nIni berbeda dari resolusi dalam permainan. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Pembagi Vblank:\nKecepatan bingkai di mana emulator menyegarkan dikalikan dengan angka ini. Mengubah ini dapat memiliki efek buruk, seperti meningkatkan kecepatan permainan, atau merusak fungsi kritis permainan yang tidak mengharapkan ini berubah! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Aktifkan Pembuangan Shader:\nUntuk tujuan debugging teknis, menyimpan shader permainan ke folder saat mereka dirender. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Aktifkan GPU Null:\nUntuk tujuan debugging teknis, menonaktifkan rendering permainan seolah-olah tidak ada kartu grafis. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Folder Permainan:\nDaftar folder untuk memeriksa permainan yang diinstal. - addFolderButton + Add:\nAdd a folder to the list. Tambah:\nTambahkan folder ke daftar. - removeFolderButton + Remove:\nRemove a folder from the list. Hapus:\nHapus folder dari daftar. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Aktifkan Pembuangan Debug:\nMenyimpan simbol impor dan ekspor serta informasi header file dari program PS4 yang sedang berjalan ke direktori. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Aktifkan Vulkan Validation Layers:\nMengaktifkan sistem yang memvalidasi status penggambaran Vulkan dan mencatat informasi tentang status internalnya. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Aktifkan Vulkan Synchronization Validation:\nMengaktifkan sistem yang memvalidasi waktu tugas penggambaran Vulkan. Ini akan mengurangi kinerja dan kemungkinan mengubah perilaku emulasi. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Aktifkan Debugging RenderDoc:\nJika diaktifkan, emulator akan menyediakan kompatibilitas dengan Renderdoc untuk memungkinkan pengambilan dan analisis bingkai yang sedang dirender. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index b44836810..ad7b5cad4 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -29,8 +29,8 @@ Cheats / Patch per - defaultTextEdit_MSG - I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + I trucchi e le patch sono sperimentali.\nUtilizzali con cautela.\n\nScarica i trucchi singolarmente selezionando l'archivio e cliccando sul pulsante di download.\nNella scheda Patch, puoi scaricare tutte le patch in una volta sola, scegliere quali vuoi utilizzare e salvare la tua selezione.\n\nPoiché non sviluppiamo i trucchi e le patch,\nper favore segnala i problemi all'autore dei trucchi.\n\nHai creato un nuovo trucco? Visita:\n No Image Available @@ -161,7 +161,7 @@ Trucchi non trovati - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Non sono stati trovati trucchi per questa versione del gioco nell'archivio selezionato, prova un altro archivio o una versione diversa del gioco. @@ -169,7 +169,7 @@ Trucchi scaricati con successo! - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Hai scaricato con successo i trucchi per questa versione del gioco dall'archivio selezionato. Puoi provare a scaricare da un altro archivio, se disponibile, puoi anche utilizzarlo selezionando il file dall'elenco. @@ -185,7 +185,7 @@ Scaricamento completo - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patch scaricata con successo! Vengono scaricate tutte le patch disponibili per tutti i giochi, non è necessario scaricarle singolarmente per ogni gioco come nel caso dei trucchi. Se la patch non appare, potrebbe essere che non esista per il numero di serie e la versione specifica del gioco. @@ -264,7 +264,7 @@ Errore di rete: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. L'Aggiornamento Automatico consente fino a 60 controlli di aggiornamento all'ora.\nHai raggiunto questo limite. Riprova più tardi. @@ -1540,83 +1540,83 @@ Sposta il mouse su un'opzione per visualizzarne la descrizione. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Lingua della Console:\nImposta la lingua utilizzata dal gioco PS4.\nÈ consigliabile impostare questa su una lingua supportata dal gioco, che può variare a seconda della regione. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Abilita Cartella Aggiornamenti Separata:\nAbilita l'installazione degli aggiornamenti in una cartella separata per una più facile gestione. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Mostra Schermata di Avvio:\nMostra la schermata di avvio del gioco (un'immagine speciale) mentre il gioco si sta avviando. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Abilita Discord Rich Presence:\nMostra l'icona dell'emulatore e informazioni pertinenti sul tuo profilo Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Nome Utente:\nImposta il nome utente dell'account PS4, che potrebbe essere visualizzato da alcuni giochi. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Chiave Trofei:\nChiave utilizzata per la decrittazione dei trofei. Deve essere estratta dalla vostra console con jailbreak.\nDeve contenere solo caratteri esadecimali. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Tipo di Log:\nImposta se sincronizzare l'output della finestra di log per le prestazioni. Potrebbe avere effetti avversi sull'emulazione. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filtro Log:\nFiltra il log per stampare solo informazioni specifiche.\nEsempi: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Livelli: Trace, Debug, Info, Warning, Error, Critical - in questo ordine, un livello specifico silenzia tutti i livelli precedenti nell'elenco e registra ogni livello successivo. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Riproduci Musica del Titolo:\nSe un gioco lo supporta, attiva la riproduzione di musica speciale quando selezioni il gioco nell'interfaccia grafica. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disabilita Notifica Trofei:\nDisabilita notifiche in gioco dei trofei. Il progresso dei Trofei può ancora essere controllato con il Visualizzatore Trofei (clicca tasto destro sul gioco nella finestra principale). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Nascondi cursore:\nScegli quando il cursore scomparirà:\nMai: Vedrai sempre il mouse.\nInattivo: Imposta un tempo per farlo scomparire dopo essere stato inattivo.\nSempre: non vedrai mai il mouse. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Imposta un tempo affinché il mouse scompaia dopo essere stato inattivo. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Comportamento del pulsante Indietro:\nImposta il pulsante Indietro del controller per emulare il tocco sulla posizione specificata sul touchpad PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Mostra Dati Compatibilità:\nMostra informazioni sulla compatibilità del gioco nella visualizzazione lista. Abilita "Aggiorna Compatiblità all'Avvio" per ottenere informazioni aggiornate. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Aggiorna Compatibilità all'Avvio:\nAggiorna automaticamente il database della compatibilità quando si avvia shadps4. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. @@ -1648,84 +1648,84 @@ Nessuno - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Larghezza/Altezza:\nImposta la dimensione della finestra dell'emulatore all'avvio, che può essere ridimensionata durante il gioco.\nQuesto è diverso dalla risoluzione in gioco. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Divisore Vblank:\nIl frame rate con cui l'emulatore si aggiorna viene moltiplicato per questo numero. Cambiare questo potrebbe avere effetti avversi, come aumentare la velocità del gioco o rompere funzionalità critiche del gioco che non si aspettano questa modifica! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Abilita Pompaggio Shader:\nPer scopi di debug tecnico, salva gli shader dei giochi in una cartella mentre vengono resi. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Abilita GPU Null:\nPer scopi di debug tecnico, disabilita il rendering del gioco come se non ci fosse alcuna scheda grafica. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Cartelle di Gioco:\nL'elenco delle cartelle da controllare per i giochi installati. - addFolderButton + Add:\nAdd a folder to the list. Aggiungi:\nAggiungi una cartella all'elenco. - removeFolderButton + Remove:\nRemove a folder from the list. Rimuovi:\nRimuovi una cartella dall'elenco. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Abilita Pompaggio di Debug:\nSalva i simboli di importazione ed esportazione e le informazioni sull'intestazione del file del programma PS4 attualmente in esecuzione in una directory. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Abilita Strati di Validazione Vulkan:\nAbilita un sistema che convalida lo stato del renderer Vulkan e registra informazioni sul suo stato interno. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Abilita Validazione della Sincronizzazione Vulkan:\nAbilita un sistema che convalida il timing delle attività di rendering Vulkan. Ciò ridurrà le prestazioni e probabilmente cambierà il comportamento dell'emulazione. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Abilita Debugging RenderDoc:\nSe abilitato, l'emulatore fornirà compatibilità con Renderdoc per consentire la cattura e l'analisi del frame attualmente reso. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Raccogli Shader:\nBisogna attivare questa opzione per poter modificare gli shader nel menu di debug (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Diagnostica Crash:\nCrea un file .yaml che contiene informazioni riguardo lo stato del renderer Vulkan nel momento in cui si verifica un crash.\nUtile per poter effettuare il debug degli errori di tipo "Device Lost". Se hai questa opzione attiva dovresti abilitare anche Marcatori di Debug Host e Guest.\nNon è funzionante su GPU Intel.\nVulkan Validation Layers deve essere abilitato e bisogna aver installato l'SDK Vulkan per poter utilizzare questa funzione. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copia Buffer GPU:\nCerca di aggirare le race conditions che riguardano gli invii alla GPU.\nPotrebbe aiutare ad evitare crash che riguardano i PM4 di tipo 0. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Marcatori di Debug dell'Host:\nInserisce nel log informazioni ottenute dall'emulatore come ad esempio marcatori per comandi specifici AMDGPU quando si hanno comandi Vulkan e associa nomi di debug per le risorse.\nSe hai questa opzione abilitata dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Marcatori di Debug del Guest:\nInserisce nel log marcatori di debug che il gioco stesso ha aggiunto al buffer dei comandi.\nSe hai abilitato questa opzione dovresti abilitare anche Diagnostica Crash.\nUtile per programmi come RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 2c666d688..1cef2dd6e 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -29,8 +29,8 @@ のチート/パッチ - defaultTextEdit_MSG - チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチは開発を行っていないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\nhttps://github.com/shadps4-emu/ps4_cheats を訪問してください。 + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + チート/パッチは実験的です。\n使用には注意してください。\n\nリポジトリを選択し、ダウンロードボタンをクリックしてチートを個別にダウンロードします。\n「Patches」タブでは、すべてのパッチを一度にダウンロードし、使用したいものを選択して選択を保存できます。\n\nチート/パッチは開発を行っていないため、\n問題があればチートの作者に報告してください。\n\n新しいチートを作成しましたか?\n を訪問してください。 No Image Available @@ -161,7 +161,7 @@ チートが見つかりません - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. このゲームのこのバージョンのチートが選択されたリポジトリに見つかりませんでした。別のリポジトリまたはゲームの別のバージョンを試してください。 @@ -169,7 +169,7 @@ チートが正常にダウンロードされました - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. このゲームのこのバージョンのチートをリポジトリから正常にダウンロードしました。 別のリポジトリからのダウンロードも試せます。利用可能であれば、リストからファイルを選択して使用することも可能です。 @@ -185,7 +185,7 @@ ダウンロード完了 - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. パッチが正常にダウンロードされました! すべてのゲームに利用可能なパッチがダウンロードされました。チートとは異なり、各ゲームごとに個別にダウンロードする必要はありません。 パッチが表示されない場合、特定のシリアル番号とバージョンのゲームには存在しない可能性があります。 @@ -264,7 +264,7 @@ ネットワークエラー: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. 自動アップデーターは1時間に最大60回の更新チェックを許可します。\nこの制限に達しました。後でもう一度お試しください。 @@ -1540,83 +1540,83 @@ 設定項目にマウスをホバーすると、説明が表示されます。 - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. コンソールの言語:\nPS4ゲームが使用する言語を設定します。\nゲームでサポートされている言語に設定することをお勧めしますが、地域によって異なる場合があります。 - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. エミュレーターの言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで、管理が容易になります。 - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. スプラッシュスクリーンを表示:\nゲーム起動中にゲームのスプラッシュスクリーン(特別な画像)を表示します。 - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Discord Rich Presenceを有効にする:\nエミュレーターのアイコンと関連情報をDiscordプロフィールに表示します。 - userName + Username:\nSets the PS4's account username, which may be displayed by some games. ユーザー名:\nPS4のアカウントユーザー名を設定します。これは、一部のゲームで表示される場合があります。 - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. トロフィーキー:\nトロフィーの復号に使用されるキーです。脱獄済みのコンソールから取得することができます。\n16進数のみを受け入れます。 - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. ログタイプ:\nパフォーマンスのためにログウィンドウの出力を同期させるかどうかを設定します。エミュレーションに悪影響を及ぼす可能性があります。 - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. ログフィルター:\n特定の情報のみを印刷するようにログをフィルタリングします。\n例: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" \nレベル: Trace, Debug, Info, Warning, Error, Critical - レベルはこの並び通りに処理され、指定されたレベルより前のレベル ログを抑制し、それ以外のすべてのレベルをログに記録します。 - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. 更新:\nRelease: 最新の機能を利用できない可能性がありますが、より信頼性が高くテストされた公式バージョンが毎月リリースされます。\nNightly: 最新の機能と修正がすべて含まれていますが、バグが含まれている可能性があり、安定性は低いです。 - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. タイトルミュージックを再生:\nゲームでサポートされている場合に、GUIでゲームを選択したときに特別な音楽を再生する機能を有効にします。 - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). トロフィーのポップアップを無効化:\nゲーム内でのトロフィー通知を無効化します。 トロフィーの進行状況は、トロフィービューアーを使用して確認できます。(メインウィンドウでゲームを右クリック) - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. カーソルを隠す:\nカーソルが消えるタイミングを選択してください:\n無効: 常にカーソルが表示されます。\n非アクティブ時: カーソルの非アクティブ期間が指定した時間を超えた場合にカーソルを隠します。\n常に: カーソルは常に隠れた状態になります。 - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. カーソルが非アクティブになってから隠すまでの時間を設定します。 - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. 戻るボタンの動作:\nコントローラーの戻るボタンを、PS4のタッチパッドの指定された位置をタッチするように設定します。 - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. 互換性に関するデータを表示:\nゲームの互換性に関する情報を表として表示します。常に最新情報を取得したい場合、"起動時に互換性データベースを更新する" を有効化してください。 - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. 起動時に互換性データベースを更新する:\nshadPS4の起動時に自動で互換性データベースを更新します。 - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 @@ -1648,84 +1648,84 @@ なし - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. グラフィックデバイス:\nシステムに複数のGPUが搭載されている場合、ドロップダウンリストからエミュレーターで使用するGPUを選択するか、\n「自動選択」を選択して自動的に決定します。 - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. 幅/高さ:\n起動時にエミュレーターウィンドウのサイズを設定します。ゲーム中でもサイズを変更することができます。\nこれはゲーム内の解像度とは異なります。 - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblankディバイダー:\nエミュレーターが更新されるフレームレートにこの数を掛けます。これを変更すると、ゲームの速度が上がったり、想定外の変更がある場合、ゲームの重要な機能が壊れる可能性があります! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. シェーダーダンプを有効にする:\n技術的なデバッグの目的で、レンダリング中にゲームのシェーダーをフォルダーに保存します。 - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Null GPUを有効にする:\n技術的なデバッグの目的で、グラフィックスカードがないかのようにゲームのレンダリングを無効にします。 - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. ゲームフォルダ:\nインストールされたゲームを確認するためのフォルダのリスト。 - addFolderButton + Add:\nAdd a folder to the list. 追加:\nリストにフォルダを追加します。 - removeFolderButton + Remove:\nRemove a folder from the list. 削除:\nリストからフォルダを削除します。 - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. デバッグダンプを有効にする:\n現在実行中のPS4プログラムのインポートおよびエクスポートシンボルとファイルヘッダー情報をディレクトリに保存します。 - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Vulkanバリデーションレイヤーを有効にする:\nVulkanのレンダリングステータスを検証し、内部状態に関する情報をログに記録するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Vulkan同期バリデーションを有効にする:\nVulkanのレンダリングタスクのタイミングを検証するシステムを有効にします。これによりパフォーマンスが低下し、エミュレーションの動作が変わる可能性があります。 - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. RenderDocデバッグを有効にする:\n有効にすると、エミュレーターはRenderdocとの互換性を提供し、現在レンダリング中のフレームのキャプチャと分析を可能にします。 - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index f598896a4..cb16358e6 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n No Image Available @@ -161,7 +161,7 @@ Cheats Not Found - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. @@ -169,7 +169,7 @@ Cheats Downloaded Successfully - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. @@ -185,7 +185,7 @@ Download Complete - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. @@ -264,7 +264,7 @@ Network error: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. 자동 업데이트는 시간당 최대 60회의 업데이트 확인을 허용합니다.\n이 제한에 도달했습니다. 나중에 다시 시도해 주세요. @@ -1540,83 +1540,83 @@ Point your mouse at an option to display its description. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulator Language:\nSets the language of the emulator's user interface. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Discord Rich Presence 활성화:\nDiscord 프로필에 에뮬레이터 아이콘과 관련 정보를 표시합니다. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Username:\nSets the PS4's account username, which may be displayed by some games. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Set a time for the mouse to disappear after being after being idle. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ None - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Game Folders:\nThe list of folders to check for installed games. - addFolderButton + Add:\nAdd a folder to the list. Add:\nAdd a folder to the list. - removeFolderButton + Remove:\nRemove a folder from the list. Remove:\nRemove a folder from the list. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index bdcc6452f..8177769ce 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches yra eksperimentiniai.\nNaudokite atsargiai.\n\nAtsisiųskite cheats atskirai pasirinkdami saugyklą ir paspausdami atsisiuntimo mygtuką.\nPatches skirtuke galite atsisiųsti visus patch’us vienu metu, pasirinkti, kuriuos norite naudoti, ir išsaugoti pasirinkimą.\n\nKadangi mes nekurime Cheats/Patches,\npraneškite problemas cheat autoriui.\n\nSukūrėte naują cheat? Apsilankykite:\n No Image Available @@ -161,7 +161,7 @@ Sukčiavimai nerasti - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Nerasta sukčiavimų šiam žaidimui šioje pasirinktos saugyklos versijoje,bandykite kitą saugyklą arba skirtingą žaidimo versiją. @@ -169,7 +169,7 @@ Sukčiavimai sėkmingai atsisiųsti - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Sėkmingai atsisiuntėte sukčiavimus šios žaidimo versijos iš pasirinktos saugyklos. Galite pabandyti atsisiųsti iš kitos saugyklos, jei ji yra prieinama, taip pat bus galima ją naudoti pasirinkus failą iš sąrašo. @@ -185,7 +185,7 @@ Atsisiuntimas baigtas - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Pataisos sėkmingai atsisiųstos! Visos pataisos visiems žaidimams buvo atsisiųstos, nebėra reikalo jas atsisiųsti atskirai kiekvienam žaidimui, kaip tai vyksta su sukčiavimais. Jei pleistras nepasirodo, gali būti, kad jo nėra tam tikram žaidimo serijos numeriui ir versijai. @@ -264,7 +264,7 @@ Tinklo klaida: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Automatinis atnaujinimas leidžia iki 60 atnaujinimų patikrinimų per valandą.\nJūs pasiekėte šią ribą. Bandykite dar kartą vėliau. @@ -1540,83 +1540,83 @@ Žymeklį nukreipkite ant pasirinkimo, kad pamatytumėte jo aprašymą. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konsole kalba:\nNustato kalbą, kurią naudoja PS4 žaidimai.\nRekomenduojama nustatyti kalbą, kurią palaiko žaidimas, priklausomai nuo regiono. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Rodyti paleidimo ekraną:\nPaleidimo metu rodo žaidimo paleidimo ekraną (ypatingą vaizdą). - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Įjungti Discord Rich Presence:\nRodo emuliatoriaus ikoną ir susijusią informaciją jūsų Discord profilyje. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Vartotojo vardas:\nNustato PS4 paskyros vartotojo vardą, kuris gali būti rodomas kai kuriuose žaidimuose. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Žurnalo tipas:\nNustato, ar sinchronizuoti žurnalo lango išvestį našumui. Tai gali turėti neigiamą poveikį emuliacijai. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Žurnalo filtras:\nFiltruojamas žurnalas, kad būtų spausdinama tik konkreti informacija.\nPavyzdžiai: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Lygiai: Trace, Debug, Info, Warning, Error, Critical - šia tvarka, konkretus lygis nutildo visus ankstesnius lygius sąraše ir registruoja visus vėlesnius. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Atnaujinti:\nRelease: Oficialios versijos, išleidžiamos kiekvieną mėnesį, kurios gali būti labai pasenusios, tačiau yra patikimos ir išbandytos.\nNightly: Vystymo versijos, kuriose yra visos naujausios funkcijos ir taisymai, tačiau gali turėti klaidų ir būti mažiau stabilios. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Groti antraščių muziką:\nJei žaidimas tai palaiko, įjungia specialios muzikos grojimą, kai pasirinkite žaidimą GUI. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Slėpti žymeklį:\nPasirinkite, kada žymeklis dings:\nNiekuomet: Visada matysite pelę.\nNeaktyvus: Nustatykite laiką, po kurio ji dings, kai bus neaktyvi.\nVisada: niekada nematysite pelės. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Atgal mygtuko elgesys:\nNustato valdiklio atgal mygtuką imituoti paspaudimą nurodytoje vietoje PS4 jutiklinėje plokštėje. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Nieko - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafikos įrenginys:\nDaugiagrafikėse sistemose pasirinkite GPU, kurį emuliatorius naudos iš išskleidžiamojo sąrašo,\n arba pasirinkite "Auto Select", kad jis būtų nustatytas automatiškai. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Plotis/Aukštis:\nNustato emuliatoriaus lango dydį paleidimo metu, kurį galima keisti žaidimo metu.\nTai skiriasi nuo žaidimo rezoliucijos. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank daliklis:\nKadrų dažnis, kuriuo emuliatorius atnaujinamas, dauginamas iš šio skaičiaus. Pakeitus tai gali turėti neigiamą poveikį, pvz., padidinti žaidimo greitį arba sukelti kritinių žaidimo funkcijų sugadinimą, kurios to nesitikėjo! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Įjungti šešėlių išmetimą:\nTechninio derinimo tikslais saugo žaidimo šešėlius į aplanką juos renderuojant. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Įjungti tuščią GPU:\nTechninio derinimo tikslais išjungia žaidimo renderiavimą, tarsi nebūtų grafikos plokštės. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Žaidimų aplankai:\nAplankų sąrašas, kurį reikia patikrinti, ar yra įdiegtų žaidimų. - addFolderButton + Add:\nAdd a folder to the list. Pridėti:\nPridėti aplanką į sąrašą. - removeFolderButton + Remove:\nRemove a folder from the list. Pašalinti:\nPašalinti aplanką iš sąrašo. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Įjungti derinimo išmetimą:\nIšsaugo importo ir eksporto simbolius bei failo antraštės informaciją apie šiuo metu vykdomą PS4 programą į katalogą. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Įjungti Vulkan patvirtinimo sluoksnius:\nĮjungia sistemą, kuri patvirtina Vulkan renderio būseną ir registruoja informaciją apie jo vidinę būseną. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Įjungti RenderDoc derinimą:\nJei įjungta, emuliatorius suteiks suderinamumą su Renderdoc, kad būtų galima užfiksuoti ir analizuoti šiuo metu renderuojamą kadrą. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 018e900d3..b73ab077d 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches zijn experimenteel.\nGebruik met voorzichtigheid.\n\nDownload cheats afzonderlijk door het repository te selecteren en op de downloadknop te klikken.\nOp het tabblad Patches kun je alle patches tegelijk downloaden, kiezen welke je wilt gebruiken en je selectie opslaan.\n\nAangezien wij de Cheats/Patches niet ontwikkelen,\nmeld problemen bij de auteur van de cheat.\n\nHeb je een nieuwe cheat gemaakt? Bezoek:\n No Image Available @@ -161,7 +161,7 @@ Cheats niet gevonden - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Geen cheats gevonden voor deze game in deze versie van de geselecteerde repository.Probeer een andere repository of een andere versie van het spel. @@ -169,7 +169,7 @@ Cheats succesvol gedownload - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Je hebt cheats succesvol gedownload voor deze versie van het spel uit de geselecteerde repository. Je kunt proberen te downloaden van een andere repository. Als deze beschikbaar is, kan het ook worden gebruikt door het bestand uit de lijst te selecteren. @@ -185,7 +185,7 @@ Download voltooid - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patches succesvol gedownload! Alle beschikbare patches voor alle spellen zijn gedownload. Het is niet nodig om ze afzonderlijk te downloaden voor elk spel dat cheats heeft. Als de patch niet verschijnt, kan het zijn dat deze niet bestaat voor het specifieke serienummer en de versie van het spel. @@ -264,7 +264,7 @@ Netwerkfout: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. De automatische updater staat tot 60 updatecontroles per uur toe.\nJe hebt deze limiet bereikt. Probeer het later opnieuw. @@ -1540,83 +1540,83 @@ Wijzig de muisaanwijzer naar een optie om de beschrijving weer te geven. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Console Taal:\nStelt de taal in die het PS4-spel gebruikt.\nHet wordt aanbevolen om dit in te stellen op een taal die het spel ondersteunt, wat kan variëren per regio. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Opstartscherm weergeven:\nToont het opstartscherm van het spel (een speciale afbeelding) tijdens het starten van het spel. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Discord Rich Presence inschakelen:\nToont het emulatoricoon en relevante informatie op je Discord-profiel. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Gebruikersnaam:\nStelt de gebruikersnaam van het PS4-account in, die door sommige games kan worden weergegeven. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Logtype:\nStelt in of de uitvoer van het logvenster moet worden gesynchroniseerd voor prestaties. Kan nadelige effecten hebben op emulatie. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Logfilter:\nFiltert het logboek om alleen specifieke informatie af te drukken.\nVoorbeelden: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveaus: Trace, Debug, Info, Waarschuwing, Fout, Kritiek - in deze volgorde, een specifiek niveau dempt alle voorgaande niveaus in de lijst en logt alle niveaus daarna. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Updateren:\nRelease: Officiële versies die elke maand worden uitgebracht, die zeer verouderd kunnen zijn, maar betrouwbaar en getest zijn.\nNightly: Ontwikkelingsversies die alle nieuwste functies en bugfixes bevatten, maar mogelijk bugs bevatten en minder stabiel zijn. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Speel titelsong:\nAls een game dit ondersteunt, wordt speciale muziek afgespeeld wanneer je het spel in de GUI selecteert. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Verberg cursor:\nKies wanneer de cursor verdwijnt:\nNooit: Je ziet altijd de muis.\nInactief: Stel een tijd in waarna deze verdwijnt na inactiviteit.\nAltijd: je ziet de muis nooit. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Stel een tijd in voor wanneer de muis verdwijnt na inactiviteit. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Gedrag van de terugknop:\nStelt de terugknop van de controller in om een aanraking op de opgegeven positie op de PS4-touchpad na te bootsen. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Geen - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafische adapter:\nIn systemen met meerdere GPU's, kies de GPU die de emulator uit de vervolgkeuzelijst moet gebruiken,\nof kies "Auto Select" om dit automatisch in te stellen. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Breedte/Hoogte:\nStelt de grootte van het emulatorvenster bij het opstarten in, wat tijdens het spelen kan worden gewijzigd.\nDit is anders dan de resolutie in de game. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank deler:\nDe frame-rate waartegen de emulator wordt vernieuwd, vermenigvuldigd met dit getal. Dit veranderen kan nadelige effecten hebben, zoals het versnellen van het spel of het verpesten van kritieke gamefunctionaliteiten die niet verwachtten dat dit zou veranderen! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Shaderdump inschakelen:\nVoor technische foutopsporing slaat het de shaders van de game op in een map terwijl ze worden gerenderd. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Null GPU inschakelen:\nVoor technische foutopsporing schakelt de game-rendering uit alsof er geen grafische kaart is. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Spelmap:\nDe lijst met mappen om te controleren op geïnstalleerde spellen. - addFolderButton + Add:\nAdd a folder to the list. Toevoegen:\nVoeg een map toe aan de lijst. - removeFolderButton + Remove:\nRemove a folder from the list. Verwijderen:\nVerwijder een map uit de lijst. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Foutopsporing dump inschakelen:\nSlaat de import- en export-symbolen en de bestandsheaderinformatie van de momenteel draaiende PS4-toepassing op in een map. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Vulkan validatielaag inschakelen:\nSchakelt een systeem in dat de status van de Vulkan-renderer valideert en informatie over de interne status ervan logt. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Vulkan synchronisatievalidatie inschakelen:\nSchakelt een systeem in dat de timing van Vulkan-renderingtaken valideert. Dit zal de prestaties verlagen en waarschijnlijk het emulatiegedrag veranderen. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. RenderDoc foutopsporing inschakelen:\nAls ingeschakeld, biedt de emulator compatibiliteit met Renderdoc om de momenteel gerenderde frame vast te leggen en te analyseren. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/no_NO.ts b/src/qt_gui/translations/no_NO.ts index 4e6c2aea3..2613f63b0 100644 --- a/src/qt_gui/translations/no_NO.ts +++ b/src/qt_gui/translations/no_NO.ts @@ -29,8 +29,8 @@ Juks / Programrettelser for - defaultTextEdit_MSG - Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\n No Image Available @@ -161,7 +161,7 @@ Fant ikke juks - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. @@ -169,7 +169,7 @@ Juks ble lastet ned - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. @@ -185,7 +185,7 @@ Nedlasting fullført - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. @@ -264,7 +264,7 @@ Nettverksfeil: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. @@ -1540,83 +1540,83 @@ Pek musen over et alternativ for å vise beskrivelsen. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. @@ -1648,83 +1648,83 @@ Ingen - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. - addFolderButton + Add:\nAdd a folder to the list. Legg til:\nLegg til en mappe til listen. - removeFolderButton + Remove:\nRemove a folder from the list. Fjern:\nFjern en mappe fra listen. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. Lagrede datamappe:\nListe over data shadPS4 lagrer. - browseButton + Browse:\nBrowse for a folder to set as the save data path. Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index d34d38112..1499b1637 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -29,8 +29,8 @@ Kody / Łatki dla - defaultTextEdit_MSG - Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheaty/Patche są eksperymentalne.\nUżywaj ich ostrożnie.\n\nPobierz cheaty pojedynczo, wybierając repozytorium i klikając przycisk pobierania.\nNa zakładce Patches możesz pobrać wszystkie patche jednocześnie, wybrać, które chcesz używać, i zapisać wybór.\n\nPonieważ nie rozwijamy Cheats/Patches,\nproszę zgłosić problemy do autora cheatu.\n\nStworzyłeś nowy cheat? Odwiedź:\n No Image Available @@ -161,7 +161,7 @@ Nie znaleziono kodów - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Nie znaleziono kodów do tej gry w tej wersji wybranego repozytorium. Spróbuj innego repozytorium lub innej wersji gry. @@ -169,7 +169,7 @@ Kody pobrane pomyślnie - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Pomyślnie pobrano kody dla tej wersji gry z wybranego repozytorium. Możesz spróbować pobrać z innego repozytorium. Jeśli jest dostępne, możesz również użyć go, wybierając plik z listy. @@ -185,7 +185,7 @@ Pobieranie zakończone - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Poprawki zostały pomyślnie pobrane! Wszystkie dostępne poprawki dla wszystkich gier zostały pobrane. Nie ma potrzeby pobierania ich osobno dla każdej gry, która ma kody. Jeśli poprawka się nie pojawia, możliwe, że nie istnieje dla konkretnego numeru seryjnego i wersji gry. @@ -264,7 +264,7 @@ Błąd sieci: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Automatyczna aktualizacja umożliwia maksymalnie 60 sprawdzeń aktualizacji na godzinę.\nOsiągnąłeś ten limit. Spróbuj ponownie później. @@ -1540,83 +1540,83 @@ Najedź kursorem na opcję, aby wyświetlić jej opis. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Język konsoli:\nUstala język, który używa gra PS4.\nZaleca się ustawienie tego na język, który obsługuje gra, co może się różnić w zależności od regionu. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Język emulatora:\nUstala język interfejsu użytkownika emulatora. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Wyświetl ekran powitalny:\nPodczas uruchamiania gry wyświetla ekran powitalny (specjalny obraz). - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Włącz Discord Rich Presence:\nWyświetla ikonę emulatora i odpowiednie informacje na twoim profilu Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Nazwa użytkownika:\nUstala nazwę użytkownika konta PS4, która może być wyświetlana w niektórych grach. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Klucz trofeów:\nKlucz używany do odszyfrowywania trofeów. Musi być uzyskany z konsoli po jailbreaku. Musi zawierać tylko znaki w kodzie szesnastkowym. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Typ logu:\nUstala, czy synchronizować wyjście okna dziennika dla wydajności. Może to mieć negatywny wpływ na emulację. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filtr logu:\nFiltruje dziennik, aby drukować tylko określone informacje.\nPrzykłady: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Poziomy: Trace, Debug, Info, Warning, Error, Critical - w tej kolejności, konkretny poziom wycisza wszystkie wcześniejsze poziomy w liście i rejestruje wszystkie poziomy później. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Aktualizator:\nRelease: Oficjalne wersje wydawane co miesiąc, które mogą być bardzo przestarzałe, ale są niezawodne i przetestowane.\nNightly: Wersje rozwojowe, które zawierają wszystkie najnowsze funkcje i poprawki błędów, ale mogą mieć błędy i być mniej stabilne. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Odtwórz muzykę tytułową:\nJeśli gra to obsługuje, aktywuje odtwarzanie specjalnej muzyki podczas wybierania gry w GUI. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Wyłącz wyskakujące okienka trofeów:\nWyłącz powiadomienia o trofeach w grze. Postępy w zdobywaniu trofeów można nadal śledzić za pomocą przeglądarki trofeów (kliknij prawym przyciskiem myszy grę w oknie głównym). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Ukryj kursor:\nWybierz, kiedy kursor zniknie:\nNigdy: Zawsze będziesz widział myszkę.\nNieaktywny: Ustaw czas, po którym zniknie po bezczynności.\nZawsze: nigdy nie zobaczysz myszki. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Ustaw czas, po którym mysz zniknie po bezczynności. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Zachowanie przycisku Wstecz:\nUstawia przycisk Wstecz kontrolera tak, aby emulował dotknięcie określonego miejsca na panelu dotykowym PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Wyświetl dane zgodności:\nWyświetla informacje o kompatybilności gry w widoku tabeli. Włącz opcję „Aktualizuj zgodność przy uruchomieniu”, aby uzyskać aktualne informacje. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Aktualizuj zgodność przy uruchomieniu:\nAutomatycznie aktualizuj bazę danych kompatybilności podczas uruchamiania shadPS4. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. @@ -1648,84 +1648,84 @@ Brak - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Urządzenie graficzne:\nW systemach z wieloma GPU, wybierz GPU, który emulator ma używać z rozwijanego menu,\n lub wybierz "Auto Select", aby ustawić go automatycznie. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Szerokość/Wysokość:\nUstala rozmiar okna emulatora podczas uruchamiania, który może być zmieniany w trakcie gry.\nTo różni się od rozdzielczości w grze. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Dzielnik Vblank:\nWskaźnik klatek, z jakim emulator jest odświeżany, pomnożony przez tę liczbę. Zmiana tego może mieć negatywne skutki, takie jak przyspieszenie gry lub zniszczenie krytycznej funkcjonalności gry, która nie spodziewa się, że to zostanie zmienione! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Włącz zrzucanie shaderów:\nDla technicznego debugowania zapisuje shadery z gry w folderze podczas renderowania. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Włącz Null GPU:\nDla technicznego debugowania dezaktywuje renderowanie gry tak, jakby nie było karty graficznej. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Foldery gier:\nLista folderów do sprawdzenia zainstalowanych gier. - addFolderButton + Add:\nAdd a folder to the list. Dodaj:\nDodaj folder do listy. - removeFolderButton + Remove:\nRemove a folder from the list. Usuń:\nUsuń folder z listy. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Włącz zrzut debugowania:\nZapisuje symbole importu i eksportu oraz informacje nagłówkowe pliku dla aktualnie działającej aplikacji PS4 w katalogu. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Włącz warstwę walidacji Vulkan:\nWłącza system, który waliduje stan renderera Vulkan i loguje informacje o jego wewnętrznym stanie. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Włącz walidację synchronizacji Vulkan:\nWłącza system, który waliduje timing zadań renderowania Vulkan. Zmniejszy to wydajność i prawdopodobnie zmieni zachowanie emulacji. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Włącz debugowanie RenderDoc:\nJeśli włączone, emulator zapewnia kompatybilność z Renderdoc, aby umożliwić nagrywanie i analizowanie aktualnie renderowanej klatki. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index ae9bfe68f..6ecf59003 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -29,8 +29,8 @@ Cheats / Patches para - defaultTextEdit_MSG - Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\n No Image Available @@ -161,7 +161,7 @@ Cheats Não Encontrados - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. @@ -169,7 +169,7 @@ Cheats Baixados com Sucesso - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. @@ -185,7 +185,7 @@ Download Completo - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. @@ -264,7 +264,7 @@ Erro de rede: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. O Atualizador Automático permite até 60 verificações de atualização por hora.\nVocê atingiu esse limite. Por favor, tente novamente mais tarde. @@ -1540,83 +1540,83 @@ Passe o mouse sobre uma opção para exibir sua descrição. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Idioma do emulador:\nDefine o idioma da interface do emulador. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Habilitar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Habilitar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Mostrar Splash Inicial:\nExibe a tela inicial do jogo (imagem especial) ao iniciar o jogo. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Habilitar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Você sempre verá o mouse.\nParado: Defina um tempo para ele desaparecer após ficar inativo.\nSempre: Você nunca verá o mouse. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Defina um tempo em segundos para o mouse desaparecer após ficar inativo. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade. @@ -1648,84 +1648,84 @@ Nenhum - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Habilitar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Habilitar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Pastas dos jogos:\nA lista de pastas para verificar se há jogos instalados. - addFolderButton + Add:\nAdd a folder to the list. Adicionar:\nAdicione uma pasta à lista. - removeFolderButton + Remove:\nRemove a folder from the list. Remover:\nRemove uma pasta da lista. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Habilitar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Habilitar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Habilitar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Habilitar Depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Coletar Shaders:\nVocê precisa habilitar isso para editar shaders com o menu de depuração (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depurar erros de 'Device lost'. Se você tiver isso habilitado, você deve habilitar os Marcadores de Depuração de Host e de Convidado.\nNão funciona em GPUs da Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o SDK do Vulkan para que isso funcione. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copiar Buffers de GPU:\nContorna condições de corrida envolvendo envios de GPU.\nPode ou não ajudar com travamentos do PM4 tipo 0. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Marcadores de Depuração de Host:\nInsere informações do lado do emulador, como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, você deve habilitar o "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, você deve habilitar "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index ab8d450fd..8c36b37e3 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches sunt experimentale.\nUtilizați cu prudență.\n\nDescărcați cheats individual prin selectarea depozitului și făcând clic pe butonul de descărcare.\nÎn fila Patches, puteți descărca toate patch-urile deodată, alege pe cele pe care doriți să le utilizați și salvați selecția.\n\nDeoarece nu dezvoltăm Cheats/Patches,\nte rugăm să raportezi problemele autorului cheat-ului.\n\nAi creat un nou cheat? Vizitează:\n No Image Available @@ -161,7 +161,7 @@ Cheats Nu au fost găsite - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Nu au fost găsite cheats pentru acest joc în această versiune a repository-ului selectat, încearcă un alt repository sau o versiune diferită a jocului. @@ -169,7 +169,7 @@ Cheats descărcate cu succes - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Ai descărcat cu succes cheats-urile pentru această versiune a jocului din repository-ul selectat. Poți încerca descărcarea din alt repository; dacă este disponibil, va fi posibil să-l folosești selectând fișierul din listă. @@ -185,7 +185,7 @@ Descărcare completă - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patches descărcate cu succes! Toate Patches disponibile pentru toate jocurile au fost descărcate; nu este nevoie să le descarci individual pentru fiecare joc, așa cum se întâmplă cu Cheats. Dacă patch-ul nu apare, este posibil să nu existe pentru seria și versiunea specifică a jocului. @@ -264,7 +264,7 @@ Eroare de rețea: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Actualizatorul automat permite până la 60 de verificări de actualizare pe oră.\nAți atins această limită. Vă rugăm să încercați din nou mai târziu. @@ -1540,83 +1540,83 @@ Indicați mouse-ul asupra unei opțiuni pentru a afișa descrierea acesteia. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Limba consolei:\nSetează limba pe care o folosește jocul PS4.\nSe recomandă să setezi această opțiune pe o limbă pe care jocul o suportă, ceea ce poate varia în funcție de regiune. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Afișează ecranul de încărcare:\nAfișează ecranul de încărcare al jocului (o imagine specială) în timp ce jocul pornește. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Activați Discord Rich Presence:\nAfișează pictograma emulatorului și informații relevante pe profilul dumneavoastră Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Nume utilizator:\nSetează numele de utilizator al contului PS4, care poate fi afișat de unele jocuri. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Tip jurnal:\nSetează dacă să sincronizezi ieșirea ferestrei de jurnal pentru performanță. Aceasta poate avea efecte adverse asupra emulării. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filtrul jurnalului:\nFiltrează jurnalul pentru a imprima doar informații specifice.\nExemple: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Niveluri: Trace, Debug, Info, Warning, Error, Critical - în această ordine, un nivel specific reduce toate nivelurile anterioare din listă și înregistrează toate nivelurile ulterioare. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Actualizare:\nRelease: Versiuni oficiale lansate în fiecare lună, care pot fi foarte învechite, dar sunt mai fiabile și testate.\nNightly: Versiuni de dezvoltare care conțin toate cele mai recente funcții și corecții, dar pot conține erori și sunt mai puțin stabile. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Redă muzica titlului:\nDacă un joc o suportă, activează redarea muzicii speciale când selectezi jocul în GUI. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Ascunde cursorul:\nAlegeți când va dispărea cursorul:\nNiciodată: Vei vedea întotdeauna mouse-ul.\nInactiv: Setează un timp pentru a dispărea după inactivitate.\nÎntotdeauna: nu vei vedea niciodată mouse-ul. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Setați un timp pentru ca mouse-ul să dispară după ce a fost inactiv. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Comportamentul butonului înapoi:\nSetează butonul înapoi al controlerului să imite atingerea poziției specificate pe touchpad-ul PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Niciunul - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Dispozitiv grafic:\nPe sistemele cu mai multe GPU-uri, alege GPU-ul pe care emulatorul îl va folosi din lista derulantă,\nsau selectează "Auto Select" pentru a-l determina automat. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Lățime/Înălțime:\nSetează dimensiunea ferestrei emulatorului la lansare, care poate fi redimensionată în timpul jocului.\nAceasta este diferită de rezoluția din joc. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Împărțitor Vblank:\nRata de cadre cu care emulatorul se reîmprospătează este multiplicată cu acest număr. Schimbarea acestuia poate avea efecte adverse, cum ar fi creșterea vitezei jocului sau distrugerea funcționalității critice a jocului care nu se așteaptă ca aceasta să se schimbe! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Activează salvarea shaderelor:\nÎn scopuri de depanare tehnică, salvează shader-urile jocului într-un folder pe măsură ce sunt randate. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Activează GPU Null:\nÎn scopuri de depanare tehnică, dezactivează redarea jocului ca și cum nu ar exista o placă grafică. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Folderele jocurilor:\nLista folderelor pentru a verifica jocurile instalate. - addFolderButton + Add:\nAdd a folder to the list. Adăugați:\nAdăugați un folder la listă. - removeFolderButton + Remove:\nRemove a folder from the list. Eliminați:\nÎndepărtați un folder din listă. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Activează salvarea pentru depanare:\nSalvează simbolurile de import și export și informațiile din antetul fișierului pentru aplicația PS4 care rulează în prezent într-un director. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Activează straturile de validare Vulkan:\nActivează un sistem care validează starea renderer-ului Vulkan și înregistrează informații despre starea sa internă. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Activează validarea sincronizării Vulkan:\nActivează un sistem care validează sincronizarea sarcinilor de redare Vulkan. Aceasta va reduce performanța și probabil va schimba comportamentul emulării. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Activează depanarea RenderDoc:\nDacă este activat, emulatorul va oferi compatibilitate cu Renderdoc pentru a permite capturarea și analiza cadrului redat în prezent. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 70294e896..e0289f690 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -29,8 +29,8 @@ Читы и патчи для - defaultTextEdit_MSG - Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Читы и патчи экспериментальны.\nИспользуйте с осторожностью.\n\nСкачивайте читы, выбрав репозиторий и нажав на кнопку загрузки.\nВо вкладке "Патчи" вы можете скачать все патчи сразу, выбирать какие вы хотите использовать, и сохранять выбор.\n\nПоскольку мы не разрабатываем читы/патчи,\nпожалуйста сообщайте о проблемах автору чита/патча.\n\nСоздали новый чит? Посетите:\n No Image Available @@ -161,7 +161,7 @@ Читы не найдены - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Читы не найдены для этой игры в выбранном репозитории. Попробуйте другой репозиторий или другую версию игры. @@ -169,7 +169,7 @@ Читы успешно скачаны - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Вы успешно скачали читы для этой версии игры из выбранного репозитория. Вы можете попробовать скачать из другого репозитория. Если он доступен, его также можно будет использовать, выбрав файл из списка. @@ -185,7 +185,7 @@ Скачивание завершено - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Патчи успешно скачаны! Все доступные патчи для всех игр были скачаны, нет необходимости скачивать их по отдельности для каждой игры, как это происходит с читами. Если патч не появляется, возможно, его не существует для конкретного серийного номера и версии игры. @@ -264,7 +264,7 @@ Сетевая ошибка: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Автообновление позволяет выполнять до 60 проверок обновлений в час.\nВы достигли этого лимита. Пожалуйста, попробуйте позже. @@ -1540,83 +1540,83 @@ Наведите указатель мыши на опцию, чтобы отобразить ее описание. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем "CUSA00000-UPDATE", где идентификатор CUSA совпадает с идентификатором игры. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Показывать заставку:\nОтображает заставку игры (специальное изображение) во время запуска. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Включить Discord Rich Presence:\nОтображает значок эмулятора и соответствующую информацию в вашем профиле Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Ключ трофеев:\nКлюч, используемый для расшифровки трофеев. Должен быть получен из вашей взломанной консоли.\nДолжен содержать только шестнадцатеричные символы. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Тип логов:\nУстановите, синхронизировать ли вывод окна логов ради производительности. Это может негативно сказаться на эмуляции. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Обновление:\nRelease: Официальные версии, которые выпускаются каждый месяц и могут быть очень старыми, но они более надежные и проверенные.\nNightly: Версии разработки, которые содержат все последние функции и исправления, но могут содержать ошибки и менее стабильны. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Играть заглавную музыку:\nВключает воспроизведение специальной музыки при выборе игры в списке, если она это поддерживает. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Отключить уведомления о трофеях:\nОтключает внутриигровые уведомления о трофеях. Прогресс трофеев по-прежнему можно отслеживать в меню просмотра трофеев (правая кнопка мыши по игре в главном окне). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Скрывать курсор:\nВыберите, когда курсор будет скрыт:\nНикогда: Вы всегда будете видеть курсор.\nПри бездействии: Установите время, через которое курсор будет скрыт при бездействии.\nВсегда: Курсор всегда будет скрыт. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Время скрытия курсора при бездействии:\nУстановите время, через которое курсор исчезнет при бездействии. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Поведение кнопки «Назад»:\nНастраивает кнопку «Назад» контроллера на эмуляцию нажатия на указанную область на сенсорной панели контроллера PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Показывать данные совместимости:\nПоказывает информацию о совместимости игр в таблице. Включите «Обновлять базу совместимости при запуске» для получения актуальной информации. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Обновлять базу совместимости при запуске:\nАвтоматически обновлять базу данных совместимости при запуске shadPS4. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. @@ -1648,83 +1648,83 @@ Нет - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Графическое устройство:\nВ системах с несколькими GPU выберите тот, который будет использовать эмулятор.\nВыберите "Автовыбор", чтобы определить GPU автоматически. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Ширина/Высота:\nУстановите размер окна эмулятора при запуске, который может быть изменен во время игры.\nЭто отличается от разрешения в игре. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Делитель Vblank:\nЧастота кадров, с которой обновляется эмулятор, умножается на это число. Изменение этого параметра может иметь негативные последствия, такие как увеличение скорости игры или нарушение критических функций игры, которые этого не ожидают! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Включить дамп шейдеров:\nДля технической отладки сохраняет шейдеры игр в папку во время рендеринга. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Включить NULL GPU:\nДля технической отладки отключает рендеринг игры так, как будто графической карты нет. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Игровые папки:\nСписок папок для проверки установленных игр. - addFolderButton + Add:\nAdd a folder to the list. Добавить:\nДобавить папку в список. - removeFolderButton + Remove:\nRemove a folder from the list. Удалить:\nУдалить папку из списка. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Включить отладочные дампы:\nСохраняет символы импорта, экспорта и информацию о заголовке файла текущей исполняемой программы PS4 в папку. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Включить слои валидации Vulkan:\nВключает систему, которая проверяет состояние рендерера Vulkan и логирует информацию о его внутреннем состоянии. Это снизит производительность и, вероятно, изменит поведение эмуляции. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Включить отладку RenderDoc:\nЕсли включено, эмулятор обеспечит совместимость с RenderDoc, позволяя захватывать и анализировать текущие кадры во время рендеринга. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Собирать шейдеры:\nВам необходимо включить эту функцию для редактирования шейдеров с помощью меню отладки (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Диагностика сбоев:\nСоздает .yaml файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Копировать буферы GPU:\nПозволяет обойти состояния гонки, связанные с отправками GPU.\nМожет помочь или не помочь при сбоях PM4 типа 0. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Маркеры отладки хоста:\nДобавляет информацию на стороне эмулятора, например маркеры для определенных команд AMDGPU, вокруг команд Vulkan, а также присваивает ресурсам отладочные имена.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Маркеры отладки гостя:\nДобавляет любые отладочные маркеры, добавленные самой игрой, в буфер команд.\nЕсли эта функция включена, вам следует включить Диагностику сбоев.\nПолезно для таких программ, как RenderDoc. - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. Путь сохранений:\nПапка, в которой будут храниться сохранения игр. - browseButton + Browse:\nBrowse for a folder to set as the save data path. Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений. diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 6a2fbaa5d..010d0ef1e 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -29,8 +29,8 @@ Mashtrime / Arna për - defaultTextEdit_MSG - Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Mashtrimet/Arnat janë eksperimentale.\nPërdori me kujdes.\n\nShkarko mashtrimet individualisht duke zgjedhur depon dhe duke klikuar butonin e shkarkimit.\nNë skedën Arna, mund t'i shkarkosh të gjitha arnat menjëherë, të zgjidhësh cilat dëshiron të përdorësh dhe të ruash zgjedhjen tënde.\n\nMeqenëse ne nuk zhvillojmë Mashtrimet/Arnat,\ntë lutem raporto problemet te autori i mashtrimit.\n\nKe krijuar një mashtrim të ri? Vizito:\n No Image Available @@ -161,7 +161,7 @@ Mashtrimet nuk u gjetën - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Nuk u gjetën mashtrime për këtë lojë në këtë version të depove të përzgjedhura, provo një depo tjetër ose një version tjetër të lojës. @@ -169,7 +169,7 @@ Mashtrimet u shkarkuan me sukses - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Ke shkarkuar me sukses mashtrimet për këtë version të lojës nga depoja e përzgjedhur. Mund të provosh të shkarkosh nga një depo tjetër, nëse ofrohet do të jetë e mundur gjithashtu ta përdorësh duke përzgjedhur skedarin nga lista. @@ -185,7 +185,7 @@ Shkarkimi përfundoi - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Arnat u shkarkuan me sukses! Të gjitha arnat e ofruara për të gjitha lojërat janë shkarkuar, nuk ka nevojë t'i shkarkosh ato individualisht për secilën lojë siç ndodh me Mashtrimet. Nëse arna nuk shfaqet, mund të mos ekzistojë për numrin e serikut dhe versionin specifik të lojës. @@ -264,7 +264,7 @@ Gabim rrjeti: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Përditësuesi Automatik lejon deri në 60 kontrolle për përditësime në orë.\nKe arritur këtë kufi. Të lutem provo përsëri më vonë. @@ -1540,83 +1540,83 @@ Vendos miun mbi një rregullim për të shfaqur përshkrimin e tij. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Gjuha e konsolës:\nPërcakton gjuhën që përdor loja PS4.\nKëshillohet të caktosh një gjuhë që loja mbështet, e cila do të ndryshojë sipas rajonit. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës në mënyrën e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur tastin F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Aktivizo dosjen e ndarë të përditësimit:\nAktivizon instalimin e përditësimeve të lojërave në dosje të veçanta për menaxhim më të lehtë.\nKjo mund të krijohet manualisht duke shtuar përditësimin e shpaketuar në dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID-në e lojës. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Shfaq ekranin e ngarkesës:\nShfaq ekranin e ngarkesës së lojës (një pamje e veçantë) gjatë fillimit të lojës. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Aktivizo Discord Rich Presence:\nShfaq ikonën e emulatorit dhe informacionin përkatës në profilin tënd në Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Çelësi i Trofeve:\nÇelësi përdoret për të deshifruar trofetë. Duhet të merret nga konsola jote me jailbreak.\nDuhet të përmbajë vetëm karaktere hex. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Lloji i ditarit:\nPërcakton nëse të sinkronizohet dalja e dritares së ditarit për performancë. Mund të ketë efekte të këqija në emulim. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. Imazhi i Sfondit:\nKontrollo tejdukshmërinë e imazhit të sfondit të lojës. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Luaj muzikën e titullit:\nNëse një lojë e mbështet, aktivizohet luajtja e muzikës të veçantë kur të zgjidhësh lojën në ndërfaqe. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Çaktivizo njoftimet për Trofetë:\nÇaktivizo njoftimet për trofetë gjatë lojës. Përparimi i trofeve mund të ndiqet duke përdorur Shikuesin e Trofeve (kliko me të djathtën mbi lojën në dritaren kryesore). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Fsheh kursorin:\nZgjidh kur do të fshihet kursori:\nKurrë: Do ta shohësh gjithmonë miun.\nJoaktiv: Vendos një kohë për ta fshehur pas mosveprimit.\nGjithmonë: nuk do ta shohësh kurrë miun. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Koha për fshehjen e kursorit joaktiv:\nKohëzgjatja (në sekonda) pas së cilës kursori që nuk ka qënë në veprim fshihet. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mprapa. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për të marrë informacion të përditësuar. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Përditëso përputhshmërinë gjatë nisjes:\nPërditëson automatikisht bazën e të dhënave të përputhshmërisë kur shadPS4 niset. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. @@ -1648,83 +1648,83 @@ Asnjë - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Pajisja grafike:\nNë sistemet me GPU të shumëfishta, zgjidh GPU-në që do të përdorë emulatori nga lista rënëse,\nose zgjidh "Auto Select" për ta përcaktuar automatikisht. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Gjerësia/Lartësia:\nPërcakton madhësinë e dritares së emulatorit në nisje, e cila mund të rregullohet gjatë lojës.\nKjo është ndryshe nga rezolucioni në lojë. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Ndarësi Vblank:\nFrekuenca pamore me të cilën rifreskohet emulatori shumëzohet me këtë numër. Ndryshimi i këtij mund të ketë efekte të këqija, si rritja e shpejtësisë së lojës ose prishja e punimit thelbësor të lojës që nuk e pret këtë ndryshim! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Aktivizo zbrazjen e shaders-ave:\nPër qëllime të korrigjimit teknik, ruan shaders-at e lojës në një dosje ndërsa ato pasqyrohen. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Aktivizo GPU-në Null:\nPër qëllime të korrigjimit teknik, çaktivizon pasqyrimin e lojës sikur nuk ka një kartë grafike. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Dosjet e lojërave:\nLista e dosjeve për të kontrolluar lojërat e instaluara. - addFolderButton + Add:\nAdd a folder to the list. Shto:\nShto një dosje në listë. - removeFolderButton + Remove:\nRemove a folder from the list. Hiq:\nHiq një dosje nga lista. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Aktivizo zbrazjen për korrigjim:\nRuan simbolet e importit dhe eksportit dhe informacionin e kreut të skedarit për aplikacionin PS4 që po ekzekutohet në një dosje. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Aktivizo korrigjimin RenderDoc:\nNëse aktivizohet, emulatori do të ofrojë pajtueshmëri me Renderdoc për të lejuar kapjen dhe analizën e pamjes të pasqyruar në moment. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Mblidh Shader-at:\nDuhet ta aktivizosh këtë për të redaktuar shader-at me menynë e korrigjimit (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Diagnoza e rënies:\nKrijon një skedar .yaml me informacion rreth gjendjes së Vulkan-it në momentin e rënies.\nE dobishme për zgjidhjen e gabimeve 'Device lost'. Nëse e ke aktivizuar këtë, duhet të aktivizosh Shënjuesit e korrigjimit të host-it DHE të guest-it.\nNuk punon me GPU-t Intel.\nDuhet të kesh aktivizuar Shtresat e Vlefshmërisë Vulkan dhe Vulkan SDK që kjo të punojë. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Kopjo buffer-ët e GPU-së:\nShmang kushtet e garës (race conditions) që lidhen me dërgimet e GPU-së.\nMund të ndihmojë, ose jo, në rast rëniesh të llojit PM4 0. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Shënjuesit e korrigjimit të host-it:\nShton informacion nga ana e emulatorit, si shënjues për komandat specifike AMDGPU rreth komandave Vulkan, si dhe jep burimeve emra korrigjimi.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Shënjuesit e korrigjimit të guest-it:\nShton çdo shënjues për korrigjim që loja vetë ka shtuar në buffer-in e komandave.\nNëse e ke aktivizuar këtë, duhet të aktivizosh diagnozën e rënieve.\nE dobishme për programe si RenderDoc. - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. Shtegu i Ruajtjes së të Dhënave:\nDosja ku do të ruhen të dhënat e ruajtjes së lojës. - browseButton + Browse:\nBrowse for a folder to set as the save data path. Shfleto:\nShfleto për të vendosur një dosje si shteg të ruajtjes së të dhënave. diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 853208a45..28a07128e 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -29,8 +29,8 @@ Fusk / Patchar för - defaultTextEdit_MSG - Fusk/Patchar är experimentella.\nAnvänd med försiktighet.\n\nHämta fusk individuellt genom att välja förrådet och klicka på hämtningsknappen.\nUnder Patchar-fliken kan du hämta alla patchar på en gång, välj vilken du vill använda och spara ditt val.\n\nEftersom vi inte utvecklar fusk eller patchar,\nrapportera gärna problem till fuskets upphovsperson.\n\nSkapat ett nytt fusk? Besök:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Fusk/Patchar är experimentella.\nAnvänd med försiktighet.\n\nHämta fusk individuellt genom att välja förrådet och klicka på hämtningsknappen.\nUnder Patchar-fliken kan du hämta alla patchar på en gång, välj vilken du vill använda och spara ditt val.\n\nEftersom vi inte utvecklar fusk eller patchar,\nrapportera gärna problem till fuskets upphovsperson.\n\nSkapat ett nytt fusk? Besök:\n No Image Available @@ -161,7 +161,7 @@ Fusk hittades inte - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Inga fusk hittades för detta spel i denna version av det valda förrådet. Prova ett annat förråd eller en annan version av spelet @@ -169,7 +169,7 @@ Fusk hämtades ner - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Du har hämtat ner fusken för denna version av spelet från valt förråd. Du kan försöka att hämta från andra förråd, om de är tillgängliga så kan det vara möjligt att använda det genom att välja det genom att välja filen från listan @@ -185,7 +185,7 @@ Hämtning färdig - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Patchhämtningen är färdig! Alla patchar tillgängliga för alla spel har hämtats och de behövs inte hämtas individuellt för varje spel som med fusk. Om patchen inte dyker upp kan det bero på att den inte finns för det specifika serienumret och versionen av spelet @@ -264,7 +264,7 @@ Nätverksfel: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Den automatiska uppdateraren tillåter upp till 60 uppdateringskontroller per timme.\nDu har uppnått denna gräns. Försök igen senare @@ -1540,83 +1540,83 @@ Flytta muspekaren till ett alternativ för att visa dess beskrivning. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konsollspråk:\nStäller in språket som PS4-spelet använder.\nDet rekommenderas att ställa in detta till ett språk som spelet har stöd för, vilket kan skilja sig mellan regioner - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka på F11-tangenten - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Visa startskärm:\nVisar spelets startskärm (en speciell bild) när spelet startas - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Aktivera Discord Rich Presence:\nVisar emulatorikonen och relevant information på din Discord-profil - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Användarnamn:\nStäller in PS4ans användarkonto, som kan visas av vissa spel - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trofényckel:\nNyckel som används för att avkryptera troféer. Måste hämtas från din konsoll (jailbroken).\nMåste innehålla endast hex-tecken - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Loggtyp:\nStäller in huruvida synkronisering av utdata för loggfönstret för prestanda. Kan ha inverkan på emulationen - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Loggfilter:\nFiltrera loggen till att endast skriva ut specifik information.\nExempel: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNivåer: Trace, Debug, Info, Warning, Error, Critical - i den ordningen, en specifik nivå som tystar alla nivåer före den i listan och loggar allting efter den - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Uppdatering:\nRelease: Officiella versioner som släpps varje månad som kan vara mycket utdaterade, men är mer pålitliga och testade.\nNightly: Utvecklingsversioner som har de senaste funktionerna och fixarna, men kan innehålla fel och är mindre stabila - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. Bakgrundsbild:\nKontrollerar opaciteten för spelets bakgrundsbild - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Spela upp titelmusik:\nOm ett spel har stöd för det kan speciell musik spelas upp från spelet i gränssnittet - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Inaktivera popup för troféer:\nInaktivera troféeaviseringar i spel. Troféförlopp kan fortfarande följas med Troféevisaren (högerklicka på spelet i huvudfönstret) - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Dölj pekare:\nVälj när muspekaren ska försvinna:\nAldrig: Du kommer alltid se muspekaren.\nOverksam: Ställ in en tid för när den ska försvinna efter den inte använts.\nAlltid: du kommer aldrig se muspekaren - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Dölj pekare vid overksam:\nLängden (sekunder) efter vilken som muspekaren som har varit overksam döljer sig själv - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Beteende för bakåtknapp:\nStäller in handkontrollerns bakåtknapp för att emulera ett tryck på angivna positionen på PS4ns touchpad - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Visa kompatibilitetsdata:\nVisar information om spelkompatibilitet i tabellvyn. Aktivera "Uppdatera kompatibilitet vid uppstart" för att få uppdaterad information - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Uppdatera kompatibilitet vid uppstart:\nUppdatera automatiskt kompatibilitetsdatabasen när shadPS4 startar - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt @@ -1648,83 +1648,83 @@ Ingen - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafikenhet:\nFör system med flera GPUer kan du välja den GPU som emulatorn ska använda från rullgardinsmenyn,\neller välja "Auto Select" för att automatiskt bestämma det - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Bredd/Höjd:\nStäller in storleken för emulatorfönstret vid uppstart, som kan storleksändras under spelning.\nDetta är inte det samma som spelupplösningen - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank Divider:\nBildfrekvensen som emulatorn uppdaterar vid multipliceras med detta tal. Ändra detta kan ha inverkan på saker, såsom ökad spelhastighet eller göra sönder kritisk spelfunktionalitet, som inte förväntar sig denna ändring - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Aktivera Shaders Dumping:\nFör teknisk felsökning, sparar spelets shaders till en mapp när de renderas - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Aktivera Null GPU:\nFör teknisk felsökning, inaktiverar spelrenderingen som om det inte fanns något grafikkort - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Spelmappar:\nListan över mappar att leta i efter installerade spel - addFolderButton + Add:\nAdd a folder to the list. Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar till en separat mapp för enkel hantering.\nDetta kan manuellt skapas genom att lägga till den uppackade uppdateringen till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id - removeFolderButton + Remove:\nRemove a folder from the list. Ta bort:\nTa bort en mapp från listan - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Aktivera felsökningsdumpning:\nSparar import och export av symboler och fil-header-information för aktuellt körande PS4-program till en katalog - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Aktivera Vulkan Validation Layers:\nAktiverar ett system som validerar tillståndet för Vulkan renderer och loggar information om dess interna tillstånd.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Aktivera Vulkan Synchronization Validation:\nAktiverar ett system som validerar timing för Vulkan rendering tasks.\nDetta kommer minska prestandan och antagligen ändra beteendet för emuleringen - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Aktivera RenderDoc-felsökning:\nOm aktiverad kommer emulatorn att tillhandahålla kompatibilitet med Renderdoc för att tillåta fångst och analys för aktuell renderad bildruta - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Samla shaders:\nDu behöver aktivera detta för att redigera shaders med felsökningsmenyn (Ctrl + F10) - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Krashdiagnostik:\nSkapar en .yaml-fil med information om Vulkan-tillståndet vid tid för kraschen.\nAnvändbart för felsökning av 'Device lost'-fel. Om du har aktiverat detta bör du aktivera felsökningsmarkörer för Värd OCH Gäst.\nFungerar inte på Intel GPUer.\nDu behöver aktivera Vulkan Validation Layers och Vulkan SDK för att detta ska fungera - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Kopiera GPU-buffertar:\nGör att man kan komma runt race conditions som involverar GPU submits.\nKan eller kan inte hjälpa med PM4 type 0-kraschar - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Felsökningsmarkörer för värd:\nInfogar informationsliknande markörer i emulatorn för specifika AMDGPU-kommandon runt Vulkan-kommandon, så väl som ger resurser felsökningsnamn.\nOm du har detta aktiverat bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Felsökningsmarkörer för gäst:\nInfogar felsökningsmarkörer som själva spelet har lagt till i kommandobufferten.\nOm du har aktiverat detta bör du aktivera Kraschdiagnostik.\nAnvändbart för program som RenderDoc - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. Sökväg för sparat data:\nSökvägen där spelets sparade data kommer att sparas - browseButton + Browse:\nBrowse for a folder to set as the save data path. Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 760fda1f2..4d762cea5 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\n No Image Available @@ -161,7 +161,7 @@ Hileler Bulunamadı - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Bu oyun için seçilen depoda hile bulunamadı.Başka bir depo veya oyun sürümü deneyin. @@ -169,7 +169,7 @@ Hileler Başarıyla İndirildi - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Bu oyun sürümü için hileleri başarıyla indirdiniz. Başka bir depodan indirmeyi deneyebilirsiniz. Eğer mevcutsa, listeden dosyayı seçerek de kullanılabilir. @@ -185,7 +185,7 @@ İndirme Tamamlandı - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Yamalar başarıyla indirildi! Tüm oyunlar için mevcut tüm yamalar indirildi, her oyun için ayrı ayrı indirme yapmanız gerekmez, hilelerle olduğu gibi. Yamanın görünmemesi durumunda, belirli seri numarası ve oyun sürümü için mevcut olmayabilir. @@ -264,7 +264,7 @@ Ağ hatası: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Otomatik Güncelleyici, saat başına en fazla 60 güncelleme kontrolüne izin verir.\nBu sınıra ulaştınız. Lütfen daha sonra tekrar deneyin. @@ -1540,83 +1540,83 @@ Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Konsol Dili:\nPS4 oyununun kullandığı dili ayarlar.\nBu seçeneği, oyunun desteklediği bir dilde ayarlamanız önerilir; bu durum bölgeye göre değişebilir. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Açılış Ekranını Göster:\nOyun açılırken (özel bir görüntü) açılış ekranını gösterir. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Discord Rich Presence'i etkinleştir:\nEmülatör simgesini ve Discord profilinizdeki ilgili bilgileri gösterir. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Kullanıcı Adı:\nBazı oyunlar tarafından gösterilebilen PS4 hesabının kullanıcı adını ayarlar. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Günlük Türü:\nPerformans için günlük penceresi çıkışını senkronize etme durumunu ayarlar. Bu, emülasyonda olumsuz etkilere yol açabilir. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Günlük Filtre:\nSadece belirli bilgileri yazdırmak için günlüğü filtreler.\nÖrnekler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Düzeyler: Trace, Debug, Info, Warning, Error, Critical - bu sırada, belirli bir seviye listede önceki tüm seviyeleri susturur ve sonraki tüm seviyeleri kaydeder. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Güncelleme:\nRelease: Her ay yayınlanan resmi sürümler; çok eski olabilirler, ancak daha güvenilirdir ve test edilmiştir.\nNightly: Tüm en son özellikler ve düzeltmeler ile birlikte geliştirme sürümleri; hatalar içerebilir ve daha az kararlıdırlar. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. İmleci gizle:\nİmlecin ne zaman kaybolacağını seçin:\nAsla: Fareyi her zaman göreceksiniz.\nPasif: Hareketsiz kaldıktan sonra kaybolması için bir süre belirleyin.\nHer zaman: fareyi asla göremeyeceksiniz. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Geri düğmesi davranışı:\nKontrol cihazındaki geri düğmesini, PS4'ün dokunmatik panelindeki belirlenen noktaya dokunmak için ayarlar. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Yok - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Grafik Aygıtı:\nBirden fazla GPU'ya sahip sistemlerde, emülatörün kullanacağı GPU'yu açılır listeden seçin,\nor "Auto Select" seçeneğini seçerek otomatik olarak belirlenmesini sağlayın. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Genişlik/Yükseklik:\nEmülatör penceresinin açılışta boyutunu ayarlar; bu, oyun sırasında yeniden boyutlandırılabilir.\nBu, oyundaki çözünürlükten farklıdır. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank Bölücü:\nEmülatörün yenileme hızı bu sayı ile çarpılır. Bu değerin değiştirilmesi olumsuz etkilere yol açabilir; oyun hızını artırabilir veya oyunun beklemediği kritik işlevselliği bozabilir! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Shader'ları Dışa Aktarmayı Etkinleştir:\nTeknik hata ayıklama amacıyla, shader'ları render edildikçe bir klasöre kaydeder. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Null GPU'yu Etkinleştir:\nTeknik hata ayıklama amacıyla, oyunun render edilmesini grafik kartı yokmuş gibi devre dışı bırakır. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Oyun klasörleri:\nYüklenmiş oyunları kontrol etmek için klasörlerin listesi. - addFolderButton + Add:\nAdd a folder to the list. Ekle:\nListeye bir klasör ekle. - removeFolderButton + Remove:\nRemove a folder from the list. Kaldır:\nListeden bir klasörü kaldır. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Hata Ayıklama için Dışa Aktarmayı Etkinleştir:\nŞu anda çalışan PS4 uygulaması için içe aktarılan ve dışa aktarılan sembolleri ve dosya başlık bilgilerini bir dizine kaydedin. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Vulkan Doğrulama Katmanlarını Etkinleştir:\nVulkan renderlayıcısının durumunu doğrulayan ve iç durum hakkında bilgi kaydeden bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Vulkan Senkronizasyon Doğrulamasını Etkinleştir:\nVulkan renderlama görevlerinin senkronizasyonunu doğrulayan bir sistemi etkinleştirir. Bu, performansı düşürür ve muhtemelen emülasyon davranışını değiştirir. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. RenderDoc Hata Ayıklamayı Etkinleştir:\nEğer etkinleştirilirse, emülatör mevcut render edilmiş çerçeveyi yakalamak ve analiz etmek için Renderdoc ile uyumluluk sunar. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 50d1e0f10..8506d6e33 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -29,8 +29,8 @@ Чити та Патчі для - defaultTextEdit_MSG - Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Чити та Патчі є експериментальними.\nВикористовуйте з обережністю.\n\nЗавантажуйте чити окремо, вибравши репозиторій і натиснувши кнопку завантаження.\nУ вкладці "Патчі" ви можете завантажити всі патчі відразу, вибрати, які з них ви хочете використовувати, і зберегти свій вибір.\n\nОскільки ми не займаємося розробкою читів/патчів,\nбудь ласка, повідомляйте про проблеми автору чита/патча.\n\nСтворили новий чит? Відвідайте:\n No Image Available @@ -161,7 +161,7 @@ Читів не знайдено - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. У вибраному репозиторії не знайдено Читів для цієї гри, спробуйте інший репозиторій або іншу версію гри. @@ -169,7 +169,7 @@ Чити успішно завантажено - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Ви успішно завантажили чити для цієї версії гри з обраного репозиторія. Ви можете спробувати завантажити з іншого репозиторія, якщо він буде доступним, ви також зможете скористатися ним, вибравши файл зі списку. @@ -185,7 +185,7 @@ Заватнаження завершено - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Патчі успішно завантажено! Всі доступні патчі для усіх ігор, завантажено, немає необхідності завантажувати їх окремо для кожної гри, як це відбувається у випадку з читами. Якщо патч не з’являється, можливо, його не існує для конкретного серійного номера та версії гри. Можливо, необхідно оновити гру. @@ -264,7 +264,7 @@ Мережева помилка: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Автооновлення дозволяє до 60 перевірок оновлень на годину.\nВи досягли цього ліміту. Будь ласка, спробуйте пізніше. @@ -1540,83 +1540,83 @@ Наведіть курсор миші на опцію, щоб відобразити її опис. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Мова консолі:\nВстановіть мову, яка буде використовуватись у іграх PS4.\nРекомендується встановити мову котра підтримується грою, оскільки вона може відрізнятися в залежності від регіону. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Окрема папка для оновлень:\nДає змогу встановлювати оновлення гри в окрему папку для зручності. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Показувати заставку:\nВідображає заставку гри (спеціальне зображення) під час запуску гри. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Увімкнути Discord Rich Presence:\nВідображає значок емулятора та відповідну інформацію у вашому профілі Discord. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Ім'я користувача:\nВстановіть ім'я користувача акаунта PS4. Воно може відображатися в деяких іграх. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Ключ трофеїв:\nКлюч для розшифровки трофеїв. Може бути отриманий зі зламаної консолі.\nПовинен містити лише шістнадцяткові символи. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Тип логів:\nВстановіть, чи синхронізувати виведення вікна логів заради продуктивності. Це може негативно вплинути на емуляцію. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Фільтр логів:\nФільтрує логи, щоб показувати тільки певну інформацію.\nПриклади: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Рівні: Trace, Debug, Info, Warning, Error, Critical - у цьому порядку, конкретний рівень глушить усі попередні рівні у списку і показує всі наступні рівні. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Оновлення:\nРелізний: Офіційні версії, які випускаються щомісяця і можуть бути дуже старими, але вони більш надійні та перевірені.\nТестовий: Версії для розробників, які мають усі найновіші функції та виправлення, але можуть містити помилки та є менш стабільними. - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. Фонове зображення:\nКерує непрозорістю фонового зображення гри. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Грати титульну музику:\nВмикає відтворення спеціальної музики під час вибору гри в списку, якщо вона це підтримує. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Вимкнути спливаючі вікна трофеїв:\nВимикає сповіщення про ігрові трофеї. Прогрес трофея все ще можна відстежувати за допомогою "Перегляд трофеїв" (клацніть правою кнопкою миші на грі у головному вікні). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Приховувати курсор:\nВиберіть, коли курсор зникатиме:\nНіколи: Курсор миші завжди буде видимий.\nПри бездіяльності: Встановіть час, через який курсор зникне в разі бездіяльності.\nЗавжди: Курсор миші завжди буде прихований. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Встановіть час, через який курсор зникне в разі бездіяльності. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Перепризначення кнопки «Назад»:\nНалаштовує кнопку «Назад» контролера на емуляцію натискання на зазначену область на сенсорній панелі контролера PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Відображати данні ігрової сумістністі:\nВідображає інформацію про сумісність ігор у вигляді таблиці. Увімкніть "Оновлення даних ігрової сумісності під час запуску" для отримання актуальної інформації. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Оновлення даних ігрової сумісності під час запуску:\nАвтоматично оновлює базу даних ігрової сумісності під час запуску shadPS4. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. @@ -1648,83 +1648,83 @@ Без змін - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Графічний пристрій:\nУ системах із кількома GPU виберіть з випадаючого списку GPU, який буде використовувати емулятор,\nабо виберіть "Автовибір", щоб визначити його автоматично. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Ширина/Висота:\nВстановіть розмір вікна емулятора під час запуску, який може бути змінений під час гри.\nЦе відрізняється від роздільної здатності в грі. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Розділювач Vblank:\nЧастота кадрів, з якою оновлюється емулятор, множиться на це число. Зміна цього параметра може мати негативні наслідки, такі як збільшення швидкості гри або порушення критичних функцій гри, які цього не очікують! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Увімкнути дамп шейдерів:\nДля технічного налагодження зберігає шейдери ігор у папку під час рендерингу. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Увімкнути NULL GPU:\nДля технічного налагодження відключає рендеринг гри так, ніби графічної карти немає. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Ігрові папки:\nСписок папок, що скануватимуться для виявлення ігор. - addFolderButton + Add:\nAdd a folder to the list. Додати:\nДодати папку в список. - removeFolderButton + Remove:\nRemove a folder from the list. Вилучити:\nВилучити папку зі списку. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Увімкнути налагоджувальні дампи:\nЗберігає символи імпорту, експорту та інформацію про заголовок файлу поточної виконуваної програми PS4 у папку. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Увімкнути шари валідації Vulkan:\nВключає систему, яка перевіряє стан рендерера Vulkan і логує інформацію про його внутрішній стан. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Увімкнути валідацію синхронізації Vulkan:\nВключає систему, яка перевіряє таймінг завдань рендерингу Vulkan. Це знизить продуктивність і, ймовірно, змінить поведінку емуляції. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Увімкнути налагодження RenderDoc:\nЯкщо увімкнено, емулятор забезпечить сумісність із Renderdoc, даючи змогу захоплювати й аналізувати поточні кадри під час рендерингу. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Збирати шейдери:\nВам потрібно увімкнути цю опцію, щоб редагувати шейдери за допомогою меню налагодження (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Діагностика збоїв:\nСтворює .yaml файл з інформацією про стан Vulkan на момент збою.\nКорисно для налагодження помилок 'Device lost'. Якщо у вас увімкнено цей параметр, вам слід увімкнути маркери налагодження Хоста ТА Гостя.\nНе працює на графічних процесорах Intel.\nДля цього вам потрібно увімкнути шари валідації Vulkan і мати Vulkan SDK. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Копіювати буфери GPU:\nДозволяє обійти проблеми синхронізації, пов'язані з відправленням даних на GPU\nМоже як допомогти, так і не вплинути на збої типу PM4 (тип 0). - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Хостові маркери налагодження:\nДодає інформацію емулятора, наприклад маркери для конкретних команд AMDGPU у Vulkan, також присвоює ресурсам налагоджувані назви.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Гостьові маркери налагодження:\nВставляє налагоджувані маркери, які сама гра додала до командного буфера.\nЯкщо ця опція увімкнена, рекомендується також активувати діагностику збоїв.\nКорисно для програм на кшталт RenderDoc. - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. Шлях до файлів збережень:\nПапка, де будуть зберігатися ігрові збереження. - browseButton + Browse:\nBrowse for a folder to set as the save data path. Вибрати:\nВиберіть папку для ігрових збережень. diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index b4f800711..1b3c508bf 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches là các tính năng thử nghiệm.\nHãy sử dụng cẩn thận.\n\nTải xuống các cheat riêng lẻ bằng cách chọn kho lưu trữ và nhấp vào nút tải xuống.\nTại tab Patches, bạn có thể tải xuống tất cả các patch cùng một lúc, chọn cái nào bạn muốn sử dụng và lưu lựa chọn của mình.\n\nVì chúng tôi không phát triển Cheats/Patches,\nxin vui lòng báo cáo các vấn đề cho tác giả cheat.\n\nBạn đã tạo ra một cheat mới? Truy cập:\n No Image Available @@ -161,7 +161,7 @@ Không tìm thấy Cheat - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Không tìm thấy Cheat cho trò chơi này trong phiên bản kho lưu trữ đã chọn,hãy thử kho lưu trữ khác hoặc phiên bản khác của trò chơi. @@ -169,7 +169,7 @@ Cheat đã tải xuống thành công - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Bạn đã tải xuống các cheat thành công. Cho phiên bản trò chơi này từ kho lưu trữ đã chọn. Bạn có thể thử tải xuống từ kho lưu trữ khác, nếu có, bạn cũng có thể sử dụng bằng cách chọn tệp từ danh sách. @@ -185,7 +185,7 @@ Tải xuống hoàn tất - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Bản vá đã tải xuống thành công! Tất cả các bản vá có sẵn cho tất cả các trò chơi đã được tải xuống, không cần tải xuống riêng lẻ cho mỗi trò chơi như trong Cheat. Nếu bản vá không xuất hiện, có thể là nó không tồn tại cho số seri và phiên bản cụ thể của trò chơi. @@ -264,7 +264,7 @@ Lỗi mạng: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. Trình cập nhật tự động cho phép tối đa 60 lần kiểm tra cập nhật mỗi giờ.\nBạn đã đạt đến giới hạn này. Vui lòng thử lại sau. @@ -1540,83 +1540,83 @@ Di chuyển chuột đến tùy chọn để hiển thị mô tả của nó. - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Ngôn ngữ console:\nChọn ngôn ngữ mà trò chơi PS4 sẽ sử dụng.\nKhuyên bạn nên đặt tùy chọn này thành một ngôn ngữ mà trò chơi hỗ trợ, có thể thay đổi tùy theo vùng. - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Hiển thị màn hình khởi động:\nHiển thị màn hình khởi động của trò chơi (một hình ảnh đặc biệt) trong khi trò chơi khởi động. - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. Bật Discord Rich Presence:\nHiển thị biểu tượng trình giả lập và thông tin liên quan trên hồ sơ Discord của bạn. - userName + Username:\nSets the PS4's account username, which may be displayed by some games. Tên người dùng:\nChọn tên người dùng của tài khoản PS4, có thể được một số trò chơi hiển thị. - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Loại nhật ký:\nChọn xem có đồng bộ hóa đầu ra cửa sổ nhật ký cho hiệu suất hay không. Điều này có thể có tác động tiêu cực đến việc giả lập. - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Bộ lọc nhật ký:\nLọc nhật ký để in chỉ thông tin cụ thể.\nVí dụ: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Các mức: Trace, Debug, Info, Warning, Error, Critical - theo thứ tự này, một mức cụ thể làm tắt tất cả các mức trước trong danh sách và ghi lại tất cả các mức sau đó. - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Cập nhật:\nRelease: Các phiên bản chính thức được phát hành hàng tháng; có thể khá cũ nhưng đáng tin cậy hơn và đã được thử nghiệm.\nNightly: Các phiên bản phát triển có tất cả các tính năng và sửa lỗi mới nhất; có thể có lỗi và ít ổn định hơn. - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Phát nhạc tiêu đề trò chơi:\nNếu một trò chơi hỗ trợ điều này, hãy kích hoạt phát nhạc đặc biệt khi bạn chọn trò chơi trong GUI. - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Ẩn con trỏ:\nChọn khi nào con trỏ sẽ biến mất:\nKhông bao giờ: Bạn sẽ luôn thấy chuột.\nKhông hoạt động: Đặt một khoảng thời gian để nó biến mất sau khi không hoạt động.\nLuôn luôn: bạn sẽ không bao giờ thấy chuột. - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Đặt thời gian để chuột biến mất sau khi không hoạt động. - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Hành vi nút quay lại:\nĐặt nút quay lại của tay cầm để mô phỏng việc chạm vào vị trí đã chỉ định trên touchpad của PS4. - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ Không có - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Thiết bị đồ họa:\nTrên các hệ thống có GPU đa năng, hãy chọn GPU mà trình giả lập sẽ sử dụng từ danh sách thả xuống,\hoặc chọn "Auto Select" để tự động xác định. - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Chiều rộng/Cao:\nChọn kích thước cửa sổ của trình giả lập khi khởi động, có thể điều chỉnh trong quá trình chơi.\nĐiều này khác với độ phân giải trong trò chơi. - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Bộ chia Vblank:\nTốc độ khung hình mà trình giả lập làm mới được nhân với số này. Thay đổi này có thể có tác động tiêu cực như tăng tốc độ trò chơi hoặc làm hỏng chức năng quan trọng mà trò chơi không mong đợi thay đổi điều này! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Bật xuất shader:\nĐể mục đích gỡ lỗi kỹ thuật, lưu shader của trò chơi vào một thư mục khi chúng được kết xuất. - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Bật GPU Null:\nĐể mục đích gỡ lỗi kỹ thuật, vô hiệu hóa việc kết xuất trò chơi như thể không có card đồ họa. - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. Thư mục trò chơi:\nDanh sách các thư mục để kiểm tra các trò chơi đã cài đặt. - addFolderButton + Add:\nAdd a folder to the list. Thêm:\nThêm một thư mục vào danh sách. - removeFolderButton + Remove:\nRemove a folder from the list. Xóa:\nXóa một thư mục khỏi danh sách. - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Bật xuất gỡ lỗi:\nLưu biểu tượng nhập và xuất và thông tin tiêu đề tệp cho ứng dụng PS4 hiện đang chạy vào một thư mục. - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Bật lớp xác thực Vulkan:\nKích hoạt một hệ thống xác thực trạng thái của bộ kết xuất Vulkan và ghi lại thông tin về trạng thái nội bộ của nó. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Bật xác thực đồng bộ Vulkan:\nKích hoạt một hệ thống xác thực thời gian của nhiệm vụ kết xuất Vulkan. Điều này sẽ giảm hiệu suất và có thể thay đổi hành vi của việc giả lập. - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Bật gỡ lỗi RenderDoc:\nNếu được kích hoạt, trình giả lập sẽ cung cấp tính tương thích với Renderdoc để cho phép bắt và phân tích khung hình hiện tại đang được kết xuất. - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 5328ce605..363b1ac3a 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -29,8 +29,8 @@ 作弊码/补丁: - defaultTextEdit_MSG - 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\n No Image Available @@ -161,7 +161,7 @@ 未找到作弊码 - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. 在所选存储库的版本中找不到该游戏的作弊码,请尝试其他存储库或游戏版本。 @@ -169,7 +169,7 @@ 作弊码下载成功 - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. 您已从所选存储库中成功下载了该游戏版本的作弊码。您还可以尝试从其他存储库下载,或通过从列表中选择文件来使用它们。 @@ -185,7 +185,7 @@ 下载完成 - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. 补丁下载成功!所有可用的补丁已下载完成,无需像作弊码那样单独下载每个游戏的补丁。如果补丁没有出现,可能是该补丁不适用于当前游戏的序列号和版本。 @@ -264,7 +264,7 @@ 网络错误: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. 自动更新程序每小时最多允许 60 次更新检查。\n您已达到此限制。请稍后再试。 @@ -1540,83 +1540,83 @@ 将鼠标指针指向选项以显示其描述。 - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. 主机语言:\n设置 PS4 游戏中使用的语言。\n建议设置为支持的语言,这将因地区而异。 - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. 模拟器语言:\n设置模拟器用户界面的语言。 - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. 启用全屏:\n以全屏模式启动游戏。\n您可以按 F11 键切换回窗口模式。 - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. 启用单独的更新目录:\n启用安装游戏更新到一个单独的目录中以更便于管理。 - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. 显示启动画面:\n在游戏启动时显示游戏的启动画面(特殊图像)。 - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. 启用 Discord Rich Presence:\n在您的 Discord 个人资料上显示模拟器图标和相关信息。 - userName + Username:\nSets the PS4's account username, which may be displayed by some games. 用户名:\n设置 PS4 帐户的用户名,某些游戏中可能会显示此名称。 - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. 奖杯密钥:\n用于解密奖杯的密钥。必须从您的越狱主机中获得。\n仅包含十六进制字符。 - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. 日志类型:\n设置日志窗口输出的同步方式以提高性能。可能会对模拟产生不良影响。 - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. 日志过滤器:\n过滤日志,仅打印特定信息。\n例如:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 级别: Trace, Debug, Info, Warning, Error, Critical - 按此顺序,特定级别将静默列表中所有先前的级别,并记录所有后续级别。 - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. 更新:\nRelease:每月发布的官方版本可能非常过时,但更可靠且经过测试。\nNightly:包含所有最新功能和修复的开发版本,但可能包含错误且稳定性较低。 - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. 背景图片:\n控制游戏背景图片的可见度。 - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. 播放标题音乐:\n如果游戏支持,在图形界面选择游戏时播放特殊音乐。 - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). 禁止弹出奖杯:\n禁用游戏内奖杯通知。可以在奖杯查看器中继续跟踪奖杯进度(在主窗口中右键点击游戏)。 - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. 隐藏光标:\n选择光标何时消失:\n从不: 从不隐藏光标。\n闲置:光标在闲置若干秒后消失。\n始终:始终隐藏光标。 - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. 光标隐藏闲置时长:\n光标自动隐藏之前的闲置时长。 - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. 返回按钮行为:\n设置手柄的返回按钮模拟在 PS4 触控板上指定位置的点击。 - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. 显示兼容性数据:\n在列表视图中显示游戏兼容性信息。启用“启动时更新兼容性数据库”以获取最新信息。 - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. 启动时更新兼容性数据库:\n当 shadPS4 启动时自动更新兼容性数据库。 - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. 更新兼容性数据库:\n立即更新兼容性数据库。 @@ -1648,83 +1648,83 @@ - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. 图形设备:\n在具有多个 GPU 的系统中,从下拉列表中选择要使用的 GPU,\n或者选择“自动选择”由模拟器决定。 - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. 宽度/高度:\n设置启动游戏时的窗口大小,游戏过程中可以调整。\n这与游戏内的分辨率不同。 - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank Divider:\n模拟器刷新的帧率会乘以此数字。改变此项可能会导致游戏速度加快,或破坏游戏中不期望此变化的关键功能! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. 启用着色器转储:\n用于技术调试,在渲染期间将游戏着色器保存到文件夹中。 - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. 启用 NULL GPU:\n用于技术调试,禁用游戏渲染,就像没有显卡一样。 - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. 游戏文件夹:\n检查已安装游戏的文件夹列表。 - addFolderButton + Add:\nAdd a folder to the list. 添加:\n将文件夹添加到列表。 - removeFolderButton + Remove:\nRemove a folder from the list. 移除:\n从列表中移除文件夹。 - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. 启用调试转储:\n将当前正在运行的 PS4 程序的导入和导出符号及文件头信息保存到目录中。 - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. 启用 Vulkan 验证层:\n启用一个系统来验证 Vulkan 渲染器的状态并记录其内部状态的信息。\n这将降低性能并可能改变模拟的行为。 - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. 启用 Vulkan 同步验证:\n启用一个系统来验证 Vulkan 渲染任务的时间。\n这将降低性能并可能改变模拟的行为。 - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. 启用 RenderDoc 调试:\n启用后模拟器将提供与 Renderdoc 的兼容性,允许在渲染过程中捕获和分析当前渲染的帧。 - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). 收集着色器:\n您需要启用此功能才能使用调试菜单(Ctrl + F10)编辑着色器。 - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. 崩溃诊断:\n创建一个包含崩溃时 Vulkan 状态的 .yaml 文件。\n对于调试“Device lost”错误很有用。如果您启用了此功能,您应该同时启用 Host 和 Guest 调试标记。\n此功能在 Intel 显卡上不可用。\n您需要启用 Vulkan 验证层并安装 Vulkan SDK 才能使用此功能。 - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. 复制 GPU 缓冲区:\n绕过涉及 GPU 提交的竞态条件。\n对于 PM4 type 0 崩溃可能有帮助,也可能没有帮助。 - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host 调试标记:\n在 Vulkan 命令周围插入模拟器端信息,如特定 AMD GPU 命令的标记,以及为资源提供调试名称。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest 调试标记:\n在命令缓冲区中插入游戏本身添加的任何调试标记。\n如果您已启用此功能,应同时启用崩溃诊断。\n对 RenderDoc 等程序很有用。 - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. 存档数据路径:\n保存游戏存档数据的目录。 - browseButton + Browse:\nBrowse for a folder to set as the save data path. 浏览:\n选择一个目录保存游戏存档数据。 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index d3414f3a4..0d7d74ae9 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -29,8 +29,8 @@ Cheats / Patches for - defaultTextEdit_MSG - 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\nhttps://github.com/shadps4-emu/ps4_cheats + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + 作弊/補丁為實驗性功能。\n請小心使用。\n\n透過選擇儲存庫並點擊下載按鈕來單獨下載作弊程式。\n在“補丁”標籤頁中,您可以一次下載所有補丁,選擇要使用的補丁並保存您的選擇。\n\n由於我們不開發作弊/補丁,\n請將問題報告給作弊程式的作者。\n\n創建了新的作弊程式?請訪問:\n No Image Available @@ -161,7 +161,7 @@ 未找到作弊碼 - CheatsNotFound_MSG + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. 在此版本的儲存庫中未找到該遊戲的作弊碼,請嘗試另一個儲存庫或不同版本的遊戲。 @@ -169,7 +169,7 @@ 作弊碼下載成功 - CheatsDownloadedSuccessfully_MSG + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. 您已成功下載該遊戲版本的作弊碼 從選定的儲存庫中。 您可以嘗試從其他儲存庫下載,如果可用,您也可以選擇從列表中選擇檔案來使用它。 @@ -185,7 +185,7 @@ 下載完成 - DownloadComplete_MSG + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. 修補檔下載成功!所有遊戲的修補檔已下載完成,無需像作弊碼那樣為每個遊戲單獨下載。如果補丁未顯示,可能是該補丁不適用於特定的序號和遊戲版本。 @@ -264,7 +264,7 @@ 網路錯誤: - Error_Github_limit_MSG + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. 自動更新程式每小時最多允許 60 次更新檢查。\n您已達到此限制。請稍後再試。 @@ -1540,83 +1540,83 @@ 將鼠標指向選項以顯示其描述。 - consoleLanguageGroupBox + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. 主機語言:\n設定PS4遊戲使用的語言。\n建議將其設置為遊戲支持的語言,這會因地區而異。 - emulatorLanguageGroupBox + Emulator Language:\nSets the language of the emulator's user interface. 模擬器語言:\n設定模擬器的用戶介面的語言。 - fullscreenCheckBox + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 - separateUpdatesCheckBox + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. - showSplashCheckBox + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. 顯示啟動畫面:\n在遊戲啟動時顯示遊戲的啟動畫面(特殊圖片)。 - discordRPCCheckbox + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. 啟用 Discord Rich Presence:\n在您的 Discord 個人檔案上顯示模擬器圖標和相關信息。 - userName + Username:\nSets the PS4's account username, which may be displayed by some games. 用戶名:\n設定PS4帳號的用戶名,某些遊戲中可能會顯示。 - TrophyKey + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - logTypeGroupBox + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. 日誌類型:\n設定是否同步日誌窗口的輸出以提高性能。可能對模擬產生不良影響。 - logFilter + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. 日誌過濾器:\n過濾日誌以僅打印特定信息。\n範例:"Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" 等級: Trace, Debug, Info, Warning, Error, Critical - 以此順序,特定級別靜音所有前面的級別,並記錄其後的每個級別。 - updaterGroupBox + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. 更新:\nRelease: 每月發布的官方版本,可能非常舊,但更可靠且經過測試。\nNightly: 開發版本,擁有所有最新的功能和修復,但可能包含錯誤,穩定性較差。 - GUIBackgroundImageGroupBox - GUIBackgroundImageGroupBox + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. - GUIMusicGroupBox + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. 播放標題音樂:\n如果遊戲支持,啟用在GUI中選擇遊戲時播放特殊音樂。 - disableTrophycheckBox + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - hideCursorGroupBox + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. 隱藏游標:\n選擇游標何時消失:\n從不: 您將始終看到滑鼠。\n閒置: 設定在閒置後消失的時間。\n始終: 您將永遠看不到滑鼠。 - idleTimeoutGroupBox + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. 設定滑鼠在閒置後消失的時間。 - backButtonBehaviorGroupBox + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. 返回按鈕行為:\n設定控制器的返回按鈕模擬在 PS4 觸控板上指定位置的觸碰。 - enableCompatibilityCheckBox + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - checkCompatibilityOnStartupCheckBox + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - updateCompatibilityButton + Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1648,84 +1648,84 @@ - graphicsAdapterGroupBox + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. 圖形設備:\n在多GPU系統中,從下拉列表中選擇模擬器將使用的GPU,\n或選擇「自動選擇」以自動確定。 - resolutionLayout + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. 寬度/高度:\n設定模擬器啟動時的窗口大小,可以在遊戲過程中調整。\n這與遊戲內解析度不同。 - heightDivider + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Vblank分隔符:\n模擬器的幀速率將乘以這個數字。更改此數字可能會有不良影響,例如增加遊戲速度,或破壞不預期此變化的關鍵遊戲功能! - dumpShadersCheckBox + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. 啟用著色器轉儲:\n為了技術調試,將遊戲的著色器在渲染時保存到文件夾中。 - nullGpuCheckBox + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. 啟用空GPU:\n為了技術調試,禁用遊戲渲染,彷彿沒有顯示卡。 - enableHDRCheckBox - enableHDRCheckBox + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - gameFoldersBox + Game Folders:\nThe list of folders to check for installed games. 遊戲資料夾:\n檢查已安裝遊戲的資料夾列表。 - addFolderButton + Add:\nAdd a folder to the list. 添加:\n將資料夾添加到列表。 - removeFolderButton + Remove:\nRemove a folder from the list. 移除:\n從列表中移除資料夾。 - debugDump + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. 啟用調試轉儲:\n將當前運行的PS4程序的輸入和輸出符號及文件頭信息保存到目錄中。 - vkValidationCheckBox + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. 啟用Vulkan驗證層:\n啟用一個系統來驗證Vulkan渲染器的狀態並記錄其內部狀態的信息。這將降低性能並可能改變模擬行為。 - vkSyncValidationCheckBox + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. 啟用Vulkan同步驗證:\n啟用一個系統來驗證Vulkan渲染任務的時間。這將降低性能並可能改變模擬行為。 - rdocCheckBox + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. 啟用RenderDoc調試:\n如果啟用,模擬器將提供與Renderdoc的兼容性,以允許捕獲和分析當前渲染的幀。 - collectShaderCheckBox + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - crashDiagnosticsCheckBox + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - copyGPUBuffersCheckBox + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - hostMarkersCheckBox + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - guestMarkersCheckBox + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - saveDataBox - saveDataBox + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. - browseButton - browseButton + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. Borderless From 7db30d12cb4553ea0baa07d18b9b39993b230fe7 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 14 Feb 2025 08:58:38 +0100 Subject: [PATCH 284/455] Libraries: Update libcInternal (#2265) * Added all stubs + logging * Added back memory and math functions from the original code + added some more math functions * More string functions, snprintf, memmove and setjmp * Add longjmp + clang * gmtime, __cxa_atexit and log what functions some games use * Add Mspace unreachable * Renaming * Take out mspace functions to their own file * Factor out io to a new file * Empty str and memory files * Overloaded functions be like: * str * memory + math +clang * clang... * adjustments :D * longjmp is questionable --------- Co-authored-by: georgemoralis --- CMakeLists.txt | 12 + src/common/logging/filter.cpp | 1 + src/common/logging/types.h | 1 + .../libraries/libc_internal/libc_internal.cpp | 16352 +++++++++++++++- .../libraries/libc_internal/libc_internal.h | 9 +- .../libc_internal/libc_internal_io.cpp | 472 + .../libc_internal/libc_internal_io.h | 14 + .../libc_internal/libc_internal_math.cpp | 773 + .../libc_internal/libc_internal_math.h | 14 + .../libc_internal/libc_internal_memory.cpp | 314 + .../libc_internal/libc_internal_memory.h | 14 + .../libc_internal/libc_internal_mspace.cpp | 247 + .../libc_internal/libc_internal_mspace.h | 14 + .../libc_internal/libc_internal_str.cpp | 532 + .../libc_internal/libc_internal_str.h | 14 + .../libc_internal/libc_internal_stream.cpp | 3139 +++ .../libc_internal/libc_internal_stream.h | 14 + 17 files changed, 21727 insertions(+), 209 deletions(-) create mode 100644 src/core/libraries/libc_internal/libc_internal_io.cpp create mode 100644 src/core/libraries/libc_internal/libc_internal_io.h create mode 100644 src/core/libraries/libc_internal/libc_internal_math.cpp create mode 100644 src/core/libraries/libc_internal/libc_internal_math.h create mode 100644 src/core/libraries/libc_internal/libc_internal_memory.cpp create mode 100644 src/core/libraries/libc_internal/libc_internal_memory.h create mode 100644 src/core/libraries/libc_internal/libc_internal_mspace.cpp create mode 100644 src/core/libraries/libc_internal/libc_internal_mspace.h create mode 100644 src/core/libraries/libc_internal/libc_internal_str.cpp create mode 100644 src/core/libraries/libc_internal/libc_internal_str.h create mode 100644 src/core/libraries/libc_internal/libc_internal_stream.cpp create mode 100644 src/core/libraries/libc_internal/libc_internal_stream.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 506198e1a..22a811d30 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -399,6 +399,18 @@ set(VIDEOOUT_LIB src/core/libraries/videoout/buffer.h set(LIBC_SOURCES src/core/libraries/libc_internal/libc_internal.cpp src/core/libraries/libc_internal/libc_internal.h + src/core/libraries/libc_internal/libc_internal_mspace.cpp + src/core/libraries/libc_internal/libc_internal_mspace.h + src/core/libraries/libc_internal/libc_internal_io.cpp + src/core/libraries/libc_internal/libc_internal_io.h + src/core/libraries/libc_internal/libc_internal_memory.cpp + src/core/libraries/libc_internal/libc_internal_memory.h + src/core/libraries/libc_internal/libc_internal_str.cpp + src/core/libraries/libc_internal/libc_internal_str.h + src/core/libraries/libc_internal/libc_internal_stream.cpp + src/core/libraries/libc_internal/libc_internal_stream.h + src/core/libraries/libc_internal/libc_internal_math.cpp + src/core/libraries/libc_internal/libc_internal_math.h ) set(IME_LIB src/core/libraries/ime/error_dialog.cpp diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 1a781cb4c..bed7802ed 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -80,6 +80,7 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { SUB(Kernel, Sce) \ CLS(Lib) \ SUB(Lib, LibC) \ + SUB(Lib, LibcInternal) \ SUB(Lib, Kernel) \ SUB(Lib, Pad) \ SUB(Lib, GnmDriver) \ diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 4078afcef..c07efbc0d 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -47,6 +47,7 @@ enum class Class : u8 { Lib, ///< HLE implementation of system library. Each major library ///< should have its own subclass. Lib_LibC, ///< The LibC implementation. + Lib_LibcInternal, ///< The LibcInternal implementation. Lib_Kernel, ///< The LibKernel implementation. Lib_Pad, ///< The LibScePad implementation. Lib_GnmDriver, ///< The LibSceGnmDriver implementation. diff --git a/src/core/libraries/libc_internal/libc_internal.cpp b/src/core/libraries/libc_internal/libc_internal.cpp index 8453a78b9..98dac007b 100644 --- a/src/core/libraries/libc_internal/libc_internal.cpp +++ b/src/core/libraries/libc_internal/libc_internal.cpp @@ -2,306 +2,16252 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include +#include +#include #include "common/assert.h" #include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libc_internal/libc_internal_io.h" +#include "core/libraries/libc_internal/libc_internal_memory.h" +#include "core/libraries/libc_internal/libc_internal_mspace.h" +#include "core/libraries/libc_internal/libc_internal_str.h" +#include "core/libraries/libc_internal/libc_internal_stream.h" #include "core/libraries/libs.h" #include "libc_internal.h" namespace Libraries::LibcInternal { -void* PS4_SYSV_ABI internal_memset(void* s, int c, size_t n) { - return std::memset(s, c, n); +s32 PS4_SYSV_ABI internal_sceLibcHeapGetTraceInfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -void* PS4_SYSV_ABI internal_memcpy(void* dest, const void* src, size_t n) { - return std::memcpy(dest, src, n); +s32 PS4_SYSV_ABI internal___absvdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_memcpy_s(void* dest, size_t destsz, const void* src, size_t count) { -#ifdef _WIN64 - return memcpy_s(dest, destsz, src, count); -#else - std::memcpy(dest, src, count); - return 0; // ALL OK -#endif +s32 PS4_SYSV_ABI internal___absvsi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_strcpy_s(char* dest, size_t dest_size, const char* src) { -#ifdef _WIN64 - return strcpy_s(dest, dest_size, src); -#else - std::strcpy(dest, src); - return 0; // ALL OK -#endif +s32 PS4_SYSV_ABI internal___absvti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_strcat_s(char* dest, size_t dest_size, const char* src) { -#ifdef _WIN64 - return strcat_s(dest, dest_size, src); -#else - std::strcat(dest, src); - return 0; // ALL OK -#endif +s32 PS4_SYSV_ABI internal___adddf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_memcmp(const void* s1, const void* s2, size_t n) { - return std::memcmp(s1, s2, n); +s32 PS4_SYSV_ABI internal___addsf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_strcmp(const char* str1, const char* str2) { - return std::strcmp(str1, str2); +s32 PS4_SYSV_ABI internal___addvdi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_strncmp(const char* str1, const char* str2, size_t num) { - return std::strncmp(str1, str2, num); +s32 PS4_SYSV_ABI internal___addvsi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -size_t PS4_SYSV_ABI internal_strlen(const char* str) { - return std::strlen(str); +s32 PS4_SYSV_ABI internal___addvti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -char* PS4_SYSV_ABI internal_strncpy(char* dest, const char* src, std::size_t count) { - return std::strncpy(dest, src, count); +s32 PS4_SYSV_ABI internal___ashldi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_strncpy_s(char* dest, size_t destsz, const char* src, size_t count) { -#ifdef _WIN64 - return strncpy_s(dest, destsz, src, count); -#else - std::strcpy(dest, src); - return 0; -#endif +s32 PS4_SYSV_ABI internal___ashlti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -char* PS4_SYSV_ABI internal_strcat(char* dest, const char* src) { - return std::strcat(dest, src); +s32 PS4_SYSV_ABI internal___ashrdi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -const char* PS4_SYSV_ABI internal_strchr(const char* str, int c) { - return std::strchr(str, c); +s32 PS4_SYSV_ABI internal___ashrti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_sin(double x) { - return std::sin(x); +s32 PS4_SYSV_ABI internal___atomic_compare_exchange() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_sinf(float x) { - return std::sinf(x); +s32 PS4_SYSV_ABI internal___atomic_compare_exchange_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_cos(double x) { - return std::cos(x); +s32 PS4_SYSV_ABI internal___atomic_compare_exchange_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_cosf(float x) { - return std::cosf(x); +s32 PS4_SYSV_ABI internal___atomic_compare_exchange_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -void PS4_SYSV_ABI internal_sincos(double x, double* sinp, double* cosp) { - *sinp = std::sin(x); - *cosp = std::cos(x); +s32 PS4_SYSV_ABI internal___atomic_compare_exchange_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -void PS4_SYSV_ABI internal_sincosf(float x, float* sinp, float* cosp) { - *sinp = std::sinf(x); - *cosp = std::cosf(x); +s32 PS4_SYSV_ABI internal___atomic_compare_exchange_n() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_tan(double x) { - return std::tan(x); +s32 PS4_SYSV_ABI internal___atomic_exchange() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_tanf(float x) { - return std::tanf(x); +s32 PS4_SYSV_ABI internal___atomic_exchange_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_asin(double x) { - return std::asin(x); +s32 PS4_SYSV_ABI internal___atomic_exchange_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_asinf(float x) { - return std::asinf(x); +s32 PS4_SYSV_ABI internal___atomic_exchange_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_acos(double x) { - return std::acos(x); +s32 PS4_SYSV_ABI internal___atomic_exchange_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_acosf(float x) { - return std::acosf(x); +s32 PS4_SYSV_ABI internal___atomic_exchange_n() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_atan(double x) { - return std::atan(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_add_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_atanf(float x) { - return std::atanf(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_add_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_atan2(double y, double x) { - return std::atan2(y, x); +s32 PS4_SYSV_ABI internal___atomic_fetch_add_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_atan2f(float y, float x) { - return std::atan2f(y, x); +s32 PS4_SYSV_ABI internal___atomic_fetch_add_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_exp(double x) { - return std::exp(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_and_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_expf(float x) { - return std::expf(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_and_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_exp2(double x) { - return std::exp2(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_and_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_exp2f(float x) { - return std::exp2f(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_and_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_pow(double x, double y) { - return std::pow(x, y); +s32 PS4_SYSV_ABI internal___atomic_fetch_or_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_powf(float x, float y) { - return std::powf(x, y); +s32 PS4_SYSV_ABI internal___atomic_fetch_or_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_log(double x) { - return std::log(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_or_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_logf(float x) { - return std::logf(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_or_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -double PS4_SYSV_ABI internal_log10(double x) { - return std::log10(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_sub_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -float PS4_SYSV_ABI internal_log10f(float x) { - return std::log10f(x); +s32 PS4_SYSV_ABI internal___atomic_fetch_sub_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -void* PS4_SYSV_ABI internal_malloc(size_t size) { - return std::malloc(size); +s32 PS4_SYSV_ABI internal___atomic_fetch_sub_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -void PS4_SYSV_ABI internal_free(void* ptr) { - std::free(ptr); +s32 PS4_SYSV_ABI internal___atomic_fetch_sub_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -void* PS4_SYSV_ABI internal_operator_new(size_t size) { - if (size == 0) { - // Size of 1 is used if 0 is provided. - size = 1; - } - void* ptr = std::malloc(size); - ASSERT_MSG(ptr, "Failed to allocate new object with size {}", size); - return ptr; +s32 PS4_SYSV_ABI internal___atomic_fetch_xor_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -void PS4_SYSV_ABI internal_operator_delete(void* ptr) { - if (ptr) { - std::free(ptr); - } +s32 PS4_SYSV_ABI internal___atomic_fetch_xor_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } -int PS4_SYSV_ABI internal_posix_memalign(void** ptr, size_t alignment, size_t size) { -#ifdef _WIN64 - void* allocated = _aligned_malloc(size, alignment); - if (!allocated) { - return errno; - } - *ptr = allocated; - return 0; -#else - return posix_memalign(ptr, alignment, size); -#endif +s32 PS4_SYSV_ABI internal___atomic_fetch_xor_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_fetch_xor_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_is_lock_free() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_load() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_load_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_load_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_load_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_load_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_load_n() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_store() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_store_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_store_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_store_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_store_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___atomic_store_n() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cleanup() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___clzdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___clzsi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___clzti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cmpdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cmpti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ctzdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ctzsi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ctzti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_allocate_dependent_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_allocate_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_atexit(void (*func)(), void* arg, void* dso_handle) { + LOG_ERROR(Lib_LibcInternal, "(TEST) called"); // todo idek what I'm doing with this + std::atexit(func); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_bad_cast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_bad_typeid() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_begin_catch() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_call_unexpected() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_current_exception_type() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_current_primary_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_decrement_exception_refcount() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_demangle() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_end_catch() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_finalize() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_free_dependent_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_free_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_get_exception_ptr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_get_globals() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_get_globals_fast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_guard_abort() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_guard_acquire() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_guard_release() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_increment_exception_refcount() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_pure_virtual() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_rethrow() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_rethrow_primary_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___cxa_throw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divdc3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divdf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divdi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divmoddi4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divmodsi4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divsc3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divsf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divsi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___divxc3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___dynamic_cast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___eqdf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___eqsf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___extendsfdf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fe_dfl_env() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fedisableexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___feenableexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fflush() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ffsdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ffsti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixdfdi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixdfsi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixdfti() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixsfdi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixsfsi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixsfti() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunsdfdi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunsdfsi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunsdfti() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunssfdi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunssfsi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunssfti() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunsxfdi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunsxfsi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixunsxfti() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixxfdi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fixxfti() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatdidf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatdisf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatdixf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatsidf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatsisf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floattidf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floattisf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floattixf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatundidf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatundisf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatundixf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatunsidf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatunsisf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatuntidf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatuntisf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___floatuntixf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fpclassifyd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fpclassifyf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___fpclassifyl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___gedf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___gesf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___gtdf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___gtsf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___gxx_personality_v0() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___inet_addr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___inet_aton() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___inet_ntoa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___inet_ntoa_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isfinite() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isfinitef() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isfinitel() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isinf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isinff() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isinfl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isnan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isnanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isnanl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isnormal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isnormalf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isnormall() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___isthreaded() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___kernel_cos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___kernel_cosdf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___kernel_rem_pio2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___kernel_sin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___kernel_sindf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ledf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___lesf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___longjmp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___lshrdi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___lshrti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ltdf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ltsf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mb_cur_max() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mb_sb_limit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___moddi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___modsi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___modti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___muldc3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___muldf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___muldi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulodi4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulosi4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___muloti4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulsc3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulsf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___multi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulvdi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulvsi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulvti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___mulxc3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___nedf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___negdf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___negdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___negsf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___negti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___negvdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___negvsi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___negvti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___nesf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___opendir2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___paritydi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___paritysi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___parityti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___popcountdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___popcountsi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___popcountti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___powidf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___powisf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___powixf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___signbit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___signbitf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___signbitl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___srefill() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___srget() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___stderrp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___stdinp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___stdoutp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___subdf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___subsf3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___subvdi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___subvsi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___subvti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___swbuf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___sync_fetch_and_add_16() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___sync_fetch_and_and_16() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___sync_fetch_and_or_16() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___sync_fetch_and_sub_16() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___sync_fetch_and_xor_16() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___sync_lock_test_and_set_16() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___truncdfsf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ucmpdi2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___ucmpti2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___udivdi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___udivmoddi4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___udivmodsi4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___udivmodti4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___udivsi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___udivti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___umoddi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___umodsi3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___umodti3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___unorddf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal___unordsf2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Assert() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_copy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_exchange() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_exchange_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_exchange_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_exchange_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_exchange_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_add_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_add_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_add_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_add_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_and_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_and_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_and_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_and_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_or_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_or_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_or_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_or_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_flag_clear() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_flag_test_and_set() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_load_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_load_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_load_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_load_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_signal_fence() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_store_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_store_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_store_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_store_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atomic_thread_fence() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atqexit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Atthreadexit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Btowc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Call_once() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Call_onceEx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Clocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Closreg() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_broadcast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_destroy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_do_broadcast_at_thread_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_init() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_init_with_name() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_register_at_thread_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_signal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_timedwait() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_unregister_at_thread_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cnd_wait() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Cosh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Costate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__CTinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Ctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__CurrentRuneLocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__CWcsxfrm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Daysto() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dbl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dclass() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__DefaultRuneLocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Deletegloballocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Denorm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Divide() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dnorm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Do_call() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dscale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dsign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dtento() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dtest() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Dunscale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Eps() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Erf_one() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Erf_small() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Erfc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__err() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Errno() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Exp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fac_tidy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fail_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FAtan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FCosh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDclass() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDenorm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDivide() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDnorm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDscale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDsign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDtento() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDtest() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FDunscale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FEps() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Feraise() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FErf_one() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FErf_small() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FErfc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_add_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_and_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_and_seq_cst_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_and_seq_cst_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_and_seq_cst_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_or_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_or_seq_cst_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_or_seq_cst_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_or_seq_cst_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_xor_8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_xor_seq_cst_1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_xor_seq_cst_2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fetch_xor_seq_cst_4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FExp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FFpcomp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FGamma_big() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fgpos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FHypot() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Files() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FInf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FLog() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FLogpoly() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Flt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fltrounds() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FNan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fofind() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fofree() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fopen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Foprep() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fpcomp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FPlsw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FPmsw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FPoly() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FPow() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FQuad() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FQuadph() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FRecip() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FRint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Frprep() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FRteps() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FSin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FSincos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FSinh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FSnan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fspos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FTan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FTgamma() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Fwprep() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXbig() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_addh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_addx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_getw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_invx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_ldexpx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_movx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_mulh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_mulx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_setn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_setw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_sqrtx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FXp_subx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__FZero() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Gamma_big() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Genld() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Gentime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getcloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getctyptab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getdst() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Geterrno() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getfld() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getfloat() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getgloballocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getmbcurmax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getpcostate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getpctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getpmbstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__getprogname() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getptimes() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getptolower() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getptoupper() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getpwcostate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getpwcstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getpwctrtab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getpwctytab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Gettime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getzone() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Hugeval() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Hypot() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Inf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__init_env() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__init_tls() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Isdst() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Iswctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LAtan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LCosh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Ldbl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDclass() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDenorm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDivide() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDnorm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDscale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDsign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDtento() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDtest() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Ldtob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LDunscale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LEps() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LErf_one() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LErf_small() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LErfc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LExp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LFpcomp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LGamma_big() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LHypot() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LInf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Litob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LLog() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LLogpoly() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LNan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Lock_shared_ptr_spin_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Lock_spin_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Lockfilelock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Locksyslock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Locsum() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Loctab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Locterm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Locvar() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Log() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Logpoly() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LPlsw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LPmsw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LPoly() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LPow() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LQuad() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LQuadph() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LRecip() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LRint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LRteps() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LSin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LSincos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LSinh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LSnan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LTan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LTgamma() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXbig() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_addh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_addx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_getw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_invx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_ldexpx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_movx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_mulh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_mulx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_setn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_setw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_sqrtx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LXp_subx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__LZero() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Makeloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Makestab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Makewct() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mbcurmax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mbstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mbtowc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mbtowcx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_current_owns() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_destroy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_init() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_init_with_name() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_timedlock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_trylock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtx_unlock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtxdst() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtxinit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtxlock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Mtxunlock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Nan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__new_setup() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Nnl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__PathLocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__PJP_C_Copyright() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__PJP_CPP_Copyright() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Plsw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Pmsw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Poly() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Pow() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Putfld() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Putstr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Puttxt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Quad() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Quadph() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Randseed() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__readdir_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Readloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Recip() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__reclaim_telldir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Restore_state() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Rint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Rteps() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__rtld_addr_phdr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__rtld_atfork_post() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__rtld_atfork_pre() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__rtld_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__rtld_get_stack_prot() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__rtld_thread_init() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Save_state() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__SceLibcDebugOut() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__SceLibcTelemetoryOut() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__seekdir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Setgloballocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Shared_ptr_flag() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Sin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Sincos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Sinh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Skip() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Snan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stderr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stdin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stdout() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tgamma() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_abort() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_create() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_current() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_detach() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_equal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_id() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_join() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_lt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_sleep() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_start() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_start_with_attr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_start_with_name() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_start_with_name_attr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Thrd_yield() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__thread_autoinit_dummy_decl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__thread_autoinit_dummy_decl_stub() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__thread_init() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__thread_init_stub() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Times() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Costate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Ctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Errno() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Mbcurmax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Mbstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Times() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Tolotab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Touptab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__WCostate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Wcstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Wctrans() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tls_setup__Wctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tolotab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Touptab() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Towctrans() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tss_create() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tss_delete() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tss_get() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tss_set() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Ttotm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Tzoff() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unlock_shared_ptr_spin_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unlock_spin_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unlockfilelock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unlocksyslock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unwind_Backtrace() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unwind_GetIP() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unwind_Resume() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Unwind_Resume_or_Rethrow() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Vacopy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__warn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WCostate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wcscollx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wcsftime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wcstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wcsxfrmx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wctob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wctomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wctombx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wctrans() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Wctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WFrprep() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WFwprep() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WGenld() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WGetfld() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WGetfloat() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WGetint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WGetstr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WLdtob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WLitob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WPutfld() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WPutstr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WPuttxt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStod() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStodx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStof() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStoflt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStofx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStold() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStoldx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStoll() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStopfx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStoul() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStoull() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WStoxflt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xbig() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_addh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_addx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_getw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_invx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_ldexpx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_movx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_mulh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_mulx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_setn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_setw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_sqrtx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xp_subx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xtime_diff_to_ts() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xtime_get_ticks() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Xtime_to_ts() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdaPvm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdaPvmRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdaPvmSt11align_val_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdaPvRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdaPvS_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdaPvSt11align_val_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdaPvSt11align_val_tRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPvm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPvmRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPvmSt11align_val_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPvRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPvS_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPvSt11align_val_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZdlPvSt11align_val_tRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Zero() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIcLb0EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIcLb1EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIwLb0EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIwLb1EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt14_Error_objectsIiE14_System_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt14_Error_objectsIiE15_Generic_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt20_Future_error_objectIiE14_Future_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt7codecvtIcc9_MbstatetE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt7collateIcE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt7collateIwE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt8messagesIcE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt8messagesIwE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt8numpunctIcE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt8numpunctIwE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZGVZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZGVZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv116__enum_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv116__enum_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv116__enum_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__array_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__array_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__array_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__class_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__class_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__class_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__pbase_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__pbase_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__pbase_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv119__pointer_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv119__pointer_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv119__pointer_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__function_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__function_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__function_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__si_class_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__si_class_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__si_class_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv121__vmi_class_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv121__vmi_class_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv121__vmi_class_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv123__fundamental_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv123__fundamental_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv123__fundamental_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN6Dinkum7codecvt10_Cvt_checkEmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads10lock_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads10lock_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads17_Throw_lock_errorEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads21_Throw_resource_errorEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads21thread_resource_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads21thread_resource_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Znam() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZnamRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZnamSt11align_val_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZnamSt11align_val_tRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XlenEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XranEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSs5_XlenEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSs5_XranEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt10bad_typeid4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt10bad_typeid8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt11logic_error4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt11logic_error8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt12bad_weak_ptr4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt12codecvt_base11do_encodingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt12codecvt_base13do_max_lengthEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt12future_error4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt12future_error8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt12system_error8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt13bad_exception8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt13runtime_error4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt14error_category10equivalentEiRKSt15error_condition() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt14error_category10equivalentERKSt10error_codei() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt14error_category23default_error_conditionEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt17bad_function_call4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt18bad_variant_access4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt22_Future_error_category4nameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt22_Future_error_category7messageEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt22_System_error_category23default_error_conditionEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt22_System_error_category4nameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt22_System_error_category7messageEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt23_Generic_error_category4nameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt23_Generic_error_category7messageEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_tolowerEc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_tolowerEPcPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_toupperEc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_toupperEPcPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE8do_widenEc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE8do_widenEPKcS2_Pc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE9do_narrowEcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_scan_isEsPKwS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_tolowerEPwPKw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_tolowerEw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_toupperEPwPKw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_toupperEw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE11do_scan_notEsPKwS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE5do_isEPKwS2_Ps() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE5do_isEsw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE8do_widenEc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE8do_widenEPKcS2_Pw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE9do_narrowEwc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE11do_groupingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE13do_neg_formatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE13do_pos_formatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE14do_curr_symbolEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE14do_frac_digitsEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_decimal_pointEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_negative_signEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_positive_signEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_thousands_sepEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE11do_groupingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE13do_neg_formatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE13do_pos_formatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE14do_curr_symbolEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE14do_frac_digitsEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_decimal_pointEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_negative_signEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_positive_signEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_thousands_sepEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE16do_always_noconvEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE2inERS0_PKcS4_RS4_PcS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE3outERS0_PKcS4_RS4_PcS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE5do_inERS0_PKcS4_RS4_PcS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE6do_outERS0_PKcS4_RS4_PcS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE6lengthERS0_PKcS4_m() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE7unshiftERS0_PcS3_RS3_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE9do_lengthERS0_PKcS4_m() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE11do_encodingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE13do_max_lengthEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE16do_always_noconvEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE5do_inERS0_PKcS4_RS4_PDiS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE6do_outERS0_PKDiS4_RS4_PcS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE9do_lengthERS0_PKcS4_m() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE11do_encodingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE13do_max_lengthEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE16do_always_noconvEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE5do_inERS0_PKcS4_RS4_PDsS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE6do_outERS0_PKDsS4_RS4_PcS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE9do_lengthERS0_PKcS4_m() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE11do_encodingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE13do_max_lengthEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE16do_always_noconvEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE5do_inERS0_PKcS4_RS4_PwS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE6do_outERS0_PKwS4_RS4_PcS6_RS6_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE9do_lengthERS0_PKcS4_m() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE12do_transformEPKcS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE4hashEPKcS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE7compareEPKcS2_S2_S2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE7do_hashEPKcS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE9transformEPKcS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE12do_transformEPKwS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE4hashEPKwS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE7compareEPKwS2_S2_S2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE7do_hashEPKwS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE9transformEPKwS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8bad_cast4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8bad_cast8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8ios_base7failure8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE3getEiiiRKSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE4openERKSsRKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE5closeEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE6do_getEiiiRKSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE7do_openERKSsRKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE8do_closeEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE4openERKSsRKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE5closeEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE7do_openERKSsRKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE8do_closeEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE11do_groupingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE11do_truenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE12do_falsenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE13decimal_pointEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE13thousands_sepEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE16do_decimal_pointEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE16do_thousands_sepEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE8groupingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE8truenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE9falsenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE11do_groupingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE11do_truenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE12do_falsenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE13decimal_pointEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE13thousands_sepEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE16do_decimal_pointEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE16do_thousands_sepEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE8groupingEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE8truenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE9falsenameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt9bad_alloc4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt9bad_alloc8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt9exception4whatEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt9exception6_RaiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt9exception8_DoraiseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE5_CopyEmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6appendEmw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEmw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSiD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSiD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSo6sentryC2ERSo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSo6sentryD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs5_CopyEmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs5eraseEmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs6appendEmc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs6appendERKSsmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs6assignEmc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs6assignEPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs6assignERKSsmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSs6insertEmmc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10bad_typeidD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10bad_typeidD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10bad_typeidD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem10_Close_dirEPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem10_Copy_fileEPKcS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem10_File_sizeEPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem11_EquivalentEPKcS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem11_Remove_dirEPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem12_Current_getERA260_c() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem12_Current_setEPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem16_Last_write_timeEPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathES4_St10error_code() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathESt10error_code() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem18_Xfilesystem_errorEPKcSt10error_code() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem20_Set_last_write_timeEPKcl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem5_StatEPKcPNS_5permsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem6_ChmodEPKcNS_5permsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem6_LstatEPKcPNS_5permsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem7_RenameEPKcS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem7_ResizeEPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem7_UnlinkEPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem8_StatvfsEPKcRNS_10space_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem9_Make_dirEPKcS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem9_Open_dirERA260_cPKcRiRNS_9file_typeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10filesystem9_Read_dirERA260_cPvRNS_9file_typeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EE4intlE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC1ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC2ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EE4intlE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC1ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC2ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EE4intlE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC1ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC2ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EE4intlE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC1ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC2ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11logic_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11logic_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11logic_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11range_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11range_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11range_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11regex_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11regex_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt11regex_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12bad_weak_ptrD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12bad_weak_ptrD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12bad_weak_ptrD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12domain_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12domain_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12domain_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12future_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12future_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12future_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12length_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12length_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12length_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12out_of_rangeD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12out_of_rangeD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12out_of_rangeD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_1E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_2E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_3E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_4E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_5E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_6E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_7E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_8E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_9E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_11E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_12E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_13E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_14E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_15E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_16E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_17E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_18E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_19E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_20E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12system_errorC2ESt10error_codePKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12system_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12system_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt12system_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base10is_boundedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base10is_integerE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base14is_specializedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base5radixE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base8is_exactE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base9is_moduloE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Regex_traitsIcE6_NamesE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13_Regex_traitsIwE6_NamesE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13bad_exceptionD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13bad_exceptionD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13bad_exceptionD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5_LockEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7_UnlockEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9_EndwriteEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5_LockEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7_UnlockEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9_EndwriteEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13runtime_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13runtime_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13runtime_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Error_objectsIiE14_System_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Error_objectsIiE15_Generic_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base10has_denormE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base10is_boundedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base10is_integerE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base11round_styleE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base12has_infinityE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base13has_quiet_NaNE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base14is_specializedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base15has_denorm_lossE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base15tinyness_beforeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base17has_signaling_NaNE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base5radixE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base5trapsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base8is_exactE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base9is_iec559E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base9is_moduloE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14error_categoryD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIaE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIaE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIaE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE9is_moduloE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIcE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIcE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIcE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE12max_digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE12max_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE12min_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE14max_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE14min_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDiE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDiE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDiE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDsE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDsE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDsE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE12max_digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE12max_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE12min_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE14max_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE14min_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE12max_digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE12max_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE12min_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE14max_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE14min_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIhE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIhE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIhE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIiE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIiE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIiE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIjE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIjE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIjE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIlE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIlE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIlE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsImE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsImE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsImE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIsE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIsE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIsE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsItE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsItE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsItE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIwE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIwE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIwE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIxE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIxE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIxE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIyE6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIyE8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIyE9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14overflow_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14overflow_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14overflow_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base10has_denormE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base10is_boundedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base10is_integerE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base11round_styleE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base12has_infinityE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base13has_quiet_NaNE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base14is_specializedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base15has_denorm_lossE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base15tinyness_beforeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base17has_signaling_NaNE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base5radixE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base5trapsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base8is_exactE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base9is_iec559E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base9is_moduloE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15underflow_errorD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15underflow_errorD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15underflow_errorD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt16invalid_argumentD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt16invalid_argumentD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt16invalid_argumentD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt16nested_exceptionD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt16nested_exceptionD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt16nested_exceptionD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt17bad_function_callD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt17bad_function_callD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt17bad_function_callD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt18bad_variant_accessD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt18bad_variant_accessD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt20_Future_error_objectIiE14_Future_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt20bad_array_new_lengthD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt20bad_array_new_lengthD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt20bad_array_new_lengthD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt22_Future_error_categoryD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt22_Future_error_categoryD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt22_System_error_categoryD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt22_System_error_categoryD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt23_Generic_error_categoryD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt23_Generic_error_categoryD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt3pmr19new_delete_resourceEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt3pmr20get_default_resourceEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt3pmr20null_memory_resourceEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt3pmr20set_default_resourceEPNS_15memory_resourceE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPKcPP12pthread_attrPP7pthread() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPKcPP7pthread() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPP12pthread_attrPP7pthread() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPP7pthread() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_Pad8_ReleaseEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_PadC2EPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_PadC2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_PadD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt4_PadD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcE10table_sizeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt5ctypeIwE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt5ctypeIwED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt5ctypeIwED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_Mutex5_LockEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_Mutex7_UnlockEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_MutexC1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_MutexC2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_MutexD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_MutexD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_Winit9_Init_cntE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_WinitC1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); // GRR + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_WinitC2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_WinitD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6_WinitD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6chrono12steady_clock12is_monotonicE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6chrono12steady_clock9is_steadyE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6chrono12system_clock12is_monotonicE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6chrono12system_clock9is_steadyE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale16_GetgloballocaleEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale16_SetgloballocaleEPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale2id7_Id_cntE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale5_InitEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale5emptyEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale5facet7_DecrefEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale5facet7_IncrefEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale5facet9_RegisterEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale6globalERKS_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp7_AddfacEPNS_5facetEm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp8_ClocptrE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp8_MakelocERKSt8_LocinfoiPS0_PKS_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp9_MakewlocERKSt8_LocinfoiPS0_PKS_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp9_MakexlocERKSt8_LocinfoiPS0_PKS_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC1Eb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC1ERKS0_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC2Eb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC2ERKS0_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6locale7classicEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6localeD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt6thread20hardware_concurrencyEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcE5_InitERKSt8_Locinfob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcEC2Emb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcEC2EPKcmbb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwE5_InitERKSt8_Locinfob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwEC2Emb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwEC2EPKcmbb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetE7_GetcatEPPKNSt6locale5facetEPKS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDic9_MbstatetE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDic9_MbstatetED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDic9_MbstatetED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDsc9_MbstatetE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDsc9_MbstatetED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDsc9_MbstatetED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIwc9_MbstatetE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIwc9_MbstatetED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7codecvtIwc9_MbstatetED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIcED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7collateIwED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_Locinfo8_AddcatsEiPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC1EiPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC1EPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC1ERKSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC2EiPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC2EPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC2ERKSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8bad_castD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8bad_castD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8bad_castD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base4Init9_Init_cntE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitC1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); // alien isolation + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitC2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); // GRR + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base5_SyncE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base5clearENSt5_IosbIiE8_IostateEb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base6_IndexE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base7_AddstdEPS_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base7failureD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base7failureD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_base7failureD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_baseD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_baseD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8ios_baseD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIcED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8messagesIwED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE5_InitERKSt8_Locinfob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE5_TidyEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC1EPKcmb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC1ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC2EPKcmb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC2ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE5_InitERKSt8_Locinfob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE5_TidyEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE7_GetcatEPPKNSt6locale5facetEPKS1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC1EPKcmb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC1ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC2EPKcmb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC2ERKSt8_Locinfomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base10has_denormE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base10is_boundedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base10is_integerE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base11round_styleE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12has_infinityE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12max_digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12max_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12min_exponentE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base13has_quiet_NaNE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base14is_specializedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base14max_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base14min_exponent10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base15has_denorm_lossE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base15tinyness_beforeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base17has_signaling_NaNE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base5radixE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base5trapsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base6digitsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base8digits10E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base8is_exactE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base9is_iec559E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base9is_moduloE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9_Num_base9is_signedE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9bad_allocD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9bad_allocD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9bad_allocD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9exception18_Set_raise_handlerEPFvRKS_E() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9exceptionD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9exceptionD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9exceptionD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9type_infoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9type_infoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9type_infoD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZnwmRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZnwmSt11align_val_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZnwmSt11align_val_tRKSt9nothrow_t() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt10_Rng_abortPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt10adopt_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt10defer_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt10unexpectedv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt11_Xbad_allocv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt11setiosflagsNSt5_IosbIiE9_FmtflagsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt11try_to_lock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt12setprecisioni() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt13_Cl_charnames() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt13_Execute_onceRSt9once_flagPFiPvS1_PS1_ES1_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt13_Syserror_mapi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt13_Xregex_errorNSt15regex_constants10error_typeE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt13get_terminatev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt13resetiosflagsNSt5_IosbIiE9_FmtflagsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt13set_terminatePFvvE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Atomic_assertPKcS0_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Cl_wcharnames() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Debug_messagePKcS0_j() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Raise_handler() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Random_devicev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Throw_C_errori() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Xlength_errorPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14_Xout_of_rangePKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14get_unexpectedv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt14set_unexpectedPFvvE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt15_sceLibcLocinfoPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt15_Xruntime_errorPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt15future_categoryv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt15get_new_handlerv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt15set_new_handlerPFvvE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt15system_categoryv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt16_Throw_Cpp_errori() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt16_Xoverflow_errorPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt16generic_categoryv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt17_Future_error_mapi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt18_String_cpp_unused() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt18_Xinvalid_argumentPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt18uncaught_exceptionv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt19_Throw_future_errorRKSt10error_code() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt19_Xbad_function_callv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt21_sceLibcClassicLocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt22_Get_future_error_whati() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt22_Random_device_entropyv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt25_Rethrow_future_exceptionSt13exception_ptr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt3cin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt4_Fpz() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt4cerr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt4clog() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt4cout() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt4setwi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt4wcin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt5wcerr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt5wclog() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt5wcout() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt6_ThrowRKSt9exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt6ignore() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7_BADOFF() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7_FiopenPKcNSt5_IosbIiE9_OpenmodeEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7_FiopenPKwNSt5_IosbIiE9_OpenmodeEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7_MP_AddPyy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7_MP_GetPy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7_MP_MulPyyy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7_MP_RemPyy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7nothrow() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt7setbasei() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt8_XLgammad() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt8_XLgammae() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt8_XLgammaf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt9_LStrcollIcEiPKT_S2_S2_S2_PKSt8_Collvec() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt9_LStrcollIwEiPKT_S2_S2_S2_PKSt8_Collvec() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt9_LStrxfrmIcEmPT_S1_PKS0_S3_PKSt8_Collvec() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt9_LStrxfrmIwEmPT_S1_PKS0_S3_PKSt8_Collvec() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt9terminatev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTId() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIDh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIDi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIDn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIDs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv116__enum_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv117__array_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv117__class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv117__pbase_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv119__pointer_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv120__function_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv120__si_class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv121__vmi_class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv123__fundamental_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv129__pointer_to_member_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN6Dinkum7threads10lock_errorE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIN6Dinkum7threads21thread_resource_errorE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTINSt6locale5facetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTINSt6locale7_LocimpE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTINSt8ios_base7failureE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPDh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPDi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPDn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPDs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKDh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKDi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKDn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKDs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPKy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIPy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt10bad_typeid() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt10ctype_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt10money_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIcLb0EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIcLb1EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIwLb0EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIwLb1EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt11_Facet_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt11logic_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt11range_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt11regex_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt12bad_weak_ptr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt12codecvt_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt12domain_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt12future_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt12length_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt12out_of_range() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt12system_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt13bad_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt13basic_filebufIcSt11char_traitsIcEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt13basic_filebufIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt13messages_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt13runtime_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt14error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt14overflow_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt15underflow_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt16invalid_argument() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt16nested_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt17bad_function_call() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt18bad_variant_access() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt20bad_array_new_length() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt22_Future_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt22_System_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt23_Generic_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt4_Pad() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt5_IosbIiE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt5ctypeIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt5ctypeIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7_MpunctIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7_MpunctIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7codecvtIcc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7codecvtIDic9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7codecvtIDsc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7codecvtIwc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7collateIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7collateIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8bad_cast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8ios_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8messagesIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8messagesIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8numpunctIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8numpunctIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9bad_alloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9basic_iosIcSt11char_traitsIcEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9basic_iosIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9time_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9type_info() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTIy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSDi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSDn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSDs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv116__enum_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv117__array_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv117__class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv117__pbase_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv119__pointer_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv120__function_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv120__si_class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv121__vmi_class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv123__fundamental_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv129__pointer_to_member_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN6Dinkum7threads10lock_errorE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSN6Dinkum7threads21thread_resource_errorE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSNSt6locale5facetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSNSt6locale7_LocimpE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSNSt8ios_base7failureE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPDi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPDn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPDs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKDi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKDn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKDs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPKy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSPy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt10bad_typeid() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt10ctype_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt10money_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIcLb0EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIcLb1EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIwLb0EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIwLb1EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt11_Facet_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt11logic_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt11range_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt11regex_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt12bad_weak_ptr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt12codecvt_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt12domain_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt12future_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt12length_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt12out_of_range() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt12system_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt13bad_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt13basic_filebufIcSt11char_traitsIcEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt13basic_filebufIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt13messages_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt13runtime_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt14error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt14overflow_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt15underflow_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt16invalid_argument() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt16nested_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt17bad_function_call() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt18bad_variant_access() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt20bad_array_new_length() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt22_Future_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt22_System_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt23_Generic_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt4_Pad() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt5_IosbIiE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt5ctypeIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt5ctypeIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7_MpunctIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7_MpunctIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIcc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIDic9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIDsc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIwc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7collateIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7collateIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8bad_cast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8ios_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8messagesIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8messagesIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8numpunctIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8numpunctIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9bad_alloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9basic_iosIcSt11char_traitsIcEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9basic_iosIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9time_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9type_info() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSiD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSiD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSoD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSoD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv116__enum_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv117__array_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv117__class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv117__pbase_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv119__pointer_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv120__function_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv120__si_class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv121__vmi_class_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv123__fundamental_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv129__pointer_to_member_type_infoE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN6Dinkum7threads10lock_errorE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVN6Dinkum7threads21thread_resource_errorE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVNSt6locale7_LocimpE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVNSt8ios_base7failureE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt10bad_typeid() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIcLb0EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIcLb1EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIwLb0EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIwLb1EE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt11logic_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt11range_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt11regex_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt12bad_weak_ptr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt12domain_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt12future_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt12length_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt12out_of_range() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt12system_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt13bad_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt13basic_filebufIcSt11char_traitsIcEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt13basic_filebufIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt13runtime_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt14error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt14overflow_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt15underflow_error() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt16invalid_argument() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt16nested_exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt17bad_function_call() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt18bad_variant_access() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt20bad_array_new_length() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt22_Future_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt22_System_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt23_Generic_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt4_Pad() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt5ctypeIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt5ctypeIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7_MpunctIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7_MpunctIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIcc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIDic9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIDsc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIwc9_MbstatetE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7collateIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7collateIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8bad_cast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8ios_base() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8messagesIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8messagesIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8numpunctIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8numpunctIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt9bad_alloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt9exception() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt9type_info() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_abort() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_abort_handler_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_alarm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_aligned_alloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_asctime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_asctime_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_at_quick_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atexit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atof() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atoi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atol() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atoll() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_basename() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_basename_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_bcmp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_bcopy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_bsearch() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_bsearch_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_btowc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_bzero() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_c16rtomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_c32rtomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_calloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_cbrt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_cbrtf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_cbrtl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_clearerr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_clearerr_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_clock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_clock_1700() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_closedir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_copysign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_copysignf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_copysignl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ctime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ctime_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_daemon() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_daylight() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_devname() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_devname_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_difftime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_dirname() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_div() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_drand48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_drem() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_dremf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_erand48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_erf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_erfc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_erfcf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_erfcl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_erff() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_erfl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_err() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_err_set_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_err_set_file() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_errc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_errx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fclose() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fcloseall() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fdim() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fdimf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fdiml() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fdopen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fdopendir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_feclearexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fedisableexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_feenableexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fegetenv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fegetexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fegetexceptflag() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fegetround() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fegettrapenable() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_feholdexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_feof() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_feof_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_feraiseexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ferror() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ferror_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fesetenv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fesetexceptflag() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fesetround() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fesettrapenable() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fetestexcept() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_feupdateenv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fflush() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fgetc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fgetln() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fgetpos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fgets() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fgetwc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fgetws() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fileno() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fileno_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_finite() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_finitef() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_flockfile() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_flsl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fma() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmaf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fopen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fopen_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fpurge() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fputc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fputs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fputwc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fputws() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fread() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_freeifaddrs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_freopen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_freopen_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fseek() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fseeko() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fsetpos() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fstatvfs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ftell() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ftello() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ftrylockfile() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_funlockfile() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fwide() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fwrite() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gamma() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gamma_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gammaf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gammaf_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getc_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getchar() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getchar_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getcwd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getenv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gethostname() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getifaddrs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getopt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getopt_long() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getopt_long_only() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getprogname() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gets() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gets_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getwc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_getwchar() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gmtime(time_t* timer) { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_gmtime_s(time_t* timer, u64 flags) { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_hypot() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_hypot3() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_hypot3f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_hypot3l() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_hypotf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_hypotl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ignore_handler_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_index() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_inet_addr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_inet_aton() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_inet_ntoa() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_inet_ntoa_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_initstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isalnum() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isalpha() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isblank() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iscntrl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isdigit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isgraph() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isprint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ispunct() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isspace() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswalnum() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswalpha() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswblank() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswcntrl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswdigit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswgraph() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswlower() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswprint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswpunct() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswspace() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswupper() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_iswxdigit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isxdigit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_j0() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_j0f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_j1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_j1f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_jn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_jnf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_jrand48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_labs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lcong48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ldexp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ldexpf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ldexpl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ldiv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lgamma() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lgamma_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lgammaf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lgammaf_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lgammal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_llabs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lldiv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_llrint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_llrintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_llrintl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_llround() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_llroundf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_llroundl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_localeconv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_localtime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_localtime_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_longjmp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lrand48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lrint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lrintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lrintl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_makecontext() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mblen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbrlen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbrtoc16() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbrtoc32() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbrtowc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbsinit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbsrtowcs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbsrtowcs_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbstowcs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbstowcs_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mbtowc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mergesort() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mktime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_modf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_modff() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_modfl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_mrand48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nearbyint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nearbyintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nearbyintl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_Need_sceLibcInternal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nextafter() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nextafterf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nextafterl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nexttoward() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nexttowardf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nexttowardl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nrand48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_opendir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_optarg() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_opterr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_optind() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_optopt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_optreset() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_perror() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_addclose() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_adddup2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_addopen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_destroy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_init() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_destroy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_getflags() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_getpgroup() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_getschedparam() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_getschedpolicy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_getsigdefault() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_getsigmask() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_init() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_setflags() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_setpgroup() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_setschedparam() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_setschedpolicy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_setsigdefault() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnattr_setsigmask() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_spawnp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_psignal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putc_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putchar() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putchar_unlocked() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putenv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_puts() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putwc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_putwchar() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_qsort() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_qsort_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_quick_exit() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rand() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rand_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_random() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_readdir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_readdir_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_realpath() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_remainderf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_remainderl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_remove() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_remquo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_remquof() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_remquol() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rewind() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rewinddir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rindex() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rint() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_rintl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_round() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_roundf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_roundl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalbf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalbln() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalblnf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalblnl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalbn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalbnf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scalbnl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcDebugOut() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcHeapGetAddressRanges() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcHeapMutexCalloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcHeapMutexFree() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcHeapSetAddressRangeCallback() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcHeapSetTraceMarker() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcHeapUnsetTraceMarker() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcInternalMemoryGetWakeAddr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcInternalMemoryMutexEnable() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcInternalSetMallocCallback() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sceLibcOnce() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_seed48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_seekdir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_set_constraint_handler_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_setbuf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_setenv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_setjmp(std::jmp_buf buf) { + LOG_ERROR(Lib_LibcInternal, "(TEST) called"); + return _setjmp(buf); // todo this feels platform specific but maybe not +} + +s32 PS4_SYSV_ABI internal_setlocale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_setstate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_setvbuf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sigblock() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_siginterrupt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_signalcontext() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_signgam() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_significand() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_significandf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sigsetmask() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sigvec() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_srand48() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_srandom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_srandomdev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_statvfs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_stderr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_stdin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_stdout() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_stpcpy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sys_nsig() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sys_siglist() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sys_signame() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_syslog() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_telldir() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tgamma() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tgammaf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tgammal() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_time() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_timezone() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tolower() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_toupper() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_towctrans() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_towlower() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_towupper() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_trunc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_truncf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_truncl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tzname() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tzset() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ungetc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ungetwc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_unsetenv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_utime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_verr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_verrc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_verrx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsyslog() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vwarn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vwarnc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vwarnx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_warn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_warnc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_warnx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcrtomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcrtomb_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcscat() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcscat_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcschr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcscmp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcscoll() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcscpy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcscpy_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcscspn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsftime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcslen() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsncat() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsncat_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsncmp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsncpy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsncpy_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsnlen_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcspbrk() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsrchr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsrtombs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsrtombs_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsspn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstod() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstof() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstoimax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstok() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstok_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstol() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstold() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstoll() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstombs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstombs_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstoul() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstoull() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcstoumax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsxfrm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wctob() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wctomb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wctomb_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wctrans() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wctype() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_xtime_get() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_y0() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_y0f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_y1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_y1f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_yn() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ynf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_Func_186EB8E3525D6240() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_Func_419F5881393ECAB1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_Func_6C6B8377791654A4() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_Func_7FD2D5C8DF0ACBC8() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_Func_C14A89D29B148C3A() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } void RegisterlibSceLibcInternal(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("NFLs+dRJGNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memcpy_s); - LIB_FUNCTION("Q3VBxCXhUHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memcpy); - LIB_FUNCTION("8zTFvBIAIN8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memset); - LIB_FUNCTION("5Xa2ACNECdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcpy_s); - LIB_FUNCTION("K+gcnFFJKVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcat_s); - LIB_FUNCTION("DfivPArhucg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memcmp); - LIB_FUNCTION("aesyjrHVWy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcmp); - LIB_FUNCTION("Ovb2dSJOAuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strncmp); - LIB_FUNCTION("j4ViWNHEgww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strlen); - LIB_FUNCTION("6sJWiWSRuqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strncpy); - LIB_FUNCTION("YNzNkJzYqEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strncpy_s); - LIB_FUNCTION("Ls4tzzhimqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcat); - LIB_FUNCTION("ob5xAW4ln-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strchr); - LIB_FUNCTION("H8ya2H00jbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sin); - LIB_FUNCTION("Q4rRL34CEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinf); - LIB_FUNCTION("2WE3BTYVwKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cos); - LIB_FUNCTION("-P6FNMzk2Kc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosf); - LIB_FUNCTION("jMB7EFyu30Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sincos); - LIB_FUNCTION("pztV4AF18iI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sincosf); - LIB_FUNCTION("T7uyNqP7vQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tan); - LIB_FUNCTION("ZE6RNL+eLbk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanf); - LIB_FUNCTION("7Ly52zaL44Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_asin); - LIB_FUNCTION("GZWjF-YIFFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asinf); - LIB_FUNCTION("JBcgYuW8lPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_acos); - LIB_FUNCTION("QI-x0SL8jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_acosf); - LIB_FUNCTION("OXmauLdQ8kY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atan); - LIB_FUNCTION("weDug8QD-lE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atanf); - LIB_FUNCTION("HUbZmOnT-Dg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atan2); - LIB_FUNCTION("EH-x713A99c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atan2f); - LIB_FUNCTION("NVadfnzQhHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp); - LIB_FUNCTION("8zsu04XNsZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expf); - LIB_FUNCTION("dnaeGXbjP6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp2); - LIB_FUNCTION("wuAQt-j+p4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_exp2f); - LIB_FUNCTION("9LCjpWyQ5Zc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_pow); - LIB_FUNCTION("1D0H2KNjshE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powf); - LIB_FUNCTION("rtV7-jWC6Yg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log); - LIB_FUNCTION("RQXLbdT2lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logf); - LIB_FUNCTION("WuMbPBKN1TU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log10); - LIB_FUNCTION("lhpd6Wk6ccs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log10f); - LIB_FUNCTION("gQX+4GDQjpM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc); - LIB_FUNCTION("tIhsqj0qsFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_free); - LIB_FUNCTION("fJnpuVVBbKk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_operator_new); - LIB_FUNCTION("hdm0YfMa7TQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_operator_new); - LIB_FUNCTION("MLWl90SFWNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_operator_delete); + RegisterlibSceLibcInternalMspace(sym); + RegisterlibSceLibcInternalIo(sym); + RegisterlibSceLibcInternalMemory(sym); + RegisterlibSceLibcInternalStr(sym); + RegisterlibSceLibcInternalStream(sym); + + LIB_FUNCTION("NWtTN10cJzE", "libSceLibcInternalExt", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcHeapGetTraceInfo); + LIB_FUNCTION("ys1W6EwuVw4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___absvdi2); + LIB_FUNCTION("2HED9ow7Zjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___absvsi2); + LIB_FUNCTION("v9XNTmsmz+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___absvti2); + LIB_FUNCTION("3CAYAjL-BLs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___adddf3); + LIB_FUNCTION("mhIInD5nz8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___addsf3); + LIB_FUNCTION("8gG-+co6LfM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___addvdi3); + LIB_FUNCTION("gsnW-FWQqZo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___addvsi3); + LIB_FUNCTION("IjlonFkCFDs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___addvti3); + LIB_FUNCTION("CS91br93fag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ashldi3); + LIB_FUNCTION("ECUHmdEfhic", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ashlti3); + LIB_FUNCTION("fSZ+gbf8Ekc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ashrdi3); + LIB_FUNCTION("7+0ouwmGDww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ashrti3); + LIB_FUNCTION("ClfCoK1Zeb4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_compare_exchange); + LIB_FUNCTION("ZwapHUAcijE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_compare_exchange_1); + LIB_FUNCTION("MwiKdf6QFvI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_compare_exchange_2); + LIB_FUNCTION("lku-VgKK0RE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_compare_exchange_4); + LIB_FUNCTION("tnlAgPCKyTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_compare_exchange_8); + LIB_FUNCTION("hsn2TaF3poY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_compare_exchange_n); + LIB_FUNCTION("5i8mTQeo9hs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_exchange); + LIB_FUNCTION("z8lecpCHpqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_exchange_1); + LIB_FUNCTION("HDvFM0iZYXo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_exchange_2); + LIB_FUNCTION("yit-Idli5gU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_exchange_4); + LIB_FUNCTION("UOz27kgch8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_exchange_8); + LIB_FUNCTION("oCH4efUlxZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_exchange_n); + LIB_FUNCTION("Qb86Y5QldaE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_add_1); + LIB_FUNCTION("wEImmi0YYQM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_add_2); + LIB_FUNCTION("U8pDVMfBDUY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_add_4); + LIB_FUNCTION("SqcnaljoFBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_add_8); + LIB_FUNCTION("Q3-0HGD3Y48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_and_1); + LIB_FUNCTION("A71XWS1kKqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_and_2); + LIB_FUNCTION("E-XEmpL9i1A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_and_4); + LIB_FUNCTION("xMksIr3nXug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_and_8); + LIB_FUNCTION("LvLuiirFk8U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_or_1); + LIB_FUNCTION("aSNAf0kxC+Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_or_2); + LIB_FUNCTION("AFRS4-8aOSo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_or_4); + LIB_FUNCTION("5ZKavcBG7eM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_or_8); + LIB_FUNCTION("HWBJOsgJBT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_sub_1); + LIB_FUNCTION("yvhjR7PTRgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_sub_2); + LIB_FUNCTION("-mUC21i8WBQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_sub_4); + LIB_FUNCTION("K+k1HlhjyuA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_sub_8); + LIB_FUNCTION("aWc+LyHD1vk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_xor_1); + LIB_FUNCTION("PZoM-Yn6g2Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_xor_2); + LIB_FUNCTION("pPdYDr1KDsI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_xor_4); + LIB_FUNCTION("Dw3ieb2rMmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_fetch_xor_8); + LIB_FUNCTION("JZWEhLSIMoQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_is_lock_free); + LIB_FUNCTION("+iy+BecyFVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_load); + LIB_FUNCTION("cWgvLiSJSOQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_load_1); + LIB_FUNCTION("ufqiLmjiBeM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_load_2); + LIB_FUNCTION("F+m2tOMgeTo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_load_4); + LIB_FUNCTION("8KwflkOtvZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_load_8); + LIB_FUNCTION("Q6oqEnefZQ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_load_n); + LIB_FUNCTION("sV6ry-Fd-TM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_store); + LIB_FUNCTION("ZF6hpsTZ2m8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_store_1); + LIB_FUNCTION("-JjkEief9No", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_store_2); + LIB_FUNCTION("4tDF0D+qdWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_store_4); + LIB_FUNCTION("DEQmHCl-EGU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_store_8); + LIB_FUNCTION("GdwuPYbVpP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___atomic_store_n); + LIB_FUNCTION("XGNIEdRyYPo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cleanup); + LIB_FUNCTION("gCf7+aGEhnU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___clzdi2); + LIB_FUNCTION("ptL8XWgpGS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___clzsi2); + LIB_FUNCTION("jPywoVsPVR8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___clzti2); + LIB_FUNCTION("OvbYtSGnzFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cmpdi2); + LIB_FUNCTION("u2kPEkUHfsg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cmpti2); + LIB_FUNCTION("yDPuV0SXp7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ctzdi2); + LIB_FUNCTION("2NvhgiBTcVE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ctzsi2); + LIB_FUNCTION("olBDzD1rX2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ctzti2); + LIB_FUNCTION("IJKVjsmxxWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_allocate_dependent_exception); + LIB_FUNCTION("cfAXurvfl5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_allocate_exception); + LIB_FUNCTION("tsvEmnenz48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_atexit); + LIB_FUNCTION("pBxafllkvt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_bad_cast); + LIB_FUNCTION("xcc6DTcL8QA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_bad_typeid); + LIB_FUNCTION("3cUUypQzMiI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_begin_catch); + LIB_FUNCTION("usKbuvy2hQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_call_unexpected); + LIB_FUNCTION("BxPeH9TTcs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_current_exception_type); + LIB_FUNCTION("RY8mQlhg7mI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_current_primary_exception); + LIB_FUNCTION("MQFPAqQPt1s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_decrement_exception_refcount); + LIB_FUNCTION("zMCYAqNRllc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_demangle); + LIB_FUNCTION("lX+4FNUklF0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_end_catch); + LIB_FUNCTION("H2e8t5ScQGc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_finalize); + LIB_FUNCTION("kBxt5LwtLA4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_free_dependent_exception); + LIB_FUNCTION("nOIEswYD4Ig", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_free_exception); + LIB_FUNCTION("Y6Sl4Xw7gfA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_get_exception_ptr); + LIB_FUNCTION("3rJJb81CDM4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_get_globals); + LIB_FUNCTION("uCRed7SvX5E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_get_globals_fast); + LIB_FUNCTION("2emaaluWzUw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_guard_abort); + LIB_FUNCTION("3GPpjQdAMTw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_guard_acquire); + LIB_FUNCTION("9rAeANT2tyE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_guard_release); + LIB_FUNCTION("PsrRUg671K0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_increment_exception_refcount); + LIB_FUNCTION("zr094EQ39Ww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_pure_virtual); + LIB_FUNCTION("ZL9FV4mJXxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_rethrow); + LIB_FUNCTION("qKQiNX91IGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_rethrow_primary_exception); + LIB_FUNCTION("vkuuLfhnSZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___cxa_throw); + LIB_FUNCTION("eTP9Mz4KkY4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divdc3); + LIB_FUNCTION("mdGgLADsq8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divdf3); + LIB_FUNCTION("9daYeu+0Y-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divdi3); + LIB_FUNCTION("1rs4-h7Fq9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divmoddi4); + LIB_FUNCTION("rtBENmz8Iwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divmodsi4); + LIB_FUNCTION("dcaiFCKtoDg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divsc3); + LIB_FUNCTION("nufufTB4jcI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divsf3); + LIB_FUNCTION("zdJ3GXAcI9M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divsi3); + LIB_FUNCTION("XU4yLKvcDh0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divti3); + LIB_FUNCTION("SNdBm+sNfM4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___divxc3); + LIB_FUNCTION("hMAe+TWS9mQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___dynamic_cast); + LIB_FUNCTION("8F52nf7VDS8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___eqdf2); + LIB_FUNCTION("LmXIpdHppBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___eqsf2); + LIB_FUNCTION("6zU++1tayjA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___extendsfdf2); + LIB_FUNCTION("CVoT4wFYleE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fe_dfl_env); + LIB_FUNCTION("1IB0U3rUtBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fedisableexcept); + LIB_FUNCTION("NDOLSTFT1ns", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___feenableexcept); + LIB_FUNCTION("E1iwBYkG3CM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fflush); + LIB_FUNCTION("r3tNGoVJ2YA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ffsdi2); + LIB_FUNCTION("b54DvYZEHj4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ffsti2); + LIB_FUNCTION("q9SHp+5SOOQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixdfdi); + LIB_FUNCTION("saNCRNfjeeg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixdfsi); + LIB_FUNCTION("cY4yCWdcTXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixdfti); + LIB_FUNCTION("0eoyU-FoNyk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixsfdi); + LIB_FUNCTION("3qQmz11yFaA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixsfsi); + LIB_FUNCTION("IHq2IaY4UGg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixsfti); + LIB_FUNCTION("h8nbSvw0s+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunsdfdi); + LIB_FUNCTION("6WwFtNvnDag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunsdfsi); + LIB_FUNCTION("rLuypv9iADw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunsdfti); + LIB_FUNCTION("Qa6HUR3h1k4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunssfdi); + LIB_FUNCTION("NcZqFTG-RBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunssfsi); + LIB_FUNCTION("mCESRUqZ+mw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunssfti); + LIB_FUNCTION("DG8dDx9ZV70", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunsxfdi); + LIB_FUNCTION("dtMu9zCDn3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunsxfsi); + LIB_FUNCTION("l0qC0BR1F44", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixunsxfti); + LIB_FUNCTION("31g+YJf1fHk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixxfdi); + LIB_FUNCTION("usQDRS-1HZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fixxfti); + LIB_FUNCTION("BMVIEbwpP+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatdidf); + LIB_FUNCTION("2SSK3UFPqgQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatdisf); + LIB_FUNCTION("MVPtIf3MtL8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatdixf); + LIB_FUNCTION("X7A21ChFXPQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatsidf); + LIB_FUNCTION("rdht7pwpNfM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatsisf); + LIB_FUNCTION("EtpM9Qdy8D4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floattidf); + LIB_FUNCTION("VlDpPYOXL58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floattisf); + LIB_FUNCTION("dJvVWc2jOP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floattixf); + LIB_FUNCTION("1RNxpXpVWs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatundidf); + LIB_FUNCTION("9tnIVFbvOrw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatundisf); + LIB_FUNCTION("3A9RVSwG8B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatundixf); + LIB_FUNCTION("OdvMJCV7Oxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatunsidf); + LIB_FUNCTION("RC3VBr2l94o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatunsisf); + LIB_FUNCTION("ibs6jIR0Bw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatuntidf); + LIB_FUNCTION("KLfd8g4xp+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatuntisf); + LIB_FUNCTION("OdzLUcBLhb4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___floatuntixf); + LIB_FUNCTION("qlWiRfOJx1A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fpclassifyd); + LIB_FUNCTION("z7aCCd9hMsI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fpclassifyf); + LIB_FUNCTION("zwV79ZJ9qAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___fpclassifyl); + LIB_FUNCTION("hXA24GbAPBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___gedf2); + LIB_FUNCTION("mdLGxBXl6nk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___gesf2); + LIB_FUNCTION("1PvImz6yb4M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___gtdf2); + LIB_FUNCTION("ICY0Px6zjjo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___gtsf2); + LIB_FUNCTION("XwLA5cTHjt4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___gxx_personality_v0); + LIB_FUNCTION("7p7kTAJcuGg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___inet_addr); + LIB_FUNCTION("a7ToDPsIQrc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___inet_aton); + LIB_FUNCTION("6i5aLrxRhG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___inet_ntoa); + LIB_FUNCTION("H2QD+kNpa+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___inet_ntoa_r); + LIB_FUNCTION("dhK16CKwhQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isfinite); + LIB_FUNCTION("Q8pvJimUWis", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isfinitef); + LIB_FUNCTION("3-zCDXatSU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isfinitel); + LIB_FUNCTION("V02oFv+-JzA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isinf); + LIB_FUNCTION("rDMyAf1Jhug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isinff); + LIB_FUNCTION("gLGmR9aan4c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isinfl); + LIB_FUNCTION("GfxAp9Xyiqs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isnan); + LIB_FUNCTION("lA94ZgT+vMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isnanf); + LIB_FUNCTION("YBRHNH4+dDo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isnanl); + LIB_FUNCTION("fGPRa6T+Cu8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isnormal); + LIB_FUNCTION("WkYnBHFsmW4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isnormalf); + LIB_FUNCTION("S3nFV6TR1Dw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isnormall); + LIB_FUNCTION("q1OvUam0BJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___isthreaded); + LIB_FUNCTION("-m7FIvSBbMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___kernel_cos); + LIB_FUNCTION("7ruwcMCJVGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___kernel_cosdf); + LIB_FUNCTION("GLNDoAYNlLQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___kernel_rem_pio2); + LIB_FUNCTION("zpy7LnTL5p0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___kernel_sin); + LIB_FUNCTION("2Lvc7KWtErs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___kernel_sindf); + LIB_FUNCTION("F78ECICRxho", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ledf2); + LIB_FUNCTION("hbiV9vHqTgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___lesf2); + LIB_FUNCTION("9mKjVppFsL0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___longjmp); + LIB_FUNCTION("18E1gOH7cmk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___lshrdi3); + LIB_FUNCTION("1iRAqEqEL0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___lshrti3); + LIB_FUNCTION("tcBJa2sYx0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ltdf2); + LIB_FUNCTION("259y57ZdZ3I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ltsf2); + LIB_FUNCTION("77pL1FoD4I4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mb_cur_max); + LIB_FUNCTION("fGYLBr2COwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mb_sb_limit); + LIB_FUNCTION("gQFVRFgFi48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___moddi3); + LIB_FUNCTION("k0vARyJi9oU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___modsi3); + LIB_FUNCTION("J8JRHcUKWP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___modti3); + LIB_FUNCTION("D4Hf-0ik5xU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___muldc3); + LIB_FUNCTION("O+Bv-zodKLw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___muldf3); + LIB_FUNCTION("Hf8hPlDoVsw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___muldi3); + LIB_FUNCTION("wVbBBrqhwdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulodi4); + LIB_FUNCTION("DDxNvs1a9jM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulosi4); + LIB_FUNCTION("+X-5yNFPbDw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___muloti4); + LIB_FUNCTION("y+E+IUZYVmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulsc3); + LIB_FUNCTION("BXmn6hA5o0M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulsf3); + LIB_FUNCTION("zhAIFVIN1Ds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___multi3); + LIB_FUNCTION("Uyfpss5cZDE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulvdi3); + LIB_FUNCTION("tFgzEdfmEjI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulvsi3); + LIB_FUNCTION("6gc1Q7uu244", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulvti3); + LIB_FUNCTION("gZWsDrmeBsg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___mulxc3); + LIB_FUNCTION("ocyIiJnJW24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___nedf2); + LIB_FUNCTION("tWI4Ej9k9BY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___negdf2); + LIB_FUNCTION("Rj4qy44yYUw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___negdi2); + LIB_FUNCTION("4f+Q5Ka3Ex0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___negsf2); + LIB_FUNCTION("Zofiv1PMmR4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___negti2); + LIB_FUNCTION("fh54IRxGBUQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___negvdi2); + LIB_FUNCTION("7xnsvjuqtZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___negvsi2); + LIB_FUNCTION("QW-f9vYgI7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___negvti2); + LIB_FUNCTION("OWZ3ZLkgye8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___nesf2); + LIB_FUNCTION("KOy7MeQ7OAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___opendir2); + LIB_FUNCTION("RDeUB6JGi1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___paritydi2); + LIB_FUNCTION("9xUnIQ53Ao4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___paritysi2); + LIB_FUNCTION("vBP4ytNRXm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___parityti2); + LIB_FUNCTION("m4S+lkRvTVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___popcountdi2); + LIB_FUNCTION("IBn9qjWnXIw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___popcountsi2); + LIB_FUNCTION("l1wz5R6cIxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___popcountti2); + LIB_FUNCTION("H+8UBOwfScI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___powidf2); + LIB_FUNCTION("EiMkgQsOfU0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___powisf2); + LIB_FUNCTION("DSI7bz2Jt-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___powixf2); + LIB_FUNCTION("Rw4J-22tu1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___signbit); + LIB_FUNCTION("CjQROLB88a4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___signbitf); + LIB_FUNCTION("Cj81LPErPCc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___signbitl); + LIB_FUNCTION("fIskTFX9p68", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___srefill); + LIB_FUNCTION("yDnwZsMnX0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___srget); + LIB_FUNCTION("as8Od-tH1BI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___stderrp); + LIB_FUNCTION("bgAcsbcEznc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___stdinp); + LIB_FUNCTION("zqJhBxAKfsc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___stdoutp); + LIB_FUNCTION("HLDcfGUMNWY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___subdf3); + LIB_FUNCTION("FeyelHfQPzo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___subsf3); + LIB_FUNCTION("+kvyBGa+5VI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___subvdi3); + LIB_FUNCTION("y8j-jP6bHW4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___subvsi3); + LIB_FUNCTION("cbyLM5qrvHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___subvti3); + LIB_FUNCTION("TP6INgQ6N4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___swbuf); + LIB_FUNCTION("+WLgzxv5xYA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___sync_fetch_and_add_16); + LIB_FUNCTION("XmAquprnaGM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___sync_fetch_and_and_16); + LIB_FUNCTION("GE4I2XAd4G4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___sync_fetch_and_or_16); + LIB_FUNCTION("Z2I0BWPANGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___sync_fetch_and_sub_16); + LIB_FUNCTION("d5Q-h2wF+-E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___sync_fetch_and_xor_16); + LIB_FUNCTION("ufZdCzu8nME", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___sync_lock_test_and_set_16); + LIB_FUNCTION("2M9VZGYPHLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___truncdfsf2); + LIB_FUNCTION("SZk+FxWXdAs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ucmpdi2); + LIB_FUNCTION("dLmvQfG8am4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___ucmpti2); + LIB_FUNCTION("tX8ED4uIAsQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___udivdi3); + LIB_FUNCTION("EWWEBA+Ldw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___udivmoddi4); + LIB_FUNCTION("PPdIvXwUQwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___udivmodsi4); + LIB_FUNCTION("lcNk3Ar5rUQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___udivmodti4); + LIB_FUNCTION("PxP1PFdu9OQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___udivsi3); + LIB_FUNCTION("802pFCwC9w0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___udivti3); + LIB_FUNCTION("+wj27DzRPpo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___umoddi3); + LIB_FUNCTION("p4vYrlsVpDE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___umodsi3); + LIB_FUNCTION("ELSr5qm4K1M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___umodti3); + LIB_FUNCTION("EDvkw0WaiOw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___unorddf2); + LIB_FUNCTION("z0OhwgG3Bik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___unordsf2); + LIB_FUNCTION("-QgqOT5u2Vk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Assert); + LIB_FUNCTION("FHErahnajkw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atan); + LIB_FUNCTION("kBpWlgVZLm4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_strong); + LIB_FUNCTION("SwJ-E2FImAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_strong_1); + LIB_FUNCTION("qXkZo1LGnfk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_strong_2); + LIB_FUNCTION("s+LfDF7LKxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_strong_4); + LIB_FUNCTION("SZrEVfvcHuA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_strong_8); + LIB_FUNCTION("FOe7cAuBjh8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_weak); + LIB_FUNCTION("rBbtKToRRq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_weak_1); + LIB_FUNCTION("sDOFamOKWBI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_weak_2); + LIB_FUNCTION("0AgCOypbQ90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_weak_4); + LIB_FUNCTION("bNFLV9DJxdc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_compare_exchange_weak_8); + LIB_FUNCTION("frx6Ge5+Uco", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_copy); + LIB_FUNCTION("qvTpLUKwq7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_exchange); + LIB_FUNCTION("KHJflcH9s84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_exchange_1); + LIB_FUNCTION("TbuLWpWuJmc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_exchange_2); + LIB_FUNCTION("-EgDt569OVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_exchange_4); + LIB_FUNCTION("+xoGf-x7nJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_exchange_8); + LIB_FUNCTION("cO0ldEk3Uko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_add_1); + LIB_FUNCTION("9kSWQ8RGtVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_add_2); + LIB_FUNCTION("iPBqs+YUUFw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_add_4); + LIB_FUNCTION("QVsk3fWNbp0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_add_8); + LIB_FUNCTION("UVDWssRNEPM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_and_1); + LIB_FUNCTION("PnfhEsZ-5uk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_and_2); + LIB_FUNCTION("Pn2dnvUmbRA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_and_4); + LIB_FUNCTION("O6LEoHo2qSQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_and_8); + LIB_FUNCTION("K49mqeyzLSk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_or_1); + LIB_FUNCTION("SVIiJg5eppY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_or_2); + LIB_FUNCTION("R5X1i1zcapI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_or_4); + LIB_FUNCTION("++In3PHBZfw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_or_8); + LIB_FUNCTION("-Zfr0ZQheg4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_sub_1); + LIB_FUNCTION("ovtwh8IO3HE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_sub_2); + LIB_FUNCTION("2HnmKiLmV6s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_sub_4); + LIB_FUNCTION("T8lH8xXEwIw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_sub_8); + LIB_FUNCTION("Z9gbzf7fkMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_xor_1); + LIB_FUNCTION("rpl4rhpUhfg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_xor_2); + LIB_FUNCTION("-GVEj2QODEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_xor_4); + LIB_FUNCTION("XKenFBsoh1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_fetch_xor_8); + LIB_FUNCTION("4CVc6G8JrvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_flag_clear); + LIB_FUNCTION("Ou6QdDy1f7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_flag_test_and_set); + LIB_FUNCTION("RBPhCcRhyGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_is_lock_free_1); + LIB_FUNCTION("QhORYaNkS+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_is_lock_free_2); + LIB_FUNCTION("cRYyxdZo1YQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_is_lock_free_4); + LIB_FUNCTION("-3ZujD7JX9c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_is_lock_free_8); + LIB_FUNCTION("XAqAE803zMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_load_1); + LIB_FUNCTION("aYVETR3B8wk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_load_2); + LIB_FUNCTION("cjZEuzHkgng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_load_4); + LIB_FUNCTION("ea-rVHyM3es", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_load_8); + LIB_FUNCTION("HfKQ6ZD53sM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_signal_fence); + LIB_FUNCTION("VRX+Ul1oSgE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_store_1); + LIB_FUNCTION("6WR6sFxcd40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_store_2); + LIB_FUNCTION("HMRMLOwOFIQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_store_4); + LIB_FUNCTION("2uKxXHAKynI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_store_8); + LIB_FUNCTION("-7vr7t-uto8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atomic_thread_fence); + LIB_FUNCTION("M6nCy6H8Hs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atqexit); + LIB_FUNCTION("IHiK3lL7CvI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Atthreadexit); + LIB_FUNCTION("aMucxariNg8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Btowc); + LIB_FUNCTION("fttiF7rDdak", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Call_once); + LIB_FUNCTION("G1kDk+5L6dU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Call_onceEx); + LIB_FUNCTION("myTyhGbuDBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Clocale); + LIB_FUNCTION("mgNGxmJltOY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Closreg); + LIB_FUNCTION("VsP3daJgmVA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_broadcast); + LIB_FUNCTION("7yMFgcS8EPA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_destroy); + LIB_FUNCTION("vyLotuB6AS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_do_broadcast_at_thread_exit); + LIB_FUNCTION("SreZybSRWpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_init); + LIB_FUNCTION("2B+V3qCqz4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_init_with_name); + LIB_FUNCTION("DV2AdZFFEh8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_register_at_thread_exit); + LIB_FUNCTION("0uuqgRz9qfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_signal); + LIB_FUNCTION("McaImWKXong", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_timedwait); + LIB_FUNCTION("wpuIiVoCWcM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_unregister_at_thread_exit); + LIB_FUNCTION("vEaqE-7IZYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cnd_wait); + LIB_FUNCTION("KeOZ19X8-Ug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Cosh); + LIB_FUNCTION("gguxDbgbG74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Costate); + LIB_FUNCTION("YUKO57czb+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__CTinfo); + LIB_FUNCTION("eul2MC3gaYs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Ctype); + LIB_FUNCTION("chlN6g6UbGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__CurrentRuneLocale); + LIB_FUNCTION("6aEXAPYpaEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__CWcsxfrm); + LIB_FUNCTION("ZlsoRa7pcuI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Daysto); + LIB_FUNCTION("e+hi-tOrDZU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Dbl); + LIB_FUNCTION("+5OuLYpRB28", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dclass); + LIB_FUNCTION("lWGF8NHv880", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__DefaultRuneLocale); + LIB_FUNCTION("H0FQnSWp1es", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Deletegloballocale); + LIB_FUNCTION("COSADmn1ROg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Denorm); + LIB_FUNCTION("-vyIrREaQ0g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dint); + LIB_FUNCTION("VGhcd0QwhhY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Divide); + LIB_FUNCTION("NApYynEzlco", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dnorm); + LIB_FUNCTION("4QwxZ3U0OK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Do_call); + LIB_FUNCTION("FMU7jRhYCRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dscale); + LIB_FUNCTION("zvl6nrvd0sE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dsign); + LIB_FUNCTION("vCQLavj-3CM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dtento); + LIB_FUNCTION("b-xTWRgI1qw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dtest); + LIB_FUNCTION("4Wt5uzHO98o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Dunscale); + LIB_FUNCTION("E4SYYdwWV28", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Eps); + LIB_FUNCTION("HmdaOhdCr88", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Erf_one); + LIB_FUNCTION("DJXyKhVrAD8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Erf_small); + LIB_FUNCTION("aQURHgjHo-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Erfc); + LIB_FUNCTION("UhKI6z9WWuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__err); + LIB_FUNCTION("u4FNPlIIAtw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Errno); + LIB_FUNCTION("wZi5ly2guNw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Exit); + LIB_FUNCTION("yL91YD-WTBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Exp); + LIB_FUNCTION("chzmnjxxVtk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fac_tidy); + LIB_FUNCTION("D+fkILS7EK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fail_s); + LIB_FUNCTION("us3bDnDzd70", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FAtan); + LIB_FUNCTION("PdnFCFqKGqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FCosh); + LIB_FUNCTION("LSp+r7-JWwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDclass); + LIB_FUNCTION("JG1MkIFKnT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDenorm); + LIB_FUNCTION("HcpmBnY1RGE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDint); + LIB_FUNCTION("fuzzBVdpRG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDivide); + LIB_FUNCTION("0NwCmZv7XcU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDnorm); + LIB_FUNCTION("SSvY6pTRAgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDscale); + LIB_FUNCTION("6ei1eQn2WIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDsign); + LIB_FUNCTION("SoNnx4Ejxw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDtento); + LIB_FUNCTION("mnufPlYbnN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDtest); + LIB_FUNCTION("41SqJvOe8lA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FDunscale); + LIB_FUNCTION("OviE3yVSuTU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FEps); + LIB_FUNCTION("z1EfxK6E0ts", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Feraise); + LIB_FUNCTION("dST+OsSWbno", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FErf_one); + LIB_FUNCTION("qEvDssa4tOE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FErf_small); + LIB_FUNCTION("qwR1gtp-WS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FErfc); + LIB_FUNCTION("JbQw6W62UwI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_add_8); + LIB_FUNCTION("pxFnS1okTFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_and_8); + LIB_FUNCTION("zQQIrnpCoFA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_and_seq_cst_1); + LIB_FUNCTION("xROUuk7ItMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_and_seq_cst_2); + LIB_FUNCTION("jQuruQuMlyo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_and_seq_cst_4); + LIB_FUNCTION("ixWEOmOBavk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_or_8); + LIB_FUNCTION("2+6K-2tWaok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_or_seq_cst_1); + LIB_FUNCTION("-egu08GJ0lw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_or_seq_cst_2); + LIB_FUNCTION("gI9un1H-fZk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_or_seq_cst_4); + LIB_FUNCTION("YhaOeniKcoA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_xor_8); + LIB_FUNCTION("E2YhT7m79kM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_xor_seq_cst_1); + LIB_FUNCTION("fgXJvOSrqfg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_xor_seq_cst_2); + LIB_FUNCTION("cqcY17uV3dI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fetch_xor_seq_cst_4); + LIB_FUNCTION("-3pU5y1utmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FExp); + LIB_FUNCTION("EBkab3s8Jto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FFpcomp); + LIB_FUNCTION("cNGg-Y7JQQw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FGamma_big); + LIB_FUNCTION("dYJJbxnyb74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fgpos); + LIB_FUNCTION("DS03EjPDtFo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FHypot); + LIB_FUNCTION("qG50MWOiS-Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Files); + LIB_FUNCTION("QWCTbYI14dA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FInf); + LIB_FUNCTION("jjjRS7l1MPM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FLog); + LIB_FUNCTION("OAE3YU396YQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FLogpoly); + LIB_FUNCTION("+SeQg8c1WC0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Flt); + LIB_FUNCTION("Jo9ON-AX9eU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fltrounds); + LIB_FUNCTION("VVgqI3B2bfk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FNan); + LIB_FUNCTION("xGT4Mc55ViQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fofind); + LIB_FUNCTION("jVDuvE3s5Bs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fofree); + LIB_FUNCTION("sQL8D-jio7U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fopen); + LIB_FUNCTION("dREVnZkAKRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Foprep); + LIB_FUNCTION("vhPKxN6zs+A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fpcomp); + LIB_FUNCTION("cfpRP3h9F6o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FPlsw); + LIB_FUNCTION("IdWhZ0SM7JA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FPmsw); + LIB_FUNCTION("5AN3vhTZ7f8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FPoly); + LIB_FUNCTION("A98W3Iad6xE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FPow); + LIB_FUNCTION("y9Ur6T0A0p8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FQuad); + LIB_FUNCTION("PDQbEFcV4h0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FQuadph); + LIB_FUNCTION("lP9zfrhtpBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FRecip); + LIB_FUNCTION("TLvAYmLtdVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FRint); + LIB_FUNCTION("9s3P+LCvWP8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Frprep); + LIB_FUNCTION("XwRd4IpNEss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FRteps); + LIB_FUNCTION("fQ+SWrQUQBg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FSincos); + LIB_FUNCTION("O4L+0oCN9zA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FSinh); + LIB_FUNCTION("UCjpTas5O3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FSnan); + LIB_FUNCTION("A+Y3xfrWLLo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fspos); + LIB_FUNCTION("iBrTJkDlQv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FTan); + LIB_FUNCTION("odPHnVL-rFg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FTgamma); + LIB_FUNCTION("4F9pQjbh8R8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Fwprep); + LIB_FUNCTION("3uW2ESAzsKo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXbig); + LIB_FUNCTION("1EyHxzcz6AM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_addh); + LIB_FUNCTION("1b+IhPTX0nk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_addx); + LIB_FUNCTION("e1y7KVAySrY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_getw); + LIB_FUNCTION("OVqW4uElSrc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_invx); + LIB_FUNCTION("7GgGIxmwA6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_ldexpx); + LIB_FUNCTION("DVZmEd0ipSg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_movx); + LIB_FUNCTION("W+lrIwAQVUk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_mulh); + LIB_FUNCTION("o1B4dkvesMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_mulx); + LIB_FUNCTION("ikHTMeh60B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_setn); + LIB_FUNCTION("5zWUVRtR8xg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_setw); + LIB_FUNCTION("pNWIpeE5Wv4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_sqrtx); + LIB_FUNCTION("HD9vSXqj6zI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FXp_subx); + LIB_FUNCTION("LrXu7E+GLDY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FZero); + LIB_FUNCTION("7FjitE7KKm4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Gamma_big); + LIB_FUNCTION("vakoyx9nkqo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Genld); + LIB_FUNCTION("bRN9BzEkm4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Gentime); + LIB_FUNCTION("2MfMa3456FI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getcloc); + LIB_FUNCTION("i1N28hWcD-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getctyptab); + LIB_FUNCTION("Jcu0Wl1-XbE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getdst); + LIB_FUNCTION("M1xC101lsIU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Geterrno); + LIB_FUNCTION("bItEABINEm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getfld); + LIB_FUNCTION("7iFNNuNyXxw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getfloat); + LIB_FUNCTION("8Jr4cvRM6EM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getgloballocale); + LIB_FUNCTION("PWmDp8ZTS9k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getint); + LIB_FUNCTION("U52BlHBvYvE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getmbcurmax); + LIB_FUNCTION("bF4eWOM5ouo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getpcostate); + LIB_FUNCTION("sUP1hBaouOw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getpctype); + LIB_FUNCTION("QxqK-IdpumU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getpmbstate); + LIB_FUNCTION("iI6kGxgXzcU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__getprogname); + LIB_FUNCTION("8xXiEPby8h8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getptimes); + LIB_FUNCTION("1uJgoVq3bQU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getptolower); + LIB_FUNCTION("rcQCUr0EaRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getptoupper); + LIB_FUNCTION("hzsdjKbFD7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getpwcostate); + LIB_FUNCTION("zS94yyJRSUs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getpwcstate); + LIB_FUNCTION("RLdcWoBjmT4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getpwctrtab); + LIB_FUNCTION("uF8hDs1CqWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getpwctytab); + LIB_FUNCTION("g8ozp2Zrsj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Gettime); + LIB_FUNCTION("Wz9CvcF5jn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getzone); + LIB_FUNCTION("ac102y6Rjjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Hugeval); + LIB_FUNCTION("wUa+oPQvFZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Hypot); + LIB_FUNCTION("HIhqigNaOns", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Inf); + LIB_FUNCTION("bzQExy189ZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__init_env); + LIB_FUNCTION("6NCOqr3cD74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__init_tls); + LIB_FUNCTION("Sb26PiOiFtE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Isdst); + LIB_FUNCTION("CyXs2l-1kNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Iswctype); + LIB_FUNCTION("2Aw366Jn07s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LAtan); + LIB_FUNCTION("moDSeLQGJFQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LCosh); + LIB_FUNCTION("43u-nm1hQc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Ldbl); + LIB_FUNCTION("hdcGjNpcr4w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDclass); + LIB_FUNCTION("O7zxyNnSDDA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDenorm); + LIB_FUNCTION("alNWe8glQH4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDint); + LIB_FUNCTION("HPGLb8Qo6as", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDivide); + LIB_FUNCTION("ldbrWsQk+2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDnorm); + LIB_FUNCTION("s-Ml8NxBKf4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDscale); + LIB_FUNCTION("islhay8zGWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDsign); + LIB_FUNCTION("PEU-SAfo5+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDtento); + LIB_FUNCTION("A+1YXWOGpuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDtest); + LIB_FUNCTION("3BbBNPjfkYI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Ldtob); + LIB_FUNCTION("ArZF2KISb5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LDunscale); + LIB_FUNCTION("DzkYNChIvmw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LEps); + LIB_FUNCTION("urrv9v-Ge6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LErf_one); + LIB_FUNCTION("MHyK+d+72V0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LErf_small); + LIB_FUNCTION("PG4HVe4X+Oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LErfc); + LIB_FUNCTION("se3uU7lRMHY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LExp); + LIB_FUNCTION("-BwLPxElT7U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LFpcomp); + LIB_FUNCTION("-svZFUiG3T4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LGamma_big); + LIB_FUNCTION("IRUFZywbTT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LHypot); + LIB_FUNCTION("2h3jY75zMkI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LInf); + LIB_FUNCTION("+GxvfSLhoAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Litob); + LIB_FUNCTION("4iFgTDd9NFs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LLog); + LIB_FUNCTION("niPixjs0l2w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LLogpoly); + LIB_FUNCTION("zqASRvZg6d0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LNan); + LIB_FUNCTION("JHvEnCQLPQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Locale); + LIB_FUNCTION("fRWufXAccuI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Lock_shared_ptr_spin_lock); + LIB_FUNCTION("Cv-8x++GS9A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Lock_spin_lock); + LIB_FUNCTION("vZkmJmvqueY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Lockfilelock); + LIB_FUNCTION("kALvdgEv5ME", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Locksyslock); + LIB_FUNCTION("sYz-SxY8H6M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Locsum); + LIB_FUNCTION("rvNWRuHY6AQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Loctab); + LIB_FUNCTION("4ifo9QGrO5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Locterm); + LIB_FUNCTION("ElU3kEY8q+I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Locvar); + LIB_FUNCTION("zXCi78bYrEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Log); + LIB_FUNCTION("bqcStLRGIXw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Logpoly); + LIB_FUNCTION("W-T-amhWrkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LPlsw); + LIB_FUNCTION("gso5X06CFkI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LPmsw); + LIB_FUNCTION("c6Qa0P3XKYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LPoly); + LIB_FUNCTION("3Z8jD-HTKr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LPow); + LIB_FUNCTION("fXCPTDS0tD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LQuad); + LIB_FUNCTION("CbRhl+RoYEM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LQuadph); + LIB_FUNCTION("XrXTtRA7U08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LRecip); + LIB_FUNCTION("fJmOr59K8QY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LRint); + LIB_FUNCTION("gobJundphD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LRteps); + LIB_FUNCTION("m-Bu5Tzr82A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LSin); + LIB_FUNCTION("g3dK2qlzwnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LSincos); + LIB_FUNCTION("ZWy6IcBqs1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LSinh); + LIB_FUNCTION("rQ-70s51wrc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LSnan); + LIB_FUNCTION("mM4OblD9xWM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LTan); + LIB_FUNCTION("jq4Srfnz9K8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LTgamma); + LIB_FUNCTION("WSaroeRDE5Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXbig); + LIB_FUNCTION("QEr-PxGUoic", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_addh); + LIB_FUNCTION("BuP7bDPGEcQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_addx); + LIB_FUNCTION("TnublTBYXTI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_getw); + LIB_FUNCTION("FAreWopdBvE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_invx); + LIB_FUNCTION("7O-vjsHecbY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_ldexpx); + LIB_FUNCTION("wlEdSSqaz+E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_movx); + LIB_FUNCTION("riets0BFHMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_mulh); + LIB_FUNCTION("LbLiLA2biaI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_mulx); + LIB_FUNCTION("hjDoZ6qbkmQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_setn); + LIB_FUNCTION("kHVXc-AWbMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_setw); + LIB_FUNCTION("IPjwywTNR8w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_sqrtx); + LIB_FUNCTION("YCVxOE0lHOI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LXp_subx); + LIB_FUNCTION("A-cEjaZBDwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__LZero); + LIB_FUNCTION("tTDqwhYbUUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Makeloc); + LIB_FUNCTION("AnTtuRUE1cE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Makestab); + LIB_FUNCTION("QalEczzSNqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Makewct); + LIB_FUNCTION("pCWh67X1PHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mbcurmax); + LIB_FUNCTION("wKsLxRq5+fg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mbstate); + LIB_FUNCTION("sij3OtJpHFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mbtowc); + LIB_FUNCTION("-9SIhUr4Iuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mbtowcx); + LIB_FUNCTION("VYQwFs4CC4Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_current_owns); + LIB_FUNCTION("5Lf51jvohTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_destroy); + LIB_FUNCTION("YaHc3GS7y7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_init); + LIB_FUNCTION("tgioGpKtmbE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_init_with_name); + LIB_FUNCTION("iS4aWbUonl0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_lock); + LIB_FUNCTION("hPzYSd5Nasc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_timedlock); + LIB_FUNCTION("k6pGNMwJB08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_trylock); + LIB_FUNCTION("gTuXQwP9rrs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtx_unlock); + LIB_FUNCTION("LaPaA6mYA38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtxdst); + LIB_FUNCTION("z7STeF6abuU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtxinit); + LIB_FUNCTION("pE4Ot3CffW0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtxlock); + LIB_FUNCTION("cMwgSSmpE5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Mtxunlock); + LIB_FUNCTION("8e2KBTO08Po", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Nan); + LIB_FUNCTION("KNNNbyRieqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__new_setup); + LIB_FUNCTION("Ss3108pBuZY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Nnl); + LIB_FUNCTION("TMhLRjcQMw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__PathLocale); + LIB_FUNCTION("OnHQSrOHTks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__PJP_C_Copyright); + LIB_FUNCTION("Cqpti4y-D3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__PJP_CPP_Copyright); + LIB_FUNCTION("1hGmBh83dL8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Plsw); + LIB_FUNCTION("hrv1BgM68kU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Pmsw); + LIB_FUNCTION("aINUE2xbhZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Poly); + LIB_FUNCTION("ECh+p-LRG6Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Pow); + LIB_FUNCTION("rnxaQ+2hSMI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Putfld); + LIB_FUNCTION("Fot-m6M2oKE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Putstr); + LIB_FUNCTION("ijAqq39g4dI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Puttxt); + LIB_FUNCTION("TQPr-IeNIS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Quad); + LIB_FUNCTION("VecRKuKdXdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Quadph); + LIB_FUNCTION("5qtcuXWt5Xc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Randseed); + LIB_FUNCTION("-u3XfqNumMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__readdir_unlocked); + LIB_FUNCTION("MxZ4Lc35Rig", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Readloc); + LIB_FUNCTION("YLEc5sPn1Rg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Recip); + LIB_FUNCTION("7ZFy2m9rc5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__reclaim_telldir); + LIB_FUNCTION("77uWF3Z2q90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Restore_state); + LIB_FUNCTION("TzxDRcns9e4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Rint); + LIB_FUNCTION("W8tdMlttt3o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Rteps); + LIB_FUNCTION("5FoE+V3Aj0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__rtld_addr_phdr); + LIB_FUNCTION("R2QKo3hBLkw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__rtld_atfork_post); + LIB_FUNCTION("i-7v8+UGglc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__rtld_atfork_pre); + LIB_FUNCTION("dmHEVUqDYGw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__rtld_error); + LIB_FUNCTION("AdYYKgtPlqg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__rtld_get_stack_prot); + LIB_FUNCTION("gRw4XrztJ4Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__rtld_thread_init); + LIB_FUNCTION("0ITXuJOqrSk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Save_state); + LIB_FUNCTION("vhETq-NiqJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__SceLibcDebugOut); + LIB_FUNCTION("-hOAbTf3Cqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__SceLibcTelemetoryOut); + LIB_FUNCTION("Do3zPpsXj1o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__seekdir); + LIB_FUNCTION("bEk+WGOU90I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Setgloballocale); + LIB_FUNCTION("KDFy-aPxHVE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Shared_ptr_flag); + LIB_FUNCTION("j9SGTLclro8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Sincos); + LIB_FUNCTION("MU25eqxSDTw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Sinh); + LIB_FUNCTION("Jp6dZm7545A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Skip); + LIB_FUNCTION("fmHLr9P3dOk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Snan); + LIB_FUNCTION("H8AprKeZtNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stderr); + LIB_FUNCTION("1TDo-ImqkJc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stdin); + LIB_FUNCTION("2sWzhYqFH4E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stdout); + LIB_FUNCTION("szUft0jERdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Tan); + LIB_FUNCTION("z-OrNOmb6kk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tgamma); + LIB_FUNCTION("JOV1XY47eQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_abort); + LIB_FUNCTION("SkRR6WxCTcE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_create); + LIB_FUNCTION("n2-b3O8qvqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_current); + LIB_FUNCTION("L7f7zYwBvZA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_detach); + LIB_FUNCTION("BnV7WrHdPLU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_equal); + LIB_FUNCTION("cFsD9R4iY50", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_exit); + LIB_FUNCTION("np6xXcXEnXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_id); + LIB_FUNCTION("YvmY5Jf0VYU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_join); + LIB_FUNCTION("OCbJ96N1utA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_lt); + LIB_FUNCTION("jfRI3snge3o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_sleep); + LIB_FUNCTION("0JidN6q9yGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_start); + LIB_FUNCTION("gsqXCd6skKs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_start_with_attr); + LIB_FUNCTION("ihfGsjLjmOM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_start_with_name); + LIB_FUNCTION("ShanbBWU3AA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_start_with_name_attr); + LIB_FUNCTION("exNzzCAQuWM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Thrd_yield); + LIB_FUNCTION("kQelMBYgkK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__thread_autoinit_dummy_decl); + LIB_FUNCTION("dmUgzUX3nXU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__thread_autoinit_dummy_decl_stub); + LIB_FUNCTION("PJW+-O4pj6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__thread_init); + LIB_FUNCTION("1kIpmZX1jw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__thread_init_stub); + LIB_FUNCTION("+9ypoH8eJko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Times); + LIB_FUNCTION("hbY3mFi8XY0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Costate); + LIB_FUNCTION("JoeZJ15k5vU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Ctype); + LIB_FUNCTION("uhYTnarXhZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Errno); + LIB_FUNCTION("jr5yQE9WYdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Locale); + LIB_FUNCTION("7TIcrP513IM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Mbcurmax); + LIB_FUNCTION("YYG-8VURgXA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Mbstate); + LIB_FUNCTION("0Hu7rUmhqJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Times); + LIB_FUNCTION("hM7qvmxBTx8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Tolotab); + LIB_FUNCTION("UlJSnyS473g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Touptab); + LIB_FUNCTION("YUdPel2w8as", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__WCostate); + LIB_FUNCTION("2d5UH9BnfVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Wcstate); + LIB_FUNCTION("RYwqCx0hU5c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Wctrans); + LIB_FUNCTION("KdAc8glk2+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tls_setup__Wctype); + LIB_FUNCTION("J-oDqE1N8R4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tolotab); + LIB_FUNCTION("KmfpnwO2lkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Touptab); + LIB_FUNCTION("DbEnA+MnVIw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Towctrans); + LIB_FUNCTION("amHyU7v8f-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tss_create); + LIB_FUNCTION("g5cG7QtKLTA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tss_delete); + LIB_FUNCTION("lOVQnEJEzvY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tss_get); + LIB_FUNCTION("ibyFt0bPyTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tss_set); + LIB_FUNCTION("4TTbo2SxxvA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Ttotm); + LIB_FUNCTION("Csx50UU9b18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Tzoff); + LIB_FUNCTION("1HYEoANqZ1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unlock_shared_ptr_spin_lock); + LIB_FUNCTION("aHUFijEWlxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unlock_spin_lock); + LIB_FUNCTION("0x7rx8TKy2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unlockfilelock); + LIB_FUNCTION("9nf8joUTSaQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unlocksyslock); + LIB_FUNCTION("s62MgBhosjU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unwind_Backtrace); + LIB_FUNCTION("sETNbyWsEHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unwind_GetIP); + LIB_FUNCTION("f1zwJ3jAI2k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unwind_Resume); + LIB_FUNCTION("xUsJSLsdv9I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Unwind_Resume_or_Rethrow); + LIB_FUNCTION("xRycekLYXdc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Vacopy); + LIB_FUNCTION("XQFE8Y58WZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__warn); + LIB_FUNCTION("Nd2Y2X6oR18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WCostate); + LIB_FUNCTION("wmkXFgerLnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wcscollx); + LIB_FUNCTION("RGc3P3UScjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wcsftime); + LIB_FUNCTION("IvP-B8lC89k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wcstate); + LIB_FUNCTION("cmIyU0BNYeo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wcsxfrmx); + LIB_FUNCTION("oK6C1fys3dU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wctob); + LIB_FUNCTION("bSgY14j4Ov4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wctomb); + LIB_FUNCTION("stv1S3BKfgw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wctombx); + LIB_FUNCTION("DYamMikEv2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wctrans); + LIB_FUNCTION("PlDgAP2AS7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Wctype); + LIB_FUNCTION("VbczgfwgScA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WFrprep); + LIB_FUNCTION("hDuyUWUBrDU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WFwprep); + LIB_FUNCTION("BYcXjG3Lw-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WGenld); + LIB_FUNCTION("Z6CCOW8TZVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WGetfld); + LIB_FUNCTION("LcHsLn97kcE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WGetfloat); + LIB_FUNCTION("dWz3HtMMpPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WGetint); + LIB_FUNCTION("nVS8UHz1bx0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WGetstr); + LIB_FUNCTION("kUcinoWwBr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WLdtob); + LIB_FUNCTION("XkT6YSShQcE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WLitob); + LIB_FUNCTION("0ISumvb2U5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WPutfld); + LIB_FUNCTION("Fh1GjwqvCpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WPutstr); + LIB_FUNCTION("Kkgg8mWU2WE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WPuttxt); + LIB_FUNCTION("4nRn+exUJAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStod); + LIB_FUNCTION("RlewTNtWEcg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStodx); + LIB_FUNCTION("GUuiOcxL-r0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStof); + LIB_FUNCTION("FHJlhz0wVts", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStoflt); + LIB_FUNCTION("JZ9gGlJ22hg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStofx); + LIB_FUNCTION("w3gRFGRjpZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStold); + LIB_FUNCTION("waexoHL0Bf4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStoldx); + LIB_FUNCTION("OmDPJeJXkBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStoll); + LIB_FUNCTION("43PYQ2fMT8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStopfx); + LIB_FUNCTION("JhVR7D4Ax6Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStoul); + LIB_FUNCTION("9iCP-hTL5z8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStoull); + LIB_FUNCTION("DmUIy7m0cyE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WStoxflt); + LIB_FUNCTION("QSfaClY45dM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xbig); + LIB_FUNCTION("ijc7yCXzXsc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_addh); + LIB_FUNCTION("ycMCyFmWJnU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_addx); + LIB_FUNCTION("Zb70g9IUs98", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_getw); + LIB_FUNCTION("f41T4clGlzY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_invx); + LIB_FUNCTION("c9S0tXDhMBQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_ldexpx); + LIB_FUNCTION("Zm2LLWgxWu8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_movx); + LIB_FUNCTION("aOtpC3onyJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_mulh); + LIB_FUNCTION("jatbHyxH3ek", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_mulx); + LIB_FUNCTION("lahbB4B2ugY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_setn); + LIB_FUNCTION("bIfFaqUwy3I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_setw); + LIB_FUNCTION("m0uSPrCsVdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_sqrtx); + LIB_FUNCTION("w178uGYbIJs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xp_subx); + LIB_FUNCTION("Df1BO64nU-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xtime_diff_to_ts); + LIB_FUNCTION("Cj+Fw5q1tUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xtime_get_ticks); + LIB_FUNCTION("Zs8Xq-ce3rY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Xtime_to_ts); + LIB_FUNCTION("FOt55ZNaVJk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdaPvm); + LIB_FUNCTION("7lCihI18N9I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdaPvmRKSt9nothrow_t); + LIB_FUNCTION("Y1RR+IQy6Pg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdaPvmSt11align_val_t); + LIB_FUNCTION("m-fSo3EbxNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdaPvRKSt9nothrow_t); + LIB_FUNCTION("Suc8W0QPxjw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdaPvS_); + LIB_FUNCTION("v09ZcAhZzSc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdaPvSt11align_val_t); + LIB_FUNCTION("dH3ucvQhfSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdaPvSt11align_val_tRKSt9nothrow_t); LIB_FUNCTION("z+P+xCnWLBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_operator_delete); - LIB_FUNCTION("cVSk9y8URbc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_memalign); + internal__ZdlPv); + LIB_FUNCTION("lYDzBVE5mZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdlPvm); + LIB_FUNCTION("7VPIYFpwU2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdlPvmRKSt9nothrow_t); + LIB_FUNCTION("nwujzxOPXzQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdlPvmSt11align_val_t); + LIB_FUNCTION("McsGnqV6yRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdlPvRKSt9nothrow_t); + LIB_FUNCTION("1vo6qqqa9F4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdlPvS_); + LIB_FUNCTION("bZx+FFSlkUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdlPvSt11align_val_t); + LIB_FUNCTION("Dt9kllUFXS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZdlPvSt11align_val_tRKSt9nothrow_t); + LIB_FUNCTION("bPtdppw1+7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Zero); + LIB_FUNCTION("Bc4ozvHb4Kg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt10moneypunctIcLb0EE2idE); + LIB_FUNCTION("yzcKSTTCz1M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt10moneypunctIcLb1EE2idE); + LIB_FUNCTION("tfmEv+TVGFU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt10moneypunctIwLb0EE2idE); + LIB_FUNCTION("ksNM8H72JHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt10moneypunctIwLb1EE2idE); + LIB_FUNCTION("2G1UznxkcgU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt14_Error_objectsIiE14_System_objectE); + LIB_FUNCTION("DjLpZIMEkks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt14_Error_objectsIiE15_Generic_objectE); + LIB_FUNCTION("DSnq6xesUo8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt20_Future_error_objectIiE14_Future_objectE); + LIB_FUNCTION("agAYSUes238", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt7codecvtIcc9_MbstatetE2idE); + LIB_FUNCTION("gC0DGo+7PVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt7collateIcE2idE); + LIB_FUNCTION("jaLGUrwYX84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt7collateIwE2idE); + LIB_FUNCTION("4ZnE1sEyX3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt8messagesIcE2idE); + LIB_FUNCTION("oqYAk3zpC64", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt8messagesIwE2idE); + LIB_FUNCTION("iHZb2839dBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt8numpunctIcE2idE); + LIB_FUNCTION("8ArIPXBlkgM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt8numpunctIwE2idE); + LIB_FUNCTION( + "0ND8MZiuTR8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); + LIB_FUNCTION( + "O2wxIdbMcMQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); + LIB_FUNCTION("CjzjU2nFUWw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv116__enum_type_infoD0Ev); + LIB_FUNCTION("upwSZWmYwqE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv116__enum_type_infoD1Ev); + LIB_FUNCTION("iQiT26+ZGnA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv116__enum_type_infoD2Ev); + LIB_FUNCTION("R5nRbLQT3oI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__array_type_infoD0Ev); + LIB_FUNCTION("1ZMchlkvNNQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__array_type_infoD1Ev); + LIB_FUNCTION("ckFrsyD2830", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__array_type_infoD2Ev); + LIB_FUNCTION("XAk7W3NcpTY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__class_type_infoD0Ev); + LIB_FUNCTION("goLVqD-eiIY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__class_type_infoD1Ev); + LIB_FUNCTION("xXM1q-ayw2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__class_type_infoD2Ev); + LIB_FUNCTION("GLxD5v2uMHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__pbase_type_infoD0Ev); + LIB_FUNCTION("vIJPARS8imE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__pbase_type_infoD1Ev); + LIB_FUNCTION("krshE4JAE6M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv117__pbase_type_infoD2Ev); + LIB_FUNCTION("64180GwMVro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv119__pointer_type_infoD0Ev); + LIB_FUNCTION("bhfgrK+MZdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv119__pointer_type_infoD1Ev); + LIB_FUNCTION("vCLVhOcdQMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv119__pointer_type_infoD2Ev); + LIB_FUNCTION("kVvGL9aF5gg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv120__function_type_infoD0Ev); + LIB_FUNCTION("dsQ5Xwhl9no", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv120__function_type_infoD1Ev); + LIB_FUNCTION("NtqD4Q0vUUI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv120__function_type_infoD2Ev); + LIB_FUNCTION("Fg4w+h9wAMA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv120__si_class_type_infoD0Ev); + LIB_FUNCTION("6aEkwkEOGRg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv120__si_class_type_infoD1Ev); + LIB_FUNCTION("bWHwovVFfqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv120__si_class_type_infoD2Ev); + LIB_FUNCTION("W5k0jlyBpgM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv121__vmi_class_type_infoD0Ev); + LIB_FUNCTION("h-a7+0UuK7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv121__vmi_class_type_infoD1Ev); + LIB_FUNCTION("yYIymfQGl2E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv121__vmi_class_type_infoD2Ev); + LIB_FUNCTION("YsZuwZrJZlU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv123__fundamental_type_infoD0Ev); + LIB_FUNCTION("kzWL2iOsv0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv123__fundamental_type_infoD1Ev); + LIB_FUNCTION("0jk9oqKd2Gw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv123__fundamental_type_infoD2Ev); + LIB_FUNCTION("NdeDffcZ-30", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev); + LIB_FUNCTION("KaZ3xf5c9Vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev); + LIB_FUNCTION("Re3Lpk8mwEo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev); + LIB_FUNCTION("yc-vi84-2aE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN6Dinkum7codecvt10_Cvt_checkEmm); + LIB_FUNCTION("PG-2ZeVVWZE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN6Dinkum7threads10lock_errorD0Ev); + LIB_FUNCTION("vX+NfOHOI5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN6Dinkum7threads10lock_errorD1Ev); + LIB_FUNCTION("o27+xO5NBZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN6Dinkum7threads17_Throw_lock_errorEv); + LIB_FUNCTION("cjmJLdYnT5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN6Dinkum7threads21_Throw_resource_errorEv); + LIB_FUNCTION("Q+ZnPMGI4M0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN6Dinkum7threads21thread_resource_errorD0Ev); + LIB_FUNCTION("NOaB7a1PZl8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZN6Dinkum7threads21thread_resource_errorD1Ev); + LIB_FUNCTION("hdm0YfMa7TQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Znam); + LIB_FUNCTION("Jh5qUcwiSEk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZnamRKSt9nothrow_t); + LIB_FUNCTION("kn-rKRB0pfY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZnamSt11align_val_t); + LIB_FUNCTION("s2eGsgUF9vk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZnamSt11align_val_tRKSt9nothrow_t); + LIB_FUNCTION("ZRRBeuLmHjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XlenEv); + LIB_FUNCTION("GvYZax3i-Qk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XranEv); + LIB_FUNCTION("pDtTdJ2sIz0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSs5_XlenEv); + LIB_FUNCTION("AzBnOt1DouU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSs5_XranEv); + LIB_FUNCTION("BbXxNgTW1x4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt10bad_typeid4whatEv); + LIB_FUNCTION("WMw8eIs0kjM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt10bad_typeid8_DoraiseEv); + LIB_FUNCTION("++ge3jYlHW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt11logic_error4whatEv); + LIB_FUNCTION("YTM5eyFGh2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt11logic_error8_DoraiseEv); + LIB_FUNCTION("OzMS0BqVUGQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt12bad_weak_ptr4whatEv); + LIB_FUNCTION("MwAySqTo+-M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt12codecvt_base11do_encodingEv); + LIB_FUNCTION("FOsY+JAyXow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt12codecvt_base13do_max_lengthEv); + LIB_FUNCTION("5sfbtNAdt-M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt12future_error4whatEv); + LIB_FUNCTION("-syPONaWjqw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt12future_error8_DoraiseEv); + LIB_FUNCTION("uWZBRxLAvEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt12system_error8_DoraiseEv); + LIB_FUNCTION("kTlQY47fo88", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt13bad_exception8_DoraiseEv); + LIB_FUNCTION("2iW5Fv+kFxs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt13runtime_error4whatEv); + LIB_FUNCTION("GthClwqQAZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt14error_category10equivalentEiRKSt15error_condition); + LIB_FUNCTION("9hB8AwIqQfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt14error_category10equivalentERKSt10error_codei); + LIB_FUNCTION("8SDojuZyQaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt14error_category23default_error_conditionEi); + LIB_FUNCTION("XVu4--EWzcM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt17bad_function_call4whatEv); + LIB_FUNCTION("+5IOQncui3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt18bad_variant_access4whatEv); + LIB_FUNCTION("Q0VsWTapQ4M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt22_Future_error_category4nameEv); + LIB_FUNCTION("nWfZplDjbxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt22_Future_error_category7messageEi); + LIB_FUNCTION("ww3UUl317Ng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt22_System_error_category23default_error_conditionEi); + LIB_FUNCTION("dXy+lFOiaQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt22_System_error_category4nameEv); + LIB_FUNCTION("HpAlvhNKb2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt22_System_error_category7messageEi); + LIB_FUNCTION("xvVR0CBPFAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt23_Generic_error_category4nameEv); + LIB_FUNCTION("KZ++filsCL4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt23_Generic_error_category7messageEi); + LIB_FUNCTION("WXOoCK+kqwY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE10do_tolowerEc); + LIB_FUNCTION("2w+4Mo2DPro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE10do_tolowerEPcPKc); + LIB_FUNCTION("mnq3tbhCs34", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE10do_toupperEc); + LIB_FUNCTION("7glioH0t9HM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE10do_toupperEPcPKc); + LIB_FUNCTION("zwcNQT0Avck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE8do_widenEc); + LIB_FUNCTION("W5OtP+WC800", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE8do_widenEPKcS2_Pc); + LIB_FUNCTION("4SnCJmLL27U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE9do_narrowEcc); + LIB_FUNCTION("-nCVE3kBjjA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc); + LIB_FUNCTION("pSQz254t3ug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE10do_scan_isEsPKwS2_); + LIB_FUNCTION("Ej0X1EwApwM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE10do_tolowerEPwPKw); + LIB_FUNCTION("ATYj6zra5W0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE10do_tolowerEw); + LIB_FUNCTION("r1W-NtOi6E8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE10do_toupperEPwPKw); + LIB_FUNCTION("JsZjB3TnZ8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE10do_toupperEw); + LIB_FUNCTION("Kbe+LHOer9o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE11do_scan_notEsPKwS2_); + LIB_FUNCTION("D0lUMKU+ELI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE5do_isEPKwS2_Ps); + LIB_FUNCTION("rh7L-TliPoc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE5do_isEsw); + LIB_FUNCTION("h3PbnNnZ-gI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE8do_widenEc); + LIB_FUNCTION("KM0b6O8show", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE8do_widenEPKcS2_Pw); + LIB_FUNCTION("Vf68JAD5rbM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc); + LIB_FUNCTION("V+c0E+Uqcww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt5ctypeIwE9do_narrowEwc); + LIB_FUNCTION("aUNISsPboqE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE11do_groupingEv); + LIB_FUNCTION("uUDq10y4Raw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE13do_neg_formatEv); + LIB_FUNCTION("E64hr8yXoXw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE13do_pos_formatEv); + LIB_FUNCTION("VhyjwJugIe8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE14do_curr_symbolEv); + LIB_FUNCTION("C3LC9A6SrVE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE14do_frac_digitsEv); + LIB_FUNCTION("tZj4yquwuhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE16do_decimal_pointEv); + LIB_FUNCTION("Rqu9OmkKY+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE16do_negative_signEv); + LIB_FUNCTION("ARZszYKvDWg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE16do_positive_signEv); + LIB_FUNCTION("6aFwTNpqTP8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIcE16do_thousands_sepEv); + LIB_FUNCTION("ckD5sIxo+Co", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE11do_groupingEv); + LIB_FUNCTION("UzmR8lOfyqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE13do_neg_formatEv); + LIB_FUNCTION("zF2GfKzBgqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE13do_pos_formatEv); + LIB_FUNCTION("ypq5jFNRIJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE14do_curr_symbolEv); + LIB_FUNCTION("ij-yZhH9YjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE14do_frac_digitsEv); + LIB_FUNCTION("v8P1X84ytFY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE16do_decimal_pointEv); + LIB_FUNCTION("zkUC74aJxpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE16do_negative_signEv); + LIB_FUNCTION("PWFePkVdv9w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE16do_positive_signEv); + LIB_FUNCTION("XX+xiPXAN8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7_MpunctIwE16do_thousands_sepEv); + LIB_FUNCTION("iCWgjeqMHvg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE10do_unshiftERS0_PcS3_RS3_); + LIB_FUNCTION("7tIwDZyyKHo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE16do_always_noconvEv); + LIB_FUNCTION("TNexGlwiVEQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE2inERS0_PKcS4_RS4_PcS6_RS6_); + LIB_FUNCTION("14xKj+SV72o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE3outERS0_PKcS4_RS4_PcS6_RS6_); + LIB_FUNCTION("P+q1OLiErP0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE5do_inERS0_PKcS4_RS4_PcS6_RS6_); + LIB_FUNCTION("Uc+-Sx0UZ3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE6do_outERS0_PKcS4_RS4_PcS6_RS6_); + LIB_FUNCTION("ikBt0lqkxPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE6lengthERS0_PKcS4_m); + LIB_FUNCTION("N7z+Dnk1cS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE7unshiftERS0_PcS3_RS3_); + LIB_FUNCTION("Xk7IZcfHDD8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIcc9_MbstatetE9do_lengthERS0_PKcS4_m); + LIB_FUNCTION("c6Lyc6xOp4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDic9_MbstatetE10do_unshiftERS0_PcS3_RS3_); + LIB_FUNCTION("DDnr3lDwW8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDic9_MbstatetE11do_encodingEv); + LIB_FUNCTION("E5NdzqEmWuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDic9_MbstatetE13do_max_lengthEv); + LIB_FUNCTION("NQ81EZ7CL6w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDic9_MbstatetE16do_always_noconvEv); + LIB_FUNCTION("PJ2UDX9Tvwg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDic9_MbstatetE5do_inERS0_PKcS4_RS4_PDiS6_RS6_); + LIB_FUNCTION("eoW60zcLT8Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDic9_MbstatetE6do_outERS0_PKDiS4_RS4_PcS6_RS6_); + LIB_FUNCTION("m6rjfL4aMcA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDic9_MbstatetE9do_lengthERS0_PKcS4_m); + LIB_FUNCTION("RYTHR81Y-Mc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDsc9_MbstatetE10do_unshiftERS0_PcS3_RS3_); + LIB_FUNCTION("Mo6K-pUyNhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDsc9_MbstatetE11do_encodingEv); + LIB_FUNCTION("BvRS0cGTd6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDsc9_MbstatetE13do_max_lengthEv); + LIB_FUNCTION("9Vyfb-I-9xw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDsc9_MbstatetE16do_always_noconvEv); + LIB_FUNCTION("+uPwCGfmJHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDsc9_MbstatetE5do_inERS0_PKcS4_RS4_PDsS6_RS6_); + LIB_FUNCTION("0FKwlv9iH1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDsc9_MbstatetE6do_outERS0_PKDsS4_RS4_PcS6_RS6_); + LIB_FUNCTION("lynApfiP6Lw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIDsc9_MbstatetE9do_lengthERS0_PKcS4_m); + LIB_FUNCTION("oDtGxrzLXMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIwc9_MbstatetE10do_unshiftERS0_PcS3_RS3_); + LIB_FUNCTION("4fPIrH+z+E4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIwc9_MbstatetE11do_encodingEv); + LIB_FUNCTION("5BQIjX7Y5YU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIwc9_MbstatetE13do_max_lengthEv); + LIB_FUNCTION("KheIhkaSrlA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIwc9_MbstatetE16do_always_noconvEv); + LIB_FUNCTION("WAPkmrXx2o8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIwc9_MbstatetE5do_inERS0_PKcS4_RS4_PwS6_RS6_); + LIB_FUNCTION("ABFE75lbcDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIwc9_MbstatetE6do_outERS0_PKwS4_RS4_PcS6_RS6_); + LIB_FUNCTION("G1zcPUEvY7U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7codecvtIwc9_MbstatetE9do_lengthERS0_PKcS4_m); + LIB_FUNCTION("1eEXfeW6wrI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_); + LIB_FUNCTION("gYlF567r3-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIcE12do_transformEPKcS2_); + LIB_FUNCTION("6vYXzFD-mrk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIcE4hashEPKcS2_); + LIB_FUNCTION("Q-8lQCGMj4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIcE7compareEPKcS2_S2_S2_); + LIB_FUNCTION("GSAXi4F1SlM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIcE7do_hashEPKcS2_); + LIB_FUNCTION("XaSxLBnqcWE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIcE9transformEPKcS2_); + LIB_FUNCTION("roztnFEs5Es", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_); + LIB_FUNCTION("Zxe-nQMgxHM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIwE12do_transformEPKwS2_); + LIB_FUNCTION("entYnoIu+fc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIwE4hashEPKwS2_); + LIB_FUNCTION("n-3HFZvDwBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIwE7compareEPKwS2_S2_S2_); + LIB_FUNCTION("cWaCDW+Dc9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIwE7do_hashEPKwS2_); + LIB_FUNCTION("81uX7PzrtG8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7collateIwE9transformEPKwS2_); + LIB_FUNCTION("6CPwoi-cFZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8bad_cast4whatEv); + LIB_FUNCTION("NEemVJeMwd0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8bad_cast8_DoraiseEv); + LIB_FUNCTION("F27xQUBtNdU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8ios_base7failure8_DoraiseEv); + LIB_FUNCTION("XxsPrrWJ52I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIcE3getEiiiRKSs); + LIB_FUNCTION("U2t+WvMQj8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIcE4openERKSsRKSt6locale); + LIB_FUNCTION("EeBQ7253LkE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIcE5closeEi); + LIB_FUNCTION("vbgCuYKySLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIcE6do_getEiiiRKSs); + LIB_FUNCTION("HeBwePMtuFs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIcE7do_openERKSsRKSt6locale); + LIB_FUNCTION("rRmMX83UL1E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIcE8do_closeEi); + LIB_FUNCTION("Ea+awuQ5Bm8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE); + LIB_FUNCTION("TPq0HfoACeI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIwE4openERKSsRKSt6locale); + LIB_FUNCTION("GGoH7e6SZSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIwE5closeEi); + LIB_FUNCTION("UM6rGQxnEMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE); + LIB_FUNCTION("zSehLdHI0FA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIwE7do_openERKSsRKSt6locale); + LIB_FUNCTION("AjkxQBlsOOY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8messagesIwE8do_closeEi); + LIB_FUNCTION("cnNz2ftNwEU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE11do_groupingEv); + LIB_FUNCTION("nRf0VQ++OEw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE11do_truenameEv); + LIB_FUNCTION("ozLi0i4r6ds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE12do_falsenameEv); + LIB_FUNCTION("klWxQ2nKAHY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE13decimal_pointEv); + LIB_FUNCTION("QGSIlqfIU2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE13thousands_sepEv); + LIB_FUNCTION("JXzQGOtumdM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE16do_decimal_pointEv); + LIB_FUNCTION("zv1EMhI7R1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE16do_thousands_sepEv); + LIB_FUNCTION("JWplGh2O0Rs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE8groupingEv); + LIB_FUNCTION("fXUuZEw7C24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE8truenameEv); + LIB_FUNCTION("3+VwUA8-QPI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIcE9falsenameEv); + LIB_FUNCTION("2BmJdX269kI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE11do_groupingEv); + LIB_FUNCTION("nvSsAW7tcX8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE11do_truenameEv); + LIB_FUNCTION("-amctzWbEtw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE12do_falsenameEv); + LIB_FUNCTION("leSFwTZZuE4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE13decimal_pointEv); + LIB_FUNCTION("2Olt9gqOauQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE13thousands_sepEv); + LIB_FUNCTION("mzRlAVX65hQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE16do_decimal_pointEv); + LIB_FUNCTION("Utj8Sh5L0jE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE16do_thousands_sepEv); + LIB_FUNCTION("VsJCpXqMPJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE8groupingEv); + LIB_FUNCTION("3M20pLo9Gdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE8truenameEv); + LIB_FUNCTION("LDbKkgI-TZg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8numpunctIwE9falsenameEv); + LIB_FUNCTION("xvRvFtnUk3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9bad_alloc4whatEv); + LIB_FUNCTION("pS-t9AJblSM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9bad_alloc8_DoraiseEv); + LIB_FUNCTION("apPZ6HKZWaQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9exception4whatEv); + LIB_FUNCTION("DuW5ZqZv-70", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9exception6_RaiseEv); + LIB_FUNCTION("tyHd3P7oDrU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9exception8_DoraiseEv); + LIB_FUNCTION("Ti86LmOKvr0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE5_CopyEmm); + LIB_FUNCTION("TgEb5a+nOnk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm); + LIB_FUNCTION("nF8-CM+tro4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE6appendEmw); + LIB_FUNCTION("hSUcSStZEHM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm); + LIB_FUNCTION("8oO55jndPRg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEmw); + LIB_FUNCTION("IJmeA5ayVJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm); + LIB_FUNCTION("piJabTDQRVs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm); + LIB_FUNCTION("w2GyuoXCnkw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw); + LIB_FUNCTION("6ZDv6ZusiFg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSiD0Ev); + LIB_FUNCTION("tJU-ttrsXsk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSiD1Ev); + LIB_FUNCTION("gVTWlvyBSIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSo6sentryC2ERSo); + LIB_FUNCTION("nk+0yTWvoRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSo6sentryD2Ev); + LIB_FUNCTION("lTTrDj5OIwQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSoD0Ev); + LIB_FUNCTION("HpCeP12cuNY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSoD1Ev); + LIB_FUNCTION("9HILqEoh24E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs5_CopyEmm); + LIB_FUNCTION("0Ir3jiT4V6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs5eraseEmm); + LIB_FUNCTION("QqBWUNEfIAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs6appendEmc); + LIB_FUNCTION("qiR-4jx1abE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs6appendERKSsmm); + LIB_FUNCTION("ikjnoeemspQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs6assignEmc); + LIB_FUNCTION("xSxPHmpcNzY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs6assignEPKcm); + LIB_FUNCTION("pGxNI4JKfmY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs6assignERKSsmm); + LIB_FUNCTION("KDgQWX1eDeo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSs6insertEmmc); + LIB_FUNCTION("MHA0XR2YHoQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10bad_typeidD0Ev); + LIB_FUNCTION("vzh0qoLIEuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10bad_typeidD1Ev); + LIB_FUNCTION("tkZ7jVV6wJ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10bad_typeidD2Ev); + LIB_FUNCTION("xGbaQPsHCFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem10_Close_dirEPv); + LIB_FUNCTION("PbCV7juCZVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem10_Copy_fileEPKcS1_); + LIB_FUNCTION("SQ02ZA5E-UE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem10_File_sizeEPKc); + LIB_FUNCTION("XD9FmX1mavU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem11_EquivalentEPKcS1_); + LIB_FUNCTION("YDQxE4cIwa4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem11_Remove_dirEPKc); + LIB_FUNCTION("8VKAqiw7lC0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem12_Current_getERA260_c); + LIB_FUNCTION("Yl10kSufa5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem12_Current_setEPKc); + LIB_FUNCTION("HCB1auZdcmo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem16_Last_write_timeEPKc); + LIB_FUNCTION("Wut42WAe7Rw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathES4_St10error_code); + LIB_FUNCTION("C6-7Mo5WbwU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathESt10error_code); + LIB_FUNCTION("B0CeIhQty7Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem18_Xfilesystem_errorEPKcSt10error_code); + LIB_FUNCTION("VSk+sij2mwg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem20_Set_last_write_timeEPKcl); + LIB_FUNCTION("EBwahsMLokw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem5_StatEPKcPNS_5permsE); + LIB_FUNCTION("XyKw6Hs1P9Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem6_ChmodEPKcNS_5permsE); + LIB_FUNCTION("o1qlZJqrvmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem6_LstatEPKcPNS_5permsE); + LIB_FUNCTION("srwl1hhFoUI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem7_RenameEPKcS1_); + LIB_FUNCTION("O4mPool-pow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem7_ResizeEPKcm); + LIB_FUNCTION("Iok1WdvAROg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem7_UnlinkEPKc); + LIB_FUNCTION("SdKk439pgjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem8_StatvfsEPKcRNS_10space_infoE); + LIB_FUNCTION("x7pQExTeqBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem9_Make_dirEPKcS1_); + LIB_FUNCTION("8iuHpl+kg8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem9_Open_dirERA260_cPKcRiRNS_9file_typeE); + LIB_FUNCTION("w5CGykBBU5M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10filesystem9_Read_dirERA260_cPvRNS_9file_typeE); + LIB_FUNCTION("eF26YAKQWKA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EE2idE); + LIB_FUNCTION("UbuTnKIXyCk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EE4intlE); + LIB_FUNCTION("mU88GYCirhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("tYBLm0BoQdQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EEC1Em); + LIB_FUNCTION("5afBJmEfUQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EEC1EPKcm); + LIB_FUNCTION("wrR3T5i7gpY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EEC1ERKSt8_Locinfomb); + LIB_FUNCTION("5DFeXjP+Plg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EEC2Em); + LIB_FUNCTION("aNfpdhcsMWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EEC2EPKcm); + LIB_FUNCTION("uQFv8aNF8Jc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EEC2ERKSt8_Locinfomb); + LIB_FUNCTION("sS5fF+fht2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EED0Ev); + LIB_FUNCTION("3cW6MrkCKt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EED1Ev); + LIB_FUNCTION("mbGmSOLXgN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb0EED2Ev); + LIB_FUNCTION("PgiTG7nVxXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EE2idE); + LIB_FUNCTION("XhdnPX5bosc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EE4intlE); + LIB_FUNCTION("BuxsERsopss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("nbTAoMwiO38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EEC1Em); + LIB_FUNCTION("9S960jA8tB0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EEC1EPKcm); + LIB_FUNCTION("TRn3cMU4mjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EEC1ERKSt8_Locinfomb); + LIB_FUNCTION("kPELiw9L-gw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EEC2Em); + LIB_FUNCTION("RxJnJ-HoySc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EEC2EPKcm); + LIB_FUNCTION("7e3DrnZea-Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EEC2ERKSt8_Locinfomb); + LIB_FUNCTION("tcdvTUlPnL0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EED0Ev); + LIB_FUNCTION("wT+HL7oqjYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EED1Ev); + LIB_FUNCTION("F7CUCpiasec", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIcLb1EED2Ev); + LIB_FUNCTION("mhoxSElvH0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EE2idE); + LIB_FUNCTION("D0gqPsqeZac", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EE4intlE); + LIB_FUNCTION("0OjBJZd9VeM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("McUBYCqjLMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EEC1Em); + LIB_FUNCTION("jna5sqISK4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EEC1EPKcm); + LIB_FUNCTION("dHs7ndrQBiI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EEC1ERKSt8_Locinfomb); + LIB_FUNCTION("bBGvmspg3Xs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EEC2Em); + LIB_FUNCTION("5bQqdR3hTZw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EEC2EPKcm); + LIB_FUNCTION("1kvQkOSaaVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EEC2ERKSt8_Locinfomb); + LIB_FUNCTION("95MaQlRbfC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EED0Ev); + LIB_FUNCTION("ki5SQPsB4m4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EED1Ev); + LIB_FUNCTION("6F1JfiING18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb0EED2Ev); + LIB_FUNCTION("XUs40umcJLQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EE2idE); + LIB_FUNCTION("8vEBRx0O1fc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EE4intlE); + LIB_FUNCTION("HmcMLz3cPkM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("X69UlAXF-Oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EEC1Em); + LIB_FUNCTION("pyBabUesXN4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EEC1EPKcm); + LIB_FUNCTION("uROsAczW6OU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EEC1ERKSt8_Locinfomb); + LIB_FUNCTION("sTaUDDnGOpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EEC2Em); + LIB_FUNCTION("GS1AvxBwVgY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EEC2EPKcm); + LIB_FUNCTION("H0a2QXvgHOk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EEC2ERKSt8_Locinfomb); + LIB_FUNCTION("fWuQSVGOivA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EED0Ev); + LIB_FUNCTION("OM0FnA7Tldk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EED1Ev); + LIB_FUNCTION("uVOxy7dQTFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt10moneypunctIwLb1EED2Ev); + LIB_FUNCTION("fn1i72X18Gs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11logic_errorD0Ev); + LIB_FUNCTION("i726T0BHbOU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11logic_errorD1Ev); + LIB_FUNCTION("wgDImKoGKCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11logic_errorD2Ev); + LIB_FUNCTION("efXnxYFN5oE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11range_errorD0Ev); + LIB_FUNCTION("NnNaWa16OvE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11range_errorD1Ev); + LIB_FUNCTION("XgmUR6WSeXg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11range_errorD2Ev); + LIB_FUNCTION("ASUJmlcHSLo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11regex_errorD0Ev); + LIB_FUNCTION("gDsvnPIkLIE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11regex_errorD1Ev); + LIB_FUNCTION("X2wfcFYusTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt11regex_errorD2Ev); + LIB_FUNCTION("JyAoulEqA1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12bad_weak_ptrD0Ev); + LIB_FUNCTION("jAO1IJKMhE4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12bad_weak_ptrD1Ev); + LIB_FUNCTION("2R2j1QezUGM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12bad_weak_ptrD2Ev); + LIB_FUNCTION("q89N9L8q8FU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12domain_errorD0Ev); + LIB_FUNCTION("7P1Wm-5KgAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12domain_errorD1Ev); + LIB_FUNCTION("AsShnG3DulM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12domain_errorD2Ev); + LIB_FUNCTION("rNYLEsL7M0k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12future_errorD0Ev); + LIB_FUNCTION("fuyXHeERajE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12future_errorD1Ev); + LIB_FUNCTION("XFh0C66aEms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12future_errorD2Ev); + LIB_FUNCTION("QS7CASjt4FU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12length_errorD0Ev); + LIB_FUNCTION("n3y8Rn9hXJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12length_errorD1Ev); + LIB_FUNCTION("NjJfVHJL2Gg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12length_errorD2Ev); + LIB_FUNCTION("TqvziWHetnw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12out_of_rangeD0Ev); + LIB_FUNCTION("Kcb+MNSzZcc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12out_of_rangeD1Ev); + LIB_FUNCTION("cCXMypoz4Vs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12out_of_rangeD2Ev); + LIB_FUNCTION("+CnX+ZDO8qg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_1E); + LIB_FUNCTION("GHsPYRKjheE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_2E); + LIB_FUNCTION("X1C-YhubpGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_3E); + LIB_FUNCTION("fjnxuk9ucsE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_4E); + LIB_FUNCTION("jxlpClEsfJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_5E); + LIB_FUNCTION("-cgB1bQG6jo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_6E); + LIB_FUNCTION("Vj+KUu5khTE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_7E); + LIB_FUNCTION("9f-LMAJYGCY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_8E); + LIB_FUNCTION("RlB3+37KJaE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders2_9E); + LIB_FUNCTION("b8ySy0pHgSQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_10E); + LIB_FUNCTION("or0CNRlAEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_11E); + LIB_FUNCTION("BO1r8DPhmyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_12E); + LIB_FUNCTION("eeeT3NKKQZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_13E); + LIB_FUNCTION("s0V1HJcZWEs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_14E); + LIB_FUNCTION("94OiPulKcao", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_15E); + LIB_FUNCTION("XOEdRCackI4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_16E); + LIB_FUNCTION("pP76ElRLm78", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_17E); + LIB_FUNCTION("WVB9rXLAUFs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_18E); + LIB_FUNCTION("BE7U+QsixQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_19E); + LIB_FUNCTION("dFhgrqyzqhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12placeholders3_20E); + LIB_FUNCTION("oly3wSwEJ2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12system_errorC2ESt10error_codePKc); + LIB_FUNCTION("cyy-9ntjWT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12system_errorD0Ev); + LIB_FUNCTION("3qWXO9GTUYU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12system_errorD1Ev); + LIB_FUNCTION("it6DDrqKGvo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt12system_errorD2Ev); + LIB_FUNCTION("Ntg7gSs99PY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Num_int_base10is_boundedE); + LIB_FUNCTION("90T0XESrYzU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Num_int_base10is_integerE); + LIB_FUNCTION("WFTOZxDfpbQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Num_int_base14is_specializedE); + LIB_FUNCTION("ongs2C6YZgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Num_int_base5radixE); + LIB_FUNCTION("VET8UnnaQKo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Num_int_base8is_exactE); + LIB_FUNCTION("rZ5sEWyLqa4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Num_int_base9is_moduloE); + LIB_FUNCTION("diSRws0Ppxg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Regex_traitsIcE6_NamesE); + LIB_FUNCTION("xsRN6gUx-DE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13_Regex_traitsIwE6_NamesE); + LIB_FUNCTION("lX9M5u0e48k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13bad_exceptionD0Ev); + LIB_FUNCTION("t6egllDqQ2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13bad_exceptionD1Ev); + LIB_FUNCTION("iWNC2tkDgxw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13bad_exceptionD2Ev); + LIB_FUNCTION("VNaqectsZNs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv); + LIB_FUNCTION("9biiDDejX3Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5_LockEv); + LIB_FUNCTION("qM0gUepGWT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale); + LIB_FUNCTION("jfr41GGp2jA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv); + LIB_FUNCTION("SYFNsz9K2rs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci); + LIB_FUNCTION("yofHspnD9us", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7_UnlockEv); + LIB_FUNCTION( + "7oio2Gs1GNk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); + LIB_FUNCTION( + "rsS5cBMihAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE); + LIB_FUNCTION("oYMRgkQHoJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi); + LIB_FUNCTION("JTwt9OTgk1k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9_EndwriteEv); + LIB_FUNCTION("jerxcj2Xnbg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi); + LIB_FUNCTION("Nl6si1CfINw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv); + LIB_FUNCTION("MYCRRmc7cDA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev); + LIB_FUNCTION("Yc2gZRtDeNQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev); + LIB_FUNCTION("gOxGOQmSVU0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev); + LIB_FUNCTION("+WvmZi3216M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv); + LIB_FUNCTION("GYTma8zq0NU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5_LockEv); + LIB_FUNCTION("kmzNbhlkddA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale); + LIB_FUNCTION("VrXGNMTgNdE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv); + LIB_FUNCTION("wAcnCK2HCeI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi); + LIB_FUNCTION("ryl2DYMxlZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7_UnlockEv); + LIB_FUNCTION( + "g7gjCDEedJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); + LIB_FUNCTION( + "10VcrHqHAlw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE); + LIB_FUNCTION("PjH5dZGfQHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEi); + LIB_FUNCTION("cV6KpJiF0Ck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9_EndwriteEv); + LIB_FUNCTION("NeiFvKblpZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEi); + LIB_FUNCTION("hXsvfky362s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv); + LIB_FUNCTION("JJ-mkOhdook", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev); + LIB_FUNCTION("XcuCO1YXaRs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev); + LIB_FUNCTION("aC9OWBGjvxA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev); + LIB_FUNCTION("94dk1V7XfYw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13runtime_errorD0Ev); + LIB_FUNCTION("uBlwRfRb-CM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13runtime_errorD1Ev); + LIB_FUNCTION("oe9tS0VztYk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13runtime_errorD2Ev); + LIB_FUNCTION("3CtP20nk8fs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Error_objectsIiE14_System_objectE); + LIB_FUNCTION("fMfCVl0JvfE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Error_objectsIiE15_Generic_objectE); + LIB_FUNCTION("y8PXwxTZ9Hc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base10has_denormE); + LIB_FUNCTION("G4Pw4hv6NKc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base10is_boundedE); + LIB_FUNCTION("Zwn1Rlbirio", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base10is_integerE); + LIB_FUNCTION("M+F+0jd4+Y0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base11round_styleE); + LIB_FUNCTION("f06wGEmo5Pk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base12has_infinityE); + LIB_FUNCTION("xd7O9oMO+nI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base13has_quiet_NaNE); + LIB_FUNCTION("8hyOiMUD36c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base14is_specializedE); + LIB_FUNCTION("F+ehGYUe36Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base15has_denorm_lossE); + LIB_FUNCTION("0JlZYApT0UM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base15tinyness_beforeE); + LIB_FUNCTION("ec8jeC2LMOc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base17has_signaling_NaNE); + LIB_FUNCTION("7tACjdACOBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base5radixE); + LIB_FUNCTION("7gc-QliZnMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base5trapsE); + LIB_FUNCTION("4PL4SkJXTos", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base8is_exactE); + LIB_FUNCTION("tsiBm2NZQfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base9is_iec559E); + LIB_FUNCTION("c27lOSHxPA4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base9is_moduloE); + LIB_FUNCTION("LV2FB+f1MJE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Num_ldbl_base9is_signedE); + LIB_FUNCTION("g8Jw7V6mn8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14error_categoryD2Ev); + LIB_FUNCTION("KQTHP-ij0yo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIaE6digitsE); + LIB_FUNCTION("btueF8F0fQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIaE8digits10E); + LIB_FUNCTION("iBrS+wbpuT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIaE9is_signedE); + LIB_FUNCTION("x1vTXM-GLCE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIbE6digitsE); + LIB_FUNCTION("lnOqjnXNTwQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIbE8digits10E); + LIB_FUNCTION("qOkciFIHghY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIbE9is_moduloE); + LIB_FUNCTION("0mi6NtGz04Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIbE9is_signedE); + LIB_FUNCTION("nlxVZWbqzsU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIcE6digitsE); + LIB_FUNCTION("VVK0w0uxDLE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIcE8digits10E); + LIB_FUNCTION("M+AMxjxwWlA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIcE9is_signedE); + LIB_FUNCTION("hqVKCQr0vU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIdE12max_digits10E); + LIB_FUNCTION("fjI2ddUGZZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIdE12max_exponentE); + LIB_FUNCTION("AwdlDnuQ6c0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIdE12min_exponentE); + LIB_FUNCTION("VmOyIzWFNKs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIdE14max_exponent10E); + LIB_FUNCTION("odyn6PGg5LY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIdE14min_exponent10E); + LIB_FUNCTION("xQtNieUQLVg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIdE6digitsE); + LIB_FUNCTION("EXW20cJ3oNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIdE8digits10E); + LIB_FUNCTION("Zhtj6WalERg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIDiE6digitsE); + LIB_FUNCTION("r1k-y+1yDcQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIDiE8digits10E); + LIB_FUNCTION("TEMThaOLu+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIDiE9is_signedE); + LIB_FUNCTION("EL+4ceAj+UU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIDsE6digitsE); + LIB_FUNCTION("vEdl5Er9THU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIDsE8digits10E); + LIB_FUNCTION("ZaOkYNQyQ6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIDsE9is_signedE); + LIB_FUNCTION("u16WKNmQUNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIeE12max_digits10E); + LIB_FUNCTION("bzmM0dI80jM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIeE12max_exponentE); + LIB_FUNCTION("ERYMucecNws", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIeE12min_exponentE); + LIB_FUNCTION("tUo2aRfWs5I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIeE14max_exponent10E); + LIB_FUNCTION("3+5qZWL6APo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIeE14min_exponent10E); + LIB_FUNCTION("NLHWcHpvMss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIeE6digitsE); + LIB_FUNCTION("JYZigPvvB6c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIeE8digits10E); + LIB_FUNCTION("MFqdrWyu9Ls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIfE12max_digits10E); + LIB_FUNCTION("L29QQz-6+X8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIfE12max_exponentE); + LIB_FUNCTION("SPlcBQ4pIZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIfE12min_exponentE); + LIB_FUNCTION("R8xUpEJwAA8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIfE14max_exponent10E); + LIB_FUNCTION("n+NFkoa0VD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIfE14min_exponent10E); + LIB_FUNCTION("W6qgdoww-3k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIfE6digitsE); + LIB_FUNCTION("J7d2Fq6Mb0k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIfE8digits10E); + LIB_FUNCTION("T1YYqsPgrn0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIhE6digitsE); + LIB_FUNCTION("uTiJLq4hayE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIhE8digits10E); + LIB_FUNCTION("o0WexTj82pU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIhE9is_signedE); + LIB_FUNCTION("ZvahxWPLKm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIiE6digitsE); + LIB_FUNCTION("aQjlTguvFMw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIiE8digits10E); + LIB_FUNCTION("GST3YemNZD8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIiE9is_signedE); + LIB_FUNCTION("-jpk31lZR6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIjE6digitsE); + LIB_FUNCTION("csNIBfF6cyI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIjE8digits10E); + LIB_FUNCTION("P9XP5U7AfXs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIjE9is_signedE); + LIB_FUNCTION("31lJOpD3GGk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIlE6digitsE); + LIB_FUNCTION("4MdGVqrsl7s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIlE8digits10E); + LIB_FUNCTION("4llda2Y+Q+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIlE9is_signedE); + LIB_FUNCTION("7AaHj1O8-gI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsImE6digitsE); + LIB_FUNCTION("h9RyP3R30HI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsImE8digits10E); + LIB_FUNCTION("FXrK1DiAosQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsImE9is_signedE); + LIB_FUNCTION("QO6Q+6WPgy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIsE6digitsE); + LIB_FUNCTION("kW5K7R4rXy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIsE8digits10E); + LIB_FUNCTION("L0nMzhz-axs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIsE9is_signedE); + LIB_FUNCTION("4r9P8foa6QQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsItE6digitsE); + LIB_FUNCTION("OQorbmM+NbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsItE8digits10E); + LIB_FUNCTION("vyqQpWI+O48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsItE9is_signedE); + LIB_FUNCTION("Tlfgn9TIWkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIwE6digitsE); + LIB_FUNCTION("mdcx6KcRIkE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIwE8digits10E); + LIB_FUNCTION("YVacrIa4L0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIwE9is_signedE); + LIB_FUNCTION("LN2bC6QtGQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIxE6digitsE); + LIB_FUNCTION("OwcpepSk5lg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIxE8digits10E); + LIB_FUNCTION("mmrSzkWDrgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIxE9is_signedE); + LIB_FUNCTION("v7XHt2HwUVI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIyE6digitsE); + LIB_FUNCTION("Eubj+4g8dWA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIyE8digits10E); + LIB_FUNCTION("F2uQDOc7fMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14numeric_limitsIyE9is_signedE); + LIB_FUNCTION("y1dYQsc67ys", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14overflow_errorD0Ev); + LIB_FUNCTION("XilOsTdCZuM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14overflow_errorD1Ev); + LIB_FUNCTION("OypvNf3Uq3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14overflow_errorD2Ev); + LIB_FUNCTION("q-WOrJNOlhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base10has_denormE); + LIB_FUNCTION("XbD-A2MEsS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base10is_boundedE); + LIB_FUNCTION("mxv24Oqmp0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base10is_integerE); + LIB_FUNCTION("9AcX4Qk47+o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base11round_styleE); + LIB_FUNCTION("MIKN--3fORE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base12has_infinityE); + LIB_FUNCTION("nxdioQgDF2E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base13has_quiet_NaNE); + LIB_FUNCTION("N03wZLr2RrE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base14is_specializedE); + LIB_FUNCTION("rhJg5tjs83Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base15has_denorm_lossE); + LIB_FUNCTION("EzuahjKzeGQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base15tinyness_beforeE); + LIB_FUNCTION("uMMG8cuJNr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base17has_signaling_NaNE); + LIB_FUNCTION("1KngsM7trps", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base5radixE); + LIB_FUNCTION("mMPu4-jx9oI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base5trapsE); + LIB_FUNCTION("J5QA0ZeLmhs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base8is_exactE); + LIB_FUNCTION("JwPU+6+T20M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base9is_iec559E); + LIB_FUNCTION("HU3yzCPz3GQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base9is_moduloE); + LIB_FUNCTION("S7kkgAPGxLQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15_Num_float_base9is_signedE); + LIB_FUNCTION("iHILAmwYRGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15underflow_errorD0Ev); + LIB_FUNCTION("ywv2X-q-9is", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15underflow_errorD1Ev); + LIB_FUNCTION("xiqd+QkuYXc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15underflow_errorD2Ev); + LIB_FUNCTION("1GhiIeIpkms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt16invalid_argumentD0Ev); + LIB_FUNCTION("oQDS9nX05Qg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt16invalid_argumentD1Ev); + LIB_FUNCTION("ddr7Ie4u5Nw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt16invalid_argumentD2Ev); + LIB_FUNCTION("za50kXyi3SA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt16nested_exceptionD0Ev); + LIB_FUNCTION("+qKS53qzWdA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt16nested_exceptionD1Ev); + LIB_FUNCTION("8R00hgzXQDY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt16nested_exceptionD2Ev); + LIB_FUNCTION("q9rMtHuXvZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt17bad_function_callD0Ev); + LIB_FUNCTION("YEDrb1pSx2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt17bad_function_callD1Ev); + LIB_FUNCTION("NqMgmxSA1rc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt17bad_function_callD2Ev); + LIB_FUNCTION("8DNJW5tX-A8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt18bad_variant_accessD0Ev); + LIB_FUNCTION("U3b5A2LEiTc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt18bad_variant_accessD1Ev); + LIB_FUNCTION("QUeUgxy7PTA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt20_Future_error_objectIiE14_Future_objectE); + LIB_FUNCTION("-UKRka-33sM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt20bad_array_new_lengthD0Ev); + LIB_FUNCTION("XO3N4SBvCy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt20bad_array_new_lengthD1Ev); + LIB_FUNCTION("15lB7flw-9w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt20bad_array_new_lengthD2Ev); + LIB_FUNCTION("WDKzMM-uuLE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt22_Future_error_categoryD0Ev); + LIB_FUNCTION("xsXQD5ybREw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt22_Future_error_categoryD1Ev); + LIB_FUNCTION("Dc4ZMWmPMl8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt22_System_error_categoryD0Ev); + LIB_FUNCTION("hVQgfGhJz3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt22_System_error_categoryD1Ev); + LIB_FUNCTION("YBrp9BlADaA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt23_Generic_error_categoryD0Ev); + LIB_FUNCTION("MAalgQhejPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt23_Generic_error_categoryD1Ev); + LIB_FUNCTION("9G32u5RRYxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt3pmr19new_delete_resourceEv); + LIB_FUNCTION("d2u38zs4Pe8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt3pmr20get_default_resourceEv); + LIB_FUNCTION("eWMGI7B7Lyc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt3pmr20null_memory_resourceEv); + LIB_FUNCTION("TKYsv0jdvRw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt3pmr20set_default_resourceEPNS_15memory_resourceE); + LIB_FUNCTION("H7-7Z3ixv-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_Pad7_LaunchEPKcPP12pthread_attrPP7pthread); + LIB_FUNCTION("PBbZjsL6nfc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_Pad7_LaunchEPKcPP7pthread); + LIB_FUNCTION("fLBZMOQh-3Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_Pad7_LaunchEPP12pthread_attrPP7pthread); + LIB_FUNCTION("xZqiZvmcp9k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_Pad7_LaunchEPP7pthread); + LIB_FUNCTION("a-z7wxuYO2E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_Pad8_ReleaseEv); + LIB_FUNCTION("uhnb6dnXOnc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_PadC2EPKc); + LIB_FUNCTION("dGYo9mE8K2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_PadC2Ev); + LIB_FUNCTION("XyJPhPqpzMw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_PadD1Ev); + LIB_FUNCTION("gjLRZgfb3i0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt4_PadD2Ev); + LIB_FUNCTION("rX58aCQCMS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt5ctypeIcE10table_sizeE); + LIB_FUNCTION("Cv+zC4EjGMA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt5ctypeIcE2idE); + LIB_FUNCTION("p8-44cVeO84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt5ctypeIcED0Ev); + LIB_FUNCTION("tPsGA6EzNKA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt5ctypeIcED1Ev); + LIB_FUNCTION("VmqsS6auJzo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt5ctypeIwE2idE); + LIB_FUNCTION("zOPA5qnbW2U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt5ctypeIwED0Ev); + LIB_FUNCTION("P0383AW3Y9A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt5ctypeIwED1Ev); + LIB_FUNCTION("U54NBtdj6UY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_Mutex5_LockEv); + LIB_FUNCTION("7OCTkL2oWyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_Mutex7_UnlockEv); + LIB_FUNCTION("2KNnG2Z9zJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_MutexC1Ev); + LIB_FUNCTION("log6zy2C9iQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_MutexC2Ev); + LIB_FUNCTION("djHbPE+TFIo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_MutexD1Ev); + LIB_FUNCTION("j7e7EQBD6ZA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_MutexD2Ev); + LIB_FUNCTION("0WY1SH7eoIs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_Winit9_Init_cntE); + LIB_FUNCTION("-Bl9-SZ2noc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_WinitC1Ev); + LIB_FUNCTION("57mMrw0l-40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_WinitC2Ev); + LIB_FUNCTION("Uw3OTZFPNt4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_WinitD1Ev); + LIB_FUNCTION("2yOarodWACE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6_WinitD2Ev); + LIB_FUNCTION("z83caOn94fM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6chrono12steady_clock12is_monotonicE); + LIB_FUNCTION("vHy+a4gLBfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6chrono12steady_clock9is_steadyE); + LIB_FUNCTION("jCX3CPIVB8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6chrono12system_clock12is_monotonicE); + LIB_FUNCTION("88EyUEoBX-E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6chrono12system_clock9is_steadyE); + LIB_FUNCTION("hEQ2Yi4PJXA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale16_GetgloballocaleEv); + LIB_FUNCTION("1TaQLyPDJEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale16_SetgloballocaleEPv); + LIB_FUNCTION("H4fcpQOpc08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale2id7_Id_cntE); + LIB_FUNCTION("9rMML086SEE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale5_InitEv); + LIB_FUNCTION("K-5mtupQZ4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale5emptyEv); + LIB_FUNCTION("AgxEl+HeWRQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale5facet7_DecrefEv); + LIB_FUNCTION("-EgSegeAKl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale5facet7_IncrefEv); + LIB_FUNCTION("QW2jL1J5rwY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale5facet9_RegisterEv); + LIB_FUNCTION("ptwhA0BQVeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale6globalERKS_); + LIB_FUNCTION("uuga3RipCKQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_Locimp7_AddfacEPNS_5facetEm); + LIB_FUNCTION("9FF+T5Xks9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_Locimp8_ClocptrE); + LIB_FUNCTION("5r801ZWiJJI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_Locimp8_MakelocERKSt8_LocinfoiPS0_PKS_); + LIB_FUNCTION("BcbHFSrcg3Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_Locimp9_MakewlocERKSt8_LocinfoiPS0_PKS_); + LIB_FUNCTION("fkFGlPdquqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_Locimp9_MakexlocERKSt8_LocinfoiPS0_PKS_); + LIB_FUNCTION("6b3KIjPD33k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_LocimpC1Eb); + LIB_FUNCTION("WViwxtEKxHk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_LocimpC1ERKS0_); + LIB_FUNCTION("zrmR88ClfOs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_LocimpC2Eb); + LIB_FUNCTION("dsJKehuajH4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_LocimpC2ERKS0_); + LIB_FUNCTION("bleKr8lOLr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_LocimpD0Ev); + LIB_FUNCTION("aD-iqbVlHmQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_LocimpD1Ev); + LIB_FUNCTION("So6gSmJMYDs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7_LocimpD2Ev); + LIB_FUNCTION("Uq5K8tl8I9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6locale7classicEv); + LIB_FUNCTION("pMWnITHysPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6localeD1Ev); + LIB_FUNCTION("CHrhwd8QSBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt6thread20hardware_concurrencyEv); + LIB_FUNCTION("m7qAgircaZY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIcE5_InitERKSt8_Locinfob); + LIB_FUNCTION("zWSNYg14Uag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIcEC2Emb); + LIB_FUNCTION("0il9qdo6fhs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIcEC2EPKcmbb); + LIB_FUNCTION("Lzj4ws7DlhQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIcED0Ev); + LIB_FUNCTION("0AeC+qCELEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIcED1Ev); + LIB_FUNCTION("iCoD0EOIbTM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIwE5_InitERKSt8_Locinfob); + LIB_FUNCTION("Pr1yLzUe230", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIwEC2Emb); + LIB_FUNCTION("TDhjx3nyaoU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIwEC2EPKcmbb); + LIB_FUNCTION("8UeuxGKjQr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIwED0Ev); + LIB_FUNCTION("0TADyPWrobI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7_MpunctIwED1Ev); + LIB_FUNCTION("eVFYZnYNDo0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetE2idE); + LIB_FUNCTION("iZCHNahj++4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetE5_InitERKSt8_Locinfo); + LIB_FUNCTION("zyhiiLKndO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetE7_GetcatEPPKNSt6locale5facetEPKS2_); + LIB_FUNCTION("XhwSbwsBdx0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetEC1Em); + LIB_FUNCTION("3YCLxZqgIdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetEC1ERKSt8_Locinfom); + LIB_FUNCTION("e5Hwcntvd8c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetEC2Em); + LIB_FUNCTION("4qHwSTPt-t8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetEC2ERKSt8_Locinfom); + LIB_FUNCTION("2TYdayAO39E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetED0Ev); + LIB_FUNCTION("djNkrJKTb6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetED1Ev); + LIB_FUNCTION("to7GggwECZU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIcc9_MbstatetED2Ev); + LIB_FUNCTION("u2MAta5SS84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIDic9_MbstatetE2idE); + LIB_FUNCTION("vwMx2NhWdLw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIDic9_MbstatetED0Ev); + LIB_FUNCTION("TuhGCIxgLvA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIDic9_MbstatetED1Ev); + LIB_FUNCTION("xM5re58mxj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIDsc9_MbstatetE2idE); + LIB_FUNCTION("zYHryd8vd0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIDsc9_MbstatetED0Ev); + LIB_FUNCTION("Oeo9tUbzW7s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIDsc9_MbstatetED1Ev); + LIB_FUNCTION("FjZCPmK0SbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIwc9_MbstatetE2idE); + LIB_FUNCTION("9BI3oYkCTCU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIwc9_MbstatetED0Ev); + LIB_FUNCTION("0fkFA3za2N8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7codecvtIwc9_MbstatetED1Ev); + LIB_FUNCTION("7brRfHVVAlI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcE2idE); + LIB_FUNCTION("CKlZ-H-D1CE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcE5_InitERKSt8_Locinfo); + LIB_FUNCTION("BSVJqITGCyI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("Oo1r8jKGZQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcEC1Em); + LIB_FUNCTION("splBMMcF3yk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcEC1EPKcm); + LIB_FUNCTION("raLgIUi3xmk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcEC1ERKSt8_Locinfom); + LIB_FUNCTION("tkqNipin1EI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcEC2Em); + LIB_FUNCTION("VClCrMDyydE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcEC2EPKcm); + LIB_FUNCTION("L71JAnoQees", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcEC2ERKSt8_Locinfom); + LIB_FUNCTION("Lt4407UMs2o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcED0Ev); + LIB_FUNCTION("8pXCeme0FC4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcED1Ev); + LIB_FUNCTION("dP5zwQ2Yc8g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIcED2Ev); + LIB_FUNCTION("irGo1yaJ-vM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwE2idE); + LIB_FUNCTION("LxKs-IGDsFU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwE5_InitERKSt8_Locinfo); + LIB_FUNCTION("2wz4rthdiy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("d-MOtyu8GAk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwEC1Em); + LIB_FUNCTION("fjHAU8OSaW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwEC1EPKcm); + LIB_FUNCTION("wggIIjWSt-E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwEC1ERKSt8_Locinfom); + LIB_FUNCTION("HQbgeUdQyyw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwEC2Em); + LIB_FUNCTION("PSAw7g1DD24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwEC2EPKcm); + LIB_FUNCTION("2PoQu-K2qXk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwEC2ERKSt8_Locinfom); + LIB_FUNCTION("ig4VDIRc21Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwED0Ev); + LIB_FUNCTION("ZO3a6HfALTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwED1Ev); + LIB_FUNCTION("84wIPnwBGiU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7collateIwED2Ev); + LIB_FUNCTION("WkAsdy5CUAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_Locinfo8_AddcatsEiPKc); + LIB_FUNCTION("L1Ze94yof2I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoC1EiPKc); + LIB_FUNCTION("hqi8yMOCmG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoC1EPKc); + LIB_FUNCTION("2aSk2ruCP0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoC1ERKSs); + LIB_FUNCTION("i180MNC9p4c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoC2EiPKc); + LIB_FUNCTION("pN02FS5SPgg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoC2EPKc); + LIB_FUNCTION("ReK9U6EUWuU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoC2ERKSs); + LIB_FUNCTION("p6LrHjIQMdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoD1Ev); + LIB_FUNCTION("YXVCU6PdgZk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8_LocinfoD2Ev); + LIB_FUNCTION("2MK5Lr9pgQc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8bad_castD0Ev); + LIB_FUNCTION("47RvLSo2HN8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8bad_castD1Ev); + LIB_FUNCTION("rF07weLXJu8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8bad_castD2Ev); + LIB_FUNCTION("QZb07KKwTU0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base4Init9_Init_cntE); + LIB_FUNCTION("sqWytnhYdEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base4InitC1Ev); + LIB_FUNCTION("bTQcNwRc8hE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base4InitC2Ev); + LIB_FUNCTION("kxXCvcat1cM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base4InitD1Ev); + LIB_FUNCTION("bxLH5WHgMBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base4InitD2Ev); + LIB_FUNCTION("8tL6yJaX1Ro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base5_SyncE); + LIB_FUNCTION("QXJCcrXoqpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base5clearENSt5_IosbIiE8_IostateEb); + LIB_FUNCTION("4EkPKYzOjPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base6_IndexE); + LIB_FUNCTION("LTov9gMEqCU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base7_AddstdEPS_); + LIB_FUNCTION("x7vtyar1sEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base7failureD0Ev); + LIB_FUNCTION("N2f485TmJms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base7failureD1Ev); + LIB_FUNCTION("fjG5plxblj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_base7failureD2Ev); + LIB_FUNCTION("I5jcbATyIWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_baseD0Ev); + LIB_FUNCTION("X9D8WWSG3As", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_baseD1Ev); + LIB_FUNCTION("P8F2oavZXtY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8ios_baseD2Ev); + LIB_FUNCTION("lA+PfiZ-S5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcE2idE); + LIB_FUNCTION("eLB2+1+mVvg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcE5_InitERKSt8_Locinfo); + LIB_FUNCTION("96Ev+CE1luE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("6gCBQs1mIi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcEC1Em); + LIB_FUNCTION("W0w8TGzAu0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcEC1EPKcm); + LIB_FUNCTION("SD403oMc1pQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcEC1ERKSt8_Locinfom); + LIB_FUNCTION("6DBUo0dty1k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcEC2Em); + LIB_FUNCTION("qF3mHeMAHVk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcEC2EPKcm); + LIB_FUNCTION("969Euioo12Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcEC2ERKSt8_Locinfom); + LIB_FUNCTION("jy9urODH0Wo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcED0Ev); + LIB_FUNCTION("34mi8lteNTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcED1Ev); + LIB_FUNCTION("yDdbQr1oLOc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIcED2Ev); + LIB_FUNCTION("n1Y6pGR-8AU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwE2idE); + LIB_FUNCTION("Zz-RfDtowlo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwE5_InitERKSt8_Locinfo); + LIB_FUNCTION("XghI4vmw8mU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("n4+3hznhkU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwEC1Em); + LIB_FUNCTION("4Srtnk+NpC4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwEC1EPKcm); + LIB_FUNCTION("RrTMGyPhYU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwEC1ERKSt8_Locinfom); + LIB_FUNCTION("x8PFBjJhH7E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwEC2Em); + LIB_FUNCTION("DlDsyX+XsoA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwEC2EPKcm); + LIB_FUNCTION("DDQjbwNC31E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwEC2ERKSt8_Locinfom); + LIB_FUNCTION("gMwkpZNI9Us", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwED0Ev); + LIB_FUNCTION("6sAaleB7Zgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwED1Ev); + LIB_FUNCTION("I-e7Dxo087A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8messagesIwED2Ev); + LIB_FUNCTION("9iXtwvGVFRI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcE2idE); + LIB_FUNCTION("1LvbNeZZJ-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcE5_InitERKSt8_Locinfob); + LIB_FUNCTION("fFnht9SPed8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcE5_TidyEv); + LIB_FUNCTION("zCB24JBovnQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("TEtyeXjcZ0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcEC1Em); + LIB_FUNCTION("WK24j1F3rCU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcEC1EPKcmb); + LIB_FUNCTION("CDm+TUClE7E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcEC1ERKSt8_Locinfomb); + LIB_FUNCTION("1eVdDzPtzD4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcEC2Em); + LIB_FUNCTION("yIn4l8OO1zA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcEC2EPKcmb); + LIB_FUNCTION("Cb1hI+w9nyU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcEC2ERKSt8_Locinfomb); + LIB_FUNCTION("Lf6h5krl2fA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcED0Ev); + LIB_FUNCTION("qEob3o53s2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcED1Ev); + LIB_FUNCTION("xFva4yxsVW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIcED2Ev); + LIB_FUNCTION("XZNi3XtbWQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwE2idE); + LIB_FUNCTION("uiRALKOdAZk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwE5_InitERKSt8_Locinfob); + LIB_FUNCTION("2YCDWkuFEy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwE5_TidyEv); + LIB_FUNCTION("SdXFaufpLIs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwE7_GetcatEPPKNSt6locale5facetEPKS1_); + LIB_FUNCTION("XOgjMgZ3fjo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwEC1Em); + LIB_FUNCTION("H+T2VJ91dds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwEC1EPKcmb); + LIB_FUNCTION("s1EM2NdPf0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwEC1ERKSt8_Locinfomb); + LIB_FUNCTION("ElKI+ReiehU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwEC2Em); + LIB_FUNCTION("m4kEqv7eGVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwEC2EPKcmb); + LIB_FUNCTION("MQJQCxbLfM0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwEC2ERKSt8_Locinfomb); + LIB_FUNCTION("VHBnRBxBg5E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwED0Ev); + LIB_FUNCTION("lzK3uL1rWJY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwED1Ev); + LIB_FUNCTION("XDm4jTtoEbo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8numpunctIwED2Ev); + LIB_FUNCTION("cDHRgSXYdqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base10has_denormE); + LIB_FUNCTION("v9HHsaa42qE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base10is_boundedE); + LIB_FUNCTION("EgSIYe3IYso", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base10is_integerE); + LIB_FUNCTION("XXiGcYa5wtg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base11round_styleE); + LIB_FUNCTION("98w+P+GuFMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base12has_infinityE); + LIB_FUNCTION("qeA5qUg9xBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base12max_digits10E); + LIB_FUNCTION("E4gWXl6V2J0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base12max_exponentE); + LIB_FUNCTION("KqdclsYd24w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base12min_exponentE); + LIB_FUNCTION("gF5aGNmzWSg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base13has_quiet_NaNE); + LIB_FUNCTION("RCWKbkEaDAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base14is_specializedE); + LIB_FUNCTION("Dl4hxL59YF4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base14max_exponent10E); + LIB_FUNCTION("zBHGQsN5Yfw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base14min_exponent10E); + LIB_FUNCTION("96Bg8h09w+o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base15has_denorm_lossE); + LIB_FUNCTION("U0FdtOUjUPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base15tinyness_beforeE); + LIB_FUNCTION("fSdpGoYfYs8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base17has_signaling_NaNE); + LIB_FUNCTION("Xb9FhMysEHo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base5radixE); + LIB_FUNCTION("suaBxzlL0p0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base5trapsE); + LIB_FUNCTION("ejBz8a8TCWU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base6digitsE); + LIB_FUNCTION("M-KRaPj9tQQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base8digits10E); + LIB_FUNCTION("bUQLE6uEu10", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base8is_exactE); + LIB_FUNCTION("0ZdjsAWtbG8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base9is_iec559E); + LIB_FUNCTION("qO4MLGs1o58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base9is_moduloE); + LIB_FUNCTION("5DzttCF356U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9_Num_base9is_signedE); + LIB_FUNCTION("qb6A7pSgAeY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9bad_allocD0Ev); + LIB_FUNCTION("khbdMADH4cQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9bad_allocD1Ev); + LIB_FUNCTION("WiH8rbVv5s4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9bad_allocD2Ev); + LIB_FUNCTION("Bin7e2UR+a0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9exception18_Set_raise_handlerEPFvRKS_E); + LIB_FUNCTION("+Nc8JGdVLQs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9exceptionD0Ev); + LIB_FUNCTION("BgZcGDh7o9g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9exceptionD1Ev); + LIB_FUNCTION("MOBxtefPZUg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9exceptionD2Ev); + LIB_FUNCTION("N5nZ3wQw+Vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9type_infoD0Ev); + LIB_FUNCTION("LLssoYjMOow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9type_infoD1Ev); + LIB_FUNCTION("zb3436295XU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9type_infoD2Ev); + LIB_FUNCTION("ryUxD-60bKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZnwmRKSt9nothrow_t); + LIB_FUNCTION("3yxLpdKD0RA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZnwmSt11align_val_t); + LIB_FUNCTION("iQXBbJbfT5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZnwmSt11align_val_tRKSt9nothrow_t); + LIB_FUNCTION("VrWUXy1gqn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt10_Rng_abortPKc); + LIB_FUNCTION("Zmeuhg40yNI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt10adopt_lock); + LIB_FUNCTION("mhR3IufA7fE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt10defer_lock); + LIB_FUNCTION("lKfKm6INOpQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt10unexpectedv); + LIB_FUNCTION("eT2UsmTewbU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt11_Xbad_allocv); + LIB_FUNCTION("L7Vnk06zC2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt11setiosflagsNSt5_IosbIiE9_FmtflagsE); + LIB_FUNCTION("kFYQ4d6jVls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt11try_to_lock); + LIB_FUNCTION("1h8hFQghR7w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt12setprecisioni); + LIB_FUNCTION("ybn35k-I+B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt13_Cl_charnames); + LIB_FUNCTION("DiGVep5yB5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt13_Execute_onceRSt9once_flagPFiPvS1_PS1_ES1_); + LIB_FUNCTION("PDX01ziUz+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt13_Syserror_mapi); + LIB_FUNCTION("UWyL6KoR96U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt13_Xregex_errorNSt15regex_constants10error_typeE); + LIB_FUNCTION("Zb+hMspRR-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt13get_terminatev); + LIB_FUNCTION("qMXslRdZVj4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt13resetiosflagsNSt5_IosbIiE9_FmtflagsE); + LIB_FUNCTION("NG1phipELJE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt13set_terminatePFvvE); + LIB_FUNCTION("u2tMGOLaqnE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Atomic_assertPKcS0_); + LIB_FUNCTION("T+zVxpVaaTo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Cl_wcharnames); + LIB_FUNCTION("Zn44KZgJtWY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Debug_messagePKcS0_j); + LIB_FUNCTION("u0yN6tzBors", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Raise_handler); + LIB_FUNCTION("Nmtr628eA3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Random_devicev); + LIB_FUNCTION("bRujIheWlB0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Throw_C_errori); + LIB_FUNCTION("tQIo+GIPklo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Xlength_errorPKc); + LIB_FUNCTION("ozMAr28BwSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14_Xout_of_rangePKc); + LIB_FUNCTION("zPWCqkg7V+o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14get_unexpectedv); + LIB_FUNCTION("Eva2i4D5J6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt14set_unexpectedPFvvE); + LIB_FUNCTION("zugltxeIXM0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt15_sceLibcLocinfoPKc); + LIB_FUNCTION("y7aMFEkj4PE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt15_Xruntime_errorPKc); + LIB_FUNCTION("vI85k3GQcz8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt15future_categoryv); + LIB_FUNCTION("CkY0AVa-frg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt15get_new_handlerv); + LIB_FUNCTION("RqeErO3cFHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt15set_new_handlerPFvvE); + LIB_FUNCTION("aotaAaQK6yc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt15system_categoryv); + LIB_FUNCTION("W0j6vCxh9Pc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt16_Throw_Cpp_errori); + LIB_FUNCTION("saSUnPWLq9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt16_Xoverflow_errorPKc); + LIB_FUNCTION("YxwfcCH5Q0I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt16generic_categoryv); + LIB_FUNCTION("0r8rbw2SFqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt17_Future_error_mapi); + LIB_FUNCTION("VoUwme28y4w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt18_String_cpp_unused); + LIB_FUNCTION("NU-T4QowTNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt18_Xinvalid_argumentPKc); + LIB_FUNCTION("Q1BL70XVV0o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt18uncaught_exceptionv); + LIB_FUNCTION("PjwbqtUehPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt19_Throw_future_errorRKSt10error_code); + LIB_FUNCTION("MELi-cKqWq0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt19_Xbad_function_callv); + LIB_FUNCTION("Qoo175Ig+-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt21_sceLibcClassicLocale); + LIB_FUNCTION("cPNeOAYgB0A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt22_Get_future_error_whati); + LIB_FUNCTION("mDIHE-aaRaI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt22_Random_device_entropyv); + LIB_FUNCTION("DNbsDRZ-ntI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt25_Rethrow_future_exceptionSt13exception_ptr); + LIB_FUNCTION("2WVBaSdGIds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt3cin); + LIB_FUNCTION("wiR+rIcbnlc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt4_Fpz); + LIB_FUNCTION("TVfbf1sXt0A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt4cerr); + LIB_FUNCTION("jSquWN7i7lc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt4clog); + LIB_FUNCTION("5PfqUBaQf4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt4cout); + LIB_FUNCTION("vU9svJtEnWc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt4setwi); + LIB_FUNCTION("2bASh0rEeXI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt4wcin); + LIB_FUNCTION("CvJ3HUPlMIY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt5wcerr); + LIB_FUNCTION("awr1A2VAVZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt5wclog); + LIB_FUNCTION("d-YRIvO0jXI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt5wcout); + LIB_FUNCTION("pDFe-IgbTPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt6_ThrowRKSt9exception); + LIB_FUNCTION("kr5ph+wVAtU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt6ignore); + LIB_FUNCTION("FQ9NFbBHb5Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7_BADOFF); + LIB_FUNCTION("vYWK2Pz8vGE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7_FiopenPKcNSt5_IosbIiE9_OpenmodeEi); + LIB_FUNCTION("aqyjhIx7jaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7_FiopenPKwNSt5_IosbIiE9_OpenmodeEi); + LIB_FUNCTION("QfPuSqhub7o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7_MP_AddPyy); + LIB_FUNCTION("lrQSsTRMMr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7_MP_GetPy); + LIB_FUNCTION("Gav1Xt1Ce+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7_MP_MulPyyy); + LIB_FUNCTION("Ozk+Z6QnlTY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7_MP_RemPyy); + LIB_FUNCTION("NLwJ3q+64bY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7nothrow); + LIB_FUNCTION("4rrOHCHAV1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt7setbasei); + LIB_FUNCTION("yYk819F9TyU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt8_XLgammad); + LIB_FUNCTION("bl0DPP6kFBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt8_XLgammae); + LIB_FUNCTION("DWMcG8yogkY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt8_XLgammaf); + LIB_FUNCTION("X1DNtCe22Ks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt9_LStrcollIcEiPKT_S2_S2_S2_PKSt8_Collvec); + LIB_FUNCTION("m6uU37-b27s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt9_LStrcollIwEiPKT_S2_S2_S2_PKSt8_Collvec); + LIB_FUNCTION("V62E2Q8bJVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt9_LStrxfrmIcEmPT_S1_PKS0_S3_PKSt8_Collvec); + LIB_FUNCTION("BloPUt1HCH0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt9_LStrxfrmIwEmPT_S1_PKS0_S3_PKSt8_Collvec); + LIB_FUNCTION("qYhnoevd9bI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt9terminatev); + LIB_FUNCTION("XO9ihAZCBcY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIa); + LIB_FUNCTION("nEuTkSQAQFw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIb); + LIB_FUNCTION("smeljzleGRQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIc); + LIB_FUNCTION("iZrCfFRsE3Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTId); + LIB_FUNCTION("ltRLAWAeSaM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIDh); + LIB_FUNCTION("7TW4UgJjwJ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIDi); + LIB_FUNCTION("SK0Syya+scs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIDn); + LIB_FUNCTION("rkWOabkkpVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIDs); + LIB_FUNCTION("NlgA2fMtxl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIe); + LIB_FUNCTION("c5-Jw-LTekM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIf); + LIB_FUNCTION("g-fUPD4HznU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIh); + LIB_FUNCTION("St4apgcBNfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIi); + LIB_FUNCTION("MpiTv3MErEQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIj); + LIB_FUNCTION("b5JSEuAHuDo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIl); + LIB_FUNCTION("DoGS21ugIfI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIm); + LIB_FUNCTION("2EEDQ6uHY2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIn); + LIB_FUNCTION("h1Eewgzowes", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv116__enum_type_infoE); + LIB_FUNCTION("eD+mC6biMFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv117__array_type_infoE); + LIB_FUNCTION("EeOtHxoUkvM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv117__class_type_infoE); + LIB_FUNCTION("dSBshTZ8JcA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv117__pbase_type_infoE); + LIB_FUNCTION("YglrcQaNfds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv119__pointer_type_infoE); + LIB_FUNCTION("DZhZwYkJDCE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv120__function_type_infoE); + LIB_FUNCTION("N2VV+vnEYlw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv120__si_class_type_infoE); + LIB_FUNCTION("gjLRFhKCMNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv121__vmi_class_type_infoE); + LIB_FUNCTION("dHw0YAjyIV4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv123__fundamental_type_infoE); + LIB_FUNCTION("7tTpzMt-PzY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN10__cxxabiv129__pointer_to_member_type_infoE); + LIB_FUNCTION("yZmHOKICuxg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN6Dinkum7threads10lock_errorE); + LIB_FUNCTION("qcaIknDQLwE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIN6Dinkum7threads21thread_resource_errorE); + LIB_FUNCTION("sJUU2ZW-yxU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTINSt6locale5facetE); + LIB_FUNCTION("8Wc+t3BCF-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTINSt6locale7_LocimpE); + LIB_FUNCTION("sBCTjFk7Gi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTINSt8ios_base7failureE); + LIB_FUNCTION("Sn3TCBWJ5wo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIo); + LIB_FUNCTION("Jk+LgZzCsi8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPa); + LIB_FUNCTION("+qso2nVwQzg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPb); + LIB_FUNCTION("M1jmeNsWVK8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPc); + LIB_FUNCTION("3o0PDVnn1qA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPd); + LIB_FUNCTION("7OO0uCJWILQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPDh); + LIB_FUNCTION("DOBCPW6DL3w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPDi); + LIB_FUNCTION("QvWOlLyuQ2o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPDn); + LIB_FUNCTION("OkYxbdkrv64", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPDs); + LIB_FUNCTION("96xdSFbiR7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPe); + LIB_FUNCTION("01FSgNK1wwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPf); + LIB_FUNCTION("ota-3+co4Jk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPh); + LIB_FUNCTION("YstfcFbhwvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPi); + LIB_FUNCTION("DQ9mChn0nnE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPj); + LIB_FUNCTION("Ml1z3dYEVPM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKa); + LIB_FUNCTION("WV94zKqwgxY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKb); + LIB_FUNCTION("I4y33AOamns", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKc); + LIB_FUNCTION("0G36SAiYUhQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKd); + LIB_FUNCTION("NVCBWomXpcw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKDh); + LIB_FUNCTION("50aDlGVFt5I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKDi); + LIB_FUNCTION("liR+QkhejDk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKDn); + LIB_FUNCTION("kzfj-YSkW7w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKDs); + LIB_FUNCTION("7uX6IsXWwak", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKe); + LIB_FUNCTION("2PXZUKjolAA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKf); + LIB_FUNCTION("RKvygdQzGaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKh); + LIB_FUNCTION("sVUkO0TTpM8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKi); + LIB_FUNCTION("4zhc1xNSIno", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKj); + LIB_FUNCTION("Gr+ih5ipgNk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKl); + LIB_FUNCTION("0cLFYdr1AGc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKm); + LIB_FUNCTION("0Xxtiar8Ceg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKn); + LIB_FUNCTION("hsttk-IbL1o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKo); + LIB_FUNCTION("zqOGToT2dH8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKs); + LIB_FUNCTION("WY7615THqKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKt); + LIB_FUNCTION("0g+zCGZ7dgQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKv); + LIB_FUNCTION("jfqTdKTGbBI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKw); + LIB_FUNCTION("sOz2j1Lxl48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKx); + LIB_FUNCTION("qTgw+f54K34", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPKy); + LIB_FUNCTION("1+5ojo5J2xU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPl); + LIB_FUNCTION("SPiW3NTO8I0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPm); + LIB_FUNCTION("zUwmtNuJABI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPn); + LIB_FUNCTION("A9PfIjQCOUw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPo); + LIB_FUNCTION("nqpARwWZmjI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPs); + LIB_FUNCTION("KUW22XiVxvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPt); + LIB_FUNCTION("OJPn-YR1bow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPv); + LIB_FUNCTION("7gj0BXUP3dc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPw); + LIB_FUNCTION("9opd1ucwDqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPx); + LIB_FUNCTION("a9KMkfXXUsE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIPy); + LIB_FUNCTION("j97CjKJNtQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIs); + LIB_FUNCTION("U1CBVMD42HA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISi); + LIB_FUNCTION("iLSavTYoxx0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISo); + LIB_FUNCTION("H0aqk25W6BI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt10bad_typeid); + LIB_FUNCTION("2GWRrgT8o20", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt10ctype_base); + LIB_FUNCTION("IBtzswgYU3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt10money_base); + LIB_FUNCTION("2e96MkSXo3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt10moneypunctIcLb0EE); + LIB_FUNCTION("Ks2FIQJ2eDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt10moneypunctIcLb1EE); + LIB_FUNCTION("EnMjfRlO5f0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt10moneypunctIwLb0EE); + LIB_FUNCTION("gBZnTFMk6N0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt10moneypunctIwLb1EE); + LIB_FUNCTION("n7iD5r9+4Eo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt11_Facet_base); + LIB_FUNCTION("x8LHSvl5N6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt11logic_error); + LIB_FUNCTION("C0IYaaVSC1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt11range_error); + LIB_FUNCTION("9-TRy4p-YTM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt11regex_error); + LIB_FUNCTION("XtP9KKwyK9Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt12bad_weak_ptr); + LIB_FUNCTION("dDIjj8NBxNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt12codecvt_base); + LIB_FUNCTION("5BIbzIuDxTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt12domain_error); + LIB_FUNCTION("DCY9coLQcVI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt12future_error); + LIB_FUNCTION("cxqzgvGm1GI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt12length_error); + LIB_FUNCTION("dKjhNUf9FBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt12out_of_range); + LIB_FUNCTION("eDciML+moZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt12system_error); + LIB_FUNCTION("Z7NWh8jD+Nw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt13bad_exception); + LIB_FUNCTION("STNAj1oxtpk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt13basic_filebufIcSt11char_traitsIcEE); + LIB_FUNCTION("37CMzzbbHn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt13basic_filebufIwSt11char_traitsIwEE); + LIB_FUNCTION("WbBz4Oam3wM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt13messages_base); + LIB_FUNCTION("bLPn1gfqSW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt13runtime_error); + LIB_FUNCTION("cbvW20xPgyc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt14error_category); + LIB_FUNCTION("lt0mLhNwjs0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt14overflow_error); + LIB_FUNCTION("oNRAB0Zs2+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt15underflow_error); + LIB_FUNCTION("XZzWt0ygWdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt16invalid_argument); + LIB_FUNCTION("FtPFMdiURuM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt16nested_exception); + LIB_FUNCTION("c33GAGjd7Is", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt17bad_function_call); + LIB_FUNCTION("8rd5FvOFk+w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt18bad_variant_access); + LIB_FUNCTION("lbLEAN+Y9iI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt20bad_array_new_length); + LIB_FUNCTION("3aZN32UTqqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt22_Future_error_category); + LIB_FUNCTION("QLqM1r9nPow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt22_System_error_category); + LIB_FUNCTION("+Le0VsFb9mE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt23_Generic_error_category); + LIB_FUNCTION("QQsnQ2bWkdM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt4_Pad); + LIB_FUNCTION("sIvK5xl5pzw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt5_IosbIiE); + LIB_FUNCTION("gZvNGjQsmf8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt5ctypeIcE); + LIB_FUNCTION("Fj7VTFzlI3k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt5ctypeIwE); + LIB_FUNCTION("weALTw0uesc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7_MpunctIcE); + LIB_FUNCTION("DaYYQBc+SY8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7_MpunctIwE); + LIB_FUNCTION("Cs3DBACRSY8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7codecvtIcc9_MbstatetE); + LIB_FUNCTION("+TtUFzALoDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7codecvtIDic9_MbstatetE); + LIB_FUNCTION("v1WebHtIa24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7codecvtIDsc9_MbstatetE); + LIB_FUNCTION("hbU5HOTy1HM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7codecvtIwc9_MbstatetE); + LIB_FUNCTION("fvgYbBEhXnc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7collateIcE); + LIB_FUNCTION("pphEhnnuXKA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7collateIwE); + LIB_FUNCTION("qOD-ksTkE08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8bad_cast); + LIB_FUNCTION("BJCgW9-OxLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8ios_base); + LIB_FUNCTION("UFsKD1fd1-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8messagesIcE); + LIB_FUNCTION("007PjrBCaUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8messagesIwE); + LIB_FUNCTION("ddLNBT9ks2I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8numpunctIcE); + LIB_FUNCTION("A2TTRMAe6Sw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8numpunctIwE); + LIB_FUNCTION("DwH3gdbYfZo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9bad_alloc); + LIB_FUNCTION("7f4Nl2VS0gw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9basic_iosIcSt11char_traitsIcEE); + LIB_FUNCTION("RjWhdj0ztTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9basic_iosIwSt11char_traitsIwEE); + LIB_FUNCTION("n2kx+OmFUis", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9exception); + LIB_FUNCTION("CVcmmf8VL40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9time_base); + LIB_FUNCTION("xX6s+z0q6oo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9type_info); + LIB_FUNCTION("Qd6zUdRhrhs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIt); + LIB_FUNCTION("JrUnjJ-PCTg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIv); + LIB_FUNCTION("qUxH+Damft4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIw); + LIB_FUNCTION("8Ijx3Srynh0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIx); + LIB_FUNCTION("KBBVmt8Td7c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTIy); + LIB_FUNCTION("iOLTktXe6a0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSa); + LIB_FUNCTION("M86y4bmx+WA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSb); + LIB_FUNCTION("zGpCWBtVC0A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSc); + LIB_FUNCTION("pMQUQSfX6ZE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSd); + LIB_FUNCTION("DghzFjzLqaE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSDi); + LIB_FUNCTION("FUvnVyCDhjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSDn); + LIB_FUNCTION("Z7+siBC690w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSDs); + LIB_FUNCTION("KNgcEteI72I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSe); + LIB_FUNCTION("aFMVMBzO5jk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSf); + LIB_FUNCTION("BNC7IeJelZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSh); + LIB_FUNCTION("papHVcWkO5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSi); + LIB_FUNCTION("1nylaCTiH08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSj); + LIB_FUNCTION("k9kErpz2Sv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSl); + LIB_FUNCTION("OzMC6yz6Row", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSm); + LIB_FUNCTION("au+YxKwehQM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv116__enum_type_infoE); + LIB_FUNCTION("6BYT26CFh58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv117__array_type_infoE); + LIB_FUNCTION("8Vs1AjNm2mE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv117__class_type_infoE); + LIB_FUNCTION("bPUMNZBqRqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv117__pbase_type_infoE); + LIB_FUNCTION("UVft3+rc06o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv119__pointer_type_infoE); + LIB_FUNCTION("4ZXlZy7iRWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv120__function_type_infoE); + LIB_FUNCTION("AQlqO860Ztc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv120__si_class_type_infoE); + LIB_FUNCTION("I1Ru2fZJDoE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv121__vmi_class_type_infoE); + LIB_FUNCTION("6WYrZgAyjuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv123__fundamental_type_infoE); + LIB_FUNCTION("K+w0ofCSsAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN10__cxxabiv129__pointer_to_member_type_infoE); + LIB_FUNCTION("y-bbIiLALd4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN6Dinkum7threads10lock_errorE); + LIB_FUNCTION("hmHH6DsLWgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSN6Dinkum7threads21thread_resource_errorE); + LIB_FUNCTION("RVDooP5gZ4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSNSt6locale5facetE); + LIB_FUNCTION("JjTc4SCuILE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSNSt6locale7_LocimpE); + LIB_FUNCTION("C-3N+mEQli4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSNSt8ios_base7failureE); + LIB_FUNCTION("p07Yvdjjoo4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPa); + LIB_FUNCTION("ickyvjtMLm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPb); + LIB_FUNCTION("jJtoPFrxG-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPc); + LIB_FUNCTION("dIxG0L1esAI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPd); + LIB_FUNCTION("TSMc8vgtvHI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPDi); + LIB_FUNCTION("cj+ge8YLU7s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPDn); + LIB_FUNCTION("mQCm5NmJORg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPDs); + LIB_FUNCTION("N84qS6rJuGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPe); + LIB_FUNCTION("DN0xDLRXD2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPf); + LIB_FUNCTION("HHVZLHmCfI4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPh); + LIB_FUNCTION("g8phA3duRm8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPi); + LIB_FUNCTION("bEbjy6yceWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPj); + LIB_FUNCTION("dSifrMdPVQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKa); + LIB_FUNCTION("qSiIrmgy1D8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKb); + LIB_FUNCTION("wm9QKozFM+s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKc); + LIB_FUNCTION("-7c7thUsi1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKd); + LIB_FUNCTION("lFKA8eMU5PA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKDi); + LIB_FUNCTION("2veyNsXFZuw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKDn); + LIB_FUNCTION("qQ4c52GZlYw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKDs); + LIB_FUNCTION("8Ce6O0B-KpA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKe); + LIB_FUNCTION("emnRy3TNxFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKf); + LIB_FUNCTION("thDTXTikSmc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKh); + LIB_FUNCTION("3Fd+8Pk6fgE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKi); + LIB_FUNCTION("6azovDgjxt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKj); + LIB_FUNCTION("QdPk9cbJrOY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKl); + LIB_FUNCTION("ER8-AFoFDfM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKm); + LIB_FUNCTION("5rD2lCo4688", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKs); + LIB_FUNCTION("iWMhoHS8gqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKt); + LIB_FUNCTION("3op2--wf660", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKv); + LIB_FUNCTION("h64u7Gu3-TM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKw); + LIB_FUNCTION("3THnS7v0D+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKx); + LIB_FUNCTION("h+xQETZ+6Yo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPKy); + LIB_FUNCTION("6cfcRTPD2zU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPl); + LIB_FUNCTION("OXkzGA9WqVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPm); + LIB_FUNCTION("6XcQYYO2YMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPs); + LIB_FUNCTION("8OSy0MMQ7eI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPt); + LIB_FUNCTION("s1b2SRBzSAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPv); + LIB_FUNCTION("4r--aFJyPpI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPw); + LIB_FUNCTION("pc4-Lqosxgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPx); + LIB_FUNCTION("VJL9W+nOv1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSPy); + LIB_FUNCTION("VenLJSDuDXY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSs); + LIB_FUNCTION("46haDPRVtPo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSi); + LIB_FUNCTION("RgJjmluR+QA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSo); + LIB_FUNCTION("ALcclvT4W3Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt10bad_typeid); + LIB_FUNCTION("idsapmYZ49w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt10ctype_base); + LIB_FUNCTION("VxObo0uiafo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt10money_base); + LIB_FUNCTION("h+iBEkE50Zs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt10moneypunctIcLb0EE); + LIB_FUNCTION("o4DiZqXId90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt10moneypunctIcLb1EE); + LIB_FUNCTION("MxGclWMtl4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt10moneypunctIwLb0EE); + LIB_FUNCTION("J+hjiBreZr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt10moneypunctIwLb1EE); + LIB_FUNCTION("FAah-AY8+vY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt11_Facet_base); + LIB_FUNCTION("VNHXByo1yuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt11logic_error); + LIB_FUNCTION("msxwgUAPy-Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt11range_error); + LIB_FUNCTION("UG6HJeH5GNI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt11regex_error); + LIB_FUNCTION("P7l9+yBL5VU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt12bad_weak_ptr); + LIB_FUNCTION("NXKsxT-x76M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt12codecvt_base); + LIB_FUNCTION("2ud1bFeR0h8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt12domain_error); + LIB_FUNCTION("YeBP0Rja7vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt12future_error); + LIB_FUNCTION("zEhcQGEiPik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt12length_error); + LIB_FUNCTION("eNW5jsFxS6k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt12out_of_range); + LIB_FUNCTION("XRxuwvN++2w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt12system_error); + LIB_FUNCTION("G8z7rz17xYM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt13bad_exception); + LIB_FUNCTION("WYWf+rJuDVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt13basic_filebufIcSt11char_traitsIcEE); + LIB_FUNCTION("coVkgLzNtaw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt13basic_filebufIwSt11char_traitsIwEE); + LIB_FUNCTION("N0EHkukBz6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt13messages_base); + LIB_FUNCTION("CX3WC8qekJE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt13runtime_error); + LIB_FUNCTION("u5zp3yXW5wA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt14error_category); + LIB_FUNCTION("iy1lPjADRUs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt14overflow_error); + LIB_FUNCTION("Uea1kfRJ7Oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt15underflow_error); + LIB_FUNCTION("KJutwrVUFUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt16invalid_argument); + LIB_FUNCTION("S8kp05fMCqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt16nested_exception); + LIB_FUNCTION("ql6hz7ZOZTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt17bad_function_call); + LIB_FUNCTION("ObdBkrZylOg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt18bad_variant_access); + LIB_FUNCTION("hBvqSQD5yNk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt20bad_array_new_length); + LIB_FUNCTION("ouo2obDE6yU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt22_Future_error_category); + LIB_FUNCTION("iwIUndpU5ZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt22_System_error_category); + LIB_FUNCTION("88Fre+wfuT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt23_Generic_error_category); + LIB_FUNCTION("qR6GVq1IplU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt4_Pad); + LIB_FUNCTION("uO6YxonQkJI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt5_IosbIiE); + LIB_FUNCTION("jUQ+FlOMEHk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt5ctypeIcE); + LIB_FUNCTION("1jUJO+TZm5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt5ctypeIwE); + LIB_FUNCTION("LfMY9H6d5mI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7_MpunctIcE); + LIB_FUNCTION("mh9Jro0tcjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7_MpunctIwE); + LIB_FUNCTION("rf0BfDQG1KU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7codecvtIcc9_MbstatetE); + LIB_FUNCTION("Tt3ZSp9XD4E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7codecvtIDic9_MbstatetE); + LIB_FUNCTION("9XL3Tlgx6lc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7codecvtIDsc9_MbstatetE); + LIB_FUNCTION("YrYO5bTIPqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7codecvtIwc9_MbstatetE); + LIB_FUNCTION("wElyE0OmoRw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7collateIcE); + LIB_FUNCTION("BdfPxmlM9bs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7collateIwE); + LIB_FUNCTION("--fMWwCvo+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8bad_cast); + LIB_FUNCTION("Nr+GiZ0tGAk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8ios_base); + LIB_FUNCTION("iUhx-JN27uI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8messagesIcE); + LIB_FUNCTION("5ViZYJRew6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8messagesIwE); + LIB_FUNCTION("2ZqL1jnL8so", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8numpunctIcE); + LIB_FUNCTION("xuEUMolGMwU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8numpunctIwE); + LIB_FUNCTION("22g2xONdXV4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9bad_alloc); + LIB_FUNCTION("TuKJRIKcceA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9basic_iosIcSt11char_traitsIcEE); + LIB_FUNCTION("wYWYC8xNFOI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9basic_iosIwSt11char_traitsIwEE); + LIB_FUNCTION("H61hE9pLBmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9exception); + LIB_FUNCTION("5jX3QET-Jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9time_base); + LIB_FUNCTION("WG7lrmFxyKY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9type_info); + LIB_FUNCTION("f5zmgYKSpIY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSt); + LIB_FUNCTION("mI0SR5s7kxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSv); + LIB_FUNCTION("UXS8VgAnIP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSw); + LIB_FUNCTION("N8KLCZc3Y1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSx); + LIB_FUNCTION("kfuINXyHayQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSy); + LIB_FUNCTION("0bGGr4zLE3w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSiD0Ev); + LIB_FUNCTION("+Uuj++A+I14", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSiD1Ev); + LIB_FUNCTION("QJJ-4Dgm8YQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSoD0Ev); + LIB_FUNCTION("kvqg376KsJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSoD1Ev); + LIB_FUNCTION("fjni7nkqJ4M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv116__enum_type_infoE); + LIB_FUNCTION("aMQhMoYipk4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv117__array_type_infoE); + LIB_FUNCTION("byV+FWlAnB4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv117__class_type_infoE); + LIB_FUNCTION("7EirbE7st4E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv117__pbase_type_infoE); + LIB_FUNCTION("aeHxLWwq0gQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv119__pointer_type_infoE); + LIB_FUNCTION("CSEjkTYt5dw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv120__function_type_infoE); + LIB_FUNCTION("pZ9WXcClPO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv120__si_class_type_infoE); + LIB_FUNCTION("9ByRMdo7ywg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv121__vmi_class_type_infoE); + LIB_FUNCTION("G4XM-SS1wxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv123__fundamental_type_infoE); + LIB_FUNCTION("2H51caHZU0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN10__cxxabiv129__pointer_to_member_type_infoE); + LIB_FUNCTION("WJU9B1OjRbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN6Dinkum7threads10lock_errorE); + LIB_FUNCTION("ouXHPXjKUL4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVN6Dinkum7threads21thread_resource_errorE); + LIB_FUNCTION("QGkJzBs3WmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVNSt6locale7_LocimpE); + LIB_FUNCTION("yLE5H3058Ao", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVNSt8ios_base7failureE); + LIB_FUNCTION("+8jItptyeQQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSi); + LIB_FUNCTION("qjyK90UVVCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSo); + LIB_FUNCTION("jRLwj8TLcQY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt10bad_typeid); + LIB_FUNCTION("XbFyGCk3G2s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt10moneypunctIcLb0EE); + LIB_FUNCTION("MfyPz2J5E0I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt10moneypunctIcLb1EE); + LIB_FUNCTION("RfpPDUaxVJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt10moneypunctIwLb0EE); + LIB_FUNCTION("APrAh-3-ICg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt10moneypunctIwLb1EE); + LIB_FUNCTION("udTM6Nxx-Ng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt11logic_error); + LIB_FUNCTION("RbzWN8X21hY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt11range_error); + LIB_FUNCTION("c-EfVOIbo8M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt11regex_error); + LIB_FUNCTION("apHKv46QaCw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt12bad_weak_ptr); + LIB_FUNCTION("oAidKrxuUv0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt12domain_error); + LIB_FUNCTION("6-LMlTS1nno", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt12future_error); + LIB_FUNCTION("cqvea9uWpvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt12length_error); + LIB_FUNCTION("n+aUKkC-3sI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt12out_of_range); + LIB_FUNCTION("Bq8m04PN1zw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt12system_error); + LIB_FUNCTION("Gvp-ypl9t5E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt13bad_exception); + LIB_FUNCTION("rSADYzp-RTU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt13basic_filebufIcSt11char_traitsIcEE); + LIB_FUNCTION("Tx5Y+BQJrzs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt13basic_filebufIwSt11char_traitsIwEE); + LIB_FUNCTION("-L+-8F0+gBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt13runtime_error); + LIB_FUNCTION("lF66NEAqanc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt14error_category); + LIB_FUNCTION("Azw9C8cy7FY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt14overflow_error); + LIB_FUNCTION("ZrFcJ-Ab0vw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt15underflow_error); + LIB_FUNCTION("keXoyW-rV-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt16invalid_argument); + LIB_FUNCTION("j6qwOi2Nb7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt16nested_exception); + LIB_FUNCTION("wuOrunkpIrU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt17bad_function_call); + LIB_FUNCTION("AZGKZIVok6U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt18bad_variant_access); + LIB_FUNCTION("Z+vcX3rnECg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt20bad_array_new_length); + LIB_FUNCTION("YHfG3-K23CY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt22_Future_error_category); + LIB_FUNCTION("qTwVlzGoViY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt22_System_error_category); + LIB_FUNCTION("UuVHsmfVOHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt23_Generic_error_category); + LIB_FUNCTION("CRoMIoZkYhU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt4_Pad); + LIB_FUNCTION("GKWcAz6-G7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt5ctypeIcE); + LIB_FUNCTION("qdHsu+gIxRo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt5ctypeIwE); + LIB_FUNCTION("6gAhNHCNHxY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7_MpunctIcE); + LIB_FUNCTION("+hlZqs-XpUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7_MpunctIwE); + LIB_FUNCTION("aK1Ymf-NhAs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7codecvtIcc9_MbstatetE); + LIB_FUNCTION("9H2BStEAAMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7codecvtIDic9_MbstatetE); + LIB_FUNCTION("jlNI3SSF41o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7codecvtIDsc9_MbstatetE); + LIB_FUNCTION("H-TDszhsYuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7codecvtIwc9_MbstatetE); + LIB_FUNCTION("ruZtIwbCFjk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7collateIcE); + LIB_FUNCTION("rZwUkaQ02J4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7collateIwE); + LIB_FUNCTION("tVHE+C8vGXk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8bad_cast); + LIB_FUNCTION("AJsqpbcCiwY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8ios_base); + LIB_FUNCTION("FnEnECMJGag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8messagesIcE); + LIB_FUNCTION("2FezsYwelgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8messagesIwE); + LIB_FUNCTION("lJnP-cn0cvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8numpunctIcE); + LIB_FUNCTION("Gtsl8PUl40U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8numpunctIwE); + LIB_FUNCTION("EMNG6cHitlQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt9bad_alloc); + LIB_FUNCTION("dCzeFfg9WWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt9exception); + LIB_FUNCTION("749AEdSd4Go", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt9type_info); + LIB_FUNCTION( + "jfq92K8E1Vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); + LIB_FUNCTION( + "AoZRvn-vaq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); + LIB_FUNCTION("L1SBTkC+Cvw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_abort); + LIB_FUNCTION("SmYrO79NzeI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_abort_handler_s); + LIB_FUNCTION("DQXJraCc1rA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_alarm); + LIB_FUNCTION("2Btkg8k24Zg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_aligned_alloc); + LIB_FUNCTION("jT3xiGpA3B4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asctime); + LIB_FUNCTION("qPe7-h5Jnuc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asctime_s); + LIB_FUNCTION("HC8vbJStYVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_at_quick_exit); + LIB_FUNCTION("8G2LB+A3rzg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atexit); + LIB_FUNCTION("SRI6S9B+-a4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atof); + LIB_FUNCTION("fPxypibz2MY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atoi); + LIB_FUNCTION("+my9jdHCMIQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atol); + LIB_FUNCTION("fLcU5G6Qrjs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atoll); + LIB_FUNCTION("rg5JEBlKCuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_basename); + LIB_FUNCTION("vsK6LzRtRLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_basename_r); + LIB_FUNCTION("5TjaJwkLWxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_bcmp); + LIB_FUNCTION("RMo7j0iTPfA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_bcopy); + LIB_FUNCTION("NesIgTmfF0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_bsearch); + LIB_FUNCTION("hzX87C+zDAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_bsearch_s); + LIB_FUNCTION("LEvm25Sxi7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_btowc); + LIB_FUNCTION("9oiX1kyeedA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_bzero); + LIB_FUNCTION("EOLQfNZ9HpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_c16rtomb); + LIB_FUNCTION("MzsycG6RYto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_c32rtomb); + LIB_FUNCTION("2X5agFjKxMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_calloc); + LIB_FUNCTION("5ZkEP3Rq7As", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cbrt); + LIB_FUNCTION("GlelR9EEeck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_cbrtf); + LIB_FUNCTION("lO01m-JcDqM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_cbrtl); + LIB_FUNCTION("St9nbxSoezk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_clearerr); + LIB_FUNCTION("cYNk9M+7YkY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_clearerr_unlocked); + LIB_FUNCTION("QZP6I9ZZxpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_clock); + LIB_FUNCTION("n8onIBR4Qdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_clock_1700); + LIB_FUNCTION("XepdqehVYe4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_closedir); + LIB_FUNCTION("BEFy1ZFv8Fw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_copysign); + LIB_FUNCTION("x-04iOzl1xs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_copysignf); + LIB_FUNCTION("j84nSG4V0B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_copysignl); + LIB_FUNCTION("0uAUs3hYuG4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ctime); + LIB_FUNCTION("2UFh+YKfuzk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ctime_s); + LIB_FUNCTION("Wn6I3wVATUE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_daemon); + LIB_FUNCTION("tOicWgmk4ZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_daylight); + LIB_FUNCTION("fqLrWSWcGHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_devname); + LIB_FUNCTION("BIALMFTZ75I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_devname_r); + LIB_FUNCTION("-VVn74ZyhEs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_difftime); + LIB_FUNCTION("E4wZaG1zSFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_dirname); + LIB_FUNCTION("2gbcltk3swE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_div); + LIB_FUNCTION("WIg11rA+MRY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_drand48); + LIB_FUNCTION("5OpjqFs8yv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_drem); + LIB_FUNCTION("Gt5RT417EGA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_dremf); + LIB_FUNCTION("Fncgcl1tnXg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_erand48); + LIB_FUNCTION("oXgaqGVnW5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erf); + LIB_FUNCTION("arIKLlen2sg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erfc); + LIB_FUNCTION("IvF98yl5u4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_erfcf); + LIB_FUNCTION("f2YbMj0gBf8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_erfcl); + LIB_FUNCTION("RePA3bDBJqo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erff); + LIB_FUNCTION("fNH4tsl7rB8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erfl); + LIB_FUNCTION("aeeMZ0XrNsY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_err); + LIB_FUNCTION("9aODPZAKOmA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_err_set_exit); + LIB_FUNCTION("FihG2CudUNs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_err_set_file); + LIB_FUNCTION("L-jLYJFP9Mc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_errc); + LIB_FUNCTION("t8sFCgJAClE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_errx); + LIB_FUNCTION("uMei1W9uyNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exit); + LIB_FUNCTION("uodLYyUip20", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fclose); + LIB_FUNCTION("cBSM-YB7JVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fcloseall); + LIB_FUNCTION("Zs4p6RemDxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fdim); + LIB_FUNCTION("yb9iUBPkSS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fdimf); + LIB_FUNCTION("IMt+UO5YoQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fdiml); + LIB_FUNCTION("qdlHjTa9hQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fdopen); + LIB_FUNCTION("j+XjoRSIvwU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fdopendir); + LIB_FUNCTION("cqt8emEH3kQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_feclearexcept); + LIB_FUNCTION("y4WlO8qzHqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fedisableexcept); + LIB_FUNCTION("utLW7uXm3Ss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_feenableexcept); + LIB_FUNCTION("psx0YiAKm7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fegetenv); + LIB_FUNCTION("VtRkfsD292M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fegetexcept); + LIB_FUNCTION("myQDQapYJdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fegetexceptflag); + LIB_FUNCTION("AeZTCCm1Qqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fegetround); + LIB_FUNCTION("P38JvXuK-uE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fegettrapenable); + LIB_FUNCTION("1kduKXMqx7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_feholdexcept); + LIB_FUNCTION("LxcEU+ICu8U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_feof); + LIB_FUNCTION("NuydofHcR1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_feof_unlocked); + LIB_FUNCTION("NIfFNcyeCTo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_feraiseexcept); + LIB_FUNCTION("AHxyhN96dy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ferror); + LIB_FUNCTION("yxbGzBQC5xA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ferror_unlocked); + LIB_FUNCTION("Q-bLp+b-RVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fesetenv); + LIB_FUNCTION("FuxaUZsWTok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fesetexceptflag); + LIB_FUNCTION("hAJZ7-FBpEQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fesetround); + LIB_FUNCTION("u5a7Ofymqlg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fesettrapenable); + LIB_FUNCTION("pVjisbvtQKU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fetestexcept); + LIB_FUNCTION("YXQ4gXamCrY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_feupdateenv); + LIB_FUNCTION("MUjC4lbHrK4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fflush); + LIB_FUNCTION("AEuF3F2f8TA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fgetc); + LIB_FUNCTION("KKgUiHSYGRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fgetln); + LIB_FUNCTION("SHlt7EhOtqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fgetpos); + LIB_FUNCTION("KdP-nULpuGw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fgets); + LIB_FUNCTION("bzbQ5zQ2Y3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fgetwc); + LIB_FUNCTION("F81hKe2k2tg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fgetws); + LIB_FUNCTION("Fm-dmyywH9Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fileno); + LIB_FUNCTION("kxm0z4T5mMI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fileno_unlocked); + LIB_FUNCTION("TJFQFm+W3wg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_finite); + LIB_FUNCTION("2nqzJ87zsB8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_finitef); + LIB_FUNCTION("hGljHZEfF0U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_flockfile); + LIB_FUNCTION("G3qjOUu7KnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_flsl); + LIB_FUNCTION("YKbL5KR6RDI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fma); + LIB_FUNCTION("RpTR+VY15ss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmaf); + LIB_FUNCTION("uMeLdbwheag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmal); + LIB_FUNCTION("xeYO4u7uyJ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fopen); + LIB_FUNCTION("NL836gOLANs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fopen_s); + LIB_FUNCTION("y1Ch2nXs4IQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fpurge); + LIB_FUNCTION("aZK8lNei-Qw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fputc); + LIB_FUNCTION("QrZZdJ8XsX0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fputs); + LIB_FUNCTION("1QJWxoB6pCo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fputwc); + LIB_FUNCTION("-7nRJFXMxnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fputws); + LIB_FUNCTION("lbB+UlZqVG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fread); + LIB_FUNCTION("N2OjwJJGjeQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_freeifaddrs); + LIB_FUNCTION("gkWgn0p1AfU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_freopen); + LIB_FUNCTION("NdvAi34vV3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_freopen_s); + LIB_FUNCTION("rQFVBXp-Cxg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fseek); + LIB_FUNCTION("pkYiKw09PRA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fseeko); + LIB_FUNCTION("7PkSz+qnTto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fsetpos); + LIB_FUNCTION("6IM2up2+a-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fstatvfs); + LIB_FUNCTION("Qazy8LmXTvw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ftell); + LIB_FUNCTION("5qP1iVQkdck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ftello); + LIB_FUNCTION("h05OHOMZNMw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ftrylockfile); + LIB_FUNCTION("vAc9y8UQ31o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_funlockfile); + LIB_FUNCTION("w6Aq68dFoP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fwide); + LIB_FUNCTION("MpxhMh8QFro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fwrite); + LIB_FUNCTION("BD-xV2fLe2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gamma); + LIB_FUNCTION("q+AdV-EHiKc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gamma_r); + LIB_FUNCTION("sZ93QMbGRJY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gammaf); + LIB_FUNCTION("E3RYvWbYLgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gammaf_r); + LIB_FUNCTION("8Q60JLJ6Rv4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_getc); + LIB_FUNCTION("5tM252Rs2fc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getc_unlocked); + LIB_FUNCTION("L3XZiuKqZUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getchar); + LIB_FUNCTION("H0pVDvSuAVQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getchar_unlocked); + LIB_FUNCTION("DYivN1nO-JQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getcwd); + LIB_FUNCTION("smbQukfxYJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getenv); + LIB_FUNCTION("-nvxBWa0iDs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gethostname); + LIB_FUNCTION("j-gWL6wDros", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getifaddrs); + LIB_FUNCTION("VUtibKJCt1o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getopt); + LIB_FUNCTION("8VVXJxB5nlk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getopt_long); + LIB_FUNCTION("oths6jEyBqo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getopt_long_only); + LIB_FUNCTION("7Psx1DlAyE4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getprogname); + LIB_FUNCTION("Ok+SYcoL19Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_gets); + LIB_FUNCTION("lb+HLLZkbbw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gets_s); + LIB_FUNCTION("AoLA2MRWJvc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_getw); + LIB_FUNCTION("CosTELN5ETk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getwc); + LIB_FUNCTION("n2mWDsholo8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_getwchar); + LIB_FUNCTION("1mecP7RgI2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gmtime); + LIB_FUNCTION("5bBacGLyLOs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_gmtime_s); + LIB_FUNCTION("YFoOw5GkkK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_hypot); + LIB_FUNCTION("2HzgScoQq9o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_hypot3); + LIB_FUNCTION("xlRcc7Rcqgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_hypot3f); + LIB_FUNCTION("aDmly36AAgI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_hypot3l); + LIB_FUNCTION("iz2shAGFIxc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_hypotf); + LIB_FUNCTION("jJC7x18ge8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_hypotl); + LIB_FUNCTION("ODGONXcSmz4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ignore_handler_s); + LIB_FUNCTION("t3RFHn0bTPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_index); + LIB_FUNCTION("sBBuXmJ5Kjk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_inet_addr); + LIB_FUNCTION("ISTLytNGT0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_inet_aton); + LIB_FUNCTION("7iTp7O6VOXQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_inet_ntoa); + LIB_FUNCTION("i3E1Ywn4t+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_inet_ntoa_r); + LIB_FUNCTION("IIUY-5hk-4k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_initstate); + LIB_FUNCTION("4uJJNi+C9wk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isalnum); + LIB_FUNCTION("+xU0WKT8mDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isalpha); + LIB_FUNCTION("lhnrCOBiTGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isblank); + LIB_FUNCTION("akpGErA1zdg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iscntrl); + LIB_FUNCTION("JWBr5N8zyNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isdigit); + LIB_FUNCTION("rrgxakQtvc0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isgraph); + LIB_FUNCTION("eGkOpTojJl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isprint); + LIB_FUNCTION("I6Z-684E2C4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ispunct); + LIB_FUNCTION("wazw2x2m3DQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isspace); + LIB_FUNCTION("wDmL2EH0CBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswalnum); + LIB_FUNCTION("D-qDARDb1aM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswalpha); + LIB_FUNCTION("p6DbM0OAHNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswblank); + LIB_FUNCTION("6A+1YZ79qFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswcntrl); + LIB_FUNCTION("45E7omS0vvc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswctype); + LIB_FUNCTION("n0kT+8Eeizs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswdigit); + LIB_FUNCTION("wjG0GyCyaP0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswgraph); + LIB_FUNCTION("Ok8KPy3nFls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswlower); + LIB_FUNCTION("U7IhU4VEB-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswprint); + LIB_FUNCTION("AEPvEZkaLsU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswpunct); + LIB_FUNCTION("vqtytrxgLMs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswspace); + LIB_FUNCTION("1QcrrL9UDRQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswupper); + LIB_FUNCTION("cjmSjRlnMAs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_iswxdigit); + LIB_FUNCTION("srzSVSbKn7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isxdigit); + LIB_FUNCTION("tcN0ngcXegg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j0); + LIB_FUNCTION("RmE3aE8WHuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j0f); + LIB_FUNCTION("BNbWdC9Jg+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j1); + LIB_FUNCTION("uVXcivvVHzU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j1f); + LIB_FUNCTION("QdE7Arjzxos", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_jn); + LIB_FUNCTION("M5KJmq-gKM8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_jnf); + LIB_FUNCTION("M7KmRg9CERk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_jrand48); + LIB_FUNCTION("xzZiQgReRGE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_labs); + LIB_FUNCTION("wTjDJ6In3Cg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lcong48); + LIB_FUNCTION("JrwFIMzKNr0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ldexp); + LIB_FUNCTION("kn0yiYeExgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ldexpf); + LIB_FUNCTION("aX8H2+BBlWE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ldexpl); + LIB_FUNCTION("gfP0im5Z3g0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_ldiv); + LIB_FUNCTION("o-kMHRBvkbQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lgamma); + LIB_FUNCTION("EjL+gY1G2lk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lgamma_r); + LIB_FUNCTION("i-ifjh3SLBU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lgammaf); + LIB_FUNCTION("RlGUiqyKf9I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lgammaf_r); + LIB_FUNCTION("lPYpsOb9s-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lgammal); + LIB_FUNCTION("rHRr+131ATY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_llabs); + LIB_FUNCTION("iVhJZvAO2aQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lldiv); + LIB_FUNCTION("-431A-YBAks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_llrint); + LIB_FUNCTION("KPsQA0pis8o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_llrintf); + LIB_FUNCTION("6bRANWNYID0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_llrintl); + LIB_FUNCTION("w-BvXF4O6xo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_llround); + LIB_FUNCTION("eQhBFnTOp40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_llroundf); + LIB_FUNCTION("wRs5S54zjm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_llroundl); + LIB_FUNCTION("0hlfW1O4Aa4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_localeconv); + LIB_FUNCTION("efhK-YSUYYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_localtime); + LIB_FUNCTION("fiiNDnNBKVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_localtime_s); + LIB_FUNCTION("lKEN2IebgJ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_longjmp); + LIB_FUNCTION("5IpoNfxu84U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lrand48); + LIB_FUNCTION("VOKOgR7L-2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lrint); + LIB_FUNCTION("rcVv5ivMhY0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lrintf); + LIB_FUNCTION("jp2e+RSrcow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lrintl); + LIB_FUNCTION("GipcbdDM5cI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_makecontext); + LIB_FUNCTION("hew0fReI2H0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mblen); + LIB_FUNCTION("j6OnScWpu7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbrlen); + LIB_FUNCTION("ogPDBoLmCcA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbrtoc16); + LIB_FUNCTION("TEd4egxRmdE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbrtoc32); + LIB_FUNCTION("qVHpv0PxouI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbrtowc); + LIB_FUNCTION("UbnVmck+o10", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbsinit); + LIB_FUNCTION("8hygs6D9KBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbsrtowcs); + LIB_FUNCTION("1NFvAuzw8dA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbsrtowcs_s); + LIB_FUNCTION("VUzjXknPPBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbstowcs); + LIB_FUNCTION("tdcAqgCS+uI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbstowcs_s); + LIB_FUNCTION("6eU9xX9oEdQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mbtowc); + LIB_FUNCTION("HWEOv0+n7cU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mergesort); + LIB_FUNCTION("n7AepwR0s34", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mktime); + LIB_FUNCTION("0WMHDb5Dt94", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_modf); + LIB_FUNCTION("3+UPM-9E6xY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_modff); + LIB_FUNCTION("tG8pGyxdLEs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_modfl); + LIB_FUNCTION("k-l0Jth-Go8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_mrand48); + LIB_FUNCTION("cJLTwtKGXJk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nearbyint); + LIB_FUNCTION("c+4r-T-tEIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nearbyintf); + LIB_FUNCTION("6n23e0gIJ9s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nearbyintl); + LIB_FUNCTION("ZT4ODD2Ts9o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_Need_sceLibcInternal); + LIB_FUNCTION("h+J60RRlfnk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nextafter); + LIB_FUNCTION("3m2ro+Di+Ck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nextafterf); + LIB_FUNCTION("R0-hvihVoy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nextafterl); + LIB_FUNCTION("-Q6FYBO4sn0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nexttoward); + LIB_FUNCTION("QaTrhMKUT18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nexttowardf); + LIB_FUNCTION("ryyn6-WJm6U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nexttowardl); + LIB_FUNCTION("3wcYIMz8LUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_nrand48); + LIB_FUNCTION("ay3uROQAc5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_opendir); + LIB_FUNCTION("zG0BNJOZdm4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_optarg); + LIB_FUNCTION("yaFXXViLWPw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_opterr); + LIB_FUNCTION("zCnSJWp-Qj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_optind); + LIB_FUNCTION("FwzVaZ8Vnus", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_optopt); + LIB_FUNCTION("CZNm+oNmB-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_optreset); + LIB_FUNCTION("EMutwaQ34Jo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_perror); + LIB_FUNCTION("3Nr9caNHhyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawn); + LIB_FUNCTION("Heh4KJwyoX8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawn_file_actions_addclose); + LIB_FUNCTION("LG6O0oW9bQU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawn_file_actions_adddup2); + LIB_FUNCTION("Sj7y+JO5PcM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawn_file_actions_addopen); + LIB_FUNCTION("Ud8CbISKRGM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawn_file_actions_destroy); + LIB_FUNCTION("p--TkNVsXjA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawn_file_actions_init); + LIB_FUNCTION("Hq9-2AMG+ks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_destroy); + LIB_FUNCTION("7BGUDQDJu-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_getflags); + LIB_FUNCTION("Q-GfRQNi66I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_getpgroup); + LIB_FUNCTION("jbgqYhmVEGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_getschedparam); + LIB_FUNCTION("KUYSaO1qv0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_getschedpolicy); + LIB_FUNCTION("7pASQ1hhH00", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_getsigdefault); + LIB_FUNCTION("wvqDod5pVZg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_getsigmask); + LIB_FUNCTION("44hlATrd47U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_init); + LIB_FUNCTION("UV4m0bznVtU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_setflags); + LIB_FUNCTION("aPDKI3J8PqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_setpgroup); + LIB_FUNCTION("SFlW4kqPgU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_setschedparam); + LIB_FUNCTION("fBne7gcou0s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_setschedpolicy); + LIB_FUNCTION("Ani6e+T-y6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_setsigdefault); + LIB_FUNCTION("wCavZQ+m1PA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnattr_setsigmask); + LIB_FUNCTION("IUfBO5UIZNc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_spawnp); + LIB_FUNCTION("tjuEJo1obls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_psignal); + LIB_FUNCTION("tLB5+4TEOK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_putc); + LIB_FUNCTION("H-QeERgWuTM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_putc_unlocked); + LIB_FUNCTION("m5wN+SwZOR4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_putchar); + LIB_FUNCTION("v95AEAzqm+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_putchar_unlocked); + LIB_FUNCTION("t1ytXodWUH0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_putenv); + LIB_FUNCTION("YQ0navp+YIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_puts); + LIB_FUNCTION("DwcWtj3tSPA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_putw); + LIB_FUNCTION("UZJnC81pUCw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_putwc); + LIB_FUNCTION("aW9KhGC4cOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_putwchar); + LIB_FUNCTION("AEJdIVZTEmo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_qsort); + LIB_FUNCTION("G7yOZJObV+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_qsort_s); + LIB_FUNCTION("qdGFBoLVNKI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_quick_exit); + LIB_FUNCTION("cpCOXWMgha0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_rand); + LIB_FUNCTION("dW3xsu3EgFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_rand_r); + LIB_FUNCTION("w1o05aHJT4c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_random); + LIB_FUNCTION("lybyyKtP54c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_readdir); + LIB_FUNCTION("J0kng1yac3M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_readdir_r); + LIB_FUNCTION("vhtcIgZG-Lk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_realpath); + LIB_FUNCTION("eS+MVq+Lltw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_remainderf); + LIB_FUNCTION("MvdnffYU3jg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_remainderl); + LIB_FUNCTION("MZO7FXyAPU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_remove); + LIB_FUNCTION("XI0YDgH8x1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_remquo); + LIB_FUNCTION("AqpZU2Njrmk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_remquof); + LIB_FUNCTION("Fwow0yyW0nI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_remquol); + LIB_FUNCTION("3QIPIh-GDjw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_rewind); + LIB_FUNCTION("kCKHi6JYtmM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_rewinddir); + LIB_FUNCTION("CWiqHSTO5hk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_rindex); + LIB_FUNCTION("LxGIYYKwKYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_rint); + LIB_FUNCTION("q5WzucyVSkM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_rintf); + LIB_FUNCTION("Yy5yMiZHBIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_rintl); + LIB_FUNCTION("nlaojL9hDtA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_round); + LIB_FUNCTION("DDHG1a6+3q0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_roundf); + LIB_FUNCTION("8F1ctQaP0uk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_roundl); + LIB_FUNCTION("HI4N2S6ZWpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalb); + LIB_FUNCTION("rjak2Xm+4mE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalbf); + LIB_FUNCTION("7Jp3g-qTgZw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalbln); + LIB_FUNCTION("S6LHwvK4h8c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalblnf); + LIB_FUNCTION("NFxDIuqfmgw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalblnl); + LIB_FUNCTION("KGKBeVcqJjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalbn); + LIB_FUNCTION("9fs1btfLoUs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalbnf); + LIB_FUNCTION("l3fh3QW0Tss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scalbnl); + LIB_FUNCTION("aqqpmI7-1j0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcDebugOut); + LIB_FUNCTION("Sj3fKG7MwMk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcHeapGetAddressRanges); + LIB_FUNCTION("HFtbbWvBO+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcHeapMutexCalloc); + LIB_FUNCTION("jJKMkpqQr7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcHeapMutexFree); + LIB_FUNCTION("4iOzclpv1M0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcHeapSetAddressRangeCallback); + LIB_FUNCTION("M6qiY0nhk54", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcHeapSetTraceMarker); + LIB_FUNCTION("RlhJVAYLSqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcHeapUnsetTraceMarker); + LIB_FUNCTION("YrL-1y6vfyo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcInternalMemoryGetWakeAddr); + LIB_FUNCTION("h8jq9ee4h5c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcInternalMemoryMutexEnable); + LIB_FUNCTION("LXqt47GvaRA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcInternalSetMallocCallback); + LIB_FUNCTION("HmgKoOWpUc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sceLibcOnce); + LIB_FUNCTION("2g5wco7AAHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_seed48); + LIB_FUNCTION("7WoI+lVawlc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_seekdir); + LIB_FUNCTION("ENLfKJEZTjE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_set_constraint_handler_s); + LIB_FUNCTION("vZMcAfsA31I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_setbuf); + LIB_FUNCTION("M4YYbSFfJ8g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_setenv); + LIB_FUNCTION("gNQ1V2vfXDE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_setjmp); + LIB_FUNCTION("PtsB1Q9wsFA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_setlocale); + LIB_FUNCTION("woQta4WRpk0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_setstate); + LIB_FUNCTION("QMFyLoqNxIg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_setvbuf); + LIB_FUNCTION("Bm3k7JQMN5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sigblock); + LIB_FUNCTION("TsrS8nGDQok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_siginterrupt); + LIB_FUNCTION("SQGxZCv3aYk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_signalcontext); + LIB_FUNCTION("5gOOC0kzW0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_signgam); + LIB_FUNCTION("Az3tTyAy380", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_significand); + LIB_FUNCTION("L2YaHYQdmHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_significandf); + LIB_FUNCTION("cJvOg1KV8uc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sigsetmask); + LIB_FUNCTION("yhxKO9LYc8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sigvec); + LIB_FUNCTION("+KSnjvZ0NMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_srand48); + LIB_FUNCTION("sPC7XE6hfFY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_srandom); + LIB_FUNCTION("a2MOZf++Wjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_srandomdev); + LIB_FUNCTION("ayTeobcoGj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_statvfs); + LIB_FUNCTION("+CUrIMpVuaM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_stderr); + LIB_FUNCTION("omQZ36ESr98", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_stdin); + LIB_FUNCTION("3eGXiXpFLt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_stdout); + LIB_FUNCTION("ZSnX-xZBGCg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_stpcpy); + LIB_FUNCTION("ZD+Dp+-LsGg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sys_nsig); + LIB_FUNCTION("yCdGspbNHZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sys_siglist); + LIB_FUNCTION("Y16fu+FC+3Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sys_signame); + LIB_FUNCTION("UNS2V4S097M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_syslog); + LIB_FUNCTION("RZA5RZawY04", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_telldir); + LIB_FUNCTION("b7J3q7-UABY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tgamma); + LIB_FUNCTION("B2ZbqV9geCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tgammaf); + LIB_FUNCTION("FU03r76UxaU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tgammal); + LIB_FUNCTION("wLlFkwG9UcQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_time); + LIB_FUNCTION("-Oet9AHzwtU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_timezone); + LIB_FUNCTION("PqF+kHW-2WQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tolower); + LIB_FUNCTION("TYE4irxSmko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_toupper); + LIB_FUNCTION("BEKIcbCV-MU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_towctrans); + LIB_FUNCTION("J3J1T9fjUik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_towlower); + LIB_FUNCTION("1uf1SQsj5go", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_towupper); + LIB_FUNCTION("a4gLGspPEDM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_trunc); + LIB_FUNCTION("Vo8rvWtZw3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_truncf); + LIB_FUNCTION("apdxz6cLMh8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_truncl); + LIB_FUNCTION("BAYjQubSZT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tzname); + LIB_FUNCTION("gYFKAMoNEfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tzset); + LIB_FUNCTION("-LFO7jhD5CE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ungetc); + LIB_FUNCTION("Nz7J62MvgQs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ungetwc); + LIB_FUNCTION("CRJcH8CnPSI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_unsetenv); + LIB_FUNCTION("1nTKA7pN1jw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_utime); + LIB_FUNCTION("aoTkxU86Mr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_verr); + LIB_FUNCTION("7Pc0nOTw8po", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_verrc); + LIB_FUNCTION("ItC2hTrYvHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_verrx); + LIB_FUNCTION("zxecOOffO68", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsyslog); + LIB_FUNCTION("s67G-KeDKOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vwarn); + LIB_FUNCTION("BfAsxVvQVTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vwarnc); + LIB_FUNCTION("iH+oMJn8YPk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vwarnx); + LIB_FUNCTION("3Rhy2gXDhwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_warn); + LIB_FUNCTION("AqUBdZqHZi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_warnc); + LIB_FUNCTION("aNJaYyn0Ujo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_warnx); + LIB_FUNCTION("y9OoA+P5cjk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcrtomb); + LIB_FUNCTION("oAlR5z2iiCA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcrtomb_s); + LIB_FUNCTION("KZm8HUIX2Rw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcscat); + LIB_FUNCTION("MqeMaVUiyU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcscat_s); + LIB_FUNCTION("Ezzq78ZgHPs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcschr); + LIB_FUNCTION("pNtJdE3x49E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcscmp); + LIB_FUNCTION("fV2xHER+bKE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcscoll); + LIB_FUNCTION("FM5NPnLqBc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcscpy); + LIB_FUNCTION("6f5f-qx4ucA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcscpy_s); + LIB_FUNCTION("7eNus40aGuk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcscspn); + LIB_FUNCTION("XbVXpf5WF28", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsftime); + LIB_FUNCTION("WkkeywLJcgU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcslen); + LIB_FUNCTION("pA9N3VIgEZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsncat); + LIB_FUNCTION("VxG0990tP3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsncat_s); + LIB_FUNCTION("E8wCoUEbfzk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsncmp); + LIB_FUNCTION("0nV21JjYCH8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsncpy); + LIB_FUNCTION("Slmz4HMpNGs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsncpy_s); + LIB_FUNCTION("K+v+cnmGoH4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsnlen_s); + LIB_FUNCTION("H4MCONF+Gps", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcspbrk); + LIB_FUNCTION("g3ShSirD50I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsrchr); + LIB_FUNCTION("sOOMlZoy1pg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsrtombs); + LIB_FUNCTION("79s2tnYQI6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsrtombs_s); + LIB_FUNCTION("x9uumWcxhXU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsspn); + LIB_FUNCTION("7-a7sBHeUQ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstod); + LIB_FUNCTION("7SXNu+0KBYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstof); + LIB_FUNCTION("ljFisaQPwYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstoimax); + LIB_FUNCTION("8ngzWNZzFJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstok); + LIB_FUNCTION("dsXnVxORFdc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstok_s); + LIB_FUNCTION("d3dMyWORw8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstol); + LIB_FUNCTION("LEbYWl9rBc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstold); + LIB_FUNCTION("34nH7v2xvNQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstoll); + LIB_FUNCTION("v7S7LhP2OJc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstombs); + LIB_FUNCTION("sZLrjx-yEx4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstombs_s); + LIB_FUNCTION("5AYcEn7aoro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstoul); + LIB_FUNCTION("DAbZ-Vfu6lQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstoull); + LIB_FUNCTION("1e-q5iIukH8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcstoumax); + LIB_FUNCTION("VuMMb5CfpEw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsxfrm); + LIB_FUNCTION("CL7VJxznu6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wctob); + LIB_FUNCTION("7PxmvOEX3oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wctomb); + LIB_FUNCTION("y3V0bIq38NE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wctomb_s); + LIB_FUNCTION("seyrqIc4ovc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wctrans); + LIB_FUNCTION("+3PtYiUxl-U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wctype); + LIB_FUNCTION("inwDBwEvw18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_xtime_get); + LIB_FUNCTION("RvsFE8j3C38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y0); + LIB_FUNCTION("+tfKv1vt0QQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y0f); + LIB_FUNCTION("vh9aGR3ALP0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y1); + LIB_FUNCTION("gklG+J87Pq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y1f); + LIB_FUNCTION("eWSt5lscApo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_yn); + LIB_FUNCTION("wdPaII721tY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_ynf); + LIB_FUNCTION("GG6441JdYkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_Func_186EB8E3525D6240); + LIB_FUNCTION("QZ9YgTk+yrE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_Func_419F5881393ECAB1); + LIB_FUNCTION("bGuDd3kWVKQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_Func_6C6B8377791654A4); + LIB_FUNCTION("f9LVyN8Ky8g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_Func_7FD2D5C8DF0ACBC8); + LIB_FUNCTION("wUqJ0psUjDo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_Func_C14A89D29B148C3A); }; -} // namespace Libraries::LibcInternal +} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal.h b/src/core/libraries/libc_internal/libc_internal.h index 819c15b4f..4f77ab79a 100644 --- a/src/core/libraries/libc_internal/libc_internal.h +++ b/src/core/libraries/libc_internal/libc_internal.h @@ -10,12 +10,9 @@ class SymbolsResolver; } namespace Libraries::LibcInternal { -void* PS4_SYSV_ABI internal_memset(void* s, int c, size_t n); -void* PS4_SYSV_ABI internal_memcpy(void* dest, const void* src, size_t n); -int PS4_SYSV_ABI internal_memcpy_s(void* dest, size_t destsz, const void* src, size_t count); -int PS4_SYSV_ABI internal_strcpy_s(char* dest, size_t dest_size, const char* src); -int PS4_SYSV_ABI internal_memcmp(const void* s1, const void* s2, size_t n); -float PS4_SYSV_ABI internal_expf(float x); + +// I won't manage definitons of 3000+ functions, and they don't need to be accessed externally, +// so everything is just in the .cpp file void RegisterlibSceLibcInternal(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_io.cpp b/src/core/libraries/libc_internal/libc_internal_io.cpp new file mode 100644 index 000000000..82ff08d50 --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_io.cpp @@ -0,0 +1,472 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include + +#include "common/assert.h" +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "libc_internal_io.h" + +namespace Libraries::LibcInternal { + +s32 PS4_SYSV_ABI internal___vfprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Printf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WPrintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_asprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fwprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fwprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_printf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_printf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_snprintf(char* s, size_t n, const char* format, ...) { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_snprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_snwprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_swprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_swprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_swscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_swscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vasprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfwprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfwprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfwscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vfwscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vprintf(const char* format, va_list args) { + // Copy the va_list because vsnprintf consumes it + va_list args_copy; + va_copy(args_copy, args); + + // Calculate the required buffer size + int size = std::vsnprintf(nullptr, 0, format, args_copy); + va_end(args_copy); + + if (size < 0) { + // Handle vsnprintf error + LOG_ERROR(Lib_LibcInternal, "vsnprintf failed to calculate size"); + return size; + } + + // Create a string with the required size + std::string buffer(size, '\0'); + + // Format the string into the buffer + int result = + std::vsnprintf(buffer.data(), buffer.size() + 1, format, args); // +1 for null terminator + if (result >= 0) { + // Log the formatted result + LOG_INFO(Lib_LibcInternal, "{}", buffer); + } else { + LOG_ERROR(Lib_LibcInternal, "vsnprintf failed during formatting"); + } + + return result; +} + +s32 PS4_SYSV_ABI internal_vprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsnprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsnprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsnwprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vsscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vswprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vswprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vswscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vswscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vwprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vwprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vwscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_vwscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wprintf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wprintf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Scanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__WScanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fwscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fwscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_scanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sscanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sscanf_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceLibcInternalIo(Core::Loader::SymbolsResolver* sym) { + + LIB_FUNCTION("yAZ5vOpmBus", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal___vfprintf); + LIB_FUNCTION("FModQzwn1-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Printf); + LIB_FUNCTION("kvEP5-KOG1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WPrintf); + LIB_FUNCTION("cOYia2dE0Ik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asprintf); + LIB_FUNCTION("fffwELXNVFA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fprintf); + LIB_FUNCTION("-e-F9HjUFp8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fprintf_s); + LIB_FUNCTION("ZRAcn3dPVmA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fwprintf); + LIB_FUNCTION("9kOFELic7Pk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fwprintf_s); + LIB_FUNCTION("a6CYO8YOzfw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fwscanf); + LIB_FUNCTION("Bo5wtXSj4kc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fwscanf_s); + LIB_FUNCTION("hcuQgD53UxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_printf); + LIB_FUNCTION("w1NxRBQqfmQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_printf_s); + LIB_FUNCTION("eLdDw6l0-bU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_snprintf); + LIB_FUNCTION("3BytPOQgVKc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_snprintf_s); + LIB_FUNCTION("jbj2wBoiCyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_snwprintf_s); + LIB_FUNCTION("tcVi5SivF7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sprintf); + LIB_FUNCTION("xEszJVGpybs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sprintf_s); + LIB_FUNCTION("1Pk0qZQGeWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sscanf); + LIB_FUNCTION("24m4Z4bUaoY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sscanf_s); + LIB_FUNCTION("nJz16JE1txM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_swprintf); + LIB_FUNCTION("Im55VJ-Bekc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_swprintf_s); + LIB_FUNCTION("HNnWdT43ues", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_swscanf); + LIB_FUNCTION("tQNolUV1q5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_swscanf_s); + LIB_FUNCTION("qjBlw2cVMAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vasprintf); + LIB_FUNCTION("pDBDcY6uLSA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfprintf); + LIB_FUNCTION("GhTZtaodo7o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfprintf_s); + LIB_FUNCTION("lckWSkHDBrY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfscanf); + LIB_FUNCTION("JjPXy-HX5dY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfscanf_s); + LIB_FUNCTION("M2bGWSqt764", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfwprintf); + LIB_FUNCTION("XX9KWzJvRf0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfwprintf_s); + LIB_FUNCTION("WF4fBmip+38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfwscanf); + LIB_FUNCTION("Wvm90I-TGl0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vfwscanf_s); + LIB_FUNCTION("GMpvxPFW924", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vprintf); + LIB_FUNCTION("YfJUGNPkbK4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vprintf_s); + LIB_FUNCTION("j7Jk3yd3yC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vscanf); + LIB_FUNCTION("fQYpcUzy3zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vscanf_s); + LIB_FUNCTION("Q2V+iqvjgC0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsnprintf); + LIB_FUNCTION("rWSuTWY2JN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsnprintf_s); + LIB_FUNCTION("8SKVXgeK1wY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsnwprintf_s); + LIB_FUNCTION("jbz9I9vkqkk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsprintf); + LIB_FUNCTION("+qitMEbkSWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsprintf_s); + LIB_FUNCTION("UTrpOVLcoOA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsscanf); + LIB_FUNCTION("tfNbpqL3D0M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vsscanf_s); + LIB_FUNCTION("u0XOsuOmOzc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vswprintf); + LIB_FUNCTION("oDoV9tyHTbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vswprintf_s); + LIB_FUNCTION("KGotca3AjYw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vswscanf); + LIB_FUNCTION("39HHkIWrWNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vswscanf_s); + LIB_FUNCTION("QuF2rZGE-v8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vwprintf); + LIB_FUNCTION("XPrliF5n-ww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vwprintf_s); + LIB_FUNCTION("QNwdOK7HfJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vwscanf); + LIB_FUNCTION("YgZ6qvFH3QI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_vwscanf_s); + LIB_FUNCTION("OGVdXU3E-xg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wprintf); + LIB_FUNCTION("FEtOJURNey0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wprintf_s); + LIB_FUNCTION("D8JBAR3RiZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wscanf); + LIB_FUNCTION("RV7X3FrWfTI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wscanf_s); + LIB_FUNCTION("s+MeMHbB1Ro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Scanf); + LIB_FUNCTION("fzgkSILqRHE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__WScanf); + LIB_FUNCTION("npLpPTaSuHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fscanf); + LIB_FUNCTION("vj2WUi2LrfE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fscanf_s); + LIB_FUNCTION("7XEv6NnznWw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scanf); + LIB_FUNCTION("-B76wP6IeVA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_scanf_s); +} + +} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_io.h b/src/core/libraries/libc_internal/libc_internal_io.h new file mode 100644 index 000000000..f5291526b --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_io.h @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::LibcInternal { +void RegisterlibSceLibcInternalIo(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_math.cpp b/src/core/libraries/libc_internal/libc_internal_math.cpp new file mode 100644 index 000000000..781f1f729 --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_math.cpp @@ -0,0 +1,773 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/assert.h" +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "libc_internal_mspace.h" + +namespace Libraries::LibcInternal { + +s32 PS4_SYSV_ABI internal_abs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +double PS4_SYSV_ABI internal_acos(double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::acos(x); +} + +float PS4_SYSV_ABI internal_acosf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::acosf(x); +} + +float PS4_SYSV_ABI internal_acosh(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::acosh(x); +} + +float PS4_SYSV_ABI internal_acoshf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::acoshf(x); +} + +float PS4_SYSV_ABI internal_acoshl(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::acoshl(x); +} + +float PS4_SYSV_ABI internal_acosl(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::acosl(x); +} + +double PS4_SYSV_ABI internal_asin(double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::asin(x); +} + +float PS4_SYSV_ABI internal_asinf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::asinf(x); +} + +float PS4_SYSV_ABI internal_asinh(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::asinh(x); +} + +float PS4_SYSV_ABI internal_asinhf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::asinhf(x); +} + +float PS4_SYSV_ABI internal_asinhl(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::asinhl(x); +} + +float PS4_SYSV_ABI internal_asinl(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::asinl(x); +} + +double PS4_SYSV_ABI internal_atan(double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::atan(x); +} + +double PS4_SYSV_ABI internal_atan2(double y, double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::atan2(y, x); +} + +s32 PS4_SYSV_ABI internal_atan2f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atan2l() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atanh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atanhf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atanhl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_atanl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ceil() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ceilf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ceill() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +double PS4_SYSV_ABI internal_cos(double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::cos(x); +} + +float PS4_SYSV_ABI internal_cosf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::cosf(x); +} + +s32 PS4_SYSV_ABI internal_cosh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_coshf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_coshl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_cosl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +double PS4_SYSV_ABI internal_exp(double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::exp(x); +} + +double PS4_SYSV_ABI internal_exp2(double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::exp2(x); +} + +float PS4_SYSV_ABI internal_exp2f(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::exp2f(x); +} + +float PS4_SYSV_ABI internal_exp2l(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::exp2l(x); +} + +float PS4_SYSV_ABI internal_expf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::expf(x); +} + +s32 PS4_SYSV_ABI internal_expl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_expm1() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_expm1f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_expm1l() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fabs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fabsf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fabsl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_floor() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_floorf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_floorl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmaxf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmaxl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmin() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fminf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fminl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmod() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmodf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_fmodl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_frexp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_frexpf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_frexpl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ilogb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ilogbf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_ilogbl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_imaxabs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_imaxdiv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isinf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_islower() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isnan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isnanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_isupper() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log10() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +float PS4_SYSV_ABI internal_log10f(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::log10f(x); +} + +s32 PS4_SYSV_ABI internal_log10l() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log1p() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log1pf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log1pl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log2f() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_log2l() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_logb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_logbf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_logbl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_logf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_logl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lround() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lroundf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_lroundl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_nanl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +double PS4_SYSV_ABI internal_pow(double x, double y) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::pow(x, y); +} + +float PS4_SYSV_ABI internal_powf(float x, float y) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::powf(x, y); +} + +s32 PS4_SYSV_ABI internal_powl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_remainder() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +double PS4_SYSV_ABI internal_sin(double x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::sin(x); +} + +void PS4_SYSV_ABI internal_sincos(double x, double* sinp, double* cosp) { + LOG_DEBUG(Lib_LibcInternal, "called"); + *sinp = std::sin(x); + *cosp = std::cos(x); +} + +void PS4_SYSV_ABI internal_sincosf(double x, double* sinp, double* cosp) { + LOG_DEBUG(Lib_LibcInternal, "called"); + *sinp = std::sinf(x); + *cosp = std::cosf(x); +} + +float PS4_SYSV_ABI internal_sinf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::sinf(x); +} + +float PS4_SYSV_ABI internal_sinh(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::sinh(x); +} + +float PS4_SYSV_ABI internal_sinhf(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::sinhf(x); +} + +float PS4_SYSV_ABI internal_sinhl(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::sinhl(x); +} + +float PS4_SYSV_ABI internal_sinl(float x) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::sinl(x); +} + +s32 PS4_SYSV_ABI internal_sqrt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sqrtf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_sqrtl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_srand() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tan() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tanf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tanh() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tanhf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tanhl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_tanl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +float PS4_SYSV_ABI internal__Fsin(float arg, unsigned int m, int n) { + ASSERT(n == 0); + if (m != 0) { + return cosf(arg); + } else { + return sinf(arg); + } +} + +double PS4_SYSV_ABI internal__Sin(double x) { + return sin(x); +} + +void RegisterlibSceLibcInternalMath(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("Ye20uNnlglA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_abs); + LIB_FUNCTION("JBcgYuW8lPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_acos); + LIB_FUNCTION("QI-x0SL8jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_acosf); + LIB_FUNCTION("Fk7-KFKZi-8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_acosh); + LIB_FUNCTION("XJp2C-b0tRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_acoshf); + LIB_FUNCTION("u14Y1HFh0uY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_acoshl); + LIB_FUNCTION("iH4YAIRcecA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_acosl); + LIB_FUNCTION("7Ly52zaL44Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_asin); + LIB_FUNCTION("GZWjF-YIFFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asinf); + LIB_FUNCTION("2eQpqTjJ5Y4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asinh); + LIB_FUNCTION("yPPtp1RMihw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asinhf); + LIB_FUNCTION("iCl-Z-g-uuA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asinhl); + LIB_FUNCTION("Nx-F5v0-qU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asinl); + LIB_FUNCTION("OXmauLdQ8kY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atan); + LIB_FUNCTION("HUbZmOnT-Dg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atan2); + LIB_FUNCTION("EH-x713A99c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atan2f); + LIB_FUNCTION("9VeY8wiqf8M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atan2l); + LIB_FUNCTION("weDug8QD-lE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atanf); + LIB_FUNCTION("YjbpxXpi6Zk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atanh); + LIB_FUNCTION("cPGyc5FGjy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atanhf); + LIB_FUNCTION("a3BNqojL4LM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atanhl); + LIB_FUNCTION("KvOHPTz595Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atanl); + LIB_FUNCTION("gacfOmO8hNs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_ceil); + LIB_FUNCTION("GAUuLKGhsCw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ceilf); + LIB_FUNCTION("aJKn6X+40Z8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ceill); + LIB_FUNCTION("2WE3BTYVwKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cos); + LIB_FUNCTION("-P6FNMzk2Kc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosf); + LIB_FUNCTION("m7iLTaO9RMs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosh); + LIB_FUNCTION("RCQAffkEh9A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_coshf); + LIB_FUNCTION("XK2R46yx0jc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_coshl); + LIB_FUNCTION("x8dc5Y8zFgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosl); + LIB_FUNCTION("NVadfnzQhHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp); + LIB_FUNCTION("dnaeGXbjP6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp2); + LIB_FUNCTION("wuAQt-j+p4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_exp2f); + LIB_FUNCTION("9O1Xdko-wSo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_exp2l); + LIB_FUNCTION("8zsu04XNsZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expf); + LIB_FUNCTION("qMp2fTDCyMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expl); + LIB_FUNCTION("gqKfOiJaCOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_expm1); + LIB_FUNCTION("3EgxfDRefdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_expm1f); + LIB_FUNCTION("jVS263HH1b0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_expm1l); + LIB_FUNCTION("388LcMWHRCA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fabs); + LIB_FUNCTION("fmT2cjPoWBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fabsf); + LIB_FUNCTION("w-AryX51ObA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fabsl); + LIB_FUNCTION("mpcTgMzhUY8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_floor); + LIB_FUNCTION("mKhVDmYciWA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_floorf); + LIB_FUNCTION("06QaR1Cpn-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_floorl); + LIB_FUNCTION("fiOgmWkP+Xc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmax); + LIB_FUNCTION("Lyx2DzUL7Lc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fmaxf); + LIB_FUNCTION("0H5TVprQSkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fmaxl); + LIB_FUNCTION("iU0z6SdUNbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmin); + LIB_FUNCTION("uVRcM2yFdP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fminf); + LIB_FUNCTION("DQ7K6s8euWY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fminl); + LIB_FUNCTION("pKwslsMUmSk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmod); + LIB_FUNCTION("88Vv-AzHVj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fmodf); + LIB_FUNCTION("A1R5T0xOyn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_fmodl); + LIB_FUNCTION("kA-TdiOCsaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_frexp); + LIB_FUNCTION("aaDMGGkXFxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_frexpf); + LIB_FUNCTION("YZk9sHO0yNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_frexpl); + LIB_FUNCTION("h6pVBKjcLiU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ilogb); + LIB_FUNCTION("0dQrYWd7g94", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ilogbf); + LIB_FUNCTION("wXs12eD3uvA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_ilogbl); + LIB_FUNCTION("UgZ7Rhk60cQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_imaxabs); + LIB_FUNCTION("V0X-mrfdM9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_imaxdiv); + LIB_FUNCTION("2q5PPh7HsKE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isinf); + LIB_FUNCTION("KqYTqtSfGos", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_islower); + LIB_FUNCTION("20qj+7O69XY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isnan); + LIB_FUNCTION("3pF7bUSIH8o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isnanf); + LIB_FUNCTION("GcFKlTJEMkI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_isupper); + LIB_FUNCTION("rtV7-jWC6Yg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log); + LIB_FUNCTION("WuMbPBKN1TU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log10); + LIB_FUNCTION("lhpd6Wk6ccs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log10f); + LIB_FUNCTION("CT4aR0tBgkQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log10l); + LIB_FUNCTION("VfsML+n9cDM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log1p); + LIB_FUNCTION("MFe91s8apQk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log1pf); + LIB_FUNCTION("77qd0ksTwdI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log1pl); + LIB_FUNCTION("Y5DhuDKGlnQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log2); + LIB_FUNCTION("hsi9drzHR2k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log2f); + LIB_FUNCTION("CfOrGjBj-RY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log2l); + LIB_FUNCTION("owKuegZU4ew", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logb); + LIB_FUNCTION("RWqyr1OKuw4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_logbf); + LIB_FUNCTION("txJTOe0Db6M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_logbl); + LIB_FUNCTION("RQXLbdT2lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logf); + LIB_FUNCTION("EiHf-aLDImI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logl); + LIB_FUNCTION("J3XuGS-cC0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lround); + LIB_FUNCTION("C6gWCWJKM+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lroundf); + LIB_FUNCTION("4ITASgL50uc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_lroundl); + LIB_FUNCTION("zck+6bVj5pA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nan); + LIB_FUNCTION("DZU+K1wozGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nanf); + LIB_FUNCTION("ZUvemFIkkhQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nanl); + LIB_FUNCTION("9LCjpWyQ5Zc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_pow); + LIB_FUNCTION("1D0H2KNjshE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powf); + LIB_FUNCTION("95V3PF0kUEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powl); + LIB_FUNCTION("pv2etu4pocs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_remainder); + LIB_FUNCTION("H8ya2H00jbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sin); + LIB_FUNCTION("jMB7EFyu30Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sincos); + LIB_FUNCTION("pztV4AF18iI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sincosf); + LIB_FUNCTION("Q4rRL34CEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinf); + LIB_FUNCTION("ZjtRqSMJwdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinh); + LIB_FUNCTION("1t1-JoZ0sZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sinhf); + LIB_FUNCTION("lYdqBvDgeHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sinhl); + LIB_FUNCTION("vxgqrJxDPHo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinl); + LIB_FUNCTION("MXRNWnosNlM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sqrt); + LIB_FUNCTION("Q+xU11-h0xQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sqrtf); + LIB_FUNCTION("RIkUZRadZgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_sqrtl); + LIB_FUNCTION("VPbJwTCgME0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_srand); + LIB_FUNCTION("T7uyNqP7vQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tan); + LIB_FUNCTION("ZE6RNL+eLbk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanf); + LIB_FUNCTION("JM4EBvWT9rc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanh); + LIB_FUNCTION("SAd0Z3wKwLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tanhf); + LIB_FUNCTION("JCmHsYVc2eo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_tanhl); + LIB_FUNCTION("QL+3q43NfEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanl); + LIB_FUNCTION("ZtjspkJQ+vw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__FSin); + LIB_FUNCTION("cCXjU72Z0Ow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Sin); +} + +} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_math.h b/src/core/libraries/libc_internal/libc_internal_math.h new file mode 100644 index 000000000..89b765205 --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_math.h @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::LibcInternal { +void RegisterlibSceLibcInternalMath(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_memory.cpp b/src/core/libraries/libc_internal/libc_internal_memory.cpp new file mode 100644 index 000000000..6666aa6bf --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_memory.cpp @@ -0,0 +1,314 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/assert.h" +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "libc_internal_memory.h" + +namespace Libraries::LibcInternal { + +s32 PS4_SYSV_ABI internal__malloc_finalize_lv2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__malloc_fini() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__malloc_init() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__malloc_init_lv2() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__malloc_postfork() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__malloc_prefork() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__malloc_thread_cleanup() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__sceLibcGetMallocParam() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_operator_new(size_t size) { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc(size_t size) { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_check_memory_bounds() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_finalize() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_get_footer_value() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_get_malloc_state() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_initialize() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_report_memory_blocks() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_stats() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_stats_fast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_malloc_usable_size() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_memalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_memchr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_memcmp(const void* s1, const void* s2, size_t n) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::memcmp(s1, s2, n); +} + +void* PS4_SYSV_ABI internal_memcpy(void* dest, const void* src, size_t n) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::memcpy(dest, src, n); +} + +s32 PS4_SYSV_ABI internal_memcpy_s(void* dest, size_t destsz, const void* src, size_t count) { + LOG_DEBUG(Lib_LibcInternal, "called"); +#ifdef _WIN64 + return memcpy_s(dest, destsz, src, count); +#else + std::memcpy(dest, src, count); + return 0; // ALL OK +#endif +} + +s32 PS4_SYSV_ABI internal_memmove(void* d, void* s, size_t n) { + LOG_DEBUG(Lib_LibcInternal, "called"); + std::memmove(d, s, n); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_memmove_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_memrchr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +void* PS4_SYSV_ABI internal_memset(void* s, int c, size_t n) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::memset(s, c, n); +} + +s32 PS4_SYSV_ABI internal_memset_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_posix_memalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_realloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_reallocalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_reallocf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wmemchr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wmemcmp() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wmemcpy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wmemcpy_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wmemmove() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wmemmove_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wmemset() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +void PS4_SYSV_ABI internal_operator_delete(void* ptr) { + if (ptr) { + std::free(ptr); + } +} + +void PS4_SYSV_ABI internal_free(void* ptr) { + std::free(ptr); +} + +void RegisterlibSceLibcInternalMemory(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("RnqlvEmvkdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__malloc_finalize_lv2); + LIB_FUNCTION("21KFhEQDJ3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__malloc_fini); + LIB_FUNCTION("z8GPiQwaAEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__malloc_init); + LIB_FUNCTION("20cUk0qX9zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__malloc_init_lv2); + LIB_FUNCTION("V94pLruduLg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__malloc_postfork); + LIB_FUNCTION("aLYyS4Kx6rQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__malloc_prefork); + LIB_FUNCTION("Sopthb9ztZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__malloc_thread_cleanup); + LIB_FUNCTION("1nZ4Xfnyp38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__sceLibcGetMallocParam); + LIB_FUNCTION("fJnpuVVBbKk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_operator_new); + LIB_FUNCTION("cVSk9y8URbc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_posix_memalign); + LIB_FUNCTION("Ujf3KzMvRmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memalign); + LIB_FUNCTION("8u8lPzUEq+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memchr); + LIB_FUNCTION("DfivPArhucg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memcmp); + LIB_FUNCTION("Q3VBxCXhUHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memcpy); + LIB_FUNCTION("NFLs+dRJGNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memcpy_s); + LIB_FUNCTION("+P6FRGH4LfA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memmove); + LIB_FUNCTION("B59+zQQCcbU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memmove_s); + LIB_FUNCTION("5G2ONUzRgjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memrchr); + LIB_FUNCTION("8zTFvBIAIN8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memset); + LIB_FUNCTION("h8GwqPFbu6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memset_s); + LIB_FUNCTION("Y7aJ1uydPMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_realloc); + LIB_FUNCTION("OGybVuPAhAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_reallocalign); + LIB_FUNCTION("YMZO9ChZb0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_reallocf); + LIB_FUNCTION("fnUEjBCNRVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wmemchr); + LIB_FUNCTION("QJ5xVfKkni0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wmemcmp); + LIB_FUNCTION("fL3O02ypZFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wmemcpy); + LIB_FUNCTION("BTsuaJ6FxKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wmemcpy_s); + LIB_FUNCTION("Noj9PsJrsa8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wmemmove); + LIB_FUNCTION("F8b+Wb-YQVs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wmemmove_s); + LIB_FUNCTION("Al8MZJh-4hM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wmemset); + LIB_FUNCTION("gQX+4GDQjpM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc); + LIB_FUNCTION("ECOPpUQEch0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_check_memory_bounds); + LIB_FUNCTION("J6FoFNydpFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_finalize); + LIB_FUNCTION("SlG1FN-y0N0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_get_footer_value); + LIB_FUNCTION("Nmezc1Lh7TQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_get_malloc_state); + LIB_FUNCTION("owT6zLJxrTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_initialize); + LIB_FUNCTION("0F08WOP8G3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_report_memory_blocks); + LIB_FUNCTION("CC-BLMBu9-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_stats); + LIB_FUNCTION("KuOuD58hqn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_stats_fast); + LIB_FUNCTION("NDcSfcYZRC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_malloc_usable_size); + LIB_FUNCTION("MLWl90SFWNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_operator_delete); + LIB_FUNCTION("tIhsqj0qsFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_free); +} + +} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_memory.h b/src/core/libraries/libc_internal/libc_internal_memory.h new file mode 100644 index 000000000..995de935b --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_memory.h @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::LibcInternal { +void RegisterlibSceLibcInternalMemory(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_mspace.cpp b/src/core/libraries/libc_internal/libc_internal_mspace.cpp new file mode 100644 index 000000000..916c9ab0d --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_mspace.cpp @@ -0,0 +1,247 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/assert.h" +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "libc_internal_mspace.h" + +namespace Libraries::LibcInternal { + +s32 PS4_SYSV_ABI sceLibcMspaceAlignedAlloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceCalloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +void* PS4_SYSV_ABI sceLibcMspaceCreate(char* name, u64 param_2, u64 param_3, u32 param_4, + s8* param_5) { + UNREACHABLE_MSG("Missing sceLibcMspace impementation!"); + return 0; +} + +s32 PS4_SYSV_ABI sceLibcMspaceDestroy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceFree() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceGetAddressRanges() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceIsHeapEmpty() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceMalloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceMallocStats() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceMallocStatsFast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceMallocUsableSize() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceMemalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspacePosixMemalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceRealloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceReallocalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcMspaceSetMallocCallback() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceCalloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceCheckMemoryBounds() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceCreate() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceDestroy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceFree() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceGetFooterValue() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceIsHeapEmpty() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceMalloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceMallocStats() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceMallocStatsFast() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceMallocUsableSize() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceMemalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspacePosixMemalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceRealloc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceReallocalign() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceReportMemoryBlocks() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceLibcPafMspaceTrim() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceLibcInternalMspace(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("ljkqMcC4-mk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceAlignedAlloc); + LIB_FUNCTION("LYo3GhIlB38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceCalloc); + LIB_FUNCTION("-hn1tcVHq5Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceCreate); + LIB_FUNCTION("W6SiVSiCDtI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceDestroy); + LIB_FUNCTION("Vla-Z+eXlxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceFree); + LIB_FUNCTION("raRgiuQfvWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceGetAddressRanges); + LIB_FUNCTION("pzUa7KEoydw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceIsHeapEmpty); + LIB_FUNCTION("OJjm-QOIHlI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceMalloc); + LIB_FUNCTION("mfHdJTIvhuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceMallocStats); + LIB_FUNCTION("k04jLXu3+Ic", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceMallocStatsFast); + LIB_FUNCTION("fEoW6BJsPt4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceMallocUsableSize); + LIB_FUNCTION("iF1iQHzxBJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceMemalign); + LIB_FUNCTION("qWESlyXMI3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspacePosixMemalign); + LIB_FUNCTION("gigoVHZvVPE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceRealloc); + LIB_FUNCTION("p6lrRW8-MLY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceReallocalign); + LIB_FUNCTION("+CbwGRMnlfU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcMspaceSetMallocCallback); + LIB_FUNCTION("-lZdT34nAAE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceCalloc); + LIB_FUNCTION("Pcq7UoYAcFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceCheckMemoryBounds); + LIB_FUNCTION("6hdfGRKHefs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceCreate); + LIB_FUNCTION("qB5nGjWa-bk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceDestroy); + LIB_FUNCTION("9mMuuhXMwqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceFree); + LIB_FUNCTION("kv4kgdjswN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceGetFooterValue); + LIB_FUNCTION("htdTOnMxDbQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceIsHeapEmpty); + LIB_FUNCTION("QuZzFJD5Hrw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceMalloc); + LIB_FUNCTION("mO8NB8whKy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceMallocStats); + LIB_FUNCTION("OmG3YPCBLJs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceMallocStatsFast); + LIB_FUNCTION("6JcY5RDA4jY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceMallocUsableSize); + LIB_FUNCTION("PKJcFUfhKtw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceMemalign); + LIB_FUNCTION("7hOUKGcT6jM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspacePosixMemalign); + LIB_FUNCTION("u32UXVridxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceRealloc); + LIB_FUNCTION("4SvlEtd0j40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceReallocalign); + LIB_FUNCTION("0FnzR6qum90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceReportMemoryBlocks); + LIB_FUNCTION("AUYdq63RG3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + sceLibcPafMspaceTrim); +} + +} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_mspace.h b/src/core/libraries/libc_internal/libc_internal_mspace.h new file mode 100644 index 000000000..b2357e446 --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_mspace.h @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::LibcInternal { +void RegisterlibSceLibcInternalMspace(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_str.cpp b/src/core/libraries/libc_internal/libc_internal_str.cpp new file mode 100644 index 000000000..92a131fa1 --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_str.cpp @@ -0,0 +1,532 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/assert.h" +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "libc_internal_str.h" + +namespace Libraries::LibcInternal { + +s32 PS4_SYSV_ABI internal__CStrftime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__CStrxfrm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Getstr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stod() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stodx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stof() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoflt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stofx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stold() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoldx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoll() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stollx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stolx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stopfx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoul() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoull() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoullx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoulx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Stoxflt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Strcollx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Strerror() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__Strxfrmx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strcasecmp(const char* str1, const char* str2) { + LOG_DEBUG(Lib_LibcInternal, "called"); +#ifdef _WIN32 + return _stricmp(str1, str2); +#else + return strcasecmp(str1, str2); +#endif +} + +char* PS4_SYSV_ABI internal_strcat(char* dest, const char* src) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strcat(dest, src); +} + +s32 PS4_SYSV_ABI internal_strcat_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +const char* PS4_SYSV_ABI internal_strchr(const char* str, int c) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strchr(str, c); +} + +s32 PS4_SYSV_ABI internal_strcmp(const char* str1, const char* str2) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strcmp(str1, str2); +} + +s32 PS4_SYSV_ABI internal_strcoll() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +char* PS4_SYSV_ABI internal_strcpy(char* dest, const char* src) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strcpy(dest, src); +} + +char* PS4_SYSV_ABI internal_strcpy_s(char* dest, u64 len, const char* src) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strncpy(dest, src, len); +} + +s32 PS4_SYSV_ABI internal_strcspn(const char* str1, const char* str2) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strcspn(str1, str2); +} + +char* PS4_SYSV_ABI internal_strdup() { + LOG_DEBUG(Lib_LibcInternal, "called"); + char* dup = (char*)std::malloc(std::strlen(str1) + 1); + if (dup != NULL) + strcpy(dup, str1); + return dup; +} + +s32 PS4_SYSV_ABI internal_strerror() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strerror_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strerror_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strerrorlen_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strftime() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strlcat() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strlcpy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +size_t PS4_SYSV_ABI internal_strlen(const char* str) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strlen(str); +} + +s32 PS4_SYSV_ABI internal_strncasecmp(const char* str1, const char* str2, size_t num) { + LOG_DEBUG(Lib_LibcInternal, "called"); +#ifdef _WIN32 + return _strnicmp(str1, str2, num); +#else + return strncasecmp(str1, str2, num); +#endif +} + +s32 PS4_SYSV_ABI internal_strncat() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strncat_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strncmp(const char* str1, const char* str2, size_t num) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strncmp(str1, str2, num); +} + +char* PS4_SYSV_ABI internal_strncpy(char* dest, const char* src, std::size_t count) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strncpy(dest, src, count); +} + +s32 PS4_SYSV_ABI internal_strncpy_s(char* dest, size_t destsz, const char* src, size_t count) { + LOG_DEBUG(Lib_LibcInternal, "called"); +#ifdef _WIN64 + return strncpy_s(dest, destsz, src, count); +#else + std::strcpy(dest, src); + return 0; +#endif +} + +s32 PS4_SYSV_ABI internal_strndup() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strnlen(const char* str, size_t maxlen) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::min(std::strlen(str), maxlen); +} + +s32 PS4_SYSV_ABI internal_strnlen_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strnstr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +const char* PS4_SYSV_ABI internal_strpbrk(const char* str1, const char* str2) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strpbrk(str1, str2); +} + +const char* PS4_SYSV_ABI internal_strrchr(const char* str, int c) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strrchr(str, c); +} + +char* PS4_SYSV_ABI internal_strsep(char** strp, const char* delim) { + LOG_DEBUG(Lib_LibcInternal, "called"); +#ifdef _GNU_SOURCE + return strsep(strp, delim); +#else + if (!*strp) + return nullptr; + char* token = *strp; + *strp = std::strpbrk(token, delim); + if (*strp) + *(*strp)++ = '\0'; + return token; +#endif +} + +s32 PS4_SYSV_ABI internal_strspn(const char* str1, const char* str2) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strspn(str1, str2); +} + +char* PS4_SYSV_ABI internal_strstr(char* h, char* n) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strstr(h, n); +} + +double PS4_SYSV_ABI internal_strtod(const char* str, char** endptr) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strtod(str, endptr); +} + +float PS4_SYSV_ABI internal_strtof(const char* str, char** endptr) { + LOG_DEBUG(Lib_LibcInternal, "called"); + return std::strtof(str, endptr); +} + +s32 PS4_SYSV_ABI internal_strtoimax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtok() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtok_r() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtok_s() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtol() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtold() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtoll() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtoul() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtoull() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtoumax() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strtouq() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_strxfrm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal_wcsstr() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceLibcInternalStr(Core::Loader::SymbolsResolver* sym) { + + LIB_FUNCTION("ykNF6P3ZsdA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__CStrftime); + LIB_FUNCTION("we-vQBAugV8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__CStrxfrm); + LIB_FUNCTION("i2yN6xBwooo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Getstr); + LIB_FUNCTION("c41UEHVtiEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stod); + LIB_FUNCTION("QlcJbyd6jxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stodx); + LIB_FUNCTION("CpWcnrEZbLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stof); + LIB_FUNCTION("wO1-omboFjo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoflt); + LIB_FUNCTION("7dlAxeH-htg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stofx); + LIB_FUNCTION("iNbtyJKM0iQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stold); + LIB_FUNCTION("BKidCxmLC5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoldx); + LIB_FUNCTION("7pNKcscKrf8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoll); + LIB_FUNCTION("mOnfZ5aNDQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stollx); + LIB_FUNCTION("Ecwid6wJMhY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stolx); + LIB_FUNCTION("yhbF6MbVuYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stopfx); + LIB_FUNCTION("zlfEH8FmyUA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoul); + LIB_FUNCTION("q+9E0X3aWpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoull); + LIB_FUNCTION("pSpDCDyxkaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoullx); + LIB_FUNCTION("YDnLaav6W6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoulx); + LIB_FUNCTION("Ouz5Q8+SUq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Stoxflt); + LIB_FUNCTION("v6rXYSx-WGA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Strcollx); + LIB_FUNCTION("4F11tHMpJa0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Strerror); + LIB_FUNCTION("CpiD2ZXrhNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__Strxfrmx); + LIB_FUNCTION("AV6ipCNa4Rw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcasecmp); + LIB_FUNCTION("Ls4tzzhimqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcat); + LIB_FUNCTION("K+gcnFFJKVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcat_s); + LIB_FUNCTION("ob5xAW4ln-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strchr); + LIB_FUNCTION("Ovb2dSJOAuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcmp); + LIB_FUNCTION("gjbmYpP-XJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcoll); + LIB_FUNCTION("kiZSXIWd9vg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcpy); + LIB_FUNCTION("5Xa2ACNECdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcpy_s); + LIB_FUNCTION("q0F6yS-rCms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcspn); + LIB_FUNCTION("g7zzzLDYGw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strdup); + LIB_FUNCTION("RIa6GnWp+iU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strerror); + LIB_FUNCTION("RBcs3uut1TA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strerror_r); + LIB_FUNCTION("o+ok6Y+DtgY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strerror_s); + LIB_FUNCTION("-g26XITGVgE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strerrorlen_s); + LIB_FUNCTION("Av3zjWi64Kw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strftime); + LIB_FUNCTION("ByfjUZsWiyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strlcat); + LIB_FUNCTION("SfQIZcqvvms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strlcpy); + LIB_FUNCTION("j4ViWNHEgww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strlen); + LIB_FUNCTION("pXvbDfchu6k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strncasecmp); + LIB_FUNCTION("kHg45qPC6f0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strncat); + LIB_FUNCTION("NC4MSB+BRQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strncat_s); + LIB_FUNCTION("aesyjrHVWy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strncmp); + LIB_FUNCTION("6sJWiWSRuqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strncpy); + LIB_FUNCTION("YNzNkJzYqEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strncpy_s); + LIB_FUNCTION("XGnuIBmEmyk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strndup); + LIB_FUNCTION("5jNubw4vlAA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strnlen); + LIB_FUNCTION("DQbtGaBKlaw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strnlen_s); + LIB_FUNCTION("Xnrfb2-WhVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strnstr); + LIB_FUNCTION("kDZvoVssCgQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strpbrk); + LIB_FUNCTION("9yDWMxEFdJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strrchr); + LIB_FUNCTION("cJWGxiQPmDQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strsep); + LIB_FUNCTION("-kU6bB4M-+k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strspn); + LIB_FUNCTION("viiwFMaNamA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strstr); + LIB_FUNCTION("2vDqwBlpF-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtod); + LIB_FUNCTION("xENtRue8dpI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtof); + LIB_FUNCTION("q5MWYCDfu3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtoimax); + LIB_FUNCTION("oVkZ8W8-Q8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtok); + LIB_FUNCTION("enqPGLfmVNU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtok_r); + LIB_FUNCTION("-vXEQdRADLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtok_s); + LIB_FUNCTION("mXlxhmLNMPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtol); + LIB_FUNCTION("nW9JRkciRk4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtold); + LIB_FUNCTION("VOBg+iNwB-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtoll); + LIB_FUNCTION("QxmSHBCuKTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtoul); + LIB_FUNCTION("5OqszGpy7Mg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtoull); + LIB_FUNCTION("QNyUWGXmXNc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtoumax); + LIB_FUNCTION("g-McpZfseZo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strtouq); + LIB_FUNCTION("zogPrkd46DY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strxfrm); + LIB_FUNCTION("WDpobjImAb4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_wcsstr); +} + +} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_str.h b/src/core/libraries/libc_internal/libc_internal_str.h new file mode 100644 index 000000000..26023c40e --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_str.h @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::LibcInternal { +void RegisterlibSceLibcInternalStr(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_stream.cpp b/src/core/libraries/libc_internal/libc_internal_stream.cpp new file mode 100644 index 000000000..2d793d9cb --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_stream.cpp @@ -0,0 +1,3139 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/assert.h" +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" +#include "core/libraries/libs.h" +#include "libc_internal_memory.h" + +namespace Libraries::LibcInternal { + +s32 PS4_SYSV_ABI internal__ZGVNSt14_Error_objectsIiE16_Iostream_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE5equalERKS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt19istreambuf_iteratorIwSt11char_traitsIwEE5equalERKS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt24_Iostream_error_category4nameEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNKSt24_Iostream_error_category7messageEi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_PKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcmmmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IputES3_RSt8ios_basecPcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_PKwm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcmmmm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IputES3_RSt8ios_basewPcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKcSE_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetintERS3_S5_iiRiRKSt5ctypeIcE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKwSE_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetintERS3_S5_iiRiRKSt5ctypeIwE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8_PutmfldES3_bRSt8ios_basecbSsc() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8_PutmfldES3_bRSt8ios_basewbSbIwS2_SaIwEEw() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt14_Error_objectsIiE16_Iostream_objectE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt24_Iostream_error_categoryD0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt24_Iostream_error_categoryD1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_TidyEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_TidyEv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_Eb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_Eb() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIcEEEm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIwEEEm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEiRT0_S5_mPKT_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZSt10_GetloctxtIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZSt17iostream_categoryv() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt13basic_istreamIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt13basic_ostreamIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt15basic_streambufIcSt11char_traitsIcEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt15basic_streambufIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt24_Iostream_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt13basic_istreamIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt13basic_ostreamIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt15basic_streambufIcSt11char_traitsIcEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt15basic_streambufIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt24_Iostream_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt13basic_istreamIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt13basic_ostreamIwSt11char_traitsIwEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt24_Iostream_error_category() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI internal__ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePcE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePwE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSsE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI +internal__ZZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEEE4_Src() { + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; +} + +void RegisterlibSceLibcInternalStream(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("ieNeByYxFgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt14_Error_objectsIiE16_Iostream_objectE); + LIB_FUNCTION("8o+oBXdeQPk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION("5FD0gWEuuTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION("ZkP0sDpHLLg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION("wozVkExRax4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION("z-L6coXk6yo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION("TuIEPzIwWcI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION("Awj5m1LfcXQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION("K+-VjJdCYVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION("HQAa3rCj8ho", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION("koazg-62JMk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION("HDnBZ+mkyjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION("u6UfGT9+HEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE5equalERKS2_); + LIB_FUNCTION("jZmLD-ASDto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt19istreambuf_iteratorIwSt11char_traitsIwEE5equalERKS2_); + LIB_FUNCTION("sb2vivqtLS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt24_Iostream_error_category4nameEv); + LIB_FUNCTION("n9-NJEULZ-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt24_Iostream_error_category7messageEi); + LIB_FUNCTION( + "OWO5cpNw3NA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); + LIB_FUNCTION( + "mAwXCpkWaYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); + LIB_FUNCTION( + "wUCRGap1j0U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "6RGkooTERsE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); + LIB_FUNCTION( + "N1VqUWz2OEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); + LIB_FUNCTION( + "I2UzwkwwEPs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); + LIB_FUNCTION( + "2bfL3yIBi5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); + LIB_FUNCTION( + "my9ujasm6-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); + LIB_FUNCTION( + "gozsp4urvq8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); + LIB_FUNCTION( + "4hiQK82QuLc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); + LIB_FUNCTION( + "eZfFLyWCkvg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); + LIB_FUNCTION( + "SmtBNDda5qU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); + LIB_FUNCTION( + "bNQpG-eKogg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); + LIB_FUNCTION( + "uukWbYS6Bn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "IntAnFb+tw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); + LIB_FUNCTION( + "ywJpNe675zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); + LIB_FUNCTION( + "ALEXgLx9fqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); + LIB_FUNCTION( + "Pq4PkG0x1fk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); + LIB_FUNCTION( + "VKdXFE7ualw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); + LIB_FUNCTION( + "dRu2RLn4SKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); + LIB_FUNCTION( + "F+AmVDFUyqM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); + LIB_FUNCTION( + "TtYifKtVkYA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); + LIB_FUNCTION( + "4+y8-2NsDw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePi); + LIB_FUNCTION( + "G9LB1YD5-xc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale); + LIB_FUNCTION( + "J-0I2PtiZc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi); + LIB_FUNCTION( + "vW-nnV62ea4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); + LIB_FUNCTION( + "+hjXHfvy1Mg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); + LIB_FUNCTION( + "xLZr4GJRMLo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "2mb8FYgER+E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); + LIB_FUNCTION( + "Y3hBU5FYmhM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); + LIB_FUNCTION( + "-m2YPwVCwJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); + LIB_FUNCTION( + "94ZLp2+AOq0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); + LIB_FUNCTION( + "zomvAQ5RFdA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); + LIB_FUNCTION( + "bZ+lKHGvOr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); + LIB_FUNCTION( + "cG5hQhjFGog", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); + LIB_FUNCTION( + "banNSumaAZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); + LIB_FUNCTION( + "wEU8oFtBXT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); + LIB_FUNCTION( + "t39dKpPEuVA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); + LIB_FUNCTION( + "MCtJ9D7B5Cs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "Gy2iRxp3LGk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); + LIB_FUNCTION( + "2bUUbbcqHUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); + LIB_FUNCTION( + "QossXdwWltI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); + LIB_FUNCTION( + "ig6SRr1GCU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); + LIB_FUNCTION( + "BNZq-mRvDS8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); + LIB_FUNCTION( + "kU7PvJJKUng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); + LIB_FUNCTION( + "Ou7GV51-ng4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); + LIB_FUNCTION( + "rYLrGFoqfi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); + LIB_FUNCTION( + "W5VYncHdreo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePi); + LIB_FUNCTION( + "GGqIV4cjzzI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale); + LIB_FUNCTION( + "bZ0oEGQUKO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi); + LIB_FUNCTION( + "nftirmo6hBg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb); + LIB_FUNCTION( + "w9NzCYAjEpQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd); + LIB_FUNCTION( + "VPcTGA-LwSo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece); + LIB_FUNCTION( + "ffnhh0HcxJ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl); + LIB_FUNCTION( + "uODuM76vS4U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm); + LIB_FUNCTION( + "8NVUcufbklM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv); + LIB_FUNCTION( + "NJtKruu9qOs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx); + LIB_FUNCTION( + "dep6W2Ix35s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy); + LIB_FUNCTION( + "k8zgjeBmpVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_PKcm); + LIB_FUNCTION("tCihLs4UJxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm); + LIB_FUNCTION( + "w11G58-u4p8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE); + LIB_FUNCTION( + "ll99KkqO6ig", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcm); + LIB_FUNCTION( + "mNk6FfI8T7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcmmmm); + LIB_FUNCTION( + "xlgA01CQtBo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE); + LIB_FUNCTION( + "jykT-VWQVBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IputES3_RSt8ios_basecPcm); + LIB_FUNCTION( + "ke36E2bqNmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb); + LIB_FUNCTION( + "F+cp2B3cWNU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd); + LIB_FUNCTION( + "rLiFc4+HyHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece); + LIB_FUNCTION( + "I3+xmBWGPGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl); + LIB_FUNCTION( + "nlAk46weq1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm); + LIB_FUNCTION( + "0xgFRKf0Lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv); + LIB_FUNCTION( + "H2KGT3vA7yQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx); + LIB_FUNCTION( + "Vbeoft607aI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy); + LIB_FUNCTION( + "mY9FWooxqJY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb); + LIB_FUNCTION( + "V7aIsVIsIIA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd); + LIB_FUNCTION( + "vCIFGeI6adI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe); + LIB_FUNCTION( + "USLhWp7sZoU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl); + LIB_FUNCTION( + "qtpzdwMMCPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm); + LIB_FUNCTION( + "xfOSCbCiY44", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv); + LIB_FUNCTION( + "ryykbHJ04Cw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx); + LIB_FUNCTION( + "lmb3oBpMNPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy); + LIB_FUNCTION( + "kRGVhisjgMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_PKwm); + LIB_FUNCTION("-b+Avqa2v9k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm); + LIB_FUNCTION( + "T07KcAOlIeU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE); + LIB_FUNCTION( + "IdV-tXejEGQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcm); + LIB_FUNCTION( + "B6JXVOMDdlw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcmmmm); + LIB_FUNCTION( + "WheFSRlZ9JA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE); + LIB_FUNCTION( + "4pQ3B1BTMgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IputES3_RSt8ios_basewPcm); + LIB_FUNCTION( + "1C2-2WB9NN4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb); + LIB_FUNCTION( + "sX3o6Zmihw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd); + LIB_FUNCTION( + "6OYWLisfrB8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe); + LIB_FUNCTION( + "VpwhOe58wsM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl); + LIB_FUNCTION( + "jHo78LGEtmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm); + LIB_FUNCTION( + "BDteGj1gqBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv); + LIB_FUNCTION( + "9SSHrlIamto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx); + LIB_FUNCTION( + "uX0nKsUo8gc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy); + LIB_FUNCTION( + "ShlQcYrzRF8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv); + LIB_FUNCTION( + "T85u2sPrKOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "73GV+sRHbeY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "dSfKN47p6ac", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "KwJ5V3D0v3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "8PIh8BFpNYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv); + LIB_FUNCTION( + "vvA7HtdtWnY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "xzYpD5d24aA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "ZuCHPDq-dPw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "+RuThw5axA4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); + LIB_FUNCTION( + "S5WbPO54nD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKcSE_); + LIB_FUNCTION( + "Vw03kdKZUN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); + LIB_FUNCTION( + "E7UermPZVcw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc); + LIB_FUNCTION( + "8raXTYQ11cg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetintERS3_S5_iiRiRKSt5ctypeIcE); + LIB_FUNCTION( + "OY5mqEBxP+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "rrqNi95bhMs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "5L5Aft+9nZU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "nc6OsiDx630", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv); + LIB_FUNCTION( + "SYCwZXKZQ08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "2pJJ0dl-aPQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "cRSJysDpVl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "A0PftWMfrhk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "dP14OHWe4nI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv); + LIB_FUNCTION( + "xy0MR+OOZI8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "hGlkh5YpcKw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "R1ITHuTUMEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "64pqofAwJEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); + LIB_FUNCTION( + "B8c4P1vCixQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKwSE_); + LIB_FUNCTION( + "0MzJAexrlr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); + LIB_FUNCTION( + "r8003V6UwZg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc); + LIB_FUNCTION( + "lhJWkEh-HXM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetintERS3_S5_iiRiRKSt5ctypeIwE); + LIB_FUNCTION( + "kwp-0uidHpw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "9TfGnN6xq-U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "Krt-A7EnHHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); + LIB_FUNCTION( + "qkuA-unH7PU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc); + LIB_FUNCTION( + "j9LU8GsuEGw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_); + LIB_FUNCTION( + "+i81FtUCarA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc); + LIB_FUNCTION( + "Nt6eyVKm+Z4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc); + LIB_FUNCTION( + "Sc0lXhQG5Ko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_); + LIB_FUNCTION( + "Fr7j8dMsy4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc); + LIB_FUNCTION( + "G84okRnyJJg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "2fxdcyt5tGs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs); + LIB_FUNCTION( + "IRVqdGwSNXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "D2njLPpEt1E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs); + LIB_FUNCTION( + "CLT04GjI7UE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePc); + LIB_FUNCTION( + "cx-1THpef1A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "wWIsjOqfcSc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE); + LIB_FUNCTION( + "zzubCm+nDzc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); + LIB_FUNCTION( + "DhXTD5eM7LQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE); + LIB_FUNCTION( + "RalOJcOXJJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePw); + LIB_FUNCTION( + "65cvm2NDLmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece); + LIB_FUNCTION( + "DR029KeWsHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs); + LIB_FUNCTION( + "iXVrhA51z0M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece); + LIB_FUNCTION( + "OR-4zyIi2aE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs); + LIB_FUNCTION( + "d57FDzON1h0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8_PutmfldES3_bRSt8ios_basecbSsc); + LIB_FUNCTION( + "fsF-tGtGsD4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe); + LIB_FUNCTION( + "JruBeQgsAaU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE); + LIB_FUNCTION( + "wVY5DpvU6PU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe); + LIB_FUNCTION( + "GDiCYtaiUyM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE); + LIB_FUNCTION( + "r-JSsJQFUsY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8_PutmfldES3_bRSt8ios_basewbSbIwS2_SaIwEEw); + LIB_FUNCTION("StJaKYTRdUE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev); + LIB_FUNCTION("RP7ijkGGx50", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev); + LIB_FUNCTION("4GbIwW5u5us", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_); + LIB_FUNCTION("MB1VCygerRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev); + LIB_FUNCTION("7VRfkz22vPk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev); + LIB_FUNCTION("EYZJsnX58DE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev); + LIB_FUNCTION("D5m73fSIxAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt14_Error_objectsIiE16_Iostream_objectE); + LIB_FUNCTION("VpwymQiS4ck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci); + LIB_FUNCTION("sXaxl1QGorg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci); + LIB_FUNCTION("IAEl1Ta7yVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv); + LIB_FUNCTION("lZVehk7yFok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi); + LIB_FUNCTION("041c37QfoUc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi); + LIB_FUNCTION("olsoiZsezkk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv); + LIB_FUNCTION("jVwxMhFRw8Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt24_Iostream_error_categoryD0Ev); + LIB_FUNCTION("27Z-Cx1jbkU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt24_Iostream_error_categoryD1Ev); + LIB_FUNCTION("-mLzBSk-VGs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION( + "cXL+LN0lSwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "p1WMhxL4Wds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("uXj-oWD2334", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em); + LIB_FUNCTION( + "iTODM3uXS2s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("RNmYVYlZvv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em); + LIB_FUNCTION( + "yAobGI2Whrg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("-1G1iE3KyGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev); + LIB_FUNCTION("kAay0hfgDJs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev); + LIB_FUNCTION("6S8jzWWGcWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev); + LIB_FUNCTION("NFAhHKyMnCg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION( + "4MHgRGOKOXY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "zTX7LL+w12Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("18rLbEV-NQs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em); + LIB_FUNCTION( + "0UPU3kvxWb0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("-+RKa3As0gE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em); + LIB_FUNCTION( + "e3shgCIZxRc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("aHDdLa7jA1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev); + LIB_FUNCTION("Zbaaq-d70ms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev); + LIB_FUNCTION("bwVJf3kat9c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev); + LIB_FUNCTION("E14mW8pVpoE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION( + "BbJ4naWZeRw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "hNAh1l09UpA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("LAEVU8cBSh4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em); + LIB_FUNCTION( + "Hg1im-rUeHc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("1gYJIrfHxkQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em); + LIB_FUNCTION( + "Mniutm2JL2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("aOK5ucXO-5g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev); + LIB_FUNCTION("WoCt9o2SYHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev); + LIB_FUNCTION("U4JP-R+-70c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev); + LIB_FUNCTION("kImHEIWZ58Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION( + "V2FICbvPa+s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "6iDi6e2e4x8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("xdHqQoggdfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em); + LIB_FUNCTION( + "Ky+C-qbKcX0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("f1ZGLUnQGgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em); + LIB_FUNCTION( + "0Pd-K5jGcgM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("jyXTVnmlJD4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev); + LIB_FUNCTION("WiUy3dEtCOQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev); + LIB_FUNCTION("6hV3y21d59k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev); + LIB_FUNCTION("a54t8+k7KpY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION("+yrOX7MgVlk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_TidyEv); + LIB_FUNCTION( + "eMnBe5mZFLw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("13xzrgS8N4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em); + LIB_FUNCTION("9pPbNXw5N9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm); + LIB_FUNCTION( + "iO5AOflrTaA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("dU8Q2yzFNQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em); + LIB_FUNCTION("M0n7l76UVyE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm); + LIB_FUNCTION( + "l7OtvplI42U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("mmq9OwwYx74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev); + LIB_FUNCTION("Cp9ksNOeun8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev); + LIB_FUNCTION("dOKh96qQFd0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev); + LIB_FUNCTION("Q17eavfOw2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION("ImblNB7fVVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_TidyEv); + LIB_FUNCTION( + "e5jQyuEE+9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("J2xO4cttypo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em); + LIB_FUNCTION("gOzIhGUAkME", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm); + LIB_FUNCTION( + "y0hzUSFrkng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("p-SW25yE-Q8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em); + LIB_FUNCTION("XBmd6G-HoYI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm); + LIB_FUNCTION( + "bU3S1OS1sc0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("8H3yBUytv-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev); + LIB_FUNCTION("QTgRx1NTp6o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev); + LIB_FUNCTION("Zqc++JB04Qs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev); + LIB_FUNCTION("BamOsNbUcn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION( + "QdPT7uDTlo0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "ec0YLGHS8cw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("6htjEH2Gi-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em); + LIB_FUNCTION( + "u5yK3bGG1+w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("6NH0xVj6p7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em); + LIB_FUNCTION( + "IuFImJ5+kTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("WQQlL0n2SpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev); + LIB_FUNCTION("h+c9OSfCAEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev); + LIB_FUNCTION("vu0B+BGlol4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev); + LIB_FUNCTION("JFiji2DpvXQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION( + "ZolDcuDSD0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "bF2uVCqVhBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("X3DrtC2AZCI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em); + LIB_FUNCTION( + "oi3kpQPqpMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("lOF5jrFNZUA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em); + LIB_FUNCTION( + "b1LciG4lUUk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("6yplvTHbxpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev); + LIB_FUNCTION("CiD6-BPDZrA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev); + LIB_FUNCTION("8PJ9qmklj2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev); + LIB_FUNCTION("UQPicLg8Sx8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_Eb); + LIB_FUNCTION("uqLGWOX7-YE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_Eb); + LIB_FUNCTION("TsGewdW9Rto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION( + "6zg3ziZ4Qis", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "MSSvHmcbs3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("YGPopdkhujM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em); + LIB_FUNCTION( + "7NQGsY7VY3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("f+1EaDVL5C4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em); + LIB_FUNCTION( + "iWtXRduTjHA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("b9QSruV4nnc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev); + LIB_FUNCTION("zkCx9c2QKBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev); + LIB_FUNCTION("CClObiVHzDY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev); + LIB_FUNCTION("dplyQ6+xatg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION( + "JOj6qfc4VLs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "DTH1zTBrOO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("bY9Y0J3GGbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em); + LIB_FUNCTION( + "ej+44l1PjjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("x5yAFCJRz8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em); + LIB_FUNCTION( + "m2lChTx-9tM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("RB3ratfpZDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev); + LIB_FUNCTION("a6yvHMSqsV0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev); + LIB_FUNCTION("7ZmeGHyM6ew", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev); + LIB_FUNCTION("hf2Ljaf19Fs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); + LIB_FUNCTION( + "66AuqgLnsQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIcEEEm); + LIB_FUNCTION( + "1dY2KJfkgMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm); + LIB_FUNCTION( + "riBxNiKLvI0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "w9fCz0pbHdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("Qi5fpNt5+T0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em); + LIB_FUNCTION( + "mdYczJb+bb0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("XqbpfYmAZB4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em); + LIB_FUNCTION( + "b2na0Dzd5j8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("s2zG12AYKTg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev); + LIB_FUNCTION("AnE9WWbyWkM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev); + LIB_FUNCTION("MuACiCSA8-s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev); + LIB_FUNCTION("pzfFqaTMsFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); + LIB_FUNCTION( + "-hrHhi-UFxs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIwEEEm); + LIB_FUNCTION( + "6QU40olMkOM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm); + LIB_FUNCTION( + "kJmdxo4uM+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); + LIB_FUNCTION( + "0sHarDG9BY4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); + LIB_FUNCTION("rme+Po9yI5M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em); + LIB_FUNCTION( + "RV6sGVpYa-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); + LIB_FUNCTION("jIvWFH24Bjw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em); + LIB_FUNCTION( + "aTjYlKCxPGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); + LIB_FUNCTION("qkl3Siab04M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev); + LIB_FUNCTION("hnGhTkIDFHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev); + LIB_FUNCTION("4+oswXtp7PQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev); + LIB_FUNCTION( + "bsohl1ZrRXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEiRT0_S5_mPKT_); + LIB_FUNCTION( + "FX+eS2YsEtY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_); + LIB_FUNCTION( + "i4J5FvRPG-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt10_GetloctxtIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_); + LIB_FUNCTION("V23qt24VPVs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZSt17iostream_categoryv); + LIB_FUNCTION("iXChH4Elf7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt13basic_istreamIwSt11char_traitsIwEE); + LIB_FUNCTION("Lc-l1GQi7tg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt13basic_ostreamIwSt11char_traitsIwEE); + LIB_FUNCTION("FCuvlxsgg0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt24_Iostream_error_category); + LIB_FUNCTION("ymXfiwv59Z0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt15basic_streambufIcSt11char_traitsIcEE); + LIB_FUNCTION("muIOyDB+DP8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt15basic_streambufIwSt11char_traitsIwEE); + LIB_FUNCTION("6ddOFPDvuCo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("dO7-MxIPfsw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("RYlvfQvnOzo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("C3sAx2aJy3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("C4j57iQD4I8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("oYliMCqNYQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("33t+tvosxCI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("h9C+J68WriE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("oNAnn5cOxfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("QNAIWEkBocY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("hBeW7FhedsY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("7DzM2fl46gU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("IfWUkB7Snkc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt15basic_streambufIcSt11char_traitsIcEE); + LIB_FUNCTION("qiloU7D8MBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt15basic_streambufIwSt11char_traitsIwEE); + LIB_FUNCTION("0Ys3rv0tw7Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt13basic_istreamIwSt11char_traitsIwEE); + LIB_FUNCTION("R72NCZqMX58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt13basic_ostreamIwSt11char_traitsIwEE); + LIB_FUNCTION("ItmiNlkXVkQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt24_Iostream_error_category); + LIB_FUNCTION("5DdJdPeXCHE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("XYqrcE4cVMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("B9rn6eKNPJg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("KY+yxjxFBSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("-l+ODHZ96LI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("bn3sb2SwGk8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("OI989Lb3WK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("gqwPsSmdh+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("K8CzKJ7h1-8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("Q3YIaCcEeOM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("wRyKNdtYYEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("0x4NT++LU9s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("izmoTISVoF8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev); + LIB_FUNCTION("q05IXuNA2NE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev); + LIB_FUNCTION("0j1jspKbuFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev); + LIB_FUNCTION("HSkPyRyFFHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev); + LIB_FUNCTION("DBO-xlHHEn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt13basic_istreamIwSt11char_traitsIwEE); + LIB_FUNCTION("BMuRmwMy6eE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt13basic_ostreamIwSt11char_traitsIwEE); + LIB_FUNCTION("lJPCM50sdTc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt24_Iostream_error_category); + LIB_FUNCTION("KfcTPbeaOqg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("Y9C9GeKyZ3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("1kZFcktOm+s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("59oywaaZbJk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("o4kt51-uO48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("sEca1nUOueA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("OwfBD-2nhJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("5KOPB+1eEfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("3n3wCJGFP7o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("CUkG1cK2T+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION("zdCex1HjCCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); + LIB_FUNCTION("ogi5ZolMUs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); + LIB_FUNCTION( + "4-Fllbzfh2k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src); + LIB_FUNCTION( + "NQW6QjEPUak", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src); + LIB_FUNCTION( + "3P+CcdakSi0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src); + LIB_FUNCTION( + "o-gc5R8f50M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src); + LIB_FUNCTION( + "3kjXzznHyCg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src); + LIB_FUNCTION( + "DKkwPpi+uWc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src); + LIB_FUNCTION( + "mZW-My-zemM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePcE4_Src); + LIB_FUNCTION( + "HCzNCcPxu+w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePwE4_Src); + LIB_FUNCTION( + "sHagUsvHBnk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSsE4_Src); + LIB_FUNCTION( + "A5EX+eJmQI8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal__ZZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEEE4_Src); +} + +} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_stream.h b/src/core/libraries/libc_internal/libc_internal_stream.h new file mode 100644 index 000000000..e245454aa --- /dev/null +++ b/src/core/libraries/libc_internal/libc_internal_stream.h @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" + +namespace Core::Loader { +class SymbolsResolver; +} + +namespace Libraries::LibcInternal { +void RegisterlibSceLibcInternalStream(Core::Loader::SymbolsResolver* sym); +} // namespace Libraries::LibcInternal \ No newline at end of file From 67a74a9357218627c8843b9143480e4d62685b87 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 14 Feb 2025 10:03:57 +0200 Subject: [PATCH 285/455] hotfix: removed questionable setjmp --- src/core/libraries/libc_internal/libc_internal.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/libc_internal/libc_internal.cpp b/src/core/libraries/libc_internal/libc_internal.cpp index 98dac007b..a34128586 100644 --- a/src/core/libraries/libc_internal/libc_internal.cpp +++ b/src/core/libraries/libc_internal/libc_internal.cpp @@ -11108,8 +11108,8 @@ s32 PS4_SYSV_ABI internal_setenv() { } s32 PS4_SYSV_ABI internal_setjmp(std::jmp_buf buf) { - LOG_ERROR(Lib_LibcInternal, "(TEST) called"); - return _setjmp(buf); // todo this feels platform specific but maybe not + LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); + return ORBIS_OK; } s32 PS4_SYSV_ABI internal_setlocale() { From 1dca54c165696ba5260d5b9806ed2458bb1d9045 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 14 Feb 2025 10:12:43 +0200 Subject: [PATCH 286/455] hotfix: typo --- src/core/libraries/libc_internal/libc_internal_math.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/libc_internal/libc_internal_math.cpp b/src/core/libraries/libc_internal/libc_internal_math.cpp index 781f1f729..17f971d26 100644 --- a/src/core/libraries/libc_internal/libc_internal_math.cpp +++ b/src/core/libraries/libc_internal/libc_internal_math.cpp @@ -566,7 +566,7 @@ s32 PS4_SYSV_ABI internal_tanl() { return ORBIS_OK; } -float PS4_SYSV_ABI internal__Fsin(float arg, unsigned int m, int n) { +float PS4_SYSV_ABI internal__FSin(float arg, unsigned int m, int n) { ASSERT(n == 0); if (m != 0) { return cosf(arg); From 57bdb6cac2ed64116754755d601489ccf4524045 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 14 Feb 2025 10:24:12 +0200 Subject: [PATCH 287/455] hotfix: another typo.. --- src/core/libraries/libc_internal/libc_internal_str.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/libc_internal/libc_internal_str.cpp b/src/core/libraries/libc_internal/libc_internal_str.cpp index 92a131fa1..e7c0666d6 100644 --- a/src/core/libraries/libc_internal/libc_internal_str.cpp +++ b/src/core/libraries/libc_internal/libc_internal_str.cpp @@ -168,7 +168,7 @@ s32 PS4_SYSV_ABI internal_strcspn(const char* str1, const char* str2) { return std::strcspn(str1, str2); } -char* PS4_SYSV_ABI internal_strdup() { +char* PS4_SYSV_ABI internal_strdup(const char* str1) { LOG_DEBUG(Lib_LibcInternal, "called"); char* dup = (char*)std::malloc(std::strlen(str1) + 1); if (dup != NULL) From ad43ba5ec78a7cf5bbc9d51ed303816a70b677a6 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:17:39 +0100 Subject: [PATCH 288/455] Fix unified config checkbox behaviour + code style changes (#2427) --- src/qt_gui/kbm_config_dialog.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/qt_gui/kbm_config_dialog.cpp b/src/qt_gui/kbm_config_dialog.cpp index 74a49034b..cfff056a0 100644 --- a/src/qt_gui/kbm_config_dialog.cpp +++ b/src/qt_gui/kbm_config_dialog.cpp @@ -10,7 +10,7 @@ #include "common/config.h" #include "common/path_util.h" #include "game_info.h" -#include "src/sdl_window.h" +#include "sdl_window.h" #include #include @@ -39,15 +39,6 @@ EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) { // Create the game selection combo box gameComboBox = new QComboBox(this); gameComboBox->addItem("default"); // Add default option - /* - gameComboBox = new QComboBox(this); - layout->addWidget(gameComboBox); // Add the combobox for selecting game configurations - - // Populate the combo box with game configurations - QStringList gameConfigs = GameInfoClass::GetGameInfo(this); - gameComboBox->addItems(gameConfigs); - gameComboBox->setCurrentText("default.ini"); // Set the default selection - */ // Load all installed games loadInstalledGames(); @@ -60,7 +51,6 @@ EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) { Config::save(Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "config.toml"); }); // Create Save, Cancel, and Help buttons - Config::SetUseUnifiedInputConfig(!Config::GetUseUnifiedInputConfig()); QPushButton* saveButton = new QPushButton("Save", this); QPushButton* cancelButton = new QPushButton("Cancel", this); QPushButton* helpButton = new QPushButton("Help", this); From 1cc9e0d37fb23946c53ce2c2a8b7333ac122e87f Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:30:49 +0100 Subject: [PATCH 289/455] Initial implementation of controller color config (#2411) --- src/common/config.cpp | 22 ++++++++++++++++++ src/common/config.h | 4 ++++ src/core/libraries/pad/pad.cpp | 12 +++++++++- src/input/input_handler.cpp | 42 +++++++++++++++++++++++++++------- src/sdl_window.cpp | 3 ++- 5 files changed, 73 insertions(+), 10 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index e26a998f5..aae903da6 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -71,6 +71,8 @@ static bool rdocEnable = false; static s16 cursorState = HideCursorState::Idle; static int cursorHideTimeout = 5; // 5 seconds (default) static bool useUnifiedInputConfig = true; +static bool overrideControllerColor = false; +static int controllerCustomColorRGB[3] = {0, 0, 255}; static bool separateupdatefolder = false; static bool compatibilityData = false; static bool checkCompatibilityOnStartup = false; @@ -115,6 +117,24 @@ void SetUseUnifiedInputConfig(bool use) { useUnifiedInputConfig = use; } +bool GetOverrideControllerColor() { + return overrideControllerColor; +} + +void SetOverrideControllerColor(bool enable) { + overrideControllerColor = enable; +} + +int* GetControllerCustomColor() { + return controllerCustomColorRGB; +} + +void SetControllerCustomColor(int r, int b, int g) { + controllerCustomColorRGB[0] = r; + controllerCustomColorRGB[1] = b; + controllerCustomColorRGB[2] = g; +} + std::string getTrophyKey() { return trophyKey; } @@ -1046,6 +1066,8 @@ axis_right_y = axis_right_y # Range of deadzones: 1 (almost none) to 127 (max) analog_deadzone = leftjoystick, 2, 127 analog_deadzone = rightjoystick, 2, 127 + +override_controller_color = false, 0, 0, 255 )"; } std::filesystem::path GetFoolproofKbmConfigFile(const std::string& game_id) { diff --git a/src/common/config.h b/src/common/config.h index 3a140c0c8..dfb1d9fad 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -47,6 +47,10 @@ int getSpecialPadClass(); bool getIsMotionControlsEnabled(); bool GetUseUnifiedInputConfig(); void SetUseUnifiedInputConfig(bool use); +bool GetOverrideControllerColor(); +void SetOverrideControllerColor(bool enable); +int* GetControllerCustomColor(); +void SetControllerCustomColor(int r, int b, int g); u32 getScreenWidth(); u32 getScreenHeight(); diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index 173b78382..bcc90c49b 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -261,6 +261,7 @@ int PS4_SYSV_ABI scePadOpen(s32 userId, s32 type, s32 index, const OrbisPadOpenP if (type != ORBIS_PAD_PORT_TYPE_STANDARD && type != ORBIS_PAD_PORT_TYPE_REMOTE_CONTROL) return ORBIS_PAD_ERROR_DEVICE_NOT_CONNECTED; } + scePadResetLightBar(1); return 1; // dummy } @@ -412,7 +413,13 @@ int PS4_SYSV_ABI scePadReadStateExt() { } int PS4_SYSV_ABI scePadResetLightBar(s32 handle) { - LOG_ERROR(Lib_Pad, "(STUBBED) called"); + LOG_INFO(Lib_Pad, "(DUMMY) called"); + if (handle != 1) { + return ORBIS_PAD_ERROR_INVALID_HANDLE; + } + auto* controller = Common::Singleton::Instance(); + int* rgb = Config::GetControllerCustomColor(); + controller->SetLightBarRGB(rgb[0], rgb[1], rgb[2]); return ORBIS_OK; } @@ -472,6 +479,9 @@ int PS4_SYSV_ABI scePadSetForceIntercepted() { } int PS4_SYSV_ABI scePadSetLightBar(s32 handle, const OrbisPadLightBarParam* pParam) { + if (Config::GetOverrideControllerColor()) { + return ORBIS_OK; + } if (pParam != nullptr) { LOG_DEBUG(Lib_Pad, "called handle = {} rgb = {} {} {}", handle, pParam->r, pParam->g, pParam->b); diff --git a/src/input/input_handler.cpp b/src/input/input_handler.cpp index 38a310324..6e961043e 100644 --- a/src/input/input_handler.cpp +++ b/src/input/input_handler.cpp @@ -214,6 +214,9 @@ void ParseInputConfig(const std::string game_id = "") { lefttrigger_deadzone = {1, 127}; righttrigger_deadzone = {1, 127}; + Config::SetOverrideControllerColor(false); + Config::SetControllerCustomColor(0, 0, 255); + int lineCount = 0; std::ifstream file(config_file); @@ -254,6 +257,14 @@ void ParseInputConfig(const std::string game_id = "") { std::string input_string = line.substr(equal_pos + 1); std::size_t comma_pos = input_string.find(','); + auto parseInt = [](const std::string& s) -> std::optional { + try { + return std::stoi(s); + } catch (...) { + return std::nullopt; + } + }; + if (output_string == "mouse_to_joystick") { if (input_string == "left") { SetMouseToJoystick(1); @@ -307,14 +318,6 @@ void ParseInputConfig(const std::string game_id = "") { continue; } - auto parseInt = [](const std::string& s) -> std::optional { - try { - return std::stoi(s); - } catch (...) { - return std::nullopt; - } - }; - auto inner_deadzone = parseInt(inner_deadzone_str); auto outer_deadzone = parseInt(outer_deadzone_str); @@ -341,6 +344,29 @@ void ParseInputConfig(const std::string game_id = "") { lineCount, line); } continue; + } else if (output_string == "override_controller_color") { + std::stringstream ss(input_string); + std::string enable, r_s, g_s, b_s; + std::optional r, g, b; + if (!std::getline(ss, enable, ',') || !std::getline(ss, r_s, ',') || + !std::getline(ss, g_s, ',') || !std::getline(ss, b_s)) { + LOG_WARNING(Input, "Malformed controller color config at line {}: \"{}\"", + lineCount, line); + continue; + } + r = parseInt(r_s); + g = parseInt(g_s); + b = parseInt(b_s); + if (!r || !g || !b) { + LOG_WARNING(Input, "Invalid RGB values at line {}: \"{}\", skipping line.", + lineCount, line); + continue; + } + Config::SetOverrideControllerColor(enable == "true"); + Config::SetControllerCustomColor(*r, *g, *b); + LOG_DEBUG(Input, "Parsed color settings: {} {} {} {}", + enable == "true" ? "override" : "no override", *r, *b, *g); + continue; } // normal cases diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index 6eaad62e5..ccc369c53 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -129,7 +129,8 @@ void SDLInputEngine::Init() { }; } SDL_free(gamepads); - SetLightBarRGB(0, 0, 255); + int* rgb = Config::GetControllerCustomColor(); + SetLightBarRGB(rgb[0], rgb[1], rgb[2]); } void SDLInputEngine::SetLightBarRGB(u8 r, u8 g, u8 b) { From b48975f11697e77c02d6f9ccb44ee658781d2dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:36:23 +0100 Subject: [PATCH 290/455] Qt: Resizing Font Size and Icon Grid Size (#2429) --- src/qt_gui/game_grid_frame.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/game_grid_frame.cpp b/src/qt_gui/game_grid_frame.cpp index 2db4b7e4e..6a42fb1d6 100644 --- a/src/qt_gui/game_grid_frame.cpp +++ b/src/qt_gui/game_grid_frame.cpp @@ -117,7 +117,12 @@ void GameGridFrame::PopulateGameGrid(QVector m_games_search, bool from layout->addWidget(image_label); layout->addWidget(name_label); - name_label->setStyleSheet("color: white; font-size: 12px; font-weight: bold;"); + // Resizing of font-size. + float fontSize = (Config::getIconSizeGrid() / 5.5f); + QString styleSheet = + QString("color: white; font-weight: bold; font-size: %1px;").arg(fontSize); + name_label->setStyleSheet(styleSheet); + QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(); shadowEffect->setBlurRadius(5); // Set the blur radius of the shadow shadowEffect->setColor(QColor(0, 0, 0, 160)); // Set the color and opacity of the shadow From bb6cca3056ef154e996eee1f6e0db24c6cb41a95 Mon Sep 17 00:00:00 2001 From: Dmugetsu <168934208+diegolix29@users.noreply.github.com> Date: Fri, 14 Feb 2025 04:48:52 -0600 Subject: [PATCH 291/455] Adding KBM icon for kbm remaps. (#2430) --- REUSE.toml | 1 + src/images/keyboard_icon.png | Bin 0 -> 4002 bytes src/qt_gui/main_window.cpp | 7 +++++++ src/qt_gui/main_window_ui.h | 5 +++++ src/shadps4.qrc | 1 + 5 files changed, 14 insertions(+) create mode 100644 src/images/keyboard_icon.png diff --git a/REUSE.toml b/REUSE.toml index dc5149e8f..3bc09e328 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -35,6 +35,7 @@ path = [ "src/images/folder_icon.png", "src/images/github.png", "src/images/grid_icon.png", + "src/images/keyboard_icon.png", "src/images/iconsize_icon.png", "src/images/ko-fi.png", "src/images/list_icon.png", diff --git a/src/images/keyboard_icon.png b/src/images/keyboard_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..696c1f9dabbaa7d8cbe9e99a3b386363c799a017 GIT binary patch literal 4002 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 VU~50dpuBn-aI|xU*V+W#{}&&mKDht@ literal 0 HcmV?d00001 diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 556dd0456..5cbce1884 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -142,6 +142,7 @@ void MainWindow::AddUiWidgets() { ui->toolBar->addWidget(ui->refreshButton); ui->toolBar->addWidget(ui->settingsButton); ui->toolBar->addWidget(ui->controllerButton); + ui->toolBar->addWidget(ui->keyboardButton); QFrame* line = new QFrame(this); line->setFrameShape(QFrame::StyledPanel); line->setFrameShadow(QFrame::Sunken); @@ -327,6 +328,11 @@ void MainWindow::CreateConnects() { configWindow->exec(); }); + connect(ui->keyboardButton, &QPushButton::clicked, this, [this]() { + auto kbmWindow = new EditorDialog(this); + kbmWindow->exec(); + }); + #ifdef ENABLE_UPDATER connect(ui->updaterAct, &QAction::triggered, this, [this]() { auto checkUpdate = new CheckUpdate(true); @@ -1106,6 +1112,7 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->refreshButton->setIcon(RecolorIcon(ui->refreshButton->icon(), isWhite)); ui->settingsButton->setIcon(RecolorIcon(ui->settingsButton->icon(), isWhite)); ui->controllerButton->setIcon(RecolorIcon(ui->controllerButton->icon(), isWhite)); + ui->keyboardButton->setIcon(RecolorIcon(ui->keyboardButton->icon(), isWhite)); ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite)); ui->menuGame_List_Mode->setIcon(RecolorIcon(ui->menuGame_List_Mode->icon(), isWhite)); ui->pkgViewerAct->setIcon(RecolorIcon(ui->pkgViewerAct->icon(), isWhite)); diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 7de166121..ee582b929 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -47,6 +47,7 @@ public: QPushButton* refreshButton; QPushButton* settingsButton; QPushButton* controllerButton; + QPushButton* keyboardButton; QWidget* sizeSliderContainer; QHBoxLayout* sizeSliderContainer_layout; @@ -210,6 +211,10 @@ public: controllerButton->setFlat(true); controllerButton->setIcon(QIcon(":images/controller_icon.png")); controllerButton->setIconSize(QSize(40, 40)); + keyboardButton = new QPushButton(centralWidget); + keyboardButton->setFlat(true); + keyboardButton->setIcon(QIcon(":images/keyboard_icon.png")); + keyboardButton->setIconSize(QSize(40, 40)); sizeSliderContainer = new QWidget(centralWidget); sizeSliderContainer->setObjectName("sizeSliderContainer"); diff --git a/src/shadps4.qrc b/src/shadps4.qrc index 40aeb9fb9..14b50f7a5 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -31,5 +31,6 @@ images/youtube.png images/website.png images/ps4_controller.png + images/keyboard_icon.png From 16451b01e8e6372ec4d63706cbf56c58486bb011 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 14 Feb 2025 16:49:09 -0300 Subject: [PATCH 292/455] Fix PR 2424 (#2433) * Fix PR 2424 * chooseHomeTab --- src/qt_gui/settings_dialog.cpp | 47 ++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index c2962ebf9..1598b0640 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -59,6 +59,9 @@ QStringList languageNames = {"Arabic", const QVector languageIndexes = {21, 23, 14, 6, 18, 1, 12, 22, 2, 4, 25, 24, 29, 5, 0, 9, 15, 16, 17, 7, 26, 8, 11, 20, 3, 13, 27, 10, 19, 30, 28}; QMap channelMap; +QMap logTypeMap; +QMap fullscreenModeMap; +QMap chooseHomeTabMap; SettingsDialog::SettingsDialog(std::span physical_devices, std::shared_ptr m_compat_info, @@ -73,6 +76,12 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->buttonBox->button(QDialogButtonBox::StandardButton::Close)->setFocus(); channelMap = {{tr("Release"), "Release"}, {tr("Nightly"), "Nightly"}}; + logTypeMap = {{tr("async"), "async"}, {tr("sync"), "sync"}}; + fullscreenModeMap = {{tr("Borderless"), "Borderless"}, {tr("True"), "True"}}; + chooseHomeTabMap = {{tr("General"), "General"}, {tr("GUI"), "GUI"}, + {tr("Graphics"), "Graphics"}, {tr("User"), "User"}, + {tr("Input"), "Input"}, {tr("Paths"), "Paths"}, + {tr("Debug"), "Debug"}}; // Add list of available GPUs ui->graphicsAdapterBox->addItem(tr("Auto Select")); // -1, auto selection @@ -374,15 +383,19 @@ void SettingsDialog::LoadValuesFromConfig() { ui->discordRPCCheckbox->setChecked( toml::find_or(data, "General", "enableDiscordRPC", true)); ui->fullscreenCheckBox->setChecked(toml::find_or(data, "General", "Fullscreen", false)); - ui->fullscreenModeComboBox->setCurrentText(QString::fromStdString( - toml::find_or(data, "General", "FullscreenMode", "Borderless"))); + QString translatedText_FullscreenMode = + fullscreenModeMap.key(QString::fromStdString(Config::getFullscreenMode())); + if (!translatedText_FullscreenMode.isEmpty()) { + ui->fullscreenModeComboBox->setCurrentText(translatedText_FullscreenMode); + } ui->separateUpdatesCheckBox->setChecked( toml::find_or(data, "General", "separateUpdateEnabled", false)); ui->gameSizeCheckBox->setChecked(toml::find_or(data, "GUI", "loadGameSizeEnabled", true)); ui->showSplashCheckBox->setChecked(toml::find_or(data, "General", "showSplash", false)); - std::string logType = Config::getLogType(); - ui->logTypeComboBox->setCurrentText(logType == "async" ? tr("async") - : (logType == "sync" ? tr("sync") : "")); + QString translatedText_logType = logTypeMap.key(QString::fromStdString(Config::getLogType())); + if (!translatedText_logType.isEmpty()) { + ui->logTypeComboBox->setCurrentText(translatedText_logType); + } ui->logFilterLineEdit->setText( QString::fromStdString(toml::find_or(data, "General", "logFilter", ""))); ui->userNameLineEdit->setText( @@ -421,13 +434,19 @@ void SettingsDialog::LoadValuesFromConfig() { : updateChannel)); #endif - std::string chooseHomeTab = toml::find_or(data, "General", "chooseHomeTab", ""); - ui->chooseHomeTabComboBox->setCurrentText(QString::fromStdString(chooseHomeTab)); + std::string chooseHomeTab = + toml::find_or(data, "General", "chooseHomeTab", "General"); + QString translatedText = chooseHomeTabMap.key(QString::fromStdString(chooseHomeTab)); + if (translatedText.isEmpty()) { + translatedText = tr("General"); + } + ui->chooseHomeTabComboBox->setCurrentText(translatedText); + QStringList tabNames = {tr("General"), tr("GUI"), tr("Graphics"), tr("User"), tr("Input"), tr("Paths"), tr("Debug")}; - QString chooseHomeTabQString = QString::fromStdString(chooseHomeTab); - int indexTab = tabNames.indexOf(chooseHomeTabQString); - indexTab = (indexTab == -1) ? 0 : indexTab; + int indexTab = tabNames.indexOf(translatedText); + if (indexTab == -1) + indexTab = 0; ui->tabWidgetSettings->setCurrentIndex(indexTab); QString backButtonBehavior = QString::fromStdString( @@ -634,12 +653,13 @@ void SettingsDialog::UpdateSettings() { const QVector TouchPadIndex = {"left", "center", "right", "none"}; Config::setBackButtonBehavior(TouchPadIndex[ui->backButtonBehaviorComboBox->currentIndex()]); Config::setIsFullscreen(ui->fullscreenCheckBox->isChecked()); - Config::setFullscreenMode(ui->fullscreenModeComboBox->currentText().toStdString()); + Config::setFullscreenMode( + fullscreenModeMap.value(ui->fullscreenModeComboBox->currentText()).toStdString()); Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); Config::setAllowHDR(ui->enableHDRCheckBox->isChecked()); - Config::setLogType((ui->logTypeComboBox->currentText() == tr("async") ? "async" : "sync")); + Config::setLogType(logTypeMap.value(ui->logTypeComboBox->currentText()).toStdString()); Config::setLogFilter(ui->logFilterLineEdit->text().toStdString()); Config::setUserName(ui->userNameLineEdit->text().toStdString()); Config::setTrophyKey(ui->trophyKeyLineEdit->text().toStdString()); @@ -669,7 +689,8 @@ void SettingsDialog::UpdateSettings() { Config::setAutoUpdate(ui->updateCheckBox->isChecked()); Config::setAlwaysShowChangelog(ui->changelogCheckBox->isChecked()); Config::setUpdateChannel(channelMap.value(ui->updateComboBox->currentText()).toStdString()); - Config::setChooseHomeTab(ui->chooseHomeTabComboBox->currentText().toStdString()); + Config::setChooseHomeTab( + chooseHomeTabMap.value(ui->chooseHomeTabComboBox->currentText()).toStdString()); Config::setCompatibilityEnabled(ui->enableCompatibilityCheckBox->isChecked()); Config::setCheckCompatibilityOnStartup(ui->checkCompatibilityOnStartupCheckBox->isChecked()); Config::setBackgroundImageOpacity(ui->backgroundImageOpacitySlider->value()); From 1781fcb9ef06c548782b193433d92bed50f62a5f Mon Sep 17 00:00:00 2001 From: Dmugetsu <168934208+diegolix29@users.noreply.github.com> Date: Fri, 14 Feb 2025 13:53:36 -0600 Subject: [PATCH 293/455] Kbm icon change and size modified. (#2435) * Adding KBM icon for kbm remaps. * New Icon and new size --- src/images/keyboard_icon.png | Bin 4002 -> 5986 bytes src/qt_gui/main_window_ui.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/images/keyboard_icon.png b/src/images/keyboard_icon.png index 696c1f9dabbaa7d8cbe9e99a3b386363c799a017..021db61ffe1ca02f702cb5952eecaca482e02584 100644 GIT binary patch literal 5986 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 VU~50dpuBn-aI|xU*V+W#{}&&mKDht@ diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index ee582b929..e74ffcacb 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -214,7 +214,7 @@ public: keyboardButton = new QPushButton(centralWidget); keyboardButton->setFlat(true); keyboardButton->setIcon(QIcon(":images/keyboard_icon.png")); - keyboardButton->setIconSize(QSize(40, 40)); + keyboardButton->setIconSize(QSize(48, 44)); sizeSliderContainer = new QWidget(centralWidget); sizeSliderContainer->setObjectName("sizeSliderContainer"); From 32763b7af6c12ea54054ba038109771361319aa4 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 14 Feb 2025 21:54:49 +0200 Subject: [PATCH 294/455] New Crowdin updates (#2436) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Spanish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Polish) * New translations en_us.ts (Russian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) --- src/qt_gui/translations/ar_SA.ts | 20 +- src/qt_gui/translations/da_DK.ts | 20 +- src/qt_gui/translations/el_GR.ts | 22 +-- src/qt_gui/translations/es_ES.ts | 48 ++--- src/qt_gui/translations/fa_IR.ts | 32 +-- src/qt_gui/translations/fi_FI.ts | 10 +- src/qt_gui/translations/fr_FR.ts | 148 +++++++------- src/qt_gui/translations/hu_HU.ts | 20 +- src/qt_gui/translations/id_ID.ts | 20 +- src/qt_gui/translations/it_IT.ts | 192 +++++++++--------- src/qt_gui/translations/ja_JP.ts | 10 +- src/qt_gui/translations/ko_KR.ts | 80 ++++---- src/qt_gui/translations/lt_LT.ts | 26 +-- src/qt_gui/translations/nl_NL.ts | 20 +- src/qt_gui/translations/pl_PL.ts | 10 +- src/qt_gui/translations/pt_BR.ts | 330 +++++++++++++++---------------- src/qt_gui/translations/ro_RO.ts | 22 +-- src/qt_gui/translations/ru_RU.ts | 108 +++++----- src/qt_gui/translations/sq_AL.ts | 168 ++++++++-------- src/qt_gui/translations/sv_SE.ts | 80 ++++---- src/qt_gui/translations/tr_TR.ts | 170 ++++++++-------- src/qt_gui/translations/vi_VN.ts | 120 +++++------ src/qt_gui/translations/zh_CN.ts | 158 +++++++-------- src/qt_gui/translations/zh_TW.ts | 20 +- 24 files changed, 927 insertions(+), 927 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index f6d42c1c7..b489e4446 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 9f6cf8550..3a66ee624 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index e3892006f..bb322ce08 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -1553,7 +1553,7 @@ Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 809d64578..4997f5645 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -26,7 +26,7 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + Trucos / Parches para Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -186,7 +186,7 @@ Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - ¡Parches descargados exitosamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. + ¡Parches descargados correctamente! Todos los parches disponibles para todos los juegos han sido descargados, no es necesario descargarlos individualmente para cada juego como ocurre con los trucos. Si el parche no aparece, puede ser que no exista para el número de serie y versión específicos del juego. Failed to parse JSON data from HTML. @@ -411,7 +411,7 @@ ControlSettings Configure Controls - Configure Controls + Configurar Controles Control Settings @@ -423,7 +423,7 @@ Up - Up + Arriba Left @@ -475,7 +475,7 @@ KBM Editor - KBM Editor + Editor KBM Back @@ -499,7 +499,7 @@ R3 - R3 + R3 Face Buttons @@ -519,7 +519,7 @@ Cross / A - Cross / A + Cruz / A Right Stick Deadzone (def:2, max:127) @@ -655,7 +655,7 @@ Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + El juego tiene fallos graves o un rendimiento que lo hace injugable Game can be completed with playable performance and no major glitches @@ -690,7 +690,7 @@ TB - TB + TB @@ -745,7 +745,7 @@ Copy Size - Copy Size + Copiar Tamaño Copy All @@ -761,7 +761,7 @@ Delete Update - Delete Update + Eliminar Actualización Delete DLC @@ -1155,7 +1155,7 @@ Eboot.bin file not found - Eboot.bin file not found + Archivo Eboot.bin no encontrado PKG File (*.PKG *.pkg) @@ -1194,7 +1194,7 @@ Installed - Installed + Instalado Size @@ -1553,7 +1553,7 @@ Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index b4f469f26..dcbf7e6dd 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1417,19 +1417,19 @@ Enable Debug Dumping - Debug Dumping + Enable Debug Dumping Enable Vulkan Validation Layers - Vulkan Validation Layers + Enable Vulkan Validation Layers Enable Vulkan Synchronization Validation - Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation Enable RenderDoc Debugging - RenderDoc Debugging + Enable RenderDoc Debugging Enable Crash Diagnostics @@ -1541,7 +1541,7 @@ Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Emulator Language:\nSets the language of the emulator's user interface. @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1577,7 +1577,7 @@ Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. @@ -1665,7 +1665,7 @@ Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. @@ -1689,35 +1689,35 @@ Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 1ca07a92b..5e9e33c85 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 21d7884d8..d01ac2847 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -42,7 +42,7 @@ Version: - Version: + Version: Size: @@ -90,7 +90,7 @@ Cheats - Cheats + Cheats Patches @@ -411,95 +411,95 @@ ControlSettings Configure Controls - Configure Controls + Configurer les Commandes Control Settings - Control Settings + Paramètres de Contrôle D-Pad - D-Pad + Croix directionnelle Up - Up + Haut Left - Left + Gauche Right - Right + Droite Down - Down + Bas Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Stick Gauche Deadzone (def:2 max:127) Left Deadzone - Left Deadzone + Deadzone Gauche Left Stick - Left Stick + Joystick gauche Config Selection - Config Selection + Sélection de la Configuration Common Config - Common Config + Configuration Commune Use per-game configs - Use per-game configs + Utiliser les configurations par jeu L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + Commandes KBM KBM Editor - KBM Editor + Éditeur KBM Back - Back + Retour R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons @@ -507,31 +507,31 @@ Triangle / Y - Triangle / Y + Triangle / Y Square / X - Square / X + Carré / X Circle / B - Circle / B + Rond / B Cross / A - Cross / A + Croix / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Joystick Gauche Deadzone (def:2 max:127) Right Deadzone - Right Deadzone + Deadzone Droit Right Stick - Right Stick + Joystick Droit @@ -576,7 +576,7 @@ Directory to install DLC - Directory to install DLC + Répertoire d'installation des DLC @@ -603,7 +603,7 @@ Firmware - Firmware + Firmware Size @@ -611,7 +611,7 @@ Version - Version + Version Path @@ -627,15 +627,15 @@ h - h + h m - m + m s - s + s Compatibility is untested @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + Ko MB - MB + Mo GB - GB + Go TB - TB + To @@ -741,11 +741,11 @@ Copy Version - Copy Version + Copier la Version Copy Size - Copy Size + Copier la Taille Copy All @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -833,27 +833,27 @@ Open Update Folder - Open Update Folder + Ouvrir le Dossier de Mise à Jour Delete Save Data - Delete Save Data + Supprimer les Données de Sauvegarde This game has no update folder to open! - This game has no update folder to open! + Ce jeu n'a pas de dossier de mise à jour à ouvrir! Failed to convert icon. - Failed to convert icon. + Échec de la conversion de l'icône. This game has no save data to delete! - This game has no save data to delete! + Ce jeu n'a pas de mise à jour à supprimer! Save Data - Save Data + Enregistrer les Données @@ -868,11 +868,11 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Installer toute la file d’attente dans le dossier sélectionné Delete PKG File on Install - Delete PKG File on Install + Supprimer le fichier PKG à l'installation @@ -1031,7 +1031,7 @@ Violet - Violet + Violet toolBar @@ -1151,27 +1151,27 @@ Run Game - Run Game + Lancer le jeu Eboot.bin file not found - Eboot.bin file not found + Fichier Eboot.bin introuvable PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + Fichier PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG est un patch ou DLC, veuillez d'abord installer le jeu ! Game is already running! - Game is already running! + Le jeu est déjà en cours ! shadPS4 - shadPS4 + shadPS4 @@ -1194,7 +1194,7 @@ Installed - Installed + Installé Size @@ -1202,19 +1202,19 @@ Category - Category + Catégorie Type - Type + Type App Ver - App Ver + App Ver FW - FW + FW Region @@ -1238,7 +1238,7 @@ Package - Package + Package @@ -1341,7 +1341,7 @@ s - s + s Controller @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + Activer HDR Paths @@ -1485,15 +1485,15 @@ Background Image - Background Image + Image d'arrière-plan Show Background Image - Show Background Image + Afficher l'image d'arrière-plan Opacity - Opacity + Transparence Play title music @@ -1517,7 +1517,7 @@ Volume - Volume + Volume Save diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index a932337c6..20a6225ca 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index e1791ee70..6504c7808 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index ad7b5cad4..1990f8cae 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -321,7 +321,7 @@ No - No + No Hide Changelog @@ -337,7 +337,7 @@ Download Complete - Download completato + Download Completato The update has been downloaded, press OK to install. @@ -349,7 +349,7 @@ Starting Update... - Inizio aggiornamento... + Inizio Aggiornamento... Failed to create the update script file @@ -411,127 +411,127 @@ ControlSettings Configure Controls - Configure Controls + Configura Comandi Control Settings - Control Settings + Impostazioni dei Comandi D-Pad - D-Pad + Croce direzionale Up - Up + Su Left - Left + Sinistra Right - Right + Destra Down - Down + Giù Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Zona Morta Levetta Sinistra (def:2 max:127) Left Deadzone - Left Deadzone + Zona Morta Sinistra Left Stick - Left Stick + Levetta Sinistra Config Selection - Config Selection + Selezione Configurazione Common Config - Common Config + Configurazione Comune Use per-game configs - Use per-game configs + Usa configurazioni per gioco L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + Controlli Tastiera/Mouse KBM Editor - KBM Editor + Editor Tastiera/Mouse Back - Back + Indietro R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Opzioni / Avvio R3 - R3 + R3 Face Buttons - Face Buttons + Pulsanti Frontali Triangle / Y - Triangle / Y + Triangolo / Y Square / X - Square / X + Quadrato / X Circle / B - Circle / B + Cerchio / B Cross / A - Cross / A + Croce / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Zona Morta Levetta Destra (def:2 max:127) Right Deadzone - Right Deadzone + Zona Morta Destra Right Stick - Right Stick + Levetta Destra @@ -576,7 +576,7 @@ Directory to install DLC - Directory to install DLC + Cartella di installazione DLC @@ -603,7 +603,7 @@ Firmware - Firmware + Firmware Size @@ -631,11 +631,11 @@ m - m + m s - s + s Compatibility is untested @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -741,11 +741,11 @@ Copy Version - Copy Version + Copia Versione Copy Size - Copy Size + Copia Dimensione Copy All @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -833,27 +833,27 @@ Open Update Folder - Open Update Folder + Apri Cartella Aggiornamento Delete Save Data - Delete Save Data + Elimina Dati Salvataggio This game has no update folder to open! - This game has no update folder to open! + Questo gioco non ha nessuna cartella di aggiornamento da aprire! Failed to convert icon. - Failed to convert icon. + Impossibile convertire l'icona. This game has no save data to delete! - This game has no save data to delete! + Questo gioco non ha alcun salvataggio dati da eliminare! Save Data - Save Data + Dati Salvataggio @@ -868,11 +868,11 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Installa tutto in coda nella Cartella Selezionata Delete PKG File on Install - Delete PKG File on Install + Elimina file PKG dopo Installazione @@ -983,7 +983,7 @@ File - File + File View @@ -1151,27 +1151,27 @@ Run Game - Run Game + Esegui Gioco Eboot.bin file not found - Eboot.bin file not found + File Eboot.bin non trovato PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + File PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + Il file PKG è una patch o DLC, si prega di installare prima il gioco! Game is already running! - Game is already running! + Il gioco è già in esecuzione! shadPS4 - shadPS4 + shadPS4 @@ -1194,7 +1194,7 @@ Installed - Installed + Installato Size @@ -1202,19 +1202,19 @@ Category - Category + Categoria Type - Type + Tipo App Ver - App Ver + Vers. App. FW - FW + FW Region @@ -1222,7 +1222,7 @@ Flags - Flags + Segnalazioni Path @@ -1230,7 +1230,7 @@ File - File + File Unknown @@ -1238,7 +1238,7 @@ Package - Package + Pacchetto @@ -1309,7 +1309,7 @@ Logger - Logger + Registro Log Type @@ -1325,7 +1325,7 @@ Input - Input + Input Cursor @@ -1341,11 +1341,11 @@ s - s + s Controller - Controller + Controller Back Button Behavior @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + Abilita HDR Paths @@ -1413,11 +1413,11 @@ Debug - Debug + Debug Enable Debug Dumping - Enable Debug Dumping + Abilita Debug Dumping Enable Vulkan Validation Layers @@ -1485,15 +1485,15 @@ Background Image - Background Image + Immagine di Sfondo Show Background Image - Show Background Image + Mostra l'Immagine dello Sfondo Opacity - Opacity + Opacità Play title music @@ -1517,7 +1517,7 @@ Volume - Volume + Volume Save @@ -1585,7 +1585,7 @@ Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Immagine di sfondo:\nControlla l'opacità dell'immagine di sfondo del gioco. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. @@ -1669,7 +1669,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Abilita HDR:\nAbilita HDR nei giochi che lo supportano.\nIl tuo monitor deve avere il supporto per lo spazio colore BT2020 PQ e il formato swapchain RGB10A2. Game Folders:\nThe list of folders to check for installed games. @@ -1721,39 +1721,39 @@ Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Percorso Dati Salvataggio:\n La cartella dove verranno archiviati i salvataggi di gioco. Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Esplora:\nEsplora una cartella da impostare come percorso dati di salvataggio. Borderless - Borderless + Finestra senza bordi True - True + Vero Release - Release + Rilascio Nightly - Nightly + Nightly Set the volume of the background music. - Set the volume of the background music. + Imposta il volume della musica di sottofondo. Enable Motion Controls - Enable Motion Controls + Abilita Controlli Di Movimento Save Data Path - Save Data Path + Percorso Dati Salvataggio Browse @@ -1761,15 +1761,15 @@ async - async + Non sincronizzato sync - sync + Sincronizzato Auto Select - Auto Select + Selezione Automatica Directory to install games @@ -1777,7 +1777,7 @@ Directory to save data - Directory to save data + Cartella per salvare i dati diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 1cef2dd6e..fd1de8f78 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index cb16358e6..b344e0b5d 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -30,7 +30,7 @@ Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n No Image Available @@ -162,7 +162,7 @@ No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. Cheats Downloaded Successfully @@ -170,7 +170,7 @@ You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. Failed to save: @@ -186,7 +186,7 @@ Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. Failed to parse JSON data from HTML. @@ -242,7 +242,7 @@ Can't apply cheats before the game is started - Can't apply cheats before the game is started. + Can't apply cheats before the game is started Close @@ -1541,23 +1541,23 @@ Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. Emulator Language:\nSets the language of the emulator's user interface. - Emulator Language:\nSets the language of the emulator's user interface. + Emulator Language:\nSets the language of the emulator's user interface. Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. @@ -1565,23 +1565,23 @@ Username:\nSets the PS4's account username, which may be displayed by some games. - Username:\nSets the PS4's account username, which may be displayed by some games. + Username:\nSets the PS4's account username, which may be displayed by some games. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Levels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. Background Image:\nControl the opacity of the game background image. @@ -1589,35 +1589,35 @@ Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Set a time for the mouse to disappear after being after being idle. + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1649,23 +1649,23 @@ Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. @@ -1673,51 +1673,51 @@ Game Folders:\nThe list of folders to check for installed games. - Game Folders:\nThe list of folders to check for installed games. + Game Folders:\nThe list of folders to check for installed games. Add:\nAdd a folder to the list. - Add:\nAdd a folder to the list. + Add:\nAdd a folder to the list. Remove:\nRemove a folder from the list. - Remove:\nRemove a folder from the list. + Remove:\nRemove a folder from the list. Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state. This will reduce performance and likely change the behavior of emulation. + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks. This will reduce performance and likely change the behavior of emulation. + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 8177769ce..711d0c7d2 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1553,7 +1553,7 @@ Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1601,7 +1601,7 @@ Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Nustatykite laiką, po kurio pelė dings, kai bus neaktyvi. + Slėpti tuščiosios eigos žymeklio skirtąjį laiką:\nTrukmė (sekundėmis), po kurios neaktyvus žymeklis pasislepia. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1693,7 +1693,7 @@ Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką. Tai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. + Įjungti Vulkan sinchronizacijos patvirtinimą:\nĮjungia sistemą, kuri patvirtina Vulkan renderavimo užduočių laiką.\nTai sumažins našumą ir tikriausiai pakeis emuliacijos elgesį. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index b73ab077d..6cd39b209 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 1499b1637..e17859784 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 6ecf59003..33f76764f 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -19,7 +19,7 @@ This software should not be used to play games you have not legally obtained. - Este software não deve ser usado para jogar jogos piratas. + Este programa não deve ser usado para jogar jogos piratas. @@ -30,7 +30,7 @@ Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\n + Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte os problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\n No Image Available @@ -38,7 +38,7 @@ Serial: - Serial: + Serial: Version: @@ -70,7 +70,7 @@ You can delete the cheats you don't want after downloading them. - Você pode excluir os cheats que não deseja após baixá-las. + Você pode excluir os cheats que não deseja após baixá-los. Do you want to delete the selected file?\n%1 @@ -90,11 +90,11 @@ Cheats - Cheats + Cheats Patches - Patches + Patches Error @@ -142,7 +142,7 @@ File Exists - Arquivo Existe + Arquivo já Existe File already exists. Do you want to replace it? @@ -170,7 +170,7 @@ You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - Você baixou os cheats com sucesso. Para esta versão do jogo a partir do repositório selecionado. Você pode tentar baixar de outro repositório, se estiver disponível, também será possível usá-lo selecionando o arquivo da lista. + Você baixou os cheats para esta versão do jogo do repositório selecionado com sucesso. É possível tentar baixar de outro repositório, se estiver disponível, também será possível utilizá-lo selecionando o arquivo da lista. Failed to save: @@ -182,11 +182,11 @@ Download Complete - Download Completo + Download Concluído Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que ele não exista para o número de série e a versão específicos do jogo. + Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece em Cheats. Se o patch não aparecer, pode ser que ele não exista para o serial e versão específicas do jogo. Failed to parse JSON data from HTML. @@ -253,7 +253,7 @@ CheckUpdate Auto Updater - Atualizador automático + Atualização Automática Error @@ -273,11 +273,11 @@ No pre-releases found. - Nenhuma pre-release encontrada. + Nenhum Pre-Release encontrado. Invalid release data. - Dados da release inválidos. + Dados do release inválidos. No download URL found for the specified asset. @@ -297,11 +297,11 @@ Current Version - Versão atual + Versão Atual Latest Version - Última versão + Última Versão Do you want to update? @@ -309,7 +309,7 @@ Show Changelog - Mostrar Changelog + Mostrar Mudanças Check for Updates at Startup @@ -325,7 +325,7 @@ Hide Changelog - Ocultar Changelog + Ocultar Mudanças Changes @@ -337,7 +337,7 @@ Download Complete - Download Completo + Download Concluído The update has been downloaded, press OK to install. @@ -349,7 +349,7 @@ Starting Update... - Iniciando atualização... + Iniciando Atualização... Failed to create the update script file @@ -396,7 +396,7 @@ Menus - Menus + Menus Ingame @@ -411,127 +411,127 @@ ControlSettings Configure Controls - Configure Controls + Configurar Controles Control Settings - Control Settings + Configurações do Controle D-Pad - D-Pad + Direcional Up - Up + Cima Left - Left + Esquerda Right - Right + Direita Down - Down + Baixo Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Zona Morta do Analógico Esquerdo (Pad: 2, Máx: 127) Left Deadzone - Left Deadzone + Zona Morta Esquerda Left Stick - Left Stick + Analógico Esquerdo Config Selection - Config Selection + Seleção de Configuração Common Config - Common Config + Configuração Comum Use per-game configs - Use per-game configs + Usar configurações por jogo L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + Controles T/M KBM Editor - KBM Editor + Editor T/M Back - Back + Voltar R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons - Face Buttons + Botões de Face Triangle / Y - Triangle / Y + Triângulo / Y Square / X - Square / X + Quadrado / X Circle / B - Circle / B + Círculo / B Cross / A - Cross / A + Cruz / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Zona Morta do Analógico Direito (Pad: 2, Máx: 127) Right Deadzone - Right Deadzone + Zona Morta Direita Right Stick - Right Stick + Analógico Direito @@ -560,11 +560,11 @@ GameInstallDialog shadPS4 - Choose directory - shadPS4 - Escolha o diretório + shadPS4 - Escolha de diretório Directory to install games - Diretório para instalar jogos + Diretório onde os jogos serão instalados Browse @@ -576,14 +576,14 @@ Directory to install DLC - Directory to install DLC + Diretório para instalar DLC GameListFrame Icon - Icone + Ícone Name @@ -591,7 +591,7 @@ Serial - Serial + Serial Compatibility @@ -603,7 +603,7 @@ Firmware - Firmware + Firmware Size @@ -627,15 +627,15 @@ h - h + h m - m + m s - s + s Compatibility is untested @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -701,7 +701,7 @@ Cheats / Patches - Cheats / Patches + Cheats / Patches SFO Viewer @@ -709,7 +709,7 @@ Trophy Viewer - Visualizador de Troféu + Visualizador de Troféus Open Folder... @@ -721,7 +721,7 @@ Open Save Data Folder - Abrir Pasta de Save + Abrir Pasta de Dados Salvos Open Log Folder @@ -741,11 +741,11 @@ Copy Version - Copy Version + Copiar Versão Copy Size - Copy Size + Copiar Tamanho Copy All @@ -817,11 +817,11 @@ This game has no DLC to delete! - Este jogo não tem DLC para excluir! + Este jogo não tem DLC para deletar! DLC - DLC + DLC Delete %1 @@ -833,27 +833,27 @@ Open Update Folder - Open Update Folder + Abrir Pasta da Atualização Delete Save Data - Delete Save Data + Excluir Dados Salvos This game has no update folder to open! - This game has no update folder to open! + Este jogo não tem atualização para deletar! Failed to convert icon. - Failed to convert icon. + Falha ao converter o ícone. This game has no save data to delete! - This game has no save data to delete! + Este jogo não tem dados salvos para deletar! Save Data - Save Data + Dados Salvos @@ -868,11 +868,11 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Instalar Todas da Fila para a Pasta Selecionada Delete PKG File on Install - Delete PKG File on Install + Deletar PKG após instalação @@ -891,7 +891,7 @@ Check for Updates - Verificar atualizações + Verificar Atualizações About shadPS4 @@ -1055,7 +1055,7 @@ Download Complete - Download Completo + Download Concluído You have downloaded cheats for all the games you have installed. @@ -1123,7 +1123,7 @@ DLC already installed: - DLC já instalada: + DLC já está instalado: Game already installed @@ -1151,27 +1151,27 @@ Run Game - Run Game + Executar Jogo Eboot.bin file not found - Eboot.bin file not found + Arquivo Eboot.bin não encontrado PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + Arquivo PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + O PKG é um patch ou DLC, por favor instale o jogo primeiro! Game is already running! - Game is already running! + O jogo já está executando! shadPS4 - shadPS4 + shadPS4 @@ -1190,11 +1190,11 @@ Serial - Serial + Serial Installed - Installed + Instalado Size @@ -1202,19 +1202,19 @@ Category - Category + Categoria Type - Type + Tipo App Ver - App Ver + App Ver FW - FW + FW Region @@ -1222,7 +1222,7 @@ Flags - Flags + Flags Path @@ -1238,7 +1238,7 @@ Package - Package + Pacote @@ -1269,7 +1269,7 @@ Enable Fullscreen - Habilitar Tela Cheia + Ativar Tela Cheia Fullscreen Mode @@ -1277,7 +1277,7 @@ Enable Separate Update Folder - Habilitar pasta de atualização separada + Ativar Pasta de Atualização Separada Default tab when opening settings @@ -1293,7 +1293,7 @@ Enable Discord Rich Presence - Habilitar Discord Rich Presence + Ativar Discord Rich Presence Username @@ -1321,7 +1321,7 @@ Open Log Location - Abrir local do registro + Abrir Local do Registro Input @@ -1329,7 +1329,7 @@ Cursor - Cursor + Cursor Hide Cursor @@ -1341,7 +1341,7 @@ s - s + s Controller @@ -1349,7 +1349,7 @@ Back Button Behavior - Comportamento do botão Voltar + Comportamento do Botão Voltar Graphics @@ -1385,15 +1385,15 @@ Enable Shaders Dumping - Habilitar Dumping de Shaders + Ativar Dumping de Shaders Enable NULL GPU - Habilitar GPU NULA + Ativar GPU NULA Enable HDR - Enable HDR + Ativar HDR Paths @@ -1401,7 +1401,7 @@ Game Folders - Pastas dos Jogos + Pastas de Jogos Add... @@ -1417,23 +1417,23 @@ Enable Debug Dumping - Habilitar Depuração de Dumping + Ativar Depuração de Dumping Enable Vulkan Validation Layers - Habilitar Camadas de Validação do Vulkan + Ativar Camadas de Validação do Vulkan Enable Vulkan Synchronization Validation - Habilitar Validação de Sincronização do Vulkan + Ativar Validação de Sincronização do Vulkan Enable RenderDoc Debugging - Habilitar Depuração do RenderDoc + Ativar Depuração por RenderDoc Enable Crash Diagnostics - Habilitar Diagnóstico de Falhas + Ativar Diagnóstico de Falhas Collect Shaders @@ -1461,7 +1461,7 @@ Always Show Changelog - Sempre Mostrar o Changelog + Sempre Mostrar o Histórico de Mudanças Update Channel @@ -1469,7 +1469,7 @@ Check for Updates - Verificar atualizações + Verificar Atualizações GUI Settings @@ -1485,15 +1485,15 @@ Background Image - Background Image + Imagem de Fundo Show Background Image - Show Background Image + Exibir Imagem de Fundo Opacity - Opacity + Transparência Play title music @@ -1517,7 +1517,7 @@ Volume - Volume + Volume Save @@ -1541,7 +1541,7 @@ Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - Idioma do console:\nDefine o idioma usado pelo jogo no PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. + Idioma do console:\nDefine o idioma usado pelo jogo do PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. Emulator Language:\nSets the language of the emulator's user interface. @@ -1549,11 +1549,11 @@ Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Habilitar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. + Ativar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Habilitar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento. + Ativar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento.\nIsso pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome "CUSA00000-UPDATE" onde o ID do CUSA corresponde ao ID do jogo. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1561,7 +1561,7 @@ Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. - Habilitar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. + Ativar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. Username:\nSets the PS4's account username, which may be displayed by some games. @@ -1569,31 +1569,31 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Chave de Troféu:\nChave usada para descriptografar troféus. Deve ser obtida a partir do seu console desbloqueado.\nDeve conter apenas caracteres hexadecimais. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Tipo de Registro:\nDefine se a saída da janela de log deve ser sincronizada para melhorar o desempenho. Isso pode impactar negativamente a emulação. + Tipo do Registro:\nDetermina se a saída da janela de log deve ser sincronizada por motivos de desempenho. Pode impactar negativamente a emulação. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Filtro de Registro:\nImprime apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - assim, um nível específico desativa todos os níveis anteriores na lista e registra todos os níveis subsequentes. + Filtro de Registro:\nFiltra o registro para exibir apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - nesta ordem, um nível específico silencia todos os níveis anteriores na lista e registra todos os níveis após ele. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - Atualizações:\nRelease: Versões oficiais que são lançadas todo mês e podem ser bastante antigas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem ter bugs e ser instáveis. + Atualizações:\nRelease: Versões oficiais lançadas todos os meses que podem estar muito desatualizadas, mas são mais confiáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os novos recursos e correções, mas podem conter bugs e são menos estáveis. Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Imagem de fundo:\nControle a opacidade da imagem de fundo do jogo. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - Reproduzir música de abertura:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface do menu. + Reproduzir Música do Título:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface de usuário. Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Desabilitar pop-ups dos troféus:\nDesabilite notificações de troféus no jogo. O progresso do troféu ainda pode ser rastreado usando o Trophy Viewer (clique com o botão direito do mouse no jogo na janela principal). + Desabilitar Pop-ups dos Troféus:\nDesabilite notificações de troféus em jogo. O progresso do troféu ainda pode ser rastreado usando o Visualizador de Troféus (clique com o botão direito do mouse no jogo na janela principal). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1601,19 +1601,19 @@ Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Defina um tempo em segundos para o mouse desaparecer após ficar inativo. + Tempo de Inatividade para Ocultar Cursor:\nDefina um tempo em segundos para o mouse desaparecer após ficar inativo. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - Comportamento do botão Voltar:\nDefine o botão Voltar do controle para emular o toque na posição especificada no touchpad do PS4. + Comportamento do Botão Voltar:\nDefine o botão voltar do controle para emular o toque na posição especificada no touchpad do PS4. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na janela principal.\nHabilitar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. + Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na visualização de tabela.\nAtivar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Atualizar Compatibilidade ao inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o SHADPS4 é iniciado. + Atualizar Compatibilidade ao Inicializar:\nAtualiza automaticamente o banco de dados de compatibilidade quando o shadPS4 é iniciado. Update Compatibility Database:\nImmediately update the compatibility database. @@ -1649,35 +1649,35 @@ Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador usará da lista suspensa,\nou escolha "Auto Select" para que ele determine automaticamente. + Placa de Vídeo:\nEm sistemas com múltiplas GPUs, escolha qual GPU o emulador utilizará da lista suspensa,\nou escolha "Seleção Automática" para escolher automaticamente o mesmo. Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - Largura/Altura:\nDefine o tamanho da janela do emulador no momento da inicialização, que pode ser redimensionado durante o jogo.\nIsso é diferente da resolução dentro do jogo. + Largura/Altura:\nDefine o tamanho da janela do emulador na inicialização, que pode ser redimensionado enquanto joga.\nIsso difere da resolução do jogo. Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - Divisor Vblank:\nA taxa de quadros que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar funções vitais do jogo que não esperam que isso mude! + Divisor Vblank:\nA taxa de quadros em que o emulador atualiza é multiplicada por este número. Mudar isso pode ter efeitos negativos, como aumentar a velocidade do jogo ou quebrar a funcionalidade vital do jogo que não espera que isso mude! Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Habilitar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. + Ativar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - Habilitar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse nenhuma placa gráfica. + Ativar GPU NULA:\nDesativa a renderização do jogo para fins de depuração técnica, como se não houvesse placa de vídeo. Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Ativar HDR:\nAtiva o HDR em jogos que o suportem.\nSeu monitor deve possuir suporte para o espaço de cores BT2020 PQ e ao formato de swapchain RGB10A2. Game Folders:\nThe list of folders to check for installed games. - Pastas dos jogos:\nA lista de pastas para verificar se há jogos instalados. + Pastas de Jogos:\nLista de pastas para verificar por jogos instalados. Add:\nAdd a folder to the list. - Adicionar:\nAdicione uma pasta à lista. + Adicionar:\nAdiciona uma pasta à lista. Remove:\nRemove a folder from the list. @@ -1685,27 +1685,27 @@ Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - Habilitar Depuração de Dumping:\nArmazena os símbolos de importação e exportação e as informações do cabeçalho do arquivo do programa PS4 atual em um diretório. + Ativar Depuração de Dumping:\nArmazena os símbolos de importação, exportação e informações do cabeçalho do arquivo do programa PS4 atual em um diretório. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Habilitar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + Ativar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e registra informações sobre seu estado interno.\nIsso diminuirá o desempenho e provavelmente mudará o comportamento da emulação. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Habilitar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminui o desempenho e pode alterar o comportamento da emulação. + Ativar Validação de Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsso diminuirá o desempenho e provavelmente mudará o comportamento da emulação. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - Habilitar Depuração por RenderDoc:\nSe ativado, permite que o emulador tenha compatibilidade com RenderDoc para gravação e análise do quadro renderizado atual. + Ativar Depuração por RenderDoc:\nSe habilitado, o emulador fornecerá compatibilidade com RenderDoc para permitir a captura e análise do quadro atualmente renderizado. Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Coletar Shaders:\nVocê precisa habilitar isso para editar shaders com o menu de depuração (Ctrl + F10). + Coletar Shaders:\nVocê precisa dessa opção ativada para editar shaders com o menu de depuração (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depurar erros de 'Device lost'. Se você tiver isso habilitado, você deve habilitar os Marcadores de Depuração de Host e de Convidado.\nNão funciona em GPUs da Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o SDK do Vulkan para que isso funcione. + Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depuração de erros de 'Device lost'. Se você tiver isto habilitado, você deve habilitar os Marcadores de Depuração de Host E DE Convidado.\nNão funciona em GPUs Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o Vulkan SDK para que isso funcione. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. @@ -1713,47 +1713,47 @@ Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Marcadores de Depuração de Host:\nInsere informações do lado do emulador, como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, você deve habilitar o "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. + Marcadores de Depuração de Host:\nInsere informações vindo do emulador como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, ative os Diagnósticos de Falha.\nÚtil para programas como o RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, você deve habilitar "Diagnóstico de Falha".\nÚtil para programas como o RenderDoc. + Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, ative os Diagnósticos de Falha.\nÚtil para programas como o RenderDoc. Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Diretório dos Dados Salvos:\nA pasta que onde os dados de salvamento de jogo serão salvos. Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Navegar:\nProcure uma pasta para definir como o caminho para salvar dados. Borderless - Borderless + Janela sem Bordas True - True + Tela Cheia Release - Release + Release Nightly - Nightly + Nightly Set the volume of the background music. - Set the volume of the background music. + Defina o volume da música de fundo. Enable Motion Controls - Enable Motion Controls + Ativar Controles de Movimento Save Data Path - Save Data Path + Caminho dos Dados Salvos Browse @@ -1761,15 +1761,15 @@ async - async + assíncrono sync - sync + síncrono Auto Select - Auto Select + Seleção Automática Directory to install games @@ -1777,14 +1777,14 @@ Directory to save data - Directory to save data + Diretório para salvar dados TrophyViewer Trophy Viewer - Visualizador de Troféu + Visualizador de Troféus diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 8c36b37e3..8e0e4260d 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1553,7 +1553,7 @@ Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index e0289f690..157fbd4cb 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -411,63 +411,63 @@ ControlSettings Configure Controls - Configure Controls + Настроить управление Control Settings - Control Settings + Настройки управления D-Pad - D-Pad + Крестовина Up - Up + Вверх Left - Left + Влево Right - Right + Вправо Down - Down + Вниз Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Мёртвая зона левого стика (по умолч:2 макс:127) Left Deadzone - Left Deadzone + Левая мёртвая зона Left Stick - Left Stick + Левый стик Config Selection - Config Selection + Выбор конфига Common Config - Common Config + Общий конфиг Use per-game configs - Use per-game configs + Использовать настройки для каждой игры L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls @@ -483,55 +483,55 @@ R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons - Face Buttons + Кнопки действий Triangle / Y - Triangle / Y + Треугольник / Y Square / X - Square / X + Квадрат / X Circle / B - Circle / B + Круг / B Cross / A - Cross / A + Крест / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Мёртвая зона правого стика (по умолч:2 макс:127) Right Deadzone - Right Deadzone + Правая мёртвая зона Right Stick - Right Stick + Правый стик @@ -741,11 +741,11 @@ Copy Version - Copy Version + Скопировать версию Copy Size - Copy Size + Скопирать размер Copy All @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -1171,7 +1171,7 @@ shadPS4 - shadPS4 + shadPS4 @@ -1194,7 +1194,7 @@ Installed - Installed + Установлено Size @@ -1202,19 +1202,19 @@ Category - Category + Категория Type - Type + Тип App Ver - App Ver + Версия приложения FW - FW + Прошивка Region @@ -1222,7 +1222,7 @@ Flags - Flags + Флаги Path @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + Включить HDR Paths @@ -1485,15 +1485,15 @@ Background Image - Background Image + Фоновое изображение Show Background Image - Show Background Image + Показывать фоновое изображение Opacity - Opacity + Прозрачность Play title music @@ -1541,11 +1541,11 @@ Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - Язык консоли:\nУстановите язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. + Язык консоли:\nУстанавливает язык, который будет использоваться в играх PS4.\nРекомендуется устанавливать язык, который поддерживается игрой, так как он может отличаться в зависимости от региона. Emulator Language:\nSets the language of the emulator's user interface. - Язык эмулятора:\nУстановите язык пользовательского интерфейса эмулятора. + Язык эмулятора:\nУстанавливает язык пользовательского интерфейса эмулятора. Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. @@ -1565,7 +1565,7 @@ Username:\nSets the PS4's account username, which may be displayed by some games. - Имя пользователя:\nУстановите имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. + Имя пользователя:\nУстанавливает имя пользователя аккаунта PS4. Это может отображаться в некоторых играх. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. @@ -1577,7 +1577,7 @@ Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Уровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. + Фильтр логов:\nФильтрует логи, чтобы показывать только определенную информацию.\nПримеры: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nУровни: Trace, Debug, Info, Warning, Error, Critical - в этом порядке, конкретный уровень глушит все предыдущие уровни в списке и показывает все последующие уровни. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. @@ -1585,7 +1585,7 @@ Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Фоновое изображение:\nКонтролируйте непрозрачность фона игры. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. @@ -1601,7 +1601,7 @@ Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Время скрытия курсора при бездействии:\nУстановите время, через которое курсор исчезнет при бездействии. + Время скрытия курсора при бездействии:\nВремя (в секундах), через которое курсор исчезнет при бездействии. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. @@ -1669,7 +1669,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Включить HDR:\nВключает HDR в играх, которые его поддерживают.\nВаш монитор должен иметь поддержку цветового пространства BT2020 PQ и формата swapchain RGB10A2. Game Folders:\nThe list of folders to check for installed games. @@ -1693,7 +1693,7 @@ Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan. Это снизит производительность и, вероятно, изменит поведение эмуляции. + Включить валидацию синхронизации Vulkan:\nВключает систему, которая проверяет тайминг задач рендеринга Vulkan.\nЭто снизит производительность и, вероятно, изменит поведение эмуляции. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. @@ -1705,7 +1705,7 @@ Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Диагностика сбоев:\nСоздает .yaml файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. + Диагностика сбоев:\nСоздает .yaml-файл с информацией о состоянии Vulkan в момент падения.\nПолезно для отладки ошибок 'Device lost'. Если эта функция включена, вам следует включить Маркеры отладки хоста и Гостя.\nНе работает на видеокартах Intel.\nДля работы вам необходимо включить Слои валидации Vulkan и установить Vulkan SDK. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. @@ -1737,11 +1737,11 @@ Release - Release + Релиз Nightly - Nightly + Nightly Set the volume of the background music. diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 010d0ef1e..9e25a19eb 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -411,127 +411,127 @@ ControlSettings Configure Controls - Configure Controls + Konfiguro kontrollet Control Settings - Control Settings + Cilësimet e kontrollit D-Pad - D-Pad + D-Pad Up - Up + Lartë Left - Left + Majtas Right - Right + Djathtas Down - Down + Poshtë Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Zona e vdekur e levës së majtë (def:2 max:127) Left Deadzone - Left Deadzone + Zona e vdekur e majtë Left Stick - Left Stick + Leva e majtë Config Selection - Config Selection + Zgjedhja e konfigurimit Common Config - Common Config + Konfigurim i përbashkët Use per-game configs - Use per-game configs + Përdor konfigurime për secilën lojë L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + Kontrollet Tastierë/Mi KBM Editor - KBM Editor + Redaktues Tastierë/Mi Back - Back + Mbrapa R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons - Face Buttons + Butonat kryesore Triangle / Y - Triangle / Y + Trekëndësh / Y Square / X - Square / X + Katror / X Circle / B - Circle / B + Rreth / B Cross / A - Cross / A + Kryq / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Zona e vdekur e levës së djathtë (def:2, max:127) Right Deadzone - Right Deadzone + Zona e vdekur e djathtë Right Stick - Right Stick + Leva e djathtë @@ -576,7 +576,7 @@ Directory to install DLC - Directory to install DLC + Dosja ku do instalohen DLC-t @@ -631,11 +631,11 @@ m - m + m s - s + s Compatibility is untested @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -833,27 +833,27 @@ Open Update Folder - Open Update Folder + Hap Dosjen e Përditësimit Delete Save Data - Delete Save Data + Fshi të dhënat e ruajtjes This game has no update folder to open! - This game has no update folder to open! + Kjo lojë nuk ka dosje përditësimi për të hapur! Failed to convert icon. - Failed to convert icon. + Konvertimi i ikonës dështoi. This game has no save data to delete! - This game has no save data to delete! + Kjo lojë nuk ka të dhëna ruajtje për të fshirë! Save Data - Save Data + Të dhënat e ruajtjes @@ -868,11 +868,11 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Instalo të gjitha të radhiturat në dosjen e zgjedhur Delete PKG File on Install - Delete PKG File on Install + Fshi skedarin PKG pas instalimit @@ -1151,27 +1151,27 @@ Run Game - Run Game + Ekzekuto lojën Eboot.bin file not found - Eboot.bin file not found + Skedari Eboot.bin nuk u gjet PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + Skedar PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG-ja është një arnë ose DLC, të lutem instalo lojën fillimisht! Game is already running! - Game is already running! + Loja tashmë është duke u ekzekutuar! shadPS4 - shadPS4 + shadPS4 @@ -1194,7 +1194,7 @@ Installed - Installed + Instaluar Size @@ -1202,19 +1202,19 @@ Category - Category + Kategoria Type - Type + Lloji App Ver - App Ver + Versioni i aplikacionit FW - FW + Firmueri Region @@ -1222,7 +1222,7 @@ Flags - Flags + Flamurët Path @@ -1238,7 +1238,7 @@ Package - Package + Paketa @@ -1341,7 +1341,7 @@ s - s + s Controller @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + Aktivizo HDR Paths @@ -1565,7 +1565,7 @@ Username:\nSets the PS4's account username, which may be displayed by some games. - Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojra. + Përdoruesi:\nPërcakton emrin e përdoruesit të llogarisë PS4, i cili mund të shfaqet nga disa lojëra. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. @@ -1577,11 +1577,11 @@ Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. + Filtri i ditarit:\nFiltron ditarin për të shfaqur vetëm informacione specifike.\nShembuj: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNivelet: Trace, Debug, Info, Warning, Error, Critical - në këtë rend, një nivel specifik hesht të gjitha nivelet përpara në listë dhe regjistron çdo nivel pas atij. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - Përditësimi:\nRelease: Versionet zyrtare të lëshuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. + Përditësimi:\nRelease: Versionet zyrtare të botuara çdo muaj që mund të jenë shumë të vjetra, por janë më të besueshme dhe të provuara.\nNightly: Versionet e zhvillimit që kanë të gjitha veçoritë dhe rregullimet më të fundit, por mund të përmbajnë gabime dhe janë më pak të qëndrueshme. Background Image:\nControl the opacity of the game background image. @@ -1605,11 +1605,11 @@ Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mprapa. + Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mbrapa. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo 'Përditëso përputhshmërinë gjatë nisjes' për të marrë informacion të përditësuar. + Shfaq të dhënat e përputhshmërisë:\nShfaq informacionin e përputhshmërisë së lojës në formë tabele. Aktivizo "Përditëso përputhshmërinë gjatë nisjes" për të marrë informacion të përditësuar. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. @@ -1661,7 +1661,7 @@ Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Aktivizo zbrazjen e shaders-ave:\nPër qëllime të korrigjimit teknik, ruan shaders-at e lojës në një dosje ndërsa ato pasqyrohen. + Aktivizo zbrazjen e shader-ave:\nPër qëllime të korrigjimit teknik, ruan shader-at e lojës në një dosje ndërsa ato pasqyrohen. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. @@ -1669,7 +1669,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Aktivizo HDR:\nAktivizon HDR në lojërat që e mbështesin.\nMonitori jotë duhet të mbështesë hapësirën e ngjyrave BT2020 PQ dhe formatin e zinxhirit të ndërrimit (swapchain) RGB10A2. Game Folders:\nThe list of folders to check for installed games. @@ -1689,11 +1689,11 @@ Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + Aktivizo shtresat e vlefshmërisë Vulkan:\nAktivizon një sistem që vërteton gjendjen e pasqyruesit Vulkan dhe regjistron informacionin në lidhje me gjendjen e tij të brendshme.\nKjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan. Kjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. + Aktivizo vërtetimin e sinkronizimit Vulkan:\nAktivizon një sistem që vërteton kohën e detyrave të pasqyrimit Vulkan.\nKjo do të ul performancën dhe ndoshta do të ndryshojë sjelljen e emulimit. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. @@ -1729,31 +1729,31 @@ Borderless - Borderless + Pa kufij True - True + Vërtetë Release - Release + Botimi Nightly - Nightly + Nightly Set the volume of the background music. - Set the volume of the background music. + Vendos vëllimin e zërit të muzikës së sfondit. Enable Motion Controls - Enable Motion Controls + Aktivizo kontrollet me lëvizje Save Data Path - Save Data Path + Shtegu i të dhënave të ruajtjes Browse @@ -1761,15 +1761,15 @@ async - async + async sync - sync + sync Auto Select - Auto Select + Auto Select Directory to install games @@ -1777,7 +1777,7 @@ Directory to save data - Directory to save data + Dosja për të ruajtur të dhënat diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 28a07128e..15267951e 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -42,7 +42,7 @@ Version: - Version: + Version: Size: @@ -463,19 +463,19 @@ L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + KBM-kontroller KBM Editor - KBM Editor + KBM-redigerare Back @@ -483,23 +483,23 @@ R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons @@ -599,11 +599,11 @@ Region - Region + Region Firmware - Firmware + Firmware Size @@ -611,7 +611,7 @@ Version - Version + Version Path @@ -627,15 +627,15 @@ h - h + h m - m + m s - s + s Compatibility is untested @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -1171,7 +1171,7 @@ shadPS4 - shadPS4 + shadPS4 @@ -1194,7 +1194,7 @@ Installed - Installed + Installerat Size @@ -1202,27 +1202,27 @@ Category - Category + Kategori Type - Type + Typ App Ver - App Ver + Appver FW - FW + FW Region - Region + Region Flags - Flags + Flaggor Path @@ -1238,7 +1238,7 @@ Package - Package + Paket @@ -1253,7 +1253,7 @@ System - System + System Console Language @@ -1265,7 +1265,7 @@ Emulator - Emulator + Emulator Enable Fullscreen @@ -1341,7 +1341,7 @@ s - s + s Controller @@ -1377,7 +1377,7 @@ Vblank Divider - Vblank Divider + Vblank Divider Advanced @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + Aktivera HDR Paths @@ -1669,7 +1669,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Aktivera HDR:\nAktiverar HDR i spel som har stöd för det.\nDin skärm måste ha stöd för färgrymden BT2020 PQ samt swapchain-formatet RGB10A2. Game Folders:\nThe list of folders to check for installed games. @@ -1737,11 +1737,11 @@ Release - Release + Release Nightly - Nightly + Nightly Set the volume of the background music. diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 4d762cea5..b1aeaa9c3 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -230,7 +230,7 @@ Directory does not exist: - Klasör mevcut değil: + Dizin mevcut değil: Failed to open files.json for reading. @@ -411,31 +411,31 @@ ControlSettings Configure Controls - Configure Controls + Kontrolleri Yapılandır Control Settings - Control Settings + Kontrol Ayarları D-Pad - D-Pad + Yön Düğmeleri Up - Up + Yukarı Left - Left + Sol Right - Right + Sağ Down - Down + Aşağı Left Stick Deadzone (def:2 max:127) @@ -447,7 +447,7 @@ Left Stick - Left Stick + Sol Analog Config Selection @@ -455,7 +455,7 @@ Common Config - Common Config + Genel Yapılandırma Use per-game configs @@ -463,11 +463,11 @@ L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls @@ -479,19 +479,19 @@ Back - Back + Geri R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start @@ -499,7 +499,7 @@ R3 - R3 + R3 Face Buttons @@ -507,19 +507,19 @@ Triangle / Y - Triangle / Y + Üçgen / Y Square / X - Square / X + Kare / X Circle / B - Circle / B + Daire / B Cross / A - Cross / A + Çarpı / A Right Stick Deadzone (def:2, max:127) @@ -531,7 +531,7 @@ Right Stick - Right Stick + Sağ Analog @@ -564,7 +564,7 @@ Directory to install games - Oyunların yükleneceği klasör + Oyunların yükleneceği dizin Browse @@ -576,7 +576,7 @@ Directory to install DLC - Directory to install DLC + İndirilebilir içeriğin yükleneceği dizin @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -701,7 +701,7 @@ Cheats / Patches - Hileler / Yamanlar + Hileler / Yamalar SFO Viewer @@ -741,11 +741,11 @@ Copy Version - Copy Version + Sürümü Kopyala Copy Size - Copy Size + Boyutu Kopyala Copy All @@ -753,35 +753,35 @@ Delete... - Delete... + Sil... Delete Game - Delete Game + Oyunu Sil Delete Update - Delete Update + Güncellemeyi Sil Delete DLC - Delete DLC + İndirilebilir İçeriği Sil Compatibility... - Compatibility... + Uyumluluk... Update database - Update database + Veri tabanını güncelle View report - View report + Raporu görüntüle Submit a report - Submit a report + Rapor gönder Shortcut creation @@ -805,7 +805,7 @@ Game - Game + Oyun This game has no update to delete! @@ -813,7 +813,7 @@ Update - Update + Güncelleme This game has no DLC to delete! @@ -821,7 +821,7 @@ DLC - DLC + İndirilebilir İçerik Delete %1 @@ -833,11 +833,11 @@ Open Update Folder - Open Update Folder + Güncelleme Klasörünü Aç Delete Save Data - Delete Save Data + Kayıt Verilerini Sil This game has no update folder to open! @@ -853,7 +853,7 @@ Save Data - Save Data + Kayıt Verisi @@ -868,7 +868,7 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Tüm Kuyruktakileri Seçili Klasöre Yükle Delete PKG File on Install @@ -911,7 +911,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + shadPS4 Klasörünü Aç Exit @@ -963,7 +963,7 @@ Game Install Directory - Oyun Kurulum Klasörü + Oyun Kurulum Dizini Download Cheats/Patches @@ -995,7 +995,7 @@ Game List Mode - Oyun Listesi Modu + Oyun Listesi Görünümü Settings @@ -1151,15 +1151,15 @@ Run Game - Run Game + Oyunu Çalıştır Eboot.bin file not found - Eboot.bin file not found + Eboot.bin dosyası bulunamadı PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + PKG Dosyası (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! @@ -1167,11 +1167,11 @@ Game is already running! - Game is already running! + Oyun zaten çalışıyor! shadPS4 - shadPS4 + shadPS4 @@ -1202,7 +1202,7 @@ Category - Category + Kategori Type @@ -1222,7 +1222,7 @@ Flags - Flags + Bayraklar Path @@ -1238,7 +1238,7 @@ Package - Package + Paket @@ -1341,7 +1341,7 @@ s - s + sn Controller @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + HDR'yi Etkinleştir Paths @@ -1473,11 +1473,11 @@ GUI Settings - GUI Ayarları + Arayüz Ayarları Title Music - Title Music + Oyun Müziği Disable Trophy Pop-ups @@ -1485,19 +1485,19 @@ Background Image - Background Image + Arka Plan Resmi Show Background Image - Show Background Image + Arka Plan Resmini Göster Opacity - Opacity + Görünürlük Play title music - Başlık müziğini çal + Oyun müziğini çal Update Compatibility Database On Startup @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. @@ -1729,7 +1729,7 @@ Borderless - Borderless + Çerçevesiz True @@ -1737,7 +1737,7 @@ Release - Release + Kararlı Nightly @@ -1745,7 +1745,7 @@ Set the volume of the background music. - Set the volume of the background music. + Arka plan müziğinin ses seviyesini ayarlayın. Enable Motion Controls @@ -1753,7 +1753,7 @@ Save Data Path - Save Data Path + Kayıt Verileri Yolu Browse @@ -1761,11 +1761,11 @@ async - async + asenkronize sync - sync + senkronize Auto Select @@ -1773,11 +1773,11 @@ Directory to install games - Oyunların yükleneceği klasör + Oyunların yükleneceği dizin Directory to save data - Directory to save data + Kayıt verilerinin tutulacağı dizin diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 1b3c508bf..4334a3be2 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -7,7 +7,7 @@ AboutDialog About shadPS4 - About shadPS4 + Về shadPS4 shadPS4 @@ -15,11 +15,11 @@ shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 là một trình giả lập thử nghiệm mã nguồn mở cho PlayStation 4. This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + Không sử dụng phần mềm này để chơi những trò chơi mà bạn không sở hữu một cách hợp pháp. @@ -411,11 +411,11 @@ ControlSettings Configure Controls - Configure Controls + Cấu hình điều khiển Control Settings - Control Settings + Cài đặt điều khiển D-Pad @@ -560,23 +560,23 @@ GameInstallDialog shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Chọn thư mục Directory to install games - Directory to install games + Thư mục để cài các trò chơi Browse - Browse + Duyệt Error - Error + Lỗi Directory to install DLC - Directory to install DLC + Thư mục để cài DLC @@ -595,7 +595,7 @@ Compatibility - Compatibility + Khả năng tương thích Region @@ -623,7 +623,7 @@ Never Played - Never Played + Chưa chơi h @@ -639,7 +639,7 @@ Compatibility is untested - Compatibility is untested + Chưa kiểm tra khả năng tương thích Game does not initialize properly / crashes the emulator @@ -697,7 +697,7 @@ GuiContextMenus Create Shortcut - Create Shortcut + Tạo phím tắt Cheats / Patches @@ -705,11 +705,11 @@ SFO Viewer - SFO Viewer + Trình xem SFO Trophy Viewer - Trophy Viewer + Trình xem chiến tích Open Folder... @@ -729,11 +729,11 @@ Copy info... - Copy info... + Sao chép thông tin... Copy Name - Copy Name + Sao chép tên Copy Serial @@ -1245,31 +1245,31 @@ SettingsDialog Settings - Settings + Cài đặt General - General + Chung System - System + Hệ thống Console Language - Console Language + Ngôn ngữ của console Emulator Language - Emulator Language + Ngôn ngữ trình giả lập Emulator - Emulator + Trình giả lập Enable Fullscreen - Enable Fullscreen + Bật toàn màn hình Fullscreen Mode @@ -1277,7 +1277,7 @@ Enable Separate Update Folder - Enable Separate Update Folder + Bật thư mục cập nhật riêng Default tab when opening settings @@ -1289,7 +1289,7 @@ Show Splash - Show Splash + Hiển thị splash Enable Discord Rich Presence @@ -1297,7 +1297,7 @@ Username - Username + Tên người dùng Trophy Key @@ -1353,7 +1353,7 @@ Graphics - Graphics + Đồ họa GUI @@ -1365,15 +1365,15 @@ Graphics Device - Graphics Device + Thiết bị đồ họa Width - Width + Rộng Height - Height + Cao Vblank Divider @@ -1381,7 +1381,7 @@ Advanced - Advanced + Nâng cao Enable Shaders Dumping @@ -1413,7 +1413,7 @@ Debug - Debug + Gỡ lỗi Enable Debug Dumping @@ -1485,15 +1485,15 @@ Background Image - Background Image + Hình nền Show Background Image - Show Background Image + Hiển thị hình nền Opacity - Opacity + Độ mờ đục Play title music @@ -1501,19 +1501,19 @@ Update Compatibility Database On Startup - Update Compatibility Database On Startup + Cập nhật cơ sở dữ liệu tương thích khi khởi động Game Compatibility - Game Compatibility + Khả năng tương thích của trò chơi Display Compatibility Data - Display Compatibility Data + Hiển thị dữ liệu tương thích Update Compatibility Database - Update Compatibility Database + Cập nhật cơ sở dữ liệu tương thích Volume @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. @@ -1729,7 +1729,7 @@ Borderless - Borderless + Không viền True @@ -1745,19 +1745,19 @@ Set the volume of the background music. - Set the volume of the background music. + Đặt âm lượng nhạc nền Enable Motion Controls - Enable Motion Controls + Bật điều khiển bằng cử chỉ Save Data Path - Save Data Path + Đường dẫn để lưu dữ liệu Browse - Browse + Duyệt async @@ -1769,22 +1769,22 @@ Auto Select - Auto Select + Chọn tự động Directory to install games - Directory to install games + Thư mục để cài các trò chơi Directory to save data - Directory to save data + Thư mục để lưu dữ liệu TrophyViewer Trophy Viewer - Trophy Viewer + Trình xem chiến tích diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 363b1ac3a..8eae7ae69 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -30,7 +30,7 @@ Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - 作弊码/补丁是实验性的。\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\n + 作弊码/补丁是实验性的,\n请小心使用。\n\n通过选择存储库并点击下载按钮,下载该游戏的作弊码。\n在“补丁”选项卡中,您可以一次性下载所有补丁,选择要使用的补丁并保存选择。\n\n由于我们不开发作弊码/补丁,\n请将问题报告给作弊码/补丁的作者。\n\n创建了新的作弊码/补丁?欢迎提交到我们的仓库:\n No Image Available @@ -411,127 +411,127 @@ ControlSettings Configure Controls - Configure Controls + 配置按键 Control Settings - Control Settings + 按键配置 D-Pad - D-Pad + D-Pad Up - Up + Left - Left + Right - Right + Down - Down + Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + 左摇杆死区(默认:2 最大:127) Left Deadzone - Left Deadzone + 左死区 Left Stick - Left Stick + 左摇杆 Config Selection - Config Selection + 配置选择 Common Config - Common Config + 通用配置 Use per-game configs - Use per-game configs + 使用每个游戏的配置 L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + 键鼠 KBM Editor - KBM Editor + 键鼠配置 Back - Back + Back R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + 选项 / 开始 R3 - R3 + R3 Face Buttons - Face Buttons + 正面按钮 Triangle / Y - Triangle / Y + Triangle / Y Square / X - Square / X + Square / X Circle / B - Circle / B + Circle / B Cross / A - Cross / A + Cross / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + 右摇杆死区(默认:2 最大:127) Right Deadzone - Right Deadzone + 右死区 Right Stick - Right Stick + 右摇杆 @@ -576,7 +576,7 @@ Directory to install DLC - Directory to install DLC + 安装 DLC 的目录 @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -833,27 +833,27 @@ Open Update Folder - Open Update Folder + 打开更新文件夹 Delete Save Data - Delete Save Data + 删除存档数据 This game has no update folder to open! - This game has no update folder to open! + 这个游戏没有可打开的更新文件夹! Failed to convert icon. - Failed to convert icon. + 转换图标失败。 This game has no save data to delete! - This game has no save data to delete! + 这个游戏没有更新可以删除! Save Data - Save Data + 存档数据 @@ -868,11 +868,11 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + 安装所有 PKG 到选定的文件夹 Delete PKG File on Install - Delete PKG File on Install + 安装后删除 PKG 文件 @@ -911,7 +911,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + 打开 shadPS4 文件夹 Exit @@ -1015,23 +1015,23 @@ Dark - Dark + 深色 Light - Light + 浅色 Green - Green + 绿色 Blue - Blue + 蓝色 Violet - Violet + 紫色 toolBar @@ -1151,27 +1151,27 @@ Run Game - Run Game + 运行游戏 Eboot.bin file not found - Eboot.bin file not found + 找不到 Eboot.bin 文件 PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + PKG 文件(*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG是一个补丁或 DLC,请先安装游戏! Game is already running! - Game is already running! + 游戏已经在运行中! shadPS4 - shadPS4 + shadPS4 @@ -1194,7 +1194,7 @@ Installed - Installed + 已安装 Size @@ -1202,19 +1202,19 @@ Category - Category + 分类 Type - Type + 类型 App Ver - App Ver + 版本 FW - FW + 固件 Region @@ -1222,7 +1222,7 @@ Flags - Flags + 标志 Path @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + 启用 HDR Paths @@ -1669,7 +1669,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + 启用 HDR:\n在支持 HDR 的游戏中启用 HDR。\n您的显示器必须支持 BT2020 PQ 色彩空间和 RGB10A2 交换链格式。 Game Folders:\nThe list of folders to check for installed games. @@ -1729,31 +1729,31 @@ Borderless - Borderless + 无边框全屏 True - True + 真全屏 Release - Release + 稳定版 Nightly - Nightly + 预览版 Set the volume of the background music. - Set the volume of the background music. + 设置背景音乐的音量。 Enable Motion Controls - Enable Motion Controls + 启用体感控制 Save Data Path - Save Data Path + 保存数据路径 Browse @@ -1761,15 +1761,15 @@ async - async + 异步 sync - sync + 同步 Auto Select - Auto Select + 自动选择 Directory to install games @@ -1777,7 +1777,7 @@ Directory to save data - Directory to save data + 存档数据目录 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 0d7d74ae9..2654e8707 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1593,7 +1593,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1609,15 +1609,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. Never @@ -1701,23 +1701,23 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. Save Data Path:\nThe folder where game save data will be saved. From 290e127a4f8cc0afab6a4fb4dd7f6410132bdf06 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sat, 15 Feb 2025 03:07:22 -0300 Subject: [PATCH 295/455] More fixes to make the translation work (#2439) * more fixes to make the translation work * If size is disabled, it will not appear on the patches screen * Update game_install_dialog.h --- src/qt_gui/cheats_patches.cpp | 8 +++++--- src/qt_gui/game_install_dialog.h | 1 + src/qt_gui/settings_dialog.cpp | 10 +++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index 866ab3ca0..e9db88381 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -91,9 +91,11 @@ void CheatsPatches::setupUI() { gameVersionLabel->setAlignment(Qt::AlignLeft); gameInfoLayout->addWidget(gameVersionLabel); - QLabel* gameSizeLabel = new QLabel(tr("Size: ") + m_gameSize); - gameSizeLabel->setAlignment(Qt::AlignLeft); - gameInfoLayout->addWidget(gameSizeLabel); + if (m_gameSize.left(4) != "0.00") { + QLabel* gameSizeLabel = new QLabel(tr("Size: ") + m_gameSize); + gameSizeLabel->setAlignment(Qt::AlignLeft); + gameInfoLayout->addWidget(gameSizeLabel); + } // Add a text area for instructions and 'Patch' descriptions instructionsTextEdit = new QTextEdit(); diff --git a/src/qt_gui/game_install_dialog.h b/src/qt_gui/game_install_dialog.h index 0a4e29357..938f0e1f3 100644 --- a/src/qt_gui/game_install_dialog.h +++ b/src/qt_gui/game_install_dialog.h @@ -11,6 +11,7 @@ class QLineEdit; class GameInstallDialog final : public QDialog { + Q_OBJECT public: GameInstallDialog(); ~GameInstallDialog(); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 1598b0640..bebb16c9a 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -536,7 +536,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { } else if (elementName == "fullscreenCheckBox") { text = tr("Enable Full Screen:\\nAutomatically puts the game window into full-screen mode.\\nThis can be toggled by pressing the F11 key."); } else if (elementName == "separateUpdatesCheckBox") { - text = tr("Enable Separate Update Folder:\\nEnables installing game updates into a separate folder for easy management.\\nThis can be manually created by adding the extracted update to the game folder with the name 'CUSA00000-UPDATE' where the CUSA ID matches the game's ID."); + text = tr("Enable Separate Update Folder:\\nEnables installing game updates into a separate folder for easy management.\\nThis can be manually created by adding the extracted update to the game folder with the name \"CUSA00000-UPDATE\" where the CUSA ID matches the game's ID."); } else if (elementName == "showSplashCheckBox") { text = tr("Show Splash Screen:\\nShows the game's splash screen (a special image) while the game is starting."); } else if (elementName == "discordRPCCheckbox") { @@ -548,8 +548,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { } else if (elementName == "logTypeGroupBox") { text = tr("Log Type:\\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation."); } else if (elementName == "logFilter") { - text = tr("Log Filter:\nFilters the log to only print specific information.\nExamples: 'Core:Trace' 'Lib.Pad:Debug Common.Filesystem:Error' '*:Critical'\\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it."); -#ifdef ENABLE_UPDATER + text = tr("Log Filter:\\nFilters the log to only print specific information.\\nExamples: \"Core:Trace\" \"Lib.Pad:Debug Common.Filesystem:Error\" \"*:Critical\"\\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it."); + #ifdef ENABLE_UPDATER } else if (elementName == "updaterGroupBox") { text = tr("Update:\\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable."); #endif @@ -562,7 +562,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { } else if (elementName == "disableTrophycheckBox") { text = tr("Disable Trophy Pop-ups:\\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window)."); } else if (elementName == "enableCompatibilityCheckBox") { - text = tr("Display Compatibility Data:\\nDisplays game compatibility information in table view. Enable 'Update Compatibility On Startup' to get up-to-date information."); + text = tr("Display Compatibility Data:\\nDisplays game compatibility information in table view. Enable \"Update Compatibility On Startup\" to get up-to-date information."); } else if (elementName == "checkCompatibilityOnStartupCheckBox") { text = tr("Update Compatibility On Startup:\\nAutomatically update the compatibility database when shadPS4 starts."); } else if (elementName == "updateCompatibilityButton") { @@ -580,7 +580,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { // Graphics if (elementName == "graphicsAdapterGroupBox") { - text = tr("Graphics Device:\\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\\nor select 'Auto Select' to automatically determine it."); + text = tr("Graphics Device:\\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\\nor select \"Auto Select\" to automatically determine it."); } else if (elementName == "widthGroupBox" || elementName == "heightGroupBox") { text = tr("Width/Height:\\nSets the size of the emulator window at launch, which can be resized during gameplay.\\nThis is different from the in-game resolution."); } else if (elementName == "heightDivider") { From 82cacec8eb18825a163165e4b6790edf0d63ff17 Mon Sep 17 00:00:00 2001 From: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Sat, 15 Feb 2025 14:06:56 +0200 Subject: [PATCH 296/455] shader_recompiler: Remove special case buffers and add support for aliasing (#2428) * shader_recompiler: Move shared mem lowering into emitter * IR can be quite verbose during first stages of translation, before ssa and constant prop passes have run that drastically simplify it. This lowering can also be done during emission so why not do it then to save some compilation time * runtime_info: Pack PsColorBuffer into 8 bytes * Drops the size of the total structure by half from 396 to 204 bytes. Also should make comparison of the array a bit faster, since its a hot path done every draw * emit_spirv_context: Add infrastructure for buffer aliases * Splits out the buffer creation function so it can be reused when defining multiple type aliases * shader_recompiler: Merge srt_flatbuf into buffers list * Its no longer a special case, yay * shader_recompiler: Complete buffer aliasing support * Add a bunch more types into buffers, such as F32 for float reads/writes and 8/16 bit integer types for formatted buffers * shader_recompiler: Remove existing shared memory emulation * The current impl relies on backend side implementaton and hooking into every shared memory access. It also doesnt handle atomics. Will be replaced by an IR pass that solves these issues * shader_recompiler: Reintroduce shared memory on ssbo emulation * Now it is performed with an IR pass, and combined with the previous commit cleanup, is fully transparent from the backend, other than requiring workgroup_index be provided as an attribute (computing this on every shared memory access is gonna be too verbose * clang format * buffer_cache: Reduce buffer sizes * vk_rasterizer: Cleanup resource binding code * Reduce noise in the functions, also remove some arguments which are class members * Fix gcc --- CMakeLists.txt | 2 +- .../backend/spirv/emit_spirv.cpp | 7 +- .../backend/spirv/emit_spirv_atomic.cpp | 21 +- .../spirv/emit_spirv_context_get_set.cpp | 148 +++++++----- .../spirv/emit_spirv_shared_memory.cpp | 54 +---- .../backend/spirv/emit_spirv_special.cpp | 3 + .../backend/spirv/spirv_emit_context.cpp | 221 +++++++++--------- .../backend/spirv/spirv_emit_context.h | 42 +++- .../frontend/translate/data_share.cpp | 26 ++- .../frontend/translate/export.cpp | 4 +- .../frontend/translate/translate.cpp | 22 +- .../frontend/translate/translate.h | 4 +- src/shader_recompiler/info.h | 42 ++-- src/shader_recompiler/ir/attribute.h | 21 +- src/shader_recompiler/ir/passes/ir_passes.h | 6 +- .../passes/lower_shared_mem_to_registers.cpp | 81 ------- .../ir/passes/resource_tracking_pass.cpp | 48 ++-- .../ir/passes/shader_info_collection_pass.cpp | 12 +- .../ir/passes/shared_memory_barrier_pass.cpp | 72 ++++-- .../passes/shared_memory_to_storage_pass.cpp | 117 ++++++++++ src/shader_recompiler/recompiler.cpp | 7 +- src/shader_recompiler/runtime_info.h | 31 ++- src/shader_recompiler/specialization.h | 18 -- src/video_core/amdgpu/liverpool.h | 4 + src/video_core/amdgpu/resource.h | 6 + src/video_core/amdgpu/types.h | 10 +- src/video_core/buffer_cache/buffer.h | 2 +- src/video_core/buffer_cache/buffer_cache.cpp | 17 +- src/video_core/buffer_cache/buffer_cache.h | 9 +- .../renderer_vulkan/vk_compute_pipeline.cpp | 19 -- .../renderer_vulkan/vk_graphics_pipeline.cpp | 13 -- .../renderer_vulkan/vk_graphics_pipeline.h | 3 +- .../renderer_vulkan/vk_instance.cpp | 24 +- .../renderer_vulkan/vk_pipeline_cache.cpp | 4 +- .../renderer_vulkan/vk_rasterizer.cpp | 172 ++++++-------- .../renderer_vulkan/vk_rasterizer.h | 8 +- 36 files changed, 675 insertions(+), 625 deletions(-) delete mode 100644 src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp create mode 100644 src/shader_recompiler/ir/passes/shared_memory_to_storage_pass.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 22a811d30..95766bc67 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -766,11 +766,11 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h src/shader_recompiler/ir/passes/identity_removal_pass.cpp src/shader_recompiler/ir/passes/ir_passes.h src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp - src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp src/shader_recompiler/ir/passes/resource_tracking_pass.cpp src/shader_recompiler/ir/passes/ring_access_elimination.cpp src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp + src/shader_recompiler/ir/passes/shared_memory_to_storage_pass.cpp src/shader_recompiler/ir/passes/ssa_rewrite_pass.cpp src/shader_recompiler/ir/abstract_syntax_list.h src/shader_recompiler/ir/attribute.cpp diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 3712380f5..2a5b9335e 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -242,14 +242,17 @@ void SetupCapabilities(const Info& info, const Profile& profile, EmitContext& ct ctx.AddCapability(spv::Capability::Image1D); ctx.AddCapability(spv::Capability::Sampled1D); ctx.AddCapability(spv::Capability::ImageQuery); + ctx.AddCapability(spv::Capability::Int8); + ctx.AddCapability(spv::Capability::Int16); + ctx.AddCapability(spv::Capability::Int64); + ctx.AddCapability(spv::Capability::UniformAndStorageBuffer8BitAccess); + ctx.AddCapability(spv::Capability::UniformAndStorageBuffer16BitAccess); if (info.uses_fp16) { ctx.AddCapability(spv::Capability::Float16); - ctx.AddCapability(spv::Capability::Int16); } if (info.uses_fp64) { ctx.AddCapability(spv::Capability::Float64); } - ctx.AddCapability(spv::Capability::Int64); if (info.has_storage_images) { ctx.AddCapability(spv::Capability::StorageImageExtendedFormats); ctx.AddCapability(spv::Capability::StorageImageReadWithoutFormat); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp index ce65a5ccb..92cfcbb0f 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp @@ -23,10 +23,13 @@ Id SharedAtomicU32(EmitContext& ctx, Id offset, Id value, Id BufferAtomicU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value, Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) { - auto& buffer = ctx.buffers[handle]; - address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset); + const auto& buffer = ctx.buffers[handle]; + if (Sirit::ValidId(buffer.offset)) { + address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset); + } const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u)); - const Id ptr = ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index); + const auto [id, pointer_type] = buffer[EmitContext::BufferAlias::U32]; + const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index); const auto [scope, semantics]{AtomicArgs(ctx)}; return (ctx.*atomic_func)(ctx.U32[1], ptr, scope, semantics, value); } @@ -165,17 +168,17 @@ Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id co } Id EmitDataAppend(EmitContext& ctx, u32 gds_addr, u32 binding) { - auto& buffer = ctx.buffers[binding]; - const Id ptr = ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, - ctx.ConstU32(gds_addr)); + const auto& buffer = ctx.buffers[binding]; + const auto [id, pointer_type] = buffer[EmitContext::BufferAlias::U32]; + const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, ctx.ConstU32(gds_addr)); const auto [scope, semantics]{AtomicArgs(ctx)}; return ctx.OpAtomicIIncrement(ctx.U32[1], ptr, scope, semantics); } Id EmitDataConsume(EmitContext& ctx, u32 gds_addr, u32 binding) { - auto& buffer = ctx.buffers[binding]; - const Id ptr = ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, - ctx.ConstU32(gds_addr)); + const auto& buffer = ctx.buffers[binding]; + const auto [id, pointer_type] = buffer[EmitContext::BufferAlias::U32]; + const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, ctx.ConstU32(gds_addr)); const auto [scope, semantics]{AtomicArgs(ctx)}; return ctx.OpAtomicIDecrement(ctx.U32[1], ptr, scope, semantics); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index ae77ed413..cc7b7e097 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -160,21 +160,25 @@ void EmitGetGotoVariable(EmitContext&) { UNREACHABLE_MSG("Unreachable instruction"); } +using BufferAlias = EmitContext::BufferAlias; + Id EmitReadConst(EmitContext& ctx, IR::Inst* inst) { - u32 flatbuf_off_dw = inst->Flags(); - ASSERT(ctx.srt_flatbuf.binding >= 0); - ASSERT(flatbuf_off_dw > 0); - Id index = ctx.ConstU32(flatbuf_off_dw); - auto& buffer = ctx.srt_flatbuf; - const Id ptr{ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index)}; + const u32 flatbuf_off_dw = inst->Flags(); + const auto& srt_flatbuf = ctx.buffers.back(); + ASSERT(srt_flatbuf.binding >= 0 && flatbuf_off_dw > 0 && + srt_flatbuf.buffer_type == BufferType::ReadConstUbo); + const auto [id, pointer_type] = srt_flatbuf[BufferAlias::U32]; + const Id ptr{ + ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, ctx.ConstU32(flatbuf_off_dw))}; return ctx.OpLoad(ctx.U32[1], ptr); } Id EmitReadConstBuffer(EmitContext& ctx, u32 handle, Id index) { - auto& buffer = ctx.buffers[handle]; + const auto& buffer = ctx.buffers[handle]; index = ctx.OpIAdd(ctx.U32[1], index, buffer.offset_dwords); - const Id ptr{ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index)}; - return ctx.OpLoad(buffer.data_types->Get(1), ptr); + const auto [id, pointer_type] = buffer[BufferAlias::U32]; + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; + return ctx.OpLoad(ctx.U32[1], ptr); } Id EmitReadStepRate(EmitContext& ctx, int rate_idx) { @@ -184,7 +188,7 @@ Id EmitReadStepRate(EmitContext& ctx, int rate_idx) { rate_idx == 0 ? ctx.u32_zero_value : ctx.u32_one_value)); } -Id EmitGetAttributeForGeometry(EmitContext& ctx, IR::Attribute attr, u32 comp, Id index) { +static Id EmitGetAttributeForGeometry(EmitContext& ctx, IR::Attribute attr, u32 comp, Id index) { if (IR::IsPosition(attr)) { ASSERT(attr == IR::Attribute::Position0); const auto position_arr_ptr = ctx.TypePointer(spv::StorageClass::Input, ctx.F32[4]); @@ -285,6 +289,8 @@ Id EmitGetAttributeU32(EmitContext& ctx, IR::Attribute attr, u32 comp) { return EmitReadStepRate(ctx, 0); case IR::Attribute::InstanceId1: return EmitReadStepRate(ctx, 1); + case IR::Attribute::WorkgroupIndex: + return ctx.workgroup_index_id; case IR::Attribute::WorkgroupId: return ctx.OpCompositeExtract(ctx.U32[1], ctx.OpLoad(ctx.U32[3], ctx.workgroup_id), comp); case IR::Attribute::LocalInvocationId: @@ -396,140 +402,158 @@ void EmitSetPatch(EmitContext& ctx, IR::Patch patch, Id value) { ctx.OpStore(pointer, value); } -template -static Id EmitLoadBufferU32xN(EmitContext& ctx, u32 handle, Id address) { - auto& buffer = ctx.buffers[handle]; - address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset); +template +static Id EmitLoadBufferB32xN(EmitContext& ctx, u32 handle, Id address) { + const auto& spv_buffer = ctx.buffers[handle]; + if (Sirit::ValidId(spv_buffer.offset)) { + address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); + } const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u)); + const auto& data_types = alias == BufferAlias::U32 ? ctx.U32 : ctx.F32; + const auto [id, pointer_type] = spv_buffer[alias]; if constexpr (N == 1) { - const Id ptr{ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index)}; - return ctx.OpLoad(buffer.data_types->Get(1), ptr); + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; + return ctx.OpLoad(data_types[1], ptr); } else { boost::container::static_vector ids; for (u32 i = 0; i < N; i++) { const Id index_i = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i)); - const Id ptr{ - ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index_i)}; - ids.push_back(ctx.OpLoad(buffer.data_types->Get(1), ptr)); + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i)}; + ids.push_back(ctx.OpLoad(data_types[1], ptr)); } - return ctx.OpCompositeConstruct(buffer.data_types->Get(N), ids); + return ctx.OpCompositeConstruct(data_types[N], ids); } } Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(3u))}; - const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; - const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; - return ctx.OpBitFieldUExtract(ctx.U32[1], dword, bit_offset, ctx.ConstU32(8u)); + const auto& spv_buffer = ctx.buffers[handle]; + if (Sirit::ValidId(spv_buffer.offset)) { + address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); + } + const auto [id, pointer_type] = spv_buffer[BufferAlias::U8]; + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, address)}; + return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U8, ptr)); } Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(2u))}; - const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; - const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; - return ctx.OpBitFieldUExtract(ctx.U32[1], dword, bit_offset, ctx.ConstU32(16u)); + const auto& spv_buffer = ctx.buffers[handle]; + if (Sirit::ValidId(spv_buffer.offset)) { + address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); + } + const auto [id, pointer_type] = spv_buffer[BufferAlias::U16]; + const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(1u)); + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; + return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, ptr)); } Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferU32xN<1>(ctx, handle, address); + return EmitLoadBufferB32xN<1, BufferAlias::U32>(ctx, handle, address); } Id EmitLoadBufferU32x2(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferU32xN<2>(ctx, handle, address); + return EmitLoadBufferB32xN<2, BufferAlias::U32>(ctx, handle, address); } Id EmitLoadBufferU32x3(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferU32xN<3>(ctx, handle, address); + return EmitLoadBufferB32xN<3, BufferAlias::U32>(ctx, handle, address); } Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferU32xN<4>(ctx, handle, address); + return EmitLoadBufferB32xN<4, BufferAlias::U32>(ctx, handle, address); } Id EmitLoadBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return ctx.OpBitcast(ctx.F32[1], EmitLoadBufferU32(ctx, inst, handle, address)); + return EmitLoadBufferB32xN<1, BufferAlias::F32>(ctx, handle, address); } Id EmitLoadBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return ctx.OpBitcast(ctx.F32[2], EmitLoadBufferU32x2(ctx, inst, handle, address)); + return EmitLoadBufferB32xN<2, BufferAlias::F32>(ctx, handle, address); } Id EmitLoadBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return ctx.OpBitcast(ctx.F32[3], EmitLoadBufferU32x3(ctx, inst, handle, address)); + return EmitLoadBufferB32xN<3, BufferAlias::F32>(ctx, handle, address); } Id EmitLoadBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return ctx.OpBitcast(ctx.F32[4], EmitLoadBufferU32x4(ctx, inst, handle, address)); + return EmitLoadBufferB32xN<4, BufferAlias::F32>(ctx, handle, address); } Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { UNREACHABLE_MSG("SPIR-V instruction"); } -template -static void EmitStoreBufferU32xN(EmitContext& ctx, u32 handle, Id address, Id value) { - auto& buffer = ctx.buffers[handle]; - address = ctx.OpIAdd(ctx.U32[1], address, buffer.offset); +template +static void EmitStoreBufferB32xN(EmitContext& ctx, u32 handle, Id address, Id value) { + const auto& spv_buffer = ctx.buffers[handle]; + if (Sirit::ValidId(spv_buffer.offset)) { + address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); + } const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u)); + const auto& data_types = alias == BufferAlias::U32 ? ctx.U32 : ctx.F32; + const auto [id, pointer_type] = spv_buffer[alias]; if constexpr (N == 1) { - const Id ptr{ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index)}; + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; ctx.OpStore(ptr, value); } else { for (u32 i = 0; i < N; i++) { const Id index_i = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i)); - const Id ptr = - ctx.OpAccessChain(buffer.pointer_type, buffer.id, ctx.u32_zero_value, index_i); - ctx.OpStore(ptr, ctx.OpCompositeExtract(buffer.data_types->Get(1), value, i)); + const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i); + ctx.OpStore(ptr, ctx.OpCompositeExtract(data_types[1], value, i)); } } } void EmitStoreBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(3u))}; - const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; - const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; - const Id new_val{ctx.OpBitFieldInsert(ctx.U32[1], dword, value, bit_offset, ctx.ConstU32(8u))}; - EmitStoreBufferU32xN<1>(ctx, handle, address, new_val); + const auto& spv_buffer = ctx.buffers[handle]; + if (Sirit::ValidId(spv_buffer.offset)) { + address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); + } + const auto [id, pointer_type] = spv_buffer[BufferAlias::U8]; + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, address)}; + ctx.OpStore(ptr, ctx.OpUConvert(ctx.U8, value)); } void EmitStoreBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - const Id byte_index{ctx.OpBitwiseAnd(ctx.U32[1], address, ctx.ConstU32(2u))}; - const Id bit_offset{ctx.OpShiftLeftLogical(ctx.U32[1], byte_index, ctx.ConstU32(3u))}; - const Id dword{EmitLoadBufferU32xN<1>(ctx, handle, address)}; - const Id new_val{ctx.OpBitFieldInsert(ctx.U32[1], dword, value, bit_offset, ctx.ConstU32(16u))}; - EmitStoreBufferU32xN<1>(ctx, handle, address, new_val); + const auto& spv_buffer = ctx.buffers[handle]; + if (Sirit::ValidId(spv_buffer.offset)) { + address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); + } + const auto [id, pointer_type] = spv_buffer[BufferAlias::U16]; + const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(1u)); + const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; + ctx.OpStore(ptr, ctx.OpUConvert(ctx.U16, value)); } void EmitStoreBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferU32xN<1>(ctx, handle, address, value); + EmitStoreBufferB32xN<1, BufferAlias::U32>(ctx, handle, address, value); } void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferU32xN<2>(ctx, handle, address, value); + EmitStoreBufferB32xN<2, BufferAlias::U32>(ctx, handle, address, value); } void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferU32xN<3>(ctx, handle, address, value); + EmitStoreBufferB32xN<3, BufferAlias::U32>(ctx, handle, address, value); } void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferU32xN<4>(ctx, handle, address, value); + EmitStoreBufferB32xN<4, BufferAlias::U32>(ctx, handle, address, value); } void EmitStoreBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferU32(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[1], value)); + EmitStoreBufferB32xN<1, BufferAlias::F32>(ctx, handle, address, value); } void EmitStoreBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferU32x2(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[2], value)); + EmitStoreBufferB32xN<2, BufferAlias::F32>(ctx, handle, address, value); } void EmitStoreBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferU32x3(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[3], value)); + EmitStoreBufferB32xN<3, BufferAlias::F32>(ctx, handle, address, value); } void EmitStoreBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferU32x4(ctx, inst, handle, address, ctx.OpBitcast(ctx.U32[4], value)); + EmitStoreBufferB32xN<4, BufferAlias::F32>(ctx, handle, address, value); } void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp index 550b95f3d..8b1610d61 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_shared_memory.cpp @@ -9,65 +9,35 @@ namespace Shader::Backend::SPIRV { Id EmitLoadSharedU32(EmitContext& ctx, Id offset) { const Id shift_id{ctx.ConstU32(2U)}; const Id index{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift_id)}; - if (ctx.info.has_emulated_shared_memory) { - const Id pointer = - ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, ctx.u32_zero_value, index); - return ctx.OpLoad(ctx.U32[1], pointer); - } else { - const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index); - return ctx.OpLoad(ctx.U32[1], pointer); - } + const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, index); + return ctx.OpLoad(ctx.U32[1], pointer); } Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { const Id shift_id{ctx.ConstU32(2U)}; const Id base_index{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift_id)}; const Id next_index{ctx.OpIAdd(ctx.U32[1], base_index, ctx.ConstU32(1U))}; - if (ctx.info.has_emulated_shared_memory) { - const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, - ctx.u32_zero_value, base_index)}; - const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, - ctx.u32_zero_value, next_index)}; - return ctx.OpCompositeConstruct(ctx.U32[2], ctx.OpLoad(ctx.U32[1], lhs_pointer), - ctx.OpLoad(ctx.U32[1], rhs_pointer)); - } else { - const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, base_index)}; - const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_index)}; - return ctx.OpCompositeConstruct(ctx.U32[2], ctx.OpLoad(ctx.U32[1], lhs_pointer), - ctx.OpLoad(ctx.U32[1], rhs_pointer)); - } + const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, base_index)}; + const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_index)}; + return ctx.OpCompositeConstruct(ctx.U32[2], ctx.OpLoad(ctx.U32[1], lhs_pointer), + ctx.OpLoad(ctx.U32[1], rhs_pointer)); } void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { const Id shift{ctx.ConstU32(2U)}; const Id word_offset{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift)}; - if (ctx.info.has_emulated_shared_memory) { - const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, - ctx.u32_zero_value, word_offset); - ctx.OpStore(pointer, value); - } else { - const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset); - ctx.OpStore(pointer, value); - } + const Id pointer = ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset); + ctx.OpStore(pointer, value); } void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { const Id shift{ctx.ConstU32(2U)}; const Id word_offset{ctx.OpShiftRightArithmetic(ctx.U32[1], offset, shift)}; const Id next_offset{ctx.OpIAdd(ctx.U32[1], word_offset, ctx.ConstU32(1U))}; - if (ctx.info.has_emulated_shared_memory) { - const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, - ctx.u32_zero_value, word_offset)}; - const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, - ctx.u32_zero_value, next_offset)}; - ctx.OpStore(lhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 0U)); - ctx.OpStore(rhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 1U)); - } else { - const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset)}; - const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_offset)}; - ctx.OpStore(lhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 0U)); - ctx.OpStore(rhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 1U)); - } + const Id lhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, word_offset)}; + const Id rhs_pointer{ctx.OpAccessChain(ctx.shared_u32, ctx.shared_memory_u32, next_offset)}; + ctx.OpStore(lhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 0U)); + ctx.OpStore(rhs_pointer, ctx.OpCompositeExtract(ctx.U32[1], value, 1U)); } } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp index a0a3ed8ff..724550cd6 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp @@ -11,6 +11,9 @@ void EmitPrologue(EmitContext& ctx) { if (ctx.stage == Stage::Fragment) { ctx.DefineInterpolatedAttribs(); } + if (ctx.info.loads.Get(IR::Attribute::WorkgroupIndex)) { + ctx.DefineWorkgroupIndex(); + } ctx.DefineBufferOffsets(); } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index d676d205d..da20dc691 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -5,7 +5,6 @@ #include "common/div_ceil.h" #include "shader_recompiler/backend/spirv/spirv_emit_context.h" #include "shader_recompiler/frontend/fetch_shader.h" -#include "shader_recompiler/ir/passes/srt.h" #include "shader_recompiler/runtime_info.h" #include "video_core/amdgpu/types.h" @@ -107,6 +106,8 @@ Id EmitContext::Def(const IR::Value& value) { void EmitContext::DefineArithmeticTypes() { void_id = Name(TypeVoid(), "void_id"); U1[1] = Name(TypeBool(), "bool_id"); + U8 = Name(TypeUInt(8), "u8_id"); + U16 = Name(TypeUInt(16), "u16_id"); if (info.uses_fp16) { F16[1] = Name(TypeFloat(16), "f16_id"); U16 = Name(TypeUInt(16), "u16_id"); @@ -193,6 +194,9 @@ EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat f void EmitContext::DefineBufferOffsets() { for (BufferDefinition& buffer : buffers) { + if (buffer.buffer_type != BufferType::Guest) { + continue; + } const u32 binding = buffer.binding; const u32 half = PushData::BufOffsetIndex + (binding >> 4); const u32 comp = (binding & 0xf) >> 2; @@ -211,8 +215,7 @@ void EmitContext::DefineInterpolatedAttribs() { if (!profile.needs_manual_interpolation) { return; } - // Iterate all input attributes, load them and manually interpolate with barycentric - // coordinates. + // Iterate all input attributes, load them and manually interpolate. for (s32 i = 0; i < runtime_info.fs_info.num_inputs; i++) { const auto& input = runtime_info.fs_info.inputs[i]; const u32 semantic = input.param_index; @@ -237,6 +240,20 @@ void EmitContext::DefineInterpolatedAttribs() { } } +void EmitContext::DefineWorkgroupIndex() { + const Id workgroup_id_val{OpLoad(U32[3], workgroup_id)}; + const Id workgroup_x{OpCompositeExtract(U32[1], workgroup_id_val, 0)}; + const Id workgroup_y{OpCompositeExtract(U32[1], workgroup_id_val, 1)}; + const Id workgroup_z{OpCompositeExtract(U32[1], workgroup_id_val, 2)}; + const Id num_workgroups{OpLoad(U32[3], num_workgroups_id)}; + const Id num_workgroups_x{OpCompositeExtract(U32[1], num_workgroups, 0)}; + const Id num_workgroups_y{OpCompositeExtract(U32[1], num_workgroups, 1)}; + workgroup_index_id = + OpIAdd(U32[1], OpIAdd(U32[1], workgroup_x, OpIMul(U32[1], workgroup_y, num_workgroups_x)), + OpIMul(U32[1], workgroup_z, OpIMul(U32[1], num_workgroups_x, num_workgroups_y))); + Name(workgroup_index_id, "workgroup_index"); +} + Id MakeDefaultValue(EmitContext& ctx, u32 default_value) { switch (default_value) { case 0: @@ -305,9 +322,16 @@ void EmitContext::DefineInputs() { break; } case LogicalStage::Fragment: - frag_coord = DefineVariable(F32[4], spv::BuiltIn::FragCoord, spv::StorageClass::Input); - frag_depth = DefineVariable(F32[1], spv::BuiltIn::FragDepth, spv::StorageClass::Output); - front_facing = DefineVariable(U1[1], spv::BuiltIn::FrontFacing, spv::StorageClass::Input); + if (info.loads.GetAny(IR::Attribute::FragCoord)) { + frag_coord = DefineVariable(F32[4], spv::BuiltIn::FragCoord, spv::StorageClass::Input); + } + if (info.stores.Get(IR::Attribute::Depth)) { + frag_depth = DefineVariable(F32[1], spv::BuiltIn::FragDepth, spv::StorageClass::Output); + } + if (info.loads.Get(IR::Attribute::IsFrontFace)) { + front_facing = + DefineVariable(U1[1], spv::BuiltIn::FrontFacing, spv::StorageClass::Input); + } if (profile.needs_manual_interpolation) { gl_bary_coord_id = DefineVariable(F32[3], spv::BuiltIn::BaryCoordKHR, spv::StorageClass::Input); @@ -342,9 +366,19 @@ void EmitContext::DefineInputs() { } break; case LogicalStage::Compute: - workgroup_id = DefineVariable(U32[3], spv::BuiltIn::WorkgroupId, spv::StorageClass::Input); - local_invocation_id = - DefineVariable(U32[3], spv::BuiltIn::LocalInvocationId, spv::StorageClass::Input); + if (info.loads.GetAny(IR::Attribute::WorkgroupIndex) || + info.loads.GetAny(IR::Attribute::WorkgroupId)) { + workgroup_id = + DefineVariable(U32[3], spv::BuiltIn::WorkgroupId, spv::StorageClass::Input); + } + if (info.loads.GetAny(IR::Attribute::WorkgroupIndex)) { + num_workgroups_id = + DefineVariable(U32[3], spv::BuiltIn::NumWorkgroups, spv::StorageClass::Input); + } + if (info.loads.GetAny(IR::Attribute::LocalInvocationId)) { + local_invocation_id = + DefineVariable(U32[3], spv::BuiltIn::LocalInvocationId, spv::StorageClass::Input); + } break; case LogicalStage::Geometry: { primitive_id = DefineVariable(U32[1], spv::BuiltIn::PrimitiveId, spv::StorageClass::Input); @@ -588,78 +622,74 @@ void EmitContext::DefinePushDataBlock() { interfaces.push_back(push_data_block); } -void EmitContext::DefineBuffers() { - boost::container::small_vector type_ids; - const auto define_struct = [&](Id record_array_type, bool is_instance_data, - std::optional explicit_name = {}) { - const Id struct_type{TypeStruct(record_array_type)}; - if (std::ranges::find(type_ids, record_array_type.value, &Id::value) != type_ids.end()) { - return struct_type; - } - Decorate(record_array_type, spv::Decoration::ArrayStride, 4); - auto name = is_instance_data ? fmt::format("{}_instance_data_f32", stage) - : fmt::format("{}_cbuf_block_f32", stage); - name = explicit_name.value_or(name); - Name(struct_type, name); +EmitContext::BufferSpv EmitContext::DefineBuffer(bool is_storage, bool is_written, u32 elem_shift, + BufferType buffer_type, Id data_type) { + // Define array type. + const Id max_num_items = ConstU32(u32(profile.max_ubo_size) >> elem_shift); + const Id record_array_type{is_storage ? TypeRuntimeArray(data_type) + : TypeArray(data_type, max_num_items)}; + // Define block struct type. Don't perform decorations twice on the same Id. + const Id struct_type{TypeStruct(record_array_type)}; + if (std::ranges::find(buf_type_ids, record_array_type.value, &Id::value) == + buf_type_ids.end()) { + Decorate(record_array_type, spv::Decoration::ArrayStride, 1 << elem_shift); Decorate(struct_type, spv::Decoration::Block); MemberName(struct_type, 0, "data"); MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U); - type_ids.push_back(record_array_type); - return struct_type; - }; - - if (info.has_readconst) { - const Id data_type = U32[1]; - const auto storage_class = spv::StorageClass::Uniform; - const Id pointer_type = TypePointer(storage_class, data_type); - const Id record_array_type{ - TypeArray(U32[1], ConstU32(static_cast(info.flattened_ud_buf.size())))}; - - const Id struct_type{define_struct(record_array_type, false, "srt_flatbuf_ty")}; - - const Id struct_pointer_type{TypePointer(storage_class, struct_type)}; - const Id id{AddGlobalVariable(struct_pointer_type, storage_class)}; - Decorate(id, spv::Decoration::Binding, binding.unified++); - Decorate(id, spv::Decoration::DescriptorSet, 0U); - Name(id, "srt_flatbuf_ubo"); - - srt_flatbuf = { - .id = id, - .binding = binding.buffer++, - .pointer_type = pointer_type, - }; - interfaces.push_back(id); + buf_type_ids.push_back(record_array_type); } + // Define buffer binding interface. + const auto storage_class = + is_storage ? spv::StorageClass::StorageBuffer : spv::StorageClass::Uniform; + const Id struct_pointer_type{TypePointer(storage_class, struct_type)}; + const Id pointer_type = TypePointer(storage_class, data_type); + const Id id{AddGlobalVariable(struct_pointer_type, storage_class)}; + Decorate(id, spv::Decoration::Binding, binding.unified); + Decorate(id, spv::Decoration::DescriptorSet, 0U); + if (is_storage && !is_written) { + Decorate(id, spv::Decoration::NonWritable); + } + switch (buffer_type) { + case Shader::BufferType::GdsBuffer: + Name(id, "gds_buffer"); + break; + case Shader::BufferType::ReadConstUbo: + Name(id, "srt_flatbuf_ubo"); + break; + case Shader::BufferType::SharedMemory: + Name(id, "ssbo_shmem"); + break; + default: + Name(id, fmt::format("{}_{}", is_storage ? "ssbo" : "ubo", binding.buffer)); + } + interfaces.push_back(id); + return {id, pointer_type}; +}; +void EmitContext::DefineBuffers() { for (const auto& desc : info.buffers) { - const auto sharp = desc.GetSharp(info); - const bool is_storage = desc.IsStorage(sharp, profile); - const u32 array_size = profile.max_ubo_size >> 2; - const auto* data_types = True(desc.used_types & IR::Type::F32) ? &F32 : &U32; - const Id data_type = (*data_types)[1]; - const Id record_array_type{is_storage ? TypeRuntimeArray(data_type) - : TypeArray(data_type, ConstU32(array_size))}; - const Id struct_type{define_struct(record_array_type, desc.is_instance_data)}; + const auto buf_sharp = desc.GetSharp(info); + const bool is_storage = desc.IsStorage(buf_sharp, profile); - const auto storage_class = - is_storage ? spv::StorageClass::StorageBuffer : spv::StorageClass::Uniform; - const Id struct_pointer_type{TypePointer(storage_class, struct_type)}; - const Id pointer_type = TypePointer(storage_class, data_type); - const Id id{AddGlobalVariable(struct_pointer_type, storage_class)}; - Decorate(id, spv::Decoration::Binding, binding.unified++); - Decorate(id, spv::Decoration::DescriptorSet, 0U); - if (is_storage && !desc.is_written) { - Decorate(id, spv::Decoration::NonWritable); + // Define aliases depending on the shader usage. + auto& spv_buffer = buffers.emplace_back(binding.buffer++, desc.buffer_type); + if (True(desc.used_types & IR::Type::U32)) { + spv_buffer[BufferAlias::U32] = + DefineBuffer(is_storage, desc.is_written, 2, desc.buffer_type, U32[1]); } - Name(id, fmt::format("{}_{}", is_storage ? "ssbo" : "cbuf", desc.sharp_idx)); - - buffers.push_back({ - .id = id, - .binding = binding.buffer++, - .data_types = data_types, - .pointer_type = pointer_type, - }); - interfaces.push_back(id); + if (True(desc.used_types & IR::Type::F32)) { + spv_buffer[BufferAlias::F32] = + DefineBuffer(is_storage, desc.is_written, 2, desc.buffer_type, F32[1]); + } + if (True(desc.used_types & IR::Type::U16)) { + spv_buffer[BufferAlias::U16] = + DefineBuffer(is_storage, desc.is_written, 1, desc.buffer_type, U16); + } + if (True(desc.used_types & IR::Type::U8)) { + spv_buffer[BufferAlias::U8] = + DefineBuffer(is_storage, desc.is_written, 0, desc.buffer_type, U8); + } + ++binding.unified; } } @@ -809,51 +839,18 @@ void EmitContext::DefineImagesAndSamplers() { } void EmitContext::DefineSharedMemory() { - static constexpr size_t DefaultSharedMemSize = 2_KB; if (!info.uses_shared) { return; } ASSERT(info.stage == Stage::Compute); - - const u32 max_shared_memory_size = profile.max_shared_memory_size; - u32 shared_memory_size = runtime_info.cs_info.shared_memory_size; - if (shared_memory_size == 0) { - shared_memory_size = DefaultSharedMemSize; - } - + const u32 shared_memory_size = runtime_info.cs_info.shared_memory_size; const u32 num_elements{Common::DivCeil(shared_memory_size, 4U)}; const Id type{TypeArray(U32[1], ConstU32(num_elements))}; - - if (shared_memory_size <= max_shared_memory_size) { - shared_memory_u32_type = TypePointer(spv::StorageClass::Workgroup, type); - shared_u32 = TypePointer(spv::StorageClass::Workgroup, U32[1]); - shared_memory_u32 = AddGlobalVariable(shared_memory_u32_type, spv::StorageClass::Workgroup); - Name(shared_memory_u32, "shared_mem"); - interfaces.push_back(shared_memory_u32); - } else { - shared_memory_u32_type = TypePointer(spv::StorageClass::StorageBuffer, type); - shared_u32 = TypePointer(spv::StorageClass::StorageBuffer, U32[1]); - - Decorate(type, spv::Decoration::ArrayStride, 4); - - const Id struct_type{TypeStruct(type)}; - Name(struct_type, "shared_memory_buf"); - Decorate(struct_type, spv::Decoration::Block); - MemberName(struct_type, 0, "data"); - MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U); - - const Id struct_pointer_type{TypePointer(spv::StorageClass::StorageBuffer, struct_type)}; - const Id ssbo_id{AddGlobalVariable(struct_pointer_type, spv::StorageClass::StorageBuffer)}; - Decorate(ssbo_id, spv::Decoration::Binding, binding.unified++); - Decorate(ssbo_id, spv::Decoration::DescriptorSet, 0U); - Name(ssbo_id, "shared_mem_ssbo"); - - shared_memory_u32 = ssbo_id; - - info.has_emulated_shared_memory = true; - info.shared_memory_size = shared_memory_size; - interfaces.push_back(ssbo_id); - } + shared_memory_u32_type = TypePointer(spv::StorageClass::Workgroup, type); + shared_u32 = TypePointer(spv::StorageClass::Workgroup, U32[1]); + shared_memory_u32 = AddGlobalVariable(shared_memory_u32_type, spv::StorageClass::Workgroup); + Name(shared_memory_u32, "shared_mem"); + interfaces.push_back(shared_memory_u32); } Id EmitContext::DefineFloat32ToUfloatM5(u32 mantissa_bits, const std::string_view name) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 23fca4212..0fe6e336c 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -8,7 +8,7 @@ #include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/info.h" -#include "shader_recompiler/ir/program.h" +#include "shader_recompiler/ir/value.h" #include "shader_recompiler/profile.h" namespace Shader::Backend::SPIRV { @@ -45,6 +45,7 @@ public: void DefineBufferOffsets(); void DefineInterpolatedAttribs(); + void DefineWorkgroupIndex(); [[nodiscard]] Id DefineInput(Id type, std::optional location = std::nullopt, std::optional builtin = std::nullopt) { @@ -200,8 +201,10 @@ public: std::array patches{}; Id workgroup_id{}; + Id num_workgroups_id{}; + Id workgroup_index_id{}; Id local_invocation_id{}; - Id invocation_id{}; // for instanced geoshaders or output vertices within TCS patch + Id invocation_id{}; Id subgroup_local_invocation_id{}; Id image_u32{}; @@ -227,18 +230,38 @@ public: bool is_storage = false; }; - struct BufferDefinition { + enum class BufferAlias : u32 { + U8, + U16, + U32, + F32, + NumAlias, + }; + + struct BufferSpv { Id id; - Id offset; - Id offset_dwords; - u32 binding; - const VectorIds* data_types; Id pointer_type; }; + struct BufferDefinition { + u32 binding; + BufferType buffer_type; + Id offset; + Id offset_dwords; + std::array aliases; + + const BufferSpv& operator[](BufferAlias alias) const { + return aliases[u32(alias)]; + } + + BufferSpv& operator[](BufferAlias alias) { + return aliases[u32(alias)]; + } + }; + Bindings& binding; + boost::container::small_vector buf_type_ids; boost::container::small_vector buffers; - BufferDefinition srt_flatbuf; boost::container::small_vector images; boost::container::small_vector samplers; @@ -279,6 +302,9 @@ private: SpirvAttribute GetAttributeInfo(AmdGpu::NumberFormat fmt, Id id, u32 num_components, bool output); + BufferSpv DefineBuffer(bool is_storage, bool is_written, u32 elem_shift, BufferType buffer_type, + Id data_type); + Id DefineFloat32ToUfloatM5(u32 mantissa_bits, std::string_view name); Id DefineUfloatM5ToFloat32(u32 mantissa_bits, std::string_view name); }; diff --git a/src/shader_recompiler/frontend/translate/data_share.cpp b/src/shader_recompiler/frontend/translate/data_share.cpp index 62c0423dd..460f8913c 100644 --- a/src/shader_recompiler/frontend/translate/data_share.cpp +++ b/src/shader_recompiler/frontend/translate/data_share.cpp @@ -176,6 +176,13 @@ void Translator::DS_WRITE(int bit_size, bool is_signed, bool is_pair, bool strid const IR::U32 addr{ir.GetVectorReg(IR::VectorReg(inst.src[0].code))}; const IR::VectorReg data0{inst.src[1].code}; const IR::VectorReg data1{inst.src[2].code}; + const u32 offset = (inst.control.ds.offset1 << 8u) + inst.control.ds.offset0; + if (info.stage == Stage::Fragment) { + ASSERT_MSG(!is_pair && bit_size == 32 && offset % 256 == 0, + "Unexpected shared memory offset alignment: {}", offset); + ir.SetVectorReg(GetScratchVgpr(offset), ir.GetVectorReg(data0)); + return; + } if (is_pair) { const u32 adj = (bit_size == 32 ? 4 : 8) * (stride64 ? 64 : 1); const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(u32(inst.control.ds.offset0 * adj))); @@ -195,14 +202,12 @@ void Translator::DS_WRITE(int bit_size, bool is_signed, bool is_pair, bool strid addr1); } } else if (bit_size == 64) { - const IR::U32 addr0 = ir.IAdd( - addr, ir.Imm32((u32(inst.control.ds.offset1) << 8u) + u32(inst.control.ds.offset0))); + const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(offset)); const IR::Value data = ir.CompositeConstruct(ir.GetVectorReg(data0), ir.GetVectorReg(data0 + 1)); ir.WriteShared(bit_size, data, addr0); } else { - const IR::U32 addr0 = ir.IAdd( - addr, ir.Imm32((u32(inst.control.ds.offset1) << 8u) + u32(inst.control.ds.offset0))); + const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(offset)); ir.WriteShared(bit_size, ir.GetVectorReg(data0), addr0); } } @@ -223,6 +228,13 @@ void Translator::DS_READ(int bit_size, bool is_signed, bool is_pair, bool stride const GcnInst& inst) { const IR::U32 addr{ir.GetVectorReg(IR::VectorReg(inst.src[0].code))}; IR::VectorReg dst_reg{inst.dst[0].code}; + const u32 offset = (inst.control.ds.offset1 << 8u) + inst.control.ds.offset0; + if (info.stage == Stage::Fragment) { + ASSERT_MSG(!is_pair && bit_size == 32 && offset % 256 == 0, + "Unexpected shared memory offset alignment: {}", offset); + ir.SetVectorReg(dst_reg, ir.GetVectorReg(GetScratchVgpr(offset))); + return; + } if (is_pair) { // Pair loads are either 32 or 64-bit const u32 adj = (bit_size == 32 ? 4 : 8) * (stride64 ? 64 : 1); @@ -243,14 +255,12 @@ void Translator::DS_READ(int bit_size, bool is_signed, bool is_pair, bool stride ir.SetVectorReg(dst_reg++, IR::U32{ir.CompositeExtract(data1, 1)}); } } else if (bit_size == 64) { - const IR::U32 addr0 = ir.IAdd( - addr, ir.Imm32((u32(inst.control.ds.offset1) << 8u) + u32(inst.control.ds.offset0))); + const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(offset)); const IR::Value data = ir.LoadShared(bit_size, is_signed, addr0); ir.SetVectorReg(dst_reg, IR::U32{ir.CompositeExtract(data, 0)}); ir.SetVectorReg(dst_reg + 1, IR::U32{ir.CompositeExtract(data, 1)}); } else { - const IR::U32 addr0 = ir.IAdd( - addr, ir.Imm32((u32(inst.control.ds.offset1) << 8u) + u32(inst.control.ds.offset0))); + const IR::U32 addr0 = ir.IAdd(addr, ir.Imm32(offset)); const IR::U32 data = IR::U32{ir.LoadShared(bit_size, is_signed, addr0)}; ir.SetVectorReg(dst_reg, data); } diff --git a/src/shader_recompiler/frontend/translate/export.cpp b/src/shader_recompiler/frontend/translate/export.cpp index ece35093a..0abef2e81 100644 --- a/src/shader_recompiler/frontend/translate/export.cpp +++ b/src/shader_recompiler/frontend/translate/export.cpp @@ -7,7 +7,7 @@ namespace Shader::Gcn { -u32 SwizzleMrtComponent(const FragmentRuntimeInfo::PsColorBuffer& color_buffer, u32 comp) { +u32 SwizzleMrtComponent(const PsColorBuffer& color_buffer, u32 comp) { const auto [r, g, b, a] = color_buffer.swizzle; const std::array swizzle_array = {r, g, b, a}; const auto swizzled_comp_type = static_cast(swizzle_array[comp]); @@ -16,7 +16,7 @@ u32 SwizzleMrtComponent(const FragmentRuntimeInfo::PsColorBuffer& color_buffer, } void Translator::ExportMrtValue(IR::Attribute attribute, u32 comp, const IR::F32& value, - const FragmentRuntimeInfo::PsColorBuffer& color_buffer) { + const PsColorBuffer& color_buffer) { auto converted = ApplyWriteNumberConversion(ir, value, color_buffer.num_conversion); if (color_buffer.needs_unorm_fixup) { // FIXME: Fix-up for GPUs where float-to-unorm rounding is off from expected. diff --git a/src/shader_recompiler/frontend/translate/translate.cpp b/src/shader_recompiler/frontend/translate/translate.cpp index 7f5504663..7f1bcb33e 100644 --- a/src/shader_recompiler/frontend/translate/translate.cpp +++ b/src/shader_recompiler/frontend/translate/translate.cpp @@ -4,7 +4,6 @@ #include "common/config.h" #include "common/io_file.h" #include "common/path_util.h" -#include "shader_recompiler/exception.h" #include "shader_recompiler/frontend/fetch_shader.h" #include "shader_recompiler/frontend/translate/translate.h" #include "shader_recompiler/info.h" @@ -21,9 +20,14 @@ namespace Shader::Gcn { +static u32 next_vgpr_num; +static std::unordered_map vgpr_map; + Translator::Translator(IR::Block* block_, Info& info_, const RuntimeInfo& runtime_info_, const Profile& profile_) - : ir{*block_, block_->begin()}, info{info_}, runtime_info{runtime_info_}, profile{profile_} {} + : ir{*block_, block_->begin()}, info{info_}, runtime_info{runtime_info_}, profile{profile_} { + next_vgpr_num = vgpr_map.empty() ? runtime_info.num_allocated_vgprs : next_vgpr_num; +} void Translator::EmitPrologue() { ir.Prologue(); @@ -179,8 +183,21 @@ void Translator::EmitPrologue() { default: UNREACHABLE_MSG("Unknown shader stage"); } + + // Clear any scratch vgpr mappings for next shader. + vgpr_map.clear(); } +IR::VectorReg Translator::GetScratchVgpr(u32 offset) { + const auto [it, is_new] = vgpr_map.try_emplace(offset); + if (is_new) { + ASSERT_MSG(next_vgpr_num < 256, "Out of VGPRs"); + const auto new_vgpr = static_cast(next_vgpr_num++); + it->second = new_vgpr; + } + return it->second; +}; + template T Translator::GetSrc(const InstOperand& operand) { constexpr bool is_float = std::is_same_v; @@ -490,7 +507,6 @@ void Translator::EmitFetch(const GcnInst& inst) { info.buffers.push_back({ .sharp_idx = info.srt_info.ReserveSharp(attrib.sgpr_base, attrib.dword_offset, 4), .used_types = IR::Type::F32, - .is_instance_data = true, .instance_attrib = attrib.semantic, }); } diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 287885854..563881a8e 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -309,7 +309,7 @@ private: const IR::F32& x_res, const IR::F32& y_res, const IR::F32& z_res); void ExportMrtValue(IR::Attribute attribute, u32 comp, const IR::F32& value, - const FragmentRuntimeInfo::PsColorBuffer& color_buffer); + const PsColorBuffer& color_buffer); void ExportMrtCompressed(IR::Attribute attribute, u32 idx, const IR::U32& value); void ExportMrtUncompressed(IR::Attribute attribute, u32 comp, const IR::F32& value); void ExportCompressed(IR::Attribute attribute, u32 idx, const IR::U32& value); @@ -317,6 +317,8 @@ private: void LogMissingOpcode(const GcnInst& inst); + IR::VectorReg GetScratchVgpr(u32 offset); + private: IR::IREmitter ir; Info& info; diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index 57d428a49..13f310cf8 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -2,7 +2,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include #include #include #include @@ -19,7 +18,6 @@ #include "shader_recompiler/params.h" #include "shader_recompiler/profile.h" #include "shader_recompiler/runtime_info.h" -#include "video_core/amdgpu/liverpool.h" #include "video_core/amdgpu/resource.h" namespace Shader { @@ -37,21 +35,30 @@ enum class TextureType : u32 { }; constexpr u32 NUM_TEXTURE_TYPES = 7; +enum class BufferType : u32 { + Guest, + ReadConstUbo, + GdsBuffer, + SharedMemory, +}; + struct Info; struct BufferResource { u32 sharp_idx; IR::Type used_types; AmdGpu::Buffer inline_cbuf; - bool is_gds_buffer{}; - bool is_instance_data{}; + BufferType buffer_type; u8 instance_attrib{}; bool is_written{}; bool is_formatted{}; - [[nodiscard]] bool IsStorage(const AmdGpu::Buffer& buffer, - const Profile& profile) const noexcept { - return buffer.GetSize() > profile.max_ubo_size || is_written || is_gds_buffer; + bool IsSpecial() const noexcept { + return buffer_type != BufferType::Guest; + } + + bool IsStorage(const AmdGpu::Buffer& buffer, const Profile& profile) const noexcept { + return buffer.GetSize() > profile.max_ubo_size || is_written; } [[nodiscard]] constexpr AmdGpu::Buffer GetSharp(const Info& info) const noexcept; @@ -193,10 +200,8 @@ struct Info { bool uses_unpack_10_11_11{}; bool stores_tess_level_outer{}; bool stores_tess_level_inner{}; - bool translation_failed{}; // indicates that shader has unsupported instructions - bool has_emulated_shared_memory{}; + bool translation_failed{}; bool has_readconst{}; - u32 shared_memory_size{}; u8 mrt_mask{0u}; bool has_fetch_shader{false}; u32 fetch_shader_sgpr_base{0u}; @@ -233,10 +238,8 @@ struct Info { } void AddBindings(Backend::Bindings& bnd) const { - const auto total_buffers = - buffers.size() + (has_readconst ? 1 : 0) + (has_emulated_shared_memory ? 1 : 0); - bnd.buffer += total_buffers; - bnd.unified += total_buffers + images.size() + samplers.size(); + bnd.buffer += buffers.size(); + bnd.unified += buffers.size() + images.size() + samplers.size(); bnd.user_data += ud_mask.NumRegs(); } @@ -283,14 +286,3 @@ constexpr AmdGpu::Image FMaskResource::GetSharp(const Info& info) const noexcept } } // namespace Shader - -template <> -struct fmt::formatter { - constexpr auto parse(format_parse_context& ctx) { - return ctx.begin(); - } - auto format(const Shader::Stage stage, format_context& ctx) const { - constexpr static std::array names = {"fs", "vs", "gs", "es", "hs", "ls", "cs"}; - return fmt::format_to(ctx.out(), "{}", names[static_cast(stage)]); - } -}; diff --git a/src/shader_recompiler/ir/attribute.h b/src/shader_recompiler/ir/attribute.h index bcb2b44a9..5117f5650 100644 --- a/src/shader_recompiler/ir/attribute.h +++ b/src/shader_recompiler/ir/attribute.h @@ -69,16 +69,17 @@ enum class Attribute : u64 { SampleIndex = 72, GlobalInvocationId = 73, WorkgroupId = 74, - LocalInvocationId = 75, - LocalInvocationIndex = 76, - FragCoord = 77, - InstanceId0 = 78, // step rate 0 - InstanceId1 = 79, // step rate 1 - InvocationId = 80, // TCS id in output patch and instanced geometry shader id - PatchVertices = 81, - TessellationEvaluationPointU = 82, - TessellationEvaluationPointV = 83, - PackedHullInvocationInfo = 84, // contains patch id within the VGT and invocation ID + WorkgroupIndex = 75, + LocalInvocationId = 76, + LocalInvocationIndex = 77, + FragCoord = 78, + InstanceId0 = 79, // step rate 0 + InstanceId1 = 80, // step rate 1 + InvocationId = 81, // TCS id in output patch and instanced geometry shader id + PatchVertices = 82, + TessellationEvaluationPointU = 83, + TessellationEvaluationPointV = 84, + PackedHullInvocationInfo = 85, // contains patch id within the VGT and invocation ID Max, }; diff --git a/src/shader_recompiler/ir/passes/ir_passes.h b/src/shader_recompiler/ir/passes/ir_passes.h index 3c98579a0..69628dbfd 100644 --- a/src/shader_recompiler/ir/passes/ir_passes.h +++ b/src/shader_recompiler/ir/passes/ir_passes.h @@ -20,12 +20,14 @@ void FlattenExtendedUserdataPass(IR::Program& program); void ResourceTrackingPass(IR::Program& program); void CollectShaderInfoPass(IR::Program& program); void LowerBufferFormatToRaw(IR::Program& program); -void LowerSharedMemToRegisters(IR::Program& program, const RuntimeInfo& runtime_info); void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info, Stage stage); void TessellationPreprocess(IR::Program& program, RuntimeInfo& runtime_info); void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info); void DomainShaderTransform(IR::Program& program, RuntimeInfo& runtime_info); -void SharedMemoryBarrierPass(IR::Program& program, const Profile& profile); +void SharedMemoryBarrierPass(IR::Program& program, const RuntimeInfo& runtime_info, + const Profile& profile); +void SharedMemoryToStoragePass(IR::Program& program, const RuntimeInfo& runtime_info, + const Profile& profile); } // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp b/src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp deleted file mode 100644 index 23963a991..000000000 --- a/src/shader_recompiler/ir/passes/lower_shared_mem_to_registers.cpp +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include "shader_recompiler/ir/ir_emitter.h" -#include "shader_recompiler/ir/program.h" - -namespace Shader::Optimization { - -static bool IsSharedMemoryInst(const IR::Inst& inst) { - const auto opcode = inst.GetOpcode(); - return opcode == IR::Opcode::LoadSharedU32 || opcode == IR::Opcode::LoadSharedU64 || - opcode == IR::Opcode::WriteSharedU32 || opcode == IR::Opcode::WriteSharedU64; -} - -static u32 GetSharedMemImmOffset(const IR::Inst& inst) { - const auto* address = inst.Arg(0).InstRecursive(); - ASSERT(address->GetOpcode() == IR::Opcode::IAdd32); - const auto ir_offset = address->Arg(1); - ASSERT_MSG(ir_offset.IsImmediate()); - const auto offset = ir_offset.U32(); - // Typical usage is the compiler spilling registers into shared memory, with 256 bytes between - // each register to account for 4 bytes per register times 64 threads per group. Ensure that - // this assumption holds, as if it does not this approach may need to be revised. - ASSERT_MSG(offset % 256 == 0, "Unexpected shared memory offset alignment: {}", offset); - return offset; -} - -static void ConvertSharedMemToVgpr(IR::IREmitter& ir, IR::Inst& inst, const IR::VectorReg vgpr) { - switch (inst.GetOpcode()) { - case IR::Opcode::LoadSharedU32: - inst.ReplaceUsesWithAndRemove(ir.GetVectorReg(vgpr)); - break; - case IR::Opcode::LoadSharedU64: - inst.ReplaceUsesWithAndRemove( - ir.CompositeConstruct(ir.GetVectorReg(vgpr), ir.GetVectorReg(vgpr + 1))); - break; - case IR::Opcode::WriteSharedU32: - ir.SetVectorReg(vgpr, IR::U32{inst.Arg(1)}); - inst.Invalidate(); - break; - case IR::Opcode::WriteSharedU64: { - const auto value = inst.Arg(1); - ir.SetVectorReg(vgpr, IR::U32{ir.CompositeExtract(value, 0)}); - ir.SetVectorReg(vgpr, IR::U32{ir.CompositeExtract(value, 1)}); - inst.Invalidate(); - break; - } - default: - UNREACHABLE_MSG("Unknown shared memory opcode: {}", inst.GetOpcode()); - } -} - -void LowerSharedMemToRegisters(IR::Program& program, const RuntimeInfo& runtime_info) { - u32 next_vgpr_num = runtime_info.num_allocated_vgprs; - std::unordered_map vgpr_map; - const auto get_vgpr = [&next_vgpr_num, &vgpr_map](const u32 offset) { - const auto [it, is_new] = vgpr_map.try_emplace(offset); - if (is_new) { - ASSERT_MSG(next_vgpr_num < 256, "Out of VGPRs"); - const auto new_vgpr = static_cast(next_vgpr_num++); - it->second = new_vgpr; - } - return it->second; - }; - - for (IR::Block* const block : program.blocks) { - for (IR::Inst& inst : block->Instructions()) { - if (!IsSharedMemoryInst(inst)) { - continue; - } - const auto offset = GetSharedMemImmOffset(inst); - const auto vgpr = get_vgpr(offset); - IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; - ConvertSharedMemToVgpr(ir, inst, vgpr); - } - } -} - -} // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp index 029558d9e..c5bfe5796 100644 --- a/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp +++ b/src/shader_recompiler/ir/passes/resource_tracking_pass.cpp @@ -78,7 +78,20 @@ bool IsDataRingInstruction(const IR::Inst& inst) { } IR::Type BufferDataType(const IR::Inst& inst, AmdGpu::NumberFormat num_format) { - return IR::Type::U32; + switch (inst.GetOpcode()) { + case IR::Opcode::LoadBufferU8: + case IR::Opcode::StoreBufferU8: + return IR::Type::U8; + case IR::Opcode::LoadBufferU16: + case IR::Opcode::StoreBufferU16: + return IR::Type::U16; + case IR::Opcode::LoadBufferFormatF32: + case IR::Opcode::StoreBufferFormatF32: + // Formatted buffer loads can use a variety of types. + return IR::Type::U32 | IR::Type::F32 | IR::Type::U16 | IR::Type::U8; + default: + return IR::Type::U32; + } } bool IsImageAtomicInstruction(const IR::Inst& inst) { @@ -121,11 +134,9 @@ public: u32 Add(const BufferResource& desc) { const u32 index{Add(buffer_resources, desc, [&desc](const auto& existing) { - // Only one GDS binding can exist. - if (desc.is_gds_buffer && existing.is_gds_buffer) { - return true; - } - return desc.sharp_idx == existing.sharp_idx && desc.inline_cbuf == existing.inline_cbuf; + return desc.sharp_idx == existing.sharp_idx && + desc.inline_cbuf == existing.inline_cbuf && + desc.buffer_type == existing.buffer_type; })}; auto& buffer = buffer_resources[index]; buffer.used_types |= desc.used_types; @@ -272,6 +283,7 @@ s32 TryHandleInlineCbuf(IR::Inst& inst, Info& info, Descriptors& descriptors, .sharp_idx = std::numeric_limits::max(), .used_types = BufferDataType(inst, cbuf.GetNumberFmt()), .inline_cbuf = cbuf, + .buffer_type = BufferType::Guest, }); } @@ -286,6 +298,7 @@ void PatchBufferSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& binding = descriptors.Add(BufferResource{ .sharp_idx = sharp, .used_types = BufferDataType(inst, buffer.GetNumberFmt()), + .buffer_type = BufferType::Guest, .is_written = IsBufferStore(inst), .is_formatted = inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32 || inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32, @@ -402,13 +415,10 @@ void PatchImageSharp(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& } void PatchDataRingAccess(IR::Block& block, IR::Inst& inst, Info& info, Descriptors& descriptors) { - // Insert gds binding in the shader if it doesn't exist already. - // The buffer is used for append/consume counters. - constexpr static AmdGpu::Buffer GdsSharp{.base_address = 1}; const u32 binding = descriptors.Add(BufferResource{ .used_types = IR::Type::U32, - .inline_cbuf = GdsSharp, - .is_gds_buffer = true, + .inline_cbuf = AmdGpu::Buffer::Null(), + .buffer_type = BufferType::GdsBuffer, .is_written = true, }); @@ -420,12 +430,12 @@ void PatchDataRingAccess(IR::Block& block, IR::Inst& inst, Info& info, Descripto }; // Attempt to deduce the GDS address of counter at compile time. - const u32 gds_addr = [&] { - const IR::Value& gds_offset = inst.Arg(0); - if (gds_offset.IsImmediate()) { - // Nothing to do, offset is known. - return gds_offset.U32() & 0xFFFF; - } + u32 gds_addr = 0; + const IR::Value& gds_offset = inst.Arg(0); + if (gds_offset.IsImmediate()) { + // Nothing to do, offset is known. + gds_addr = gds_offset.U32() & 0xFFFF; + } else { const auto result = IR::BreadthFirstSearch(&inst, pred); ASSERT_MSG(result, "Unable to track M0 source"); @@ -436,8 +446,8 @@ void PatchDataRingAccess(IR::Block& block, IR::Inst& inst, Info& info, Descripto if (prod->GetOpcode() == IR::Opcode::IAdd32) { m0_val += prod->Arg(1).U32(); } - return m0_val & 0xFFFF; - }(); + gds_addr = m0_val & 0xFFFF; + } // Patch instruction. IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; diff --git a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp index f3a1fc9a8..219378a6c 100644 --- a/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp +++ b/src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp @@ -74,7 +74,14 @@ void Visit(Info& info, const IR::Inst& inst) { info.uses_lane_id = true; break; case IR::Opcode::ReadConst: - info.has_readconst = true; + if (!info.has_readconst) { + info.buffers.push_back({ + .used_types = IR::Type::U32, + .inline_cbuf = AmdGpu::Buffer::Null(), + .buffer_type = BufferType::ReadConstUbo, + }); + info.has_readconst = true; + } break; case IR::Opcode::PackUfloat10_11_11: info.uses_pack_10_11_11 = true; @@ -88,10 +95,9 @@ void Visit(Info& info, const IR::Inst& inst) { } void CollectShaderInfoPass(IR::Program& program) { - Info& info{program.info}; for (IR::Block* const block : program.post_order_blocks) { for (IR::Inst& inst : block->Instructions()) { - Visit(info, inst); + Visit(program.info, inst); } } } diff --git a/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp b/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp index ec7d7e986..0ee52cf19 100644 --- a/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp +++ b/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp @@ -8,37 +8,46 @@ namespace Shader::Optimization { +static bool IsLoadShared(const IR::Inst& inst) { + return inst.GetOpcode() == IR::Opcode::LoadSharedU32 || + inst.GetOpcode() == IR::Opcode::LoadSharedU64; +} + +static bool IsWriteShared(const IR::Inst& inst) { + return inst.GetOpcode() == IR::Opcode::WriteSharedU32 || + inst.GetOpcode() == IR::Opcode::WriteSharedU64; +} + +// Inserts barriers when a shared memory write and read occur in the same basic block. static void EmitBarrierInBlock(IR::Block* block) { - // This is inteded to insert a barrier when shared memory write and read - // occur in the same basic block. Also checks if branch depth is zero as - // we don't want to insert barrier in potentially divergent code. - bool emit_barrier_on_write = false; - bool emit_barrier_on_read = false; - const auto emit_barrier = [block](bool& emit_cond, IR::Inst& inst) { - if (emit_cond) { - IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; - ir.Barrier(); - emit_cond = false; - } + enum class BarrierAction : u32 { + None, + BarrierOnWrite, + BarrierOnRead, }; + BarrierAction action{}; for (IR::Inst& inst : block->Instructions()) { - if (inst.GetOpcode() == IR::Opcode::LoadSharedU32 || - inst.GetOpcode() == IR::Opcode::LoadSharedU64) { - emit_barrier(emit_barrier_on_read, inst); - emit_barrier_on_write = true; + if (IsLoadShared(inst)) { + if (action == BarrierAction::BarrierOnRead) { + IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; + ir.Barrier(); + } + action = BarrierAction::BarrierOnWrite; + continue; } - if (inst.GetOpcode() == IR::Opcode::WriteSharedU32 || - inst.GetOpcode() == IR::Opcode::WriteSharedU64) { - emit_barrier(emit_barrier_on_write, inst); - emit_barrier_on_read = true; + if (IsWriteShared(inst)) { + if (action == BarrierAction::BarrierOnWrite) { + IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; + ir.Barrier(); + } + action = BarrierAction::BarrierOnRead; } } } +// Inserts a barrier after divergent conditional blocks to avoid undefined +// behavior when some threads write and others read from shared memory. static void EmitBarrierInMergeBlock(const IR::AbstractSyntaxNode::Data& data) { - // Insert a barrier after divergent conditional blocks. - // This avoids potential softlocks and crashes when some threads - // initialize shared memory and others read from it. const IR::U1 cond = data.if_node.cond; const auto insert_barrier = IR::BreadthFirstSearch(cond, [](IR::Inst* inst) -> std::optional { @@ -56,8 +65,21 @@ static void EmitBarrierInMergeBlock(const IR::AbstractSyntaxNode::Data& data) { } } -void SharedMemoryBarrierPass(IR::Program& program, const Profile& profile) { - if (!program.info.uses_shared || !profile.needs_lds_barriers) { +static constexpr u32 GcnSubgroupSize = 64; + +void SharedMemoryBarrierPass(IR::Program& program, const RuntimeInfo& runtime_info, + const Profile& profile) { + if (program.info.stage != Stage::Compute) { + return; + } + const auto& cs_info = runtime_info.cs_info; + const u32 shared_memory_size = cs_info.shared_memory_size; + const u32 threadgroup_size = + cs_info.workgroup_size[0] * cs_info.workgroup_size[1] * cs_info.workgroup_size[2]; + // The compiler can only omit barriers when the local workgroup size is the same as the HW + // subgroup. + if (shared_memory_size == 0 || threadgroup_size != GcnSubgroupSize || + !profile.needs_lds_barriers) { return; } using Type = IR::AbstractSyntaxNode::Type; @@ -67,6 +89,8 @@ void SharedMemoryBarrierPass(IR::Program& program, const Profile& profile) { --branch_depth; continue; } + // Check if branch depth is zero, we don't want to insert barrier in potentially divergent + // code. if (node.type == Type::If && branch_depth++ == 0) { EmitBarrierInMergeBlock(node.data); continue; diff --git a/src/shader_recompiler/ir/passes/shared_memory_to_storage_pass.cpp b/src/shader_recompiler/ir/passes/shared_memory_to_storage_pass.cpp new file mode 100644 index 000000000..25aaf257c --- /dev/null +++ b/src/shader_recompiler/ir/passes/shared_memory_to_storage_pass.cpp @@ -0,0 +1,117 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "shader_recompiler/ir/ir_emitter.h" +#include "shader_recompiler/ir/program.h" +#include "shader_recompiler/profile.h" + +namespace Shader::Optimization { + +static bool IsSharedAccess(const IR::Inst& inst) { + const auto opcode = inst.GetOpcode(); + switch (opcode) { + case IR::Opcode::LoadSharedU32: + case IR::Opcode::LoadSharedU64: + case IR::Opcode::WriteSharedU32: + case IR::Opcode::WriteSharedU64: + case IR::Opcode::SharedAtomicAnd32: + case IR::Opcode::SharedAtomicIAdd32: + case IR::Opcode::SharedAtomicOr32: + case IR::Opcode::SharedAtomicSMax32: + case IR::Opcode::SharedAtomicUMax32: + case IR::Opcode::SharedAtomicSMin32: + case IR::Opcode::SharedAtomicUMin32: + case IR::Opcode::SharedAtomicXor32: + return true; + default: + return false; + } +} + +void SharedMemoryToStoragePass(IR::Program& program, const RuntimeInfo& runtime_info, + const Profile& profile) { + if (program.info.stage != Stage::Compute) { + return; + } + // Only perform the transform if the host shared memory is insufficient. + const u32 shared_memory_size = runtime_info.cs_info.shared_memory_size; + if (shared_memory_size <= profile.max_shared_memory_size) { + return; + } + // Add buffer binding for shared memory storage buffer. + const u32 binding = static_cast(program.info.buffers.size()); + program.info.buffers.push_back({ + .used_types = IR::Type::U32, + .inline_cbuf = AmdGpu::Buffer::Null(), + .buffer_type = BufferType::SharedMemory, + .is_written = true, + }); + for (IR::Block* const block : program.blocks) { + for (IR::Inst& inst : block->Instructions()) { + if (!IsSharedAccess(inst)) { + continue; + } + IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; + const IR::U32 handle = ir.Imm32(binding); + // Replace shared atomics first + switch (inst.GetOpcode()) { + case IR::Opcode::SharedAtomicAnd32: + inst.ReplaceUsesWithAndRemove( + ir.BufferAtomicAnd(handle, inst.Arg(0), inst.Arg(1), {})); + continue; + case IR::Opcode::SharedAtomicIAdd32: + inst.ReplaceUsesWithAndRemove( + ir.BufferAtomicIAdd(handle, inst.Arg(0), inst.Arg(1), {})); + continue; + case IR::Opcode::SharedAtomicOr32: + inst.ReplaceUsesWithAndRemove( + ir.BufferAtomicOr(handle, inst.Arg(0), inst.Arg(1), {})); + continue; + case IR::Opcode::SharedAtomicSMax32: + case IR::Opcode::SharedAtomicUMax32: { + const bool is_signed = inst.GetOpcode() == IR::Opcode::SharedAtomicSMax32; + inst.ReplaceUsesWithAndRemove( + ir.BufferAtomicIMax(handle, inst.Arg(0), inst.Arg(1), is_signed, {})); + continue; + } + case IR::Opcode::SharedAtomicSMin32: + case IR::Opcode::SharedAtomicUMin32: { + const bool is_signed = inst.GetOpcode() == IR::Opcode::SharedAtomicSMin32; + inst.ReplaceUsesWithAndRemove( + ir.BufferAtomicIMin(handle, inst.Arg(0), inst.Arg(1), is_signed, {})); + continue; + } + case IR::Opcode::SharedAtomicXor32: + inst.ReplaceUsesWithAndRemove( + ir.BufferAtomicXor(handle, inst.Arg(0), inst.Arg(1), {})); + continue; + default: + break; + } + // Replace shared operations. + const IR::U32 offset = ir.IMul(ir.GetAttributeU32(IR::Attribute::WorkgroupIndex), + ir.Imm32(shared_memory_size)); + const IR::U32 address = ir.IAdd(IR::U32{inst.Arg(0)}, offset); + switch (inst.GetOpcode()) { + case IR::Opcode::LoadSharedU32: + inst.ReplaceUsesWithAndRemove(ir.LoadBufferU32(1, handle, address, {})); + break; + case IR::Opcode::LoadSharedU64: + inst.ReplaceUsesWithAndRemove(ir.LoadBufferU32(2, handle, address, {})); + break; + case IR::Opcode::WriteSharedU32: + ir.StoreBufferU32(1, handle, address, inst.Arg(1), {}); + inst.Invalidate(); + break; + case IR::Opcode::WriteSharedU64: + ir.StoreBufferU32(2, handle, address, inst.Arg(1), {}); + inst.Invalidate(); + break; + default: + break; + } + } + } +} + +} // namespace Shader::Optimization diff --git a/src/shader_recompiler/recompiler.cpp b/src/shader_recompiler/recompiler.cpp index 5a6d1d775..1c132ebbb 100644 --- a/src/shader_recompiler/recompiler.cpp +++ b/src/shader_recompiler/recompiler.cpp @@ -65,10 +65,6 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info // Run optimization passes const auto stage = program.info.stage; - if (stage == Stage::Fragment) { - // Before SSA pass, as it will rewrite to VGPR load/store. - Shader::Optimization::LowerSharedMemToRegisters(program, runtime_info); - } Shader::Optimization::SsaRewritePass(program.post_order_blocks); Shader::Optimization::IdentityRemovalPass(program.blocks); if (info.l_stage == LogicalStage::TessellationControl) { @@ -90,11 +86,12 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info Shader::Optimization::FlattenExtendedUserdataPass(program); Shader::Optimization::ResourceTrackingPass(program); Shader::Optimization::LowerBufferFormatToRaw(program); + Shader::Optimization::SharedMemoryToStoragePass(program, runtime_info, profile); + Shader::Optimization::SharedMemoryBarrierPass(program, runtime_info, profile); Shader::Optimization::IdentityRemovalPass(program.blocks); Shader::Optimization::DeadCodeEliminationPass(program); Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::CollectShaderInfoPass(program); - Shader::Optimization::SharedMemoryBarrierPass(program, profile); return program; } diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 78973c2d4..517392b98 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -167,6 +167,17 @@ enum class MrtSwizzle : u8 { }; static constexpr u32 MaxColorBuffers = 8; +struct PsColorBuffer { + AmdGpu::NumberFormat num_format : 4; + AmdGpu::NumberConversion num_conversion : 2; + AmdGpu::Liverpool::ShaderExportFormat export_format : 4; + u32 needs_unorm_fixup : 1; + u32 pad : 21; + AmdGpu::CompMapping swizzle; + + auto operator<=>(const PsColorBuffer&) const noexcept = default; +}; + struct FragmentRuntimeInfo { struct PsInput { u8 param_index; @@ -184,15 +195,6 @@ struct FragmentRuntimeInfo { AmdGpu::Liverpool::PsInput addr_flags; u32 num_inputs; std::array inputs; - struct PsColorBuffer { - AmdGpu::NumberFormat num_format; - AmdGpu::NumberConversion num_conversion; - AmdGpu::CompMapping swizzle; - AmdGpu::Liverpool::ShaderExportFormat export_format; - bool needs_unorm_fixup; - - auto operator<=>(const PsColorBuffer&) const noexcept = default; - }; std::array color_buffers; bool operator==(const FragmentRuntimeInfo& other) const noexcept { @@ -264,3 +266,14 @@ struct RuntimeInfo { }; } // namespace Shader + +template <> +struct fmt::formatter { + constexpr auto parse(format_parse_context& ctx) { + return ctx.begin(); + } + auto format(const Shader::Stage stage, format_context& ctx) const { + constexpr static std::array names = {"fs", "vs", "gs", "es", "hs", "ls", "cs"}; + return fmt::format_to(ctx.out(), "{}", names[static_cast(stage)]); + } +}; diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index 9bf9e71e4..1c3bfc60a 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -98,12 +98,6 @@ struct StageSpecialization { }); } u32 binding{}; - if (info->has_emulated_shared_memory) { - binding++; - } - if (info->has_readconst) { - binding++; - } ForEachSharp(binding, buffers, info->buffers, [profile_](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { spec.stride = sharp.GetStride(); @@ -195,18 +189,6 @@ struct StageSpecialization { } } u32 binding{}; - if (info->has_emulated_shared_memory != other.info->has_emulated_shared_memory) { - return false; - } - if (info->has_readconst != other.info->has_readconst) { - return false; - } - if (info->has_emulated_shared_memory) { - binding++; - } - if (info->has_readconst) { - binding++; - } for (u32 i = 0; i < buffers.size(); i++) { if (other.bitset[binding++] && buffers[i] != other.buffers[i]) { return false; diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 525a0c9f1..5b9b647eb 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -197,6 +197,10 @@ struct Liverpool { return settings.lds_dwords.Value() * 128 * 4; } + u32 NumWorkgroups() const noexcept { + return dim_x * dim_y * dim_z; + } + bool IsTgidEnabled(u32 i) const noexcept { return (settings.tgid_enable.Value() >> i) & 1; } diff --git a/src/video_core/amdgpu/resource.h b/src/video_core/amdgpu/resource.h index fa8edb3e2..64a85c812 100644 --- a/src/video_core/amdgpu/resource.h +++ b/src/video_core/amdgpu/resource.h @@ -31,6 +31,12 @@ struct Buffer { u32 _padding1 : 6; u32 type : 2; // overlaps with T# type, so should be 0 for buffer + static constexpr Buffer Null() { + Buffer buffer{}; + buffer.base_address = 1; + return buffer; + } + bool Valid() const { return type == 0u; } diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index ee2dda494..d991e0abd 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -183,7 +183,7 @@ enum class NumberFormat : u32 { Ubscaled = 13, }; -enum class CompSwizzle : u32 { +enum class CompSwizzle : u8 { Zero = 0, One = 1, Red = 4, @@ -193,10 +193,10 @@ enum class CompSwizzle : u32 { }; enum class NumberConversion : u32 { - None, - UintToUscaled, - SintToSscaled, - UnormToUbnorm, + None = 0, + UintToUscaled = 1, + SintToSscaled = 2, + UnormToUbnorm = 3, }; struct CompMapping { diff --git a/src/video_core/buffer_cache/buffer.h b/src/video_core/buffer_cache/buffer.h index ec92a0ebf..188b4b2ca 100644 --- a/src/video_core/buffer_cache/buffer.h +++ b/src/video_core/buffer_cache/buffer.h @@ -168,7 +168,7 @@ public: void Commit(); /// Maps and commits a memory region with user provided data - u64 Copy(VAddr src, size_t size, size_t alignment = 0) { + u64 Copy(auto src, size_t size, size_t alignment = 0) { const auto [data, offset] = Map(size, alignment); std::memcpy(data, reinterpret_cast(src), size); Commit(); diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 37af62f30..ccb45c095 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -5,11 +5,8 @@ #include "common/alignment.h" #include "common/scope_exit.h" #include "common/types.h" -#include "shader_recompiler/frontend/fetch_shader.h" -#include "shader_recompiler/info.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/buffer_cache/buffer_cache.h" -#include "video_core/renderer_vulkan/liverpool_to_vk.h" #include "video_core/renderer_vulkan/vk_graphics_pipeline.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" @@ -18,8 +15,8 @@ namespace VideoCore { static constexpr size_t DataShareBufferSize = 64_KB; -static constexpr size_t StagingBufferSize = 1_GB; -static constexpr size_t UboStreamBufferSize = 64_MB; +static constexpr size_t StagingBufferSize = 512_MB; +static constexpr size_t UboStreamBufferSize = 128_MB; BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_, AmdGpu::Liverpool* liverpool_, TextureCache& texture_cache_, @@ -29,10 +26,8 @@ BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& s staging_buffer{instance, scheduler, MemoryUsage::Upload, StagingBufferSize}, stream_buffer{instance, scheduler, MemoryUsage::Stream, UboStreamBufferSize}, gds_buffer{instance, scheduler, MemoryUsage::Stream, 0, AllFlags, DataShareBufferSize}, - lds_buffer{instance, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags, DataShareBufferSize}, memory_tracker{&tracker} { Vulkan::SetObjectName(instance.GetDevice(), gds_buffer.Handle(), "GDS Buffer"); - Vulkan::SetObjectName(instance.GetDevice(), lds_buffer.Handle(), "LDS Buffer"); // Ensure the first slot is used for the null buffer const auto null_id = @@ -251,14 +246,6 @@ void BufferCache::InlineData(VAddr address, const void* value, u32 num_bytes, bo }); } -std::pair BufferCache::ObtainHostUBO(std::span data) { - static constexpr u64 StreamThreshold = CACHING_PAGESIZE; - ASSERT(data.size_bytes() <= StreamThreshold); - const u64 offset = stream_buffer.Copy(reinterpret_cast(data.data()), data.size_bytes(), - instance.UniformMinAlignment()); - return {&stream_buffer, offset}; -} - std::pair BufferCache::ObtainBuffer(VAddr device_addr, u32 size, bool is_written, bool is_texel_buffer, BufferId buffer_id) { // For small uniform buffers that have not been modified by gpu diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 088c22c12..71a6bed2a 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -68,9 +68,9 @@ public: return &gds_buffer; } - /// Returns a pointer to LDS device local buffer. - [[nodiscard]] const Buffer* GetLdsBuffer() const noexcept { - return &lds_buffer; + /// Retrieves the host visible device local stream buffer. + [[nodiscard]] StreamBuffer& GetStreamBuffer() noexcept { + return stream_buffer; } /// Retrieves the buffer with the specified id. @@ -90,8 +90,6 @@ public: /// Writes a value to GPU buffer. void InlineData(VAddr address, const void* value, u32 num_bytes, bool is_gds); - [[nodiscard]] std::pair ObtainHostUBO(std::span data); - /// Obtains a buffer for the specified region. [[nodiscard]] std::pair ObtainBuffer(VAddr gpu_addr, u32 size, bool is_written, bool is_texel_buffer = false, @@ -159,7 +157,6 @@ private: StreamBuffer staging_buffer; StreamBuffer stream_buffer; Buffer gds_buffer; - Buffer lds_buffer; std::shared_mutex mutex; Common::SlotVector slot_buffers; RangeSet gpu_modified_ranges; diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index f0346559d..f6216f54f 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -3,11 +3,9 @@ #include -#include "video_core/buffer_cache/buffer_cache.h" #include "video_core/renderer_vulkan/vk_compute_pipeline.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" -#include "video_core/texture_cache/texture_cache.h" namespace Vulkan { @@ -29,23 +27,6 @@ ComputePipeline::ComputePipeline(const Instance& instance, Scheduler& scheduler, u32 binding{}; boost::container::small_vector bindings; - - if (info->has_emulated_shared_memory) { - bindings.push_back({ - .binding = binding++, - .descriptorType = vk::DescriptorType::eStorageBuffer, - .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eCompute, - }); - } - if (info->has_readconst) { - bindings.push_back({ - .binding = binding++, - .descriptorType = vk::DescriptorType::eUniformBuffer, - .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eCompute, - }); - } for (const auto& buffer : info->buffers) { const auto sharp = buffer.GetSharp(*info); bindings.push_back({ diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 4eecd1edf..2c432e9bf 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -7,18 +7,13 @@ #include #include "common/assert.h" -#include "common/io_file.h" #include "shader_recompiler/backend/spirv/emit_spirv_quad_rect.h" #include "shader_recompiler/frontend/fetch_shader.h" -#include "shader_recompiler/runtime_info.h" #include "video_core/amdgpu/resource.h" -#include "video_core/buffer_cache/buffer_cache.h" #include "video_core/renderer_vulkan/vk_graphics_pipeline.h" #include "video_core/renderer_vulkan/vk_instance.h" -#include "video_core/renderer_vulkan/vk_pipeline_cache.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_shader_util.h" -#include "video_core/texture_cache/texture_cache.h" namespace Vulkan { @@ -357,14 +352,6 @@ void GraphicsPipeline::BuildDescSetLayout() { if (!stage) { continue; } - if (stage->has_readconst) { - bindings.push_back({ - .binding = binding++, - .descriptorType = vk::DescriptorType::eUniformBuffer, - .descriptorCount = 1, - .stageFlags = gp_stage_flags, - }); - } for (const auto& buffer : stage->buffers) { const auto sharp = buffer.GetSharp(*stage); bindings.push_back({ diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 64cc761f4..e6596db2f 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -35,8 +35,7 @@ struct GraphicsPipelineKey { std::array stage_hashes; u32 num_color_attachments; std::array color_formats; - std::array - color_buffers; + std::array color_buffers; vk::Format depth_format; vk::Format stencil_format; diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 780779c0b..a17f8c9c2 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -1,14 +1,11 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include #include #include #include #include "common/assert.h" -#include "common/config.h" #include "common/debug.h" #include "sdl_window.h" #include "video_core/renderer_vulkan/liverpool_to_vk.h" @@ -206,13 +203,12 @@ std::string Instance::GetDriverVersionName() { } bool Instance::CreateDevice() { - const vk::StructureChain feature_chain = - physical_device - .getFeatures2(); + const vk::StructureChain feature_chain = physical_device.getFeatures2< + vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan11Features, + vk::PhysicalDeviceVulkan12Features, vk::PhysicalDeviceRobustness2FeaturesEXT, + vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT, + vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, + vk::PhysicalDevicePortabilitySubsetFeaturesKHR>(); features = feature_chain.get().features; #ifdef __APPLE__ portability_features = feature_chain.get(); @@ -319,6 +315,7 @@ bool Instance::CreateDevice() { const auto topology_list_restart_features = feature_chain.get(); + const auto vk11_features = feature_chain.get(); const auto vk12_features = feature_chain.get(); vk::StructureChain device_chain = { vk::DeviceCreateInfo{ @@ -351,12 +348,17 @@ bool Instance::CreateDevice() { }, }, vk::PhysicalDeviceVulkan11Features{ - .shaderDrawParameters = true, + .storageBuffer16BitAccess = vk11_features.storageBuffer16BitAccess, + .uniformAndStorageBuffer16BitAccess = vk11_features.uniformAndStorageBuffer16BitAccess, + .shaderDrawParameters = vk11_features.shaderDrawParameters, }, vk::PhysicalDeviceVulkan12Features{ .samplerMirrorClampToEdge = vk12_features.samplerMirrorClampToEdge, .drawIndirectCount = vk12_features.drawIndirectCount, + .storageBuffer8BitAccess = vk12_features.storageBuffer8BitAccess, + .uniformAndStorageBuffer8BitAccess = vk12_features.uniformAndStorageBuffer8BitAccess, .shaderFloat16 = vk12_features.shaderFloat16, + .shaderInt8 = vk12_features.shaderInt8, .scalarBlockLayout = vk12_features.scalarBlockLayout, .uniformBufferStandardLayout = vk12_features.uniformBufferStandardLayout, .separateDepthStencilLayouts = vk12_features.separateDepthStencilLayouts, diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index f7afd2e75..6ac7f7e43 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -345,12 +345,12 @@ bool PipelineCache::RefreshGraphicsKey() { key.color_formats[remapped_cb] = LiverpoolToVK::SurfaceFormat(col_buf.GetDataFmt(), col_buf.GetNumberFmt()); - key.color_buffers[remapped_cb] = { + key.color_buffers[remapped_cb] = Shader::PsColorBuffer{ .num_format = col_buf.GetNumberFmt(), .num_conversion = col_buf.GetNumberConversion(), - .swizzle = col_buf.Swizzle(), .export_format = regs.color_export_format.GetFormat(cb), .needs_unorm_fixup = needs_unorm_fixup, + .swizzle = col_buf.Swizzle(), }; } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index ac6aac7b3..816f149b0 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -19,6 +19,20 @@ namespace Vulkan { +static Shader::PushData MakeUserData(const AmdGpu::Liverpool::Regs& regs) { + Shader::PushData push_data{}; + push_data.step0 = regs.vgt_instance_step_rate_0; + push_data.step1 = regs.vgt_instance_step_rate_1; + + // TODO(roamic): Add support for multiple viewports and geometry shaders when ViewportIndex + // is encountered and implemented in the recompiler. + push_data.xoffset = regs.viewport_control.xoffset_enable ? regs.viewports[0].xoffset : 0.f; + push_data.xscale = regs.viewport_control.xscale_enable ? regs.viewports[0].xscale : 1.f; + push_data.yoffset = regs.viewport_control.yoffset_enable ? regs.viewports[0].yoffset : 0.f; + push_data.yscale = regs.viewport_control.yscale_enable ? regs.viewports[0].yscale : 1.f; + return push_data; +} + Rasterizer::Rasterizer(const Instance& instance_, Scheduler& scheduler_, AmdGpu::Liverpool* liverpool_) : instance{instance_}, scheduler{scheduler_}, page_manager{this}, @@ -426,95 +440,69 @@ void Rasterizer::Finish() { } bool Rasterizer::BindResources(const Pipeline* pipeline) { - buffer_infos.clear(); - buffer_views.clear(); - image_infos.clear(); - - const auto& regs = liverpool->regs; - - if (pipeline->IsCompute()) { - const auto& info = pipeline->GetStage(Shader::LogicalStage::Compute); - - // Assume if a shader reads and writes metas at the same time, it is a copy shader. - bool meta_read = false; - for (const auto& desc : info.buffers) { - if (desc.is_gds_buffer) { - continue; - } - if (!desc.is_written) { - const VAddr address = desc.GetSharp(info).base_address; - meta_read = texture_cache.IsMeta(address); - } - } - - // Most of the time when a metadata is updated with a shader it gets cleared. It means - // we can skip the whole dispatch and update the tracked state instead. Also, it is not - // intended to be consumed and in such rare cases (e.g. HTile introspection, CRAA) we - // will need its full emulation anyways. For cases of metadata read a warning will be - // logged. - if (!meta_read) { - for (const auto& desc : info.buffers) { - const auto sharp = desc.GetSharp(info); - const VAddr address = sharp.base_address; - if (desc.is_written) { - // Assume all slices were updates - if (texture_cache.ClearMeta(address)) { - LOG_TRACE(Render_Vulkan, "Metadata update skipped"); - return false; - } - } else { - if (texture_cache.IsMeta(address)) { - LOG_WARNING(Render_Vulkan, - "Unexpected metadata read by a CS shader (buffer)"); - } - } - } - } + if (IsComputeMetaClear(pipeline)) { + return false; } set_writes.clear(); buffer_barriers.clear(); + buffer_infos.clear(); + buffer_views.clear(); + image_infos.clear(); // Bind resource buffers and textures. - Shader::PushData push_data{}; Shader::Backend::Bindings binding{}; - + Shader::PushData push_data = MakeUserData(liverpool->regs); for (const auto* stage : pipeline->GetStages()) { if (!stage) { continue; } - push_data.step0 = regs.vgt_instance_step_rate_0; - push_data.step1 = regs.vgt_instance_step_rate_1; - - // TODO(roamic): add support for multiple viewports and geometry shaders when ViewportIndex - // is encountered and implemented in the recompiler. - if (stage->stage == Shader::Stage::Vertex) { - push_data.xoffset = - regs.viewport_control.xoffset_enable ? regs.viewports[0].xoffset : 0.f; - push_data.xscale = regs.viewport_control.xscale_enable ? regs.viewports[0].xscale : 1.f; - push_data.yoffset = - regs.viewport_control.yoffset_enable ? regs.viewports[0].yoffset : 0.f; - push_data.yscale = regs.viewport_control.yscale_enable ? regs.viewports[0].yscale : 1.f; - } stage->PushUd(binding, push_data); - - BindBuffers(*stage, binding, push_data, set_writes, buffer_barriers); - BindTextures(*stage, binding, set_writes); + BindBuffers(*stage, binding, push_data); + BindTextures(*stage, binding); } pipeline->BindResources(set_writes, buffer_barriers, push_data); - return true; } +bool Rasterizer::IsComputeMetaClear(const Pipeline* pipeline) { + if (!pipeline->IsCompute()) { + return false; + } + + const auto& info = pipeline->GetStage(Shader::LogicalStage::Compute); + + // Assume if a shader reads and writes metas at the same time, it is a copy shader. + for (const auto& desc : info.buffers) { + const VAddr address = desc.GetSharp(info).base_address; + if (!desc.IsSpecial() && !desc.is_written && texture_cache.IsMeta(address)) { + return false; + } + } + + // Most of the time when a metadata is updated with a shader it gets cleared. It means + // we can skip the whole dispatch and update the tracked state instead. Also, it is not + // intended to be consumed and in such rare cases (e.g. HTile introspection, CRAA) we + // will need its full emulation anyways. + for (const auto& desc : info.buffers) { + const VAddr address = desc.GetSharp(info).base_address; + if (!desc.IsSpecial() && desc.is_written && texture_cache.ClearMeta(address)) { + // Assume all slices were updates + LOG_TRACE(Render_Vulkan, "Metadata update skipped"); + return true; + } + } + return false; +} + void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Bindings& binding, - Shader::PushData& push_data, Pipeline::DescriptorWrites& set_writes, - Pipeline::BufferBarriers& buffer_barriers) { + Shader::PushData& push_data) { buffer_bindings.clear(); for (const auto& desc : stage.buffers) { const auto vsharp = desc.GetSharp(stage); - if (!desc.is_gds_buffer && vsharp.base_address != 0 && vsharp.GetSize() > 0) { + if (!desc.IsSpecial() && vsharp.base_address != 0 && vsharp.GetSize() > 0) { const auto buffer_id = buffer_cache.FindBuffer(vsharp.base_address, vsharp.GetSize()); buffer_bindings.emplace_back(buffer_id, vsharp); } else { @@ -522,47 +510,30 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } } - // Bind a SSBO to act as shared memory in case of not being able to use a workgroup buffer - // (e.g. when the compute shared memory is bigger than the GPU's shared memory) - if (stage.has_emulated_shared_memory) { - const auto* lds_buf = buffer_cache.GetLdsBuffer(); - buffer_infos.emplace_back(lds_buf->Handle(), 0, lds_buf->SizeBytes()); - set_writes.push_back({ - .dstSet = VK_NULL_HANDLE, - .dstBinding = binding.unified++, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = vk::DescriptorType::eStorageBuffer, - .pBufferInfo = &buffer_infos.back(), - }); - ++binding.buffer; - } - - // Bind the flattened user data buffer as a UBO so it's accessible to the shader - if (stage.has_readconst) { - const auto [vk_buffer, offset] = buffer_cache.ObtainHostUBO(stage.flattened_ud_buf); - buffer_infos.emplace_back(vk_buffer->Handle(), offset, - stage.flattened_ud_buf.size() * sizeof(u32)); - set_writes.push_back({ - .dstSet = VK_NULL_HANDLE, - .dstBinding = binding.unified++, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = vk::DescriptorType::eUniformBuffer, - .pBufferInfo = &buffer_infos.back(), - }); - ++binding.buffer; - } - // Second pass to re-bind buffers that were updated after binding for (u32 i = 0; i < buffer_bindings.size(); i++) { const auto& [buffer_id, vsharp] = buffer_bindings[i]; const auto& desc = stage.buffers[i]; const bool is_storage = desc.IsStorage(vsharp, pipeline_cache.GetProfile()); + // Buffer is not from the cache, either a special buffer or unbound. if (!buffer_id) { - if (desc.is_gds_buffer) { + if (desc.buffer_type == Shader::BufferType::GdsBuffer) { const auto* gds_buf = buffer_cache.GetGdsBuffer(); buffer_infos.emplace_back(gds_buf->Handle(), 0, gds_buf->SizeBytes()); + } else if (desc.buffer_type == Shader::BufferType::ReadConstUbo) { + auto& vk_buffer = buffer_cache.GetStreamBuffer(); + const u32 ubo_size = stage.flattened_ud_buf.size() * sizeof(u32); + const u64 offset = vk_buffer.Copy(stage.flattened_ud_buf.data(), ubo_size, + instance.UniformMinAlignment()); + buffer_infos.emplace_back(vk_buffer.Handle(), offset, ubo_size); + } else if (desc.buffer_type == Shader::BufferType::SharedMemory) { + auto& lds_buffer = buffer_cache.GetStreamBuffer(); + const auto& cs_program = liverpool->GetCsRegs(); + const auto lds_size = cs_program.SharedMemSize() * cs_program.NumWorkgroups(); + const auto [data, offset] = + lds_buffer.Map(lds_size, instance.StorageMinAlignment()); + std::memset(data, 0, lds_size); + buffer_infos.emplace_back(lds_buffer.Handle(), offset, lds_size); } else if (instance.IsNullDescriptorSupported()) { buffer_infos.emplace_back(VK_NULL_HANDLE, 0, VK_WHOLE_SIZE); } else { @@ -605,8 +576,7 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding } } -void Rasterizer::BindTextures(const Shader::Info& stage, Shader::Backend::Bindings& binding, - Pipeline::DescriptorWrites& set_writes) { +void Rasterizer::BindTextures(const Shader::Info& stage, Shader::Backend::Bindings& binding) { image_bindings.clear(); for (const auto& image_desc : stage.images) { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index db458662c..292944a10 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -81,11 +81,9 @@ private: bool FilterDraw(); void BindBuffers(const Shader::Info& stage, Shader::Backend::Bindings& binding, - Shader::PushData& push_data, Pipeline::DescriptorWrites& set_writes, - Pipeline::BufferBarriers& buffer_barriers); + Shader::PushData& push_data); - void BindTextures(const Shader::Info& stage, Shader::Backend::Bindings& binding, - Pipeline::DescriptorWrites& set_writes); + void BindTextures(const Shader::Info& stage, Shader::Backend::Bindings& binding); bool BindResources(const Pipeline* pipeline); void ResetBindings() { @@ -95,6 +93,8 @@ private: bound_images.clear(); } + bool IsComputeMetaClear(const Pipeline* pipeline); + private: const Instance& instance; Scheduler& scheduler; From bdf4a5249d1f0814b4c7f026cf18f15ff1435722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Sat, 15 Feb 2025 14:53:25 +0100 Subject: [PATCH 297/455] imgui: Displays FPS color based on FPS (#2437) --- src/common/config.cpp | 7 +++++++ src/common/config.h | 1 + src/core/devtools/layer.cpp | 12 ++++++++++++ 3 files changed, 20 insertions(+) diff --git a/src/common/config.cpp b/src/common/config.cpp index aae903da6..a42709b7a 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -68,6 +68,7 @@ static bool vkCrashDiagnostic = false; static bool vkHostMarkers = false; static bool vkGuestMarkers = false; static bool rdocEnable = false; +static bool isFpsColor = true; static s16 cursorState = HideCursorState::Idle; static int cursorHideTimeout = 5; // 5 seconds (default) static bool useUnifiedInputConfig = true; @@ -282,6 +283,10 @@ bool isRdocEnabled() { return rdocEnable; } +bool fpsColor() { + return isFpsColor; +} + u32 vblankDiv() { return vblankDivider; } @@ -757,6 +762,7 @@ void load(const std::filesystem::path& path) { isDebugDump = toml::find_or(debug, "DebugDump", false); isShaderDebug = toml::find_or(debug, "CollectShader", false); + isFpsColor = toml::find_or(debug, "FPSColor", true); } if (data.contains("GUI")) { @@ -881,6 +887,7 @@ void save(const std::filesystem::path& path) { data["Vulkan"]["rdocEnable"] = rdocEnable; data["Debug"]["DebugDump"] = isDebugDump; data["Debug"]["CollectShader"] = isShaderDebug; + data["Debug"]["FPSColor"] = isFpsColor; data["Keys"]["TrophyKey"] = trophyKey; diff --git a/src/common/config.h b/src/common/config.h index dfb1d9fad..7b9bc789b 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -67,6 +67,7 @@ bool copyGPUCmdBuffers(); bool dumpShaders(); bool patchShaders(); bool isRdocEnabled(); +bool fpsColor(); u32 vblankDiv(); void setDebugDump(bool enable); diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index a6d99b49b..603d76df5 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -259,7 +259,19 @@ void L::DrawAdvanced() { void L::DrawSimple() { const float frameRate = DebugState.Framerate; + if (Config::fpsColor()) { + if (frameRate < 10) { + PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.0f, 0.0f, 1.0f)); // Red + } else if (frameRate >= 10 && frameRate < 20) { + PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.5f, 0.0f, 1.0f)); // Orange + } else { + PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); // White + } + } else { + PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); // White + } Text("%d FPS (%.1f ms)", static_cast(std::round(frameRate)), 1000.0f / frameRate); + PopStyleColor(); } static void LoadSettings(const char* line) { From 2b9a8e5605eae426d34336aa95ddbb475889c9be Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Sun, 16 Feb 2025 00:19:04 +0800 Subject: [PATCH 298/455] add lightbar color override to Controller GUI (#2443) * WIP Lightbar GUI, needs saving and loading * Implement saving and loading lightbar values * replace license header deleted by QT --- src/qt_gui/control_settings.cpp | 93 +- src/qt_gui/control_settings.h | 1 + src/qt_gui/control_settings.ui | 2450 ++++++++++++++++--------------- 3 files changed, 1375 insertions(+), 1169 deletions(-) diff --git a/src/qt_gui/control_settings.cpp b/src/qt_gui/control_settings.cpp index 644576feb..73622e6b0 100644 --- a/src/qt_gui/control_settings.cpp +++ b/src/qt_gui/control_settings.cpp @@ -3,9 +3,9 @@ #include #include +#include #include "common/path_util.h" #include "control_settings.h" -#include "kbm_config_dialog.h" #include "ui_control_settings.h" ControlSettings::ControlSettings(std::shared_ptr game_info_get, QWidget* parent) @@ -16,7 +16,7 @@ ControlSettings::ControlSettings(std::shared_ptr game_info_get, Q AddBoxItems(); SetUIValuestoMappings(); - ui->KBMButton->setFocus(); + UpdateLightbarColor(); connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton* button) { if (button == ui->buttonBox->button(QDialogButtonBox::Save)) { @@ -29,11 +29,7 @@ ControlSettings::ControlSettings(std::shared_ptr game_info_get, Q }); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close); - connect(ui->KBMButton, &QPushButton::clicked, this, [this] { - auto KBMWindow = new EditorDialog(this); - KBMWindow->exec(); - SetUIValuestoMappings(); - }); + connect(ui->ProfileComboBox, &QComboBox::currentTextChanged, this, [this] { GetGameTitle(); SetUIValuestoMappings(); @@ -61,6 +57,27 @@ ControlSettings::ControlSettings(std::shared_ptr game_info_get, Q [this](int value) { ui->RStickLeftBox->setCurrentIndex(value); }); connect(ui->RStickLeftBox, &QComboBox::currentIndexChanged, this, [this](int value) { ui->RStickRightBox->setCurrentIndex(value); }); + + connect(ui->RSlider, &QSlider::valueChanged, this, [this](int value) { + QString RedValue = QString("%1").arg(value, 3, 10, QChar('0')); + QString RValue = "R: " + RedValue; + ui->RLabel->setText(RValue); + UpdateLightbarColor(); + }); + + connect(ui->GSlider, &QSlider::valueChanged, this, [this](int value) { + QString GreenValue = QString("%1").arg(value, 3, 10, QChar('0')); + QString GValue = "G: " + GreenValue; + ui->GLabel->setText(GValue); + UpdateLightbarColor(); + }); + + connect(ui->BSlider, &QSlider::valueChanged, this, [this](int value) { + QString BlueValue = QString("%1").arg(value, 3, 10, QChar('0')); + QString BValue = "B: " + BlueValue; + ui->BLabel->setText(BValue); + UpdateLightbarColor(); + }); } void ControlSettings::SaveControllerConfig(bool CloseOnSave) { @@ -121,7 +138,7 @@ void ControlSettings::SaveControllerConfig(bool CloseOnSave) { if (std::find(ControllerInputs.begin(), ControllerInputs.end(), input_string) != ControllerInputs.end() || - output_string == "analog_deadzone") { + output_string == "analog_deadzone" || output_string == "override_controller_color") { line.erase(); continue; } @@ -227,6 +244,14 @@ void ControlSettings::SaveControllerConfig(bool CloseOnSave) { deadzonevalue = std::to_string(ui->RightDeadzoneSlider->value()); lines.push_back("analog_deadzone = rightjoystick, " + deadzonevalue + ", 127"); + lines.push_back(""); + std::string OverrideLB = ui->LightbarCheckBox->isChecked() ? "true" : "false"; + std::string LightBarR = std::to_string(ui->RSlider->value()); + std::string LightBarG = std::to_string(ui->GSlider->value()); + std::string LightBarB = std::to_string(ui->BSlider->value()); + lines.push_back("override_controller_color = " + OverrideLB + ", " + LightBarR + ", " + + LightBarG + ", " + LightBarB); + std::vector save; bool CurrentLineEmpty = false, LastLineEmpty = false; for (auto const& line : lines) { @@ -243,6 +268,9 @@ void ControlSettings::SaveControllerConfig(bool CloseOnSave) { output_file.close(); Config::SetUseUnifiedInputConfig(!ui->PerGameCheckBox->isChecked()); + Config::SetOverrideControllerColor(ui->LightbarCheckBox->isChecked()); + Config::SetControllerCustomColor(ui->RSlider->value(), ui->GSlider->value(), + ui->BSlider->value()); Config::save(Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "config.toml"); if (CloseOnSave) @@ -351,7 +379,7 @@ void ControlSettings::SetUIValuestoMappings() { if (std::find(ControllerInputs.begin(), ControllerInputs.end(), input_string) != ControllerInputs.end() || - output_string == "analog_deadzone") { + output_string == "analog_deadzone" || output_string == "override_controller_color") { if (input_string == "cross") { ui->ABox->setCurrentText(QString::fromStdString(output_string)); CrossExists = true; @@ -436,9 +464,45 @@ void ControlSettings::SetUIValuestoMappings() { ui->RightDeadzoneSlider->setValue(2); ui->RightDeadzoneValue->setText("2"); } + } else if (output_string == "override_controller_color") { + std::size_t comma_pos = line.find(','); + if (comma_pos != std::string::npos) { + std::string overridestring = line.substr(equal_pos + 1, comma_pos); + bool override = overridestring.contains("true") ? true : false; + ui->LightbarCheckBox->setChecked(override); + + std::string lightbarstring = line.substr(comma_pos + 1); + std::size_t comma_pos2 = lightbarstring.find(','); + if (comma_pos2 != std::string::npos) { + std::string Rstring = lightbarstring.substr(0, comma_pos2); + ui->RSlider->setValue(std::stoi(Rstring)); + QString RedValue = QString("%1").arg(std::stoi(Rstring), 3, 10, QChar('0')); + QString RValue = "R: " + RedValue; + ui->RLabel->setText(RValue); + } + + std::string GBstring = lightbarstring.substr(comma_pos2 + 1); + std::size_t comma_pos3 = GBstring.find(','); + if (comma_pos3 != std::string::npos) { + std::string Gstring = GBstring.substr(0, comma_pos3); + ui->GSlider->setValue(std::stoi(Gstring)); + QString GreenValue = + QString("%1").arg(std::stoi(Gstring), 3, 10, QChar('0')); + QString GValue = "G: " + GreenValue; + ui->GLabel->setText(GValue); + + std::string Bstring = GBstring.substr(comma_pos3 + 1); + ui->BSlider->setValue(std::stoi(Bstring)); + QString BlueValue = + QString("%1").arg(std::stoi(Bstring), 3, 10, QChar('0')); + QString BValue = "B: " + BlueValue; + ui->BLabel->setText(BValue); + } + } } } } + file.close(); // If an entry does not exist in the config file, we assume the user wants it unmapped if (!CrossExists) @@ -490,8 +554,6 @@ void ControlSettings::SetUIValuestoMappings() { ui->RStickUpBox->setCurrentText("unmapped"); ui->RStickDownBox->setCurrentText("unmapped"); } - - file.close(); } void ControlSettings::GetGameTitle() { @@ -507,4 +569,13 @@ void ControlSettings::GetGameTitle() { } } +void ControlSettings::UpdateLightbarColor() { + ui->LightbarColorFrame->setStyleSheet(""); + QString RValue = QString::number(ui->RSlider->value()); + QString GValue = QString::number(ui->GSlider->value()); + QString BValue = QString::number(ui->BSlider->value()); + QString colorstring = "background-color: rgb(" + RValue + "," + GValue + "," + BValue + ")"; + ui->LightbarColorFrame->setStyleSheet(colorstring); +} + ControlSettings::~ControlSettings() {} diff --git a/src/qt_gui/control_settings.h b/src/qt_gui/control_settings.h index 04227f3a8..e686f044d 100644 --- a/src/qt_gui/control_settings.h +++ b/src/qt_gui/control_settings.h @@ -18,6 +18,7 @@ public: private Q_SLOTS: void SaveControllerConfig(bool CloseOnSave); void SetDefault(); + void UpdateLightbarColor(); private: std::unique_ptr ui; diff --git a/src/qt_gui/control_settings.ui b/src/qt_gui/control_settings.ui index b6acb5ca9..e88e239e9 100644 --- a/src/qt_gui/control_settings.ui +++ b/src/qt_gui/control_settings.ui @@ -11,8 +11,8 @@ 0 0 - 1012 - 721 + 1043 + 792 @@ -25,760 +25,681 @@ - - QFrame::Shape::NoFrame - - - 0 - true - + 0 0 - 994 - 673 + 1019 + 732 - - - Control Settings - - - - 5 - - - 5 - - - 5 - - - 5 - + + + + 0 + 0 + 1021 + 731 + + + - + + + 5 + - - - 5 + + + true - - - - true - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - D-Pad - - - - 6 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - 0 + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + D-Pad + + + + 6 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + 0 + 16777215 + + + + Up + + + + + + false + + + QComboBox::SizeAdjustPolicy::AdjustToContents + + + + + + + + + + + + + + + Left + + - 0 + 5 - 0 + 5 - 0 + 5 - 0 + 5 - - - - 124 - 0 - - - - - 0 - 16777215 - - - - Up - - - - - - false - - - QComboBox::SizeAdjustPolicy::AdjustToContents - - - - - + - - - - - Left - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - - - - Right - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - false - - - - - - - - - - - + + + Right + + - 0 + 5 - 0 + 5 - 0 + 5 - 0 + 5 - - - - 124 - 16777215 - + + + false - - Down - - - - - - true - - - - 0 - 0 - - - - - 0 - 0 - - - - - - - - - - - Qt::Orientation::Vertical - - - QSizePolicy::Policy::Maximum - - - - 20 - 40 - - - - - - - - - 0 - 0 - - - - Left Stick Deadzone (def:2 max:127) - - - - - - - 0 - 0 - - - - Left Deadzone - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - 1 - - - 127 - - - Qt::Orientation::Horizontal - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Left Stick - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - 16777215 - 2121 - - - - - 0 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 16777215 + - - 0 + + Down - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 124 - 16777215 - - - - Up - - - - - - true - - - - - - - - - - - - - - - Left - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - true - - - - - - - - - - - 179 - 16777215 - - - - Right - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - true - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 124 - 0 - - - - - 124 - 21212 - - - - Down - - - - - - true - - - false - - - false - - - - - - - - - - - - - + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + + + + - - - 0 + + + Qt::Orientation::Vertical - - - - - 0 - 0 - - - - - 12 - true - - - - Config Selection - - - Qt::AlignmentFlag::AlignCenter - - + + QSizePolicy::Policy::Maximum + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Left Stick Deadzone (def:2 max:127) + + + + + + + 0 + 0 + + + + Left Deadzone + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + + 0 + 0 + + + + 1 + + + 127 + + + Qt::Orientation::Horizontal + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Left Stick + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 16777215 + 2121 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 124 + 16777215 + + + + Up + + + + + + true + + + + + + + + + + + - - - - - - 9 - false - - - - - - - -1 - - - Common Config - - - - - - - - 10 - true - - - - Common Config - - - Qt::AlignmentFlag::AlignCenter - - - true - - - - + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + true + + + + + - - - - 0 - 0 - + + + + 179 + 16777215 + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + true + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + + 124 + 21212 + + + + Down + + + + + + true + + + false + + + false + + + + + + + + + + + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 12 + true + + + + Config Selection + + + Qt::AlignmentFlag::AlignCenter + + + + + + 9 false + + + + + -1 + + + Common Config + + + + + + + + 10 + true + + - Use per-game configs + Common Config + + + Qt::AlignmentFlag::AlignCenter + + + true - + + + + + + 0 + 0 + + + + + 9 + false + + + + Use per-game configs + + + + + + + + + + 0 + + + + + + + L1 / LB + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + L2 / LT + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + - - - 0 - + - - - - - L1 / LB - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - - - - L2 / LT - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Preferred + + + + 20 + 40 + + + - + + + 10 + - - - 10 - - - - - - true - - - - KBM Controls - - - - - - - true - - - - KBM Editor - - - - - - - - - - Back - - - - - - - - - - - - - - - - + - R1 / RB + Back - - - 5 - - - 5 - - - 5 - - - 5 - + - - - - - - - - - R2 / RT - - - - 5 - - - 5 - - - 5 - - - 5 - - - + @@ -788,62 +709,13 @@ - - - - 0 - 200 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 415 - 256 - - - - :/images/ps4_controller.png - - - true - - - Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter - - - - - - - - - - 10 - - - QLayout::SizeConstraint::SetDefaultConstraint - + - + - L3 + R1 / RB - + 5 @@ -857,17 +729,17 @@ 5 - + - + - Options / Start + R2 / RT - + 5 @@ -881,31 +753,7 @@ 5 - - - - - - - - - R3 - - - - 5 - - - 5 - - - 5 - - - 5 - - - + @@ -915,22 +763,62 @@ - + + + + 0 + 200 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 415 + 256 + + + + :/images/ps4_controller.png + + + true + + + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter + + + + + + + + - 5 + 10 + + + QLayout::SizeConstraint::SetDefaultConstraint - - - - 0 - 0 - - + - Face Buttons + L3 - + 5 @@ -944,244 +832,17 @@ 5 - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 124 - 0 - - - - - 0 - 16777215 - - - - Triangle / Y - - - - - - true - - - - 0 - 0 - - - - - - - - - - - - - - - - Square / X - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - - - - Circle / B - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 124 - 0 - - - - - 124 - 16777215 - - - - Cross / A - - - - - - - - - - + - - - Qt::Orientation::Vertical - - - QSizePolicy::Policy::Maximum - - - - 20 - 40 - - - - - - - - - 0 - 0 - - + - Right Stick Deadzone (def:2, max:127) + Options / Start - - - - - - 0 - 0 - - - - Right Deadzone - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 0 - 0 - - - - 1 - - - 127 - - - Qt::Orientation::Horizontal - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Right Stick - - + 5 @@ -1195,164 +856,637 @@ 5 - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 124 - 1231321 - - - - Up - - - - - - true - - - - - - - - + + + + + + + + R3 + + + + 5 + + + 5 + + + 5 + + + 5 + - - - - - Left - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - true - - - - - - - - - - Right - - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 124 - 0 - - - - - 124 - 2121 - - - - Down - - - - - - true - - - - - - - - + + + + + + + + + + false + + + + Color Adjustment + + + + + + + + + false + + + + R: 000 + + + + + + + + 0 + 0 + + + + 255 + + + Qt::Orientation::Horizontal + + + + + + + + + + + + false + + + + G: 000 + + + + + + + + 0 + 0 + + + + 255 + + + Qt::Orientation::Horizontal + + + + + + + + + + + + false + + + + B: 255 + + + + + + + + 0 + 0 + + + + 255 + + + 255 + + + Qt::Orientation::Horizontal + + + + + + + + + + + + + + + + + false + + + + Override Lightbar Color + + + + + + + false + + + + Override Color + + + + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + + + + + + + + + + + + + 5 + + + + + + 0 + 0 + + + + Face Buttons + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 124 + 0 + + + + + 0 + 16777215 + + + + Triangle / Y + + + + + + true + + + + 0 + 0 + + + + + + + + + + + + + + + + Square / X + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + Circle / B + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + + 124 + 16777215 + + + + Cross / A + + + + + + + + + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Maximum + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Right Stick Deadzone (def:2, max:127) + + + + + + + 0 + 0 + + + + Right Deadzone + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + + 0 + 0 + + + + 1 + + + 127 + + + Qt::Orientation::Horizontal + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Right Stick + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 124 + 1231321 + + + + Up + + + + + + true + + + + + + + + + + + + + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + true + + + + + + + + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 124 + 0 + + + + + 124 + 2121 + + + + Down + + + + + + true + + + + + + + + + + + + From e042710eaad0c89beb3610cc4ce65cfc15e3b0b5 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sat, 15 Feb 2025 13:19:33 -0300 Subject: [PATCH 299/455] Background image sized correctly (#2451) --- src/qt_gui/game_grid_frame.cpp | 18 ++++++++++++++++-- src/qt_gui/game_grid_frame.h | 2 ++ src/qt_gui/game_list_frame.cpp | 18 ++++++++++++++++-- src/qt_gui/game_list_frame.h | 1 + 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/qt_gui/game_grid_frame.cpp b/src/qt_gui/game_grid_frame.cpp index 6a42fb1d6..e06fea090 100644 --- a/src/qt_gui/game_grid_frame.cpp +++ b/src/qt_gui/game_grid_frame.cpp @@ -196,14 +196,28 @@ void GameGridFrame::SetGridBackgroundImage(int row, int column) { void GameGridFrame::RefreshGridBackgroundImage() { QPalette palette; if (!backgroundImage.isNull() && Config::getShowBackgroundImage()) { - palette.setBrush(QPalette::Base, - QBrush(backgroundImage.scaled(size(), Qt::IgnoreAspectRatio))); + QSize widgetSize = size(); + QPixmap scaledPixmap = + QPixmap::fromImage(backgroundImage) + .scaled(widgetSize, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation); + int x = (widgetSize.width() - scaledPixmap.width()) / 2; + int y = (widgetSize.height() - scaledPixmap.height()) / 2; + QPixmap finalPixmap(widgetSize); + finalPixmap.fill(Qt::transparent); + QPainter painter(&finalPixmap); + painter.drawPixmap(x, y, scaledPixmap); + palette.setBrush(QPalette::Base, QBrush(finalPixmap)); } QColor transparentColor = QColor(135, 206, 235, 40); palette.setColor(QPalette::Highlight, transparentColor); this->setPalette(palette); } +void GameGridFrame::resizeEvent(QResizeEvent* event) { + QTableWidget::resizeEvent(event); + RefreshGridBackgroundImage(); +} + bool GameGridFrame::IsValidCellSelected() { return validCellSelected; } diff --git a/src/qt_gui/game_grid_frame.h b/src/qt_gui/game_grid_frame.h index 370b71dcb..14596f8e1 100644 --- a/src/qt_gui/game_grid_frame.h +++ b/src/qt_gui/game_grid_frame.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include "background_music_player.h" @@ -21,6 +22,7 @@ Q_SIGNALS: public Q_SLOTS: void SetGridBackgroundImage(int row, int column); void RefreshGridBackgroundImage(); + void resizeEvent(QResizeEvent* event); void PlayBackgroundMusic(QString path); void onCurrentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn); diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index 2caae35b0..4c0607571 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -200,14 +200,28 @@ void GameListFrame::SetListBackgroundImage(QTableWidgetItem* item) { void GameListFrame::RefreshListBackgroundImage() { QPalette palette; if (!backgroundImage.isNull() && Config::getShowBackgroundImage()) { - palette.setBrush(QPalette::Base, - QBrush(backgroundImage.scaled(size(), Qt::IgnoreAspectRatio))); + QSize widgetSize = size(); + QPixmap scaledPixmap = + QPixmap::fromImage(backgroundImage) + .scaled(widgetSize, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation); + int x = (widgetSize.width() - scaledPixmap.width()) / 2; + int y = (widgetSize.height() - scaledPixmap.height()) / 2; + QPixmap finalPixmap(widgetSize); + finalPixmap.fill(Qt::transparent); + QPainter painter(&finalPixmap); + painter.drawPixmap(x, y, scaledPixmap); + palette.setBrush(QPalette::Base, QBrush(finalPixmap)); } QColor transparentColor = QColor(135, 206, 235, 40); palette.setColor(QPalette::Highlight, transparentColor); this->setPalette(palette); } +void GameListFrame::resizeEvent(QResizeEvent* event) { + QTableWidget::resizeEvent(event); + RefreshListBackgroundImage(); +} + void GameListFrame::SortNameAscending(int columnIndex) { std::sort(m_game_info->m_games.begin(), m_game_info->m_games.end(), [columnIndex](const GameInfo& a, const GameInfo& b) { diff --git a/src/qt_gui/game_list_frame.h b/src/qt_gui/game_list_frame.h index b2e5f1e2f..782db6bae 100644 --- a/src/qt_gui/game_list_frame.h +++ b/src/qt_gui/game_list_frame.h @@ -30,6 +30,7 @@ Q_SIGNALS: public Q_SLOTS: void SetListBackgroundImage(QTableWidgetItem* item); void RefreshListBackgroundImage(); + void resizeEvent(QResizeEvent* event); void SortNameAscending(int columnIndex); void SortNameDescending(int columnIndex); void PlayBackgroundMusic(QTableWidgetItem* item); From b0169de7c4ba2e47d4a0044fd940308f70ae8450 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sat, 15 Feb 2025 16:40:24 -0300 Subject: [PATCH 300/455] added language pt_PT (#2452) --- src/common/config.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index a42709b7a..4383b64b5 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -813,8 +813,8 @@ void load(const std::filesystem::path& path) { // Check if the loaded language is in the allowed list const std::vector allowed_languages = { "ar_SA", "da_DK", "de_DE", "el_GR", "en_US", "es_ES", "fa_IR", "fi_FI", "fr_FR", "hu_HU", - "id_ID", "it_IT", "ja_JP", "ko_KR", "lt_LT", "nl_NL", "no_NO", "pl_PL", "pt_BR", "ro_RO", - "ru_RU", "sq_AL", "sv_SE", "tr_TR", "uk_UA", "vi_VN", "zh_CN", "zh_TW"}; + "id_ID", "it_IT", "ja_JP", "ko_KR", "lt_LT", "nl_NL", "no_NO", "pl_PL", "pt_BR", "pt_PT", + "ro_RO", "ru_RU", "sq_AL", "sv_SE", "tr_TR", "uk_UA", "vi_VN", "zh_CN", "zh_TW"}; if (std::find(allowed_languages.begin(), allowed_languages.end(), emulator_language) == allowed_languages.end()) { From 7af9de353b1e2147442e2834165d258383fb134b Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 16 Feb 2025 09:40:28 +0200 Subject: [PATCH 301/455] New Crowdin updates (#2440) * New translations en_us.ts (Russian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Japanese) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Turkish) * New translations en_us.ts (Norwegian Bokmal) --- src/qt_gui/translations/ja_JP.ts | 108 +- src/qt_gui/translations/nb_NO.ts | 1790 ++++++++++++++++++++++++++++++ src/qt_gui/translations/pt_BR.ts | 14 +- src/qt_gui/translations/pt_PT.ts | 1790 ++++++++++++++++++++++++++++++ src/qt_gui/translations/ru_RU.ts | 8 +- src/qt_gui/translations/tr_TR.ts | 52 +- src/qt_gui/translations/zh_CN.ts | 6 +- 7 files changed, 3674 insertions(+), 94 deletions(-) create mode 100644 src/qt_gui/translations/nb_NO.ts create mode 100644 src/qt_gui/translations/pt_PT.ts diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index fd1de8f78..502070bb5 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -411,35 +411,35 @@ ControlSettings Configure Controls - Configure Controls + コントロール設定 Control Settings - Control Settings + 操作設定 D-Pad - D-Pad + 十字キー Up - Up + Left - Left + Right - Right + Down - Down + Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + 左スティックデッドゾーン(既定:2 最大:127) Left Deadzone @@ -447,7 +447,7 @@ Left Stick - Left Stick + 左スティック Config Selection @@ -463,11 +463,11 @@ L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls @@ -483,23 +483,23 @@ R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons @@ -507,23 +507,23 @@ Triangle / Y - Triangle / Y + 三角 / Y Square / X - Square / X + 四角 / X Circle / B - Circle / B + 丸 / B Cross / A - Cross / A + バツ / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + 右スティックデッドゾーン(既定:2, 最大:127) Right Deadzone @@ -531,7 +531,7 @@ Right Stick - Right Stick + 右スティック @@ -576,7 +576,7 @@ Directory to install DLC - Directory to install DLC + DLCをインストールするディレクトリ @@ -595,7 +595,7 @@ Compatibility - Compatibility + 互換性 Region @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -741,11 +741,11 @@ Copy Version - Copy Version + バージョンをコピー Copy Size - Copy Size + サイズをコピー Copy All @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -833,23 +833,23 @@ Open Update Folder - Open Update Folder + アップデートフォルダを開く Delete Save Data - Delete Save Data + セーブデータを削除 This game has no update folder to open! - This game has no update folder to open! + このゲームにはアップデートフォルダがありません! Failed to convert icon. - Failed to convert icon. + アイコンの変換に失敗しました。 This game has no save data to delete! - This game has no save data to delete! + このゲームには削除するセーブデータがありません! Save Data @@ -872,7 +872,7 @@ Delete PKG File on Install - Delete PKG File on Install + インストール時にPKGファイルを削除 @@ -1151,15 +1151,15 @@ Run Game - Run Game + ゲームを実行 Eboot.bin file not found - Eboot.bin file not found + Eboot.bin ファイルが見つかりません PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + PKGファイル (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! @@ -1167,11 +1167,11 @@ Game is already running! - Game is already running! + ゲームは既に実行されています! shadPS4 - shadPS4 + shadPS4 @@ -1238,7 +1238,7 @@ Package - Package + パッケージ @@ -1393,7 +1393,7 @@ Enable HDR - Enable HDR + HDRを有効化 Paths @@ -1493,7 +1493,7 @@ Opacity - Opacity + 透明度 Play title music @@ -1729,7 +1729,7 @@ Borderless - Borderless + ボーダーレス True @@ -1737,19 +1737,19 @@ Release - Release + Release Nightly - Nightly + Nightly Set the volume of the background music. - Set the volume of the background music. + バックグラウンドミュージックの音量を設定します。 Enable Motion Controls - Enable Motion Controls + モーションコントロールを有効にする Save Data Path @@ -1761,11 +1761,11 @@ async - async + 非同期 sync - sync + 同期 Auto Select diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts new file mode 100644 index 000000000..934612683 --- /dev/null +++ b/src/qt_gui/translations/nb_NO.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + Om shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Denne programvaren skal ikke brukes til å spille spill du ikke har fått lovlig. + + + + CheatsPatches + + Cheats / Patches for + Juks / Programrettelser for + + + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\n + + + No Image Available + Ingen bilde tilgjengelig + + + Serial: + Serienummer: + + + Version: + Versjon: + + + Size: + Størrelse: + + + Select Cheat File: + Velg juksefil: + + + Repository: + Pakkebrønn: + + + Download Cheats + Last ned juks + + + Delete File + Slett fil + + + No files selected. + Ingen filer valgt. + + + You can delete the cheats you don't want after downloading them. + Du kan slette juks du ikke ønsker etter å ha lastet dem ned. + + + Do you want to delete the selected file?\n%1 + Ønsker du å slette den valgte filen?\n%1 + + + Select Patch File: + Velg programrettelse-filen: + + + Download Patches + Last ned programrettelser + + + Save + Lagre + + + Cheats + Juks + + + Patches + Programrettelse + + + Error + Feil + + + No patch selected. + Ingen programrettelse valgt. + + + Unable to open files.json for reading. + Kan ikke åpne files.json for lesing. + + + No patch file found for the current serial. + Ingen programrettelse-fil funnet for det aktuelle serienummeret. + + + Unable to open the file for reading. + Kan ikke åpne filen for lesing. + + + Unable to open the file for writing. + Kan ikke åpne filen for skriving. + + + Failed to parse XML: + Feil ved tolkning av XML: + + + Success + Vellykket + + + Options saved successfully. + Alternativer ble lagret. + + + Invalid Source + Ugyldig kilde + + + The selected source is invalid. + Den valgte kilden er ugyldig. + + + File Exists + Filen eksisterer + + + File already exists. Do you want to replace it? + Filen eksisterer allerede. Ønsker du å erstatte den? + + + Failed to save file: + Kunne ikke lagre filen: + + + Failed to download file: + Kunne ikke laste ned filen: + + + Cheats Not Found + Fant ikke juks + + + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. + + + Cheats Downloaded Successfully + Juks ble lastet ned + + + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. + + + Failed to save: + Kunne ikke lagre: + + + Failed to download: + Kunne ikke laste ned: + + + Download Complete + Nedlasting fullført + + + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. + + + Failed to parse JSON data from HTML. + Kunne ikke analysere JSON-data fra HTML. + + + Failed to retrieve HTML page. + Kunne ikke hente HTML-side. + + + The game is in version: %1 + Spillet er i versjon: %1 + + + The downloaded patch only works on version: %1 + Den nedlastede programrettelsen fungerer bare på versjon: %1 + + + You may need to update your game. + Du må kanskje oppdatere spillet ditt. + + + Incompatibility Notice + Inkompatibilitets-varsel + + + Failed to open file: + Kunne ikke åpne filen: + + + XML ERROR: + XML FEIL: + + + Failed to open files.json for writing + Kunne ikke åpne files.json for skriving + + + Author: + Forfatter: + + + Directory does not exist: + Mappen eksisterer ikke: + + + Failed to open files.json for reading. + Kunne ikke åpne files.json for lesing. + + + Name: + Navn: + + + Can't apply cheats before the game is started + Kan ikke bruke juks før spillet er startet. + + + Close + Lukk + + + + CheckUpdate + + Auto Updater + Automatisk oppdatering + + + Error + Feil + + + Network error: + Nettverksfeil: + + + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. + Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. + + + Failed to parse update information. + Kunne ikke analysere oppdaterings-informasjonen. + + + No pre-releases found. + Fant ingen forhåndsutgivelser. + + + Invalid release data. + Ugyldige utgivelsesdata. + + + No download URL found for the specified asset. + Ingen nedlastings-URL funnet for den spesifiserte ressursen. + + + Your version is already up to date! + Din versjon er allerede oppdatert! + + + Update Available + Oppdatering tilgjengelig + + + Update Channel + Oppdateringskanal + + + Current Version + Gjeldende versjon + + + Latest Version + Nyeste versjon + + + Do you want to update? + Vil du oppdatere? + + + Show Changelog + Vis endringslogg + + + Check for Updates at Startup + Se etter oppdateringer ved oppstart + + + Update + Oppdater + + + No + Nei + + + Hide Changelog + Skjul endringslogg + + + Changes + Endringer + + + Network error occurred while trying to access the URL + Nettverksfeil oppstod mens vi prøvde å få tilgang til URL + + + Download Complete + Nedlasting fullført + + + The update has been downloaded, press OK to install. + Oppdateringen har blitt lastet ned, trykk OK for å installere. + + + Failed to save the update file at + Kunne ikke lagre oppdateringsfilen på + + + Starting Update... + Starter oppdatering... + + + Failed to create the update script file + Kunne ikke opprette oppdateringsskriptfilen + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Henter kompatibilitetsdata, vennligst vent + + + Cancel + Avbryt + + + Loading... + Laster... + + + Error + Feil + + + Unable to update compatibility data! Try again later. + Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. + + + Unable to open compatibility_data.json for writing. + Kan ikke åpne compatibility_data.json for skriving. + + + Unknown + Ukjent + + + Nothing + Ingenting + + + Boots + Starter opp + + + Menus + Menyene + + + Ingame + I spill + + + Playable + Spillbar + + + + ControlSettings + + Configure Controls + Configure Controls + + + Control Settings + Control Settings + + + D-Pad + D-Pad + + + Up + Up + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) + + + Left Deadzone + Left Deadzone + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + L1 / LB + L1 / LB + + + L2 / LT + L2 / LT + + + KBM Controls + KBM Controls + + + KBM Editor + KBM Editor + + + Back + Back + + + R1 / RB + R1 / RB + + + R2 / RT + R2 / RT + + + L3 + L3 + + + Options / Start + Options / Start + + + R3 + R3 + + + Face Buttons + Face Buttons + + + Triangle / Y + Triangle / Y + + + Square / X + Square / X + + + Circle / B + Circle / B + + + Cross / A + Cross / A + + + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) + + + Right Deadzone + Right Deadzone + + + Right Stick + Right Stick + + + + ElfViewer + + Open Folder + Åpne mappe + + + + GameInfoClass + + Loading game list, please wait :3 + Laster spill-liste, vennligst vent :3 + + + Cancel + Avbryt + + + Loading... + Laster... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Velg mappe + + + Directory to install games + Mappe for å installere spill + + + Browse + Bla gjennom + + + Error + Feil + + + Directory to install DLC + Directory to install DLC + + + + GameListFrame + + Icon + Ikon + + + Name + Navn + + + Serial + Serienummer + + + Compatibility + Kompatibilitet + + + Region + Region + + + Firmware + Fastvare + + + Size + Størrelse + + + Version + Versjon + + + Path + Adresse + + + Play Time + Spilletid + + + Never Played + Aldri spilt + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + kompatibilitet er utestet + + + Game does not initialize properly / crashes the emulator + Spillet initialiseres ikke riktig / krasjer emulatoren + + + Game boots, but only displays a blank screen + Spillet starter, men viser bare en tom skjerm + + + Game displays an image but does not go past the menu + Spillet viser et bilde, men går ikke forbi menyen + + + Game has game-breaking glitches or unplayable performance + Spillet har spillbrytende feil eller uspillbar ytelse + + + Game can be completed with playable performance and no major glitches + Spillet kan fullføres med spillbar ytelse og uten store feil + + + Click to see details on github + Klikk for å se detaljer på GitHub + + + Last updated + Sist oppdatert + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Lag snarvei + + + Cheats / Patches + Juks / Programrettelse + + + SFO Viewer + SFO viser + + + Trophy Viewer + Trofé viser + + + Open Folder... + Åpne mappe... + + + Open Game Folder + Åpne spillmappen + + + Open Save Data Folder + Åpne lagrede datamappen + + + Open Log Folder + Åpne loggmappen + + + Copy info... + Kopier info... + + + Copy Name + Kopier navn + + + Copy Serial + Kopier serienummer + + + Copy Version + Kopier versjon + + + Copy Size + Kopier størrelse + + + Copy All + Kopier alt + + + Delete... + Slett... + + + Delete Game + Slett spill + + + Delete Update + Slett oppdatering + + + Delete DLC + Slett DLC + + + Compatibility... + Kompatibilitet... + + + Update database + Oppdater database + + + View report + Vis rapport + + + Submit a report + Send inn en rapport + + + Shortcut creation + Snarvei opprettelse + + + Shortcut created successfully! + Snarvei opprettet! + + + Error + Feil + + + Error creating shortcut! + Feil ved opprettelse av snarvei! + + + Install PKG + Installer PKG + + + Game + Spill + + + This game has no update to delete! + Dette spillet har ingen oppdatering å slette! + + + Update + Oppdater + + + This game has no DLC to delete! + Dette spillet har ingen DLC å slette! + + + DLC + DLC + + + Delete %1 + Slett %1 + + + Are you sure you want to delete %1's %2 directory? + Er du sikker på at du vil slette %1's %2 directory? + + + Open Update Folder + Open Update Folder + + + Delete Save Data + Delete Save Data + + + This game has no update folder to open! + This game has no update folder to open! + + + Failed to convert icon. + Failed to convert icon. + + + This game has no save data to delete! + This game has no save data to delete! + + + Save Data + Save Data + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Velg mappe + + + Select which directory you want to install to. + Velg hvilken mappe du vil installere til. + + + Install All Queued to Selected Folder + Install All Queued to Selected Folder + + + Delete PKG File on Install + Delete PKG File on Install + + + + MainWindow + + Open/Add Elf Folder + Åpne/Legg til Elf-mappe + + + Install Packages (PKG) + Installer pakker (PKG) + + + Boot Game + Start spill + + + Check for Updates + Se etter oppdateringer + + + About shadPS4 + Om shadPS4 + + + Configure... + Konfigurer... + + + Install application from a .pkg file + Installer fra en .pkg fil + + + Recent Games + Nylige spill + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Avslutt + + + Exit shadPS4 + Avslutt shadPS4 + + + Exit the application. + Avslutt programmet. + + + Show Game List + Vis spill-listen + + + Game List Refresh + Oppdater spill-listen + + + Tiny + Bitteliten + + + Small + Liten + + + Medium + Medium + + + Large + Stor + + + List View + Liste-visning + + + Grid View + Rute-visning + + + Elf Viewer + Elf-visning + + + Game Install Directory + Spillinstallasjons-mappe + + + Download Cheats/Patches + Last ned juks/programrettelse + + + Dump Game List + Dump spill-liste + + + PKG Viewer + PKG viser + + + Search... + Søk... + + + File + Fil + + + View + Oversikt + + + Game List Icons + Spill-liste ikoner + + + Game List Mode + Spill-liste modus + + + Settings + Innstillinger + + + Utils + Verktøy + + + Themes + Tema + + + Help + Hjelp + + + Dark + Mørk + + + Light + Lys + + + Green + Grønn + + + Blue + Blå + + + Violet + Lilla + + + toolBar + Verktøylinje + + + Game List + Spill-liste + + + * Unsupported Vulkan Version + * Ustøttet Vulkan-versjon + + + Download Cheats For All Installed Games + Last ned juks for alle installerte spill + + + Download Patches For All Games + Last ned programrettelser for alle spill + + + Download Complete + Nedlasting fullført + + + You have downloaded cheats for all the games you have installed. + Du har lastet ned juks for alle spillene du har installert. + + + Patches Downloaded Successfully! + Programrettelser ble lastet ned! + + + All Patches available for all games have been downloaded. + Programrettelser tilgjengelige for alle spill har blitt lastet ned. + + + Games: + Spill: + + + ELF files (*.bin *.elf *.oelf) + ELF-filer (*.bin *.elf *.oelf) + + + Game Boot + Spilloppstart + + + Only one file can be selected! + Kun én fil kan velges! + + + PKG Extraction + PKG-utpakking + + + Patch detected! + Programrettelse oppdaget! + + + PKG and Game versions match: + PKG og spillversjoner stemmer overens: + + + Would you like to overwrite? + Ønsker du å overskrive? + + + PKG Version %1 is older than installed version: + PKG-versjon %1 er eldre enn installert versjon: + + + Game is installed: + Spillet er installert: + + + Would you like to install Patch: + Ønsker du å installere programrettelsen: + + + DLC Installation + DLC installasjon + + + Would you like to install DLC: %1? + Ønsker du å installere DLC: %1? + + + DLC already installed: + DLC allerede installert: + + + Game already installed + Spillet er allerede installert + + + PKG ERROR + PKG FEIL + + + Extracting PKG %1/%2 + Pakker ut PKG %1/%2 + + + Extraction Finished + Utpakking fullført + + + Game successfully installed at %1 + Spillet ble installert i %1 + + + File doesn't appear to be a valid PKG file + Filen ser ikke ut til å være en gyldig PKG-fil + + + Run Game + Run Game + + + Eboot.bin file not found + Eboot.bin file not found + + + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) + + + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! + + + Game is already running! + Game is already running! + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Åpne mappe + + + PKG ERROR + PKG FEIL + + + Name + Navn + + + Serial + Serienummer + + + Installed + Installed + + + Size + Størrelse + + + Category + Category + + + Type + Type + + + App Ver + App Ver + + + FW + FW + + + Region + Region + + + Flags + Flags + + + Path + Adresse + + + File + Fil + + + Unknown + Ukjent + + + Package + Package + + + + SettingsDialog + + Settings + Innstillinger + + + General + Generell + + + System + System + + + Console Language + Konsollspråk + + + Emulator Language + Emulatorspråk + + + Emulator + Emulator + + + Enable Fullscreen + Aktiver fullskjerm + + + Fullscreen Mode + Fullskjermmodus + + + Enable Separate Update Folder + Aktiver seperat oppdateringsmappe + + + Default tab when opening settings + Standardfanen når innstillingene åpnes + + + Show Game Size In List + Vis spillstørrelse i listen + + + Show Splash + Vis velkomstbilde + + + Enable Discord Rich Presence + Aktiver Discord Rich Presence + + + Username + Brukernavn + + + Trophy Key + Trofénøkkel + + + Trophy + Trofé + + + Logger + Logger + + + Log Type + Logg type + + + Log Filter + Logg filter + + + Open Log Location + Åpne loggplassering + + + Input + Inndata + + + Cursor + Musepeker + + + Hide Cursor + Skjul musepeker + + + Hide Cursor Idle Timeout + Skjul musepeker ved inaktivitet + + + s + s + + + Controller + Kontroller + + + Back Button Behavior + Tilbakeknapp atferd + + + Graphics + Grafikk + + + GUI + Grensesnitt + + + User + Bruker + + + Graphics Device + Grafikkenhet + + + Width + Bredde + + + Height + Høyde + + + Vblank Divider + Vblank skillelinje + + + Advanced + Avansert + + + Enable Shaders Dumping + Aktiver skyggeleggerdumping + + + Enable NULL GPU + Aktiver NULL GPU + + + Enable HDR + Enable HDR + + + Paths + Mapper + + + Game Folders + Spillmapper + + + Add... + Legg til... + + + Remove + Fjern + + + Debug + Feilretting + + + Enable Debug Dumping + Aktiver feilrettingsdumping + + + Enable Vulkan Validation Layers + Aktiver Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Aktiver Vulkan synkroniseringslag + + + Enable RenderDoc Debugging + Aktiver RenderDoc feilretting + + + Enable Crash Diagnostics + Aktiver krasjdiagnostikk + + + Collect Shaders + Lagre skyggeleggere + + + Copy GPU Buffers + Kopier GPU-buffere + + + Host Debug Markers + Vertsfeilsøkingsmarkører + + + Guest Debug Markers + Gjestefeilsøkingsmarkører + + + Update + Oppdatering + + + Check for Updates at Startup + Se etter oppdateringer ved oppstart + + + Always Show Changelog + Always Show Changelog + + + Update Channel + Oppdateringskanal + + + Check for Updates + Se etter oppdateringer + + + GUI Settings + Grensesnitt-innstillinger + + + Title Music + Tittelmusikk + + + Disable Trophy Pop-ups + Deaktiver trofé hurtigmeny + + + Background Image + Bakgrunnsbilde + + + Show Background Image + Vis bakgrunnsbilde + + + Opacity + Synlighet + + + Play title music + Spill tittelmusikk + + + Update Compatibility Database On Startup + Oppdater database ved oppstart + + + Game Compatibility + Spill kompatibilitet + + + Display Compatibility Data + Vis kompatibilitets-data + + + Update Compatibility Database + Oppdater kompatibilitets-database + + + Volume + Volum + + + Save + Lagre + + + Apply + Bruk + + + Restore Defaults + Gjenopprett standardinnstillinger + + + Close + Lukk + + + Point your mouse at an option to display its description. + Pek musen over et alternativ for å vise beskrivelsen. + + + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. + + + Emulator Language:\nSets the language of the emulator's user interface. + Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. + + + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. + + + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. + Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. + + + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. + + + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. + Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. + + + Username:\nSets the PS4's account username, which may be displayed by some games. + Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. + + + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. + + + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. + + + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. + + + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. + + + Background Image:\nControl the opacity of the game background image. + Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. + + + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. + + + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). + + + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. + + + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. + Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. + + + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. + + + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. + + + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. + + + Update Compatibility Database:\nImmediately update the compatibility database. + Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. + + + Never + Aldri + + + Idle + Inaktiv + + + Always + Alltid + + + Touchpad Left + Berøringsplate Venstre + + + Touchpad Right + Berøringsplate Høyre + + + Touchpad Center + Berøringsplate Midt + + + None + Ingen + + + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. + + + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. + + + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! + + + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. + + + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. + + + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + + + Game Folders:\nThe list of folders to check for installed games. + Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. + + + Add:\nAdd a folder to the list. + Legg til:\nLegg til en mappe til listen. + + + Remove:\nRemove a folder from the list. + Fjern:\nFjern en mappe fra listen. + + + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. + + + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. + Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + + + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. + Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + + + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. + + + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). + + + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. + + + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. + + + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + + + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + + + Save Data Path:\nThe folder where game save data will be saved. + Lagrede datamappe:\nListe over data shadPS4 lagrer. + + + Browse:\nBrowse for a folder to set as the save data path. + Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. + + + Borderless + Borderless + + + True + True + + + Release + Release + + + Nightly + Nightly + + + Set the volume of the background music. + Set the volume of the background music. + + + Enable Motion Controls + Enable Motion Controls + + + Save Data Path + Lagrede datamappe + + + Browse + Endre mappe + + + async + async + + + sync + sync + + + Auto Select + Auto Select + + + Directory to install games + Mappe for å installere spill + + + Directory to save data + Directory to save data + + + + TrophyViewer + + Trophy Viewer + Trofé viser + + + diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 33f76764f..be9c4d11b 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1309,7 +1309,7 @@ Logger - Registro-Log + Registros de Log Log Type @@ -1497,7 +1497,7 @@ Play title music - Reproduzir música de abertura + Reproduzir Música do Título Update Compatibility Database On Startup @@ -1573,7 +1573,7 @@ Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Tipo do Registro:\nDetermina se a saída da janela de log deve ser sincronizada por motivos de desempenho. Pode impactar negativamente a emulação. + Tipo de Registro:\nDetermina se a saída da janela de log deve ser sincronizada por motivos de desempenho. Pode impactar negativamente a emulação. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. @@ -1585,7 +1585,7 @@ Background Image:\nControl the opacity of the game background image. - Imagem de fundo:\nControle a opacidade da imagem de fundo do jogo. + Imagem de Fundo:\nControla a opacidade da imagem de fundo do jogo. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. @@ -1705,7 +1705,7 @@ Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Diagnósticos de Falha:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depuração de erros de 'Device lost'. Se você tiver isto habilitado, você deve habilitar os Marcadores de Depuração de Host E DE Convidado.\nNão funciona em GPUs Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o Vulkan SDK para que isso funcione. + Diagnóstico de Falhas:\nCria um arquivo .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depuração de erros de 'Device lost'. Se isto estiver ativado, você deve habilitar os Marcadores de Depuração de Host E DE Convidado.\nNão funciona em GPUs Intel.\nVocê precisa ter as Camadas de Validação Vulkan habilitadas e o Vulkan SDK para que isso funcione. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. @@ -1721,11 +1721,11 @@ Save Data Path:\nThe folder where game save data will be saved. - Diretório dos Dados Salvos:\nA pasta que onde os dados de salvamento de jogo serão salvos. + Caminho dos Dados Salvos:\nA pasta que onde os dados de salvamento de jogo serão salvos. Browse:\nBrowse for a folder to set as the save data path. - Navegar:\nProcure uma pasta para definir como o caminho para salvar dados. + Procurar:\nProcure uma pasta para definir como o caminho para salvar dados. Borderless diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts new file mode 100644 index 000000000..1a63c88fd --- /dev/null +++ b/src/qt_gui/translations/pt_PT.ts @@ -0,0 +1,1790 @@ + + + + + + AboutDialog + + About shadPS4 + Sobre o shadPS4 + + + shadPS4 + shadPS4 + + + shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 é um emulador de código aberto experimental para o PlayStation 4. + + + This software should not be used to play games you have not legally obtained. + Este programa não deve ser usado para jogar títulos não obtidos legalmente. + + + + CheatsPatches + + Cheats / Patches for + Cheats / Patches for + + + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + + + No Image Available + No Image Available + + + Serial: + Serial: + + + Version: + Version: + + + Size: + Size: + + + Select Cheat File: + Select Cheat File: + + + Repository: + Repository: + + + Download Cheats + Download Cheats + + + Delete File + Delete File + + + No files selected. + No files selected. + + + You can delete the cheats you don't want after downloading them. + You can delete the cheats you don't want after downloading them. + + + Do you want to delete the selected file?\n%1 + Do you want to delete the selected file?\n%1 + + + Select Patch File: + Select Patch File: + + + Download Patches + Download Patches + + + Save + Save + + + Cheats + Cheats + + + Patches + Patches + + + Error + Error + + + No patch selected. + No patch selected. + + + Unable to open files.json for reading. + Unable to open files.json for reading. + + + No patch file found for the current serial. + No patch file found for the current serial. + + + Unable to open the file for reading. + Unable to open the file for reading. + + + Unable to open the file for writing. + Unable to open the file for writing. + + + Failed to parse XML: + Failed to parse XML: + + + Success + Success + + + Options saved successfully. + Options saved successfully. + + + Invalid Source + Invalid Source + + + The selected source is invalid. + The selected source is invalid. + + + File Exists + File Exists + + + File already exists. Do you want to replace it? + File already exists. Do you want to replace it? + + + Failed to save file: + Failed to save file: + + + Failed to download file: + Failed to download file: + + + Cheats Not Found + Cheats Not Found + + + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + + + Cheats Downloaded Successfully + Cheats Downloaded Successfully + + + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + + + Failed to save: + Failed to save: + + + Failed to download: + Failed to download: + + + Download Complete + Download Complete + + + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + + + Failed to parse JSON data from HTML. + Failed to parse JSON data from HTML. + + + Failed to retrieve HTML page. + Failed to retrieve HTML page. + + + The game is in version: %1 + The game is in version: %1 + + + The downloaded patch only works on version: %1 + The downloaded patch only works on version: %1 + + + You may need to update your game. + You may need to update your game. + + + Incompatibility Notice + Incompatibility Notice + + + Failed to open file: + Failed to open file: + + + XML ERROR: + XML ERROR: + + + Failed to open files.json for writing + Failed to open files.json for writing + + + Author: + Author: + + + Directory does not exist: + Directory does not exist: + + + Failed to open files.json for reading. + Failed to open files.json for reading. + + + Name: + Name: + + + Can't apply cheats before the game is started + Can't apply cheats before the game is started + + + Close + Close + + + + CheckUpdate + + Auto Updater + Auto Updater + + + Error + Error + + + Network error: + Network error: + + + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. + The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. + + + Failed to parse update information. + Failed to parse update information. + + + No pre-releases found. + No pre-releases found. + + + Invalid release data. + Invalid release data. + + + No download URL found for the specified asset. + No download URL found for the specified asset. + + + Your version is already up to date! + Your version is already up to date! + + + Update Available + Update Available + + + Update Channel + Update Channel + + + Current Version + Current Version + + + Latest Version + Latest Version + + + Do you want to update? + Do you want to update? + + + Show Changelog + Show Changelog + + + Check for Updates at Startup + Check for Updates at Startup + + + Update + Update + + + No + No + + + Hide Changelog + Hide Changelog + + + Changes + Changes + + + Network error occurred while trying to access the URL + Network error occurred while trying to access the URL + + + Download Complete + Download Complete + + + The update has been downloaded, press OK to install. + The update has been downloaded, press OK to install. + + + Failed to save the update file at + Failed to save the update file at + + + Starting Update... + Starting Update... + + + Failed to create the update script file + Failed to create the update script file + + + + CompatibilityInfoClass + + Fetching compatibility data, please wait + Fetching compatibility data, please wait + + + Cancel + Cancel + + + Loading... + Loading... + + + Error + Error + + + Unable to update compatibility data! Try again later. + Unable to update compatibility data! Try again later. + + + Unable to open compatibility_data.json for writing. + Unable to open compatibility_data.json for writing. + + + Unknown + Unknown + + + Nothing + Nothing + + + Boots + Boots + + + Menus + Menus + + + Ingame + Ingame + + + Playable + Playable + + + + ControlSettings + + Configure Controls + Configure Controls + + + Control Settings + Control Settings + + + D-Pad + D-Pad + + + Up + Up + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Stick Deadzone (def:2 max:127) + Left Stick Deadzone (def:2 max:127) + + + Left Deadzone + Left Deadzone + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + L1 / LB + L1 / LB + + + L2 / LT + L2 / LT + + + KBM Controls + KBM Controls + + + KBM Editor + KBM Editor + + + Back + Back + + + R1 / RB + R1 / RB + + + R2 / RT + R2 / RT + + + L3 + L3 + + + Options / Start + Options / Start + + + R3 + R3 + + + Face Buttons + Face Buttons + + + Triangle / Y + Triangle / Y + + + Square / X + Square / X + + + Circle / B + Circle / B + + + Cross / A + Cross / A + + + Right Stick Deadzone (def:2, max:127) + Right Stick Deadzone (def:2, max:127) + + + Right Deadzone + Right Deadzone + + + Right Stick + Right Stick + + + + ElfViewer + + Open Folder + Open Folder + + + + GameInfoClass + + Loading game list, please wait :3 + Loading game list, please wait :3 + + + Cancel + Cancel + + + Loading... + Loading... + + + + GameInstallDialog + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Directory to install games + Directory to install games + + + Browse + Browse + + + Error + Error + + + Directory to install DLC + Directory to install DLC + + + + GameListFrame + + Icon + Icon + + + Name + Name + + + Serial + Serial + + + Compatibility + Compatibility + + + Region + Region + + + Firmware + Firmware + + + Size + Size + + + Version + Version + + + Path + Path + + + Play Time + Play Time + + + Never Played + Never Played + + + h + h + + + m + m + + + s + s + + + Compatibility is untested + Compatibility is untested + + + Game does not initialize properly / crashes the emulator + Game does not initialize properly / crashes the emulator + + + Game boots, but only displays a blank screen + Game boots, but only displays a blank screen + + + Game displays an image but does not go past the menu + Game displays an image but does not go past the menu + + + Game has game-breaking glitches or unplayable performance + Game has game-breaking glitches or unplayable performance + + + Game can be completed with playable performance and no major glitches + Game can be completed with playable performance and no major glitches + + + Click to see details on github + Click to see details on github + + + Last updated + Last updated + + + + GameListUtils + + B + B + + + KB + KB + + + MB + MB + + + GB + GB + + + TB + TB + + + + GuiContextMenus + + Create Shortcut + Create Shortcut + + + Cheats / Patches + Cheats / Patches + + + SFO Viewer + SFO Viewer + + + Trophy Viewer + Trophy Viewer + + + Open Folder... + Open Folder... + + + Open Game Folder + Open Game Folder + + + Open Save Data Folder + Open Save Data Folder + + + Open Log Folder + Open Log Folder + + + Copy info... + Copy info... + + + Copy Name + Copy Name + + + Copy Serial + Copy Serial + + + Copy Version + Copy Version + + + Copy Size + Copy Size + + + Copy All + Copy All + + + Delete... + Delete... + + + Delete Game + Delete Game + + + Delete Update + Delete Update + + + Delete DLC + Delete DLC + + + Compatibility... + Compatibility... + + + Update database + Update database + + + View report + View report + + + Submit a report + Submit a report + + + Shortcut creation + Shortcut creation + + + Shortcut created successfully! + Shortcut created successfully! + + + Error + Error + + + Error creating shortcut! + Error creating shortcut! + + + Install PKG + Install PKG + + + Game + Game + + + This game has no update to delete! + This game has no update to delete! + + + Update + Update + + + This game has no DLC to delete! + This game has no DLC to delete! + + + DLC + DLC + + + Delete %1 + Delete %1 + + + Are you sure you want to delete %1's %2 directory? + Are you sure you want to delete %1's %2 directory? + + + Open Update Folder + Open Update Folder + + + Delete Save Data + Delete Save Data + + + This game has no update folder to open! + This game has no update folder to open! + + + Failed to convert icon. + Failed to convert icon. + + + This game has no save data to delete! + This game has no save data to delete! + + + Save Data + Save Data + + + + InstallDirSelect + + shadPS4 - Choose directory + shadPS4 - Choose directory + + + Select which directory you want to install to. + Select which directory you want to install to. + + + Install All Queued to Selected Folder + Install All Queued to Selected Folder + + + Delete PKG File on Install + Delete PKG File on Install + + + + MainWindow + + Open/Add Elf Folder + Open/Add Elf Folder + + + Install Packages (PKG) + Install Packages (PKG) + + + Boot Game + Boot Game + + + Check for Updates + Check for Updates + + + About shadPS4 + About shadPS4 + + + Configure... + Configure... + + + Install application from a .pkg file + Install application from a .pkg file + + + Recent Games + Recent Games + + + Open shadPS4 Folder + Open shadPS4 Folder + + + Exit + Exit + + + Exit shadPS4 + Exit shadPS4 + + + Exit the application. + Exit the application. + + + Show Game List + Show Game List + + + Game List Refresh + Game List Refresh + + + Tiny + Tiny + + + Small + Small + + + Medium + Medium + + + Large + Large + + + List View + List View + + + Grid View + Grid View + + + Elf Viewer + Elf Viewer + + + Game Install Directory + Game Install Directory + + + Download Cheats/Patches + Download Cheats/Patches + + + Dump Game List + Dump Game List + + + PKG Viewer + PKG Viewer + + + Search... + Search... + + + File + File + + + View + View + + + Game List Icons + Game List Icons + + + Game List Mode + Game List Mode + + + Settings + Settings + + + Utils + Utils + + + Themes + Themes + + + Help + Help + + + Dark + Dark + + + Light + Light + + + Green + Green + + + Blue + Blue + + + Violet + Violet + + + toolBar + toolBar + + + Game List + Game List + + + * Unsupported Vulkan Version + * Unsupported Vulkan Version + + + Download Cheats For All Installed Games + Download Cheats For All Installed Games + + + Download Patches For All Games + Download Patches For All Games + + + Download Complete + Download Complete + + + You have downloaded cheats for all the games you have installed. + You have downloaded cheats for all the games you have installed. + + + Patches Downloaded Successfully! + Patches Downloaded Successfully! + + + All Patches available for all games have been downloaded. + All Patches available for all games have been downloaded. + + + Games: + Games: + + + ELF files (*.bin *.elf *.oelf) + ELF files (*.bin *.elf *.oelf) + + + Game Boot + Game Boot + + + Only one file can be selected! + Only one file can be selected! + + + PKG Extraction + PKG Extraction + + + Patch detected! + Patch detected! + + + PKG and Game versions match: + PKG and Game versions match: + + + Would you like to overwrite? + Would you like to overwrite? + + + PKG Version %1 is older than installed version: + PKG Version %1 is older than installed version: + + + Game is installed: + Game is installed: + + + Would you like to install Patch: + Would you like to install Patch: + + + DLC Installation + DLC Installation + + + Would you like to install DLC: %1? + Would you like to install DLC: %1? + + + DLC already installed: + DLC already installed: + + + Game already installed + Game already installed + + + PKG ERROR + PKG ERROR + + + Extracting PKG %1/%2 + Extracting PKG %1/%2 + + + Extraction Finished + Extraction Finished + + + Game successfully installed at %1 + Game successfully installed at %1 + + + File doesn't appear to be a valid PKG file + File doesn't appear to be a valid PKG file + + + Run Game + Run Game + + + Eboot.bin file not found + Eboot.bin file not found + + + PKG File (*.PKG *.pkg) + PKG File (*.PKG *.pkg) + + + PKG is a patch or DLC, please install the game first! + PKG is a patch or DLC, please install the game first! + + + Game is already running! + Game is already running! + + + shadPS4 + shadPS4 + + + + PKGViewer + + Open Folder + Open Folder + + + PKG ERROR + PKG ERROR + + + Name + Name + + + Serial + Serial + + + Installed + Installed + + + Size + Size + + + Category + Category + + + Type + Type + + + App Ver + App Ver + + + FW + FW + + + Region + Region + + + Flags + Flags + + + Path + Path + + + File + File + + + Unknown + Unknown + + + Package + Package + + + + SettingsDialog + + Settings + Settings + + + General + General + + + System + System + + + Console Language + Console Language + + + Emulator Language + Emulator Language + + + Emulator + Emulator + + + Enable Fullscreen + Enable Fullscreen + + + Fullscreen Mode + Fullscreen Mode + + + Enable Separate Update Folder + Enable Separate Update Folder + + + Default tab when opening settings + Default tab when opening settings + + + Show Game Size In List + Show Game Size In List + + + Show Splash + Show Splash + + + Enable Discord Rich Presence + Enable Discord Rich Presence + + + Username + Username + + + Trophy Key + Trophy Key + + + Trophy + Trophy + + + Logger + Logger + + + Log Type + Log Type + + + Log Filter + Log Filter + + + Open Log Location + Open Log Location + + + Input + Input + + + Cursor + Cursor + + + Hide Cursor + Hide Cursor + + + Hide Cursor Idle Timeout + Hide Cursor Idle Timeout + + + s + s + + + Controller + Controller + + + Back Button Behavior + Back Button Behavior + + + Graphics + Graphics + + + GUI + GUI + + + User + User + + + Graphics Device + Graphics Device + + + Width + Width + + + Height + Height + + + Vblank Divider + Vblank Divider + + + Advanced + Advanced + + + Enable Shaders Dumping + Enable Shaders Dumping + + + Enable NULL GPU + Enable NULL GPU + + + Enable HDR + Enable HDR + + + Paths + Paths + + + Game Folders + Game Folders + + + Add... + Add... + + + Remove + Remove + + + Debug + Debug + + + Enable Debug Dumping + Enable Debug Dumping + + + Enable Vulkan Validation Layers + Enable Vulkan Validation Layers + + + Enable Vulkan Synchronization Validation + Enable Vulkan Synchronization Validation + + + Enable RenderDoc Debugging + Enable RenderDoc Debugging + + + Enable Crash Diagnostics + Enable Crash Diagnostics + + + Collect Shaders + Collect Shaders + + + Copy GPU Buffers + Copy GPU Buffers + + + Host Debug Markers + Host Debug Markers + + + Guest Debug Markers + Guest Debug Markers + + + Update + Update + + + Check for Updates at Startup + Check for Updates at Startup + + + Always Show Changelog + Always Show Changelog + + + Update Channel + Update Channel + + + Check for Updates + Check for Updates + + + GUI Settings + GUI Settings + + + Title Music + Title Music + + + Disable Trophy Pop-ups + Disable Trophy Pop-ups + + + Background Image + Background Image + + + Show Background Image + Show Background Image + + + Opacity + Opacity + + + Play title music + Play title music + + + Update Compatibility Database On Startup + Update Compatibility Database On Startup + + + Game Compatibility + Game Compatibility + + + Display Compatibility Data + Display Compatibility Data + + + Update Compatibility Database + Update Compatibility Database + + + Volume + Volume + + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Close + Close + + + Point your mouse at an option to display its description. + Point your mouse at an option to display its description. + + + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + + + Emulator Language:\nSets the language of the emulator's user interface. + Emulator Language:\nSets the language of the emulator's user interface. + + + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + + + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. + Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. + + + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + + + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. + Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. + + + Username:\nSets the PS4's account username, which may be displayed by some games. + Username:\nSets the PS4's account username, which may be displayed by some games. + + + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + + + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + + + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + + + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + + + Background Image:\nControl the opacity of the game background image. + Background Image:\nControl the opacity of the game background image. + + + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + + + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + + + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + + + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. + Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. + + + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + + + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + + + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + + + Update Compatibility Database:\nImmediately update the compatibility database. + Update Compatibility Database:\nImmediately update the compatibility database. + + + Never + Never + + + Idle + Idle + + + Always + Always + + + Touchpad Left + Touchpad Left + + + Touchpad Right + Touchpad Right + + + Touchpad Center + Touchpad Center + + + None + None + + + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + + + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + + + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + + + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + + + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + + + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + + + Game Folders:\nThe list of folders to check for installed games. + Game Folders:\nThe list of folders to check for installed games. + + + Add:\nAdd a folder to the list. + Add:\nAdd a folder to the list. + + + Remove:\nRemove a folder from the list. + Remove:\nRemove a folder from the list. + + + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + + + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. + Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. + + + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. + Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. + + + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + + + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + + + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + + + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + + + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + + + Save Data Path:\nThe folder where game save data will be saved. + Save Data Path:\nThe folder where game save data will be saved. + + + Browse:\nBrowse for a folder to set as the save data path. + Browse:\nBrowse for a folder to set as the save data path. + + + Borderless + Borderless + + + True + True + + + Release + Release + + + Nightly + Nightly + + + Set the volume of the background music. + Set the volume of the background music. + + + Enable Motion Controls + Enable Motion Controls + + + Save Data Path + Save Data Path + + + Browse + Browse + + + async + async + + + sync + sync + + + Auto Select + Auto Select + + + Directory to install games + Directory to install games + + + Directory to save data + Directory to save data + + + + TrophyViewer + + Trophy Viewer + Trophy Viewer + + + diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 157fbd4cb..538b774fc 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -471,15 +471,15 @@ KBM Controls - KBM Controls + Управление KBM KBM Editor - KBM Editor + Редактор KBM Back - Back + Назад R1 / RB @@ -1238,7 +1238,7 @@ Package - Package + Пакет diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index b1aeaa9c3..34baf29bd 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -443,7 +443,7 @@ Left Deadzone - Left Deadzone + Sol Ölü Bölge Left Stick @@ -451,7 +451,7 @@ Config Selection - Config Selection + Yapılandırma Seçimi Common Config @@ -459,7 +459,7 @@ Use per-game configs - Use per-game configs + Oyuna özel yapılandırmaları kullan L1 / LB @@ -495,7 +495,7 @@ Options / Start - Options / Start + Seçenekler / Başlat R3 @@ -503,7 +503,7 @@ Face Buttons - Face Buttons + Eylem Düğmeleri Triangle / Y @@ -527,7 +527,7 @@ Right Deadzone - Right Deadzone + Sağ Ölü Bölge Right Stick @@ -655,7 +655,7 @@ Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + Oyunu bozan hatalar ya da oynanamayan performans Game can be completed with playable performance and no major glitches @@ -725,7 +725,7 @@ Open Log Folder - Log Klasörünü Aç + Günlük Klasörünü Aç Copy info... @@ -809,7 +809,7 @@ This game has no update to delete! - This game has no update to delete! + Bu oyunun silinecek güncellemesi yok! Update @@ -817,7 +817,7 @@ This game has no DLC to delete! - This game has no DLC to delete! + Bu oyunun silinecek indirilebilir içeriği yok! DLC @@ -841,7 +841,7 @@ This game has no update folder to open! - This game has no update folder to open! + Bu oyunun açılacak güncelleme klasörü yok! Failed to convert icon. @@ -849,7 +849,7 @@ This game has no save data to delete! - This game has no save data to delete! + Bu oyunun silinecek kayıt verisi yok! Save Data @@ -1206,15 +1206,15 @@ Type - Type + Tür App Ver - App Ver + Uygulama Sürümü FW - FW + Sistem Yazılımı Region @@ -1349,7 +1349,7 @@ Back Button Behavior - Geri Dön Butonu Davranışı + Geri Dönme Butonu Davranışı Graphics @@ -1437,19 +1437,19 @@ Collect Shaders - Collect Shaders + Gölgelendiricileri Topla Copy GPU Buffers - Copy GPU Buffers + GPU Arabelleklerini Kopyala Host Debug Markers - Host Debug Markers + Ana Bilgisayar Hata Ayıklama İşaretleyicileri Guest Debug Markers - Guest Debug Markers + Konuk Hata Ayıklama İşaretleyicileri Update @@ -1569,7 +1569,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Kupa Anahtarı:\nKupaların şifresini çözmek için kullanılan anahtardır. Jailbreak yapılmış konsolunuzdan alınmalıdır.\nYalnızca onaltılık karakterler içermelidir. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1585,11 +1585,11 @@ Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Arka Plan Resmi:\nOyunun arka plan resmi görünürlüğünü ayarlayın. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - Başlık Müziklerini Çal:\nEğer bir oyun bunu destekliyorsa, GUI'de oyunu seçtiğinizde özel müziklerin çalmasını etkinleştirir. + Oyun Müziklerini Çal:\nEğer oyun destekliyorsa, arayüzde oyunu seçtiğinizde özel müzik çalmasını etkinleştirir. Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). @@ -1613,11 +1613,11 @@ Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Başlangıçta Uyumluluk Veritabanını Güncelle:\nshadPS4 başlatıldığında uyumluluk veritabanını otomatik olarak güncelleyin. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Uyumluluk Veritabanını Güncelle:\nUyumluluk veri tabanını hemen güncelleyin. Never @@ -1721,7 +1721,7 @@ Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Kayıt Verileri Yolu:\nOyun kayıt verilerinin kaydedileceği klasördür. Browse:\nBrowse for a folder to set as the save data path. diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 8eae7ae69..21daafb5e 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -495,7 +495,7 @@ Options / Start - 选项 / 开始 + Options / Start R3 @@ -1238,7 +1238,7 @@ Package - Package + Package @@ -1377,7 +1377,7 @@ Vblank Divider - Vblank Divider + Vblank Divider Advanced From 26bb3d40d9172790249a922a7e24990fe554ce34 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 16 Feb 2025 04:41:37 -0300 Subject: [PATCH 302/455] Correct translation no_NO to nb_NO (#2455) --- src/common/config.cpp | 2 +- src/qt_gui/translations/no_NO.ts | 1790 ------------------------------ 2 files changed, 1 insertion(+), 1791 deletions(-) delete mode 100644 src/qt_gui/translations/no_NO.ts diff --git a/src/common/config.cpp b/src/common/config.cpp index 4383b64b5..32c5e670b 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -813,7 +813,7 @@ void load(const std::filesystem::path& path) { // Check if the loaded language is in the allowed list const std::vector allowed_languages = { "ar_SA", "da_DK", "de_DE", "el_GR", "en_US", "es_ES", "fa_IR", "fi_FI", "fr_FR", "hu_HU", - "id_ID", "it_IT", "ja_JP", "ko_KR", "lt_LT", "nl_NL", "no_NO", "pl_PL", "pt_BR", "pt_PT", + "id_ID", "it_IT", "ja_JP", "ko_KR", "lt_LT", "nb_NO", "nl_NL", "pl_PL", "pt_BR", "pt_PT", "ro_RO", "ru_RU", "sq_AL", "sv_SE", "tr_TR", "uk_UA", "vi_VN", "zh_CN", "zh_TW"}; if (std::find(allowed_languages.begin(), allowed_languages.end(), emulator_language) == diff --git a/src/qt_gui/translations/no_NO.ts b/src/qt_gui/translations/no_NO.ts deleted file mode 100644 index 2613f63b0..000000000 --- a/src/qt_gui/translations/no_NO.ts +++ /dev/null @@ -1,1790 +0,0 @@ - - - - - - AboutDialog - - About shadPS4 - Om shadPS4 - - - shadPS4 - shadPS4 - - - shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. - - - This software should not be used to play games you have not legally obtained. - Denne programvaren skal ikke brukes til å spille spill du ikke har fått lovlig. - - - - CheatsPatches - - Cheats / Patches for - Juks / Programrettelser for - - - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\n - - - No Image Available - Ingen bilde tilgjengelig - - - Serial: - Serienummer: - - - Version: - Versjon: - - - Size: - Størrelse: - - - Select Cheat File: - Velg juksefil: - - - Repository: - Pakkebrønn: - - - Download Cheats - Last ned juks - - - Delete File - Slett fil - - - No files selected. - Ingen filer valgt. - - - You can delete the cheats you don't want after downloading them. - Du kan slette juks du ikke ønsker etter å ha lastet dem ned. - - - Do you want to delete the selected file?\n%1 - Ønsker du å slette den valgte filen?\n%1 - - - Select Patch File: - Velg programrettelse-filen: - - - Download Patches - Last ned programrettelser - - - Save - Lagre - - - Cheats - Juks - - - Patches - Programrettelse - - - Error - Feil - - - No patch selected. - Ingen programrettelse valgt. - - - Unable to open files.json for reading. - Kan ikke åpne files.json for lesing. - - - No patch file found for the current serial. - Ingen programrettelse-fil funnet for det aktuelle serienummeret. - - - Unable to open the file for reading. - Kan ikke åpne filen for lesing. - - - Unable to open the file for writing. - Kan ikke åpne filen for skriving. - - - Failed to parse XML: - Feil ved tolkning av XML: - - - Success - Vellykket - - - Options saved successfully. - Alternativer ble lagret. - - - Invalid Source - Ugyldig kilde - - - The selected source is invalid. - Den valgte kilden er ugyldig. - - - File Exists - Filen eksisterer - - - File already exists. Do you want to replace it? - Filen eksisterer allerede. Ønsker du å erstatte den? - - - Failed to save file: - Kunne ikke lagre filen: - - - Failed to download file: - Kunne ikke laste ned filen: - - - Cheats Not Found - Fant ikke juks - - - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - Ingen juks funnet for dette spillet i denne versjonen av den valgte pakkebrønnen,prøv en annen pakkebrønn eller en annen versjon av spillet. - - - Cheats Downloaded Successfully - Juks ble lastet ned - - - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. - - - Failed to save: - Kunne ikke lagre: - - - Failed to download: - Kunne ikke laste ned: - - - Download Complete - Nedlasting fullført - - - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - Programrettelser ble lastet ned! Alle programrettelsene tilgjengelige for alle spill har blitt lastet ned, det er ikke nødvendig å laste dem ned individuelt for hvert spill som skjer med juks. Hvis programrettelsen ikke vises, kan det hende at den ikke finnes for den spesifikke serienummeret og versjonen av spillet. - - - Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. - - - Failed to retrieve HTML page. - Kunne ikke hente HTML-side. - - - The game is in version: %1 - Spillet er i versjon: %1 - - - The downloaded patch only works on version: %1 - Den nedlastede programrettelsen fungerer bare på versjon: %1 - - - You may need to update your game. - Du må kanskje oppdatere spillet ditt. - - - Incompatibility Notice - Inkompatibilitets-varsel - - - Failed to open file: - Kunne ikke åpne filen: - - - XML ERROR: - XML FEIL: - - - Failed to open files.json for writing - Kunne ikke åpne files.json for skriving - - - Author: - Forfatter: - - - Directory does not exist: - Mappen eksisterer ikke: - - - Failed to open files.json for reading. - Kunne ikke åpne files.json for lesing. - - - Name: - Navn: - - - Can't apply cheats before the game is started - Kan ikke bruke juks før spillet er startet. - - - Close - Lukk - - - - CheckUpdate - - Auto Updater - Automatisk oppdatering - - - Error - Feil - - - Network error: - Nettverksfeil: - - - The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. - Den automatiske oppdateringen tillater opptil 60 oppdateringssjekker per time.\nDu har nådd denne grensen. Prøv igjen senere. - - - Failed to parse update information. - Kunne ikke analysere oppdaterings-informasjonen. - - - No pre-releases found. - Fant ingen forhåndsutgivelser. - - - Invalid release data. - Ugyldige utgivelsesdata. - - - No download URL found for the specified asset. - Ingen nedlastings-URL funnet for den spesifiserte ressursen. - - - Your version is already up to date! - Din versjon er allerede oppdatert! - - - Update Available - Oppdatering tilgjengelig - - - Update Channel - Oppdateringskanal - - - Current Version - Gjeldende versjon - - - Latest Version - Nyeste versjon - - - Do you want to update? - Vil du oppdatere? - - - Show Changelog - Vis endringslogg - - - Check for Updates at Startup - Se etter oppdateringer ved oppstart - - - Update - Oppdater - - - No - Nei - - - Hide Changelog - Skjul endringslogg - - - Changes - Endringer - - - Network error occurred while trying to access the URL - Nettverksfeil oppstod mens vi prøvde å få tilgang til URL - - - Download Complete - Nedlasting fullført - - - The update has been downloaded, press OK to install. - Oppdateringen har blitt lastet ned, trykk OK for å installere. - - - Failed to save the update file at - Kunne ikke lagre oppdateringsfilen på - - - Starting Update... - Starter oppdatering... - - - Failed to create the update script file - Kunne ikke opprette oppdateringsskriptfilen - - - - CompatibilityInfoClass - - Fetching compatibility data, please wait - Henter kompatibilitetsdata, vennligst vent - - - Cancel - Avbryt - - - Loading... - Laster... - - - Error - Feil - - - Unable to update compatibility data! Try again later. - Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. - - - Unable to open compatibility_data.json for writing. - Kan ikke åpne compatibility_data.json for skriving. - - - Unknown - Ukjent - - - Nothing - Ingenting - - - Boots - Starter opp - - - Menus - Menyene - - - Ingame - I spill - - - Playable - Spillbar - - - - ControlSettings - - Configure Controls - Configure Controls - - - Control Settings - Control Settings - - - D-Pad - D-Pad - - - Up - Up - - - Left - Left - - - Right - Right - - - Down - Down - - - Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) - - - Left Deadzone - Left Deadzone - - - Left Stick - Left Stick - - - Config Selection - Config Selection - - - Common Config - Common Config - - - Use per-game configs - Use per-game configs - - - L1 / LB - L1 / LB - - - L2 / LT - L2 / LT - - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - - - Back - Back - - - R1 / RB - R1 / RB - - - R2 / RT - R2 / RT - - - L3 - L3 - - - Options / Start - Options / Start - - - R3 - R3 - - - Face Buttons - Face Buttons - - - Triangle / Y - Triangle / Y - - - Square / X - Square / X - - - Circle / B - Circle / B - - - Cross / A - Cross / A - - - Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) - - - Right Deadzone - Right Deadzone - - - Right Stick - Right Stick - - - - ElfViewer - - Open Folder - Åpne mappe - - - - GameInfoClass - - Loading game list, please wait :3 - Laster spill-liste, vennligst vent :3 - - - Cancel - Avbryt - - - Loading... - Laster... - - - - GameInstallDialog - - shadPS4 - Choose directory - shadPS4 - Velg mappe - - - Directory to install games - Mappe for å installere spill - - - Browse - Bla gjennom - - - Error - Feil - - - Directory to install DLC - Directory to install DLC - - - - GameListFrame - - Icon - Ikon - - - Name - Navn - - - Serial - Serienummer - - - Compatibility - Kompatibilitet - - - Region - Region - - - Firmware - Fastvare - - - Size - Størrelse - - - Version - Versjon - - - Path - Adresse - - - Play Time - Spilletid - - - Never Played - Aldri spilt - - - h - h - - - m - m - - - s - s - - - Compatibility is untested - kompatibilitet er utestet - - - Game does not initialize properly / crashes the emulator - Spillet initialiseres ikke riktig / krasjer emulatoren - - - Game boots, but only displays a blank screen - Spillet starter, men viser bare en tom skjerm - - - Game displays an image but does not go past the menu - Spillet viser et bilde, men går ikke forbi menyen - - - Game has game-breaking glitches or unplayable performance - Spillet har spillbrytende feil eller uspillbar ytelse - - - Game can be completed with playable performance and no major glitches - Spillet kan fullføres med spillbar ytelse og uten store feil - - - Click to see details on github - Klikk for å se detaljer på GitHub - - - Last updated - Sist oppdatert - - - - GameListUtils - - B - B - - - KB - KB - - - MB - MB - - - GB - GB - - - TB - TB - - - - GuiContextMenus - - Create Shortcut - Lag snarvei - - - Cheats / Patches - Juks / Programrettelse - - - SFO Viewer - SFO viser - - - Trophy Viewer - Trofé viser - - - Open Folder... - Åpne mappe... - - - Open Game Folder - Åpne spillmappen - - - Open Save Data Folder - Åpne lagrede datamappen - - - Open Log Folder - Åpne loggmappen - - - Copy info... - Kopier info... - - - Copy Name - Kopier navn - - - Copy Serial - Kopier serienummer - - - Copy Version - Kopier versjon - - - Copy Size - Kopier størrelse - - - Copy All - Kopier alt - - - Delete... - Slett... - - - Delete Game - Slett spill - - - Delete Update - Slett oppdatering - - - Delete DLC - Slett DLC - - - Compatibility... - Kompatibilitet... - - - Update database - Oppdater database - - - View report - Vis rapport - - - Submit a report - Send inn en rapport - - - Shortcut creation - Snarvei opprettelse - - - Shortcut created successfully! - Snarvei opprettet! - - - Error - Feil - - - Error creating shortcut! - Feil ved opprettelse av snarvei! - - - Install PKG - Installer PKG - - - Game - Spill - - - This game has no update to delete! - Dette spillet har ingen oppdatering å slette! - - - Update - Oppdater - - - This game has no DLC to delete! - Dette spillet har ingen DLC å slette! - - - DLC - DLC - - - Delete %1 - Slett %1 - - - Are you sure you want to delete %1's %2 directory? - Er du sikker på at du vil slette %1's %2 directory? - - - Open Update Folder - Open Update Folder - - - Delete Save Data - Delete Save Data - - - This game has no update folder to open! - This game has no update folder to open! - - - Failed to convert icon. - Failed to convert icon. - - - This game has no save data to delete! - This game has no save data to delete! - - - Save Data - Save Data - - - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Velg mappe - - - Select which directory you want to install to. - Velg hvilken mappe du vil installere til. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - - - MainWindow - - Open/Add Elf Folder - Åpne/Legg til Elf-mappe - - - Install Packages (PKG) - Installer pakker (PKG) - - - Boot Game - Start spill - - - Check for Updates - Se etter oppdateringer - - - About shadPS4 - Om shadPS4 - - - Configure... - Konfigurer... - - - Install application from a .pkg file - Installer fra en .pkg fil - - - Recent Games - Nylige spill - - - Open shadPS4 Folder - Open shadPS4 Folder - - - Exit - Avslutt - - - Exit shadPS4 - Avslutt shadPS4 - - - Exit the application. - Avslutt programmet. - - - Show Game List - Vis spill-listen - - - Game List Refresh - Oppdater spill-listen - - - Tiny - Bitteliten - - - Small - Liten - - - Medium - Medium - - - Large - Stor - - - List View - Liste-visning - - - Grid View - Rute-visning - - - Elf Viewer - Elf-visning - - - Game Install Directory - Spillinstallasjons-mappe - - - Download Cheats/Patches - Last ned juks/programrettelse - - - Dump Game List - Dump spill-liste - - - PKG Viewer - PKG viser - - - Search... - Søk... - - - File - Fil - - - View - Oversikt - - - Game List Icons - Spill-liste ikoner - - - Game List Mode - Spill-liste modus - - - Settings - Innstillinger - - - Utils - Verktøy - - - Themes - Tema - - - Help - Hjelp - - - Dark - Mørk - - - Light - Lys - - - Green - Grønn - - - Blue - Blå - - - Violet - Lilla - - - toolBar - Verktøylinje - - - Game List - Spill-liste - - - * Unsupported Vulkan Version - * Ustøttet Vulkan-versjon - - - Download Cheats For All Installed Games - Last ned juks for alle installerte spill - - - Download Patches For All Games - Last ned programrettelser for alle spill - - - Download Complete - Nedlasting fullført - - - You have downloaded cheats for all the games you have installed. - Du har lastet ned juks for alle spillene du har installert. - - - Patches Downloaded Successfully! - Programrettelser ble lastet ned! - - - All Patches available for all games have been downloaded. - Programrettelser tilgjengelige for alle spill har blitt lastet ned. - - - Games: - Spill: - - - ELF files (*.bin *.elf *.oelf) - ELF-filer (*.bin *.elf *.oelf) - - - Game Boot - Spilloppstart - - - Only one file can be selected! - Kun én fil kan velges! - - - PKG Extraction - PKG-utpakking - - - Patch detected! - Programrettelse oppdaget! - - - PKG and Game versions match: - PKG og spillversjoner stemmer overens: - - - Would you like to overwrite? - Ønsker du å overskrive? - - - PKG Version %1 is older than installed version: - PKG-versjon %1 er eldre enn installert versjon: - - - Game is installed: - Spillet er installert: - - - Would you like to install Patch: - Ønsker du å installere programrettelsen: - - - DLC Installation - DLC installasjon - - - Would you like to install DLC: %1? - Ønsker du å installere DLC: %1? - - - DLC already installed: - DLC allerede installert: - - - Game already installed - Spillet er allerede installert - - - PKG ERROR - PKG FEIL - - - Extracting PKG %1/%2 - Pakker ut PKG %1/%2 - - - Extraction Finished - Utpakking fullført - - - Game successfully installed at %1 - Spillet ble installert i %1 - - - File doesn't appear to be a valid PKG file - Filen ser ikke ut til å være en gyldig PKG-fil - - - Run Game - Run Game - - - Eboot.bin file not found - Eboot.bin file not found - - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - - - Game is already running! - Game is already running! - - - shadPS4 - shadPS4 - - - - PKGViewer - - Open Folder - Åpne mappe - - - PKG ERROR - PKG FEIL - - - Name - Navn - - - Serial - Serienummer - - - Installed - Installed - - - Size - Størrelse - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Region - - - Flags - Flags - - - Path - Adresse - - - File - Fil - - - Unknown - Ukjent - - - Package - Package - - - - SettingsDialog - - Settings - Innstillinger - - - General - Generell - - - System - System - - - Console Language - Konsollspråk - - - Emulator Language - Emulatorspråk - - - Emulator - Emulator - - - Enable Fullscreen - Aktiver fullskjerm - - - Fullscreen Mode - Fullskjermmodus - - - Enable Separate Update Folder - Aktiver seperat oppdateringsmappe - - - Default tab when opening settings - Standardfanen når innstillingene åpnes - - - Show Game Size In List - Vis spillstørrelse i listen - - - Show Splash - Vis velkomstbilde - - - Enable Discord Rich Presence - Aktiver Discord Rich Presence - - - Username - Brukernavn - - - Trophy Key - Trofénøkkel - - - Trophy - Trofé - - - Logger - Logger - - - Log Type - Logg type - - - Log Filter - Logg filter - - - Open Log Location - Åpne loggplassering - - - Input - Inndata - - - Cursor - Musepeker - - - Hide Cursor - Skjul musepeker - - - Hide Cursor Idle Timeout - Skjul musepeker ved inaktivitet - - - s - s - - - Controller - Kontroller - - - Back Button Behavior - Tilbakeknapp atferd - - - Graphics - Grafikk - - - GUI - Grensesnitt - - - User - Bruker - - - Graphics Device - Grafikkenhet - - - Width - Bredde - - - Height - Høyde - - - Vblank Divider - Vblank skillelinje - - - Advanced - Avansert - - - Enable Shaders Dumping - Aktiver skyggeleggerdumping - - - Enable NULL GPU - Aktiver NULL GPU - - - Enable HDR - Enable HDR - - - Paths - Mapper - - - Game Folders - Spillmapper - - - Add... - Legg til... - - - Remove - Fjern - - - Debug - Feilretting - - - Enable Debug Dumping - Aktiver feilrettingsdumping - - - Enable Vulkan Validation Layers - Aktiver Vulkan Validation Layers - - - Enable Vulkan Synchronization Validation - Aktiver Vulkan synkroniseringslag - - - Enable RenderDoc Debugging - Aktiver RenderDoc feilretting - - - Enable Crash Diagnostics - Aktiver krasjdiagnostikk - - - Collect Shaders - Lagre skyggeleggere - - - Copy GPU Buffers - Kopier GPU-buffere - - - Host Debug Markers - Vertsfeilsøkingsmarkører - - - Guest Debug Markers - Gjestefeilsøkingsmarkører - - - Update - Oppdatering - - - Check for Updates at Startup - Se etter oppdateringer ved oppstart - - - Always Show Changelog - Always Show Changelog - - - Update Channel - Oppdateringskanal - - - Check for Updates - Se etter oppdateringer - - - GUI Settings - Grensesnitt-innstillinger - - - Title Music - Tittelmusikk - - - Disable Trophy Pop-ups - Deaktiver trofé hurtigmeny - - - Background Image - Bakgrunnsbilde - - - Show Background Image - Vis bakgrunnsbilde - - - Opacity - Synlighet - - - Play title music - Spill tittelmusikk - - - Update Compatibility Database On Startup - Oppdater database ved oppstart - - - Game Compatibility - Spill kompatibilitet - - - Display Compatibility Data - Vis kompatibilitets-data - - - Update Compatibility Database - Oppdater kompatibilitets-database - - - Volume - Volum - - - Save - Lagre - - - Apply - Bruk - - - Restore Defaults - Gjenopprett standardinnstillinger - - - Close - Lukk - - - Point your mouse at an option to display its description. - Pek musen over et alternativ for å vise beskrivelsen. - - - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - Konsollspråk:\nAngir språket som PS4-spillet bruker.\nDet anbefales å sette dette til et språk som spillet støtter, noe som kan variere avhengig av region. - - - Emulator Language:\nSets the language of the emulator's user interface. - Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. - - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. - - - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. - - - Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - Vis velkomstbilde:\nViser spillets velkomstbilde (et spesialbilde) når spillet starter. - - - Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. - Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. - - - Username:\nSets the PS4's account username, which may be displayed by some games. - Brukernavn:\nAngir brukernavnet for PS4-kontoen, som kan vises av enkelte spill. - - - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trofénøkkel:\nNøkkel brukes til å dekryptere trofeer. Må hentes fra din konsoll (jailbroken).\nMå bare inneholde sekskantede tegn. - - - Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. - - - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. - - - Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. - - - Background Image:\nControl the opacity of the game background image. - Bakgrunnsbilde:\nEndrer synligheten til spillets bakgrunnsbilde. - - - Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. - - - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). - - - Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - Skjul musepeker:\nVelg når musepekeren skal forsvinne:\nAldri: Du vil alltid se musepekeren.\nInaktiv: Sett en tid for at den skal forsvinne etter å ha vært inaktiv.\nAlltid: du vil aldri se musepekeren. - - - Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Sett en tid for når musepekeren forsvinner etter å ha vært inaktiv. - - - Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - Atferd for tilbaketasten:\nSetter tilbaketasten på kontrolleren til å imitere et trykk på den angitte posisjonen på PS4s berøringsplate. - - - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. - - - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Oppdater database ved oppstart:\nOppdaterer kompatibilitets-databasen automatisk når shadPS4 starter. - - - Update Compatibility Database:\nImmediately update the compatibility database. - Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. - - - Never - Aldri - - - Idle - Inaktiv - - - Always - Alltid - - - Touchpad Left - Berøringsplate Venstre - - - Touchpad Right - Berøringsplate Høyre - - - Touchpad Center - Berøringsplate Midt - - - None - Ingen - - - Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. - - - Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. - - - Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - Vblank skillelinje:\nBildehastigheten som emulatoren oppdaterer ved, multipliseres med dette tallet. Endring av dette kan ha negative effekter, som å øke hastigheten av spillet, eller ødelegge kritisk spillfunksjonalitet som ikke forventer at dette endres! - - - Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. - - - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. - - - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - - - Game Folders:\nThe list of folders to check for installed games. - Spillmapper:\nListe over mapper som brukes for å se etter installerte spill. - - - Add:\nAdd a folder to the list. - Legg til:\nLegg til en mappe til listen. - - - Remove:\nRemove a folder from the list. - Fjern:\nFjern en mappe fra listen. - - - Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. - - - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - - - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. - - - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. - - - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). - - - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. - - - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Kopier GPU-buffere:\nKommer rundt løpsforhold som involverer GPU-innsendinger.\nKan muligens hjelpe med PM4 type 0 krasj. - - - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - - - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. - - - Save Data Path:\nThe folder where game save data will be saved. - Lagrede datamappe:\nListe over data shadPS4 lagrer. - - - Browse:\nBrowse for a folder to set as the save data path. - Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. - - - Borderless - Borderless - - - True - True - - - Release - Release - - - Nightly - Nightly - - - Set the volume of the background music. - Set the volume of the background music. - - - Enable Motion Controls - Enable Motion Controls - - - Save Data Path - Lagrede datamappe - - - Browse - Endre mappe - - - async - async - - - sync - sync - - - Auto Select - Auto Select - - - Directory to install games - Mappe for å installere spill - - - Directory to save data - Directory to save data - - - - TrophyViewer - - Trophy Viewer - Trofé viser - - - From e13fb2e366042ab66a57a5298101fdb4bba66674 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sun, 16 Feb 2025 05:08:16 -0800 Subject: [PATCH 303/455] renderer_vulkan: Bind descriptors to specific stages in layout. (#2458) --- .../renderer_vulkan/vk_graphics_pipeline.cpp | 18 ++++++++++++++---- .../renderer_vulkan/vk_pipeline_common.cpp | 2 +- .../renderer_vulkan/vk_pipeline_common.h | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 2c432e9bf..901096259 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -19,6 +19,15 @@ namespace Vulkan { using Shader::Backend::SPIRV::AuxShaderType; +static constexpr std::array LogicalStageToStageBit = { + vk::ShaderStageFlagBits::eFragment, + vk::ShaderStageFlagBits::eTessellationControl, + vk::ShaderStageFlagBits::eTessellationEvaluation, + vk::ShaderStageFlagBits::eVertex, + vk::ShaderStageFlagBits::eGeometry, + vk::ShaderStageFlagBits::eCompute, +}; + GraphicsPipeline::GraphicsPipeline( const Instance& instance, Scheduler& scheduler, DescriptorHeap& desc_heap, const Shader::Profile& profile, const GraphicsPipelineKey& key_, @@ -34,7 +43,7 @@ GraphicsPipeline::GraphicsPipeline( const auto debug_str = GetDebugString(); const vk::PushConstantRange push_constants = { - .stageFlags = gp_stage_flags, + .stageFlags = AllGraphicsStageBits, .offset = 0, .size = sizeof(Shader::PushData), }; @@ -352,6 +361,7 @@ void GraphicsPipeline::BuildDescSetLayout() { if (!stage) { continue; } + const auto stage_bit = LogicalStageToStageBit[u32(stage->l_stage)]; for (const auto& buffer : stage->buffers) { const auto sharp = buffer.GetSharp(*stage); bindings.push_back({ @@ -360,7 +370,7 @@ void GraphicsPipeline::BuildDescSetLayout() { ? vk::DescriptorType::eStorageBuffer : vk::DescriptorType::eUniformBuffer, .descriptorCount = 1, - .stageFlags = gp_stage_flags, + .stageFlags = stage_bit, }); } for (const auto& image : stage->images) { @@ -369,7 +379,7 @@ void GraphicsPipeline::BuildDescSetLayout() { .descriptorType = image.is_written ? vk::DescriptorType::eStorageImage : vk::DescriptorType::eSampledImage, .descriptorCount = 1, - .stageFlags = gp_stage_flags, + .stageFlags = stage_bit, }); } for (const auto& sampler : stage->samplers) { @@ -377,7 +387,7 @@ void GraphicsPipeline::BuildDescSetLayout() { .binding = binding++, .descriptorType = vk::DescriptorType::eSampler, .descriptorCount = 1, - .stageFlags = gp_stage_flags, + .stageFlags = stage_bit, }); } } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp index bf43257f8..96e19d6a1 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp @@ -37,7 +37,7 @@ void Pipeline::BindResources(DescriptorWrites& set_writes, const BufferBarriers& cmdbuf.pipelineBarrier2(dependencies); } - const auto stage_flags = IsCompute() ? vk::ShaderStageFlagBits::eCompute : gp_stage_flags; + const auto stage_flags = IsCompute() ? vk::ShaderStageFlagBits::eCompute : AllGraphicsStageBits; cmdbuf.pushConstants(*pipeline_layout, stage_flags, 0u, sizeof(push_data), &push_data); // Bind descriptor set. diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.h b/src/video_core/renderer_vulkan/vk_pipeline_common.h index e9e6fed01..9633fc4ea 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_common.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.h @@ -15,7 +15,7 @@ class BufferCache; namespace Vulkan { -static constexpr auto gp_stage_flags = +static constexpr auto AllGraphicsStageBits = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eTessellationControl | vk::ShaderStageFlagBits::eTessellationEvaluation | vk::ShaderStageFlagBits::eGeometry | vk::ShaderStageFlagBits::eFragment; From 0425bd0fd632bbc39beec883b1d1e5a6381b5c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:36:29 +0100 Subject: [PATCH 304/455] Qt: Fix Small Window (#2449) --- src/qt_gui/main_window.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 5cbce1884..7eca2e10f 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -57,7 +57,7 @@ bool MainWindow::Init() { SetLastIconSizeBullet(); GetPhysicalDevices(); // show ui - setMinimumSize(350, minimumSizeHint().height()); + setMinimumSize(720, 405); std::string window_title = ""; if (Common::isRelease) { window_title = fmt::format("shadPS4 v{}", Common::VERSION); From e9b44af46969dd0f19ef2b89d1e6b597dba32695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:36:41 +0100 Subject: [PATCH 305/455] Qt: Use Qt::SmoothTransformation for Cheats Manager (#2450) --- src/qt_gui/cheats_patches.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index e9db88381..01227d822 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -71,7 +71,8 @@ void CheatsPatches::setupUI() { QLabel* gameImageLabel = new QLabel(); if (!m_gameImage.isNull()) { - gameImageLabel->setPixmap(m_gameImage.scaled(275, 275, Qt::KeepAspectRatio)); + gameImageLabel->setPixmap( + m_gameImage.scaled(275, 275, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } else { gameImageLabel->setText(tr("No Image Available")); } @@ -1431,4 +1432,4 @@ void CheatsPatches::onPatchCheckBoxHovered(QCheckBox* checkBox, bool hovered) { } else { instructionsTextEdit->setText(defaultTextEdit_MSG); } -} \ No newline at end of file +} From 679f8f1f36df8f9c545e2221ea63be98686cab65 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:36:56 +0800 Subject: [PATCH 306/455] Add default values for Lightbar sliders and checkbox, per-game config (#2454) * Update control_settings.cpp * Add default for per game config checkbox as well --- src/qt_gui/control_settings.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qt_gui/control_settings.cpp b/src/qt_gui/control_settings.cpp index 73622e6b0..0b96eee26 100644 --- a/src/qt_gui/control_settings.cpp +++ b/src/qt_gui/control_settings.cpp @@ -306,6 +306,12 @@ void ControlSettings::SetDefault() { ui->LeftDeadzoneSlider->setValue(2); ui->RightDeadzoneSlider->setValue(2); + + ui->RSlider->setValue(0); + ui->GSlider->setValue(0); + ui->BSlider->setValue(255); + ui->LightbarCheckBox->setChecked(false); + ui->PerGameCheckBox->setChecked(false); } void ControlSettings::AddBoxItems() { From 90c01f8d922d4cccd41f817940b45c3603a5f332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:37:11 +0100 Subject: [PATCH 307/455] Qt: Center Installation Dialog (#2453) --- src/qt_gui/main_window.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 7eca2e10f..949d7062e 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -965,6 +965,9 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int dialog.setAutoClose(true); dialog.setRange(0, nfiles); + dialog.setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, + dialog.size(), this->geometry())); + QFutureWatcher futureWatcher; connect(&futureWatcher, &QFutureWatcher::finished, this, [=, this]() { if (pkgNum == nPkg) { From 195b94c1f1b977fbe31bf1ead4167314ac045a6d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 17 Feb 2025 12:38:02 +0200 Subject: [PATCH 308/455] New Crowdin updates (#2460) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Albanian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Norwegian Bokmal) --- src/qt_gui/translations/nb_NO.ts | 220 ++++----- src/qt_gui/translations/pt_BR.ts | 6 +- src/qt_gui/translations/pt_PT.ts | 780 +++++++++++++++---------------- src/qt_gui/translations/sq_AL.ts | 14 +- 4 files changed, 510 insertions(+), 510 deletions(-) diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 934612683..efeb955fb 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -11,7 +11,7 @@ shadPS4 - shadPS4 + shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -230,7 +230,7 @@ Directory does not exist: - Mappen eksisterer ikke: + Mappa eksisterer ikke: Failed to open files.json for reading. @@ -411,87 +411,87 @@ ControlSettings Configure Controls - Configure Controls + Sett opp kontroller Control Settings - Control Settings + Kontrollinnstillinger D-Pad - D-Pad + D-Pad Up - Up + Opp Left - Left + Venstre Right - Right + Høyre Down - Down + Ned Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Venstre analog dødsone (def:2, maks:127) Left Deadzone - Left Deadzone + Venstre dødsone Left Stick - Left Stick + Venstre analog Config Selection - Config Selection + Utvalg av oppsett Common Config - Common Config + Felles oppsett Use per-game configs - Use per-game configs + Bruk oppsett per spill L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + Mus/tastatur oppsett KBM Editor - KBM Editor + Rediger mus/tastatur Back - Back + Tilbake R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start @@ -499,39 +499,39 @@ R3 - R3 + R3 Face Buttons - Face Buttons + Handlingsknapper Triangle / Y - Triangle / Y + Triangel / Y Square / X - Square / X + Firkant / X Circle / B - Circle / B + Sirkel / B Cross / A - Cross / A + Kryss / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Høyre analog dødsone (def:2, maks:127) Right Deadzone - Right Deadzone + Høyre dødsone Right Stick - Right Stick + Høyre analog @@ -576,7 +576,7 @@ Directory to install DLC - Directory to install DLC + Mappe for å installere DLC @@ -599,7 +599,7 @@ Region - Region + Region Firmware @@ -627,15 +627,15 @@ h - h + h m - m + m s - s + s Compatibility is untested @@ -674,23 +674,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -717,15 +717,15 @@ Open Game Folder - Åpne spillmappen + Åpne spillmappa Open Save Data Folder - Åpne lagrede datamappen + Åpne lagrede datamappa Open Log Folder - Åpne loggmappen + Åpne loggmappa Copy info... @@ -821,7 +821,7 @@ DLC - DLC + DLC Delete %1 @@ -833,27 +833,27 @@ Open Update Folder - Open Update Folder + Åpne oppdateringsmappa Delete Save Data - Delete Save Data + Slett lagret data This game has no update folder to open! - This game has no update folder to open! + Dette spillet har ingen oppdateringsmappe å åpne! Failed to convert icon. - Failed to convert icon. + Klarte ikke konvertere ikon. This game has no save data to delete! - This game has no save data to delete! + Dette spillet har ingen lagret data å slette! Save Data - Save Data + Lagret data @@ -868,11 +868,11 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Installer alle i kø til den valgte mappa Delete PKG File on Install - Delete PKG File on Install + Slett PKG-fila ved installering @@ -899,7 +899,7 @@ Configure... - Konfigurer... + Sett opp... Install application from a .pkg file @@ -911,7 +911,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Åpne shadPS4 mappa Exit @@ -943,7 +943,7 @@ Medium - Medium + Middels Large @@ -1151,27 +1151,27 @@ Run Game - Run Game + Kjør spill Eboot.bin file not found - Eboot.bin file not found + Klarte ikke finne Eboot.bin-fila PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + PKG-fil (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG er en programrettelse eller DLC. Installer spillet først! Game is already running! - Game is already running! + Spillet kjører allerede! shadPS4 - shadPS4 + shadPS4 @@ -1194,7 +1194,7 @@ Installed - Installed + Installert Size @@ -1202,27 +1202,27 @@ Category - Category + Kategori Type - Type + Type App Ver - App Ver + Programversjon FW - FW + FV Region - Region + Region Flags - Flags + Flagg Path @@ -1238,7 +1238,7 @@ Package - Package + Pakke @@ -1253,7 +1253,7 @@ System - System + System Console Language @@ -1265,11 +1265,11 @@ Emulator - Emulator + Emulator Enable Fullscreen - Aktiver fullskjerm + Bruk fullskjerm Fullscreen Mode @@ -1277,7 +1277,7 @@ Enable Separate Update Folder - Aktiver seperat oppdateringsmappe + Bruk seperat oppdateringsmappe Default tab when opening settings @@ -1293,7 +1293,7 @@ Enable Discord Rich Presence - Aktiver Discord Rich Presence + Bruk Discord Rich Presence Username @@ -1309,7 +1309,7 @@ Logger - Logger + Loggføring Log Type @@ -1341,7 +1341,7 @@ s - s + s Controller @@ -1385,15 +1385,15 @@ Enable Shaders Dumping - Aktiver skyggeleggerdumping + Bruk skyggeleggerdumping Enable NULL GPU - Aktiver NULL GPU + Bruk NULL GPU Enable HDR - Enable HDR + Bruk HDR Paths @@ -1417,23 +1417,23 @@ Enable Debug Dumping - Aktiver feilrettingsdumping + Bruk feilrettingsdumping Enable Vulkan Validation Layers - Aktiver Vulkan Validation Layers + Bruk Vulkan Validation Layers Enable Vulkan Synchronization Validation - Aktiver Vulkan synkroniseringslag + Bruk Vulkan Validation Layers Enable RenderDoc Debugging - Aktiver RenderDoc feilretting + Bruk RenderDoc feilsøking Enable Crash Diagnostics - Aktiver krasjdiagnostikk + Bruk krasjdiagnostikk Collect Shaders @@ -1461,7 +1461,7 @@ Always Show Changelog - Always Show Changelog + Vis alltid endringsloggen Update Channel @@ -1549,11 +1549,11 @@ Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Aktiver fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. + Bruk fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Aktiver separat oppdateringsmappe:\nAktiverer installering av spill i en egen mappe for enkel administrasjon. + Bruk separat oppdateringsmappe:\n Gjør det mulig å installere spilloppdateringer i en egen mappe for enkel administrasjon.\nDette kan gjøres manuelt ved å legge til den utpakkede oppdateringen, til spillmappa med navnet "CUSA00000-UPDATE" der CUSA-ID-en samsvarer med spillets-ID. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1561,7 +1561,7 @@ Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. - Aktiver Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. + Bruk Discord Rich Presence:\nViser emulatorikonet og relevant informasjon på Discord-profilen din. Username:\nSets the PS4's account username, which may be displayed by some games. @@ -1589,7 +1589,7 @@ Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - Spille tittelmusikk:\nHvis et spill støtter det, så aktiveres det spesiell musikk når du velger spillet i menyen. + Spill av tittelmusikk:\nHvis et spill støtter det, så brukes det spesiell musikk når du velger spillet i menyen. Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). @@ -1609,7 +1609,7 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Aktiver "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. + Vis kompatibilitets-data:\nViser informasjon om spillkompatibilitet i tabellvisning. Bruk "Oppdater kompatibilitets-data ved oppstart" for oppdatert informasjon. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. @@ -1649,7 +1649,7 @@ Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller velg "Auto Select" for å velge automatisk. + Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller "Velg automatisk". Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. @@ -1661,15 +1661,15 @@ Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Aktiver skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. + Bruk skyggeleggerdumping:\nFor teknisk feilsøking lagrer skyggeleggerne fra spillet i en mappe mens de gjengis. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - Aktiver Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noe grafikkort. + Bruk Null GPU:\nFor teknisk feilsøking deaktiverer spillets-gjengivelse som om det ikke var noen grafikkort. Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Bruk HDR:\nTillater bruk av HDR i spill som støtter det.\nSkjermen din må ha støtte for BT2020 PQ fargerom og RGB10A2 swapchain-format. Game Folders:\nThe list of folders to check for installed games. @@ -1685,27 +1685,27 @@ Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - Aktiver feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskriftsinformasjonen til det nåværende kjørende PS4-programmet i en katalog. + Bruk feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskrifts-informasjonen til det nåværende kjørende PS4-programmet i en mappe. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Aktiver Vulkan Validation Layers:\nAktiverer et system som validerer tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + Bruk Vulkan Validation Layers:\nAktiverer et system som bekrefter tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand.\n Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Aktiver Vulkan synkronisering validering:\nAktiverer et system som validerer frekvens tiden av Vulkan-gjengivelsensoppgaver. Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + Bruk Vulkan synkronisering validering:\nEt system som bekrefter frekvens tiden av Vulkan-gjengivelseoppgaver.\nDette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - Aktiver RenderDoc feilsøking:\nHvis aktivert, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. + Bruk RenderDoc feilsøking:\nHvis brukt, vil emulatoren gi kompatibilitet med RenderDoc for å tillate opptak og analyse av det nåværende gjengitte bildet. Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Lagre skyggeleggere:\nDu trenger dette aktivert for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). + Lagre skyggeleggere:\nDu trenger dette for å redigere skyggeleggerne med feilsøkingsmenyen (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis du har dette aktivert, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. + Krasjdiagnostikk:\nOppretter en .yaml-fil med informasjon om Vulkan-tilstanden ved krasj.\nNyttig for feilsøking 'Device lost' feil. Hvis dette brukes, burde du aktivere vert OG gjestefeilsøkingsmarkører.\nFunker ikke med Intel GPU-er.\nDu trenger Vulkan Validation Layers og Vulkan SDK for at dette skal fungere. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. @@ -1713,11 +1713,11 @@ Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + Vertsfeilsøkingsmarkører:\nSetter inn emulator-side informasjon som markører for spesifikke AMDGPU-kommandoer rundt Vulkan-kommandoer, i tillegg til å gi ressurser feilrettingsnavn.\nHvis dette brukes, burde du også bruke krasjdiagnostikk.\nNyttig for programmer som RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis du har dette aktivert, burde du aktivere krasjdiagnostikk.\nNyttig for programmer som RenderDoc. + Gjestefeilsøkingsmarkører:\nSetter inn eventuelle feilsøkingsmarkører spillet selv har lagt til kommandobufferen.\nHvis dette brukes, burde du også bruke krasjdiagnostikk.\nNyttig for programmer som RenderDoc. Save Data Path:\nThe folder where game save data will be saved. @@ -1729,11 +1729,11 @@ Borderless - Borderless + Kantløs True - True + Sant Release @@ -1745,11 +1745,11 @@ Set the volume of the background music. - Set the volume of the background music. + Sett volumet til bakgrunnsmusikken. Enable Motion Controls - Enable Motion Controls + Bruk bevegelseskontroller Save Data Path @@ -1769,7 +1769,7 @@ Auto Select - Auto Select + Velg automatisk Directory to install games @@ -1777,7 +1777,7 @@ Directory to save data - Directory to save data + Mappe for lagring av data diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index be9c4d11b..6234a1d86 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -19,7 +19,7 @@ This software should not be used to play games you have not legally obtained. - Este programa não deve ser usado para jogar jogos piratas. + Este programa não deve ser usado para jogar jogos que tenham sido obtidos ilegalmente. @@ -281,7 +281,7 @@ No download URL found for the specified asset. - Nenhuma URL de download encontrada para o asset especificado. + Nenhuma URL de download encontrada para o recurso especificado. Your version is already up to date! @@ -1585,7 +1585,7 @@ Background Image:\nControl the opacity of the game background image. - Imagem de Fundo:\nControla a opacidade da imagem de fundo do jogo. + Imagem de Fundo:\nControla a transparência da imagem de fundo do jogo. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 1a63c88fd..33fd53953 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -26,1088 +26,1088 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + Cheats / Patches para Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n + Cheats/Patches são experimentais.\nUse com caução.\n\nTransfira os cheats individualmente selecionando o repositório e clicando no botão de transferência.\nNa aba Patches, poderá transferir todos os Patches de uma vez, escolher o qual deseja usar e guardar as suas definições.\n\nComo nós não desenvolvemos os Cheats/Patches,\npor favor, reporte os problemas relacionados com o cheat ao autor deste.\n\nCriou um novo cheat? Visite:\n No Image Available - No Image Available + Nenhuma Imagem Disponível Serial: - Serial: + Número de série: Version: - Version: + Versão: Size: - Size: + Tamanho: Select Cheat File: - Select Cheat File: + Selecionar Ficheiro de Cheat: Repository: - Repository: + Repositório: Download Cheats - Download Cheats + Transferir Cheats Delete File - Delete File + Eliminar Ficheiro No files selected. - No files selected. + Nenhum ficheiro selecionado. You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. + Poderá eliminar os cheats que não deseja após os transferir. Do you want to delete the selected file?\n%1 - Do you want to delete the selected file?\n%1 + Pretende eliminar o ficheiro selecionado?\n%1 Select Patch File: - Select Patch File: + Selecionar Ficheiro de Patch: Download Patches - Download Patches + Transferir Patches Save - Save + Guardar Cheats - Cheats + Cheats Patches - Patches + Patches Error - Error + Erro No patch selected. - No patch selected. + Nenhum patch selecionado. Unable to open files.json for reading. - Unable to open files.json for reading. + Não foi possível abrir files.json para leitura. No patch file found for the current serial. - No patch file found for the current serial. + Nenhum ficheiro de patch encontrado para o número de série atual. Unable to open the file for reading. - Unable to open the file for reading. + Não foi possível abrir o ficheiro para leitura. Unable to open the file for writing. - Unable to open the file for writing. + Não foi possível abrir o ficheiro para escrita. Failed to parse XML: - Failed to parse XML: + Erro ao interpretar XML: Success - Success + Sucesso Options saved successfully. - Options saved successfully. + Opções guardadas com sucesso. Invalid Source - Invalid Source + Fonte Inválida The selected source is invalid. - The selected source is invalid. + A fonte selecionada é inválida. File Exists - File Exists + O Ficheiro já Existe File already exists. Do you want to replace it? - File already exists. Do you want to replace it? + O ficheiro já existe. Deseja substituí-lo? Failed to save file: - Failed to save file: + Erro ao guardar o ficheiro: Failed to download file: - Failed to download file: + Erro ao transferir o ficheiro: Cheats Not Found - Cheats Not Found + Cheats Não Encontrados No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. + Não foi encontrado nenhum Cheat para esta versão do jogo no repositório selecionado, tente outro repositório ou uma versão diferente do jogo. Cheats Downloaded Successfully - Cheats Downloaded Successfully + Cheats Transferidos com Sucesso You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. + Transferiu os cheats para esta versão do jogo através do repositório selecionado com sucesso. Poderá tentar transferir de outro repositório, e se disponível, será possível utilizá-lo selecionando o ficheiro a partir da lista. Failed to save: - Failed to save: + Erro ao guardar: Failed to download: - Failed to download: + Erro ao transferir: Download Complete - Download Complete + Transferência Concluída Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. + Patches Transferidos com Sucesso! Foram transferidos todos os patches disponíveis para todos os jogos, não sendo necessário transferir individualmente para cada jogo como acontece com os Cheats. Se o patch não aparecer, pode ser que não esteja disponível para o número de série e versão específicos do jogo. Failed to parse JSON data from HTML. - Failed to parse JSON data from HTML. + Falha ao interpretar dados JSON através do HTML. Failed to retrieve HTML page. - Failed to retrieve HTML page. + Falha ao recuperar a página HTML. The game is in version: %1 - The game is in version: %1 + O jogo está na versão: %1 The downloaded patch only works on version: %1 - The downloaded patch only works on version: %1 + O patch transferido só funciona na versão: %1 You may need to update your game. - You may need to update your game. + Talvez seja necessário atualizar o seu jogo. Incompatibility Notice - Incompatibility Notice + Aviso de Incompatibilidade Failed to open file: - Failed to open file: + Erro ao abrir o ficheiro: XML ERROR: - XML ERROR: + ERRO XML: Failed to open files.json for writing - Failed to open files.json for writing + Não foi possível abrir files.json para escrita Author: - Author: + Autor: Directory does not exist: - Directory does not exist: + A pasta não existe: Failed to open files.json for reading. - Failed to open files.json for reading. + Não foi possível abrir files.json para leitura. Name: - Name: + Nome: Can't apply cheats before the game is started - Can't apply cheats before the game is started + Não é possível aplicar cheats antes de iniciar o jogo Close - Close + Fechar CheckUpdate Auto Updater - Auto Updater + Atualizador Automático Error - Error + Erro Network error: - Network error: + Erro de rede: The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. - The Auto Updater allows up to 60 update checks per hour.\nYou have reached this limit. Please try again later. + O Atualizador Automático permite até 60 verificações de atualização por hora.\nJá atingiu este limite. Por favor, tente novamente mais tarde. Failed to parse update information. - Failed to parse update information. + Falha ao interpretar as informações de atualização. No pre-releases found. - No pre-releases found. + Nenhuma versão de pré-lançamento encontrada. Invalid release data. - Invalid release data. + Dados de lançamento inválidos. No download URL found for the specified asset. - No download URL found for the specified asset. + Nenhum URL de transferência encontrado para o recurso especificado. Your version is already up to date! - Your version is already up to date! + A sua versão já é a mais recente! Update Available - Update Available + Atualização Disponível Update Channel - Update Channel + Canal de Atualização Current Version - Current Version + Versão Atual Latest Version - Latest Version + Última Versão Do you want to update? - Do you want to update? + Deseja atualizar? Show Changelog - Show Changelog + Mostrar Lista de Alterações Check for Updates at Startup - Check for Updates at Startup + Procurar Atualizações ao Iniciar Update - Update + Atualizar No - No + Não Hide Changelog - Hide Changelog + Ocultar Lista de Alterações Changes - Changes + Alterações Network error occurred while trying to access the URL - Network error occurred while trying to access the URL + Ocorreu um erro de rede ao tentar aceder ao URL Download Complete - Download Complete + Transferência Concluída The update has been downloaded, press OK to install. - The update has been downloaded, press OK to install. + A atualização foi transferida, pressione OK para instalar. Failed to save the update file at - Failed to save the update file at + Erro ao guardar o ficheiro de atualização em Starting Update... - Starting Update... + A Iniciar Atualização... Failed to create the update script file - Failed to create the update script file + Erro ao criar o ficheiro de script de atualização CompatibilityInfoClass Fetching compatibility data, please wait - Fetching compatibility data, please wait + A obter dados de compatibilidade, por favor aguarde Cancel - Cancel + Cancelar Loading... - Loading... + A Carregar... Error - Error + Erro Unable to update compatibility data! Try again later. - Unable to update compatibility data! Try again later. + Não foi possível atualizar os dados de compatibilidade! Tente novamente mais tarde. Unable to open compatibility_data.json for writing. - Unable to open compatibility_data.json for writing. + Não foi possível abrir compatibility_data.json para escrita. Unknown - Unknown + Desconhecido Nothing - Nothing + Nada Boots - Boots + Arranca Menus - Menus + Menus Ingame - Ingame + Em Jogo Playable - Playable + Jogável ControlSettings Configure Controls - Configure Controls + Configurar Comandos Control Settings - Control Settings + Definições do Comando D-Pad - D-Pad + Botões de Direção Up - Up + Cima Left - Left + Esquerda Right - Right + Direita Down - Down + Baixo Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Zona Morta do Manípulo Esquerdo (def: 2, max: 127) Left Deadzone - Left Deadzone + Zona Morta Esquerda Left Stick - Left Stick + Manípulo Esquerdo Config Selection - Config Selection + Seleção de Configuração Common Config - Common Config + Configuração Comum Use per-game configs - Use per-game configs + Utilizar configurações por jogo L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT KBM Controls - KBM Controls + Controlo KBM KBM Editor - KBM Editor + Editor KBM Back - Back + Voltar R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Opções / Start R3 - R3 + R3 Face Buttons - Face Buttons + Botões Frontais Triangle / Y - Triangle / Y + Triângulo / Y Square / X - Square / X + Quadrado / X Circle / B - Circle / B + Círculo / B Cross / A - Cross / A + Cruz / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Zona Morta do Manípulo Direito (def: 2, max: 127) Right Deadzone - Right Deadzone + Zona Morta Direita Right Stick - Right Stick + Manípulo Direito ElfViewer Open Folder - Open Folder + Abrir Pasta GameInfoClass Loading game list, please wait :3 - Loading game list, please wait :3 + A carregar a lista de jogos, por favor aguarde :3 Cancel - Cancel + Cancelar Loading... - Loading... + A Carregar... GameInstallDialog shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Escolher diretório Directory to install games - Directory to install games + Diretório onde instalar os jogos Browse - Browse + Procurar Error - Error + Erro Directory to install DLC - Directory to install DLC + Diretório onde instalar os DLC GameListFrame Icon - Icon + Ícone Name - Name + Nome Serial - Serial + Número de Série Compatibility - Compatibility + Compatibilidade Region - Region + Região Firmware - Firmware + Firmware Size - Size + Tamanho Version - Version + Versão Path - Path + Caminho Play Time - Play Time + Tempo de Jogo Never Played - Never Played + Nunca Jogado h - h + h m - m + m s - s + s Compatibility is untested - Compatibility is untested + A compatibilidade não foi testada Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + O jogo não arranca corretamente / bloqueia o emulador Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + O jogo arranca, mas não exibe nada Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + O jogo exibe imagem, mas não passa do menu Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + O jogo tem falhas ou desempenho que o tornam injogável Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + O jogo pode ser concluído com desempenho jogável e sem grandes problemas Click to see details on github - Click to see details on github + Clique para ver os detalhes no github Last updated - Last updated + Última atualização GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB GuiContextMenus Create Shortcut - Create Shortcut + Criar Atalho Cheats / Patches - Cheats / Patches + Cheats / Patches SFO Viewer - SFO Viewer + Visualizador SFO Trophy Viewer - Trophy Viewer + Visualizador de Troféus Open Folder... - Open Folder... + Abrir Pasta... Open Game Folder - Open Game Folder + Abrir Pasta do Jogo Open Save Data Folder - Open Save Data Folder + Abrir Pasta de Dados Guardados Open Log Folder - Open Log Folder + Abrir Pasta de Registo Copy info... - Copy info... + Copiar informação... Copy Name - Copy Name + Copiar Nome Copy Serial - Copy Serial + Copiar Número de Série Copy Version - Copy Version + Copiar Versão Copy Size - Copy Size + Copiar Tamanho Copy All - Copy All + Copiar Tudo Delete... - Delete... + Eliminar... Delete Game - Delete Game + Eliminar Jogo Delete Update - Delete Update + Eliminar Atualização Delete DLC - Delete DLC + Eliminar DLC Compatibility... - Compatibility... + Compatibilidade... Update database - Update database + Atualizar Base de Dados View report - View report + Ver relatório Submit a report - Submit a report + Submeter um relatório Shortcut creation - Shortcut creation + Criação de atalho Shortcut created successfully! - Shortcut created successfully! + Atalho criado com sucesso! Error - Error + Erro Error creating shortcut! - Error creating shortcut! + Erro ao criar atalho! Install PKG - Install PKG + Instalar PKG Game - Game + Jogo This game has no update to delete! - This game has no update to delete! + Este jogo não tem nenhuma atualização para eliminar! Update - Update + Atualizar This game has no DLC to delete! - This game has no DLC to delete! + Este jogo não tem nenhum DLC para eliminar! DLC - DLC + DLC Delete %1 - Delete %1 + Eliminar %1 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + Tem certeza de que deseja eliminar o diretório %2 de %1? Open Update Folder - Open Update Folder + Abrir Pasta da Atualização Delete Save Data - Delete Save Data + Eliminar Dados Guardados This game has no update folder to open! - This game has no update folder to open! + Este jogo não tem nenhuma pasta de atualização para abrir! Failed to convert icon. - Failed to convert icon. + Falha ao converter ícone. This game has no save data to delete! - This game has no save data to delete! + Este jogo não tem dados guardados para eliminar! Save Data - Save Data + Dados Guardados InstallDirSelect shadPS4 - Choose directory - shadPS4 - Choose directory + shadPS4 - Escolher diretório Select which directory you want to install to. - Select which directory you want to install to. + Selecione o diretório em que deseja instalar. Install All Queued to Selected Folder - Install All Queued to Selected Folder + Instalar Todos os Pendentes para a Pasta Selecionada Delete PKG File on Install - Delete PKG File on Install + Eliminar Ficheiro PKG após Instalação MainWindow Open/Add Elf Folder - Open/Add Elf Folder + Abrir/Adicionar pasta Elf Install Packages (PKG) - Install Packages (PKG) + Instalar Pacotes (PKG) Boot Game - Boot Game + Iniciar Jogo Check for Updates - Check for Updates + Procurar Atualizações About shadPS4 - About shadPS4 + Sobre o shadPS4 Configure... - Configure... + Configurar... Install application from a .pkg file - Install application from a .pkg file + Instalar aplicação através de um ficheiro .pkg Recent Games - Recent Games + Jogos Recentes Open shadPS4 Folder - Open shadPS4 Folder + Abrir Pasta do shadPS4 Exit - Exit + Sair Exit shadPS4 - Exit shadPS4 + Sair do shadPS4 Exit the application. - Exit the application. + Sair da aplicação. Show Game List - Show Game List + Mostrar Lista de Jogos Game List Refresh - Game List Refresh + Atualizar Lista de Jogos Tiny - Tiny + Muito Pequeno Small - Small + Pequeno Medium - Medium + Médio Large - Large + Grande List View - List View + Visualizar em Lista Grid View - Grid View + Visualizar em Grelha Elf Viewer - Elf Viewer + Visualizador Elf Game Install Directory - Game Install Directory + Diretório de Instalação dos Jogos Download Cheats/Patches - Download Cheats/Patches + Transferir Cheats/Patches Dump Game List - Dump Game List + Exportar Lista de Jogos PKG Viewer - PKG Viewer + Visualizador PKG Search... - Search... + Procurar... File - File + Ficheiro View - View + Ver Game List Icons - Game List Icons + Ícones da Lista de Jogos Game List Mode - Game List Mode + Modo da Lista de Jogos Settings - Settings + Definições Utils - Utils + Utilidades Themes - Themes + Temas Help - Help + Ajuda Dark - Dark + Escuro Light - Light + Claro Green - Green + Verde Blue - Blue + Azul Violet - Violet + Violeta toolBar - toolBar + Barra de Ferramentas Game List - Game List + Lista de Jogos * Unsupported Vulkan Version - * Unsupported Vulkan Version + * Versão do Vulkan não suportada Download Cheats For All Installed Games - Download Cheats For All Installed Games + Transferir Cheats para Todos os Jogos Instalados Download Patches For All Games - Download Patches For All Games + Transferir Patches para Todos os Jogos Download Complete - Download Complete + Transferência Concluída You have downloaded cheats for all the games you have installed. - You have downloaded cheats for all the games you have installed. + Transferiu cheats para todos os jogos instalados. Patches Downloaded Successfully! - Patches Downloaded Successfully! + Patches Transferidos com Sucesso! All Patches available for all games have been downloaded. - All Patches available for all games have been downloaded. + Foram transferidos todos os Patches disponíveis para os jogos. Games: - Games: + Jogos: ELF files (*.bin *.elf *.oelf) - ELF files (*.bin *.elf *.oelf) + Ficheiros ELF (*.bin *.elf *.oelf) Game Boot - Game Boot + Arranque do Jogo Only one file can be selected! - Only one file can be selected! + Apenas um ficheiro pode ser selecionado! PKG Extraction - PKG Extraction + Extração de PKG Patch detected! - Patch detected! + Patch detetado! PKG and Game versions match: - PKG and Game versions match: + As versões do PKG e do Jogo coincidem: Would you like to overwrite? - Would you like to overwrite? + Gostaria de substituir? PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: + A versão do PKG %1 é mais antiga do que a versão instalada: Game is installed: - Game is installed: + O jogo está instalado: Would you like to install Patch: @@ -1115,98 +1115,98 @@ DLC Installation - DLC Installation + Instalação de DLC Would you like to install DLC: %1? - Would you like to install DLC: %1? + Deseja instalar o DLC: %1? DLC already installed: - DLC already installed: + DLC já está instalado: Game already installed - Game already installed + O jogo já está instalado PKG ERROR - PKG ERROR + ERRO PKG Extracting PKG %1/%2 - Extracting PKG %1/%2 + A extrair PKG %1/%2 Extraction Finished - Extraction Finished + Extração Finalizada Game successfully installed at %1 - Game successfully installed at %1 + Jogo instalado com sucesso em %1 File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file + O ficheiro não aparenta ser um ficheiro PKG válido Run Game - Run Game + Executar Jogo Eboot.bin file not found - Eboot.bin file not found + Ficheiro eboot.bin não encontrado PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + Ficheiro PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + Este PKG é um patch ou DLC, por favor instale o respetivo jogo primeiro! Game is already running! - Game is already running! + O jogo já está a ser executado! shadPS4 - shadPS4 + shadPS4 PKGViewer Open Folder - Open Folder + Abrir Pasta PKG ERROR - PKG ERROR + ERRO PKG Name - Name + Nome Serial - Serial + Número de Série Installed - Installed + Instalado Size - Size + Tamanho Category - Category + Categoria Type - Type + Tipo App Ver @@ -1214,330 +1214,330 @@ FW - FW + FW Region - Region + Região Flags - Flags + Flags Path - Path + Caminho File - File + Ficheiro Unknown - Unknown + Desconhecido Package - Package + Pacote SettingsDialog Settings - Settings + Definições General - General + Geral System - System + Sistema Console Language - Console Language + Idioma da Consola Emulator Language - Emulator Language + Idioma do Emulador Emulator - Emulator + Emulador Enable Fullscreen - Enable Fullscreen + Ativar Ecrã Inteiro Fullscreen Mode - Fullscreen Mode + Modo de Ecrã Inteiro Enable Separate Update Folder - Enable Separate Update Folder + Ativar Pasta de Atualizações Separada Default tab when opening settings - Default tab when opening settings + Aba padrão ao abrir as definições Show Game Size In List - Show Game Size In List + Mostrar Tamanho do Jogo na Lista Show Splash - Show Splash + Mostrar Splash Enable Discord Rich Presence - Enable Discord Rich Presence + Ativar Discord Rich Presence Username - Username + Nome de Utilizador Trophy Key - Trophy Key + Chave de Troféus Trophy - Trophy + Troféus Logger - Logger + Registos Log Type - Log Type + Tipo de Registo Log Filter - Log Filter + Filtro do Registo Open Log Location - Open Log Location + Abrir Localização do Registo Input - Input + Entrada Cursor - Cursor + Cursor Hide Cursor - Hide Cursor + Ocultar Cursor Hide Cursor Idle Timeout - Hide Cursor Idle Timeout + Tempo de Espera para Ocultar Cursor s - s + s Controller - Controller + Comando Back Button Behavior - Back Button Behavior + Comportamento do Botão Voltar Graphics - Graphics + Gráficos GUI - GUI + GUI User - User + Utilizador Graphics Device - Graphics Device + Placa Gráfica Width - Width + Largura Height - Height + Altura Vblank Divider - Vblank Divider + Divisor Vblank Advanced - Advanced + Avançado Enable Shaders Dumping - Enable Shaders Dumping + Ativar Dumping de Shaders Enable NULL GPU - Enable NULL GPU + Ativar GPU NULL Enable HDR - Enable HDR + Ativar HDR Paths - Paths + Caminhos Game Folders - Game Folders + Pastas de Jogos Add... - Add... + Adicionar... Remove - Remove + Remover Debug - Debug + Depuração Enable Debug Dumping - Enable Debug Dumping + Ativar Dumping da Depuração Enable Vulkan Validation Layers - Enable Vulkan Validation Layers + Ativar Camadas de Validação do Vulkan Enable Vulkan Synchronization Validation - Enable Vulkan Synchronization Validation + Ativar Validação da Sincronização do Vulkan Enable RenderDoc Debugging - Enable RenderDoc Debugging + Ativar Depuração por RenderDoc Enable Crash Diagnostics - Enable Crash Diagnostics + Ativar Diagnóstico de Falhas Collect Shaders - Collect Shaders + Recolher Shaders Copy GPU Buffers - Copy GPU Buffers + Copiar Buffers da GPU Host Debug Markers - Host Debug Markers + Marcadores de Depuração do Host Guest Debug Markers - Guest Debug Markers + Marcadores de Depuração do Cliente Update - Update + Atualização Check for Updates at Startup - Check for Updates at Startup + Procurar Atualizações ao Iniciar Always Show Changelog - Always Show Changelog + Mostrar Sempre o Histórico de Mudanças Update Channel - Update Channel + Canal de Atualização Check for Updates - Check for Updates + Procurar Atualizações GUI Settings - GUI Settings + Definições da Interface Title Music - Title Music + Música de Título Disable Trophy Pop-ups - Disable Trophy Pop-ups + Desativar Pop-ups dos Troféus Background Image - Background Image + Imagem de Fundo Show Background Image - Show Background Image + Mostrar Imagem de Fundo Opacity - Opacity + Opacidade Play title music - Play title music + Reproduzir Música de Título Update Compatibility Database On Startup - Update Compatibility Database On Startup + Atualizar Base de Dados de Compatibilidade no Arranque Game Compatibility - Game Compatibility + Compatibilidade dos Jogos Display Compatibility Data - Display Compatibility Data + Exibir Dados de Compatibilidade Update Compatibility Database - Update Compatibility Database + Atualizar Base de Dados de Compatibilidade Volume - Volume + Volume Save - Save + Guardar Apply - Apply + Aplicar Restore Defaults - Restore Defaults + Restaurar Predefinições Close - Close + Fechar Point your mouse at an option to display its description. - Point your mouse at an option to display its description. + Passe o ponteiro do rato sobre uma opção para exibir a sua descrição. Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. @@ -1621,31 +1621,31 @@ Never - Never + Nunca Idle - Idle + Inativo Always - Always + Sempre Touchpad Left - Touchpad Left + Esquerda do Touchpad Touchpad Right - Touchpad Right + Direita do Touchpad Touchpad Center - Touchpad Center + Centro do Touchpad None - None + Nenhum Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. @@ -1677,11 +1677,11 @@ Add:\nAdd a folder to the list. - Add:\nAdd a folder to the list. + Adicionar:\nAdicionar uma pasta à lista. Remove:\nRemove a folder from the list. - Remove:\nRemove a folder from the list. + Remover:\nRemover uma pasta da lista. Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. @@ -1729,62 +1729,62 @@ Borderless - Borderless + Janela sem Bordas True - True + Verdadeiro Release - Release + Lançamento Nightly - Nightly + Nightly Set the volume of the background music. - Set the volume of the background music. + Definir o volume da música de fundo. Enable Motion Controls - Enable Motion Controls + Ativar Comandos de Movimento Save Data Path - Save Data Path + Caminho dos Dados Guardados Browse - Browse + Procurar async - async + assíncrono sync - sync + síncrono Auto Select - Auto Select + Seleção Automática Directory to install games - Directory to install games + Diretório onde instalar os jogos Directory to save data - Directory to save data + Diretório onde guardar os dados TrophyViewer Trophy Viewer - Trophy Viewer + Visualizador de Troféus diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 9e25a19eb..2ecf36e8a 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -325,7 +325,7 @@ Hide Changelog - Fshih ndryshimet + Fshih Ndryshimet Changes @@ -757,11 +757,11 @@ Delete Game - Fshi lojën + Fshi Lojën Delete Update - Fshi përditësimin + Fshi Përditësimin Delete DLC @@ -837,7 +837,7 @@ Delete Save Data - Fshi të dhënat e ruajtjes + Fshi të Dhënat e Ruajtjes This game has no update folder to open! @@ -911,7 +911,7 @@ Open shadPS4 Folder - Hap dosjen e shadPS4 + Hap Dosjen e shadPS4 Exit @@ -1261,7 +1261,7 @@ Emulator Language - Gjuha e emulatorit + Gjuha e Emulatorit Emulator @@ -1737,7 +1737,7 @@ Release - Botimi + Release Nightly From b06790dfe58431276bc74e39b500c7478046292a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:38:17 +0100 Subject: [PATCH 309/455] Qt: Better title bar for SFO Viewer menu (#2462) --- src/qt_gui/gui_context_menus.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 262a1d733..deb35de8d 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -161,6 +161,7 @@ public: if (selected == &openSfoViewer) { PSF psf; + QString gameName = QString::fromStdString(m_games[itemID].name); std::filesystem::path game_folder_path = m_games[itemID].path; std::filesystem::path game_update_path = game_folder_path; game_update_path += "-UPDATE"; @@ -234,7 +235,7 @@ public: tableWidget->horizontalHeader()->setVisible(false); tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); - tableWidget->setWindowTitle(tr("SFO Viewer")); + tableWidget->setWindowTitle(tr("SFO Viewer for ") + gameName); tableWidget->show(); } } From fd3d3c4158e517b33afbb2f5890d606f042c0b45 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 17 Feb 2025 06:13:39 -0800 Subject: [PATCH 310/455] shader_recompiler: Implement AMD buffer bounds checking behavior. (#2448) * shader_recompiler: Implement AMD buffer bounds checking behavior. * shader_recompiler: Use SRT flatbuf for bounds check size. * shader_recompiler: Fix buffer atomic bounds check. * buffer_cache: Prevent false image-to-buffer sync. Lowering vertex fetch to formatted buffer surfaced an issue where a CPU modified range may be overwritten with stale GPU modified image data. * Address review comments. --- .../backend/spirv/emit_spirv_atomic.cpp | 26 ++- .../spirv/emit_spirv_context_get_set.cpp | 185 +++++++++++++----- .../backend/spirv/emit_spirv_special.cpp | 2 +- .../backend/spirv/spirv_emit_context.cpp | 101 +++++++--- .../backend/spirv/spirv_emit_context.h | 7 +- .../frontend/fetch_shader.cpp | 9 +- src/shader_recompiler/frontend/fetch_shader.h | 2 + .../frontend/translate/translate.cpp | 90 ++++++--- .../frontend/translate/translate.h | 2 + .../frontend/translate/vector_memory.cpp | 4 + src/shader_recompiler/info.h | 30 +-- src/shader_recompiler/ir/reg.h | 1 + src/shader_recompiler/profile.h | 1 + src/video_core/buffer_cache/buffer_cache.cpp | 6 +- .../renderer_vulkan/vk_instance.cpp | 37 ++-- src/video_core/renderer_vulkan/vk_instance.h | 18 +- .../renderer_vulkan/vk_pipeline_cache.cpp | 1 + .../renderer_vulkan/vk_rasterizer.cpp | 1 - .../renderer_vulkan/vk_rasterizer.h | 11 +- 19 files changed, 376 insertions(+), 158 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp index 92cfcbb0f..4faa99fe8 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_atomic.cpp @@ -21,6 +21,28 @@ Id SharedAtomicU32(EmitContext& ctx, Id offset, Id value, return (ctx.*atomic_func)(ctx.U32[1], pointer, scope, semantics, value); } +Id BufferAtomicU32BoundsCheck(EmitContext& ctx, Id index, Id buffer_size, auto emit_func) { + if (Sirit::ValidId(buffer_size)) { + // Bounds checking enabled, wrap in a conditional branch to make sure that + // the atomic is not mistakenly executed when the index is out of bounds. + const Id in_bounds = ctx.OpULessThan(ctx.U1[1], index, buffer_size); + const Id ib_label = ctx.OpLabel(); + const Id oob_label = ctx.OpLabel(); + const Id end_label = ctx.OpLabel(); + ctx.OpBranchConditional(in_bounds, ib_label, oob_label); + ctx.AddLabel(ib_label); + const Id ib_result = emit_func(); + ctx.OpBranch(end_label); + ctx.AddLabel(oob_label); + const Id oob_result = ctx.u32_zero_value; + ctx.OpBranch(end_label); + ctx.AddLabel(end_label); + return ctx.OpPhi(ctx.U32[1], ib_result, ib_label, oob_result, oob_label); + } + // Bounds checking not enabled, just perform the atomic operation. + return emit_func(); +} + Id BufferAtomicU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value, Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) { const auto& buffer = ctx.buffers[handle]; @@ -31,7 +53,9 @@ Id BufferAtomicU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id const auto [id, pointer_type] = buffer[EmitContext::BufferAlias::U32]; const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index); const auto [scope, semantics]{AtomicArgs(ctx)}; - return (ctx.*atomic_func)(ctx.U32[1], ptr, scope, semantics, value); + return BufferAtomicU32BoundsCheck(ctx, index, buffer.size_dwords, [&] { + return (ctx.*atomic_func)(ctx.U32[1], ptr, scope, semantics, value); + }); } Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value, diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index cc7b7e097..e4071bb95 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -178,14 +178,21 @@ Id EmitReadConstBuffer(EmitContext& ctx, u32 handle, Id index) { index = ctx.OpIAdd(ctx.U32[1], index, buffer.offset_dwords); const auto [id, pointer_type] = buffer[BufferAlias::U32]; const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; - return ctx.OpLoad(ctx.U32[1], ptr); + const Id result{ctx.OpLoad(ctx.U32[1], ptr)}; + + if (Sirit::ValidId(buffer.size_dwords)) { + const Id in_bounds = ctx.OpULessThan(ctx.U1[1], index, buffer.size_dwords); + return ctx.OpSelect(ctx.U32[1], in_bounds, result, ctx.u32_zero_value); + } else { + return result; + } } Id EmitReadStepRate(EmitContext& ctx, int rate_idx) { + const auto index{rate_idx == 0 ? PushData::Step0Index : PushData::Step1Index}; return ctx.OpLoad( ctx.U32[1], ctx.OpAccessChain(ctx.TypePointer(spv::StorageClass::PushConstant, ctx.U32[1]), - ctx.push_data_block, - rate_idx == 0 ? ctx.u32_zero_value : ctx.u32_one_value)); + ctx.push_data_block, ctx.ConstU32(index))); } static Id EmitGetAttributeForGeometry(EmitContext& ctx, IR::Attribute attr, u32 comp, Id index) { @@ -402,8 +409,30 @@ void EmitSetPatch(EmitContext& ctx, IR::Patch patch, Id value) { ctx.OpStore(pointer, value); } +template +static Id EmitLoadBufferBoundsCheck(EmitContext& ctx, Id index, Id buffer_size, Id result, + bool is_float) { + if (Sirit::ValidId(buffer_size)) { + // Bounds checking enabled, wrap in a select. + const auto result_type = is_float ? ctx.F32[N] : ctx.U32[N]; + auto compare_index = index; + auto zero_value = is_float ? ctx.f32_zero_value : ctx.u32_zero_value; + if (N > 1) { + compare_index = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(N - 1)); + std::array zero_ids; + zero_ids.fill(zero_value); + zero_value = ctx.ConstantComposite(result_type, zero_ids); + } + const Id in_bounds = ctx.OpULessThan(ctx.U1[1], compare_index, buffer_size); + return ctx.OpSelect(result_type, in_bounds, result, zero_value); + } + // Bounds checking not enabled, just return the plain value. + return result; +} + template -static Id EmitLoadBufferB32xN(EmitContext& ctx, u32 handle, Id address) { +static Id EmitLoadBufferB32xN(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + const auto flags = inst->Flags(); const auto& spv_buffer = ctx.buffers[handle]; if (Sirit::ValidId(spv_buffer.offset)) { address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); @@ -411,31 +440,42 @@ static Id EmitLoadBufferB32xN(EmitContext& ctx, u32 handle, Id address) { const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u)); const auto& data_types = alias == BufferAlias::U32 ? ctx.U32 : ctx.F32; const auto [id, pointer_type] = spv_buffer[alias]; - if constexpr (N == 1) { - const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; - return ctx.OpLoad(data_types[1], ptr); - } else { - boost::container::static_vector ids; - for (u32 i = 0; i < N; i++) { - const Id index_i = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i)); - const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i)}; - ids.push_back(ctx.OpLoad(data_types[1], ptr)); + + boost::container::static_vector ids; + for (u32 i = 0; i < N; i++) { + const Id index_i = i == 0 ? index : ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i)); + const Id ptr_i = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i); + const Id result_i = ctx.OpLoad(data_types[1], ptr_i); + if (!flags.typed) { + // Untyped loads have bounds checking per-component. + ids.push_back(EmitLoadBufferBoundsCheck<1>(ctx, index_i, spv_buffer.size_dwords, + result_i, alias == BufferAlias::F32)); + } else { + ids.push_back(result_i); } - return ctx.OpCompositeConstruct(data_types[N], ids); } + + const Id result = N == 1 ? ids[0] : ctx.OpCompositeConstruct(data_types[N], ids); + if (flags.typed) { + // Typed loads have single bounds check for the whole load. + return EmitLoadBufferBoundsCheck(ctx, index, spv_buffer.size_dwords, result, + alias == BufferAlias::F32); + } + return result; } -Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { +Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { const auto& spv_buffer = ctx.buffers[handle]; if (Sirit::ValidId(spv_buffer.offset)) { address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); } const auto [id, pointer_type] = spv_buffer[BufferAlias::U8]; const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, address)}; - return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U8, ptr)); + const Id result{ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U8, ptr))}; + return EmitLoadBufferBoundsCheck<1>(ctx, address, spv_buffer.size, result, false); } -Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { +Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { const auto& spv_buffer = ctx.buffers[handle]; if (Sirit::ValidId(spv_buffer.offset)) { address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); @@ -443,47 +483,73 @@ Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { const auto [id, pointer_type] = spv_buffer[BufferAlias::U16]; const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(1u)); const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; - return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, ptr)); + const Id result{ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, ptr))}; + return EmitLoadBufferBoundsCheck<1>(ctx, index, spv_buffer.size_shorts, result, false); } -Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferB32xN<1, BufferAlias::U32>(ctx, handle, address); +Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return EmitLoadBufferB32xN<1, BufferAlias::U32>(ctx, inst, handle, address); } -Id EmitLoadBufferU32x2(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferB32xN<2, BufferAlias::U32>(ctx, handle, address); +Id EmitLoadBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return EmitLoadBufferB32xN<2, BufferAlias::U32>(ctx, inst, handle, address); } -Id EmitLoadBufferU32x3(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferB32xN<3, BufferAlias::U32>(ctx, handle, address); +Id EmitLoadBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return EmitLoadBufferB32xN<3, BufferAlias::U32>(ctx, inst, handle, address); } -Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address) { - return EmitLoadBufferB32xN<4, BufferAlias::U32>(ctx, handle, address); +Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { + return EmitLoadBufferB32xN<4, BufferAlias::U32>(ctx, inst, handle, address); } Id EmitLoadBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return EmitLoadBufferB32xN<1, BufferAlias::F32>(ctx, handle, address); + return EmitLoadBufferB32xN<1, BufferAlias::F32>(ctx, inst, handle, address); } Id EmitLoadBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return EmitLoadBufferB32xN<2, BufferAlias::F32>(ctx, handle, address); + return EmitLoadBufferB32xN<2, BufferAlias::F32>(ctx, inst, handle, address); } Id EmitLoadBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return EmitLoadBufferB32xN<3, BufferAlias::F32>(ctx, handle, address); + return EmitLoadBufferB32xN<3, BufferAlias::F32>(ctx, inst, handle, address); } Id EmitLoadBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { - return EmitLoadBufferB32xN<4, BufferAlias::F32>(ctx, handle, address); + return EmitLoadBufferB32xN<4, BufferAlias::F32>(ctx, inst, handle, address); } Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address) { UNREACHABLE_MSG("SPIR-V instruction"); } +template +void EmitStoreBufferBoundsCheck(EmitContext& ctx, Id index, Id buffer_size, auto emit_func) { + if (Sirit::ValidId(buffer_size)) { + // Bounds checking enabled, wrap in a conditional branch. + auto compare_index = index; + if (N > 1) { + index = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(N - 1)); + } + const Id in_bounds = ctx.OpULessThan(ctx.U1[1], compare_index, buffer_size); + const Id in_bounds_label = ctx.OpLabel(); + const Id merge_label = ctx.OpLabel(); + ctx.OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone); + ctx.OpBranchConditional(in_bounds, in_bounds_label, merge_label); + ctx.AddLabel(in_bounds_label); + emit_func(); + ctx.OpBranch(merge_label); + ctx.AddLabel(merge_label); + return; + } + // Bounds checking not enabled, just perform the store. + emit_func(); +} + template -static void EmitStoreBufferB32xN(EmitContext& ctx, u32 handle, Id address, Id value) { +static void EmitStoreBufferB32xN(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, + Id value) { + const auto flags = inst->Flags(); const auto& spv_buffer = ctx.buffers[handle]; if (Sirit::ValidId(spv_buffer.offset)) { address = ctx.OpIAdd(ctx.U32[1], address, spv_buffer.offset); @@ -491,15 +557,27 @@ static void EmitStoreBufferB32xN(EmitContext& ctx, u32 handle, Id address, Id va const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(2u)); const auto& data_types = alias == BufferAlias::U32 ? ctx.U32 : ctx.F32; const auto [id, pointer_type] = spv_buffer[alias]; - if constexpr (N == 1) { - const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; - ctx.OpStore(ptr, value); - } else { + + auto store = [&] { for (u32 i = 0; i < N; i++) { - const Id index_i = ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i)); - const Id ptr = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i); - ctx.OpStore(ptr, ctx.OpCompositeExtract(data_types[1], value, i)); + const Id index_i = i == 0 ? index : ctx.OpIAdd(ctx.U32[1], index, ctx.ConstU32(i)); + const Id ptr_i = ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index_i); + const Id value_i = N == 1 ? value : ctx.OpCompositeExtract(data_types[1], value, i); + auto store_i = [&]() { ctx.OpStore(ptr_i, value_i); }; + if (!flags.typed) { + // Untyped stores have bounds checking per-component. + EmitStoreBufferBoundsCheck<1>(ctx, index_i, spv_buffer.size_dwords, store_i); + } else { + store_i(); + } } + }; + + if (flags.typed) { + // Typed stores have single bounds check for the whole store. + EmitStoreBufferBoundsCheck(ctx, index, spv_buffer.size_dwords, store); + } else { + store(); } } @@ -510,7 +588,8 @@ void EmitStoreBufferU8(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id v } const auto [id, pointer_type] = spv_buffer[BufferAlias::U8]; const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, address)}; - ctx.OpStore(ptr, ctx.OpUConvert(ctx.U8, value)); + const Id result{ctx.OpUConvert(ctx.U8, value)}; + EmitStoreBufferBoundsCheck<1>(ctx, address, spv_buffer.size, [&] { ctx.OpStore(ptr, result); }); } void EmitStoreBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { @@ -521,39 +600,41 @@ void EmitStoreBufferU16(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id const auto [id, pointer_type] = spv_buffer[BufferAlias::U16]; const Id index = ctx.OpShiftRightLogical(ctx.U32[1], address, ctx.ConstU32(1u)); const Id ptr{ctx.OpAccessChain(pointer_type, id, ctx.u32_zero_value, index)}; - ctx.OpStore(ptr, ctx.OpUConvert(ctx.U16, value)); + const Id result{ctx.OpUConvert(ctx.U16, value)}; + EmitStoreBufferBoundsCheck<1>(ctx, index, spv_buffer.size_shorts, + [&] { ctx.OpStore(ptr, result); }); } -void EmitStoreBufferU32(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<1, BufferAlias::U32>(ctx, handle, address, value); +void EmitStoreBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferB32xN<1, BufferAlias::U32>(ctx, inst, handle, address, value); } -void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<2, BufferAlias::U32>(ctx, handle, address, value); +void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferB32xN<2, BufferAlias::U32>(ctx, inst, handle, address, value); } -void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<3, BufferAlias::U32>(ctx, handle, address, value); +void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferB32xN<3, BufferAlias::U32>(ctx, inst, handle, address, value); } -void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst*, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<4, BufferAlias::U32>(ctx, handle, address, value); +void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { + EmitStoreBufferB32xN<4, BufferAlias::U32>(ctx, inst, handle, address, value); } void EmitStoreBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<1, BufferAlias::F32>(ctx, handle, address, value); + EmitStoreBufferB32xN<1, BufferAlias::F32>(ctx, inst, handle, address, value); } void EmitStoreBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<2, BufferAlias::F32>(ctx, handle, address, value); + EmitStoreBufferB32xN<2, BufferAlias::F32>(ctx, inst, handle, address, value); } void EmitStoreBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<3, BufferAlias::F32>(ctx, handle, address, value); + EmitStoreBufferB32xN<3, BufferAlias::F32>(ctx, inst, handle, address, value); } void EmitStoreBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { - EmitStoreBufferB32xN<4, BufferAlias::F32>(ctx, handle, address, value); + EmitStoreBufferB32xN<4, BufferAlias::F32>(ctx, inst, handle, address, value); } void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value) { diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp index 724550cd6..fe7bd3356 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp @@ -14,7 +14,7 @@ void EmitPrologue(EmitContext& ctx) { if (ctx.info.loads.Get(IR::Attribute::WorkgroupIndex)) { ctx.DefineWorkgroupIndex(); } - ctx.DefineBufferOffsets(); + ctx.DefineBufferProperties(); } void ConvertDepthMode(EmitContext& ctx) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index da20dc691..7c25d1477 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -192,8 +192,27 @@ EmitContext::SpirvAttribute EmitContext::GetAttributeInfo(AmdGpu::NumberFormat f UNREACHABLE_MSG("Invalid attribute type {}", fmt); } -void EmitContext::DefineBufferOffsets() { - for (BufferDefinition& buffer : buffers) { +Id EmitContext::GetBufferSize(const u32 sharp_idx) { + const auto& srt_flatbuf = buffers.back(); + ASSERT(srt_flatbuf.buffer_type == BufferType::ReadConstUbo); + const auto [id, pointer_type] = srt_flatbuf[BufferAlias::U32]; + + const auto rsrc1{ + OpLoad(U32[1], OpAccessChain(pointer_type, id, u32_zero_value, ConstU32(sharp_idx + 1)))}; + const auto rsrc2{ + OpLoad(U32[1], OpAccessChain(pointer_type, id, u32_zero_value, ConstU32(sharp_idx + 2)))}; + + const auto stride{OpBitFieldUExtract(U32[1], rsrc1, ConstU32(16u), ConstU32(14u))}; + const auto num_records{rsrc2}; + + const auto stride_zero{OpIEqual(U1[1], stride, u32_zero_value)}; + const auto stride_size{OpIMul(U32[1], num_records, stride)}; + return OpSelect(U32[1], stride_zero, num_records, stride_size); +} + +void EmitContext::DefineBufferProperties() { + for (u32 i = 0; i < buffers.size(); i++) { + BufferDefinition& buffer = buffers[i]; if (buffer.buffer_type != BufferType::Guest) { continue; } @@ -208,6 +227,22 @@ void EmitContext::DefineBufferOffsets() { Name(buffer.offset, fmt::format("buf{}_off", binding)); buffer.offset_dwords = OpShiftRightLogical(U32[1], buffer.offset, ConstU32(2U)); Name(buffer.offset_dwords, fmt::format("buf{}_dword_off", binding)); + + // Only need to load size if performing bounds checks and the buffer is both guest and not + // inline. + if (!profile.supports_robust_buffer_access && buffer.buffer_type == BufferType::Guest) { + const BufferResource& desc = info.buffers[i]; + if (desc.sharp_idx == std::numeric_limits::max()) { + buffer.size = ConstU32(desc.inline_cbuf.GetSize()); + } else { + buffer.size = GetBufferSize(desc.sharp_idx); + } + Name(buffer.size, fmt::format("buf{}_size", binding)); + buffer.size_shorts = OpShiftRightLogical(U32[1], buffer.size, ConstU32(1U)); + Name(buffer.size_shorts, fmt::format("buf{}_short_size", binding)); + buffer.size_dwords = OpShiftRightLogical(U32[1], buffer.size, ConstU32(2U)); + Name(buffer.size_dwords, fmt::format("buf{}_dword_size", binding)); + } } } @@ -589,34 +624,34 @@ void EmitContext::DefineOutputs() { void EmitContext::DefinePushDataBlock() { // Create push constants block for instance steps rates - const Id struct_type{Name(TypeStruct(U32[1], U32[1], U32[4], U32[4], U32[4], U32[4], U32[4], - U32[4], F32[1], F32[1], F32[1], F32[1]), + const Id struct_type{Name(TypeStruct(U32[1], U32[1], F32[1], F32[1], F32[1], F32[1], U32[4], + U32[4], U32[4], U32[4], U32[4], U32[4]), "AuxData")}; Decorate(struct_type, spv::Decoration::Block); - MemberName(struct_type, 0, "sr0"); - MemberName(struct_type, 1, "sr1"); - MemberName(struct_type, Shader::PushData::BufOffsetIndex + 0, "buf_offsets0"); - MemberName(struct_type, Shader::PushData::BufOffsetIndex + 1, "buf_offsets1"); - MemberName(struct_type, Shader::PushData::UdRegsIndex + 0, "ud_regs0"); - MemberName(struct_type, Shader::PushData::UdRegsIndex + 1, "ud_regs1"); - MemberName(struct_type, Shader::PushData::UdRegsIndex + 2, "ud_regs2"); - MemberName(struct_type, Shader::PushData::UdRegsIndex + 3, "ud_regs3"); - MemberName(struct_type, Shader::PushData::XOffsetIndex, "xoffset"); - MemberName(struct_type, Shader::PushData::YOffsetIndex, "yoffset"); - MemberName(struct_type, Shader::PushData::XScaleIndex, "xscale"); - MemberName(struct_type, Shader::PushData::YScaleIndex, "yscale"); - MemberDecorate(struct_type, 0, spv::Decoration::Offset, 0U); - MemberDecorate(struct_type, 1, spv::Decoration::Offset, 4U); - MemberDecorate(struct_type, Shader::PushData::BufOffsetIndex + 0, spv::Decoration::Offset, 8U); - MemberDecorate(struct_type, Shader::PushData::BufOffsetIndex + 1, spv::Decoration::Offset, 24U); - MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 0, spv::Decoration::Offset, 40U); - MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 1, spv::Decoration::Offset, 56U); - MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 2, spv::Decoration::Offset, 72U); - MemberDecorate(struct_type, Shader::PushData::UdRegsIndex + 3, spv::Decoration::Offset, 88U); - MemberDecorate(struct_type, Shader::PushData::XOffsetIndex, spv::Decoration::Offset, 104U); - MemberDecorate(struct_type, Shader::PushData::YOffsetIndex, spv::Decoration::Offset, 108U); - MemberDecorate(struct_type, Shader::PushData::XScaleIndex, spv::Decoration::Offset, 112U); - MemberDecorate(struct_type, Shader::PushData::YScaleIndex, spv::Decoration::Offset, 116U); + MemberName(struct_type, PushData::Step0Index, "sr0"); + MemberName(struct_type, PushData::Step1Index, "sr1"); + MemberName(struct_type, PushData::XOffsetIndex, "xoffset"); + MemberName(struct_type, PushData::YOffsetIndex, "yoffset"); + MemberName(struct_type, PushData::XScaleIndex, "xscale"); + MemberName(struct_type, PushData::YScaleIndex, "yscale"); + MemberName(struct_type, PushData::UdRegsIndex + 0, "ud_regs0"); + MemberName(struct_type, PushData::UdRegsIndex + 1, "ud_regs1"); + MemberName(struct_type, PushData::UdRegsIndex + 2, "ud_regs2"); + MemberName(struct_type, PushData::UdRegsIndex + 3, "ud_regs3"); + MemberName(struct_type, PushData::BufOffsetIndex + 0, "buf_offsets0"); + MemberName(struct_type, PushData::BufOffsetIndex + 1, "buf_offsets1"); + MemberDecorate(struct_type, PushData::Step0Index, spv::Decoration::Offset, 0U); + MemberDecorate(struct_type, PushData::Step1Index, spv::Decoration::Offset, 4U); + MemberDecorate(struct_type, PushData::XOffsetIndex, spv::Decoration::Offset, 8U); + MemberDecorate(struct_type, PushData::YOffsetIndex, spv::Decoration::Offset, 12U); + MemberDecorate(struct_type, PushData::XScaleIndex, spv::Decoration::Offset, 16U); + MemberDecorate(struct_type, PushData::YScaleIndex, spv::Decoration::Offset, 20U); + MemberDecorate(struct_type, PushData::UdRegsIndex + 0, spv::Decoration::Offset, 24U); + MemberDecorate(struct_type, PushData::UdRegsIndex + 1, spv::Decoration::Offset, 40U); + MemberDecorate(struct_type, PushData::UdRegsIndex + 2, spv::Decoration::Offset, 56U); + MemberDecorate(struct_type, PushData::UdRegsIndex + 3, spv::Decoration::Offset, 72U); + MemberDecorate(struct_type, PushData::BufOffsetIndex + 0, spv::Decoration::Offset, 88U); + MemberDecorate(struct_type, PushData::BufOffsetIndex + 1, spv::Decoration::Offset, 104U); push_data_block = DefineVar(struct_type, spv::StorageClass::PushConstant); Name(push_data_block, "push_data"); interfaces.push_back(push_data_block); @@ -661,12 +696,22 @@ EmitContext::BufferSpv EmitContext::DefineBuffer(bool is_storage, bool is_writte break; default: Name(id, fmt::format("{}_{}", is_storage ? "ssbo" : "ubo", binding.buffer)); + break; } interfaces.push_back(id); return {id, pointer_type}; }; void EmitContext::DefineBuffers() { + if (!profile.supports_robust_buffer_access && !info.has_readconst) { + // In case ReadConstUbo has not already been bound by IR and is needed + // to query buffer sizes, bind it now. + info.buffers.push_back({ + .used_types = IR::Type::U32, + .inline_cbuf = AmdGpu::Buffer::Null(), + .buffer_type = BufferType::ReadConstUbo, + }); + } for (const auto& desc : info.buffers) { const auto buf_sharp = desc.GetSharp(info); const bool is_storage = desc.IsStorage(buf_sharp, profile); diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 0fe6e336c..784748658 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -43,7 +43,7 @@ public: Id Def(const IR::Value& value); - void DefineBufferOffsets(); + void DefineBufferProperties(); void DefineInterpolatedAttribs(); void DefineWorkgroupIndex(); @@ -248,6 +248,9 @@ public: BufferType buffer_type; Id offset; Id offset_dwords; + Id size; + Id size_shorts; + Id size_dwords; std::array aliases; const BufferSpv& operator[](BufferAlias alias) const { @@ -307,6 +310,8 @@ private: Id DefineFloat32ToUfloatM5(u32 mantissa_bits, std::string_view name); Id DefineUfloatM5ToFloat32(u32 mantissa_bits, std::string_view name); + + Id GetBufferSize(u32 sharp_idx); }; } // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/frontend/fetch_shader.cpp b/src/shader_recompiler/frontend/fetch_shader.cpp index 8ae664d79..55508b0f2 100644 --- a/src/shader_recompiler/frontend/fetch_shader.cpp +++ b/src/shader_recompiler/frontend/fetch_shader.cpp @@ -9,6 +9,12 @@ namespace Shader::Gcn { +const u32* GetFetchShaderCode(const Info& info, u32 sgpr_base) { + const u32* code; + std::memcpy(&code, &info.user_data[sgpr_base], sizeof(code)); + return code; +} + /** * s_load_dwordx4 s[8:11], s[2:3], 0x00 * s_load_dwordx4 s[12:15], s[2:3], 0x04 @@ -38,9 +44,8 @@ std::optional ParseFetchShader(const Shader::Info& info) { if (!info.has_fetch_shader) { return std::nullopt; } - const u32* code; - std::memcpy(&code, &info.user_data[info.fetch_shader_sgpr_base], sizeof(code)); + const auto* code = GetFetchShaderCode(info, info.fetch_shader_sgpr_base); FetchShaderData data{.code = code}; GcnCodeSlice code_slice(code, code + std::numeric_limits::max()); GcnDecodeContext decoder; diff --git a/src/shader_recompiler/frontend/fetch_shader.h b/src/shader_recompiler/frontend/fetch_shader.h index 080b0eb22..837caafa0 100644 --- a/src/shader_recompiler/frontend/fetch_shader.h +++ b/src/shader_recompiler/frontend/fetch_shader.h @@ -64,6 +64,8 @@ struct FetchShaderData { } }; +const u32* GetFetchShaderCode(const Info& info, u32 sgpr_base); + std::optional ParseFetchShader(const Shader::Info& info); } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/translate.cpp b/src/shader_recompiler/frontend/translate/translate.cpp index 7f1bcb33e..230f3917f 100644 --- a/src/shader_recompiler/frontend/translate/translate.cpp +++ b/src/shader_recompiler/frontend/translate/translate.cpp @@ -4,6 +4,7 @@ #include "common/config.h" #include "common/io_file.h" #include "common/path_util.h" +#include "shader_recompiler/frontend/decode.h" #include "shader_recompiler/frontend/fetch_shader.h" #include "shader_recompiler/frontend/translate/translate.h" #include "shader_recompiler/info.h" @@ -470,8 +471,29 @@ void Translator::SetDst64(const InstOperand& operand, const IR::U64F64& value_ra void Translator::EmitFetch(const GcnInst& inst) { // Read the pointer to the fetch shader assembly. + const auto code_sgpr_base = inst.src[0].code; + if (!profile.supports_robust_buffer_access) { + // The fetch shader must be inlined to access as regular buffers, so that + // bounds checks can be emitted to emulate robust buffer access. + const auto* code = GetFetchShaderCode(info, code_sgpr_base); + GcnCodeSlice slice(code, code + std::numeric_limits::max()); + GcnDecodeContext decoder; + + // Decode and save instructions + u32 sub_pc = 0; + while (!slice.atEnd()) { + const auto sub_inst = decoder.decodeInstruction(slice); + if (sub_inst.opcode == Opcode::S_SETPC_B64) { + // Assume we're swapping back to the main shader. + break; + } + TranslateInstruction(sub_inst, sub_pc++); + } + return; + } + info.has_fetch_shader = true; - info.fetch_shader_sgpr_base = inst.src[0].code; + info.fetch_shader_sgpr_base = code_sgpr_base; const auto fetch_data = ParseFetchShader(info); ASSERT(fetch_data.has_value()); @@ -520,6 +542,40 @@ void Translator::LogMissingOpcode(const GcnInst& inst) { info.translation_failed = true; } +void Translator::TranslateInstruction(const GcnInst& inst, const u32 pc) { + // Emit instructions for each category. + switch (inst.category) { + case InstCategory::DataShare: + EmitDataShare(inst); + break; + case InstCategory::VectorInterpolation: + EmitVectorInterpolation(inst); + break; + case InstCategory::ScalarMemory: + EmitScalarMemory(inst); + break; + case InstCategory::VectorMemory: + EmitVectorMemory(inst); + break; + case InstCategory::Export: + EmitExport(inst); + break; + case InstCategory::FlowControl: + EmitFlowControl(pc, inst); + break; + case InstCategory::ScalarALU: + EmitScalarAlu(inst); + break; + case InstCategory::VectorALU: + EmitVectorAlu(inst); + break; + case InstCategory::DebugProfile: + break; + default: + UNREACHABLE(); + } +} + void Translate(IR::Block* block, u32 pc, std::span inst_list, Info& info, const RuntimeInfo& runtime_info, const Profile& profile) { if (inst_list.empty()) { @@ -537,37 +593,7 @@ void Translate(IR::Block* block, u32 pc, std::span inst_list, Inf continue; } - // Emit instructions for each category. - switch (inst.category) { - case InstCategory::DataShare: - translator.EmitDataShare(inst); - break; - case InstCategory::VectorInterpolation: - translator.EmitVectorInterpolation(inst); - break; - case InstCategory::ScalarMemory: - translator.EmitScalarMemory(inst); - break; - case InstCategory::VectorMemory: - translator.EmitVectorMemory(inst); - break; - case InstCategory::Export: - translator.EmitExport(inst); - break; - case InstCategory::FlowControl: - translator.EmitFlowControl(pc, inst); - break; - case InstCategory::ScalarALU: - translator.EmitScalarAlu(inst); - break; - case InstCategory::VectorALU: - translator.EmitVectorAlu(inst); - break; - case InstCategory::DebugProfile: - break; - default: - UNREACHABLE(); - } + translator.TranslateInstruction(inst, pc); } } diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 563881a8e..b4919213b 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -58,6 +58,8 @@ public: explicit Translator(IR::Block* block_, Info& info, const RuntimeInfo& runtime_info, const Profile& profile); + void TranslateInstruction(const GcnInst& inst, u32 pc); + // Instruction categories void EmitPrologue(); void EmitFetch(const GcnInst& inst); diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index 0b911eb57..bfbe937a1 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -195,6 +195,7 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) buffer_info.inst_offset.Assign(mubuf.offset); buffer_info.globally_coherent.Assign(mubuf.glc); buffer_info.system_coherent.Assign(mubuf.slc); + buffer_info.typed.Assign(is_typed); if (is_typed) { const auto& mtbuf = inst.control.mtbuf; const auto dmft = static_cast(mtbuf.dfmt); @@ -241,6 +242,7 @@ void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) { buffer_info.inst_offset.Assign(mubuf.offset); buffer_info.globally_coherent.Assign(mubuf.glc); buffer_info.system_coherent.Assign(mubuf.slc); + buffer_info.typed.Assign(true); const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), @@ -283,6 +285,7 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst buffer_info.inst_offset.Assign(mubuf.offset); buffer_info.globally_coherent.Assign(mubuf.glc); buffer_info.system_coherent.Assign(mubuf.slc); + buffer_info.typed.Assign(is_typed); if (is_typed) { const auto& mtbuf = inst.control.mtbuf; const auto dmft = static_cast(mtbuf.dfmt); @@ -339,6 +342,7 @@ void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) { buffer_info.inst_offset.Assign(mubuf.offset); buffer_info.globally_coherent.Assign(mubuf.glc); buffer_info.system_coherent.Assign(mubuf.slc); + buffer_info.typed.Assign(true); const IR::VectorReg src_reg{inst.src[1].code}; diff --git a/src/shader_recompiler/info.h b/src/shader_recompiler/info.h index 13f310cf8..8dcf9c5c4 100644 --- a/src/shader_recompiler/info.h +++ b/src/shader_recompiler/info.h @@ -23,6 +23,10 @@ namespace Shader { static constexpr size_t NumUserDataRegs = 16; +static constexpr size_t NumImages = 64; +static constexpr size_t NumBuffers = 32; +static constexpr size_t NumSamplers = 16; +static constexpr size_t NumFMasks = 8; enum class TextureType : u32 { Color1D, @@ -63,7 +67,7 @@ struct BufferResource { [[nodiscard]] constexpr AmdGpu::Buffer GetSharp(const Info& info) const noexcept; }; -using BufferResourceList = boost::container::small_vector; +using BufferResourceList = boost::container::small_vector; struct ImageResource { u32 sharp_idx; @@ -74,7 +78,7 @@ struct ImageResource { [[nodiscard]] constexpr AmdGpu::Image GetSharp(const Info& info) const noexcept; }; -using ImageResourceList = boost::container::small_vector; +using ImageResourceList = boost::container::small_vector; struct SamplerResource { u32 sharp_idx; @@ -84,31 +88,33 @@ struct SamplerResource { constexpr AmdGpu::Sampler GetSharp(const Info& info) const noexcept; }; -using SamplerResourceList = boost::container::small_vector; +using SamplerResourceList = boost::container::small_vector; struct FMaskResource { u32 sharp_idx; constexpr AmdGpu::Image GetSharp(const Info& info) const noexcept; }; -using FMaskResourceList = boost::container::small_vector; +using FMaskResourceList = boost::container::small_vector; struct PushData { - static constexpr u32 BufOffsetIndex = 2; - static constexpr u32 UdRegsIndex = 4; - static constexpr u32 XOffsetIndex = 8; - static constexpr u32 YOffsetIndex = 9; - static constexpr u32 XScaleIndex = 10; - static constexpr u32 YScaleIndex = 11; + static constexpr u32 Step0Index = 0; + static constexpr u32 Step1Index = 1; + static constexpr u32 XOffsetIndex = 2; + static constexpr u32 YOffsetIndex = 3; + static constexpr u32 XScaleIndex = 4; + static constexpr u32 YScaleIndex = 5; + static constexpr u32 UdRegsIndex = 6; + static constexpr u32 BufOffsetIndex = UdRegsIndex + NumUserDataRegs / 4; u32 step0; u32 step1; - std::array buf_offsets; - std::array ud_regs; float xoffset; float yoffset; float xscale; float yscale; + std::array ud_regs; + std::array buf_offsets; void AddOffset(u32 binding, u32 offset) { ASSERT(offset < 256 && binding < buf_offsets.size()); diff --git a/src/shader_recompiler/ir/reg.h b/src/shader_recompiler/ir/reg.h index 19e0da3dd..3ee7c4355 100644 --- a/src/shader_recompiler/ir/reg.h +++ b/src/shader_recompiler/ir/reg.h @@ -51,6 +51,7 @@ union BufferInstInfo { BitField<2, 12, u32> inst_offset; BitField<14, 1, u32> system_coherent; BitField<15, 1, u32> globally_coherent; + BitField<16, 1, u32> typed; }; enum class ScalarReg : u32 { diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index 53d940b79..43d2b87d4 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -25,6 +25,7 @@ struct Profile { bool support_legacy_vertex_attributes{}; bool supports_image_load_store_lod{}; bool supports_native_cube_calc{}; + bool supports_robust_buffer_access{}; bool has_broken_spirv_clamp{}; bool lower_left_origin_mode{}; bool needs_manual_interpolation{}; diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index ccb45c095..7eb4ea9e1 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -608,7 +608,11 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr, return false; } Image& image = texture_cache.GetImage(image_id); - if (False(image.flags & ImageFlagBits::GpuModified)) { + // Only perform sync if image is: + // - GPU modified; otherwise there are no changes to synchronize. + // - Not CPU modified; otherwise we could overwrite CPU changes with stale GPU changes. + if (False(image.flags & ImageFlagBits::GpuModified) || + True(image.flags & ImageFlagBits::CpuDirty)) { return false; } ASSERT_MSG(device_addr == image.info.guest_address, diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index a17f8c9c2..f01401569 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -210,9 +210,6 @@ bool Instance::CreateDevice() { vk::PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT, vk::PhysicalDevicePortabilitySubsetFeaturesKHR>(); features = feature_chain.get().features; -#ifdef __APPLE__ - portability_features = feature_chain.get(); -#endif const vk::StructureChain properties_chain = physical_device.getProperties2< vk::PhysicalDeviceProperties2, vk::PhysicalDeviceVulkan11Properties, @@ -258,16 +255,19 @@ bool Instance::CreateDevice() { add_extension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); add_extension(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME); add_extension(VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME); - dynamic_color_write_mask = add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); - if (dynamic_color_write_mask) { - dynamic_color_write_mask = - feature_chain.get() - .extendedDynamicState3ColorWriteMask; + dynamic_state_3 = add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); + if (dynamic_state_3) { + dynamic_state_3_features = + feature_chain.get(); + LOG_INFO(Render_Vulkan, "- extendedDynamicState3ColorWriteMask: {}", + dynamic_state_3_features.extendedDynamicState3ColorWriteMask); } - null_descriptor = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); - if (null_descriptor) { - null_descriptor = - feature_chain.get().nullDescriptor; + robustness2 = add_extension(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); + if (robustness2) { + robustness2_features = feature_chain.get(); + LOG_INFO(Render_Vulkan, "- robustBufferAccess2: {}", + robustness2_features.robustBufferAccess2); + LOG_INFO(Render_Vulkan, "- nullDescriptor: {}", robustness2_features.nullDescriptor); } custom_border_color = add_extension(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); depth_clip_control = add_extension(VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME); @@ -284,6 +284,9 @@ bool Instance::CreateDevice() { #ifdef __APPLE__ // Required by Vulkan spec if supported. portability_subset = add_extension(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); + if (portability_subset) { + portability_features = feature_chain.get(); + } #endif const auto family_properties = physical_device.getQueueFamilyProperties(); @@ -387,13 +390,15 @@ bool Instance::CreateDevice() { .customBorderColorWithoutFormat = true, }, vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT{ - .extendedDynamicState3ColorWriteMask = true, + .extendedDynamicState3ColorWriteMask = + dynamic_state_3_features.extendedDynamicState3ColorWriteMask, }, vk::PhysicalDeviceDepthClipControlFeaturesEXT{ .depthClipControl = true, }, vk::PhysicalDeviceRobustness2FeaturesEXT{ - .nullDescriptor = true, + .robustBufferAccess2 = robustness2_features.robustBufferAccess2, + .nullDescriptor = robustness2_features.nullDescriptor, }, vk::PhysicalDeviceVertexInputDynamicStateFeaturesEXT{ .vertexInputDynamicState = true, @@ -420,13 +425,13 @@ bool Instance::CreateDevice() { if (!custom_border_color) { device_chain.unlink(); } - if (!dynamic_color_write_mask) { + if (!dynamic_state_3) { device_chain.unlink(); } if (!depth_clip_control) { device_chain.unlink(); } - if (!null_descriptor) { + if (!robustness2) { device_chain.unlink(); } if (!vertex_input_dynamic_state) { diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index 682824044..bdd92cba9 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -99,9 +99,10 @@ public: return depth_clip_control; } - /// Returns true when dynamic color write mask state is supported + /// Returns true when the extendedDynamicState3ColorWriteMask feature of + /// VK_EXT_extended_dynamic_state3 is supported. bool IsDynamicColorWriteMaskSupported() const { - return dynamic_color_write_mask; + return dynamic_state_3 && dynamic_state_3_features.extendedDynamicState3ColorWriteMask; } /// Returns true when VK_EXT_vertex_input_dynamic_state is supported. @@ -109,9 +110,14 @@ public: return vertex_input_dynamic_state; } + /// Returns true when the robustBufferAccess2 feature of VK_EXT_robustness2 is supported. + bool IsRobustBufferAccess2Supported() const { + return robustness2 && robustness2_features.robustBufferAccess2; + } + /// Returns true when the nullDescriptor feature of VK_EXT_robustness2 is supported. bool IsNullDescriptorSupported() const { - return null_descriptor; + return robustness2 && robustness2_features.nullDescriptor; } /// Returns true when VK_KHR_fragment_shader_barycentric is supported. @@ -303,6 +309,8 @@ private: vk::PhysicalDevicePushDescriptorPropertiesKHR push_descriptor_props; vk::PhysicalDeviceFeatures features; vk::PhysicalDevicePortabilitySubsetFeaturesKHR portability_features; + vk::PhysicalDeviceExtendedDynamicState3FeaturesEXT dynamic_state_3_features; + vk::PhysicalDeviceRobustness2FeaturesEXT robustness2_features; vk::DriverIdKHR driver_id; vk::UniqueDebugUtilsMessengerEXT debug_callback{}; std::string vendor_name; @@ -317,9 +325,9 @@ private: bool custom_border_color{}; bool fragment_shader_barycentric{}; bool depth_clip_control{}; - bool dynamic_color_write_mask{}; + bool dynamic_state_3{}; bool vertex_input_dynamic_state{}; - bool null_descriptor{}; + bool robustness2{}; bool list_restart{}; bool legacy_vertex_attributes{}; bool shader_stencil_export{}; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 6ac7f7e43..3db22d585 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -200,6 +200,7 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, .support_legacy_vertex_attributes = instance_.IsLegacyVertexAttributesSupported(), .supports_image_load_store_lod = instance_.IsImageLoadStoreLodSupported(), .supports_native_cube_calc = instance_.IsAmdGcnShaderSupported(), + .supports_robust_buffer_access = instance_.IsRobustBufferAccess2Supported(), .needs_manual_interpolation = instance.IsFragmentShaderBarycentricSupported() && instance.GetDriverID() == vk::DriverId::eNvidiaProprietary, .needs_lds_barriers = instance.GetDriverID() == vk::DriverId::eNvidiaProprietary || diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 816f149b0..4d58c0ea3 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -447,7 +447,6 @@ bool Rasterizer::BindResources(const Pipeline* pipeline) { set_writes.clear(); buffer_barriers.clear(); buffer_infos.clear(); - buffer_views.clear(); image_infos.clear(); // Bind resource buffers and textures. diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 292944a10..3b45fd52e 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -110,18 +110,17 @@ private: std::pair, 8> cb_descs; std::optional> db_desc; - boost::container::static_vector image_infos; - boost::container::static_vector buffer_views; - boost::container::static_vector buffer_infos; - boost::container::static_vector bound_images; + boost::container::static_vector image_infos; + boost::container::static_vector buffer_infos; + boost::container::static_vector bound_images; Pipeline::DescriptorWrites set_writes; Pipeline::BufferBarriers buffer_barriers; using BufferBindingInfo = std::pair; - boost::container::static_vector buffer_bindings; + boost::container::static_vector buffer_bindings; using ImageBindingInfo = std::pair; - boost::container::static_vector image_bindings; + boost::container::static_vector image_bindings; }; } // namespace Vulkan From 154473d3b3841e26612da123a0d9092640d1af59 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Mon, 17 Feb 2025 11:59:10 -0300 Subject: [PATCH 311/455] Fixes translation BOT (#2465) * Update update_translation.yml * Update update_translation.yml * Update update_translation.yml --- .github/workflows/update_translation.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/update_translation.yml b/.github/workflows/update_translation.yml index 06564d175..6eb9db87a 100644 --- a/.github/workflows/update_translation.yml +++ b/.github/workflows/update_translation.yml @@ -22,10 +22,9 @@ jobs: - name: Create Pull Request uses: peter-evans/create-pull-request@v7 with: + token: ${{ secrets.SHADPS4_TOKEN_REPO }} title: "Qt GUI: Update Translation" - commit-message: "[ci skip] Qt GUI: Update Translation." - committer: "shadPS4 Bot " - author: "shadPS4 Bot " + commit-message: "[ci skip] Qt GUI: Update Translation." body: "Daily update of translation sources." branch: update-translation - delete-branch: true \ No newline at end of file + delete-branch: true From e40451a3f72e2cfac6d3fadd9f5413ccf2bec25f Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 17 Feb 2025 17:01:22 +0200 Subject: [PATCH 312/455] [ci skip] Qt GUI: Update Translation. (#2466) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 40 ++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index e2b56c983..f1ed5df27 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -413,10 +413,6 @@ Configure Controls - - Control Settings - - D-Pad @@ -469,14 +465,6 @@ L2 / LT - - KBM Controls - - - - KBM Editor - - Back @@ -533,6 +521,30 @@ Right Stick + + Color Adjustment + + + + R: 000 + + + + G: 000 + + + + B: 255 + + + + Override Lightbar Color + + + + Override Color + + ElfViewer @@ -855,6 +867,10 @@ Save Data + + SFO Viewer for + + InstallDirSelect From 41496e035a75e629d5423cc1b5d6634cc7f3bfd4 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Mon, 17 Feb 2025 14:45:21 -0300 Subject: [PATCH 313/455] Adjust translation for RGB light (#2468) --- src/qt_gui/about_dialog.ui | 2 +- src/qt_gui/control_settings.cpp | 12 ++++++------ src/qt_gui/control_settings.ui | 6 +++--- src/qt_gui/translations/en_US.ts | 10 +++------- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/qt_gui/about_dialog.ui b/src/qt_gui/about_dialog.ui index 19840e452..3842513a5 100644 --- a/src/qt_gui/about_dialog.ui +++ b/src/qt_gui/about_dialog.ui @@ -57,7 +57,7 @@
- shadPS4 + shadPS4 diff --git a/src/qt_gui/control_settings.cpp b/src/qt_gui/control_settings.cpp index 0b96eee26..820a490a0 100644 --- a/src/qt_gui/control_settings.cpp +++ b/src/qt_gui/control_settings.cpp @@ -60,21 +60,21 @@ ControlSettings::ControlSettings(std::shared_ptr game_info_get, Q connect(ui->RSlider, &QSlider::valueChanged, this, [this](int value) { QString RedValue = QString("%1").arg(value, 3, 10, QChar('0')); - QString RValue = "R: " + RedValue; + QString RValue = tr("R:") + " " + RedValue; ui->RLabel->setText(RValue); UpdateLightbarColor(); }); connect(ui->GSlider, &QSlider::valueChanged, this, [this](int value) { QString GreenValue = QString("%1").arg(value, 3, 10, QChar('0')); - QString GValue = "G: " + GreenValue; + QString GValue = tr("G:") + " " + GreenValue; ui->GLabel->setText(GValue); UpdateLightbarColor(); }); connect(ui->BSlider, &QSlider::valueChanged, this, [this](int value) { QString BlueValue = QString("%1").arg(value, 3, 10, QChar('0')); - QString BValue = "B: " + BlueValue; + QString BValue = tr("B:") + " " + BlueValue; ui->BLabel->setText(BValue); UpdateLightbarColor(); }); @@ -483,7 +483,7 @@ void ControlSettings::SetUIValuestoMappings() { std::string Rstring = lightbarstring.substr(0, comma_pos2); ui->RSlider->setValue(std::stoi(Rstring)); QString RedValue = QString("%1").arg(std::stoi(Rstring), 3, 10, QChar('0')); - QString RValue = "R: " + RedValue; + QString RValue = tr("R:") + " " + RedValue; ui->RLabel->setText(RValue); } @@ -494,14 +494,14 @@ void ControlSettings::SetUIValuestoMappings() { ui->GSlider->setValue(std::stoi(Gstring)); QString GreenValue = QString("%1").arg(std::stoi(Gstring), 3, 10, QChar('0')); - QString GValue = "G: " + GreenValue; + QString GValue = tr("G:") + " " + GreenValue; ui->GLabel->setText(GValue); std::string Bstring = GBstring.substr(comma_pos3 + 1); ui->BSlider->setValue(std::stoi(Bstring)); QString BlueValue = QString("%1").arg(std::stoi(Bstring), 3, 10, QChar('0')); - QString BValue = "B: " + BlueValue; + QString BValue = tr("B:") + " " + BlueValue; ui->BLabel->setText(BValue); } } diff --git a/src/qt_gui/control_settings.ui b/src/qt_gui/control_settings.ui index e88e239e9..41fb005c6 100644 --- a/src/qt_gui/control_settings.ui +++ b/src/qt_gui/control_settings.ui @@ -912,7 +912,7 @@ - R: 000 + R: 000 @@ -944,7 +944,7 @@ - G: 000 + G: 000 @@ -976,7 +976,7 @@ - B: 255 + B: 255 diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index f1ed5df27..8d719977a 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,15 +522,15 @@ - R: 000 + R: - G: 000 + G: - B: 255 + B: From e67263cc0e6d33a40229d970a941f8b5598a9843 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 17 Feb 2025 19:45:33 +0200 Subject: [PATCH 314/455] New Crowdin updates (#2467) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Spanish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Polish) * New translations en_us.ts (Russian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (French) * New translations en_us.ts (Turkish) --- src/qt_gui/translations/ar_SA.ts | 40 ++++++++++++++------- src/qt_gui/translations/da_DK.ts | 40 ++++++++++++++------- src/qt_gui/translations/de_DE.ts | 40 ++++++++++++++------- src/qt_gui/translations/el_GR.ts | 40 ++++++++++++++------- src/qt_gui/translations/es_ES.ts | 40 ++++++++++++++------- src/qt_gui/translations/fa_IR.ts | 40 ++++++++++++++------- src/qt_gui/translations/fi_FI.ts | 40 ++++++++++++++------- src/qt_gui/translations/fr_FR.ts | 44 +++++++++++++++-------- src/qt_gui/translations/hu_HU.ts | 40 ++++++++++++++------- src/qt_gui/translations/id_ID.ts | 40 ++++++++++++++------- src/qt_gui/translations/it_IT.ts | 40 ++++++++++++++------- src/qt_gui/translations/ja_JP.ts | 40 ++++++++++++++------- src/qt_gui/translations/ko_KR.ts | 40 ++++++++++++++------- src/qt_gui/translations/lt_LT.ts | 40 ++++++++++++++------- src/qt_gui/translations/nb_NO.ts | 40 ++++++++++++++------- src/qt_gui/translations/nl_NL.ts | 40 ++++++++++++++------- src/qt_gui/translations/pl_PL.ts | 40 ++++++++++++++------- src/qt_gui/translations/pt_BR.ts | 40 ++++++++++++++------- src/qt_gui/translations/pt_PT.ts | 40 ++++++++++++++------- src/qt_gui/translations/ro_RO.ts | 40 ++++++++++++++------- src/qt_gui/translations/ru_RU.ts | 40 ++++++++++++++------- src/qt_gui/translations/sq_AL.ts | 40 ++++++++++++++------- src/qt_gui/translations/sv_SE.ts | 40 ++++++++++++++------- src/qt_gui/translations/tr_TR.ts | 60 ++++++++++++++++++++------------ src/qt_gui/translations/uk_UA.ts | 40 ++++++++++++++------- src/qt_gui/translations/vi_VN.ts | 40 ++++++++++++++------- src/qt_gui/translations/zh_CN.ts | 40 ++++++++++++++------- src/qt_gui/translations/zh_TW.ts | 40 ++++++++++++++------- 28 files changed, 796 insertions(+), 348 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index b489e4446..94fa24552 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 3a66ee624..2c8a88614 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 047a25b76..0dc996792 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index bb322ce08..139e06dc3 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 4997f5645..3d3636d24 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -413,10 +413,6 @@ Configure Controls Configurar Controles - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - Editor KBM - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index dcbf7e6dd..e5e11dd62 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 5e9e33c85..1db90a940 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index d01ac2847..642382e9c 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -413,10 +413,6 @@ Configure Controls Configurer les Commandes - - Control Settings - Paramètres de Contrôle - D-Pad Croix directionnelle @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - Commandes KBM - - - KBM Editor - Éditeur KBM - Back Retour @@ -533,6 +521,30 @@ Right Stick Joystick Droit + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Enregistrer les Données + + SFO Viewer for + Visionneuse SFO pour + InstallDirSelect @@ -1745,11 +1761,11 @@ Set the volume of the background music. - Set the volume of the background music. + Volume de la musique de fond. Enable Motion Controls - Enable Motion Controls + Activer les Mouvements Save Data Path diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 20a6225ca..aa1a289aa 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 6504c7808..1f359fca7 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 1990f8cae..66776c7fe 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -413,10 +413,6 @@ Configure Controls Configura Comandi - - Control Settings - Impostazioni dei Comandi - D-Pad Croce direzionale @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - Controlli Tastiera/Mouse - - - KBM Editor - Editor Tastiera/Mouse - Back Indietro @@ -533,6 +521,30 @@ Right Stick Levetta Destra + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Dati Salvataggio + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 502070bb5..b4207e772 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -413,10 +413,6 @@ Configure Controls コントロール設定 - - Control Settings - 操作設定 - D-Pad 十字キー @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick 右スティック + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index b344e0b5d..80e99ba13 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 711d0c7d2..c21fa5c64 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index efeb955fb..8bcf31ee3 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -413,10 +413,6 @@ Configure Controls Sett opp kontroller - - Control Settings - Kontrollinnstillinger - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - Mus/tastatur oppsett - - - KBM Editor - Rediger mus/tastatur - Back Tilbake @@ -533,6 +521,30 @@ Right Stick Høyre analog + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Lagret data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 6cd39b209..9cf7d955e 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index e17859784..abcefbb7c 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 6234a1d86..accc00561 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -413,10 +413,6 @@ Configure Controls Configurar Controles - - Control Settings - Configurações do Controle - D-Pad Direcional @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - Controles T/M - - - KBM Editor - Editor T/M - Back Voltar @@ -533,6 +521,30 @@ Right Stick Analógico Direito + + Color Adjustment + Ajuste de Cores + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Substituir cor da Lightbar + + + Override Color + Substituir a Cor + ElfViewer @@ -855,6 +867,10 @@ Save Data Dados Salvos + + SFO Viewer for + Visualizador de SFO para + InstallDirSelect diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 33fd53953..95d344ba7 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -413,10 +413,6 @@ Configure Controls Configurar Comandos - - Control Settings - Definições do Comando - D-Pad Botões de Direção @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - Controlo KBM - - - KBM Editor - Editor KBM - Back Voltar @@ -533,6 +521,30 @@ Right Stick Manípulo Direito + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Dados Guardados + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 8e0e4260d..a5f62cbfd 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 538b774fc..d999bf6fe 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -413,10 +413,6 @@ Configure Controls Настроить управление - - Control Settings - Настройки управления - D-Pad Крестовина @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - Управление KBM - - - KBM Editor - Редактор KBM - Back Назад @@ -533,6 +521,30 @@ Right Stick Правый стик + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Сохранения + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 2ecf36e8a..59fcfcf74 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -413,10 +413,6 @@ Configure Controls Konfiguro kontrollet - - Control Settings - Cilësimet e kontrollit - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - Kontrollet Tastierë/Mi - - - KBM Editor - Redaktues Tastierë/Mi - Back Mbrapa @@ -533,6 +521,30 @@ Right Stick Leva e djathtë + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Të dhënat e ruajtjes + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 15267951e..46016207c 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -413,10 +413,6 @@ Configure Controls Konfigurera kontroller - - Control Settings - Kontrollerinställningar - D-Pad Riktningsknappar @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM-kontroller - - - KBM Editor - KBM-redigerare - Back Bakåt @@ -533,6 +521,30 @@ Right Stick Höger spak + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Sparat data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 34baf29bd..4d8d2b916 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -26,7 +26,7 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + Hileler / Yamalar: Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -413,10 +413,6 @@ Configure Controls Kontrolleri Yapılandır - - Control Settings - Kontrol Ayarları - D-Pad Yön Düğmeleri @@ -439,7 +435,7 @@ Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Sol Analog Ölü Bölgesi (şu an:2, en çok:127) Left Deadzone @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Geri @@ -523,7 +511,7 @@ Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Sağ Analog Ölü Bölgesi (şu an:2, en çok:127) Right Deadzone @@ -533,6 +521,30 @@ Right Stick Sağ Analog + + Color Adjustment + Renk Ayarları + + + R: 000 + K: 000 + + + G: 000 + Y: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Rengi Geçersiz Kıl + ElfViewer @@ -825,7 +837,7 @@ Delete %1 - Delete %1 + Sil: %1 Are you sure you want to delete %1's %2 directory? @@ -845,7 +857,7 @@ Failed to convert icon. - Failed to convert icon. + Simge dönüştürülemedi. This game has no save data to delete! @@ -855,6 +867,10 @@ Save Data Kayıt Verisi + + SFO Viewer for + SFO Görüntüleyici: + InstallDirSelect @@ -864,7 +880,7 @@ Select which directory you want to install to. - Select which directory you want to install to. + Hangi dizine yüklemek istediğinizi seçin. Install All Queued to Selected Folder @@ -1163,7 +1179,7 @@ PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG bir yama ya da indirilebilir içerik, lütfen önce oyunu yükleyin! Game is already running! @@ -1741,7 +1757,7 @@ Nightly - Nightly + Günlük Set the volume of the background music. @@ -1749,7 +1765,7 @@ Enable Motion Controls - Enable Motion Controls + Hareket Kontrollerini Etkinleştir Save Data Path @@ -1769,7 +1785,7 @@ Auto Select - Auto Select + Otomatik Seç Directory to install games diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 8506d6e33..4a18079de 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Збереження + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 4334a3be2..50d6372cc 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -413,10 +413,6 @@ Configure Controls Cấu hình điều khiển - - Control Settings - Cài đặt điều khiển - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 21daafb5e..9a979394b 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -413,10 +413,6 @@ Configure Controls 配置按键 - - Control Settings - 按键配置 - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - 键鼠 - - - KBM Editor - 键鼠配置 - Back Back @@ -533,6 +521,30 @@ Right Stick 右摇杆 + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data 存档数据 + + SFO Viewer for + SFO Viewer for + InstallDirSelect diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 2654e8707..22edba21e 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -413,10 +413,6 @@ Configure Controls Configure Controls - - Control Settings - Control Settings - D-Pad D-Pad @@ -469,14 +465,6 @@ L2 / LT L2 / LT - - KBM Controls - KBM Controls - - - KBM Editor - KBM Editor - Back Back @@ -533,6 +521,30 @@ Right Stick Right Stick + + Color Adjustment + Color Adjustment + + + R: 000 + R: 000 + + + G: 000 + G: 000 + + + B: 255 + B: 255 + + + Override Lightbar Color + Override Lightbar Color + + + Override Color + Override Color + ElfViewer @@ -855,6 +867,10 @@ Save Data Save Data + + SFO Viewer for + SFO Viewer for + InstallDirSelect From 8447412c776e25cd0728903dd58681bd0abeeade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:55:13 +0100 Subject: [PATCH 315/455] Bump to Clang 19 (#2434) --- .ci/clang-format.sh | 2 +- .github/workflows/build.yml | 4 ++-- src/common/polyfill_thread.h | 4 +++- src/common/thread.cpp | 2 +- src/core/signals.cpp | 4 ++-- src/qt_gui/kbm_config_dialog.h | 4 ++-- src/shader_recompiler/ir/breadth_first_search.h | 8 ++++---- src/shader_recompiler/ir/opcodes.h | 2 +- 8 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.ci/clang-format.sh b/.ci/clang-format.sh index c0d8c2c2d..15868550f 100755 --- a/.ci/clang-format.sh +++ b/.ci/clang-format.sh @@ -10,7 +10,7 @@ if grep -nrI '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .ci* dis fi # Default clang-format points to default 3.5 version one -CLANG_FORMAT=clang-format-18 +CLANG_FORMAT=clang-format-19 $CLANG_FORMAT --version if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 63074a0a8..658308b39 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,9 +30,9 @@ jobs: - name: Install run: | wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main' + sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-19 main' sudo apt update - sudo apt install clang-format-18 + sudo apt install clang-format-19 - name: Build env: COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} diff --git a/src/common/polyfill_thread.h b/src/common/polyfill_thread.h index 12e59a893..ca0481055 100644 --- a/src/common/polyfill_thread.h +++ b/src/common/polyfill_thread.h @@ -339,7 +339,9 @@ void CondvarWait(Condvar& cv, std::unique_lock& lk, std::stop_token token, } std::stop_callback callback(token, [&] { - { std::scoped_lock lk2{*lk.mutex()}; } + { + std::scoped_lock lk2{*lk.mutex()}; + } cv.notify_all(); }); diff --git a/src/common/thread.cpp b/src/common/thread.cpp index c87aea6ef..9ef1e86d8 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -41,7 +41,7 @@ void SetCurrentThreadRealtime(const std::chrono::nanoseconds period_ns) { const std::chrono::nanoseconds computation_ns = period_ns / 2; // Determine the timebase for converting time to ticks. - struct mach_timebase_info timebase {}; + struct mach_timebase_info timebase{}; mach_timebase_info(&timebase); const auto ticks_per_ns = static_cast(timebase.denom) / static_cast(timebase.numer); diff --git a/src/core/signals.cpp b/src/core/signals.cpp index 89844ae25..e47a78cd2 100644 --- a/src/core/signals.cpp +++ b/src/core/signals.cpp @@ -111,7 +111,7 @@ SignalDispatch::SignalDispatch() { ASSERT_MSG(handle = AddVectoredExceptionHandler(0, SignalHandler), "Failed to register exception handler."); #else - struct sigaction action {}; + struct sigaction action{}; action.sa_sigaction = SignalHandler; action.sa_flags = SA_SIGINFO | SA_ONSTACK; sigemptyset(&action.sa_mask); @@ -130,7 +130,7 @@ SignalDispatch::~SignalDispatch() { #if defined(_WIN32) ASSERT_MSG(RemoveVectoredExceptionHandler(handle), "Failed to remove exception handler."); #else - struct sigaction action {}; + struct sigaction action{}; action.sa_handler = SIG_DFL; action.sa_flags = 0; sigemptyset(&action.sa_mask); diff --git a/src/qt_gui/kbm_config_dialog.h b/src/qt_gui/kbm_config_dialog.h index f436b4a71..cc334b082 100644 --- a/src/qt_gui/kbm_config_dialog.h +++ b/src/qt_gui/kbm_config_dialog.h @@ -9,8 +9,8 @@ #include "string" class EditorDialog : public QDialog { - Q_OBJECT // Necessary for using Qt's meta-object system (signals/slots) - public : explicit EditorDialog(QWidget* parent = nullptr); // Constructor +Q_OBJECT // Necessary for using Qt's meta-object system (signals/slots) + public : explicit EditorDialog(QWidget* parent = nullptr); // Constructor protected: void closeEvent(QCloseEvent* event) override; // Override close event diff --git a/src/shader_recompiler/ir/breadth_first_search.h b/src/shader_recompiler/ir/breadth_first_search.h index 390dffb5c..9deeb2363 100644 --- a/src/shader_recompiler/ir/breadth_first_search.h +++ b/src/shader_recompiler/ir/breadth_first_search.h @@ -14,8 +14,8 @@ namespace Shader::IR { // Use typename Instruction so the function can be used to return either const or mutable // Insts depending on the context. template -auto BreadthFirstSearch(Instruction* inst, - Pred&& pred) -> std::invoke_result_t { +auto BreadthFirstSearch(Instruction* inst, Pred&& pred) + -> std::invoke_result_t { // Most often case the instruction is the desired already. if (std::optional result = pred(inst)) { return result; @@ -53,8 +53,8 @@ auto BreadthFirstSearch(Instruction* inst, } template -auto BreadthFirstSearch(const Value& value, - Pred&& pred) -> std::invoke_result_t { +auto BreadthFirstSearch(const Value& value, Pred&& pred) + -> std::invoke_result_t { if (value.IsImmediate()) { // Nothing to do with immediates return std::nullopt; diff --git a/src/shader_recompiler/ir/opcodes.h b/src/shader_recompiler/ir/opcodes.h index cd73ace7e..f3d16da4a 100644 --- a/src/shader_recompiler/ir/opcodes.h +++ b/src/shader_recompiler/ir/opcodes.h @@ -53,7 +53,7 @@ constexpr Type F64x3{Type::F64x3}; constexpr Type F64x4{Type::F64x4}; constexpr Type StringLiteral{Type::StringLiteral}; -constexpr OpcodeMeta META_TABLE[] { +constexpr OpcodeMeta META_TABLE[]{ #define OPCODE(name_token, type_token, ...) \ { \ .name{#name_token}, \ From 7d756e79ae2b437743cc6c4f4e407840c7bf0995 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 18 Feb 2025 15:55:41 +0200 Subject: [PATCH 316/455] New Crowdin updates (#2470) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Spanish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Polish) * New translations en_us.ts (Russian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Italian) * New translations en_us.ts (Russian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Swedish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Albanian) --- src/qt_gui/translations/ar_SA.ts | 16 +++++-------- src/qt_gui/translations/da_DK.ts | 16 +++++-------- src/qt_gui/translations/de_DE.ts | 16 +++++-------- src/qt_gui/translations/el_GR.ts | 16 +++++-------- src/qt_gui/translations/es_ES.ts | 24 ++++++++----------- src/qt_gui/translations/fa_IR.ts | 16 +++++-------- src/qt_gui/translations/fi_FI.ts | 16 +++++-------- src/qt_gui/translations/fr_FR.ts | 16 +++++-------- src/qt_gui/translations/hu_HU.ts | 16 +++++-------- src/qt_gui/translations/id_ID.ts | 16 +++++-------- src/qt_gui/translations/it_IT.ts | 24 ++++++++----------- src/qt_gui/translations/ja_JP.ts | 16 +++++-------- src/qt_gui/translations/ko_KR.ts | 16 +++++-------- src/qt_gui/translations/lt_LT.ts | 16 +++++-------- src/qt_gui/translations/nb_NO.ts | 16 +++++-------- src/qt_gui/translations/nl_NL.ts | 16 +++++-------- src/qt_gui/translations/pl_PL.ts | 16 +++++-------- src/qt_gui/translations/pt_BR.ts | 16 +++++-------- src/qt_gui/translations/pt_PT.ts | 16 +++++-------- src/qt_gui/translations/ro_RO.ts | 16 +++++-------- src/qt_gui/translations/ru_RU.ts | 24 ++++++++----------- src/qt_gui/translations/sq_AL.ts | 24 ++++++++----------- src/qt_gui/translations/sv_SE.ts | 24 ++++++++----------- src/qt_gui/translations/tr_TR.ts | 40 ++++++++++++++------------------ src/qt_gui/translations/uk_UA.ts | 16 +++++-------- src/qt_gui/translations/vi_VN.ts | 16 +++++-------- src/qt_gui/translations/zh_CN.ts | 24 ++++++++----------- src/qt_gui/translations/zh_TW.ts | 16 +++++-------- 28 files changed, 204 insertions(+), 316 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 94fa24552..2c4535cf6 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -9,10 +9,6 @@ About shadPS4 حول shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 هو محاكي تجريبي مفتوح المصدر لجهاز PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 2c8a88614..b82b451bb 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 0dc996792..b1251452c 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -9,10 +9,6 @@ About shadPS4 Über shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 ist ein experimenteller Open-Source-Emulator für die Playstation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 139e06dc3..8ecc06e6c 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 3d3636d24..e342bf51f 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -9,10 +9,6 @@ About shadPS4 Acerca de shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 es un emulador experimental de código abierto para la PlayStation 4. @@ -98,7 +94,7 @@ Error - Error + Error No patch selected. @@ -257,7 +253,7 @@ Error - Error + Error Network error: @@ -321,7 +317,7 @@ No - No + No Hide Changelog @@ -372,7 +368,7 @@ Error - Error + Error Unable to update compatibility data! Try again later. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index e5e11dd62..1cdddcf46 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -9,10 +9,6 @@ About shadPS4 درباره ShadPS4 - - shadPS4 - ShadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. یک شبیه ساز متن باز برای پلی استیشن 4 است. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 1db90a940..1b8ef4166 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -9,10 +9,6 @@ About shadPS4 Tietoa shadPS4:sta - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 on kokeellinen avoimen lähdekoodin PlayStation 4 emulaattori. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 642382e9c..656ce750d 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -9,10 +9,6 @@ About shadPS4 À propos de shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 est un émulateur open-source expérimental de la PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index aa1a289aa..5be4a6658 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -9,10 +9,6 @@ About shadPS4 A shadPS4-ről - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. A shadPS4 egy kezdetleges, open-source PlayStation 4 emulátor. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 1f359fca7..81ae6b0ff 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 66776c7fe..32bb44d3f 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -9,10 +9,6 @@ About shadPS4 Riguardo shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 è un emulatore sperimentale open-source per PlayStation 4. @@ -523,27 +519,27 @@ Color Adjustment - Color Adjustment + Regolazione Colore - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + V: - B: 255 - B: 255 + B: + B: Override Lightbar Color - Override Lightbar Color + Sostituisci Colore Lightbar Override Color - Override Color + Sostituisci Colore @@ -869,7 +865,7 @@ SFO Viewer for - SFO Viewer for + Visualizzatore SFO per diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index b4207e772..8614fb79d 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -9,10 +9,6 @@ About shadPS4 shadPS4について - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4は、PlayStation 4の実験的なオープンソースエミュレーターです。 @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 80e99ba13..98393050f 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index c21fa5c64..b9be1abbd 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 8bcf31ee3..aea48dec4 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -9,10 +9,6 @@ About shadPS4 Om shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 er en eksperimentell åpen kildekode-emulator for PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 9cf7d955e..e6497768e 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index abcefbb7c..379abe346 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -9,10 +9,6 @@ About shadPS4 O programie - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 to eksperymentalny otwartoźródłowy emulator konsoli PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index accc00561..6b92e74af 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -9,10 +9,6 @@ About shadPS4 Sobre o shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. @@ -526,16 +522,16 @@ Ajuste de Cores - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 95d344ba7..eb25114bf 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -9,10 +9,6 @@ About shadPS4 Sobre o shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 é um emulador de código aberto experimental para o PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index a5f62cbfd..4f74cb21d 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index d999bf6fe..71fd06b6f 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -9,10 +9,6 @@ About shadPS4 О shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 это экспериментальный эмулятор с открытым исходным кодом для PlayStation 4. @@ -523,27 +519,27 @@ Color Adjustment - Color Adjustment + Настройка цвета - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color - Override Lightbar Color + Заменить цвет световой панели Override Color - Override Color + Заменить цвет @@ -869,7 +865,7 @@ SFO Viewer for - SFO Viewer for + Просмотр SFO для diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 59fcfcf74..623b15604 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -9,10 +9,6 @@ About shadPS4 Rreth shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 është një emulator eksperimental me burim të hapur për PlayStation 4. @@ -523,27 +519,27 @@ Color Adjustment - Color Adjustment + Rregullimi i Ngjyrave - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color - Override Lightbar Color + Zëvendëso Ngjyrën e Shiritit të ndriçimit Override Color - Override Color + Zëvendëso Ngjyrën @@ -869,7 +865,7 @@ SFO Viewer for - SFO Viewer for + Shikuesi SFO për diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 46016207c..c7d83055a 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -9,10 +9,6 @@ About shadPS4 Om shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 är en experimentell emulator för PlayStation 4 baserad på öppen källkod. @@ -523,27 +519,27 @@ Color Adjustment - Color Adjustment + Färgjustering - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color - Override Lightbar Color + Åsidosätt ljusrampens färg Override Color - Override Color + Åsidosätt färg @@ -869,7 +865,7 @@ SFO Viewer for - SFO Viewer for + SFO-visare för diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 4d8d2b916..0ecddb128 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -9,10 +9,6 @@ About shadPS4 shadPS4 Hakkında - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4, PlayStation 4 için deneysel bir açık kaynak kodlu emülatördür. @@ -526,20 +522,20 @@ Renk Ayarları - R: 000 - K: 000 + R: + K: - G: 000 - Y: 000 + G: + Y: - B: 255 - B: 255 + B: + M: Override Lightbar Color - Override Lightbar Color + Işıklı Çubuk Rengini Geçersiz Kıl Override Color @@ -841,7 +837,7 @@ Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + %1%2 adlı oyunun dizinini silmek istediğinize emin misiniz? Open Update Folder @@ -888,7 +884,7 @@ Delete PKG File on Install - Delete PKG File on Install + Yüklemede PKG Dosyasını Sil @@ -1210,7 +1206,7 @@ Installed - Installed + Yüklü Size @@ -1449,7 +1445,7 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Çökme Tanılamalarını Etkinleştir Collect Shaders @@ -1609,7 +1605,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Kupa Açılır Pencerelerini Devre Dışı Bırak:\nOyun için kupa bildirimlerini devre dışı bırakın. Kupa ilerlemesi hala Kupa Görüntüleyicisi kullanılarak takip edilebilir (ana menüde oyuna sağ tıklayın). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1625,7 +1621,7 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Uyumluluk Verilerini Göster:\nOyun uyumluluk bilgilerini tablo görünümünde görüntüler. Güncel bilgileri almak için "Başlangıçta Uyumluluk Veritabanını Güncelle"yi etkinleştirin. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. @@ -1717,7 +1713,7 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Gölgelendiricileri Topla:\nHata ayıklama menüsüyle (Ctrl + F10) gölgelendiricileri düzenlemek için bunun etkinleştirilmesi gerekir. Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. @@ -1725,7 +1721,7 @@ Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + GPU Arabelleklerini Kopyala:\nGPU gönderimlerini içeren yarış koşullarının etrafından dolaşır.\nPM4 tip 0 çökmelerine yardımcı olabilir veya olmayabilir. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. @@ -1733,7 +1729,7 @@ Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Konuk Hata Ayıklama İşaretleyicileri\nOyunun kendisinin komut arabelleğine eklediği tüm hata ayıklama işaretlerini ekler.\nBunu etkinleştirdiyseniz, Çökme Tanılamalarını etkinleştirmeniz gerekir.\nRenderDoc gibi programlar için kullanışlıdır. Save Data Path:\nThe folder where game save data will be saved. @@ -1741,7 +1737,7 @@ Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Gözat:\nVerileri kaydetme yolu olarak ayarlamak için bir klasöre göz atın. Borderless @@ -1749,7 +1745,7 @@ True - True + Gerçek Ekran Release diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 4a18079de..aa430d401 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -9,10 +9,6 @@ About shadPS4 Про shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 - це експериментальний емулятор з відкритим вихідним кодом для PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 50d6372cc..cccec7ae0 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -9,10 +9,6 @@ About shadPS4 Về shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 là một trình giả lập thử nghiệm mã nguồn mở cho PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 9a979394b..2c5d5005e 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -9,10 +9,6 @@ About shadPS4 关于 shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 是一款实验性质的开源 PlayStation 4 模拟器软件。 @@ -523,27 +519,27 @@ Color Adjustment - Color Adjustment + 颜色调整 - R: 000 - R: 000 + R: + 红: - G: 000 - G: 000 + G: + 绿: - B: 255 - B: 255 + B: + 蓝: Override Lightbar Color - Override Lightbar Color + 覆盖灯条颜色 Override Color - Override Color + 覆盖颜色 @@ -869,7 +865,7 @@ SFO Viewer for - SFO Viewer for + SFO 查看器 - diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 22edba21e..82202a6d6 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -9,10 +9,6 @@ About shadPS4 About shadPS4 - - shadPS4 - shadPS4 - shadPS4 is an experimental open-source emulator for the PlayStation 4. shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -526,16 +522,16 @@ Color Adjustment - R: 000 - R: 000 + R: + R: - G: 000 - G: 000 + G: + G: - B: 255 - B: 255 + B: + B: Override Lightbar Color From 48c621532cedef89db225cacb40074a4577bdf16 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Wed, 19 Feb 2025 08:29:04 -0300 Subject: [PATCH 317/455] Cheats/Patches - add mask_jump32 (#2477) * mask_jump32 * fix qt/sdl * fix dangling pointer? fixes the warning: "clang-diagnostic-dangling-gls: object backing the pointer will be destroyed at the end of the full-expression" --- src/common/memory_patcher.cpp | 164 ++++++++++++++++++++++++++-------- src/common/memory_patcher.h | 5 +- src/qt_gui/cheats_patches.cpp | 22 ++--- 3 files changed, 137 insertions(+), 54 deletions(-) diff --git a/src/common/memory_patcher.cpp b/src/common/memory_patcher.cpp index 899bb6bf3..0a74a45a5 100644 --- a/src/common/memory_patcher.cpp +++ b/src/common/memory_patcher.cpp @@ -144,37 +144,39 @@ void OnGameLoaded() { std::string type = patchLineIt->attribute("Type").value(); std::string address = patchLineIt->attribute("Address").value(); std::string patchValue = patchLineIt->attribute("Value").value(); - std::string maskOffsetStr = patchLineIt->attribute("type").value(); - - patchValue = convertValueToHex(type, patchValue); + std::string maskOffsetStr = patchLineIt->attribute("Offset").value(); + std::string targetStr = ""; + std::string sizeStr = ""; + if (type == "mask_jump32") { + std::string patchValue = patchLineIt->attribute("Value").value(); + targetStr = patchLineIt->attribute("Target").value(); + sizeStr = patchLineIt->attribute("Size").value(); + } else { + patchValue = convertValueToHex(type, patchValue); + } bool littleEndian = false; - if (type == "bytes16") { - littleEndian = true; - } else if (type == "bytes32") { - littleEndian = true; - } else if (type == "bytes64") { + if (type == "bytes16" || type == "bytes32" || type == "bytes64") { littleEndian = true; } MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None; int maskOffsetValue = 0; - if (type == "mask") { + if (type == "mask") patchMask = MemoryPatcher::PatchMask::Mask; - // im not sure if this works, there is no games to test the mask - // offset on yet - if (!maskOffsetStr.empty()) - maskOffsetValue = std::stoi(maskOffsetStr, 0, 10); - } - if (type == "mask_jump32") patchMask = MemoryPatcher::PatchMask::Mask_Jump32; - MemoryPatcher::PatchMemory(currentPatchName, address, patchValue, false, - littleEndian, patchMask, maskOffsetValue); + if (type == "mask" || type == "mask_jump32" && !maskOffsetStr.empty()) { + maskOffsetValue = std::stoi(maskOffsetStr, 0, 10); + } + + MemoryPatcher::PatchMemory(currentPatchName, address, patchValue, + targetStr, sizeStr, false, littleEndian, + patchMask, maskOffsetValue); } } } @@ -279,6 +281,10 @@ void OnGameLoaded() { lineObject["Address"] = attributes.value("Address").toString(); lineObject["Value"] = attributes.value("Value").toString(); lineObject["Offset"] = attributes.value("Offset").toString(); + if (lineObject["Type"].toString() == "mask_jump32") { + lineObject["Target"] = attributes.value("Target").toString(); + lineObject["Size"] = attributes.value("Size").toString(); + } linesArray.append(lineObject); } } @@ -292,37 +298,40 @@ void OnGameLoaded() { QString patchValue = lineObject["Value"].toString(); QString maskOffsetStr = lineObject["Offset"].toString(); - patchValue = QString::fromStdString( - convertValueToHex(type.toStdString(), patchValue.toStdString())); + QString targetStr; + QString sizeStr; + if (type == "mask_jump32") { + QString valueAttributeStr = lineObject["Value"].toString(); + targetStr = lineObject["Value"].toString(); + sizeStr = lineObject["Size"].toString(); + } else { + patchValue = QString::fromStdString(convertValueToHex( + type.toStdString(), patchValue.toStdString())); + } bool littleEndian = false; - if (type == "bytes16") { + if (type == "bytes16" || type == "bytes32" || type == "bytes64") littleEndian = true; - } else if (type == "bytes32") { - littleEndian = true; - } else if (type == "bytes64") { - littleEndian = true; - } MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None; int maskOffsetValue = 0; - if (type == "mask") { + if (type == "mask") patchMask = MemoryPatcher::PatchMask::Mask; - // im not sure if this works, there is no games to test the mask - // offset on yet - if (!maskOffsetStr.toStdString().empty()) - maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10); - } - if (type == "mask_jump32") patchMask = MemoryPatcher::PatchMask::Mask_Jump32; - MemoryPatcher::PatchMemory(currentPatchName, address.toStdString(), - patchValue.toStdString(), false, - littleEndian, patchMask, maskOffsetValue); + if (type == "mask" || + type == "mask_jump32" && !maskOffsetStr.toStdString().empty()) { + maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10); + } + + MemoryPatcher::PatchMemory( + currentPatchName, address.toStdString(), patchValue.toStdString(), + targetStr.toStdString(), sizeStr.toStdString(), false, littleEndian, + patchMask, maskOffsetValue); } } } @@ -351,7 +360,7 @@ void ApplyPendingPatches() { if (currentPatch.gameSerial != g_game_serial) continue; - PatchMemory(currentPatch.modNameStr, currentPatch.offsetStr, currentPatch.valueStr, + PatchMemory(currentPatch.modNameStr, currentPatch.offsetStr, currentPatch.valueStr, "", "", currentPatch.isOffset, currentPatch.littleEndian, currentPatch.patchMask, currentPatch.maskOffset); } @@ -359,8 +368,9 @@ void ApplyPendingPatches() { pending_patches.clear(); } -void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, bool isOffset, - bool littleEndian, PatchMask patchMask, int maskOffset) { +void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, + std::string targetStr, std::string sizeStr, bool isOffset, bool littleEndian, + PatchMask patchMask, int maskOffset) { // Send a request to modify the process memory. void* cheatAddress = nullptr; @@ -377,7 +387,83 @@ void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valu cheatAddress = reinterpret_cast(PatternScan(offsetStr) + maskOffset); } - // TODO: implement mask_jump32 + if (patchMask == PatchMask::Mask_Jump32) { + int jumpSize = std::stoi(sizeStr); + + constexpr int MAX_PATTERN_LENGTH = 256; + if (jumpSize < 5) { + LOG_ERROR(Loader, "Jump size must be at least 5 bytes"); + return; + } + if (jumpSize > MAX_PATTERN_LENGTH) { + LOG_ERROR(Loader, "Jump size must be no more than {} bytes.", MAX_PATTERN_LENGTH); + return; + } + + // Find the base address using "Address" + uintptr_t baseAddress = PatternScan(offsetStr); + if (baseAddress == 0) { + LOG_ERROR(Loader, "PatternScan failed for mask_jump32 with pattern: {}", offsetStr); + return; + } + uintptr_t patchAddress = baseAddress + maskOffset; + + // Fills the original region (jumpSize bytes) with NOPs + std::vector nopBytes(jumpSize, 0x90); + std::memcpy(reinterpret_cast(patchAddress), nopBytes.data(), nopBytes.size()); + + // Use "Target" to locate the start of the code cave + uintptr_t jump_target = PatternScan(targetStr); + if (jump_target == 0) { + LOG_ERROR(Loader, "PatternScan failed to Target with pattern: {}", targetStr); + return; + } + + // Converts the Value attribute to a byte array (payload) + std::vector payload; + for (size_t i = 0; i < valueStr.length(); i += 2) { + + std::string tempStr = valueStr.substr(i, 2); + const char* byteStr = tempStr.c_str(); + char* endPtr; + unsigned int byteVal = std::strtoul(byteStr, &endPtr, 16); + + if (endPtr != byteStr + 2) { + LOG_ERROR(Loader, "Invalid byte in Value: {}", valueStr.substr(i, 2)); + return; + } + payload.push_back(static_cast(byteVal)); + } + + // Calculates the end of the code cave (where the return jump will be inserted) + uintptr_t code_cave_end = jump_target + payload.size(); + + // Write the payload to the code cave, from jump_target + std::memcpy(reinterpret_cast(jump_target), payload.data(), payload.size()); + + // Inserts the initial jump in the original region to divert to the code cave + u8 jumpInstruction[5]; + jumpInstruction[0] = 0xE9; + s32 relJump = static_cast(jump_target - patchAddress - 5); + std::memcpy(&jumpInstruction[1], &relJump, sizeof(relJump)); + std::memcpy(reinterpret_cast(patchAddress), jumpInstruction, + sizeof(jumpInstruction)); + + // Inserts jump back at the end of the code cave to resume execution after patching + u8 jumpBack[5]; + jumpBack[0] = 0xE9; + // Calculates the relative offset to return to the instruction immediately following the + // overwritten region + s32 target_return = static_cast((patchAddress + jumpSize) - (code_cave_end + 5)); + std::memcpy(&jumpBack[1], &target_return, sizeof(target_return)); + std::memcpy(reinterpret_cast(code_cave_end), jumpBack, sizeof(jumpBack)); + + LOG_INFO(Loader, + "Applied Patch mask_jump32: {}, PatchAddress: {:#x}, JumpTarget: {:#x}, " + "CodeCaveEnd: {:#x}, JumpSize: {}", + modNameStr, patchAddress, jump_target, code_cave_end, jumpSize); + return; + } if (cheatAddress == nullptr) { LOG_ERROR(Loader, "Failed to get address for patch {}", modNameStr); diff --git a/src/common/memory_patcher.h b/src/common/memory_patcher.h index 899ffccb1..29045a6a2 100644 --- a/src/common/memory_patcher.h +++ b/src/common/memory_patcher.h @@ -38,8 +38,9 @@ void OnGameLoaded(); void AddPatchToQueue(patchInfo patchToAdd); void ApplyPendingPatches(); -void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, bool isOffset, - bool littleEndian, PatchMask patchMask = PatchMask::None, int maskOffset = 0); +void PatchMemory(std::string modNameStr, std::string offsetStr, std::string valueStr, + std::string targetStr, std::string sizeStr, bool isOffset, bool littleEndian, + PatchMask patchMask = PatchMask::None, int maskOffset = 0); static std::vector PatternToByte(const std::string& pattern); uintptr_t PatternScan(const std::string& signature); diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index 01227d822..597729a45 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -1346,7 +1346,7 @@ void CheatsPatches::applyCheat(const QString& modName, bool enabled) { // Determine if the hint field is present bool isHintPresent = m_cheats[modName].hasHint; - MemoryPatcher::PatchMemory(modNameStr, offsetStr, valueStr, !isHintPresent, false); + MemoryPatcher::PatchMemory(modNameStr, offsetStr, valueStr, "", "", !isHintPresent, false); } } @@ -1368,28 +1368,23 @@ void CheatsPatches::applyPatch(const QString& patchName, bool enabled) { bool littleEndian = false; - if (type == "bytes16") { - littleEndian = true; - } else if (type == "bytes32") { - littleEndian = true; - } else if (type == "bytes64") { + if (type == "bytes16" || type == "bytes32" || type == "bytes64") { littleEndian = true; } MemoryPatcher::PatchMask patchMask = MemoryPatcher::PatchMask::None; int maskOffsetValue = 0; - if (type == "mask") { + if (type == "mask") patchMask = MemoryPatcher::PatchMask::Mask; - // im not sure if this works, there is no games to test the mask offset on yet - if (!maskOffsetStr.toStdString().empty()) - maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10); - } - if (type == "mask_jump32") patchMask = MemoryPatcher::PatchMask::Mask_Jump32; + if (type == "mask" || type == "mask_jump32" && !maskOffsetStr.toStdString().empty()) { + maskOffsetValue = std::stoi(maskOffsetStr.toStdString(), 0, 10); + } + if (MemoryPatcher::g_eboot_address == 0) { MemoryPatcher::patchInfo addingPatch; addingPatch.gameSerial = patchInfo.serial.toStdString(); @@ -1405,7 +1400,8 @@ void CheatsPatches::applyPatch(const QString& patchName, bool enabled) { continue; } MemoryPatcher::PatchMemory(patchName.toStdString(), address.toStdString(), - patchValue.toStdString(), false, littleEndian, patchMask); + patchValue.toStdString(), "", "", false, littleEndian, + patchMask); } } } From f686b1df98c2eaa87417c46ed9bb4b7f5cf44f9b Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 19 Feb 2025 13:29:16 +0200 Subject: [PATCH 318/455] New Crowdin updates (#2478) * New translations en_us.ts (French) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Italian) --- src/qt_gui/translations/fr_FR.ts | 2 +- src/qt_gui/translations/it_IT.ts | 4 +- src/qt_gui/translations/pt_PT.ts | 94 ++++++++++++++++---------------- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 656ce750d..d328e9bcc 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -1733,7 +1733,7 @@ Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Chemin de sauvegarde :\nLe dossier où les sauvegardes du jeu sont enregistré. Browse:\nBrowse for a folder to set as the save data path. diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 32bb44d3f..be61e0df2 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -1593,7 +1593,7 @@ Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - Aggiornamento:\nRelease: Versioni ufficiali rilasciate ogni mese che potrebbero essere molto datate, ma sono più affidabili e testate.\nNightly: Versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma potrebbero contenere bug e sono meno stabili. + Aggiornamento:\nRilascio: Versioni ufficiali rilasciate ogni mese che possono essere molto obsolete, ma sono più affidabili e testati.\nNotturno: Le versioni di sviluppo che hanno tutte le ultime funzionalità e correzioni, ma possono contenere bug e sono meno stabili. Background Image:\nControl the opacity of the game background image. @@ -1661,7 +1661,7 @@ Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Auto Select" per determinarlo automaticamente. + Dispositivo Grafico:\nIn sistemi con più GPU, seleziona la GPU che l'emulatore utilizzerà dall'elenco a discesa,\no seleziona "Selezione Automatica" per determinarlo automaticamente. Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index eb25114bf..0b5cd5632 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -519,27 +519,27 @@ Color Adjustment - Color Adjustment + Ajuste de Cores R: - R: + R: G: - G: + G: B: - B: + B: Override Lightbar Color - Override Lightbar Color + Substituir cor da Lightbar Override Color - Override Color + Substituir Cor @@ -865,7 +865,7 @@ SFO Viewer for - SFO Viewer for + Visualizador SFO para @@ -1123,7 +1123,7 @@ Would you like to install Patch: - Would you like to install Patch: + Gostaria de instalar o Patch: DLC Installation @@ -1222,7 +1222,7 @@ App Ver - App Ver + App Ver FW @@ -1553,83 +1553,83 @@ Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. + Idioma da consola:\nDefine o idioma usado pelo jogo PS4.\nRecomenda-se configurar isto para um idioma que o jogo suporte, o que pode variar conforme a região. Emulator Language:\nSets the language of the emulator's user interface. - Emulator Language:\nSets the language of the emulator's user interface. + Idioma do Emulador:\nDefine o idioma da interface gráfica do emulador. Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. + Ativar Ecrã Cheio:\nPõe automaticamente a janela do jogo no modo de ecrã cheio.\nIsto pode ser alterado pressionando a tecla F11. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. + Ativar Pasta de Atualização Separada:\nPermite instalar as atualizações dos jogos numa pasta separada para uma fácil gestão.\nIsto pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome "CUSA00000-UPDATE" onde o ID do CUSA corresponde ao ID do jogo. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. - Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. + Mostrar Splash Inicial:\nExibe o ecrã inicial do jogo (uma imagem especial) enquanto o jogo inicia. Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. - Enable Discord Rich Presence:\nDisplays the emulator icon and relevant information on your Discord profile. + Ativar Discord Rich Presence:\nExibe o ícone do emulador e informações relevantes no seu perfil do Discord. Username:\nSets the PS4's account username, which may be displayed by some games. - Username:\nSets the PS4's account username, which may be displayed by some games. + Nome de utilizador:\nDefine o nome de utilizador da conta PS4, que poderá ser exibido por alguns jogos. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Chave de Troféu:\nChave usada para decifrar os troféus. Deverá ser obtida a partir da sua consola desbloqueada.\nDeve conter apenas caracteres hexadecimais. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. + Tipo de Registo:\nDetermina se a saída da janela de registo deve ser sincronizada por motivos de desempenho. Pode impactar negativamente a emulação. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. + Filtro de Registo:\nFiltra o registo de modo a exibir apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - nesta ordem, um nível específico silencia todos os níveis anteriores na lista e regista todos os níveis após ele. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. + Atualização:\nLançamento: Versões oficiais lançadas todos os meses que podem estar desatualizadas, mas são mais estáveis e testadas.\nNightly: Versões de desenvolvimento que têm todos os últimos recursos e correções, mas podem conter bugs e são menos estáveis. Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Imagem de Fundo:\nControla a transparência da imagem de fundo do jogo. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. - Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. + Reproduzir Música de Título:\nSe o jogo suportar, ativa a reprodução de uma música especial ao selecionar o jogo na interface de utilizador. Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Desativar Pop-ups dos Troféus:\nDesativa notificações de troféus em jogo. O progresso do troféu ainda poderá ser rastreado ao usar o Visualizador de Troféus (clique com o botão direito do rato no jogo na janela principal). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. + Ocultar Cursor:\nEscolha quando o cursor desaparecerá:\nNunca: Verá sempre o rato.\nParado: Defina um tempo para desaparecer após ficar inativo.\nSempre: Nunca verá o rato. Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. + Tempo de Espera para Ocultar o Cursor:\nDefine o tempo em segundos para o rato desaparecer após ficar inativo. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. + Comportamento do Botão Voltar:\nConfigura o botão Voltar do comando para emular um toque na posição especificada no touchpad do PS4. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos em visualização de tabela.\nAtivar "Atualizar Base de Dados de Compatibilidade no Arranque" para obter informações atualizadas. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Atualizar Base de Dados de Compatibilidade no Arranque:\nAtualiza automaticamente a base de dados de compatibilidade quando o shadPS4 é iniciado. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Atualizar Base de Dados de Compatibilidade:\nAtualiza imediatamente a base de dados de compatibilidade. Never @@ -1661,31 +1661,31 @@ Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. + Placa Gráfica:\nEm sistemas com múltiplas GPUs, escolha qual GPU da lista o emulador utilizará,\nou escolha "Seleção Automática" para escolher automaticamente a mesma. Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. + Largura/Altura:\nDefine o tamanho da janela do emulador no arranque, que poderá ser redimensionada enquanto joga.\nIsto difere da resolução do jogo. Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! - Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! + Divisor Vblank:\nA taxa de quadros em que o emulador atualiza é multiplicada por este número. Mudar isto poderá ter efeitos negativos, como aumentar a velocidade ou causar problemas na funcionalidade vital de jogo que não esteja à espera que isto mude! Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. + Ativar Dumping de Shaders:\nArmazena as shaders do jogo numa pasta durante a renderização para fins de depuração técnica. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. - Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. + Ativar GPU NULL:\nDesativa a renderização do jogo para fins de depuração técnica, como se não existisse uma placa gráfica. Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Ativar HDR:\nAtiva o HDR em jogos que o suportem.\nO seu monitor deverá ter suporte para o espaço de cores BT2020 PQ e para o formato de swapchain RGB10A2. Game Folders:\nThe list of folders to check for installed games. - Game Folders:\nThe list of folders to check for installed games. + Pastas de Jogos:\nLista de pastas onde procurar jogos instalados. Add:\nAdd a folder to the list. @@ -1697,47 +1697,47 @@ Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. + Ativar Dumping da Depuração:\nArmazena os símbolos de importação, exportação e informações do cabeçalho de ficheiros do atual programa PS4 num diretório. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. + Ativar Camadas de Validação do Vulkan:\nAtiva um sistema que valida o estado do renderizador Vulkan e regista informações sobre o seu estado interno.\nIsto irá diminuir o desempenho e provavelmente mudará o comportamento da emulação. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. + Ativar Validação da Sincronização do Vulkan:\nAtiva um sistema que valida o agendamento de tarefas de renderização Vulkan.\nIsto irá diminuir o desempenho e provavelmente mudará o comportamento da emulação. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. - Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. + Ativar Depuração por RenderDoc:\nSe ativado, o emulador fornecerá compatibilidade com o RenderDoc para permitir a captura e análise do quadro atualmente renderizado. Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Recolher Shaders:\nIrá precisar desta opção ativada para editar shaders com o menu de depuração (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Diagnóstico de Falhas:\nCria um ficheiro .yaml com informações sobre o estado do Vulkan no momento da falha.\nÚtil para depuração de erros de 'Device lost'. Se isto estiver ativado, deverá ativar os Marcadores de Depuração de Host E DE Convidado.\nNão funciona em GPUs Intel.\nPrecisa também de ter as Camadas de Validação Vulkan ativadas e o Vulkan SDK instalado para funcionar. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copiar Buffers da GPU:\nContorna condições de corrida envolvendo envios de GPU.\nPode ou não ajudar com bloqueios do PM4 tipo 0. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marcadores de Depuração do Host:\nInsere informações vindas do lado do emulador como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isto estiver ativado, ative os Diagnósticos de Falha.\nÚtil para programas como o RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marcadores de Depuração do Cliente:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isto estiver ativado, ative os Diagnósticos de Falha.\nÚtil para programas como o RenderDoc. Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Caminho dos Dados Guardados:\nA pasta onde os dados de utilizador dos jogos serão guardados. Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Procurar:\nProcure uma pasta para definir como o caminho para guardar os dados. Borderless From 50aa0f5564992f291ae038af4cfd2d659c571b0d Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Wed, 19 Feb 2025 05:29:31 -0600 Subject: [PATCH 319/455] Update linux build docs (#2474) * fix: update linux build dependencies for libpng - add libpng to linux build docs - add libpng to nix build file * linux docs: reformat code blocks - add code block bash syntax highlighting - format long code blocks to multiline --- documents/building-linux.md | 46 +++++++++++++++++++++++++------------ shell.nix | 1 + 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/documents/building-linux.md b/documents/building-linux.md index 71e26e792..4ca953af6 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -13,33 +13,49 @@ First and foremost, Clang 18 is the **recommended compiler** as it is used for o #### Debian & Ubuntu -``` -sudo apt install build-essential clang git cmake libasound2-dev libpulse-dev libopenal-dev libssl-dev zlib1g-dev libedit-dev libudev-dev libevdev-dev libsdl2-dev libjack-dev libsndio-dev qt6-base-dev qt6-tools-dev qt6-multimedia-dev libvulkan-dev vulkan-validationlayers +```bash +sudo apt install build-essential clang git cmake libasound2-dev \ + libpulse-dev libopenal-dev libssl-dev zlib1g-dev libedit-dev \ + libudev-dev libevdev-dev libsdl2-dev libjack-dev libsndio-dev \ + qt6-base-dev qt6-tools-dev qt6-multimedia-dev libvulkan-dev \ + vulkan-validationlayers libpng-dev ``` #### Fedora -``` -sudo dnf install clang git cmake libatomic alsa-lib-devel pipewire-jack-audio-connection-kit-devel openal-devel openssl-devel libevdev-devel libudev-devel libXext-devel qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtmultimedia-devel qt6-qtsvg-devel qt6-qttools-devel vulkan-devel vulkan-validation-layers +```bash +sudo dnf install clang git cmake libatomic alsa-lib-devel \ + pipewire-jack-audio-connection-kit-devel openal-devel \ + openssl-devel libevdev-devel libudev-devel libXext-devel \ + qt6-qtbase-devel qt6-qtbase-private-devel \ + qt6-qtmultimedia-devel qt6-qtsvg-devel qt6-qttools-devel \ + vulkan-devel vulkan-validation-layers libpng-devel ``` #### Arch Linux -``` -sudo pacman -S base-devel clang git cmake sndio jack2 openal qt6-base qt6-declarative qt6-multimedia sdl2 vulkan-validation-layers +```bash +sudo pacman -S base-devel clang git cmake sndio jack2 openal \ + qt6-base qt6-declarative qt6-multimedia sdl2 \ + vulkan-validation-layers libpng ``` **Note**: The `shadps4-git` AUR package is not maintained by any of the developers, and it uses the default compiler, which is often set to GCC. Use at your own discretion. #### OpenSUSE -``` -sudo zypper install clang git cmake libasound2 libpulse-devel libsndio7 libjack-devel openal-soft-devel libopenssl-devel zlib-devel libedit-devel systemd-devel libevdev-devel qt6-base-devel qt6-multimedia-devel qt6-svg-devel qt6-linguist-devel qt6-gui-private-devel vulkan-devel vulkan-validationlayers +```bash +sudo zypper install clang git cmake libasound2 libpulse-devel \ + libsndio7 libjack-devel openal-soft-devel libopenssl-devel \ + zlib-devel libedit-devel systemd-devel libevdev-devel \ + qt6-base-devel qt6-multimedia-devel qt6-svg-devel \ + qt6-linguist-devel qt6-gui-private-devel vulkan-devel \ + vulkan-validationlayers libpng-devel ``` #### NixOS -``` +```bash nix-shell shell.nix ``` @@ -50,7 +66,7 @@ You can try one of two methods: - Search the packages by name and install them with your package manager, or - Install [distrobox](https://distrobox.it/), create a container using any of the distributions cited above as a base, for Arch Linux you'd do: -``` +```bash distrobox create --name archlinux --init --image archlinux:latest ``` @@ -59,7 +75,7 @@ This option is **highly recommended** for distributions with immutable/atomic fi ### Cloning -``` +```bash git clone --recursive https://github.com/shadps4-emu/shadPS4.git cd shadPS4 ``` @@ -72,7 +88,7 @@ There are 3 options you can choose from. Option 1 is **highly recommended**. 1. Generate the build directory in the shadPS4 directory. -``` +```bash cmake -S . -B build/ -DENABLE_QT_GUI=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ``` @@ -80,7 +96,7 @@ To disable the Qt GUI, remove the `-DENABLE_QT_GUI=ON` flag. To change the build 2. Use CMake to build the project: -``` +```bash cmake --build ./build --parallel$(nproc) ``` @@ -88,13 +104,13 @@ If your computer freezes during this step, this could be caused by excessive sys Now run the emulator. If Qt was enabled at configure time: -``` +```bash ./build/shadps4 ``` Otherwise, specify the path to your PKG's boot file: -``` +```bash ./build/shadps4 /"PATH"/"TO"/"GAME"/"FOLDER"/eboot.bin ``` diff --git a/shell.nix b/shell.nix index cc9cc1f82..4eee9fdea 100644 --- a/shell.nix +++ b/shell.nix @@ -46,6 +46,7 @@ pkgs.mkShell { pkgs.stb pkgs.qt6.qtwayland pkgs.wayland-protocols + pkgs.libpng ]; shellHook = '' From da0ab005c78f18afb4168b332107042b1f1d0375 Mon Sep 17 00:00:00 2001 From: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:31:35 +0200 Subject: [PATCH 320/455] video_core: Fix some cases of "Attempted to track non-GPU memory" (#2447) * memory: Consider flexible mappings as gpu accessible Multiple guest apps do this with perfectly valid sharps in simple shaders. This needs some hw testing to see how it is handled but for now doesnt hurt to handle it * memory: Clamp large buffers to mapped area Sometimes huge buffers can be bound that start on some valid mapping but arent fully contained by it. It is not reasonable to expect the game needing all of the memory, so clamp the size to avoid the gpu tracking assert * clang-format fix --------- Co-authored-by: georgemoralis --- src/core/memory.cpp | 23 +++++++++++++++---- src/core/memory.h | 2 ++ .../renderer_vulkan/vk_rasterizer.cpp | 19 ++++++++------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 4717b3a74..23fb6192f 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -56,6 +56,23 @@ void MemoryManager::SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1 total_flexible_size, total_direct_size); } +u64 MemoryManager::ClampRangeSize(VAddr virtual_addr, u64 size) { + static constexpr u64 MinSizeToClamp = 1_GB; + // Dont bother with clamping if the size is small so we dont pay a map lookup on every buffer. + if (size < MinSizeToClamp) { + return size; + } + const auto vma = FindVMA(virtual_addr); + ASSERT_MSG(vma != vma_map.end(), "Attempted to access invalid GPU address {:#x}", virtual_addr); + const u64 clamped_size = + std::min(size, vma->second.base + vma->second.size - virtual_addr); + if (size != clamped_size) { + LOG_WARNING(Kernel_Vmm, "Clamped requested buffer range addr={:#x}, size={:#x} to {:#x}", + virtual_addr, size, clamped_size); + } + return clamped_size; +} + bool MemoryManager::TryWriteBacking(void* address, const void* data, u32 num_bytes) { const VAddr virtual_addr = std::bit_cast(address); const auto& vma = FindVMA(virtual_addr)->second; @@ -314,11 +331,11 @@ int MemoryManager::MapMemory(void** out_addr, VAddr virtual_addr, size_t size, M if (type == VMAType::Direct) { new_vma.phys_base = phys_addr; - rasterizer->MapMemory(mapped_addr, size); } if (type == VMAType::Flexible) { flexible_usage += size; } + rasterizer->MapMemory(mapped_addr, size); return ORBIS_OK; } @@ -406,12 +423,10 @@ u64 MemoryManager::UnmapBytesFromEntry(VAddr virtual_addr, VirtualMemoryArea vma if (type == VMAType::Free) { return adjusted_size; } - if (type == VMAType::Direct || type == VMAType::Pooled) { - rasterizer->UnmapMemory(virtual_addr, adjusted_size); - } if (type == VMAType::Flexible) { flexible_usage -= adjusted_size; } + rasterizer->UnmapMemory(virtual_addr, adjusted_size); // Mark region as free and attempt to coalesce it with neighbours. const auto new_it = CarveVMA(virtual_addr, adjusted_size); diff --git a/src/core/memory.h b/src/core/memory.h index 59e48b248..ff7b82c10 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -164,6 +164,8 @@ public: return virtual_addr >= vma_map.begin()->first && virtual_addr < end_addr; } + u64 ClampRangeSize(VAddr virtual_addr, u64 size); + bool TryWriteBacking(void* address, const void* data, u32 num_bytes); void SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1, bool use_extended_mem2); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 4d58c0ea3..87d07a967 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -502,16 +502,17 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding for (const auto& desc : stage.buffers) { const auto vsharp = desc.GetSharp(stage); if (!desc.IsSpecial() && vsharp.base_address != 0 && vsharp.GetSize() > 0) { - const auto buffer_id = buffer_cache.FindBuffer(vsharp.base_address, vsharp.GetSize()); - buffer_bindings.emplace_back(buffer_id, vsharp); + const u64 size = memory->ClampRangeSize(vsharp.base_address, vsharp.GetSize()); + const auto buffer_id = buffer_cache.FindBuffer(vsharp.base_address, size); + buffer_bindings.emplace_back(buffer_id, vsharp, size); } else { - buffer_bindings.emplace_back(VideoCore::BufferId{}, vsharp); + buffer_bindings.emplace_back(VideoCore::BufferId{}, vsharp, 0); } } // Second pass to re-bind buffers that were updated after binding for (u32 i = 0; i < buffer_bindings.size(); i++) { - const auto& [buffer_id, vsharp] = buffer_bindings[i]; + const auto& [buffer_id, vsharp, size] = buffer_bindings[i]; const auto& desc = stage.buffers[i]; const bool is_storage = desc.IsStorage(vsharp, pipeline_cache.GetProfile()); // Buffer is not from the cache, either a special buffer or unbound. @@ -540,17 +541,15 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding buffer_infos.emplace_back(null_buffer.Handle(), 0, VK_WHOLE_SIZE); } } else { - const auto [vk_buffer, offset] = - buffer_cache.ObtainBuffer(vsharp.base_address, vsharp.GetSize(), desc.is_written, - desc.is_formatted, buffer_id); + const auto [vk_buffer, offset] = buffer_cache.ObtainBuffer( + vsharp.base_address, size, desc.is_written, desc.is_formatted, buffer_id); const u32 alignment = is_storage ? instance.StorageMinAlignment() : instance.UniformMinAlignment(); const u32 offset_aligned = Common::AlignDown(offset, alignment); const u32 adjust = offset - offset_aligned; ASSERT(adjust % 4 == 0); push_data.AddOffset(binding.buffer, adjust); - buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, - vsharp.GetSize() + adjust); + buffer_infos.emplace_back(vk_buffer->Handle(), offset_aligned, size + adjust); if (auto barrier = vk_buffer->GetBarrier(desc.is_written ? vk::AccessFlagBits2::eShaderWrite : vk::AccessFlagBits2::eShaderRead, @@ -558,7 +557,7 @@ void Rasterizer::BindBuffers(const Shader::Info& stage, Shader::Backend::Binding buffer_barriers.emplace_back(*barrier); } if (desc.is_written && desc.is_formatted) { - texture_cache.InvalidateMemoryFromGPU(vsharp.base_address, vsharp.GetSize()); + texture_cache.InvalidateMemoryFromGPU(vsharp.base_address, size); } } From cc583b6189dd10aa25faa4a7522cd1891e193213 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 19 Feb 2025 13:55:18 +0200 Subject: [PATCH 321/455] hot-fix: rasterizer --- src/video_core/renderer_vulkan/vk_rasterizer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 3b45fd52e..2fac8c8da 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -117,7 +117,7 @@ private: Pipeline::DescriptorWrites set_writes; Pipeline::BufferBarriers buffer_barriers; - using BufferBindingInfo = std::pair; + using BufferBindingInfo = std::tuple; boost::container::static_vector buffer_bindings; using ImageBindingInfo = std::pair; boost::container::static_vector image_bindings; From 2af20b0d8375f9681c16cb165f100df7f833496e Mon Sep 17 00:00:00 2001 From: Dmugetsu <168934208+diegolix29@users.noreply.github.com> Date: Thu, 20 Feb 2025 02:15:54 -0600 Subject: [PATCH 322/455] Now lightbar overwrite works on dualsense while using it on bluetooth (#2481) --- src/sdl_window.cpp | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index ccc369c53..db6f37e2a 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -97,6 +97,7 @@ void SDLInputEngine::Init() { SDL_CloseGamepad(m_gamepad); m_gamepad = nullptr; } + int gamepad_count; SDL_JoystickID* gamepads = SDL_GetGamepads(&gamepad_count); if (!gamepads) { @@ -108,12 +109,26 @@ void SDLInputEngine::Init() { SDL_free(gamepads); return; } + LOG_INFO(Input, "Got {} gamepads. Opening the first one.", gamepad_count); - if (!(m_gamepad = SDL_OpenGamepad(gamepads[0]))) { + m_gamepad = SDL_OpenGamepad(gamepads[0]); + if (!m_gamepad) { LOG_ERROR(Input, "Failed to open gamepad 0: {}", SDL_GetError()); SDL_free(gamepads); return; } + + SDL_Joystick* joystick = SDL_GetGamepadJoystick(m_gamepad); + Uint16 vendor = SDL_GetJoystickVendor(joystick); + Uint16 product = SDL_GetJoystickProduct(joystick); + + bool isDualSense = (vendor == 0x054C && product == 0x0CE6); + + LOG_INFO(Input, "Gamepad Vendor: {:04X}, Product: {:04X}", vendor, product); + if (isDualSense) { + LOG_INFO(Input, "Detected DualSense Controller"); + } + if (Config::getIsMotionControlsEnabled()) { if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_GYRO, true)) { m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO); @@ -126,11 +141,22 @@ void SDLInputEngine::Init() { LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate); } else { LOG_ERROR(Input, "Failed to initialize accel controls for gamepad"); - }; + } } + SDL_free(gamepads); + int* rgb = Config::GetControllerCustomColor(); - SetLightBarRGB(rgb[0], rgb[1], rgb[2]); + + if (isDualSense) { + if (SDL_SetJoystickLED(joystick, rgb[0], rgb[1], rgb[2]) == 0) { + LOG_INFO(Input, "Set DualSense LED to R:{} G:{} B:{}", rgb[0], rgb[1], rgb[2]); + } else { + LOG_ERROR(Input, "Failed to set DualSense LED: {}", SDL_GetError()); + } + } else { + SetLightBarRGB(rgb[0], rgb[1], rgb[2]); + } } void SDLInputEngine::SetLightBarRGB(u8 r, u8 g, u8 b) { From b6baf7881292958bc5373bd75da50a89de215982 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Thu, 20 Feb 2025 09:16:13 +0100 Subject: [PATCH 323/455] adding info about MSYS2 build (#2482) adding information about MSYS2 builds being broken right now and redirecting people to VS 2022 --- documents/building-windows.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/documents/building-windows.md b/documents/building-windows.md index a810124d6..d5db6790a 100644 --- a/documents/building-windows.md +++ b/documents/building-windows.md @@ -69,6 +69,9 @@ To automatically populate the necessary files to run shadPS4.exe, run in a comma ## Option 2: MSYS2/MinGW +> [!IMPORTANT] +> Building with MSYS2 is broken as of right now, the only way to build on Windows is to use [Option 1: Visual Studio 2022](https://github.com/shadps4-emu/shadPS4/blob/main/documents/building-windows.md#option-1-visual-studio-2022). + ### (Prerequisite) Download [**MSYS2**](https://www.msys2.org/) Go through the MSYS2 installation as normal From 3ed1c3167869beba4dee8ca86ae24ed86cdc1f6c Mon Sep 17 00:00:00 2001 From: Paris Oplopoios Date: Fri, 21 Feb 2025 00:30:40 +0200 Subject: [PATCH 324/455] Update README.md (#2488) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 523eb1d90..9259ab875 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,7 @@ A few noteworthy teams/projects who've helped us along the way are: - **yuzu**: Our shader compiler has been designed with yuzu's Hades compiler as a blueprint. This allowed us to focus on the challenges of emulating a modern AMD GPU while having a high-quality optimizing shader compiler implementation as a base. -- [**hydra**](https://github.com/hydra-emu/hydra): A multisystem, multiplatform emulator (chip-8, GB, NES, N64) from Paris. +- [**felix86**](https://github.com/OFFTKP/felix86): A new x86-64 → RISC-V Linux userspace emulator # License From 14717b8ecbc7e91ba93768651689a56880cabe16 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 21 Feb 2025 08:28:29 +0200 Subject: [PATCH 325/455] New Crowdin updates (#2483) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Norwegian Bokmal) --- src/qt_gui/translations/nb_NO.ts | 98 ++++++++++++++++---------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index aea48dec4..67e74b9b2 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -70,11 +70,11 @@ Do you want to delete the selected file?\n%1 - Ønsker du å slette den valgte filen?\n%1 + Ønsker du å slette den valgte fila?\n%1 Select Patch File: - Velg programrettelse-filen: + Velg programrettelse-fila: Download Patches @@ -110,11 +110,11 @@ Unable to open the file for reading. - Kan ikke åpne filen for lesing. + Kan ikke åpne fila for lesing. Unable to open the file for writing. - Kan ikke åpne filen for skriving. + Kan ikke åpne fila for skriving. Failed to parse XML: @@ -138,19 +138,19 @@ File Exists - Filen eksisterer + Fila eksisterer File already exists. Do you want to replace it? - Filen eksisterer allerede. Ønsker du å erstatte den? + Fila eksisterer allerede. Ønsker du å erstatte den? Failed to save file: - Kunne ikke lagre filen: + Kunne ikke lagre fila: Failed to download file: - Kunne ikke laste ned filen: + Kunne ikke laste ned fila: Cheats Not Found @@ -166,7 +166,7 @@ You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge filen fra listen. + Du har lastet ned juks for denne versjonen av spillet fra den valgte pakkebrønnen. Du kan prøve å laste ned fra en annen pakkebrønn, hvis det er tilgjengelig, vil det også være mulig å bruke det ved å velge fila fra lista. Failed to save: @@ -210,7 +210,7 @@ Failed to open file: - Kunne ikke åpne filen: + Kunne ikke åpne fila: XML ERROR: @@ -341,7 +341,7 @@ Failed to save the update file at - Kunne ikke lagre oppdateringsfilen på + Kunne ikke lagre oppdateringsfila på Starting Update... @@ -349,7 +349,7 @@ Failed to create the update script file - Kunne ikke opprette oppdateringsskriptfilen + Kunne ikke opprette oppdateringsskriptfila @@ -479,7 +479,7 @@ Options / Start - Options / Start + Options / Start R3 @@ -519,27 +519,27 @@ Color Adjustment - Color Adjustment + Fargejustering R: - R: + R: G: - G: + G: B: - B: + B: Override Lightbar Color - Override Lightbar Color + Overstyr farge på lyslinja Override Color - Override Color + Overstyr farge @@ -553,7 +553,7 @@ GameInfoClass Loading game list, please wait :3 - Laster spill-liste, vennligst vent :3 + Laster spilliste, vennligst vent :3 Cancel @@ -572,7 +572,7 @@ Directory to install games - Mappe for å installere spill + Mappe for installering av spill Browse @@ -584,7 +584,7 @@ Directory to install DLC - Mappe for å installere DLC + Mappe for installering av DLC @@ -717,7 +717,7 @@ Trophy Viewer - Trofé viser + Troféviser Open Folder... @@ -865,7 +865,7 @@ SFO Viewer for - SFO Viewer for + SFO-viser for @@ -939,11 +939,11 @@ Show Game List - Vis spill-listen + Vis spilliste Game List Refresh - Oppdater spill-listen + Oppdater spillista Tiny @@ -983,11 +983,11 @@ Dump Game List - Dump spill-liste + Dump spilliste PKG Viewer - PKG viser + PKG-viser Search... @@ -1003,11 +1003,11 @@ Game List Icons - Spill-liste ikoner + Spilliste ikoner Game List Mode - Spill-liste modus + Spilliste modus Settings @@ -1051,7 +1051,7 @@ Game List - Spill-liste + Spilliste * Unsupported Vulkan Version @@ -1159,7 +1159,7 @@ File doesn't appear to be a valid PKG file - Filen ser ikke ut til å være en gyldig PKG-fil + Fila ser ikke ut til å være en gyldig PKG-fil Run Game @@ -1297,7 +1297,7 @@ Show Game Size In List - Vis spillstørrelse i listen + Vis spillstørrelse i lista Show Splash @@ -1325,11 +1325,11 @@ Log Type - Logg type + Loggføringstype Log Filter - Logg filter + Loggfilter Open Log Location @@ -1437,7 +1437,7 @@ Enable Vulkan Synchronization Validation - Bruk Vulkan Validation Layers + Bruk Vulkan Synchronization Validation Enable RenderDoc Debugging @@ -1585,15 +1585,15 @@ Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Logg type:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. + Loggføringstype:\nAngir om loggvinduets utdata skal synkroniseres for ytelse. Kan ha negative effekter for emulatoren. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Logg filter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" Nivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i listen og logger alle nivåer etter det. + Loggfilter:\nFiltrerer loggen for å kun skrive ut spesifikk informasjon.\nEksempler: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical" \nNivåer: Trace, Debug, Info, Warning, Error, Critical - i denne rekkefølgen, et spesifikt nivå demper alle tidligere nivåer i lista og loggfører alle nivåer etter det. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. - Oppdatering:\nRelease: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNightly: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. + Oppdatering:\nOffisiell: Offisielle versjoner utgitt hver måned som kan være veldig utdaterte, men er mer pålitelige og testet.\nNattlig: Utviklingsversjoner som har alle de nyeste funksjonene og feilrettingene, men som kan inneholde feil og er mindre stabile. Background Image:\nControl the opacity of the game background image. @@ -1661,7 +1661,7 @@ Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlisten,\neller "Velg automatisk". + Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlista,\neller "Velg automatisk&quot. Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. @@ -1689,11 +1689,11 @@ Add:\nAdd a folder to the list. - Legg til:\nLegg til en mappe til listen. + Legg til:\nLegg til en mappe til lista. Remove:\nRemove a folder from the list. - Fjern:\nFjern en mappe fra listen. + Fjern:\nFjern en mappe fra lista. Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. @@ -1701,11 +1701,11 @@ Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. - Bruk Vulkan Validation Layers:\nAktiverer et system som bekrefter tilstanden til Vulkan-gjengiveren og logger informasjon om dens indre tilstand.\n Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + Bruk Vulkan Validation Layers:\nAktiverer et system som bekrefter tilstanden til Vulkan-gjengiveren og loggfører informasjon om dens indre tilstand.\n Dette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. Enable Vulkan Synchronization Validation:\nEnables a system that validates the timing of Vulkan rendering tasks.\nThis will reduce performance and likely change the behavior of emulation. - Bruk Vulkan synkronisering validering:\nEt system som bekrefter frekvens tiden av Vulkan-gjengivelseoppgaver.\nDette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. + Bruk Vulkan Synchronization Validation:\nEt system som bekrefter frekvens tiden av Vulkan-gjengivelseoppgaver.\nDette vil redusere ytelsen og sannsynligvis endre emulatorens atferd. Enable RenderDoc Debugging:\nIf enabled, the emulator will provide compatibility with Renderdoc to allow capture and analysis of the currently rendered frame. @@ -1749,11 +1749,11 @@ Release - Release + Offisiell Nightly - Nightly + Nattlig Set the volume of the background music. @@ -1773,11 +1773,11 @@ async - async + asynkron sync - sync + synkron Auto Select @@ -1796,7 +1796,7 @@ TrophyViewer Trophy Viewer - Trofé viser + Troféviser From 54a1694a2b0cee565b40e3ab9fd3e089166e4355 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Fri, 21 Feb 2025 00:28:47 -0600 Subject: [PATCH 326/455] memory: Implement protecting multiple VMAs (#2484) * Implement protecting multiple VMAs A handful of games expect this to work, and updated versions of Grand Theft Auto V crash if it doesn't work. * Clang --- src/core/memory.cpp | 43 ++++++++++++++++++++++++++++--------------- src/core/memory.h | 4 +++- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 23fb6192f..017b77cdb 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -481,19 +481,14 @@ int MemoryManager::QueryProtection(VAddr addr, void** start, void** end, u32* pr return ORBIS_OK; } -int MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) { - std::scoped_lock lk{mutex}; +s64 MemoryManager::ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, size_t size, + MemoryProt prot) { + const auto start_in_vma = addr - vma_base.base; + const auto adjusted_size = + vma_base.size - start_in_vma < size ? vma_base.size - start_in_vma : size; - // Find the virtual memory area that contains the specified address range. - auto it = FindVMA(addr); - if (it == vma_map.end() || !it->second.Contains(addr, size)) { - LOG_ERROR(Core, "Address range not mapped"); - return ORBIS_KERNEL_ERROR_EINVAL; - } - - VirtualMemoryArea& vma = it->second; - if (vma.type == VMAType::Free) { - LOG_ERROR(Core, "Cannot change protection on free memory region"); + if (vma_base.type == VMAType::Free) { + LOG_ERROR(Kernel_Vmm, "Cannot change protection on free memory region"); return ORBIS_KERNEL_ERROR_EINVAL; } @@ -504,13 +499,13 @@ int MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) { MemoryProt invalid_flags = prot & ~valid_flags; if (u32(invalid_flags) != 0 && u32(invalid_flags) != u32(MemoryProt::NoAccess)) { - LOG_ERROR(Core, "Invalid protection flags: prot = {:#x}, invalid flags = {:#x}", u32(prot), - u32(invalid_flags)); + LOG_ERROR(Kernel_Vmm, "Invalid protection flags: prot = {:#x}, invalid flags = {:#x}", + u32(prot), u32(invalid_flags)); return ORBIS_KERNEL_ERROR_EINVAL; } // Change protection - vma.prot = prot; + vma_base.prot = prot; // Set permissions Core::MemoryPermission perms{}; @@ -533,6 +528,24 @@ int MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) { impl.Protect(addr, size, perms); + return adjusted_size; +} + +s32 MemoryManager::Protect(VAddr addr, size_t size, MemoryProt prot) { + std::scoped_lock lk{mutex}; + s64 protected_bytes = 0; + do { + auto it = FindVMA(addr + protected_bytes); + auto& vma_base = it->second; + auto result = 0; + result = ProtectBytes(addr + protected_bytes, vma_base, size - protected_bytes, prot); + if (result < 0) { + // ProtectBytes returned an error, return it + return result; + } + protected_bytes += result; + } while (protected_bytes < size); + return ORBIS_OK; } diff --git a/src/core/memory.h b/src/core/memory.h index ff7b82c10..a6a55e288 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -198,7 +198,9 @@ public: int QueryProtection(VAddr addr, void** start, void** end, u32* prot); - int Protect(VAddr addr, size_t size, MemoryProt prot); + s32 Protect(VAddr addr, size_t size, MemoryProt prot); + + s64 ProtectBytes(VAddr addr, VirtualMemoryArea vma_base, size_t size, MemoryProt prot); int VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info); From 6f5dfc576f369ae1b9656e96f358e7b87bcfd7c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A5IGA?= <164882787+Xphalnos@users.noreply.github.com> Date: Fri, 21 Feb 2025 07:29:09 +0100 Subject: [PATCH 327/455] CI: Use Qt 6.9.0 + Update CMake Cache (#2487) --- .github/workflows/build.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 658308b39..86ca81c38 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,7 +76,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{ runner.os }}-sdl-cache-cmake-build with: @@ -111,7 +111,7 @@ jobs: - name: Setup Qt uses: jurplel/install-qt-action@v4 with: - version: 6.8.2 + version: 6.9.0 host: windows target: desktop arch: win64_msvc2022_64 @@ -130,7 +130,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{ runner.os }}-qt-cache-cmake-build with: @@ -186,7 +186,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{runner.os}}-sdl-cache-cmake-build with: @@ -228,7 +228,7 @@ jobs: - name: Setup Qt uses: jurplel/install-qt-action@v4 with: - version: 6.8.2 + version: 6.9.0 host: mac target: desktop arch: clang_64 @@ -247,7 +247,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{runner.os}}-qt-cache-cmake-build with: @@ -296,7 +296,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{ runner.os }}-sdl-cache-cmake-build with: @@ -352,7 +352,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{ runner.os }}-qt-cache-cmake-build with: @@ -399,7 +399,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{ runner.os }}-sdl-gcc-cache-cmake-build with: @@ -435,7 +435,7 @@ jobs: ${{ env.cache-name }}- - name: Cache CMake Build - uses: hendrikmuhs/ccache-action@v1.2.14 + uses: hendrikmuhs/ccache-action@v1.2.17 env: cache-name: ${{ runner.os }}-qt-gcc-cache-cmake-build with: From 745cdd89fdd67adb541901dc969bf3950cd710a3 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 21 Feb 2025 03:29:30 -0300 Subject: [PATCH 328/455] QT: Fix search in Grid mode (#2490) * QT: Fix search in Grid mode * Fix performance? * Fix performance List * +fix --- src/qt_gui/game_info.cpp | 3 +++ src/qt_gui/game_info.h | 1 + src/qt_gui/main_window.cpp | 13 +++++++++++++ 3 files changed, 17 insertions(+) diff --git a/src/qt_gui/game_info.cpp b/src/qt_gui/game_info.cpp index adbf392ed..947f25d84 100644 --- a/src/qt_gui/game_info.cpp +++ b/src/qt_gui/game_info.cpp @@ -49,6 +49,9 @@ void GameInfoClass::GetGameInfo(QWidget* parent) { return readGameInfo(Common::FS::PathFromQString(path)); }).results(); + // used to retrieve values after performing a search + m_games_backup = m_games; + // Progress bar, please be patient :) QProgressDialog dialog(tr("Loading game list, please wait :3"), tr("Cancel"), 0, 0, parent); dialog.setWindowTitle(tr("Loading...")); diff --git a/src/qt_gui/game_info.h b/src/qt_gui/game_info.h index 380c79e70..0759ccc52 100644 --- a/src/qt_gui/game_info.h +++ b/src/qt_gui/game_info.h @@ -17,6 +17,7 @@ public: ~GameInfoClass(); void GetGameInfo(QWidget* parent = nullptr); QVector m_games; + QVector m_games_backup; static bool CompareStrings(GameInfo& a, GameInfo& b) { std::string name_a = a.name, name_b = b.name; diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 949d7062e..0da6428aa 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -413,6 +413,7 @@ void MainWindow::CreateConnects() { int slider_pos = Config::getSliderPosition(); ui->sizeSlider->setEnabled(true); ui->sizeSlider->setSliderPosition(slider_pos); + ui->mw_searchbar->setText(""); }); // Grid connect(ui->setlistModeGridAct, &QAction::triggered, m_dock_widget.data(), [this]() { @@ -430,6 +431,7 @@ void MainWindow::CreateConnects() { int slider_pos_grid = Config::getSliderPositionGrid(); ui->sizeSlider->setEnabled(true); ui->sizeSlider->setSliderPosition(slider_pos_grid); + ui->mw_searchbar->setText(""); }); // Elf Viewer connect(ui->setlistElfAct, &QAction::triggered, m_dock_widget.data(), [this]() { @@ -658,14 +660,24 @@ void MainWindow::StartGame() { } } +bool isTable; void MainWindow::SearchGameTable(const QString& text) { if (isTableList) { + if (isTable != true) { + m_game_info->m_games = m_game_info->m_games_backup; + m_game_list_frame->PopulateGameList(); + isTable = true; + } for (int row = 0; row < m_game_list_frame->rowCount(); row++) { QString game_name = QString::fromStdString(m_game_info->m_games[row].name); bool match = (game_name.contains(text, Qt::CaseInsensitive)); // Check only in column 1 m_game_list_frame->setRowHidden(row, !match); } } else { + isTable = false; + m_game_info->m_games = m_game_info->m_games_backup; + m_game_grid_frame->PopulateGameGrid(m_game_info->m_games, false); + QVector filteredGames; for (const auto& gameInfo : m_game_info->m_games) { QString game_name = QString::fromStdString(gameInfo.name); @@ -674,6 +686,7 @@ void MainWindow::SearchGameTable(const QString& text) { } } std::sort(filteredGames.begin(), filteredGames.end(), m_game_info->CompareStrings); + m_game_info->m_games = filteredGames; m_game_grid_frame->PopulateGameGrid(filteredGames, true); } } From 5b3e1561970d0b40962188e2938180a50c28a503 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 21 Feb 2025 02:41:36 -0800 Subject: [PATCH 329/455] externals: Update MoltenVK (#2492) --- externals/MoltenVK/MoltenVK | 2 +- externals/MoltenVK/SPIRV-Cross | 2 +- src/video_core/renderer_vulkan/vk_instance.cpp | 7 +++---- src/video_core/renderer_vulkan/vk_instance.h | 1 - src/video_core/renderer_vulkan/vk_platform.cpp | 12 +++++++++++- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/externals/MoltenVK/MoltenVK b/externals/MoltenVK/MoltenVK index 0c090001c..2048427e5 160000 --- a/externals/MoltenVK/MoltenVK +++ b/externals/MoltenVK/MoltenVK @@ -1 +1 @@ -Subproject commit 0c090001cb42997031cfe43914340e2639944972 +Subproject commit 2048427e50f9eb20f2b8f98d316ecaee398c9b91 diff --git a/externals/MoltenVK/SPIRV-Cross b/externals/MoltenVK/SPIRV-Cross index 1a7b7ef6d..2c32b6bf8 160000 --- a/externals/MoltenVK/SPIRV-Cross +++ b/externals/MoltenVK/SPIRV-Cross @@ -1 +1 @@ -Subproject commit 1a7b7ef6de02cf6767e42b10ddad217c45e90d47 +Subproject commit 2c32b6bf86f3c4a5539aa1f0bacbd59fe61759cf diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index f01401569..ab8f074cd 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -247,9 +247,7 @@ bool Instance::CreateDevice() { add_extension(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME); add_extension(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME); add_extension(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); - // Currently causes issues with Reshade on AMD proprietary, disable until figured out. - tooling_info = GetDriverID() != vk::DriverId::eAmdProprietary && - add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME); + add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME); const bool maintenance4 = add_extension(VK_KHR_MAINTENANCE_4_EXTENSION_NAME); add_extension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); @@ -539,7 +537,8 @@ void Instance::CollectDeviceParameters() { } void Instance::CollectToolingInfo() { - if (!tooling_info) { + if (GetDriverID() == vk::DriverId::eAmdProprietary) { + // Currently causes issues with Reshade on AMD proprietary, disabled until fix released. return; } const auto [tools_result, tools] = physical_device.getToolPropertiesEXT(); diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index bdd92cba9..3ccf89276 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -333,7 +333,6 @@ private: bool shader_stencil_export{}; bool image_load_store_lod{}; bool amd_gcn_shader{}; - bool tooling_info{}; bool portability_subset{}; }; diff --git a/src/video_core/renderer_vulkan/vk_platform.cpp b/src/video_core/renderer_vulkan/vk_platform.cpp index cb67232d5..716473377 100644 --- a/src/video_core/renderer_vulkan/vk_platform.cpp +++ b/src/video_core/renderer_vulkan/vk_platform.cpp @@ -278,6 +278,7 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e vk::Bool32 enable_force_barriers = vk::True; #ifdef __APPLE__ const vk::Bool32 mvk_debug_mode = enable_crash_diagnostic ? vk::True : vk::False; + constexpr vk::Bool32 mvk_use_mtlheap = vk::True; #endif const std::array layer_setings = { @@ -353,7 +354,16 @@ vk::UniqueInstance CreateInstance(Frontend::WindowSystemType window_type, bool e .type = vk::LayerSettingTypeEXT::eBool32, .valueCount = 1, .pValues = &mvk_debug_mode, - } + }, + // Use MTLHeap to back device memory, which among other things allows us to + // use VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT via memory aliasing. + vk::LayerSettingEXT{ + .pLayerName = "MoltenVK", + .pSettingName = "MVK_CONFIG_USE_MTLHEAP", + .type = vk::LayerSettingTypeEXT::eBool32, + .valueCount = 1, + .pValues = &mvk_use_mtlheap, + }, #endif }; From 6860bb7349e2387c2d5fed2c8c5fbc0671176aa9 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 21 Feb 2025 02:55:35 -0800 Subject: [PATCH 330/455] fix: mask_jump32 target --- src/common/memory_patcher.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/common/memory_patcher.cpp b/src/common/memory_patcher.cpp index 0a74a45a5..2a8b26acb 100644 --- a/src/common/memory_patcher.cpp +++ b/src/common/memory_patcher.cpp @@ -148,7 +148,6 @@ void OnGameLoaded() { std::string targetStr = ""; std::string sizeStr = ""; if (type == "mask_jump32") { - std::string patchValue = patchLineIt->attribute("Value").value(); targetStr = patchLineIt->attribute("Target").value(); sizeStr = patchLineIt->attribute("Size").value(); } else { @@ -301,8 +300,7 @@ void OnGameLoaded() { QString targetStr; QString sizeStr; if (type == "mask_jump32") { - QString valueAttributeStr = lineObject["Value"].toString(); - targetStr = lineObject["Value"].toString(); + targetStr = lineObject["Target"].toString(); sizeStr = lineObject["Size"].toString(); } else { patchValue = QString::fromStdString(convertValueToHex( From 9424047214665c8a00b84413a47ef9f7bd02c475 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 21 Feb 2025 03:01:18 -0800 Subject: [PATCH 331/455] shader_recompiler: Proper support for inst-typed buffer format operations. (#2469) --- .../frontend/translate/translate.h | 7 +- .../frontend/translate/vector_memory.cpp | 207 ++++++------------ src/shader_recompiler/ir/ir_emitter.cpp | 3 +- .../ir/passes/lower_buffer_format_to_raw.cpp | 147 +++++++------ src/shader_recompiler/ir/reg.h | 3 + src/video_core/amdgpu/types.h | 7 + 6 files changed, 167 insertions(+), 207 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index b4919213b..190129e5f 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -277,10 +277,9 @@ public: // Buffer Memory // MUBUF / MTBUF - void BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst); - void BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst); - void BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst); - void BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst); + void BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed, const GcnInst& inst); + void BUFFER_STORE(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed, + const GcnInst& inst); void BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst); // Image Memory diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index bfbe937a1..ed7788d8c 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -11,59 +11,59 @@ void Translator::EmitVectorMemory(const GcnInst& inst) { // Buffer load operations case Opcode::TBUFFER_LOAD_FORMAT_X: - return BUFFER_LOAD(1, true, inst); + return BUFFER_LOAD(1, true, false, inst); case Opcode::TBUFFER_LOAD_FORMAT_XY: - return BUFFER_LOAD(2, true, inst); + return BUFFER_LOAD(2, true, false, inst); case Opcode::TBUFFER_LOAD_FORMAT_XYZ: - return BUFFER_LOAD(3, true, inst); + return BUFFER_LOAD(3, true, false, inst); case Opcode::TBUFFER_LOAD_FORMAT_XYZW: - return BUFFER_LOAD(4, true, inst); + return BUFFER_LOAD(4, true, false, inst); case Opcode::BUFFER_LOAD_FORMAT_X: - return BUFFER_LOAD_FORMAT(1, inst); + return BUFFER_LOAD(1, false, true, inst); case Opcode::BUFFER_LOAD_FORMAT_XY: - return BUFFER_LOAD_FORMAT(2, inst); + return BUFFER_LOAD(2, false, true, inst); case Opcode::BUFFER_LOAD_FORMAT_XYZ: - return BUFFER_LOAD_FORMAT(3, inst); + return BUFFER_LOAD(3, false, true, inst); case Opcode::BUFFER_LOAD_FORMAT_XYZW: - return BUFFER_LOAD_FORMAT(4, inst); + return BUFFER_LOAD(4, false, true, inst); case Opcode::BUFFER_LOAD_DWORD: - return BUFFER_LOAD(1, false, inst); + return BUFFER_LOAD(1, false, false, inst); case Opcode::BUFFER_LOAD_DWORDX2: - return BUFFER_LOAD(2, false, inst); + return BUFFER_LOAD(2, false, false, inst); case Opcode::BUFFER_LOAD_DWORDX3: - return BUFFER_LOAD(3, false, inst); + return BUFFER_LOAD(3, false, false, inst); case Opcode::BUFFER_LOAD_DWORDX4: - return BUFFER_LOAD(4, false, inst); + return BUFFER_LOAD(4, false, false, inst); // Buffer store operations case Opcode::BUFFER_STORE_FORMAT_X: - return BUFFER_STORE_FORMAT(1, inst); + return BUFFER_STORE(1, false, true, inst); case Opcode::BUFFER_STORE_FORMAT_XY: - return BUFFER_STORE_FORMAT(2, inst); + return BUFFER_STORE(2, false, true, inst); case Opcode::BUFFER_STORE_FORMAT_XYZ: - return BUFFER_STORE_FORMAT(3, inst); + return BUFFER_STORE(3, false, true, inst); case Opcode::BUFFER_STORE_FORMAT_XYZW: - return BUFFER_STORE_FORMAT(4, inst); + return BUFFER_STORE(4, false, true, inst); case Opcode::TBUFFER_STORE_FORMAT_X: - return BUFFER_STORE(1, true, inst); + return BUFFER_STORE(1, true, false, inst); case Opcode::TBUFFER_STORE_FORMAT_XY: - return BUFFER_STORE(2, true, inst); + return BUFFER_STORE(2, true, false, inst); case Opcode::TBUFFER_STORE_FORMAT_XYZ: - return BUFFER_STORE(3, true, inst); + return BUFFER_STORE(3, true, false, inst); case Opcode::TBUFFER_STORE_FORMAT_XYZW: - return BUFFER_STORE(4, true, inst); + return BUFFER_STORE(4, true, false, inst); case Opcode::BUFFER_STORE_DWORD: - return BUFFER_STORE(1, false, inst); + return BUFFER_STORE(1, false, false, inst); case Opcode::BUFFER_STORE_DWORDX2: - return BUFFER_STORE(2, false, inst); + return BUFFER_STORE(2, false, false, inst); case Opcode::BUFFER_STORE_DWORDX3: - return BUFFER_STORE(3, false, inst); + return BUFFER_STORE(3, false, false, inst); case Opcode::BUFFER_STORE_DWORDX4: - return BUFFER_STORE(4, false, inst); + return BUFFER_STORE(4, false, false, inst); // Buffer atomic operations case Opcode::BUFFER_ATOMIC_ADD: @@ -165,7 +165,8 @@ void Translator::EmitVectorMemory(const GcnInst& inst) { } } -void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) { +void Translator::BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed, + const GcnInst& inst) { const auto& mubuf = inst.control.mubuf; const bool is_ring = mubuf.glc && mubuf.slc; const IR::VectorReg vaddr{inst.src[0].code}; @@ -195,66 +196,38 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_typed, const GcnInst& inst) buffer_info.inst_offset.Assign(mubuf.offset); buffer_info.globally_coherent.Assign(mubuf.glc); buffer_info.system_coherent.Assign(mubuf.slc); - buffer_info.typed.Assign(is_typed); - if (is_typed) { + buffer_info.typed.Assign(is_inst_typed || is_buffer_typed); + if (is_inst_typed) { const auto& mtbuf = inst.control.mtbuf; - const auto dmft = static_cast(mtbuf.dfmt); - const auto nfmt = static_cast(mtbuf.nfmt); - ASSERT(nfmt == AmdGpu::NumberFormat::Float && - (dmft == AmdGpu::DataFormat::Format32_32_32_32 || - dmft == AmdGpu::DataFormat::Format32_32_32 || - dmft == AmdGpu::DataFormat::Format32_32 || dmft == AmdGpu::DataFormat::Format32)); + buffer_info.inst_data_fmt.Assign(static_cast(mtbuf.dfmt)); + buffer_info.inst_num_fmt.Assign(static_cast(mtbuf.nfmt)); + } else { + buffer_info.inst_data_fmt.Assign(AmdGpu::DataFormat::FormatInvalid); } const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - const IR::Value value = ir.LoadBufferU32(num_dwords, handle, address, buffer_info); const IR::VectorReg dst_reg{inst.src[1].code}; - if (num_dwords == 1) { - ir.SetVectorReg(dst_reg, IR::U32{value}); - return; - } - for (u32 i = 0; i < num_dwords; i++) { - ir.SetVectorReg(dst_reg + i, IR::U32{ir.CompositeExtract(value, i)}); + if (buffer_info.typed) { + const IR::Value value = ir.LoadBufferFormat(handle, address, buffer_info); + for (u32 i = 0; i < num_dwords; i++) { + ir.SetVectorReg(dst_reg + i, IR::F32{ir.CompositeExtract(value, i)}); + } + } else { + const IR::Value value = ir.LoadBufferU32(num_dwords, handle, address, buffer_info); + if (num_dwords == 1) { + ir.SetVectorReg(dst_reg, IR::U32{value}); + return; + } + for (u32 i = 0; i < num_dwords; i++) { + ir.SetVectorReg(dst_reg + i, IR::U32{ir.CompositeExtract(value, i)}); + } } } -void Translator::BUFFER_LOAD_FORMAT(u32 num_dwords, const GcnInst& inst) { - const auto& mubuf = inst.control.mubuf; - const IR::VectorReg vaddr{inst.src[0].code}; - const IR::ScalarReg sharp{inst.src[2].code * 4}; - const IR::Value address = [&] -> IR::Value { - if (mubuf.idxen && mubuf.offen) { - return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); - } - if (mubuf.idxen || mubuf.offen) { - return ir.GetVectorReg(vaddr); - } - return {}; - }(); - const IR::Value soffset{GetSrc(inst.src[3])}; - ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported"); - - IR::BufferInstInfo buffer_info{}; - buffer_info.index_enable.Assign(mubuf.idxen); - buffer_info.offset_enable.Assign(mubuf.offen); - buffer_info.inst_offset.Assign(mubuf.offset); - buffer_info.globally_coherent.Assign(mubuf.glc); - buffer_info.system_coherent.Assign(mubuf.slc); - buffer_info.typed.Assign(true); - - const IR::Value handle = - ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), - ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - const IR::Value value = ir.LoadBufferFormat(handle, address, buffer_info); - const IR::VectorReg dst_reg{inst.src[1].code}; - for (u32 i = 0; i < num_dwords; i++) { - ir.SetVectorReg(dst_reg + i, IR::F32{ir.CompositeExtract(value, i)}); - } -} - -void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst) { +void Translator::BUFFER_STORE(u32 num_dwords, bool is_inst_typed, bool is_buffer_typed, + const GcnInst& inst) { const auto& mubuf = inst.control.mubuf; const bool is_ring = mubuf.glc && mubuf.slc; const IR::VectorReg vaddr{inst.src[0].code}; @@ -285,80 +258,38 @@ void Translator::BUFFER_STORE(u32 num_dwords, bool is_typed, const GcnInst& inst buffer_info.inst_offset.Assign(mubuf.offset); buffer_info.globally_coherent.Assign(mubuf.glc); buffer_info.system_coherent.Assign(mubuf.slc); - buffer_info.typed.Assign(is_typed); - if (is_typed) { + buffer_info.typed.Assign(is_inst_typed || is_buffer_typed); + if (is_inst_typed) { const auto& mtbuf = inst.control.mtbuf; - const auto dmft = static_cast(mtbuf.dfmt); - const auto nfmt = static_cast(mtbuf.nfmt); - ASSERT(nfmt == AmdGpu::NumberFormat::Float && - (dmft == AmdGpu::DataFormat::Format32_32_32_32 || - dmft == AmdGpu::DataFormat::Format32_32_32 || - dmft == AmdGpu::DataFormat::Format32_32 || dmft == AmdGpu::DataFormat::Format32)); + buffer_info.inst_data_fmt.Assign(static_cast(mtbuf.dfmt)); + buffer_info.inst_num_fmt.Assign(static_cast(mtbuf.nfmt)); + } else { + buffer_info.inst_data_fmt.Assign(AmdGpu::DataFormat::FormatInvalid); } - IR::Value value{}; - const IR::VectorReg src_reg{inst.src[1].code}; - switch (num_dwords) { - case 1: - value = ir.GetVectorReg(src_reg); - break; - case 2: - value = ir.CompositeConstruct(ir.GetVectorReg(src_reg), ir.GetVectorReg(src_reg + 1)); - break; - case 3: - value = ir.CompositeConstruct(ir.GetVectorReg(src_reg), ir.GetVectorReg(src_reg + 1), - ir.GetVectorReg(src_reg + 2)); - break; - case 4: - value = ir.CompositeConstruct(ir.GetVectorReg(src_reg), ir.GetVectorReg(src_reg + 1), - ir.GetVectorReg(src_reg + 2), ir.GetVectorReg(src_reg + 3)); - break; - } const IR::Value handle = ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - ir.StoreBufferU32(num_dwords, handle, address, value, buffer_info); -} - -void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, const GcnInst& inst) { - const auto& mubuf = inst.control.mubuf; - const IR::VectorReg vaddr{inst.src[0].code}; - const IR::ScalarReg sharp{inst.src[2].code * 4}; - const IR::Value address = [&] -> IR::Value { - if (mubuf.idxen && mubuf.offen) { - return ir.CompositeConstruct(ir.GetVectorReg(vaddr), ir.GetVectorReg(vaddr + 1)); - } - if (mubuf.idxen || mubuf.offen) { - return ir.GetVectorReg(vaddr); - } - return {}; - }(); - const IR::Value soffset{GetSrc(inst.src[3])}; - ASSERT_MSG(soffset.IsImmediate() && soffset.U32() == 0, "Non immediate offset not supported"); - - IR::BufferInstInfo buffer_info{}; - buffer_info.index_enable.Assign(mubuf.idxen); - buffer_info.offset_enable.Assign(mubuf.offen); - buffer_info.inst_offset.Assign(mubuf.offset); - buffer_info.globally_coherent.Assign(mubuf.glc); - buffer_info.system_coherent.Assign(mubuf.slc); - buffer_info.typed.Assign(true); - const IR::VectorReg src_reg{inst.src[1].code}; - std::array comps{}; + boost::container::static_vector comps; for (u32 i = 0; i < num_dwords; i++) { - comps[i] = ir.GetVectorReg(src_reg + i); + const auto src_reg_i = src_reg + i; + if (buffer_info.typed) { + comps.push_back(ir.GetVectorReg(src_reg_i)); + } else { + comps.push_back(ir.GetVectorReg(src_reg_i)); + } } - for (u32 i = num_dwords; i < 4; i++) { - comps[i] = ir.Imm32(0.f); + if (buffer_info.typed) { + for (u32 i = num_dwords; i < 4; i++) { + comps.push_back(ir.Imm32(0.f)); + } + ir.StoreBufferFormat(handle, address, ir.CompositeConstruct(comps), buffer_info); + } else { + const auto value = num_dwords == 1 ? comps[0] : ir.CompositeConstruct(comps); + ir.StoreBufferU32(num_dwords, handle, address, value, buffer_info); } - - const IR::Value value = ir.CompositeConstruct(comps[0], comps[1], comps[2], comps[3]); - const IR::Value handle = - ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1), - ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); - ir.StoreBufferFormat(handle, address, value, buffer_info); } void Translator::BUFFER_ATOMIC(AtomicOp op, const GcnInst& inst) { diff --git a/src/shader_recompiler/ir/ir_emitter.cpp b/src/shader_recompiler/ir/ir_emitter.cpp index 06c01878d..3615e8cbb 100644 --- a/src/shader_recompiler/ir/ir_emitter.cpp +++ b/src/shader_recompiler/ir/ir_emitter.cpp @@ -638,7 +638,8 @@ Value IREmitter::CompositeConstruct(std::span elements) { case 4: return CompositeConstruct(elements[0], elements[1], elements[2], elements[3]); default: - UNREACHABLE_MSG("Composite construct with greater than 4 elements"); + UNREACHABLE_MSG("Composite construct with {} elements, only 2-4 are supported", + elements.size()); } } diff --git a/src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp b/src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp index b30b022f8..3fdc6f0cd 100644 --- a/src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp +++ b/src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp @@ -10,6 +10,14 @@ namespace Shader::Optimization { +struct FormatInfo { + AmdGpu::DataFormat data_format; + AmdGpu::NumberFormat num_format; + AmdGpu::CompMapping swizzle; + AmdGpu::NumberConversion num_conversion; + int num_components; +}; + static bool IsBufferFormatLoad(const IR::Inst& inst) { return inst.GetOpcode() == IR::Opcode::LoadBufferFormatF32; } @@ -18,152 +26,151 @@ static bool IsBufferFormatStore(const IR::Inst& inst) { return inst.GetOpcode() == IR::Opcode::StoreBufferFormatF32; } -static IR::Value LoadBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer, - const IR::Value handle, const IR::U32 address, - const IR::BufferInstInfo info) { - const auto data_fmt = buffer.GetDataFmt(); - const auto num_fmt = buffer.GetNumberFmt(); - const auto num_conv = buffer.GetNumberConversion(); - const auto num_components = AmdGpu::NumComponents(buffer.GetDataFmt()); - +static IR::Value LoadBufferFormat(IR::IREmitter& ir, const IR::Value handle, const IR::U32 address, + const IR::BufferInstInfo info, const FormatInfo& format_info) { IR::Value interpreted; - switch (data_fmt) { + switch (format_info.data_format) { case AmdGpu::DataFormat::FormatInvalid: interpreted = ir.Imm32(0.f); break; case AmdGpu::DataFormat::Format8: { - const auto unpacked = ir.Unpack4x8(num_fmt, ir.LoadBufferU8(handle, address, info)); + const auto unpacked = + ir.Unpack4x8(format_info.num_format, ir.LoadBufferU8(handle, address, info)); interpreted = ir.CompositeExtract(unpacked, 0); break; } case AmdGpu::DataFormat::Format8_8: { const auto raw = ir.LoadBufferU16(handle, address, info); - const auto unpacked = ir.Unpack4x8(num_fmt, raw); + const auto unpacked = ir.Unpack4x8(format_info.num_format, raw); interpreted = ir.CompositeConstruct(ir.CompositeExtract(unpacked, 0), ir.CompositeExtract(unpacked, 1)); break; } case AmdGpu::DataFormat::Format8_8_8_8: - interpreted = ir.Unpack4x8(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + interpreted = ir.Unpack4x8(format_info.num_format, + IR::U32{ir.LoadBufferU32(1, handle, address, info)}); break; case AmdGpu::DataFormat::Format16: { - const auto unpacked = ir.Unpack2x16(num_fmt, ir.LoadBufferU16(handle, address, info)); + const auto unpacked = + ir.Unpack2x16(format_info.num_format, ir.LoadBufferU16(handle, address, info)); interpreted = ir.CompositeExtract(unpacked, 0); break; } case AmdGpu::DataFormat::Format16_16: - interpreted = ir.Unpack2x16(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + interpreted = ir.Unpack2x16(format_info.num_format, + IR::U32{ir.LoadBufferU32(1, handle, address, info)}); break; case AmdGpu::DataFormat::Format10_11_11: - interpreted = - ir.Unpack10_11_11(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + interpreted = ir.Unpack10_11_11(format_info.num_format, + IR::U32{ir.LoadBufferU32(1, handle, address, info)}); break; case AmdGpu::DataFormat::Format2_10_10_10: - interpreted = - ir.Unpack2_10_10_10(num_fmt, IR::U32{ir.LoadBufferU32(1, handle, address, info)}); + interpreted = ir.Unpack2_10_10_10(format_info.num_format, + IR::U32{ir.LoadBufferU32(1, handle, address, info)}); break; case AmdGpu::DataFormat::Format16_16_16_16: { const auto raw = ir.LoadBufferU32(2, handle, address, info); - interpreted = - ir.CompositeConstruct(ir.Unpack2x16(num_fmt, IR::U32{ir.CompositeExtract(raw, 0)}), - ir.Unpack2x16(num_fmt, IR::U32{ir.CompositeExtract(raw, 1)})); + interpreted = ir.CompositeConstruct( + ir.Unpack2x16(format_info.num_format, IR::U32{ir.CompositeExtract(raw, 0)}), + ir.Unpack2x16(format_info.num_format, IR::U32{ir.CompositeExtract(raw, 1)})); break; } case AmdGpu::DataFormat::Format32: case AmdGpu::DataFormat::Format32_32: case AmdGpu::DataFormat::Format32_32_32: case AmdGpu::DataFormat::Format32_32_32_32: { - ASSERT(num_fmt == AmdGpu::NumberFormat::Uint || num_fmt == AmdGpu::NumberFormat::Sint || - num_fmt == AmdGpu::NumberFormat::Float); - interpreted = ir.LoadBufferF32(num_components, handle, address, info); + ASSERT(format_info.num_format == AmdGpu::NumberFormat::Uint || + format_info.num_format == AmdGpu::NumberFormat::Sint || + format_info.num_format == AmdGpu::NumberFormat::Float); + interpreted = ir.LoadBufferF32(format_info.num_components, handle, address, info); break; } default: - UNREACHABLE_MSG("Unsupported buffer data format: {}", data_fmt); + UNREACHABLE_MSG("Unsupported buffer data format: {}", format_info.data_format); } // Pad to 4 components and apply additional modifications. boost::container::static_vector components; for (u32 i = 0; i < 4; i++) { - if (i < num_components) { + if (i < format_info.num_components) { const auto component = - IR::F32{num_components == 1 ? interpreted : ir.CompositeExtract(interpreted, i)}; - components.push_back(ApplyReadNumberConversion(ir, component, num_conv)); + IR::F32{format_info.num_components == 1 ? interpreted + : ir.CompositeExtract(interpreted, i)}; + components.push_back( + ApplyReadNumberConversion(ir, component, format_info.num_conversion)); } else { components.push_back(ir.Imm32(0.f)); } } - const auto swizzled = ApplySwizzle(ir, ir.CompositeConstruct(components), buffer.DstSelect()); + const auto swizzled = ApplySwizzle(ir, ir.CompositeConstruct(components), format_info.swizzle); return swizzled; } -static void StoreBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer, - const IR::Value handle, const IR::U32 address, const IR::Value& value, - const IR::BufferInstInfo info) { - const auto data_fmt = buffer.GetDataFmt(); - const auto num_fmt = buffer.GetNumberFmt(); - const auto num_conv = buffer.GetNumberConversion(); - const auto num_components = AmdGpu::NumComponents(buffer.GetDataFmt()); - +static void StoreBufferFormat(IR::IREmitter& ir, const IR::Value handle, const IR::U32 address, + const IR::Value& value, const IR::BufferInstInfo info, + const FormatInfo& format_info) { // Extract actual number of components and apply additional modifications. - const auto swizzled = ApplySwizzle(ir, value, buffer.DstSelect().Inverse()); + const auto swizzled = ApplySwizzle(ir, value, format_info.swizzle.Inverse()); boost::container::static_vector components; - for (u32 i = 0; i < num_components; i++) { + for (u32 i = 0; i < format_info.num_components; i++) { const auto component = IR::F32{ir.CompositeExtract(swizzled, i)}; - components.push_back(ApplyWriteNumberConversion(ir, component, num_conv)); + components.push_back(ApplyWriteNumberConversion(ir, component, format_info.num_conversion)); } const auto real_value = components.size() == 1 ? components[0] : ir.CompositeConstruct(components); - switch (data_fmt) { + switch (format_info.data_format) { case AmdGpu::DataFormat::FormatInvalid: break; case AmdGpu::DataFormat::Format8: { const auto packed = - ir.Pack4x8(num_fmt, ir.CompositeConstruct(real_value, ir.Imm32(0.f), ir.Imm32(0.f), - ir.Imm32(0.f))); + ir.Pack4x8(format_info.num_format, ir.CompositeConstruct(real_value, ir.Imm32(0.f), + ir.Imm32(0.f), ir.Imm32(0.f))); ir.StoreBufferU8(handle, address, packed, info); break; } case AmdGpu::DataFormat::Format8_8: { - const auto packed = - ir.Pack4x8(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 0), - ir.CompositeExtract(real_value, 1), - ir.Imm32(0.f), ir.Imm32(0.f))); + const auto packed = ir.Pack4x8(format_info.num_format, + ir.CompositeConstruct(ir.CompositeExtract(real_value, 0), + ir.CompositeExtract(real_value, 1), + ir.Imm32(0.f), ir.Imm32(0.f))); ir.StoreBufferU16(handle, address, packed, info); break; } case AmdGpu::DataFormat::Format8_8_8_8: { - auto packed = ir.Pack4x8(num_fmt, real_value); + auto packed = ir.Pack4x8(format_info.num_format, real_value); ir.StoreBufferU32(1, handle, address, packed, info); break; } case AmdGpu::DataFormat::Format16: { - const auto packed = ir.Pack2x16(num_fmt, ir.CompositeConstruct(real_value, ir.Imm32(0.f))); + const auto packed = + ir.Pack2x16(format_info.num_format, ir.CompositeConstruct(real_value, ir.Imm32(0.f))); ir.StoreBufferU16(handle, address, packed, info); break; } case AmdGpu::DataFormat::Format16_16: { - const auto packed = ir.Pack2x16(num_fmt, real_value); + const auto packed = ir.Pack2x16(format_info.num_format, real_value); ir.StoreBufferU32(1, handle, address, packed, info); break; } case AmdGpu::DataFormat::Format10_11_11: { - const auto packed = ir.Pack10_11_11(num_fmt, real_value); + const auto packed = ir.Pack10_11_11(format_info.num_format, real_value); ir.StoreBufferU32(1, handle, address, packed, info); break; } case AmdGpu::DataFormat::Format2_10_10_10: { - const auto packed = ir.Pack2_10_10_10(num_fmt, real_value); + const auto packed = ir.Pack2_10_10_10(format_info.num_format, real_value); ir.StoreBufferU32(1, handle, address, packed, info); break; } case AmdGpu::DataFormat::Format16_16_16_16: { const auto packed = ir.CompositeConstruct( - ir.Pack2x16(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 0), - ir.CompositeExtract(real_value, 1))), - ir.Pack2x16(num_fmt, ir.CompositeConstruct(ir.CompositeExtract(real_value, 2), - ir.CompositeExtract(real_value, 3)))); + ir.Pack2x16(format_info.num_format, + ir.CompositeConstruct(ir.CompositeExtract(real_value, 0), + ir.CompositeExtract(real_value, 1))), + ir.Pack2x16(format_info.num_format, + ir.CompositeConstruct(ir.CompositeExtract(real_value, 2), + ir.CompositeExtract(real_value, 3)))); ir.StoreBufferU32(2, handle, address, packed, info); break; } @@ -171,28 +178,40 @@ static void StoreBufferFormat(IR::IREmitter& ir, const AmdGpu::Buffer& buffer, case AmdGpu::DataFormat::Format32_32: case AmdGpu::DataFormat::Format32_32_32: case AmdGpu::DataFormat::Format32_32_32_32: { - ASSERT(num_fmt == AmdGpu::NumberFormat::Uint || num_fmt == AmdGpu::NumberFormat::Sint || - num_fmt == AmdGpu::NumberFormat::Float); - ir.StoreBufferF32(num_components, handle, address, real_value, info); + ASSERT(format_info.num_format == AmdGpu::NumberFormat::Uint || + format_info.num_format == AmdGpu::NumberFormat::Sint || + format_info.num_format == AmdGpu::NumberFormat::Float); + ir.StoreBufferF32(format_info.num_components, handle, address, real_value, info); break; } default: - UNREACHABLE_MSG("Unsupported buffer data format: {}", data_fmt); + UNREACHABLE_MSG("Unsupported buffer data format: {}", format_info.data_format); } } static void LowerBufferFormatInst(IR::Block& block, IR::Inst& inst, Info& info) { IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; + const auto flags = inst.Flags(); const auto desc{info.buffers[inst.Arg(0).U32()]}; const auto buffer{desc.GetSharp(info)}; + const auto is_inst_typed = flags.inst_data_fmt != AmdGpu::DataFormat::FormatInvalid; + const auto data_format = is_inst_typed ? flags.inst_data_fmt.Value() : buffer.GetDataFmt(); + const auto num_format = is_inst_typed ? flags.inst_num_fmt.Value() : buffer.GetNumberFmt(); + const auto format_info = FormatInfo{ + .data_format = data_format, + .num_format = num_format, + .swizzle = is_inst_typed ? AmdGpu::IdentityMapping : buffer.DstSelect(), + .num_conversion = AmdGpu::MapNumberConversion(num_format), + .num_components = AmdGpu::NumComponents(data_format), + }; + if (IsBufferFormatLoad(inst)) { - const auto interpreted = LoadBufferFormat(ir, buffer, inst.Arg(0), IR::U32{inst.Arg(1)}, - inst.Flags()); + const auto interpreted = + LoadBufferFormat(ir, inst.Arg(0), IR::U32{inst.Arg(1)}, flags, format_info); inst.ReplaceUsesWithAndRemove(interpreted); } else if (IsBufferFormatStore(inst)) { - StoreBufferFormat(ir, buffer, inst.Arg(0), IR::U32{inst.Arg(1)}, inst.Arg(2), - inst.Flags()); + StoreBufferFormat(ir, inst.Arg(0), IR::U32{inst.Arg(1)}, inst.Arg(2), flags, format_info); inst.Invalidate(); } } diff --git a/src/shader_recompiler/ir/reg.h b/src/shader_recompiler/ir/reg.h index 3ee7c4355..40c4b61c3 100644 --- a/src/shader_recompiler/ir/reg.h +++ b/src/shader_recompiler/ir/reg.h @@ -7,6 +7,7 @@ #include "common/bit_field.h" #include "common/enum.h" #include "common/types.h" +#include "video_core/amdgpu/types.h" namespace Shader::IR { @@ -52,6 +53,8 @@ union BufferInstInfo { BitField<14, 1, u32> system_coherent; BitField<15, 1, u32> globally_coherent; BitField<16, 1, u32> typed; + BitField<17, 4, AmdGpu::DataFormat> inst_data_fmt; + BitField<21, 3, AmdGpu::NumberFormat> inst_num_fmt; }; enum class ScalarReg : u32 { diff --git a/src/video_core/amdgpu/types.h b/src/video_core/amdgpu/types.h index d991e0abd..d1cf19076 100644 --- a/src/video_core/amdgpu/types.h +++ b/src/video_core/amdgpu/types.h @@ -262,6 +262,13 @@ private: } }; +static constexpr CompMapping IdentityMapping = { + .r = CompSwizzle::Red, + .g = CompSwizzle::Green, + .b = CompSwizzle::Blue, + .a = CompSwizzle::Alpha, +}; + inline DataFormat RemapDataFormat(const DataFormat format) { switch (format) { case DataFormat::Format11_11_10: From 8a793f64bf5d09db031c0dc2a6c37f08cf49880a Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:17:52 -0800 Subject: [PATCH 332/455] misc: Add message indicating unimplemented primitive type. --- src/video_core/renderer_vulkan/liverpool_to_vk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index 5c02ef39f..843bedb20 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -121,7 +121,7 @@ vk::PrimitiveTopology PrimitiveType(AmdGpu::PrimitiveType type) { case AmdGpu::PrimitiveType::RectList: return vk::PrimitiveTopology::ePatchList; default: - UNREACHABLE(); + UNREACHABLE_MSG("Unimplemented primitive type: {}", static_cast(type)); return vk::PrimitiveTopology::eTriangleList; } } From 0aaeea4837565fe96c080b6b779902446ee80501 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sat, 22 Feb 2025 10:56:35 +0200 Subject: [PATCH 333/455] libcInternal HLE fixes (#2491) * internal_vprintf was wrong * reducing the calls to only needed (and tested one) . Fixed strcpy_s * clang fix * Added snprintf --- CMakeLists.txt | 9 +- .../libraries/libc_internal/libc_internal.cpp | 16249 +--------------- .../libc_internal/libc_internal_io.cpp | 460 +- .../libc_internal/libc_internal_math.cpp | 775 +- .../libc_internal/libc_internal_memory.cpp | 287 +- .../libc_internal/libc_internal_mspace.cpp | 247 - .../libc_internal/libc_internal_mspace.h | 14 - .../libc_internal/libc_internal_str.cpp | 508 +- .../libc_internal/libc_internal_stream.cpp | 3139 --- .../libc_internal/libc_internal_stream.h | 14 - src/core/libraries/libc_internal/printf.h | 763 + 11 files changed, 900 insertions(+), 21565 deletions(-) delete mode 100644 src/core/libraries/libc_internal/libc_internal_mspace.cpp delete mode 100644 src/core/libraries/libc_internal/libc_internal_mspace.h delete mode 100644 src/core/libraries/libc_internal/libc_internal_stream.cpp delete mode 100644 src/core/libraries/libc_internal/libc_internal_stream.h create mode 100644 src/core/libraries/libc_internal/printf.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 95766bc67..9b1c0082b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -397,20 +397,17 @@ set(VIDEOOUT_LIB src/core/libraries/videoout/buffer.h src/core/libraries/videoout/videoout_error.h ) -set(LIBC_SOURCES src/core/libraries/libc_internal/libc_internal.cpp +set(HLE_LIBC_INTERNAL_LIB src/core/libraries/libc_internal/libc_internal.cpp src/core/libraries/libc_internal/libc_internal.h - src/core/libraries/libc_internal/libc_internal_mspace.cpp - src/core/libraries/libc_internal/libc_internal_mspace.h src/core/libraries/libc_internal/libc_internal_io.cpp src/core/libraries/libc_internal/libc_internal_io.h src/core/libraries/libc_internal/libc_internal_memory.cpp src/core/libraries/libc_internal/libc_internal_memory.h src/core/libraries/libc_internal/libc_internal_str.cpp src/core/libraries/libc_internal/libc_internal_str.h - src/core/libraries/libc_internal/libc_internal_stream.cpp - src/core/libraries/libc_internal/libc_internal_stream.h src/core/libraries/libc_internal/libc_internal_math.cpp src/core/libraries/libc_internal/libc_internal_math.h + src/core/libraries/libc_internal/printf.h ) set(IME_LIB src/core/libraries/ime/error_dialog.cpp @@ -665,7 +662,7 @@ set(CORE src/core/aerolib/stubs.cpp ${KERNEL_LIB} ${NETWORK_LIBS} ${SYSTEM_LIBS} - ${LIBC_SOURCES} + ${HLE_LIBC_INTERNAL_LIB} ${PAD_LIB} ${VIDEOOUT_LIB} ${NP_LIBS} diff --git a/src/core/libraries/libc_internal/libc_internal.cpp b/src/core/libraries/libc_internal/libc_internal.cpp index a34128586..0b374c5a2 100644 --- a/src/core/libraries/libc_internal/libc_internal.cpp +++ b/src/core/libraries/libc_internal/libc_internal.cpp @@ -1,16253 +1,24 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include -#include - +#include #include "common/assert.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" -#include "core/libraries/libc_internal/libc_internal_io.h" -#include "core/libraries/libc_internal/libc_internal_memory.h" -#include "core/libraries/libc_internal/libc_internal_mspace.h" -#include "core/libraries/libc_internal/libc_internal_str.h" -#include "core/libraries/libc_internal/libc_internal_stream.h" #include "core/libraries/libs.h" #include "libc_internal.h" +#include "libc_internal_io.h" +#include "libc_internal_math.h" +#include "libc_internal_memory.h" +#include "libc_internal_str.h" +#include "printf.h" namespace Libraries::LibcInternal { -s32 PS4_SYSV_ABI internal_sceLibcHeapGetTraceInfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___absvdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___absvsi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___absvti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___adddf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___addsf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___addvdi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___addvsi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___addvti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ashldi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ashlti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ashrdi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ashrti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_compare_exchange() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_compare_exchange_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_compare_exchange_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_compare_exchange_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_compare_exchange_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_compare_exchange_n() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_exchange() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_exchange_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_exchange_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_exchange_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_exchange_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_exchange_n() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_add_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_add_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_add_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_add_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_and_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_and_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_and_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_and_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_or_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_or_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_or_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_or_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_sub_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_sub_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_sub_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_sub_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_xor_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_xor_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_xor_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_fetch_xor_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_is_lock_free() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_load() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_load_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_load_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_load_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_load_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_load_n() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_store() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_store_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_store_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_store_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_store_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___atomic_store_n() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cleanup() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___clzdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___clzsi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___clzti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cmpdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cmpti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ctzdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ctzsi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ctzti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_allocate_dependent_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_allocate_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_atexit(void (*func)(), void* arg, void* dso_handle) { - LOG_ERROR(Lib_LibcInternal, "(TEST) called"); // todo idek what I'm doing with this - std::atexit(func); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_bad_cast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_bad_typeid() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_begin_catch() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_call_unexpected() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_current_exception_type() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_current_primary_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_decrement_exception_refcount() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_demangle() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_end_catch() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_finalize() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_free_dependent_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_free_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_get_exception_ptr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_get_globals() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_get_globals_fast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_guard_abort() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_guard_acquire() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_guard_release() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_increment_exception_refcount() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_pure_virtual() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_rethrow() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_rethrow_primary_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___cxa_throw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divdc3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divdf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divdi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divmoddi4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divmodsi4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divsc3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divsf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divsi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___divxc3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___dynamic_cast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___eqdf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___eqsf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___extendsfdf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fe_dfl_env() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fedisableexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___feenableexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fflush() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ffsdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ffsti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixdfdi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixdfsi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixdfti() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixsfdi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixsfsi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixsfti() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunsdfdi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunsdfsi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunsdfti() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunssfdi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunssfsi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunssfti() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunsxfdi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunsxfsi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixunsxfti() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixxfdi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fixxfti() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatdidf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatdisf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatdixf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatsidf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatsisf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floattidf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floattisf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floattixf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatundidf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatundisf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatundixf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatunsidf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatunsisf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatuntidf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatuntisf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___floatuntixf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fpclassifyd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fpclassifyf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___fpclassifyl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___gedf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___gesf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___gtdf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___gtsf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___gxx_personality_v0() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___inet_addr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___inet_aton() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___inet_ntoa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___inet_ntoa_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isfinite() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isfinitef() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isfinitel() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isinf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isinff() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isinfl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isnan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isnanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isnanl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isnormal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isnormalf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isnormall() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___isthreaded() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___kernel_cos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___kernel_cosdf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___kernel_rem_pio2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___kernel_sin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___kernel_sindf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ledf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___lesf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___longjmp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___lshrdi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___lshrti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ltdf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ltsf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mb_cur_max() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mb_sb_limit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___moddi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___modsi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___modti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___muldc3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___muldf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___muldi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulodi4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulosi4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___muloti4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulsc3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulsf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___multi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulvdi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulvsi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulvti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___mulxc3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___nedf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___negdf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___negdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___negsf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___negti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___negvdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___negvsi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___negvti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___nesf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___opendir2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___paritydi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___paritysi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___parityti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___popcountdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___popcountsi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___popcountti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___powidf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___powisf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___powixf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___signbit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___signbitf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___signbitl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___srefill() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___srget() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___stderrp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___stdinp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___stdoutp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___subdf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___subsf3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___subvdi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___subvsi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___subvti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___swbuf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___sync_fetch_and_add_16() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___sync_fetch_and_and_16() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___sync_fetch_and_or_16() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___sync_fetch_and_sub_16() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___sync_fetch_and_xor_16() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___sync_lock_test_and_set_16() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___truncdfsf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ucmpdi2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___ucmpti2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___udivdi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___udivmoddi4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___udivmodsi4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___udivmodti4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___udivsi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___udivti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___umoddi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___umodsi3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___umodti3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___unorddf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal___unordsf2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Assert() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_strong_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_compare_exchange_weak_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_copy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_exchange() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_exchange_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_exchange_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_exchange_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_exchange_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_add_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_add_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_add_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_add_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_and_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_and_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_and_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_and_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_or_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_or_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_or_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_or_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_sub_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_fetch_xor_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_flag_clear() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_flag_test_and_set() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_is_lock_free_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_load_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_load_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_load_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_load_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_signal_fence() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_store_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_store_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_store_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_store_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atomic_thread_fence() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atqexit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Atthreadexit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Btowc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Call_once() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Call_onceEx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Clocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Closreg() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_broadcast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_destroy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_do_broadcast_at_thread_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_init() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_init_with_name() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_register_at_thread_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_signal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_timedwait() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_unregister_at_thread_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cnd_wait() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Cosh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Costate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__CTinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Ctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__CurrentRuneLocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__CWcsxfrm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Daysto() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dbl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dclass() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__DefaultRuneLocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Deletegloballocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Denorm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Divide() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dnorm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Do_call() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dscale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dsign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dtento() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dtest() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Dunscale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Eps() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Erf_one() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Erf_small() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Erfc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__err() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Errno() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Exp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fac_tidy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fail_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FAtan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FCosh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDclass() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDenorm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDivide() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDnorm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDscale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDsign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDtento() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDtest() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FDunscale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FEps() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Feraise() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FErf_one() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FErf_small() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FErfc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_add_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_and_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_and_seq_cst_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_and_seq_cst_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_and_seq_cst_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_or_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_or_seq_cst_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_or_seq_cst_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_or_seq_cst_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_xor_8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_xor_seq_cst_1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_xor_seq_cst_2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fetch_xor_seq_cst_4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FExp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FFpcomp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FGamma_big() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fgpos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FHypot() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Files() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FInf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FLog() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FLogpoly() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Flt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fltrounds() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FNan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fofind() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fofree() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fopen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Foprep() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fpcomp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FPlsw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FPmsw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FPoly() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FPow() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FQuad() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FQuadph() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FRecip() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FRint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Frprep() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FRteps() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FSin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FSincos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FSinh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FSnan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fspos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FTan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FTgamma() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Fwprep() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXbig() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_addh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_addx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_getw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_invx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_ldexpx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_movx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_mulh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_mulx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_setn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_setw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_sqrtx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FXp_subx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__FZero() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Gamma_big() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Genld() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Gentime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getcloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getctyptab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getdst() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Geterrno() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getfld() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getfloat() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getgloballocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getmbcurmax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getpcostate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getpctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getpmbstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__getprogname() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getptimes() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getptolower() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getptoupper() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getpwcostate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getpwcstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getpwctrtab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getpwctytab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Gettime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getzone() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Hugeval() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Hypot() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Inf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__init_env() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__init_tls() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Isdst() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Iswctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LAtan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LCosh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Ldbl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDclass() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDenorm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDivide() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDnorm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDscale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDsign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDtento() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDtest() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Ldtob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LDunscale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LEps() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LErf_one() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LErf_small() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LErfc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LExp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LFpcomp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LGamma_big() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LHypot() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LInf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Litob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LLog() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LLogpoly() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LNan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Lock_shared_ptr_spin_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Lock_spin_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Lockfilelock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Locksyslock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Locsum() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Loctab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Locterm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Locvar() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Log() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Logpoly() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LPlsw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LPmsw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LPoly() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LPow() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LQuad() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LQuadph() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LRecip() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LRint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LRteps() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LSin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LSincos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LSinh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LSnan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LTan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LTgamma() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXbig() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_addh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_addx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_getw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_invx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_ldexpx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_movx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_mulh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_mulx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_setn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_setw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_sqrtx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LXp_subx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__LZero() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Makeloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Makestab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Makewct() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mbcurmax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mbstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mbtowc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mbtowcx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_current_owns() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_destroy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_init() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_init_with_name() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_timedlock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_trylock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtx_unlock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtxdst() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtxinit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtxlock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Mtxunlock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Nan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__new_setup() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Nnl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__PathLocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__PJP_C_Copyright() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__PJP_CPP_Copyright() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Plsw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Pmsw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Poly() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Pow() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Putfld() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Putstr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Puttxt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Quad() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Quadph() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Randseed() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__readdir_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Readloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Recip() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__reclaim_telldir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Restore_state() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Rint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Rteps() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__rtld_addr_phdr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__rtld_atfork_post() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__rtld_atfork_pre() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__rtld_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__rtld_get_stack_prot() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__rtld_thread_init() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Save_state() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__SceLibcDebugOut() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__SceLibcTelemetoryOut() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__seekdir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Setgloballocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Shared_ptr_flag() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Sin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Sincos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Sinh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Skip() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Snan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stderr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stdin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stdout() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tgamma() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_abort() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_create() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_current() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_detach() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_equal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_id() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_join() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_lt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_sleep() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_start() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_start_with_attr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_start_with_name() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_start_with_name_attr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Thrd_yield() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__thread_autoinit_dummy_decl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__thread_autoinit_dummy_decl_stub() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__thread_init() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__thread_init_stub() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Times() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Costate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Ctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Errno() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Mbcurmax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Mbstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Times() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Tolotab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Touptab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__WCostate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Wcstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Wctrans() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tls_setup__Wctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tolotab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Touptab() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Towctrans() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tss_create() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tss_delete() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tss_get() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tss_set() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Ttotm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Tzoff() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unlock_shared_ptr_spin_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unlock_spin_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unlockfilelock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unlocksyslock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unwind_Backtrace() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unwind_GetIP() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unwind_Resume() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Unwind_Resume_or_Rethrow() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Vacopy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__warn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WCostate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wcscollx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wcsftime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wcstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wcsxfrmx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wctob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wctomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wctombx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wctrans() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Wctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WFrprep() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WFwprep() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WGenld() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WGetfld() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WGetfloat() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WGetint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WGetstr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WLdtob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WLitob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WPutfld() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WPutstr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WPuttxt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStod() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStodx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStof() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStoflt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStofx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStold() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStoldx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStoll() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStopfx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStoul() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStoull() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WStoxflt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xbig() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_addh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_addx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_getw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_invx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_ldexpx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_movx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_mulh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_mulx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_setn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_setw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_sqrtx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xp_subx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xtime_diff_to_ts() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xtime_get_ticks() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Xtime_to_ts() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdaPvm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdaPvmRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdaPvmSt11align_val_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdaPvRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdaPvS_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdaPvSt11align_val_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdaPvSt11align_val_tRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPvm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPvmRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPvmSt11align_val_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPvRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPvS_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPvSt11align_val_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZdlPvSt11align_val_tRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Zero() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIcLb0EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIcLb1EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIwLb0EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt10moneypunctIwLb1EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt14_Error_objectsIiE14_System_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt14_Error_objectsIiE15_Generic_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt20_Future_error_objectIiE14_Future_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt7codecvtIcc9_MbstatetE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt7collateIcE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt7collateIwE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt8messagesIcE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt8messagesIwE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt8numpunctIcE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt8numpunctIwE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZGVZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZGVZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv116__enum_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv116__enum_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv116__enum_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__array_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__array_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__array_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__class_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__class_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__class_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__pbase_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__pbase_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv117__pbase_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv119__pointer_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv119__pointer_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv119__pointer_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__function_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__function_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__function_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__si_class_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__si_class_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv120__si_class_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv121__vmi_class_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv121__vmi_class_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv121__vmi_class_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv123__fundamental_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv123__fundamental_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv123__fundamental_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN6Dinkum7codecvt10_Cvt_checkEmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads10lock_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads10lock_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads17_Throw_lock_errorEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads21_Throw_resource_errorEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads21thread_resource_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZN6Dinkum7threads21thread_resource_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Znam() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZnamRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZnamSt11align_val_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZnamSt11align_val_tRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XlenEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XranEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSs5_XlenEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSs5_XranEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt10bad_typeid4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt10bad_typeid8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt11logic_error4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt11logic_error8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt12bad_weak_ptr4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt12codecvt_base11do_encodingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt12codecvt_base13do_max_lengthEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt12future_error4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt12future_error8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt12system_error8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt13bad_exception8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt13runtime_error4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt14error_category10equivalentEiRKSt15error_condition() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt14error_category10equivalentERKSt10error_codei() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt14error_category23default_error_conditionEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt17bad_function_call4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt18bad_variant_access4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt22_Future_error_category4nameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt22_Future_error_category7messageEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt22_System_error_category23default_error_conditionEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt22_System_error_category4nameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt22_System_error_category7messageEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt23_Generic_error_category4nameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt23_Generic_error_category7messageEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_tolowerEc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_tolowerEPcPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_toupperEc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE10do_toupperEPcPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE8do_widenEc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE8do_widenEPKcS2_Pc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE9do_narrowEcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_scan_isEsPKwS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_tolowerEPwPKw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_tolowerEw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_toupperEPwPKw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE10do_toupperEw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE11do_scan_notEsPKwS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE5do_isEPKwS2_Ps() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE5do_isEsw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE8do_widenEc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE8do_widenEPKcS2_Pw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt5ctypeIwE9do_narrowEwc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE11do_groupingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE13do_neg_formatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE13do_pos_formatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE14do_curr_symbolEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE14do_frac_digitsEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_decimal_pointEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_negative_signEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_positive_signEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIcE16do_thousands_sepEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE11do_groupingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE13do_neg_formatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE13do_pos_formatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE14do_curr_symbolEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE14do_frac_digitsEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_decimal_pointEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_negative_signEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_positive_signEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7_MpunctIwE16do_thousands_sepEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE16do_always_noconvEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE2inERS0_PKcS4_RS4_PcS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE3outERS0_PKcS4_RS4_PcS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE5do_inERS0_PKcS4_RS4_PcS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE6do_outERS0_PKcS4_RS4_PcS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE6lengthERS0_PKcS4_m() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE7unshiftERS0_PcS3_RS3_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIcc9_MbstatetE9do_lengthERS0_PKcS4_m() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE11do_encodingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE13do_max_lengthEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE16do_always_noconvEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE5do_inERS0_PKcS4_RS4_PDiS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE6do_outERS0_PKDiS4_RS4_PcS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDic9_MbstatetE9do_lengthERS0_PKcS4_m() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE11do_encodingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE13do_max_lengthEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE16do_always_noconvEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE5do_inERS0_PKcS4_RS4_PDsS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE6do_outERS0_PKDsS4_RS4_PcS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIDsc9_MbstatetE9do_lengthERS0_PKcS4_m() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE10do_unshiftERS0_PcS3_RS3_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE11do_encodingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE13do_max_lengthEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE16do_always_noconvEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE5do_inERS0_PKcS4_RS4_PwS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE6do_outERS0_PKwS4_RS4_PcS6_RS6_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7codecvtIwc9_MbstatetE9do_lengthERS0_PKcS4_m() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE12do_transformEPKcS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE4hashEPKcS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE7compareEPKcS2_S2_S2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE7do_hashEPKcS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIcE9transformEPKcS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE12do_transformEPKwS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE4hashEPKwS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE7compareEPKwS2_S2_S2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE7do_hashEPKwS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt7collateIwE9transformEPKwS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8bad_cast4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8bad_cast8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8ios_base7failure8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE3getEiiiRKSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE4openERKSsRKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE5closeEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE6do_getEiiiRKSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE7do_openERKSsRKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIcE8do_closeEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE4openERKSsRKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE5closeEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE7do_openERKSsRKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8messagesIwE8do_closeEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE11do_groupingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE11do_truenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE12do_falsenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE13decimal_pointEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE13thousands_sepEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE16do_decimal_pointEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE16do_thousands_sepEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE8groupingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE8truenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIcE9falsenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE11do_groupingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE11do_truenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE12do_falsenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE13decimal_pointEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE13thousands_sepEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE16do_decimal_pointEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE16do_thousands_sepEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE8groupingEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE8truenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt8numpunctIwE9falsenameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt9bad_alloc4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt9bad_alloc8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt9exception4whatEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt9exception6_RaiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt9exception8_DoraiseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE5_CopyEmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6appendEmw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEmw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSiD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSiD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSo6sentryC2ERSo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSo6sentryD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs5_CopyEmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs5eraseEmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs6appendEmc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs6appendERKSsmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs6assignEmc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs6assignEPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs6assignERKSsmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSs6insertEmmc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10bad_typeidD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10bad_typeidD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10bad_typeidD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem10_Close_dirEPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem10_Copy_fileEPKcS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem10_File_sizeEPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem11_EquivalentEPKcS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem11_Remove_dirEPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem12_Current_getERA260_c() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem12_Current_setEPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem16_Last_write_timeEPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathES4_St10error_code() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathESt10error_code() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem18_Xfilesystem_errorEPKcSt10error_code() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem20_Set_last_write_timeEPKcl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem5_StatEPKcPNS_5permsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem6_ChmodEPKcNS_5permsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem6_LstatEPKcPNS_5permsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem7_RenameEPKcS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem7_ResizeEPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem7_UnlinkEPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem8_StatvfsEPKcRNS_10space_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem9_Make_dirEPKcS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem9_Open_dirERA260_cPKcRiRNS_9file_typeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10filesystem9_Read_dirERA260_cPvRNS_9file_typeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EE4intlE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC1ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EEC2ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb0EED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EE4intlE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC1ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EEC2ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIcLb1EED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EE4intlE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC1ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EEC2ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb0EED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EE4intlE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC1ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EEC2ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt10moneypunctIwLb1EED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11logic_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11logic_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11logic_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11range_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11range_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11range_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11regex_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11regex_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt11regex_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12bad_weak_ptrD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12bad_weak_ptrD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12bad_weak_ptrD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12domain_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12domain_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12domain_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12future_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12future_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12future_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12length_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12length_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12length_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12out_of_rangeD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12out_of_rangeD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12out_of_rangeD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_1E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_2E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_3E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_4E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_5E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_6E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_7E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_8E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders2_9E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_11E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_12E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_13E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_14E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_15E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_16E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_17E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_18E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_19E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12placeholders3_20E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12system_errorC2ESt10error_codePKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12system_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12system_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt12system_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base10is_boundedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base10is_integerE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base14is_specializedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base5radixE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base8is_exactE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Num_int_base9is_moduloE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Regex_traitsIcE6_NamesE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13_Regex_traitsIwE6_NamesE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13bad_exceptionD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13bad_exceptionD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13bad_exceptionD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5_LockEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7_UnlockEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9_EndwriteEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5_LockEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7_UnlockEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9_EndwriteEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13runtime_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13runtime_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13runtime_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Error_objectsIiE14_System_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Error_objectsIiE15_Generic_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base10has_denormE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base10is_boundedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base10is_integerE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base11round_styleE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base12has_infinityE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base13has_quiet_NaNE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base14is_specializedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base15has_denorm_lossE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base15tinyness_beforeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base17has_signaling_NaNE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base5radixE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base5trapsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base8is_exactE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base9is_iec559E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base9is_moduloE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Num_ldbl_base9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14error_categoryD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIaE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIaE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIaE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE9is_moduloE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIbE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIcE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIcE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIcE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE12max_digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE12max_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE12min_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE14max_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE14min_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIdE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDiE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDiE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDiE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDsE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDsE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIDsE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE12max_digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE12max_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE12min_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE14max_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE14min_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIeE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE12max_digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE12max_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE12min_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE14max_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE14min_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIfE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIhE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIhE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIhE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIiE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIiE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIiE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIjE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIjE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIjE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIlE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIlE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIlE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsImE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsImE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsImE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIsE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIsE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIsE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsItE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsItE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsItE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIwE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIwE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIwE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIxE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIxE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIxE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIyE6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIyE8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14numeric_limitsIyE9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14overflow_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14overflow_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14overflow_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base10has_denormE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base10is_boundedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base10is_integerE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base11round_styleE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base12has_infinityE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base13has_quiet_NaNE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base14is_specializedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base15has_denorm_lossE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base15tinyness_beforeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base17has_signaling_NaNE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base5radixE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base5trapsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base8is_exactE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base9is_iec559E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base9is_moduloE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15_Num_float_base9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15underflow_errorD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15underflow_errorD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15underflow_errorD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt16invalid_argumentD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt16invalid_argumentD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt16invalid_argumentD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt16nested_exceptionD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt16nested_exceptionD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt16nested_exceptionD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt17bad_function_callD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt17bad_function_callD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt17bad_function_callD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt18bad_variant_accessD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt18bad_variant_accessD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt20_Future_error_objectIiE14_Future_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt20bad_array_new_lengthD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt20bad_array_new_lengthD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt20bad_array_new_lengthD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt22_Future_error_categoryD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt22_Future_error_categoryD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt22_System_error_categoryD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt22_System_error_categoryD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt23_Generic_error_categoryD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt23_Generic_error_categoryD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt3pmr19new_delete_resourceEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt3pmr20get_default_resourceEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt3pmr20null_memory_resourceEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt3pmr20set_default_resourceEPNS_15memory_resourceE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPKcPP12pthread_attrPP7pthread() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPKcPP7pthread() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPP12pthread_attrPP7pthread() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_Pad7_LaunchEPP7pthread() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_Pad8_ReleaseEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_PadC2EPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_PadC2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_PadD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt4_PadD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcE10table_sizeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt5ctypeIcED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt5ctypeIwE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt5ctypeIwED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt5ctypeIwED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_Mutex5_LockEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_Mutex7_UnlockEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_MutexC1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_MutexC2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_MutexD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_MutexD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_Winit9_Init_cntE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_WinitC1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); // GRR - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_WinitC2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_WinitD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6_WinitD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6chrono12steady_clock12is_monotonicE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6chrono12steady_clock9is_steadyE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6chrono12system_clock12is_monotonicE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6chrono12system_clock9is_steadyE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale16_GetgloballocaleEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale16_SetgloballocaleEPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale2id7_Id_cntE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale5_InitEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale5emptyEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale5facet7_DecrefEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale5facet7_IncrefEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale5facet9_RegisterEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale6globalERKS_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp7_AddfacEPNS_5facetEm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp8_ClocptrE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp8_MakelocERKSt8_LocinfoiPS0_PKS_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp9_MakewlocERKSt8_LocinfoiPS0_PKS_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_Locimp9_MakexlocERKSt8_LocinfoiPS0_PKS_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC1Eb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC1ERKS0_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC2Eb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpC2ERKS0_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7_LocimpD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6locale7classicEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6localeD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt6thread20hardware_concurrencyEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcE5_InitERKSt8_Locinfob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcEC2Emb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcEC2EPKcmbb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIcED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwE5_InitERKSt8_Locinfob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwEC2Emb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwEC2EPKcmbb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7_MpunctIwED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetE7_GetcatEPPKNSt6locale5facetEPKS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIcc9_MbstatetED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDic9_MbstatetE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDic9_MbstatetED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDic9_MbstatetED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDsc9_MbstatetE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDsc9_MbstatetED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIDsc9_MbstatetED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIwc9_MbstatetE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIwc9_MbstatetED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7codecvtIwc9_MbstatetED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIcED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7collateIwED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_Locinfo8_AddcatsEiPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC1EiPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC1EPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC1ERKSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC2EiPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC2EPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoC2ERKSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8_LocinfoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8bad_castD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8bad_castD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8bad_castD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base4Init9_Init_cntE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitC1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); // alien isolation - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitC2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); // GRR - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base4InitD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base5_SyncE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base5clearENSt5_IosbIiE8_IostateEb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base6_IndexE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base7_AddstdEPS_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base7failureD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base7failureD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_base7failureD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_baseD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_baseD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8ios_baseD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIcED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8messagesIwED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE5_InitERKSt8_Locinfob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE5_TidyEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC1EPKcmb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC1ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC2EPKcmb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcEC2ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIcED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE5_InitERKSt8_Locinfob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE5_TidyEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwE7_GetcatEPPKNSt6locale5facetEPKS1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC1EPKcmb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC1ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC2EPKcmb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwEC2ERKSt8_Locinfomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8numpunctIwED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base10has_denormE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base10is_boundedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base10is_integerE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base11round_styleE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12has_infinityE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12max_digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12max_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base12min_exponentE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base13has_quiet_NaNE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base14is_specializedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base14max_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base14min_exponent10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base15has_denorm_lossE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base15tinyness_beforeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base17has_signaling_NaNE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base5radixE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base5trapsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base6digitsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base8digits10E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base8is_exactE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base9is_iec559E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base9is_moduloE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9_Num_base9is_signedE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9bad_allocD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9bad_allocD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9bad_allocD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9exception18_Set_raise_handlerEPFvRKS_E() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9exceptionD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9exceptionD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9exceptionD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9type_infoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9type_infoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9type_infoD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZnwmRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZnwmSt11align_val_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZnwmSt11align_val_tRKSt9nothrow_t() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt10_Rng_abortPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt10adopt_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt10defer_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt10unexpectedv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt11_Xbad_allocv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt11setiosflagsNSt5_IosbIiE9_FmtflagsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt11try_to_lock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt12setprecisioni() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt13_Cl_charnames() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt13_Execute_onceRSt9once_flagPFiPvS1_PS1_ES1_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt13_Syserror_mapi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt13_Xregex_errorNSt15regex_constants10error_typeE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt13get_terminatev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt13resetiosflagsNSt5_IosbIiE9_FmtflagsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt13set_terminatePFvvE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Atomic_assertPKcS0_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Cl_wcharnames() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Debug_messagePKcS0_j() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Raise_handler() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Random_devicev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Throw_C_errori() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Xlength_errorPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14_Xout_of_rangePKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14get_unexpectedv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt14set_unexpectedPFvvE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt15_sceLibcLocinfoPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt15_Xruntime_errorPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt15future_categoryv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt15get_new_handlerv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt15set_new_handlerPFvvE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt15system_categoryv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt16_Throw_Cpp_errori() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt16_Xoverflow_errorPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt16generic_categoryv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt17_Future_error_mapi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt18_String_cpp_unused() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt18_Xinvalid_argumentPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt18uncaught_exceptionv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt19_Throw_future_errorRKSt10error_code() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt19_Xbad_function_callv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt21_sceLibcClassicLocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt22_Get_future_error_whati() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt22_Random_device_entropyv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt25_Rethrow_future_exceptionSt13exception_ptr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt3cin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt4_Fpz() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt4cerr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt4clog() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt4cout() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt4setwi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt4wcin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt5wcerr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt5wclog() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt5wcout() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt6_ThrowRKSt9exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt6ignore() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7_BADOFF() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7_FiopenPKcNSt5_IosbIiE9_OpenmodeEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7_FiopenPKwNSt5_IosbIiE9_OpenmodeEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7_MP_AddPyy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7_MP_GetPy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7_MP_MulPyyy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7_MP_RemPyy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7nothrow() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt7setbasei() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt8_XLgammad() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt8_XLgammae() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt8_XLgammaf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt9_LStrcollIcEiPKT_S2_S2_S2_PKSt8_Collvec() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt9_LStrcollIwEiPKT_S2_S2_S2_PKSt8_Collvec() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt9_LStrxfrmIcEmPT_S1_PKS0_S3_PKSt8_Collvec() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt9_LStrxfrmIwEmPT_S1_PKS0_S3_PKSt8_Collvec() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt9terminatev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTId() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIDh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIDi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIDn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIDs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv116__enum_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv117__array_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv117__class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv117__pbase_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv119__pointer_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv120__function_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv120__si_class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv121__vmi_class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv123__fundamental_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN10__cxxabiv129__pointer_to_member_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN6Dinkum7threads10lock_errorE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIN6Dinkum7threads21thread_resource_errorE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTINSt6locale5facetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTINSt6locale7_LocimpE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTINSt8ios_base7failureE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPDh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPDi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPDn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPDs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKDh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKDi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKDn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKDs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPKy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIPy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt10bad_typeid() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt10ctype_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt10money_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIcLb0EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIcLb1EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIwLb0EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt10moneypunctIwLb1EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt11_Facet_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt11logic_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt11range_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt11regex_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt12bad_weak_ptr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt12codecvt_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt12domain_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt12future_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt12length_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt12out_of_range() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt12system_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt13bad_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt13basic_filebufIcSt11char_traitsIcEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt13basic_filebufIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt13messages_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt13runtime_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt14error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt14overflow_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt15underflow_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt16invalid_argument() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt16nested_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt17bad_function_call() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt18bad_variant_access() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt20bad_array_new_length() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt22_Future_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt22_System_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt23_Generic_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt4_Pad() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt5_IosbIiE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt5ctypeIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt5ctypeIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7_MpunctIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7_MpunctIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7codecvtIcc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7codecvtIDic9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7codecvtIDsc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7codecvtIwc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7collateIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7collateIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8bad_cast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8ios_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8messagesIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8messagesIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8numpunctIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8numpunctIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9bad_alloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9basic_iosIcSt11char_traitsIcEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9basic_iosIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9time_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9type_info() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTIy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSDi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSDn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSDs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv116__enum_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv117__array_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv117__class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv117__pbase_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv119__pointer_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv120__function_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv120__si_class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv121__vmi_class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv123__fundamental_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN10__cxxabiv129__pointer_to_member_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN6Dinkum7threads10lock_errorE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSN6Dinkum7threads21thread_resource_errorE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSNSt6locale5facetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSNSt6locale7_LocimpE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSNSt8ios_base7failureE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPDi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPDn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPDs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKDi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKDn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKDs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPKy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSPy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt10bad_typeid() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt10ctype_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt10money_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIcLb0EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIcLb1EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIwLb0EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt10moneypunctIwLb1EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt11_Facet_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt11logic_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt11range_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt11regex_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt12bad_weak_ptr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt12codecvt_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt12domain_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt12future_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt12length_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt12out_of_range() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt12system_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt13bad_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt13basic_filebufIcSt11char_traitsIcEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt13basic_filebufIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt13messages_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt13runtime_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt14error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt14overflow_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt15underflow_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt16invalid_argument() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt16nested_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt17bad_function_call() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt18bad_variant_access() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt20bad_array_new_length() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt22_Future_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt22_System_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt23_Generic_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt4_Pad() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt5_IosbIiE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt5ctypeIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt5ctypeIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7_MpunctIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7_MpunctIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIcc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIDic9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIDsc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7codecvtIwc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7collateIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7collateIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8bad_cast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8ios_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8messagesIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8messagesIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8numpunctIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8numpunctIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9bad_alloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9basic_iosIcSt11char_traitsIcEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9basic_iosIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9time_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9type_info() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSiD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSiD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSoD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSoD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv116__enum_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv117__array_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv117__class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv117__pbase_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv119__pointer_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv120__function_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv120__si_class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv121__vmi_class_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv123__fundamental_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN10__cxxabiv129__pointer_to_member_type_infoE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN6Dinkum7threads10lock_errorE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVN6Dinkum7threads21thread_resource_errorE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVNSt6locale7_LocimpE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVNSt8ios_base7failureE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt10bad_typeid() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIcLb0EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIcLb1EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIwLb0EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt10moneypunctIwLb1EE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt11logic_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt11range_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt11regex_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt12bad_weak_ptr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt12domain_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt12future_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt12length_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt12out_of_range() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt12system_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt13bad_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt13basic_filebufIcSt11char_traitsIcEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt13basic_filebufIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt13runtime_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt14error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt14overflow_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt15underflow_error() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt16invalid_argument() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt16nested_exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt17bad_function_call() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt18bad_variant_access() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt20bad_array_new_length() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt22_Future_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt22_System_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt23_Generic_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt4_Pad() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt5ctypeIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt5ctypeIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7_MpunctIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7_MpunctIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIcc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIDic9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIDsc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7codecvtIwc9_MbstatetE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7collateIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7collateIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8bad_cast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8ios_base() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8messagesIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8messagesIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8numpunctIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8numpunctIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt9bad_alloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt9exception() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt9type_info() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_abort() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_abort_handler_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_alarm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_aligned_alloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_asctime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_asctime_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_at_quick_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atexit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atof() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atoi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atol() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atoll() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_basename() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_basename_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_bcmp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_bcopy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_bsearch() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_bsearch_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_btowc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_bzero() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_c16rtomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_c32rtomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_calloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_cbrt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_cbrtf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_cbrtl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_clearerr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_clearerr_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_clock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_clock_1700() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_closedir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_copysign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_copysignf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_copysignl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ctime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ctime_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_daemon() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_daylight() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_devname() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_devname_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_difftime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_dirname() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_div() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_drand48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_drem() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_dremf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_erand48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_erf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_erfc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_erfcf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_erfcl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_erff() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_erfl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_err() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_err_set_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_err_set_file() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_errc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_errx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fclose() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fcloseall() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fdim() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fdimf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fdiml() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fdopen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fdopendir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_feclearexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fedisableexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_feenableexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fegetenv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fegetexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fegetexceptflag() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fegetround() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fegettrapenable() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_feholdexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_feof() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_feof_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_feraiseexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ferror() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ferror_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fesetenv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fesetexceptflag() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fesetround() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fesettrapenable() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fetestexcept() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_feupdateenv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fflush() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fgetc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fgetln() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fgetpos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fgets() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fgetwc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fgetws() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fileno() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fileno_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_finite() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_finitef() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_flockfile() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_flsl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fma() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmaf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fopen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fopen_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fpurge() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fputc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fputs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fputwc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fputws() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fread() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_freeifaddrs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_freopen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_freopen_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fseek() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fseeko() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fsetpos() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fstatvfs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ftell() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ftello() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ftrylockfile() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_funlockfile() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fwide() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fwrite() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gamma() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gamma_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gammaf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gammaf_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getc_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getchar() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getchar_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getcwd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getenv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gethostname() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getifaddrs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getopt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getopt_long() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getopt_long_only() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getprogname() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gets() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gets_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getwc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_getwchar() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gmtime(time_t* timer) { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_gmtime_s(time_t* timer, u64 flags) { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_hypot() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_hypot3() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_hypot3f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_hypot3l() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_hypotf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_hypotl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ignore_handler_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_index() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_inet_addr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_inet_aton() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_inet_ntoa() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_inet_ntoa_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_initstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isalnum() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isalpha() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isblank() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iscntrl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isdigit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isgraph() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isprint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ispunct() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isspace() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswalnum() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswalpha() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswblank() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswcntrl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswdigit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswgraph() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswlower() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswprint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswpunct() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswspace() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswupper() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_iswxdigit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isxdigit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_j0() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_j0f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_j1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_j1f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_jn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_jnf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_jrand48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_labs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lcong48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ldexp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ldexpf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ldexpl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ldiv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lgamma() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lgamma_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lgammaf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lgammaf_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lgammal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_llabs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lldiv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_llrint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_llrintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_llrintl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_llround() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_llroundf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_llroundl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_localeconv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_localtime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_localtime_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_longjmp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lrand48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lrint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lrintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lrintl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_makecontext() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mblen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbrlen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbrtoc16() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbrtoc32() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbrtowc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbsinit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbsrtowcs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbsrtowcs_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbstowcs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbstowcs_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mbtowc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mergesort() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mktime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_modf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_modff() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_modfl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_mrand48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nearbyint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nearbyintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nearbyintl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_Need_sceLibcInternal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nextafter() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nextafterf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nextafterl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nexttoward() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nexttowardf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nexttowardl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nrand48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_opendir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_optarg() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_opterr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_optind() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_optopt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_optreset() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_perror() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_addclose() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_adddup2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_addopen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_destroy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawn_file_actions_init() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_destroy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_getflags() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_getpgroup() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_getschedparam() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_getschedpolicy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_getsigdefault() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_getsigmask() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_init() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_setflags() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_setpgroup() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_setschedparam() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_setschedpolicy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_setsigdefault() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnattr_setsigmask() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_spawnp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_psignal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putc_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putchar() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putchar_unlocked() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putenv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_puts() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putwc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_putwchar() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_qsort() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_qsort_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_quick_exit() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rand() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rand_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_random() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_readdir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_readdir_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_realpath() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_remainderf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_remainderl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_remove() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_remquo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_remquof() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_remquol() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rewind() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rewinddir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rindex() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rint() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_rintl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_round() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_roundf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_roundl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalbf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalbln() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalblnf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalblnl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalbn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalbnf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scalbnl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcDebugOut() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcHeapGetAddressRanges() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcHeapMutexCalloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcHeapMutexFree() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcHeapSetAddressRangeCallback() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcHeapSetTraceMarker() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcHeapUnsetTraceMarker() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcInternalMemoryGetWakeAddr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcInternalMemoryMutexEnable() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcInternalSetMallocCallback() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sceLibcOnce() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_seed48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_seekdir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_set_constraint_handler_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_setbuf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_setenv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_setjmp(std::jmp_buf buf) { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_setlocale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_setstate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_setvbuf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sigblock() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_siginterrupt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_signalcontext() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_signgam() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_significand() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_significandf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sigsetmask() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sigvec() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_srand48() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_srandom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_srandomdev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_statvfs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_stderr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_stdin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_stdout() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_stpcpy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sys_nsig() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sys_siglist() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sys_signame() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_syslog() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_telldir() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_tgamma() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_tgammaf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_tgammal() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_time() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_timezone() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_tolower() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_toupper() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_towctrans() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_towlower() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_towupper() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_trunc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_truncf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_truncl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_tzname() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_tzset() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ungetc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ungetwc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_unsetenv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_utime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_verr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_verrc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_verrx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsyslog() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vwarn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vwarnc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vwarnx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_warn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_warnc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_warnx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcrtomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcrtomb_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcscat() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcscat_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcschr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcscmp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcscoll() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcscpy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcscpy_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcscspn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsftime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcslen() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsncat() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsncat_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsncmp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsncpy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsncpy_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsnlen_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcspbrk() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsrchr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsrtombs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsrtombs_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsspn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstod() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstof() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstoimax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstok() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstok_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstol() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstold() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstoll() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstombs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstombs_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstoul() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstoull() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcstoumax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsxfrm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wctob() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wctomb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wctomb_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wctrans() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wctype() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_xtime_get() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_y0() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_y0f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_y1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_y1f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_yn() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ynf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_Func_186EB8E3525D6240() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_Func_419F5881393ECAB1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_Func_6C6B8377791654A4() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_Func_7FD2D5C8DF0ACBC8() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_Func_C14A89D29B148C3A() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - void RegisterlibSceLibcInternal(Core::Loader::SymbolsResolver* sym) { - RegisterlibSceLibcInternalMspace(sym); - RegisterlibSceLibcInternalIo(sym); - RegisterlibSceLibcInternalMemory(sym); + RegisterlibSceLibcInternalMath(sym); RegisterlibSceLibcInternalStr(sym); - RegisterlibSceLibcInternalStream(sym); - - LIB_FUNCTION("NWtTN10cJzE", "libSceLibcInternalExt", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcHeapGetTraceInfo); - LIB_FUNCTION("ys1W6EwuVw4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___absvdi2); - LIB_FUNCTION("2HED9ow7Zjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___absvsi2); - LIB_FUNCTION("v9XNTmsmz+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___absvti2); - LIB_FUNCTION("3CAYAjL-BLs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___adddf3); - LIB_FUNCTION("mhIInD5nz8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___addsf3); - LIB_FUNCTION("8gG-+co6LfM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___addvdi3); - LIB_FUNCTION("gsnW-FWQqZo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___addvsi3); - LIB_FUNCTION("IjlonFkCFDs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___addvti3); - LIB_FUNCTION("CS91br93fag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ashldi3); - LIB_FUNCTION("ECUHmdEfhic", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ashlti3); - LIB_FUNCTION("fSZ+gbf8Ekc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ashrdi3); - LIB_FUNCTION("7+0ouwmGDww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ashrti3); - LIB_FUNCTION("ClfCoK1Zeb4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_compare_exchange); - LIB_FUNCTION("ZwapHUAcijE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_compare_exchange_1); - LIB_FUNCTION("MwiKdf6QFvI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_compare_exchange_2); - LIB_FUNCTION("lku-VgKK0RE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_compare_exchange_4); - LIB_FUNCTION("tnlAgPCKyTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_compare_exchange_8); - LIB_FUNCTION("hsn2TaF3poY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_compare_exchange_n); - LIB_FUNCTION("5i8mTQeo9hs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_exchange); - LIB_FUNCTION("z8lecpCHpqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_exchange_1); - LIB_FUNCTION("HDvFM0iZYXo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_exchange_2); - LIB_FUNCTION("yit-Idli5gU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_exchange_4); - LIB_FUNCTION("UOz27kgch8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_exchange_8); - LIB_FUNCTION("oCH4efUlxZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_exchange_n); - LIB_FUNCTION("Qb86Y5QldaE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_add_1); - LIB_FUNCTION("wEImmi0YYQM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_add_2); - LIB_FUNCTION("U8pDVMfBDUY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_add_4); - LIB_FUNCTION("SqcnaljoFBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_add_8); - LIB_FUNCTION("Q3-0HGD3Y48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_and_1); - LIB_FUNCTION("A71XWS1kKqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_and_2); - LIB_FUNCTION("E-XEmpL9i1A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_and_4); - LIB_FUNCTION("xMksIr3nXug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_and_8); - LIB_FUNCTION("LvLuiirFk8U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_or_1); - LIB_FUNCTION("aSNAf0kxC+Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_or_2); - LIB_FUNCTION("AFRS4-8aOSo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_or_4); - LIB_FUNCTION("5ZKavcBG7eM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_or_8); - LIB_FUNCTION("HWBJOsgJBT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_sub_1); - LIB_FUNCTION("yvhjR7PTRgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_sub_2); - LIB_FUNCTION("-mUC21i8WBQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_sub_4); - LIB_FUNCTION("K+k1HlhjyuA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_sub_8); - LIB_FUNCTION("aWc+LyHD1vk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_xor_1); - LIB_FUNCTION("PZoM-Yn6g2Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_xor_2); - LIB_FUNCTION("pPdYDr1KDsI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_xor_4); - LIB_FUNCTION("Dw3ieb2rMmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_fetch_xor_8); - LIB_FUNCTION("JZWEhLSIMoQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_is_lock_free); - LIB_FUNCTION("+iy+BecyFVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_load); - LIB_FUNCTION("cWgvLiSJSOQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_load_1); - LIB_FUNCTION("ufqiLmjiBeM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_load_2); - LIB_FUNCTION("F+m2tOMgeTo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_load_4); - LIB_FUNCTION("8KwflkOtvZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_load_8); - LIB_FUNCTION("Q6oqEnefZQ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_load_n); - LIB_FUNCTION("sV6ry-Fd-TM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_store); - LIB_FUNCTION("ZF6hpsTZ2m8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_store_1); - LIB_FUNCTION("-JjkEief9No", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_store_2); - LIB_FUNCTION("4tDF0D+qdWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_store_4); - LIB_FUNCTION("DEQmHCl-EGU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_store_8); - LIB_FUNCTION("GdwuPYbVpP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___atomic_store_n); - LIB_FUNCTION("XGNIEdRyYPo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cleanup); - LIB_FUNCTION("gCf7+aGEhnU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___clzdi2); - LIB_FUNCTION("ptL8XWgpGS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___clzsi2); - LIB_FUNCTION("jPywoVsPVR8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___clzti2); - LIB_FUNCTION("OvbYtSGnzFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cmpdi2); - LIB_FUNCTION("u2kPEkUHfsg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cmpti2); - LIB_FUNCTION("yDPuV0SXp7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ctzdi2); - LIB_FUNCTION("2NvhgiBTcVE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ctzsi2); - LIB_FUNCTION("olBDzD1rX2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ctzti2); - LIB_FUNCTION("IJKVjsmxxWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_allocate_dependent_exception); - LIB_FUNCTION("cfAXurvfl5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_allocate_exception); - LIB_FUNCTION("tsvEmnenz48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_atexit); - LIB_FUNCTION("pBxafllkvt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_bad_cast); - LIB_FUNCTION("xcc6DTcL8QA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_bad_typeid); - LIB_FUNCTION("3cUUypQzMiI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_begin_catch); - LIB_FUNCTION("usKbuvy2hQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_call_unexpected); - LIB_FUNCTION("BxPeH9TTcs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_current_exception_type); - LIB_FUNCTION("RY8mQlhg7mI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_current_primary_exception); - LIB_FUNCTION("MQFPAqQPt1s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_decrement_exception_refcount); - LIB_FUNCTION("zMCYAqNRllc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_demangle); - LIB_FUNCTION("lX+4FNUklF0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_end_catch); - LIB_FUNCTION("H2e8t5ScQGc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_finalize); - LIB_FUNCTION("kBxt5LwtLA4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_free_dependent_exception); - LIB_FUNCTION("nOIEswYD4Ig", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_free_exception); - LIB_FUNCTION("Y6Sl4Xw7gfA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_get_exception_ptr); - LIB_FUNCTION("3rJJb81CDM4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_get_globals); - LIB_FUNCTION("uCRed7SvX5E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_get_globals_fast); - LIB_FUNCTION("2emaaluWzUw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_guard_abort); - LIB_FUNCTION("3GPpjQdAMTw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_guard_acquire); - LIB_FUNCTION("9rAeANT2tyE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_guard_release); - LIB_FUNCTION("PsrRUg671K0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_increment_exception_refcount); - LIB_FUNCTION("zr094EQ39Ww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_pure_virtual); - LIB_FUNCTION("ZL9FV4mJXxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_rethrow); - LIB_FUNCTION("qKQiNX91IGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_rethrow_primary_exception); - LIB_FUNCTION("vkuuLfhnSZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___cxa_throw); - LIB_FUNCTION("eTP9Mz4KkY4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divdc3); - LIB_FUNCTION("mdGgLADsq8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divdf3); - LIB_FUNCTION("9daYeu+0Y-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divdi3); - LIB_FUNCTION("1rs4-h7Fq9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divmoddi4); - LIB_FUNCTION("rtBENmz8Iwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divmodsi4); - LIB_FUNCTION("dcaiFCKtoDg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divsc3); - LIB_FUNCTION("nufufTB4jcI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divsf3); - LIB_FUNCTION("zdJ3GXAcI9M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divsi3); - LIB_FUNCTION("XU4yLKvcDh0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divti3); - LIB_FUNCTION("SNdBm+sNfM4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___divxc3); - LIB_FUNCTION("hMAe+TWS9mQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___dynamic_cast); - LIB_FUNCTION("8F52nf7VDS8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___eqdf2); - LIB_FUNCTION("LmXIpdHppBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___eqsf2); - LIB_FUNCTION("6zU++1tayjA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___extendsfdf2); - LIB_FUNCTION("CVoT4wFYleE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fe_dfl_env); - LIB_FUNCTION("1IB0U3rUtBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fedisableexcept); - LIB_FUNCTION("NDOLSTFT1ns", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___feenableexcept); - LIB_FUNCTION("E1iwBYkG3CM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fflush); - LIB_FUNCTION("r3tNGoVJ2YA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ffsdi2); - LIB_FUNCTION("b54DvYZEHj4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ffsti2); - LIB_FUNCTION("q9SHp+5SOOQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixdfdi); - LIB_FUNCTION("saNCRNfjeeg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixdfsi); - LIB_FUNCTION("cY4yCWdcTXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixdfti); - LIB_FUNCTION("0eoyU-FoNyk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixsfdi); - LIB_FUNCTION("3qQmz11yFaA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixsfsi); - LIB_FUNCTION("IHq2IaY4UGg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixsfti); - LIB_FUNCTION("h8nbSvw0s+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunsdfdi); - LIB_FUNCTION("6WwFtNvnDag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunsdfsi); - LIB_FUNCTION("rLuypv9iADw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunsdfti); - LIB_FUNCTION("Qa6HUR3h1k4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunssfdi); - LIB_FUNCTION("NcZqFTG-RBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunssfsi); - LIB_FUNCTION("mCESRUqZ+mw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunssfti); - LIB_FUNCTION("DG8dDx9ZV70", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunsxfdi); - LIB_FUNCTION("dtMu9zCDn3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunsxfsi); - LIB_FUNCTION("l0qC0BR1F44", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixunsxfti); - LIB_FUNCTION("31g+YJf1fHk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixxfdi); - LIB_FUNCTION("usQDRS-1HZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fixxfti); - LIB_FUNCTION("BMVIEbwpP+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatdidf); - LIB_FUNCTION("2SSK3UFPqgQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatdisf); - LIB_FUNCTION("MVPtIf3MtL8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatdixf); - LIB_FUNCTION("X7A21ChFXPQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatsidf); - LIB_FUNCTION("rdht7pwpNfM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatsisf); - LIB_FUNCTION("EtpM9Qdy8D4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floattidf); - LIB_FUNCTION("VlDpPYOXL58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floattisf); - LIB_FUNCTION("dJvVWc2jOP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floattixf); - LIB_FUNCTION("1RNxpXpVWs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatundidf); - LIB_FUNCTION("9tnIVFbvOrw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatundisf); - LIB_FUNCTION("3A9RVSwG8B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatundixf); - LIB_FUNCTION("OdvMJCV7Oxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatunsidf); - LIB_FUNCTION("RC3VBr2l94o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatunsisf); - LIB_FUNCTION("ibs6jIR0Bw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatuntidf); - LIB_FUNCTION("KLfd8g4xp+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatuntisf); - LIB_FUNCTION("OdzLUcBLhb4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___floatuntixf); - LIB_FUNCTION("qlWiRfOJx1A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fpclassifyd); - LIB_FUNCTION("z7aCCd9hMsI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fpclassifyf); - LIB_FUNCTION("zwV79ZJ9qAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___fpclassifyl); - LIB_FUNCTION("hXA24GbAPBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___gedf2); - LIB_FUNCTION("mdLGxBXl6nk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___gesf2); - LIB_FUNCTION("1PvImz6yb4M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___gtdf2); - LIB_FUNCTION("ICY0Px6zjjo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___gtsf2); - LIB_FUNCTION("XwLA5cTHjt4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___gxx_personality_v0); - LIB_FUNCTION("7p7kTAJcuGg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___inet_addr); - LIB_FUNCTION("a7ToDPsIQrc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___inet_aton); - LIB_FUNCTION("6i5aLrxRhG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___inet_ntoa); - LIB_FUNCTION("H2QD+kNpa+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___inet_ntoa_r); - LIB_FUNCTION("dhK16CKwhQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isfinite); - LIB_FUNCTION("Q8pvJimUWis", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isfinitef); - LIB_FUNCTION("3-zCDXatSU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isfinitel); - LIB_FUNCTION("V02oFv+-JzA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isinf); - LIB_FUNCTION("rDMyAf1Jhug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isinff); - LIB_FUNCTION("gLGmR9aan4c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isinfl); - LIB_FUNCTION("GfxAp9Xyiqs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isnan); - LIB_FUNCTION("lA94ZgT+vMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isnanf); - LIB_FUNCTION("YBRHNH4+dDo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isnanl); - LIB_FUNCTION("fGPRa6T+Cu8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isnormal); - LIB_FUNCTION("WkYnBHFsmW4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isnormalf); - LIB_FUNCTION("S3nFV6TR1Dw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isnormall); - LIB_FUNCTION("q1OvUam0BJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___isthreaded); - LIB_FUNCTION("-m7FIvSBbMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___kernel_cos); - LIB_FUNCTION("7ruwcMCJVGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___kernel_cosdf); - LIB_FUNCTION("GLNDoAYNlLQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___kernel_rem_pio2); - LIB_FUNCTION("zpy7LnTL5p0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___kernel_sin); - LIB_FUNCTION("2Lvc7KWtErs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___kernel_sindf); - LIB_FUNCTION("F78ECICRxho", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ledf2); - LIB_FUNCTION("hbiV9vHqTgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___lesf2); - LIB_FUNCTION("9mKjVppFsL0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___longjmp); - LIB_FUNCTION("18E1gOH7cmk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___lshrdi3); - LIB_FUNCTION("1iRAqEqEL0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___lshrti3); - LIB_FUNCTION("tcBJa2sYx0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ltdf2); - LIB_FUNCTION("259y57ZdZ3I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ltsf2); - LIB_FUNCTION("77pL1FoD4I4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mb_cur_max); - LIB_FUNCTION("fGYLBr2COwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mb_sb_limit); - LIB_FUNCTION("gQFVRFgFi48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___moddi3); - LIB_FUNCTION("k0vARyJi9oU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___modsi3); - LIB_FUNCTION("J8JRHcUKWP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___modti3); - LIB_FUNCTION("D4Hf-0ik5xU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___muldc3); - LIB_FUNCTION("O+Bv-zodKLw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___muldf3); - LIB_FUNCTION("Hf8hPlDoVsw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___muldi3); - LIB_FUNCTION("wVbBBrqhwdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulodi4); - LIB_FUNCTION("DDxNvs1a9jM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulosi4); - LIB_FUNCTION("+X-5yNFPbDw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___muloti4); - LIB_FUNCTION("y+E+IUZYVmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulsc3); - LIB_FUNCTION("BXmn6hA5o0M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulsf3); - LIB_FUNCTION("zhAIFVIN1Ds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___multi3); - LIB_FUNCTION("Uyfpss5cZDE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulvdi3); - LIB_FUNCTION("tFgzEdfmEjI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulvsi3); - LIB_FUNCTION("6gc1Q7uu244", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulvti3); - LIB_FUNCTION("gZWsDrmeBsg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___mulxc3); - LIB_FUNCTION("ocyIiJnJW24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___nedf2); - LIB_FUNCTION("tWI4Ej9k9BY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___negdf2); - LIB_FUNCTION("Rj4qy44yYUw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___negdi2); - LIB_FUNCTION("4f+Q5Ka3Ex0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___negsf2); - LIB_FUNCTION("Zofiv1PMmR4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___negti2); - LIB_FUNCTION("fh54IRxGBUQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___negvdi2); - LIB_FUNCTION("7xnsvjuqtZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___negvsi2); - LIB_FUNCTION("QW-f9vYgI7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___negvti2); - LIB_FUNCTION("OWZ3ZLkgye8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___nesf2); - LIB_FUNCTION("KOy7MeQ7OAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___opendir2); - LIB_FUNCTION("RDeUB6JGi1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___paritydi2); - LIB_FUNCTION("9xUnIQ53Ao4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___paritysi2); - LIB_FUNCTION("vBP4ytNRXm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___parityti2); - LIB_FUNCTION("m4S+lkRvTVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___popcountdi2); - LIB_FUNCTION("IBn9qjWnXIw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___popcountsi2); - LIB_FUNCTION("l1wz5R6cIxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___popcountti2); - LIB_FUNCTION("H+8UBOwfScI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___powidf2); - LIB_FUNCTION("EiMkgQsOfU0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___powisf2); - LIB_FUNCTION("DSI7bz2Jt-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___powixf2); - LIB_FUNCTION("Rw4J-22tu1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___signbit); - LIB_FUNCTION("CjQROLB88a4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___signbitf); - LIB_FUNCTION("Cj81LPErPCc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___signbitl); - LIB_FUNCTION("fIskTFX9p68", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___srefill); - LIB_FUNCTION("yDnwZsMnX0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___srget); - LIB_FUNCTION("as8Od-tH1BI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___stderrp); - LIB_FUNCTION("bgAcsbcEznc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___stdinp); - LIB_FUNCTION("zqJhBxAKfsc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___stdoutp); - LIB_FUNCTION("HLDcfGUMNWY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___subdf3); - LIB_FUNCTION("FeyelHfQPzo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___subsf3); - LIB_FUNCTION("+kvyBGa+5VI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___subvdi3); - LIB_FUNCTION("y8j-jP6bHW4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___subvsi3); - LIB_FUNCTION("cbyLM5qrvHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___subvti3); - LIB_FUNCTION("TP6INgQ6N4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___swbuf); - LIB_FUNCTION("+WLgzxv5xYA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___sync_fetch_and_add_16); - LIB_FUNCTION("XmAquprnaGM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___sync_fetch_and_and_16); - LIB_FUNCTION("GE4I2XAd4G4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___sync_fetch_and_or_16); - LIB_FUNCTION("Z2I0BWPANGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___sync_fetch_and_sub_16); - LIB_FUNCTION("d5Q-h2wF+-E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___sync_fetch_and_xor_16); - LIB_FUNCTION("ufZdCzu8nME", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___sync_lock_test_and_set_16); - LIB_FUNCTION("2M9VZGYPHLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___truncdfsf2); - LIB_FUNCTION("SZk+FxWXdAs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ucmpdi2); - LIB_FUNCTION("dLmvQfG8am4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___ucmpti2); - LIB_FUNCTION("tX8ED4uIAsQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___udivdi3); - LIB_FUNCTION("EWWEBA+Ldw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___udivmoddi4); - LIB_FUNCTION("PPdIvXwUQwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___udivmodsi4); - LIB_FUNCTION("lcNk3Ar5rUQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___udivmodti4); - LIB_FUNCTION("PxP1PFdu9OQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___udivsi3); - LIB_FUNCTION("802pFCwC9w0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___udivti3); - LIB_FUNCTION("+wj27DzRPpo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___umoddi3); - LIB_FUNCTION("p4vYrlsVpDE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___umodsi3); - LIB_FUNCTION("ELSr5qm4K1M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___umodti3); - LIB_FUNCTION("EDvkw0WaiOw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___unorddf2); - LIB_FUNCTION("z0OhwgG3Bik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___unordsf2); - LIB_FUNCTION("-QgqOT5u2Vk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Assert); - LIB_FUNCTION("FHErahnajkw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atan); - LIB_FUNCTION("kBpWlgVZLm4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_strong); - LIB_FUNCTION("SwJ-E2FImAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_strong_1); - LIB_FUNCTION("qXkZo1LGnfk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_strong_2); - LIB_FUNCTION("s+LfDF7LKxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_strong_4); - LIB_FUNCTION("SZrEVfvcHuA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_strong_8); - LIB_FUNCTION("FOe7cAuBjh8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_weak); - LIB_FUNCTION("rBbtKToRRq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_weak_1); - LIB_FUNCTION("sDOFamOKWBI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_weak_2); - LIB_FUNCTION("0AgCOypbQ90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_weak_4); - LIB_FUNCTION("bNFLV9DJxdc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_compare_exchange_weak_8); - LIB_FUNCTION("frx6Ge5+Uco", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_copy); - LIB_FUNCTION("qvTpLUKwq7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_exchange); - LIB_FUNCTION("KHJflcH9s84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_exchange_1); - LIB_FUNCTION("TbuLWpWuJmc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_exchange_2); - LIB_FUNCTION("-EgDt569OVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_exchange_4); - LIB_FUNCTION("+xoGf-x7nJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_exchange_8); - LIB_FUNCTION("cO0ldEk3Uko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_add_1); - LIB_FUNCTION("9kSWQ8RGtVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_add_2); - LIB_FUNCTION("iPBqs+YUUFw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_add_4); - LIB_FUNCTION("QVsk3fWNbp0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_add_8); - LIB_FUNCTION("UVDWssRNEPM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_and_1); - LIB_FUNCTION("PnfhEsZ-5uk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_and_2); - LIB_FUNCTION("Pn2dnvUmbRA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_and_4); - LIB_FUNCTION("O6LEoHo2qSQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_and_8); - LIB_FUNCTION("K49mqeyzLSk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_or_1); - LIB_FUNCTION("SVIiJg5eppY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_or_2); - LIB_FUNCTION("R5X1i1zcapI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_or_4); - LIB_FUNCTION("++In3PHBZfw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_or_8); - LIB_FUNCTION("-Zfr0ZQheg4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_sub_1); - LIB_FUNCTION("ovtwh8IO3HE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_sub_2); - LIB_FUNCTION("2HnmKiLmV6s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_sub_4); - LIB_FUNCTION("T8lH8xXEwIw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_sub_8); - LIB_FUNCTION("Z9gbzf7fkMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_xor_1); - LIB_FUNCTION("rpl4rhpUhfg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_xor_2); - LIB_FUNCTION("-GVEj2QODEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_xor_4); - LIB_FUNCTION("XKenFBsoh1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_fetch_xor_8); - LIB_FUNCTION("4CVc6G8JrvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_flag_clear); - LIB_FUNCTION("Ou6QdDy1f7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_flag_test_and_set); - LIB_FUNCTION("RBPhCcRhyGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_is_lock_free_1); - LIB_FUNCTION("QhORYaNkS+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_is_lock_free_2); - LIB_FUNCTION("cRYyxdZo1YQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_is_lock_free_4); - LIB_FUNCTION("-3ZujD7JX9c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_is_lock_free_8); - LIB_FUNCTION("XAqAE803zMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_load_1); - LIB_FUNCTION("aYVETR3B8wk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_load_2); - LIB_FUNCTION("cjZEuzHkgng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_load_4); - LIB_FUNCTION("ea-rVHyM3es", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_load_8); - LIB_FUNCTION("HfKQ6ZD53sM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_signal_fence); - LIB_FUNCTION("VRX+Ul1oSgE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_store_1); - LIB_FUNCTION("6WR6sFxcd40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_store_2); - LIB_FUNCTION("HMRMLOwOFIQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_store_4); - LIB_FUNCTION("2uKxXHAKynI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_store_8); - LIB_FUNCTION("-7vr7t-uto8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atomic_thread_fence); - LIB_FUNCTION("M6nCy6H8Hs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atqexit); - LIB_FUNCTION("IHiK3lL7CvI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Atthreadexit); - LIB_FUNCTION("aMucxariNg8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Btowc); - LIB_FUNCTION("fttiF7rDdak", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Call_once); - LIB_FUNCTION("G1kDk+5L6dU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Call_onceEx); - LIB_FUNCTION("myTyhGbuDBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Clocale); - LIB_FUNCTION("mgNGxmJltOY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Closreg); - LIB_FUNCTION("VsP3daJgmVA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_broadcast); - LIB_FUNCTION("7yMFgcS8EPA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_destroy); - LIB_FUNCTION("vyLotuB6AS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_do_broadcast_at_thread_exit); - LIB_FUNCTION("SreZybSRWpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_init); - LIB_FUNCTION("2B+V3qCqz4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_init_with_name); - LIB_FUNCTION("DV2AdZFFEh8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_register_at_thread_exit); - LIB_FUNCTION("0uuqgRz9qfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_signal); - LIB_FUNCTION("McaImWKXong", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_timedwait); - LIB_FUNCTION("wpuIiVoCWcM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_unregister_at_thread_exit); - LIB_FUNCTION("vEaqE-7IZYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cnd_wait); - LIB_FUNCTION("KeOZ19X8-Ug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Cosh); - LIB_FUNCTION("gguxDbgbG74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Costate); - LIB_FUNCTION("YUKO57czb+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__CTinfo); - LIB_FUNCTION("eul2MC3gaYs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Ctype); - LIB_FUNCTION("chlN6g6UbGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__CurrentRuneLocale); - LIB_FUNCTION("6aEXAPYpaEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__CWcsxfrm); - LIB_FUNCTION("ZlsoRa7pcuI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Daysto); - LIB_FUNCTION("e+hi-tOrDZU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Dbl); - LIB_FUNCTION("+5OuLYpRB28", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dclass); - LIB_FUNCTION("lWGF8NHv880", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__DefaultRuneLocale); - LIB_FUNCTION("H0FQnSWp1es", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Deletegloballocale); - LIB_FUNCTION("COSADmn1ROg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Denorm); - LIB_FUNCTION("-vyIrREaQ0g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dint); - LIB_FUNCTION("VGhcd0QwhhY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Divide); - LIB_FUNCTION("NApYynEzlco", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dnorm); - LIB_FUNCTION("4QwxZ3U0OK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Do_call); - LIB_FUNCTION("FMU7jRhYCRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dscale); - LIB_FUNCTION("zvl6nrvd0sE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dsign); - LIB_FUNCTION("vCQLavj-3CM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dtento); - LIB_FUNCTION("b-xTWRgI1qw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dtest); - LIB_FUNCTION("4Wt5uzHO98o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Dunscale); - LIB_FUNCTION("E4SYYdwWV28", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Eps); - LIB_FUNCTION("HmdaOhdCr88", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Erf_one); - LIB_FUNCTION("DJXyKhVrAD8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Erf_small); - LIB_FUNCTION("aQURHgjHo-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Erfc); - LIB_FUNCTION("UhKI6z9WWuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__err); - LIB_FUNCTION("u4FNPlIIAtw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Errno); - LIB_FUNCTION("wZi5ly2guNw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Exit); - LIB_FUNCTION("yL91YD-WTBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Exp); - LIB_FUNCTION("chzmnjxxVtk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fac_tidy); - LIB_FUNCTION("D+fkILS7EK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fail_s); - LIB_FUNCTION("us3bDnDzd70", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FAtan); - LIB_FUNCTION("PdnFCFqKGqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FCosh); - LIB_FUNCTION("LSp+r7-JWwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDclass); - LIB_FUNCTION("JG1MkIFKnT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDenorm); - LIB_FUNCTION("HcpmBnY1RGE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDint); - LIB_FUNCTION("fuzzBVdpRG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDivide); - LIB_FUNCTION("0NwCmZv7XcU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDnorm); - LIB_FUNCTION("SSvY6pTRAgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDscale); - LIB_FUNCTION("6ei1eQn2WIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDsign); - LIB_FUNCTION("SoNnx4Ejxw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDtento); - LIB_FUNCTION("mnufPlYbnN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDtest); - LIB_FUNCTION("41SqJvOe8lA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FDunscale); - LIB_FUNCTION("OviE3yVSuTU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FEps); - LIB_FUNCTION("z1EfxK6E0ts", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Feraise); - LIB_FUNCTION("dST+OsSWbno", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FErf_one); - LIB_FUNCTION("qEvDssa4tOE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FErf_small); - LIB_FUNCTION("qwR1gtp-WS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FErfc); - LIB_FUNCTION("JbQw6W62UwI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_add_8); - LIB_FUNCTION("pxFnS1okTFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_and_8); - LIB_FUNCTION("zQQIrnpCoFA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_and_seq_cst_1); - LIB_FUNCTION("xROUuk7ItMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_and_seq_cst_2); - LIB_FUNCTION("jQuruQuMlyo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_and_seq_cst_4); - LIB_FUNCTION("ixWEOmOBavk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_or_8); - LIB_FUNCTION("2+6K-2tWaok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_or_seq_cst_1); - LIB_FUNCTION("-egu08GJ0lw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_or_seq_cst_2); - LIB_FUNCTION("gI9un1H-fZk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_or_seq_cst_4); - LIB_FUNCTION("YhaOeniKcoA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_xor_8); - LIB_FUNCTION("E2YhT7m79kM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_xor_seq_cst_1); - LIB_FUNCTION("fgXJvOSrqfg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_xor_seq_cst_2); - LIB_FUNCTION("cqcY17uV3dI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fetch_xor_seq_cst_4); - LIB_FUNCTION("-3pU5y1utmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FExp); - LIB_FUNCTION("EBkab3s8Jto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FFpcomp); - LIB_FUNCTION("cNGg-Y7JQQw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FGamma_big); - LIB_FUNCTION("dYJJbxnyb74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fgpos); - LIB_FUNCTION("DS03EjPDtFo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FHypot); - LIB_FUNCTION("qG50MWOiS-Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Files); - LIB_FUNCTION("QWCTbYI14dA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FInf); - LIB_FUNCTION("jjjRS7l1MPM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FLog); - LIB_FUNCTION("OAE3YU396YQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FLogpoly); - LIB_FUNCTION("+SeQg8c1WC0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Flt); - LIB_FUNCTION("Jo9ON-AX9eU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fltrounds); - LIB_FUNCTION("VVgqI3B2bfk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FNan); - LIB_FUNCTION("xGT4Mc55ViQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fofind); - LIB_FUNCTION("jVDuvE3s5Bs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fofree); - LIB_FUNCTION("sQL8D-jio7U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fopen); - LIB_FUNCTION("dREVnZkAKRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Foprep); - LIB_FUNCTION("vhPKxN6zs+A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fpcomp); - LIB_FUNCTION("cfpRP3h9F6o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FPlsw); - LIB_FUNCTION("IdWhZ0SM7JA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FPmsw); - LIB_FUNCTION("5AN3vhTZ7f8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FPoly); - LIB_FUNCTION("A98W3Iad6xE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FPow); - LIB_FUNCTION("y9Ur6T0A0p8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FQuad); - LIB_FUNCTION("PDQbEFcV4h0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FQuadph); - LIB_FUNCTION("lP9zfrhtpBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FRecip); - LIB_FUNCTION("TLvAYmLtdVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FRint); - LIB_FUNCTION("9s3P+LCvWP8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Frprep); - LIB_FUNCTION("XwRd4IpNEss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FRteps); - LIB_FUNCTION("fQ+SWrQUQBg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FSincos); - LIB_FUNCTION("O4L+0oCN9zA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FSinh); - LIB_FUNCTION("UCjpTas5O3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FSnan); - LIB_FUNCTION("A+Y3xfrWLLo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fspos); - LIB_FUNCTION("iBrTJkDlQv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FTan); - LIB_FUNCTION("odPHnVL-rFg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FTgamma); - LIB_FUNCTION("4F9pQjbh8R8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Fwprep); - LIB_FUNCTION("3uW2ESAzsKo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXbig); - LIB_FUNCTION("1EyHxzcz6AM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_addh); - LIB_FUNCTION("1b+IhPTX0nk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_addx); - LIB_FUNCTION("e1y7KVAySrY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_getw); - LIB_FUNCTION("OVqW4uElSrc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_invx); - LIB_FUNCTION("7GgGIxmwA6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_ldexpx); - LIB_FUNCTION("DVZmEd0ipSg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_movx); - LIB_FUNCTION("W+lrIwAQVUk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_mulh); - LIB_FUNCTION("o1B4dkvesMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_mulx); - LIB_FUNCTION("ikHTMeh60B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_setn); - LIB_FUNCTION("5zWUVRtR8xg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_setw); - LIB_FUNCTION("pNWIpeE5Wv4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_sqrtx); - LIB_FUNCTION("HD9vSXqj6zI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FXp_subx); - LIB_FUNCTION("LrXu7E+GLDY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FZero); - LIB_FUNCTION("7FjitE7KKm4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Gamma_big); - LIB_FUNCTION("vakoyx9nkqo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Genld); - LIB_FUNCTION("bRN9BzEkm4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Gentime); - LIB_FUNCTION("2MfMa3456FI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getcloc); - LIB_FUNCTION("i1N28hWcD-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getctyptab); - LIB_FUNCTION("Jcu0Wl1-XbE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getdst); - LIB_FUNCTION("M1xC101lsIU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Geterrno); - LIB_FUNCTION("bItEABINEm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getfld); - LIB_FUNCTION("7iFNNuNyXxw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getfloat); - LIB_FUNCTION("8Jr4cvRM6EM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getgloballocale); - LIB_FUNCTION("PWmDp8ZTS9k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getint); - LIB_FUNCTION("U52BlHBvYvE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getmbcurmax); - LIB_FUNCTION("bF4eWOM5ouo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getpcostate); - LIB_FUNCTION("sUP1hBaouOw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getpctype); - LIB_FUNCTION("QxqK-IdpumU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getpmbstate); - LIB_FUNCTION("iI6kGxgXzcU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__getprogname); - LIB_FUNCTION("8xXiEPby8h8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getptimes); - LIB_FUNCTION("1uJgoVq3bQU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getptolower); - LIB_FUNCTION("rcQCUr0EaRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getptoupper); - LIB_FUNCTION("hzsdjKbFD7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getpwcostate); - LIB_FUNCTION("zS94yyJRSUs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getpwcstate); - LIB_FUNCTION("RLdcWoBjmT4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getpwctrtab); - LIB_FUNCTION("uF8hDs1CqWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getpwctytab); - LIB_FUNCTION("g8ozp2Zrsj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Gettime); - LIB_FUNCTION("Wz9CvcF5jn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getzone); - LIB_FUNCTION("ac102y6Rjjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Hugeval); - LIB_FUNCTION("wUa+oPQvFZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Hypot); - LIB_FUNCTION("HIhqigNaOns", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Inf); - LIB_FUNCTION("bzQExy189ZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__init_env); - LIB_FUNCTION("6NCOqr3cD74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__init_tls); - LIB_FUNCTION("Sb26PiOiFtE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Isdst); - LIB_FUNCTION("CyXs2l-1kNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Iswctype); - LIB_FUNCTION("2Aw366Jn07s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LAtan); - LIB_FUNCTION("moDSeLQGJFQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LCosh); - LIB_FUNCTION("43u-nm1hQc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Ldbl); - LIB_FUNCTION("hdcGjNpcr4w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDclass); - LIB_FUNCTION("O7zxyNnSDDA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDenorm); - LIB_FUNCTION("alNWe8glQH4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDint); - LIB_FUNCTION("HPGLb8Qo6as", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDivide); - LIB_FUNCTION("ldbrWsQk+2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDnorm); - LIB_FUNCTION("s-Ml8NxBKf4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDscale); - LIB_FUNCTION("islhay8zGWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDsign); - LIB_FUNCTION("PEU-SAfo5+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDtento); - LIB_FUNCTION("A+1YXWOGpuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDtest); - LIB_FUNCTION("3BbBNPjfkYI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Ldtob); - LIB_FUNCTION("ArZF2KISb5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LDunscale); - LIB_FUNCTION("DzkYNChIvmw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LEps); - LIB_FUNCTION("urrv9v-Ge6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LErf_one); - LIB_FUNCTION("MHyK+d+72V0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LErf_small); - LIB_FUNCTION("PG4HVe4X+Oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LErfc); - LIB_FUNCTION("se3uU7lRMHY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LExp); - LIB_FUNCTION("-BwLPxElT7U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LFpcomp); - LIB_FUNCTION("-svZFUiG3T4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LGamma_big); - LIB_FUNCTION("IRUFZywbTT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LHypot); - LIB_FUNCTION("2h3jY75zMkI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LInf); - LIB_FUNCTION("+GxvfSLhoAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Litob); - LIB_FUNCTION("4iFgTDd9NFs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LLog); - LIB_FUNCTION("niPixjs0l2w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LLogpoly); - LIB_FUNCTION("zqASRvZg6d0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LNan); - LIB_FUNCTION("JHvEnCQLPQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Locale); - LIB_FUNCTION("fRWufXAccuI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Lock_shared_ptr_spin_lock); - LIB_FUNCTION("Cv-8x++GS9A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Lock_spin_lock); - LIB_FUNCTION("vZkmJmvqueY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Lockfilelock); - LIB_FUNCTION("kALvdgEv5ME", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Locksyslock); - LIB_FUNCTION("sYz-SxY8H6M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Locsum); - LIB_FUNCTION("rvNWRuHY6AQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Loctab); - LIB_FUNCTION("4ifo9QGrO5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Locterm); - LIB_FUNCTION("ElU3kEY8q+I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Locvar); - LIB_FUNCTION("zXCi78bYrEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Log); - LIB_FUNCTION("bqcStLRGIXw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Logpoly); - LIB_FUNCTION("W-T-amhWrkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LPlsw); - LIB_FUNCTION("gso5X06CFkI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LPmsw); - LIB_FUNCTION("c6Qa0P3XKYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LPoly); - LIB_FUNCTION("3Z8jD-HTKr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LPow); - LIB_FUNCTION("fXCPTDS0tD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LQuad); - LIB_FUNCTION("CbRhl+RoYEM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LQuadph); - LIB_FUNCTION("XrXTtRA7U08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LRecip); - LIB_FUNCTION("fJmOr59K8QY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LRint); - LIB_FUNCTION("gobJundphD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LRteps); - LIB_FUNCTION("m-Bu5Tzr82A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LSin); - LIB_FUNCTION("g3dK2qlzwnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LSincos); - LIB_FUNCTION("ZWy6IcBqs1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LSinh); - LIB_FUNCTION("rQ-70s51wrc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LSnan); - LIB_FUNCTION("mM4OblD9xWM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LTan); - LIB_FUNCTION("jq4Srfnz9K8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LTgamma); - LIB_FUNCTION("WSaroeRDE5Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXbig); - LIB_FUNCTION("QEr-PxGUoic", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_addh); - LIB_FUNCTION("BuP7bDPGEcQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_addx); - LIB_FUNCTION("TnublTBYXTI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_getw); - LIB_FUNCTION("FAreWopdBvE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_invx); - LIB_FUNCTION("7O-vjsHecbY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_ldexpx); - LIB_FUNCTION("wlEdSSqaz+E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_movx); - LIB_FUNCTION("riets0BFHMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_mulh); - LIB_FUNCTION("LbLiLA2biaI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_mulx); - LIB_FUNCTION("hjDoZ6qbkmQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_setn); - LIB_FUNCTION("kHVXc-AWbMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_setw); - LIB_FUNCTION("IPjwywTNR8w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_sqrtx); - LIB_FUNCTION("YCVxOE0lHOI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LXp_subx); - LIB_FUNCTION("A-cEjaZBDwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__LZero); - LIB_FUNCTION("tTDqwhYbUUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Makeloc); - LIB_FUNCTION("AnTtuRUE1cE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Makestab); - LIB_FUNCTION("QalEczzSNqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Makewct); - LIB_FUNCTION("pCWh67X1PHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mbcurmax); - LIB_FUNCTION("wKsLxRq5+fg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mbstate); - LIB_FUNCTION("sij3OtJpHFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mbtowc); - LIB_FUNCTION("-9SIhUr4Iuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mbtowcx); - LIB_FUNCTION("VYQwFs4CC4Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_current_owns); - LIB_FUNCTION("5Lf51jvohTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_destroy); - LIB_FUNCTION("YaHc3GS7y7g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_init); - LIB_FUNCTION("tgioGpKtmbE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_init_with_name); - LIB_FUNCTION("iS4aWbUonl0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_lock); - LIB_FUNCTION("hPzYSd5Nasc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_timedlock); - LIB_FUNCTION("k6pGNMwJB08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_trylock); - LIB_FUNCTION("gTuXQwP9rrs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtx_unlock); - LIB_FUNCTION("LaPaA6mYA38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtxdst); - LIB_FUNCTION("z7STeF6abuU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtxinit); - LIB_FUNCTION("pE4Ot3CffW0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtxlock); - LIB_FUNCTION("cMwgSSmpE5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Mtxunlock); - LIB_FUNCTION("8e2KBTO08Po", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Nan); - LIB_FUNCTION("KNNNbyRieqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__new_setup); - LIB_FUNCTION("Ss3108pBuZY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Nnl); - LIB_FUNCTION("TMhLRjcQMw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__PathLocale); - LIB_FUNCTION("OnHQSrOHTks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__PJP_C_Copyright); - LIB_FUNCTION("Cqpti4y-D3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__PJP_CPP_Copyright); - LIB_FUNCTION("1hGmBh83dL8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Plsw); - LIB_FUNCTION("hrv1BgM68kU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Pmsw); - LIB_FUNCTION("aINUE2xbhZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Poly); - LIB_FUNCTION("ECh+p-LRG6Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Pow); - LIB_FUNCTION("rnxaQ+2hSMI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Putfld); - LIB_FUNCTION("Fot-m6M2oKE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Putstr); - LIB_FUNCTION("ijAqq39g4dI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Puttxt); - LIB_FUNCTION("TQPr-IeNIS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Quad); - LIB_FUNCTION("VecRKuKdXdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Quadph); - LIB_FUNCTION("5qtcuXWt5Xc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Randseed); - LIB_FUNCTION("-u3XfqNumMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__readdir_unlocked); - LIB_FUNCTION("MxZ4Lc35Rig", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Readloc); - LIB_FUNCTION("YLEc5sPn1Rg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Recip); - LIB_FUNCTION("7ZFy2m9rc5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__reclaim_telldir); - LIB_FUNCTION("77uWF3Z2q90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Restore_state); - LIB_FUNCTION("TzxDRcns9e4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Rint); - LIB_FUNCTION("W8tdMlttt3o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Rteps); - LIB_FUNCTION("5FoE+V3Aj0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__rtld_addr_phdr); - LIB_FUNCTION("R2QKo3hBLkw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__rtld_atfork_post); - LIB_FUNCTION("i-7v8+UGglc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__rtld_atfork_pre); - LIB_FUNCTION("dmHEVUqDYGw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__rtld_error); - LIB_FUNCTION("AdYYKgtPlqg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__rtld_get_stack_prot); - LIB_FUNCTION("gRw4XrztJ4Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__rtld_thread_init); - LIB_FUNCTION("0ITXuJOqrSk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Save_state); - LIB_FUNCTION("vhETq-NiqJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__SceLibcDebugOut); - LIB_FUNCTION("-hOAbTf3Cqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__SceLibcTelemetoryOut); - LIB_FUNCTION("Do3zPpsXj1o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__seekdir); - LIB_FUNCTION("bEk+WGOU90I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Setgloballocale); - LIB_FUNCTION("KDFy-aPxHVE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Shared_ptr_flag); - LIB_FUNCTION("j9SGTLclro8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Sincos); - LIB_FUNCTION("MU25eqxSDTw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Sinh); - LIB_FUNCTION("Jp6dZm7545A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Skip); - LIB_FUNCTION("fmHLr9P3dOk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Snan); - LIB_FUNCTION("H8AprKeZtNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stderr); - LIB_FUNCTION("1TDo-ImqkJc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stdin); - LIB_FUNCTION("2sWzhYqFH4E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stdout); - LIB_FUNCTION("szUft0jERdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Tan); - LIB_FUNCTION("z-OrNOmb6kk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tgamma); - LIB_FUNCTION("JOV1XY47eQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_abort); - LIB_FUNCTION("SkRR6WxCTcE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_create); - LIB_FUNCTION("n2-b3O8qvqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_current); - LIB_FUNCTION("L7f7zYwBvZA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_detach); - LIB_FUNCTION("BnV7WrHdPLU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_equal); - LIB_FUNCTION("cFsD9R4iY50", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_exit); - LIB_FUNCTION("np6xXcXEnXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_id); - LIB_FUNCTION("YvmY5Jf0VYU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_join); - LIB_FUNCTION("OCbJ96N1utA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_lt); - LIB_FUNCTION("jfRI3snge3o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_sleep); - LIB_FUNCTION("0JidN6q9yGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_start); - LIB_FUNCTION("gsqXCd6skKs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_start_with_attr); - LIB_FUNCTION("ihfGsjLjmOM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_start_with_name); - LIB_FUNCTION("ShanbBWU3AA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_start_with_name_attr); - LIB_FUNCTION("exNzzCAQuWM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Thrd_yield); - LIB_FUNCTION("kQelMBYgkK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__thread_autoinit_dummy_decl); - LIB_FUNCTION("dmUgzUX3nXU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__thread_autoinit_dummy_decl_stub); - LIB_FUNCTION("PJW+-O4pj6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__thread_init); - LIB_FUNCTION("1kIpmZX1jw8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__thread_init_stub); - LIB_FUNCTION("+9ypoH8eJko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Times); - LIB_FUNCTION("hbY3mFi8XY0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Costate); - LIB_FUNCTION("JoeZJ15k5vU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Ctype); - LIB_FUNCTION("uhYTnarXhZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Errno); - LIB_FUNCTION("jr5yQE9WYdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Locale); - LIB_FUNCTION("7TIcrP513IM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Mbcurmax); - LIB_FUNCTION("YYG-8VURgXA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Mbstate); - LIB_FUNCTION("0Hu7rUmhqJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Times); - LIB_FUNCTION("hM7qvmxBTx8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Tolotab); - LIB_FUNCTION("UlJSnyS473g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Touptab); - LIB_FUNCTION("YUdPel2w8as", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__WCostate); - LIB_FUNCTION("2d5UH9BnfVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Wcstate); - LIB_FUNCTION("RYwqCx0hU5c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Wctrans); - LIB_FUNCTION("KdAc8glk2+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tls_setup__Wctype); - LIB_FUNCTION("J-oDqE1N8R4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tolotab); - LIB_FUNCTION("KmfpnwO2lkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Touptab); - LIB_FUNCTION("DbEnA+MnVIw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Towctrans); - LIB_FUNCTION("amHyU7v8f-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tss_create); - LIB_FUNCTION("g5cG7QtKLTA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tss_delete); - LIB_FUNCTION("lOVQnEJEzvY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tss_get); - LIB_FUNCTION("ibyFt0bPyTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tss_set); - LIB_FUNCTION("4TTbo2SxxvA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Ttotm); - LIB_FUNCTION("Csx50UU9b18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Tzoff); - LIB_FUNCTION("1HYEoANqZ1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unlock_shared_ptr_spin_lock); - LIB_FUNCTION("aHUFijEWlxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unlock_spin_lock); - LIB_FUNCTION("0x7rx8TKy2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unlockfilelock); - LIB_FUNCTION("9nf8joUTSaQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unlocksyslock); - LIB_FUNCTION("s62MgBhosjU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unwind_Backtrace); - LIB_FUNCTION("sETNbyWsEHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unwind_GetIP); - LIB_FUNCTION("f1zwJ3jAI2k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unwind_Resume); - LIB_FUNCTION("xUsJSLsdv9I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Unwind_Resume_or_Rethrow); - LIB_FUNCTION("xRycekLYXdc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Vacopy); - LIB_FUNCTION("XQFE8Y58WZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__warn); - LIB_FUNCTION("Nd2Y2X6oR18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WCostate); - LIB_FUNCTION("wmkXFgerLnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wcscollx); - LIB_FUNCTION("RGc3P3UScjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wcsftime); - LIB_FUNCTION("IvP-B8lC89k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wcstate); - LIB_FUNCTION("cmIyU0BNYeo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wcsxfrmx); - LIB_FUNCTION("oK6C1fys3dU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wctob); - LIB_FUNCTION("bSgY14j4Ov4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wctomb); - LIB_FUNCTION("stv1S3BKfgw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wctombx); - LIB_FUNCTION("DYamMikEv2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wctrans); - LIB_FUNCTION("PlDgAP2AS7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Wctype); - LIB_FUNCTION("VbczgfwgScA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WFrprep); - LIB_FUNCTION("hDuyUWUBrDU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WFwprep); - LIB_FUNCTION("BYcXjG3Lw-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WGenld); - LIB_FUNCTION("Z6CCOW8TZVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WGetfld); - LIB_FUNCTION("LcHsLn97kcE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WGetfloat); - LIB_FUNCTION("dWz3HtMMpPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WGetint); - LIB_FUNCTION("nVS8UHz1bx0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WGetstr); - LIB_FUNCTION("kUcinoWwBr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WLdtob); - LIB_FUNCTION("XkT6YSShQcE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WLitob); - LIB_FUNCTION("0ISumvb2U5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WPutfld); - LIB_FUNCTION("Fh1GjwqvCpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WPutstr); - LIB_FUNCTION("Kkgg8mWU2WE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WPuttxt); - LIB_FUNCTION("4nRn+exUJAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStod); - LIB_FUNCTION("RlewTNtWEcg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStodx); - LIB_FUNCTION("GUuiOcxL-r0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStof); - LIB_FUNCTION("FHJlhz0wVts", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStoflt); - LIB_FUNCTION("JZ9gGlJ22hg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStofx); - LIB_FUNCTION("w3gRFGRjpZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStold); - LIB_FUNCTION("waexoHL0Bf4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStoldx); - LIB_FUNCTION("OmDPJeJXkBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStoll); - LIB_FUNCTION("43PYQ2fMT8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStopfx); - LIB_FUNCTION("JhVR7D4Ax6Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStoul); - LIB_FUNCTION("9iCP-hTL5z8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStoull); - LIB_FUNCTION("DmUIy7m0cyE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WStoxflt); - LIB_FUNCTION("QSfaClY45dM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xbig); - LIB_FUNCTION("ijc7yCXzXsc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_addh); - LIB_FUNCTION("ycMCyFmWJnU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_addx); - LIB_FUNCTION("Zb70g9IUs98", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_getw); - LIB_FUNCTION("f41T4clGlzY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_invx); - LIB_FUNCTION("c9S0tXDhMBQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_ldexpx); - LIB_FUNCTION("Zm2LLWgxWu8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_movx); - LIB_FUNCTION("aOtpC3onyJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_mulh); - LIB_FUNCTION("jatbHyxH3ek", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_mulx); - LIB_FUNCTION("lahbB4B2ugY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_setn); - LIB_FUNCTION("bIfFaqUwy3I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_setw); - LIB_FUNCTION("m0uSPrCsVdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_sqrtx); - LIB_FUNCTION("w178uGYbIJs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xp_subx); - LIB_FUNCTION("Df1BO64nU-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xtime_diff_to_ts); - LIB_FUNCTION("Cj+Fw5q1tUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xtime_get_ticks); - LIB_FUNCTION("Zs8Xq-ce3rY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Xtime_to_ts); - LIB_FUNCTION("FOt55ZNaVJk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdaPvm); - LIB_FUNCTION("7lCihI18N9I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdaPvmRKSt9nothrow_t); - LIB_FUNCTION("Y1RR+IQy6Pg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdaPvmSt11align_val_t); - LIB_FUNCTION("m-fSo3EbxNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdaPvRKSt9nothrow_t); - LIB_FUNCTION("Suc8W0QPxjw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdaPvS_); - LIB_FUNCTION("v09ZcAhZzSc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdaPvSt11align_val_t); - LIB_FUNCTION("dH3ucvQhfSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdaPvSt11align_val_tRKSt9nothrow_t); - LIB_FUNCTION("z+P+xCnWLBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPv); - LIB_FUNCTION("lYDzBVE5mZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPvm); - LIB_FUNCTION("7VPIYFpwU2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPvmRKSt9nothrow_t); - LIB_FUNCTION("nwujzxOPXzQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPvmSt11align_val_t); - LIB_FUNCTION("McsGnqV6yRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPvRKSt9nothrow_t); - LIB_FUNCTION("1vo6qqqa9F4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPvS_); - LIB_FUNCTION("bZx+FFSlkUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPvSt11align_val_t); - LIB_FUNCTION("Dt9kllUFXS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZdlPvSt11align_val_tRKSt9nothrow_t); - LIB_FUNCTION("bPtdppw1+7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Zero); - LIB_FUNCTION("Bc4ozvHb4Kg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt10moneypunctIcLb0EE2idE); - LIB_FUNCTION("yzcKSTTCz1M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt10moneypunctIcLb1EE2idE); - LIB_FUNCTION("tfmEv+TVGFU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt10moneypunctIwLb0EE2idE); - LIB_FUNCTION("ksNM8H72JHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt10moneypunctIwLb1EE2idE); - LIB_FUNCTION("2G1UznxkcgU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt14_Error_objectsIiE14_System_objectE); - LIB_FUNCTION("DjLpZIMEkks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt14_Error_objectsIiE15_Generic_objectE); - LIB_FUNCTION("DSnq6xesUo8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt20_Future_error_objectIiE14_Future_objectE); - LIB_FUNCTION("agAYSUes238", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt7codecvtIcc9_MbstatetE2idE); - LIB_FUNCTION("gC0DGo+7PVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt7collateIcE2idE); - LIB_FUNCTION("jaLGUrwYX84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt7collateIwE2idE); - LIB_FUNCTION("4ZnE1sEyX3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt8messagesIcE2idE); - LIB_FUNCTION("oqYAk3zpC64", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt8messagesIwE2idE); - LIB_FUNCTION("iHZb2839dBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt8numpunctIcE2idE); - LIB_FUNCTION("8ArIPXBlkgM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt8numpunctIwE2idE); - LIB_FUNCTION( - "0ND8MZiuTR8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); - LIB_FUNCTION( - "O2wxIdbMcMQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); - LIB_FUNCTION("CjzjU2nFUWw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv116__enum_type_infoD0Ev); - LIB_FUNCTION("upwSZWmYwqE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv116__enum_type_infoD1Ev); - LIB_FUNCTION("iQiT26+ZGnA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv116__enum_type_infoD2Ev); - LIB_FUNCTION("R5nRbLQT3oI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__array_type_infoD0Ev); - LIB_FUNCTION("1ZMchlkvNNQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__array_type_infoD1Ev); - LIB_FUNCTION("ckFrsyD2830", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__array_type_infoD2Ev); - LIB_FUNCTION("XAk7W3NcpTY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__class_type_infoD0Ev); - LIB_FUNCTION("goLVqD-eiIY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__class_type_infoD1Ev); - LIB_FUNCTION("xXM1q-ayw2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__class_type_infoD2Ev); - LIB_FUNCTION("GLxD5v2uMHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__pbase_type_infoD0Ev); - LIB_FUNCTION("vIJPARS8imE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__pbase_type_infoD1Ev); - LIB_FUNCTION("krshE4JAE6M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv117__pbase_type_infoD2Ev); - LIB_FUNCTION("64180GwMVro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv119__pointer_type_infoD0Ev); - LIB_FUNCTION("bhfgrK+MZdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv119__pointer_type_infoD1Ev); - LIB_FUNCTION("vCLVhOcdQMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv119__pointer_type_infoD2Ev); - LIB_FUNCTION("kVvGL9aF5gg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv120__function_type_infoD0Ev); - LIB_FUNCTION("dsQ5Xwhl9no", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv120__function_type_infoD1Ev); - LIB_FUNCTION("NtqD4Q0vUUI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv120__function_type_infoD2Ev); - LIB_FUNCTION("Fg4w+h9wAMA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv120__si_class_type_infoD0Ev); - LIB_FUNCTION("6aEkwkEOGRg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv120__si_class_type_infoD1Ev); - LIB_FUNCTION("bWHwovVFfqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv120__si_class_type_infoD2Ev); - LIB_FUNCTION("W5k0jlyBpgM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv121__vmi_class_type_infoD0Ev); - LIB_FUNCTION("h-a7+0UuK7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv121__vmi_class_type_infoD1Ev); - LIB_FUNCTION("yYIymfQGl2E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv121__vmi_class_type_infoD2Ev); - LIB_FUNCTION("YsZuwZrJZlU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv123__fundamental_type_infoD0Ev); - LIB_FUNCTION("kzWL2iOsv0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv123__fundamental_type_infoD1Ev); - LIB_FUNCTION("0jk9oqKd2Gw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv123__fundamental_type_infoD2Ev); - LIB_FUNCTION("NdeDffcZ-30", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev); - LIB_FUNCTION("KaZ3xf5c9Vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev); - LIB_FUNCTION("Re3Lpk8mwEo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev); - LIB_FUNCTION("yc-vi84-2aE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN6Dinkum7codecvt10_Cvt_checkEmm); - LIB_FUNCTION("PG-2ZeVVWZE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN6Dinkum7threads10lock_errorD0Ev); - LIB_FUNCTION("vX+NfOHOI5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN6Dinkum7threads10lock_errorD1Ev); - LIB_FUNCTION("o27+xO5NBZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN6Dinkum7threads17_Throw_lock_errorEv); - LIB_FUNCTION("cjmJLdYnT5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN6Dinkum7threads21_Throw_resource_errorEv); - LIB_FUNCTION("Q+ZnPMGI4M0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN6Dinkum7threads21thread_resource_errorD0Ev); - LIB_FUNCTION("NOaB7a1PZl8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZN6Dinkum7threads21thread_resource_errorD1Ev); - LIB_FUNCTION("hdm0YfMa7TQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Znam); - LIB_FUNCTION("Jh5qUcwiSEk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZnamRKSt9nothrow_t); - LIB_FUNCTION("kn-rKRB0pfY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZnamSt11align_val_t); - LIB_FUNCTION("s2eGsgUF9vk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZnamSt11align_val_tRKSt9nothrow_t); - LIB_FUNCTION("ZRRBeuLmHjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XlenEv); - LIB_FUNCTION("GvYZax3i-Qk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSbIwSt11char_traitsIwESaIwEE5_XranEv); - LIB_FUNCTION("pDtTdJ2sIz0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSs5_XlenEv); - LIB_FUNCTION("AzBnOt1DouU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSs5_XranEv); - LIB_FUNCTION("BbXxNgTW1x4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt10bad_typeid4whatEv); - LIB_FUNCTION("WMw8eIs0kjM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt10bad_typeid8_DoraiseEv); - LIB_FUNCTION("++ge3jYlHW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt11logic_error4whatEv); - LIB_FUNCTION("YTM5eyFGh2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt11logic_error8_DoraiseEv); - LIB_FUNCTION("OzMS0BqVUGQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt12bad_weak_ptr4whatEv); - LIB_FUNCTION("MwAySqTo+-M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt12codecvt_base11do_encodingEv); - LIB_FUNCTION("FOsY+JAyXow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt12codecvt_base13do_max_lengthEv); - LIB_FUNCTION("5sfbtNAdt-M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt12future_error4whatEv); - LIB_FUNCTION("-syPONaWjqw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt12future_error8_DoraiseEv); - LIB_FUNCTION("uWZBRxLAvEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt12system_error8_DoraiseEv); - LIB_FUNCTION("kTlQY47fo88", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt13bad_exception8_DoraiseEv); - LIB_FUNCTION("2iW5Fv+kFxs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt13runtime_error4whatEv); - LIB_FUNCTION("GthClwqQAZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt14error_category10equivalentEiRKSt15error_condition); - LIB_FUNCTION("9hB8AwIqQfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt14error_category10equivalentERKSt10error_codei); - LIB_FUNCTION("8SDojuZyQaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt14error_category23default_error_conditionEi); - LIB_FUNCTION("XVu4--EWzcM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt17bad_function_call4whatEv); - LIB_FUNCTION("+5IOQncui3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt18bad_variant_access4whatEv); - LIB_FUNCTION("Q0VsWTapQ4M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt22_Future_error_category4nameEv); - LIB_FUNCTION("nWfZplDjbxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt22_Future_error_category7messageEi); - LIB_FUNCTION("ww3UUl317Ng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt22_System_error_category23default_error_conditionEi); - LIB_FUNCTION("dXy+lFOiaQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt22_System_error_category4nameEv); - LIB_FUNCTION("HpAlvhNKb2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt22_System_error_category7messageEi); - LIB_FUNCTION("xvVR0CBPFAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt23_Generic_error_category4nameEv); - LIB_FUNCTION("KZ++filsCL4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt23_Generic_error_category7messageEi); - LIB_FUNCTION("WXOoCK+kqwY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE10do_tolowerEc); - LIB_FUNCTION("2w+4Mo2DPro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE10do_tolowerEPcPKc); - LIB_FUNCTION("mnq3tbhCs34", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE10do_toupperEc); - LIB_FUNCTION("7glioH0t9HM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE10do_toupperEPcPKc); - LIB_FUNCTION("zwcNQT0Avck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE8do_widenEc); - LIB_FUNCTION("W5OtP+WC800", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE8do_widenEPKcS2_Pc); - LIB_FUNCTION("4SnCJmLL27U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE9do_narrowEcc); - LIB_FUNCTION("-nCVE3kBjjA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc); - LIB_FUNCTION("pSQz254t3ug", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE10do_scan_isEsPKwS2_); - LIB_FUNCTION("Ej0X1EwApwM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE10do_tolowerEPwPKw); - LIB_FUNCTION("ATYj6zra5W0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE10do_tolowerEw); - LIB_FUNCTION("r1W-NtOi6E8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE10do_toupperEPwPKw); - LIB_FUNCTION("JsZjB3TnZ8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE10do_toupperEw); - LIB_FUNCTION("Kbe+LHOer9o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE11do_scan_notEsPKwS2_); - LIB_FUNCTION("D0lUMKU+ELI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE5do_isEPKwS2_Ps); - LIB_FUNCTION("rh7L-TliPoc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE5do_isEsw); - LIB_FUNCTION("h3PbnNnZ-gI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE8do_widenEc); - LIB_FUNCTION("KM0b6O8show", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE8do_widenEPKcS2_Pw); - LIB_FUNCTION("Vf68JAD5rbM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc); - LIB_FUNCTION("V+c0E+Uqcww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt5ctypeIwE9do_narrowEwc); - LIB_FUNCTION("aUNISsPboqE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE11do_groupingEv); - LIB_FUNCTION("uUDq10y4Raw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE13do_neg_formatEv); - LIB_FUNCTION("E64hr8yXoXw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE13do_pos_formatEv); - LIB_FUNCTION("VhyjwJugIe8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE14do_curr_symbolEv); - LIB_FUNCTION("C3LC9A6SrVE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE14do_frac_digitsEv); - LIB_FUNCTION("tZj4yquwuhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE16do_decimal_pointEv); - LIB_FUNCTION("Rqu9OmkKY+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE16do_negative_signEv); - LIB_FUNCTION("ARZszYKvDWg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE16do_positive_signEv); - LIB_FUNCTION("6aFwTNpqTP8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIcE16do_thousands_sepEv); - LIB_FUNCTION("ckD5sIxo+Co", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE11do_groupingEv); - LIB_FUNCTION("UzmR8lOfyqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE13do_neg_formatEv); - LIB_FUNCTION("zF2GfKzBgqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE13do_pos_formatEv); - LIB_FUNCTION("ypq5jFNRIJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE14do_curr_symbolEv); - LIB_FUNCTION("ij-yZhH9YjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE14do_frac_digitsEv); - LIB_FUNCTION("v8P1X84ytFY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE16do_decimal_pointEv); - LIB_FUNCTION("zkUC74aJxpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE16do_negative_signEv); - LIB_FUNCTION("PWFePkVdv9w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE16do_positive_signEv); - LIB_FUNCTION("XX+xiPXAN8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7_MpunctIwE16do_thousands_sepEv); - LIB_FUNCTION("iCWgjeqMHvg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE10do_unshiftERS0_PcS3_RS3_); - LIB_FUNCTION("7tIwDZyyKHo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE16do_always_noconvEv); - LIB_FUNCTION("TNexGlwiVEQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE2inERS0_PKcS4_RS4_PcS6_RS6_); - LIB_FUNCTION("14xKj+SV72o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE3outERS0_PKcS4_RS4_PcS6_RS6_); - LIB_FUNCTION("P+q1OLiErP0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE5do_inERS0_PKcS4_RS4_PcS6_RS6_); - LIB_FUNCTION("Uc+-Sx0UZ3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE6do_outERS0_PKcS4_RS4_PcS6_RS6_); - LIB_FUNCTION("ikBt0lqkxPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE6lengthERS0_PKcS4_m); - LIB_FUNCTION("N7z+Dnk1cS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE7unshiftERS0_PcS3_RS3_); - LIB_FUNCTION("Xk7IZcfHDD8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIcc9_MbstatetE9do_lengthERS0_PKcS4_m); - LIB_FUNCTION("c6Lyc6xOp4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDic9_MbstatetE10do_unshiftERS0_PcS3_RS3_); - LIB_FUNCTION("DDnr3lDwW8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDic9_MbstatetE11do_encodingEv); - LIB_FUNCTION("E5NdzqEmWuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDic9_MbstatetE13do_max_lengthEv); - LIB_FUNCTION("NQ81EZ7CL6w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDic9_MbstatetE16do_always_noconvEv); - LIB_FUNCTION("PJ2UDX9Tvwg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDic9_MbstatetE5do_inERS0_PKcS4_RS4_PDiS6_RS6_); - LIB_FUNCTION("eoW60zcLT8Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDic9_MbstatetE6do_outERS0_PKDiS4_RS4_PcS6_RS6_); - LIB_FUNCTION("m6rjfL4aMcA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDic9_MbstatetE9do_lengthERS0_PKcS4_m); - LIB_FUNCTION("RYTHR81Y-Mc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDsc9_MbstatetE10do_unshiftERS0_PcS3_RS3_); - LIB_FUNCTION("Mo6K-pUyNhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDsc9_MbstatetE11do_encodingEv); - LIB_FUNCTION("BvRS0cGTd6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDsc9_MbstatetE13do_max_lengthEv); - LIB_FUNCTION("9Vyfb-I-9xw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDsc9_MbstatetE16do_always_noconvEv); - LIB_FUNCTION("+uPwCGfmJHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDsc9_MbstatetE5do_inERS0_PKcS4_RS4_PDsS6_RS6_); - LIB_FUNCTION("0FKwlv9iH1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDsc9_MbstatetE6do_outERS0_PKDsS4_RS4_PcS6_RS6_); - LIB_FUNCTION("lynApfiP6Lw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIDsc9_MbstatetE9do_lengthERS0_PKcS4_m); - LIB_FUNCTION("oDtGxrzLXMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIwc9_MbstatetE10do_unshiftERS0_PcS3_RS3_); - LIB_FUNCTION("4fPIrH+z+E4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIwc9_MbstatetE11do_encodingEv); - LIB_FUNCTION("5BQIjX7Y5YU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIwc9_MbstatetE13do_max_lengthEv); - LIB_FUNCTION("KheIhkaSrlA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIwc9_MbstatetE16do_always_noconvEv); - LIB_FUNCTION("WAPkmrXx2o8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIwc9_MbstatetE5do_inERS0_PKcS4_RS4_PwS6_RS6_); - LIB_FUNCTION("ABFE75lbcDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIwc9_MbstatetE6do_outERS0_PKwS4_RS4_PcS6_RS6_); - LIB_FUNCTION("G1zcPUEvY7U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7codecvtIwc9_MbstatetE9do_lengthERS0_PKcS4_m); - LIB_FUNCTION("1eEXfeW6wrI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_); - LIB_FUNCTION("gYlF567r3-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIcE12do_transformEPKcS2_); - LIB_FUNCTION("6vYXzFD-mrk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIcE4hashEPKcS2_); - LIB_FUNCTION("Q-8lQCGMj4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIcE7compareEPKcS2_S2_S2_); - LIB_FUNCTION("GSAXi4F1SlM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIcE7do_hashEPKcS2_); - LIB_FUNCTION("XaSxLBnqcWE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIcE9transformEPKcS2_); - LIB_FUNCTION("roztnFEs5Es", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_); - LIB_FUNCTION("Zxe-nQMgxHM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIwE12do_transformEPKwS2_); - LIB_FUNCTION("entYnoIu+fc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIwE4hashEPKwS2_); - LIB_FUNCTION("n-3HFZvDwBw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIwE7compareEPKwS2_S2_S2_); - LIB_FUNCTION("cWaCDW+Dc9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIwE7do_hashEPKwS2_); - LIB_FUNCTION("81uX7PzrtG8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7collateIwE9transformEPKwS2_); - LIB_FUNCTION("6CPwoi-cFZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8bad_cast4whatEv); - LIB_FUNCTION("NEemVJeMwd0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8bad_cast8_DoraiseEv); - LIB_FUNCTION("F27xQUBtNdU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8ios_base7failure8_DoraiseEv); - LIB_FUNCTION("XxsPrrWJ52I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIcE3getEiiiRKSs); - LIB_FUNCTION("U2t+WvMQj8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIcE4openERKSsRKSt6locale); - LIB_FUNCTION("EeBQ7253LkE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIcE5closeEi); - LIB_FUNCTION("vbgCuYKySLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIcE6do_getEiiiRKSs); - LIB_FUNCTION("HeBwePMtuFs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIcE7do_openERKSsRKSt6locale); - LIB_FUNCTION("rRmMX83UL1E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIcE8do_closeEi); - LIB_FUNCTION("Ea+awuQ5Bm8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE); - LIB_FUNCTION("TPq0HfoACeI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIwE4openERKSsRKSt6locale); - LIB_FUNCTION("GGoH7e6SZSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIwE5closeEi); - LIB_FUNCTION("UM6rGQxnEMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE); - LIB_FUNCTION("zSehLdHI0FA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIwE7do_openERKSsRKSt6locale); - LIB_FUNCTION("AjkxQBlsOOY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8messagesIwE8do_closeEi); - LIB_FUNCTION("cnNz2ftNwEU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE11do_groupingEv); - LIB_FUNCTION("nRf0VQ++OEw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE11do_truenameEv); - LIB_FUNCTION("ozLi0i4r6ds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE12do_falsenameEv); - LIB_FUNCTION("klWxQ2nKAHY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE13decimal_pointEv); - LIB_FUNCTION("QGSIlqfIU2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE13thousands_sepEv); - LIB_FUNCTION("JXzQGOtumdM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE16do_decimal_pointEv); - LIB_FUNCTION("zv1EMhI7R1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE16do_thousands_sepEv); - LIB_FUNCTION("JWplGh2O0Rs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE8groupingEv); - LIB_FUNCTION("fXUuZEw7C24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE8truenameEv); - LIB_FUNCTION("3+VwUA8-QPI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIcE9falsenameEv); - LIB_FUNCTION("2BmJdX269kI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE11do_groupingEv); - LIB_FUNCTION("nvSsAW7tcX8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE11do_truenameEv); - LIB_FUNCTION("-amctzWbEtw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE12do_falsenameEv); - LIB_FUNCTION("leSFwTZZuE4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE13decimal_pointEv); - LIB_FUNCTION("2Olt9gqOauQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE13thousands_sepEv); - LIB_FUNCTION("mzRlAVX65hQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE16do_decimal_pointEv); - LIB_FUNCTION("Utj8Sh5L0jE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE16do_thousands_sepEv); - LIB_FUNCTION("VsJCpXqMPJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE8groupingEv); - LIB_FUNCTION("3M20pLo9Gdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE8truenameEv); - LIB_FUNCTION("LDbKkgI-TZg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8numpunctIwE9falsenameEv); - LIB_FUNCTION("xvRvFtnUk3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9bad_alloc4whatEv); - LIB_FUNCTION("pS-t9AJblSM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9bad_alloc8_DoraiseEv); - LIB_FUNCTION("apPZ6HKZWaQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9exception4whatEv); - LIB_FUNCTION("DuW5ZqZv-70", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9exception6_RaiseEv); - LIB_FUNCTION("tyHd3P7oDrU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9exception8_DoraiseEv); - LIB_FUNCTION("Ti86LmOKvr0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE5_CopyEmm); - LIB_FUNCTION("TgEb5a+nOnk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm); - LIB_FUNCTION("nF8-CM+tro4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE6appendEmw); - LIB_FUNCTION("hSUcSStZEHM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm); - LIB_FUNCTION("8oO55jndPRg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEmw); - LIB_FUNCTION("IJmeA5ayVJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm); - LIB_FUNCTION("piJabTDQRVs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm); - LIB_FUNCTION("w2GyuoXCnkw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw); - LIB_FUNCTION("6ZDv6ZusiFg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSiD0Ev); - LIB_FUNCTION("tJU-ttrsXsk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSiD1Ev); - LIB_FUNCTION("gVTWlvyBSIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSo6sentryC2ERSo); - LIB_FUNCTION("nk+0yTWvoRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSo6sentryD2Ev); - LIB_FUNCTION("lTTrDj5OIwQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSoD0Ev); - LIB_FUNCTION("HpCeP12cuNY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSoD1Ev); - LIB_FUNCTION("9HILqEoh24E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs5_CopyEmm); - LIB_FUNCTION("0Ir3jiT4V6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs5eraseEmm); - LIB_FUNCTION("QqBWUNEfIAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs6appendEmc); - LIB_FUNCTION("qiR-4jx1abE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs6appendERKSsmm); - LIB_FUNCTION("ikjnoeemspQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs6assignEmc); - LIB_FUNCTION("xSxPHmpcNzY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs6assignEPKcm); - LIB_FUNCTION("pGxNI4JKfmY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs6assignERKSsmm); - LIB_FUNCTION("KDgQWX1eDeo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSs6insertEmmc); - LIB_FUNCTION("MHA0XR2YHoQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10bad_typeidD0Ev); - LIB_FUNCTION("vzh0qoLIEuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10bad_typeidD1Ev); - LIB_FUNCTION("tkZ7jVV6wJ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10bad_typeidD2Ev); - LIB_FUNCTION("xGbaQPsHCFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem10_Close_dirEPv); - LIB_FUNCTION("PbCV7juCZVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem10_Copy_fileEPKcS1_); - LIB_FUNCTION("SQ02ZA5E-UE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem10_File_sizeEPKc); - LIB_FUNCTION("XD9FmX1mavU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem11_EquivalentEPKcS1_); - LIB_FUNCTION("YDQxE4cIwa4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem11_Remove_dirEPKc); - LIB_FUNCTION("8VKAqiw7lC0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem12_Current_getERA260_c); - LIB_FUNCTION("Yl10kSufa5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem12_Current_setEPKc); - LIB_FUNCTION("HCB1auZdcmo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem16_Last_write_timeEPKc); - LIB_FUNCTION("Wut42WAe7Rw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathES4_St10error_code); - LIB_FUNCTION("C6-7Mo5WbwU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem18_Xfilesystem_errorEPKcRKNS_4pathESt10error_code); - LIB_FUNCTION("B0CeIhQty7Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem18_Xfilesystem_errorEPKcSt10error_code); - LIB_FUNCTION("VSk+sij2mwg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem20_Set_last_write_timeEPKcl); - LIB_FUNCTION("EBwahsMLokw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem5_StatEPKcPNS_5permsE); - LIB_FUNCTION("XyKw6Hs1P9Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem6_ChmodEPKcNS_5permsE); - LIB_FUNCTION("o1qlZJqrvmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem6_LstatEPKcPNS_5permsE); - LIB_FUNCTION("srwl1hhFoUI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem7_RenameEPKcS1_); - LIB_FUNCTION("O4mPool-pow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem7_ResizeEPKcm); - LIB_FUNCTION("Iok1WdvAROg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem7_UnlinkEPKc); - LIB_FUNCTION("SdKk439pgjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem8_StatvfsEPKcRNS_10space_infoE); - LIB_FUNCTION("x7pQExTeqBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem9_Make_dirEPKcS1_); - LIB_FUNCTION("8iuHpl+kg8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem9_Open_dirERA260_cPKcRiRNS_9file_typeE); - LIB_FUNCTION("w5CGykBBU5M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10filesystem9_Read_dirERA260_cPvRNS_9file_typeE); - LIB_FUNCTION("eF26YAKQWKA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EE2idE); - LIB_FUNCTION("UbuTnKIXyCk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EE4intlE); - LIB_FUNCTION("mU88GYCirhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("tYBLm0BoQdQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EEC1Em); - LIB_FUNCTION("5afBJmEfUQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EEC1EPKcm); - LIB_FUNCTION("wrR3T5i7gpY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EEC1ERKSt8_Locinfomb); - LIB_FUNCTION("5DFeXjP+Plg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EEC2Em); - LIB_FUNCTION("aNfpdhcsMWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EEC2EPKcm); - LIB_FUNCTION("uQFv8aNF8Jc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EEC2ERKSt8_Locinfomb); - LIB_FUNCTION("sS5fF+fht2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EED0Ev); - LIB_FUNCTION("3cW6MrkCKt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EED1Ev); - LIB_FUNCTION("mbGmSOLXgN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb0EED2Ev); - LIB_FUNCTION("PgiTG7nVxXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EE2idE); - LIB_FUNCTION("XhdnPX5bosc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EE4intlE); - LIB_FUNCTION("BuxsERsopss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("nbTAoMwiO38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EEC1Em); - LIB_FUNCTION("9S960jA8tB0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EEC1EPKcm); - LIB_FUNCTION("TRn3cMU4mjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EEC1ERKSt8_Locinfomb); - LIB_FUNCTION("kPELiw9L-gw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EEC2Em); - LIB_FUNCTION("RxJnJ-HoySc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EEC2EPKcm); - LIB_FUNCTION("7e3DrnZea-Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EEC2ERKSt8_Locinfomb); - LIB_FUNCTION("tcdvTUlPnL0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EED0Ev); - LIB_FUNCTION("wT+HL7oqjYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EED1Ev); - LIB_FUNCTION("F7CUCpiasec", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIcLb1EED2Ev); - LIB_FUNCTION("mhoxSElvH0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EE2idE); - LIB_FUNCTION("D0gqPsqeZac", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EE4intlE); - LIB_FUNCTION("0OjBJZd9VeM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("McUBYCqjLMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EEC1Em); - LIB_FUNCTION("jna5sqISK4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EEC1EPKcm); - LIB_FUNCTION("dHs7ndrQBiI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EEC1ERKSt8_Locinfomb); - LIB_FUNCTION("bBGvmspg3Xs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EEC2Em); - LIB_FUNCTION("5bQqdR3hTZw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EEC2EPKcm); - LIB_FUNCTION("1kvQkOSaaVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EEC2ERKSt8_Locinfomb); - LIB_FUNCTION("95MaQlRbfC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EED0Ev); - LIB_FUNCTION("ki5SQPsB4m4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EED1Ev); - LIB_FUNCTION("6F1JfiING18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb0EED2Ev); - LIB_FUNCTION("XUs40umcJLQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EE2idE); - LIB_FUNCTION("8vEBRx0O1fc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EE4intlE); - LIB_FUNCTION("HmcMLz3cPkM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("X69UlAXF-Oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EEC1Em); - LIB_FUNCTION("pyBabUesXN4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EEC1EPKcm); - LIB_FUNCTION("uROsAczW6OU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EEC1ERKSt8_Locinfomb); - LIB_FUNCTION("sTaUDDnGOpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EEC2Em); - LIB_FUNCTION("GS1AvxBwVgY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EEC2EPKcm); - LIB_FUNCTION("H0a2QXvgHOk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EEC2ERKSt8_Locinfomb); - LIB_FUNCTION("fWuQSVGOivA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EED0Ev); - LIB_FUNCTION("OM0FnA7Tldk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EED1Ev); - LIB_FUNCTION("uVOxy7dQTFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt10moneypunctIwLb1EED2Ev); - LIB_FUNCTION("fn1i72X18Gs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11logic_errorD0Ev); - LIB_FUNCTION("i726T0BHbOU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11logic_errorD1Ev); - LIB_FUNCTION("wgDImKoGKCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11logic_errorD2Ev); - LIB_FUNCTION("efXnxYFN5oE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11range_errorD0Ev); - LIB_FUNCTION("NnNaWa16OvE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11range_errorD1Ev); - LIB_FUNCTION("XgmUR6WSeXg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11range_errorD2Ev); - LIB_FUNCTION("ASUJmlcHSLo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11regex_errorD0Ev); - LIB_FUNCTION("gDsvnPIkLIE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11regex_errorD1Ev); - LIB_FUNCTION("X2wfcFYusTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt11regex_errorD2Ev); - LIB_FUNCTION("JyAoulEqA1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12bad_weak_ptrD0Ev); - LIB_FUNCTION("jAO1IJKMhE4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12bad_weak_ptrD1Ev); - LIB_FUNCTION("2R2j1QezUGM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12bad_weak_ptrD2Ev); - LIB_FUNCTION("q89N9L8q8FU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12domain_errorD0Ev); - LIB_FUNCTION("7P1Wm-5KgAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12domain_errorD1Ev); - LIB_FUNCTION("AsShnG3DulM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12domain_errorD2Ev); - LIB_FUNCTION("rNYLEsL7M0k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12future_errorD0Ev); - LIB_FUNCTION("fuyXHeERajE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12future_errorD1Ev); - LIB_FUNCTION("XFh0C66aEms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12future_errorD2Ev); - LIB_FUNCTION("QS7CASjt4FU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12length_errorD0Ev); - LIB_FUNCTION("n3y8Rn9hXJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12length_errorD1Ev); - LIB_FUNCTION("NjJfVHJL2Gg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12length_errorD2Ev); - LIB_FUNCTION("TqvziWHetnw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12out_of_rangeD0Ev); - LIB_FUNCTION("Kcb+MNSzZcc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12out_of_rangeD1Ev); - LIB_FUNCTION("cCXMypoz4Vs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12out_of_rangeD2Ev); - LIB_FUNCTION("+CnX+ZDO8qg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_1E); - LIB_FUNCTION("GHsPYRKjheE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_2E); - LIB_FUNCTION("X1C-YhubpGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_3E); - LIB_FUNCTION("fjnxuk9ucsE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_4E); - LIB_FUNCTION("jxlpClEsfJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_5E); - LIB_FUNCTION("-cgB1bQG6jo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_6E); - LIB_FUNCTION("Vj+KUu5khTE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_7E); - LIB_FUNCTION("9f-LMAJYGCY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_8E); - LIB_FUNCTION("RlB3+37KJaE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders2_9E); - LIB_FUNCTION("b8ySy0pHgSQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_10E); - LIB_FUNCTION("or0CNRlAEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_11E); - LIB_FUNCTION("BO1r8DPhmyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_12E); - LIB_FUNCTION("eeeT3NKKQZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_13E); - LIB_FUNCTION("s0V1HJcZWEs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_14E); - LIB_FUNCTION("94OiPulKcao", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_15E); - LIB_FUNCTION("XOEdRCackI4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_16E); - LIB_FUNCTION("pP76ElRLm78", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_17E); - LIB_FUNCTION("WVB9rXLAUFs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_18E); - LIB_FUNCTION("BE7U+QsixQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_19E); - LIB_FUNCTION("dFhgrqyzqhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12placeholders3_20E); - LIB_FUNCTION("oly3wSwEJ2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12system_errorC2ESt10error_codePKc); - LIB_FUNCTION("cyy-9ntjWT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12system_errorD0Ev); - LIB_FUNCTION("3qWXO9GTUYU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12system_errorD1Ev); - LIB_FUNCTION("it6DDrqKGvo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt12system_errorD2Ev); - LIB_FUNCTION("Ntg7gSs99PY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Num_int_base10is_boundedE); - LIB_FUNCTION("90T0XESrYzU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Num_int_base10is_integerE); - LIB_FUNCTION("WFTOZxDfpbQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Num_int_base14is_specializedE); - LIB_FUNCTION("ongs2C6YZgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Num_int_base5radixE); - LIB_FUNCTION("VET8UnnaQKo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Num_int_base8is_exactE); - LIB_FUNCTION("rZ5sEWyLqa4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Num_int_base9is_moduloE); - LIB_FUNCTION("diSRws0Ppxg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Regex_traitsIcE6_NamesE); - LIB_FUNCTION("xsRN6gUx-DE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13_Regex_traitsIwE6_NamesE); - LIB_FUNCTION("lX9M5u0e48k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13bad_exceptionD0Ev); - LIB_FUNCTION("t6egllDqQ2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13bad_exceptionD1Ev); - LIB_FUNCTION("iWNC2tkDgxw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13bad_exceptionD2Ev); - LIB_FUNCTION("VNaqectsZNs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv); - LIB_FUNCTION("9biiDDejX3Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5_LockEv); - LIB_FUNCTION("qM0gUepGWT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale); - LIB_FUNCTION("jfr41GGp2jA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv); - LIB_FUNCTION("SYFNsz9K2rs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci); - LIB_FUNCTION("yofHspnD9us", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7_UnlockEv); - LIB_FUNCTION( - "7oio2Gs1GNk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); - LIB_FUNCTION( - "rsS5cBMihAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE); - LIB_FUNCTION("oYMRgkQHoJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi); - LIB_FUNCTION("JTwt9OTgk1k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9_EndwriteEv); - LIB_FUNCTION("jerxcj2Xnbg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi); - LIB_FUNCTION("Nl6si1CfINw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv); - LIB_FUNCTION("MYCRRmc7cDA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev); - LIB_FUNCTION("Yc2gZRtDeNQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev); - LIB_FUNCTION("gOxGOQmSVU0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev); - LIB_FUNCTION("+WvmZi3216M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv); - LIB_FUNCTION("GYTma8zq0NU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5_LockEv); - LIB_FUNCTION("kmzNbhlkddA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale); - LIB_FUNCTION("VrXGNMTgNdE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv); - LIB_FUNCTION("wAcnCK2HCeI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi); - LIB_FUNCTION("ryl2DYMxlZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7_UnlockEv); - LIB_FUNCTION( - "g7gjCDEedJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); - LIB_FUNCTION( - "10VcrHqHAlw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI9_MbstatetENSt5_IosbIiE9_OpenmodeE); - LIB_FUNCTION("PjH5dZGfQHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEi); - LIB_FUNCTION("cV6KpJiF0Ck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9_EndwriteEv); - LIB_FUNCTION("NeiFvKblpZM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEi); - LIB_FUNCTION("hXsvfky362s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv); - LIB_FUNCTION("JJ-mkOhdook", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev); - LIB_FUNCTION("XcuCO1YXaRs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev); - LIB_FUNCTION("aC9OWBGjvxA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev); - LIB_FUNCTION("94dk1V7XfYw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13runtime_errorD0Ev); - LIB_FUNCTION("uBlwRfRb-CM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13runtime_errorD1Ev); - LIB_FUNCTION("oe9tS0VztYk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13runtime_errorD2Ev); - LIB_FUNCTION("3CtP20nk8fs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Error_objectsIiE14_System_objectE); - LIB_FUNCTION("fMfCVl0JvfE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Error_objectsIiE15_Generic_objectE); - LIB_FUNCTION("y8PXwxTZ9Hc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base10has_denormE); - LIB_FUNCTION("G4Pw4hv6NKc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base10is_boundedE); - LIB_FUNCTION("Zwn1Rlbirio", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base10is_integerE); - LIB_FUNCTION("M+F+0jd4+Y0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base11round_styleE); - LIB_FUNCTION("f06wGEmo5Pk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base12has_infinityE); - LIB_FUNCTION("xd7O9oMO+nI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base13has_quiet_NaNE); - LIB_FUNCTION("8hyOiMUD36c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base14is_specializedE); - LIB_FUNCTION("F+ehGYUe36Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base15has_denorm_lossE); - LIB_FUNCTION("0JlZYApT0UM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base15tinyness_beforeE); - LIB_FUNCTION("ec8jeC2LMOc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base17has_signaling_NaNE); - LIB_FUNCTION("7tACjdACOBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base5radixE); - LIB_FUNCTION("7gc-QliZnMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base5trapsE); - LIB_FUNCTION("4PL4SkJXTos", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base8is_exactE); - LIB_FUNCTION("tsiBm2NZQfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base9is_iec559E); - LIB_FUNCTION("c27lOSHxPA4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base9is_moduloE); - LIB_FUNCTION("LV2FB+f1MJE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Num_ldbl_base9is_signedE); - LIB_FUNCTION("g8Jw7V6mn8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14error_categoryD2Ev); - LIB_FUNCTION("KQTHP-ij0yo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIaE6digitsE); - LIB_FUNCTION("btueF8F0fQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIaE8digits10E); - LIB_FUNCTION("iBrS+wbpuT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIaE9is_signedE); - LIB_FUNCTION("x1vTXM-GLCE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIbE6digitsE); - LIB_FUNCTION("lnOqjnXNTwQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIbE8digits10E); - LIB_FUNCTION("qOkciFIHghY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIbE9is_moduloE); - LIB_FUNCTION("0mi6NtGz04Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIbE9is_signedE); - LIB_FUNCTION("nlxVZWbqzsU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIcE6digitsE); - LIB_FUNCTION("VVK0w0uxDLE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIcE8digits10E); - LIB_FUNCTION("M+AMxjxwWlA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIcE9is_signedE); - LIB_FUNCTION("hqVKCQr0vU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIdE12max_digits10E); - LIB_FUNCTION("fjI2ddUGZZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIdE12max_exponentE); - LIB_FUNCTION("AwdlDnuQ6c0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIdE12min_exponentE); - LIB_FUNCTION("VmOyIzWFNKs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIdE14max_exponent10E); - LIB_FUNCTION("odyn6PGg5LY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIdE14min_exponent10E); - LIB_FUNCTION("xQtNieUQLVg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIdE6digitsE); - LIB_FUNCTION("EXW20cJ3oNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIdE8digits10E); - LIB_FUNCTION("Zhtj6WalERg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIDiE6digitsE); - LIB_FUNCTION("r1k-y+1yDcQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIDiE8digits10E); - LIB_FUNCTION("TEMThaOLu+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIDiE9is_signedE); - LIB_FUNCTION("EL+4ceAj+UU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIDsE6digitsE); - LIB_FUNCTION("vEdl5Er9THU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIDsE8digits10E); - LIB_FUNCTION("ZaOkYNQyQ6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIDsE9is_signedE); - LIB_FUNCTION("u16WKNmQUNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIeE12max_digits10E); - LIB_FUNCTION("bzmM0dI80jM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIeE12max_exponentE); - LIB_FUNCTION("ERYMucecNws", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIeE12min_exponentE); - LIB_FUNCTION("tUo2aRfWs5I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIeE14max_exponent10E); - LIB_FUNCTION("3+5qZWL6APo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIeE14min_exponent10E); - LIB_FUNCTION("NLHWcHpvMss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIeE6digitsE); - LIB_FUNCTION("JYZigPvvB6c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIeE8digits10E); - LIB_FUNCTION("MFqdrWyu9Ls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIfE12max_digits10E); - LIB_FUNCTION("L29QQz-6+X8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIfE12max_exponentE); - LIB_FUNCTION("SPlcBQ4pIZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIfE12min_exponentE); - LIB_FUNCTION("R8xUpEJwAA8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIfE14max_exponent10E); - LIB_FUNCTION("n+NFkoa0VD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIfE14min_exponent10E); - LIB_FUNCTION("W6qgdoww-3k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIfE6digitsE); - LIB_FUNCTION("J7d2Fq6Mb0k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIfE8digits10E); - LIB_FUNCTION("T1YYqsPgrn0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIhE6digitsE); - LIB_FUNCTION("uTiJLq4hayE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIhE8digits10E); - LIB_FUNCTION("o0WexTj82pU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIhE9is_signedE); - LIB_FUNCTION("ZvahxWPLKm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIiE6digitsE); - LIB_FUNCTION("aQjlTguvFMw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIiE8digits10E); - LIB_FUNCTION("GST3YemNZD8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIiE9is_signedE); - LIB_FUNCTION("-jpk31lZR6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIjE6digitsE); - LIB_FUNCTION("csNIBfF6cyI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIjE8digits10E); - LIB_FUNCTION("P9XP5U7AfXs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIjE9is_signedE); - LIB_FUNCTION("31lJOpD3GGk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIlE6digitsE); - LIB_FUNCTION("4MdGVqrsl7s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIlE8digits10E); - LIB_FUNCTION("4llda2Y+Q+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIlE9is_signedE); - LIB_FUNCTION("7AaHj1O8-gI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsImE6digitsE); - LIB_FUNCTION("h9RyP3R30HI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsImE8digits10E); - LIB_FUNCTION("FXrK1DiAosQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsImE9is_signedE); - LIB_FUNCTION("QO6Q+6WPgy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIsE6digitsE); - LIB_FUNCTION("kW5K7R4rXy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIsE8digits10E); - LIB_FUNCTION("L0nMzhz-axs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIsE9is_signedE); - LIB_FUNCTION("4r9P8foa6QQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsItE6digitsE); - LIB_FUNCTION("OQorbmM+NbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsItE8digits10E); - LIB_FUNCTION("vyqQpWI+O48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsItE9is_signedE); - LIB_FUNCTION("Tlfgn9TIWkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIwE6digitsE); - LIB_FUNCTION("mdcx6KcRIkE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIwE8digits10E); - LIB_FUNCTION("YVacrIa4L0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIwE9is_signedE); - LIB_FUNCTION("LN2bC6QtGQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIxE6digitsE); - LIB_FUNCTION("OwcpepSk5lg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIxE8digits10E); - LIB_FUNCTION("mmrSzkWDrgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIxE9is_signedE); - LIB_FUNCTION("v7XHt2HwUVI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIyE6digitsE); - LIB_FUNCTION("Eubj+4g8dWA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIyE8digits10E); - LIB_FUNCTION("F2uQDOc7fMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14numeric_limitsIyE9is_signedE); - LIB_FUNCTION("y1dYQsc67ys", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14overflow_errorD0Ev); - LIB_FUNCTION("XilOsTdCZuM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14overflow_errorD1Ev); - LIB_FUNCTION("OypvNf3Uq3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14overflow_errorD2Ev); - LIB_FUNCTION("q-WOrJNOlhI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base10has_denormE); - LIB_FUNCTION("XbD-A2MEsS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base10is_boundedE); - LIB_FUNCTION("mxv24Oqmp0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base10is_integerE); - LIB_FUNCTION("9AcX4Qk47+o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base11round_styleE); - LIB_FUNCTION("MIKN--3fORE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base12has_infinityE); - LIB_FUNCTION("nxdioQgDF2E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base13has_quiet_NaNE); - LIB_FUNCTION("N03wZLr2RrE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base14is_specializedE); - LIB_FUNCTION("rhJg5tjs83Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base15has_denorm_lossE); - LIB_FUNCTION("EzuahjKzeGQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base15tinyness_beforeE); - LIB_FUNCTION("uMMG8cuJNr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base17has_signaling_NaNE); - LIB_FUNCTION("1KngsM7trps", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base5radixE); - LIB_FUNCTION("mMPu4-jx9oI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base5trapsE); - LIB_FUNCTION("J5QA0ZeLmhs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base8is_exactE); - LIB_FUNCTION("JwPU+6+T20M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base9is_iec559E); - LIB_FUNCTION("HU3yzCPz3GQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base9is_moduloE); - LIB_FUNCTION("S7kkgAPGxLQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15_Num_float_base9is_signedE); - LIB_FUNCTION("iHILAmwYRGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15underflow_errorD0Ev); - LIB_FUNCTION("ywv2X-q-9is", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15underflow_errorD1Ev); - LIB_FUNCTION("xiqd+QkuYXc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15underflow_errorD2Ev); - LIB_FUNCTION("1GhiIeIpkms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt16invalid_argumentD0Ev); - LIB_FUNCTION("oQDS9nX05Qg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt16invalid_argumentD1Ev); - LIB_FUNCTION("ddr7Ie4u5Nw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt16invalid_argumentD2Ev); - LIB_FUNCTION("za50kXyi3SA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt16nested_exceptionD0Ev); - LIB_FUNCTION("+qKS53qzWdA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt16nested_exceptionD1Ev); - LIB_FUNCTION("8R00hgzXQDY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt16nested_exceptionD2Ev); - LIB_FUNCTION("q9rMtHuXvZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt17bad_function_callD0Ev); - LIB_FUNCTION("YEDrb1pSx2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt17bad_function_callD1Ev); - LIB_FUNCTION("NqMgmxSA1rc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt17bad_function_callD2Ev); - LIB_FUNCTION("8DNJW5tX-A8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt18bad_variant_accessD0Ev); - LIB_FUNCTION("U3b5A2LEiTc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt18bad_variant_accessD1Ev); - LIB_FUNCTION("QUeUgxy7PTA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt20_Future_error_objectIiE14_Future_objectE); - LIB_FUNCTION("-UKRka-33sM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt20bad_array_new_lengthD0Ev); - LIB_FUNCTION("XO3N4SBvCy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt20bad_array_new_lengthD1Ev); - LIB_FUNCTION("15lB7flw-9w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt20bad_array_new_lengthD2Ev); - LIB_FUNCTION("WDKzMM-uuLE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt22_Future_error_categoryD0Ev); - LIB_FUNCTION("xsXQD5ybREw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt22_Future_error_categoryD1Ev); - LIB_FUNCTION("Dc4ZMWmPMl8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt22_System_error_categoryD0Ev); - LIB_FUNCTION("hVQgfGhJz3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt22_System_error_categoryD1Ev); - LIB_FUNCTION("YBrp9BlADaA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt23_Generic_error_categoryD0Ev); - LIB_FUNCTION("MAalgQhejPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt23_Generic_error_categoryD1Ev); - LIB_FUNCTION("9G32u5RRYxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt3pmr19new_delete_resourceEv); - LIB_FUNCTION("d2u38zs4Pe8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt3pmr20get_default_resourceEv); - LIB_FUNCTION("eWMGI7B7Lyc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt3pmr20null_memory_resourceEv); - LIB_FUNCTION("TKYsv0jdvRw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt3pmr20set_default_resourceEPNS_15memory_resourceE); - LIB_FUNCTION("H7-7Z3ixv-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_Pad7_LaunchEPKcPP12pthread_attrPP7pthread); - LIB_FUNCTION("PBbZjsL6nfc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_Pad7_LaunchEPKcPP7pthread); - LIB_FUNCTION("fLBZMOQh-3Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_Pad7_LaunchEPP12pthread_attrPP7pthread); - LIB_FUNCTION("xZqiZvmcp9k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_Pad7_LaunchEPP7pthread); - LIB_FUNCTION("a-z7wxuYO2E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_Pad8_ReleaseEv); - LIB_FUNCTION("uhnb6dnXOnc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_PadC2EPKc); - LIB_FUNCTION("dGYo9mE8K2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_PadC2Ev); - LIB_FUNCTION("XyJPhPqpzMw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_PadD1Ev); - LIB_FUNCTION("gjLRZgfb3i0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt4_PadD2Ev); - LIB_FUNCTION("rX58aCQCMS4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt5ctypeIcE10table_sizeE); - LIB_FUNCTION("Cv+zC4EjGMA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt5ctypeIcE2idE); - LIB_FUNCTION("p8-44cVeO84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt5ctypeIcED0Ev); - LIB_FUNCTION("tPsGA6EzNKA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt5ctypeIcED1Ev); - LIB_FUNCTION("VmqsS6auJzo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt5ctypeIwE2idE); - LIB_FUNCTION("zOPA5qnbW2U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt5ctypeIwED0Ev); - LIB_FUNCTION("P0383AW3Y9A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt5ctypeIwED1Ev); - LIB_FUNCTION("U54NBtdj6UY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_Mutex5_LockEv); - LIB_FUNCTION("7OCTkL2oWyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_Mutex7_UnlockEv); - LIB_FUNCTION("2KNnG2Z9zJA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_MutexC1Ev); - LIB_FUNCTION("log6zy2C9iQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_MutexC2Ev); - LIB_FUNCTION("djHbPE+TFIo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_MutexD1Ev); - LIB_FUNCTION("j7e7EQBD6ZA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_MutexD2Ev); - LIB_FUNCTION("0WY1SH7eoIs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_Winit9_Init_cntE); - LIB_FUNCTION("-Bl9-SZ2noc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_WinitC1Ev); - LIB_FUNCTION("57mMrw0l-40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_WinitC2Ev); - LIB_FUNCTION("Uw3OTZFPNt4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_WinitD1Ev); - LIB_FUNCTION("2yOarodWACE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6_WinitD2Ev); - LIB_FUNCTION("z83caOn94fM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6chrono12steady_clock12is_monotonicE); - LIB_FUNCTION("vHy+a4gLBfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6chrono12steady_clock9is_steadyE); - LIB_FUNCTION("jCX3CPIVB8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6chrono12system_clock12is_monotonicE); - LIB_FUNCTION("88EyUEoBX-E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6chrono12system_clock9is_steadyE); - LIB_FUNCTION("hEQ2Yi4PJXA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale16_GetgloballocaleEv); - LIB_FUNCTION("1TaQLyPDJEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale16_SetgloballocaleEPv); - LIB_FUNCTION("H4fcpQOpc08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale2id7_Id_cntE); - LIB_FUNCTION("9rMML086SEE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale5_InitEv); - LIB_FUNCTION("K-5mtupQZ4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale5emptyEv); - LIB_FUNCTION("AgxEl+HeWRQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale5facet7_DecrefEv); - LIB_FUNCTION("-EgSegeAKl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale5facet7_IncrefEv); - LIB_FUNCTION("QW2jL1J5rwY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale5facet9_RegisterEv); - LIB_FUNCTION("ptwhA0BQVeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale6globalERKS_); - LIB_FUNCTION("uuga3RipCKQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_Locimp7_AddfacEPNS_5facetEm); - LIB_FUNCTION("9FF+T5Xks9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_Locimp8_ClocptrE); - LIB_FUNCTION("5r801ZWiJJI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_Locimp8_MakelocERKSt8_LocinfoiPS0_PKS_); - LIB_FUNCTION("BcbHFSrcg3Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_Locimp9_MakewlocERKSt8_LocinfoiPS0_PKS_); - LIB_FUNCTION("fkFGlPdquqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_Locimp9_MakexlocERKSt8_LocinfoiPS0_PKS_); - LIB_FUNCTION("6b3KIjPD33k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_LocimpC1Eb); - LIB_FUNCTION("WViwxtEKxHk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_LocimpC1ERKS0_); - LIB_FUNCTION("zrmR88ClfOs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_LocimpC2Eb); - LIB_FUNCTION("dsJKehuajH4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_LocimpC2ERKS0_); - LIB_FUNCTION("bleKr8lOLr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_LocimpD0Ev); - LIB_FUNCTION("aD-iqbVlHmQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_LocimpD1Ev); - LIB_FUNCTION("So6gSmJMYDs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7_LocimpD2Ev); - LIB_FUNCTION("Uq5K8tl8I9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6locale7classicEv); - LIB_FUNCTION("pMWnITHysPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6localeD1Ev); - LIB_FUNCTION("CHrhwd8QSBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt6thread20hardware_concurrencyEv); - LIB_FUNCTION("m7qAgircaZY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIcE5_InitERKSt8_Locinfob); - LIB_FUNCTION("zWSNYg14Uag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIcEC2Emb); - LIB_FUNCTION("0il9qdo6fhs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIcEC2EPKcmbb); - LIB_FUNCTION("Lzj4ws7DlhQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIcED0Ev); - LIB_FUNCTION("0AeC+qCELEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIcED1Ev); - LIB_FUNCTION("iCoD0EOIbTM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIwE5_InitERKSt8_Locinfob); - LIB_FUNCTION("Pr1yLzUe230", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIwEC2Emb); - LIB_FUNCTION("TDhjx3nyaoU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIwEC2EPKcmbb); - LIB_FUNCTION("8UeuxGKjQr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIwED0Ev); - LIB_FUNCTION("0TADyPWrobI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7_MpunctIwED1Ev); - LIB_FUNCTION("eVFYZnYNDo0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetE2idE); - LIB_FUNCTION("iZCHNahj++4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetE5_InitERKSt8_Locinfo); - LIB_FUNCTION("zyhiiLKndO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetE7_GetcatEPPKNSt6locale5facetEPKS2_); - LIB_FUNCTION("XhwSbwsBdx0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetEC1Em); - LIB_FUNCTION("3YCLxZqgIdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetEC1ERKSt8_Locinfom); - LIB_FUNCTION("e5Hwcntvd8c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetEC2Em); - LIB_FUNCTION("4qHwSTPt-t8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetEC2ERKSt8_Locinfom); - LIB_FUNCTION("2TYdayAO39E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetED0Ev); - LIB_FUNCTION("djNkrJKTb6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetED1Ev); - LIB_FUNCTION("to7GggwECZU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIcc9_MbstatetED2Ev); - LIB_FUNCTION("u2MAta5SS84", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIDic9_MbstatetE2idE); - LIB_FUNCTION("vwMx2NhWdLw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIDic9_MbstatetED0Ev); - LIB_FUNCTION("TuhGCIxgLvA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIDic9_MbstatetED1Ev); - LIB_FUNCTION("xM5re58mxj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIDsc9_MbstatetE2idE); - LIB_FUNCTION("zYHryd8vd0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIDsc9_MbstatetED0Ev); - LIB_FUNCTION("Oeo9tUbzW7s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIDsc9_MbstatetED1Ev); - LIB_FUNCTION("FjZCPmK0SbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIwc9_MbstatetE2idE); - LIB_FUNCTION("9BI3oYkCTCU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIwc9_MbstatetED0Ev); - LIB_FUNCTION("0fkFA3za2N8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7codecvtIwc9_MbstatetED1Ev); - LIB_FUNCTION("7brRfHVVAlI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcE2idE); - LIB_FUNCTION("CKlZ-H-D1CE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcE5_InitERKSt8_Locinfo); - LIB_FUNCTION("BSVJqITGCyI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("Oo1r8jKGZQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcEC1Em); - LIB_FUNCTION("splBMMcF3yk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcEC1EPKcm); - LIB_FUNCTION("raLgIUi3xmk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcEC1ERKSt8_Locinfom); - LIB_FUNCTION("tkqNipin1EI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcEC2Em); - LIB_FUNCTION("VClCrMDyydE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcEC2EPKcm); - LIB_FUNCTION("L71JAnoQees", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcEC2ERKSt8_Locinfom); - LIB_FUNCTION("Lt4407UMs2o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcED0Ev); - LIB_FUNCTION("8pXCeme0FC4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcED1Ev); - LIB_FUNCTION("dP5zwQ2Yc8g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIcED2Ev); - LIB_FUNCTION("irGo1yaJ-vM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwE2idE); - LIB_FUNCTION("LxKs-IGDsFU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwE5_InitERKSt8_Locinfo); - LIB_FUNCTION("2wz4rthdiy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("d-MOtyu8GAk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwEC1Em); - LIB_FUNCTION("fjHAU8OSaW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwEC1EPKcm); - LIB_FUNCTION("wggIIjWSt-E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwEC1ERKSt8_Locinfom); - LIB_FUNCTION("HQbgeUdQyyw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwEC2Em); - LIB_FUNCTION("PSAw7g1DD24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwEC2EPKcm); - LIB_FUNCTION("2PoQu-K2qXk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwEC2ERKSt8_Locinfom); - LIB_FUNCTION("ig4VDIRc21Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwED0Ev); - LIB_FUNCTION("ZO3a6HfALTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwED1Ev); - LIB_FUNCTION("84wIPnwBGiU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7collateIwED2Ev); - LIB_FUNCTION("WkAsdy5CUAo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_Locinfo8_AddcatsEiPKc); - LIB_FUNCTION("L1Ze94yof2I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoC1EiPKc); - LIB_FUNCTION("hqi8yMOCmG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoC1EPKc); - LIB_FUNCTION("2aSk2ruCP0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoC1ERKSs); - LIB_FUNCTION("i180MNC9p4c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoC2EiPKc); - LIB_FUNCTION("pN02FS5SPgg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoC2EPKc); - LIB_FUNCTION("ReK9U6EUWuU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoC2ERKSs); - LIB_FUNCTION("p6LrHjIQMdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoD1Ev); - LIB_FUNCTION("YXVCU6PdgZk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8_LocinfoD2Ev); - LIB_FUNCTION("2MK5Lr9pgQc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8bad_castD0Ev); - LIB_FUNCTION("47RvLSo2HN8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8bad_castD1Ev); - LIB_FUNCTION("rF07weLXJu8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8bad_castD2Ev); - LIB_FUNCTION("QZb07KKwTU0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base4Init9_Init_cntE); - LIB_FUNCTION("sqWytnhYdEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base4InitC1Ev); - LIB_FUNCTION("bTQcNwRc8hE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base4InitC2Ev); - LIB_FUNCTION("kxXCvcat1cM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base4InitD1Ev); - LIB_FUNCTION("bxLH5WHgMBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base4InitD2Ev); - LIB_FUNCTION("8tL6yJaX1Ro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base5_SyncE); - LIB_FUNCTION("QXJCcrXoqpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base5clearENSt5_IosbIiE8_IostateEb); - LIB_FUNCTION("4EkPKYzOjPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base6_IndexE); - LIB_FUNCTION("LTov9gMEqCU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base7_AddstdEPS_); - LIB_FUNCTION("x7vtyar1sEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base7failureD0Ev); - LIB_FUNCTION("N2f485TmJms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base7failureD1Ev); - LIB_FUNCTION("fjG5plxblj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_base7failureD2Ev); - LIB_FUNCTION("I5jcbATyIWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_baseD0Ev); - LIB_FUNCTION("X9D8WWSG3As", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_baseD1Ev); - LIB_FUNCTION("P8F2oavZXtY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8ios_baseD2Ev); - LIB_FUNCTION("lA+PfiZ-S5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcE2idE); - LIB_FUNCTION("eLB2+1+mVvg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcE5_InitERKSt8_Locinfo); - LIB_FUNCTION("96Ev+CE1luE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("6gCBQs1mIi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcEC1Em); - LIB_FUNCTION("W0w8TGzAu0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcEC1EPKcm); - LIB_FUNCTION("SD403oMc1pQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcEC1ERKSt8_Locinfom); - LIB_FUNCTION("6DBUo0dty1k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcEC2Em); - LIB_FUNCTION("qF3mHeMAHVk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcEC2EPKcm); - LIB_FUNCTION("969Euioo12Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcEC2ERKSt8_Locinfom); - LIB_FUNCTION("jy9urODH0Wo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcED0Ev); - LIB_FUNCTION("34mi8lteNTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcED1Ev); - LIB_FUNCTION("yDdbQr1oLOc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIcED2Ev); - LIB_FUNCTION("n1Y6pGR-8AU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwE2idE); - LIB_FUNCTION("Zz-RfDtowlo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwE5_InitERKSt8_Locinfo); - LIB_FUNCTION("XghI4vmw8mU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("n4+3hznhkU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwEC1Em); - LIB_FUNCTION("4Srtnk+NpC4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwEC1EPKcm); - LIB_FUNCTION("RrTMGyPhYU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwEC1ERKSt8_Locinfom); - LIB_FUNCTION("x8PFBjJhH7E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwEC2Em); - LIB_FUNCTION("DlDsyX+XsoA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwEC2EPKcm); - LIB_FUNCTION("DDQjbwNC31E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwEC2ERKSt8_Locinfom); - LIB_FUNCTION("gMwkpZNI9Us", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwED0Ev); - LIB_FUNCTION("6sAaleB7Zgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwED1Ev); - LIB_FUNCTION("I-e7Dxo087A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8messagesIwED2Ev); - LIB_FUNCTION("9iXtwvGVFRI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcE2idE); - LIB_FUNCTION("1LvbNeZZJ-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcE5_InitERKSt8_Locinfob); - LIB_FUNCTION("fFnht9SPed8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcE5_TidyEv); - LIB_FUNCTION("zCB24JBovnQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("TEtyeXjcZ0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcEC1Em); - LIB_FUNCTION("WK24j1F3rCU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcEC1EPKcmb); - LIB_FUNCTION("CDm+TUClE7E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcEC1ERKSt8_Locinfomb); - LIB_FUNCTION("1eVdDzPtzD4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcEC2Em); - LIB_FUNCTION("yIn4l8OO1zA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcEC2EPKcmb); - LIB_FUNCTION("Cb1hI+w9nyU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcEC2ERKSt8_Locinfomb); - LIB_FUNCTION("Lf6h5krl2fA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcED0Ev); - LIB_FUNCTION("qEob3o53s2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcED1Ev); - LIB_FUNCTION("xFva4yxsVW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIcED2Ev); - LIB_FUNCTION("XZNi3XtbWQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwE2idE); - LIB_FUNCTION("uiRALKOdAZk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwE5_InitERKSt8_Locinfob); - LIB_FUNCTION("2YCDWkuFEy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwE5_TidyEv); - LIB_FUNCTION("SdXFaufpLIs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwE7_GetcatEPPKNSt6locale5facetEPKS1_); - LIB_FUNCTION("XOgjMgZ3fjo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwEC1Em); - LIB_FUNCTION("H+T2VJ91dds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwEC1EPKcmb); - LIB_FUNCTION("s1EM2NdPf0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwEC1ERKSt8_Locinfomb); - LIB_FUNCTION("ElKI+ReiehU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwEC2Em); - LIB_FUNCTION("m4kEqv7eGVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwEC2EPKcmb); - LIB_FUNCTION("MQJQCxbLfM0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwEC2ERKSt8_Locinfomb); - LIB_FUNCTION("VHBnRBxBg5E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwED0Ev); - LIB_FUNCTION("lzK3uL1rWJY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwED1Ev); - LIB_FUNCTION("XDm4jTtoEbo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8numpunctIwED2Ev); - LIB_FUNCTION("cDHRgSXYdqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base10has_denormE); - LIB_FUNCTION("v9HHsaa42qE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base10is_boundedE); - LIB_FUNCTION("EgSIYe3IYso", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base10is_integerE); - LIB_FUNCTION("XXiGcYa5wtg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base11round_styleE); - LIB_FUNCTION("98w+P+GuFMU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base12has_infinityE); - LIB_FUNCTION("qeA5qUg9xBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base12max_digits10E); - LIB_FUNCTION("E4gWXl6V2J0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base12max_exponentE); - LIB_FUNCTION("KqdclsYd24w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base12min_exponentE); - LIB_FUNCTION("gF5aGNmzWSg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base13has_quiet_NaNE); - LIB_FUNCTION("RCWKbkEaDAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base14is_specializedE); - LIB_FUNCTION("Dl4hxL59YF4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base14max_exponent10E); - LIB_FUNCTION("zBHGQsN5Yfw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base14min_exponent10E); - LIB_FUNCTION("96Bg8h09w+o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base15has_denorm_lossE); - LIB_FUNCTION("U0FdtOUjUPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base15tinyness_beforeE); - LIB_FUNCTION("fSdpGoYfYs8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base17has_signaling_NaNE); - LIB_FUNCTION("Xb9FhMysEHo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base5radixE); - LIB_FUNCTION("suaBxzlL0p0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base5trapsE); - LIB_FUNCTION("ejBz8a8TCWU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base6digitsE); - LIB_FUNCTION("M-KRaPj9tQQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base8digits10E); - LIB_FUNCTION("bUQLE6uEu10", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base8is_exactE); - LIB_FUNCTION("0ZdjsAWtbG8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base9is_iec559E); - LIB_FUNCTION("qO4MLGs1o58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base9is_moduloE); - LIB_FUNCTION("5DzttCF356U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9_Num_base9is_signedE); - LIB_FUNCTION("qb6A7pSgAeY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9bad_allocD0Ev); - LIB_FUNCTION("khbdMADH4cQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9bad_allocD1Ev); - LIB_FUNCTION("WiH8rbVv5s4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9bad_allocD2Ev); - LIB_FUNCTION("Bin7e2UR+a0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9exception18_Set_raise_handlerEPFvRKS_E); - LIB_FUNCTION("+Nc8JGdVLQs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9exceptionD0Ev); - LIB_FUNCTION("BgZcGDh7o9g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9exceptionD1Ev); - LIB_FUNCTION("MOBxtefPZUg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9exceptionD2Ev); - LIB_FUNCTION("N5nZ3wQw+Vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9type_infoD0Ev); - LIB_FUNCTION("LLssoYjMOow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9type_infoD1Ev); - LIB_FUNCTION("zb3436295XU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9type_infoD2Ev); - LIB_FUNCTION("ryUxD-60bKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZnwmRKSt9nothrow_t); - LIB_FUNCTION("3yxLpdKD0RA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZnwmSt11align_val_t); - LIB_FUNCTION("iQXBbJbfT5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZnwmSt11align_val_tRKSt9nothrow_t); - LIB_FUNCTION("VrWUXy1gqn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt10_Rng_abortPKc); - LIB_FUNCTION("Zmeuhg40yNI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt10adopt_lock); - LIB_FUNCTION("mhR3IufA7fE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt10defer_lock); - LIB_FUNCTION("lKfKm6INOpQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt10unexpectedv); - LIB_FUNCTION("eT2UsmTewbU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt11_Xbad_allocv); - LIB_FUNCTION("L7Vnk06zC2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt11setiosflagsNSt5_IosbIiE9_FmtflagsE); - LIB_FUNCTION("kFYQ4d6jVls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt11try_to_lock); - LIB_FUNCTION("1h8hFQghR7w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt12setprecisioni); - LIB_FUNCTION("ybn35k-I+B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt13_Cl_charnames); - LIB_FUNCTION("DiGVep5yB5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt13_Execute_onceRSt9once_flagPFiPvS1_PS1_ES1_); - LIB_FUNCTION("PDX01ziUz+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt13_Syserror_mapi); - LIB_FUNCTION("UWyL6KoR96U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt13_Xregex_errorNSt15regex_constants10error_typeE); - LIB_FUNCTION("Zb+hMspRR-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt13get_terminatev); - LIB_FUNCTION("qMXslRdZVj4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt13resetiosflagsNSt5_IosbIiE9_FmtflagsE); - LIB_FUNCTION("NG1phipELJE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt13set_terminatePFvvE); - LIB_FUNCTION("u2tMGOLaqnE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Atomic_assertPKcS0_); - LIB_FUNCTION("T+zVxpVaaTo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Cl_wcharnames); - LIB_FUNCTION("Zn44KZgJtWY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Debug_messagePKcS0_j); - LIB_FUNCTION("u0yN6tzBors", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Raise_handler); - LIB_FUNCTION("Nmtr628eA3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Random_devicev); - LIB_FUNCTION("bRujIheWlB0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Throw_C_errori); - LIB_FUNCTION("tQIo+GIPklo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Xlength_errorPKc); - LIB_FUNCTION("ozMAr28BwSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14_Xout_of_rangePKc); - LIB_FUNCTION("zPWCqkg7V+o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14get_unexpectedv); - LIB_FUNCTION("Eva2i4D5J6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt14set_unexpectedPFvvE); - LIB_FUNCTION("zugltxeIXM0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt15_sceLibcLocinfoPKc); - LIB_FUNCTION("y7aMFEkj4PE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt15_Xruntime_errorPKc); - LIB_FUNCTION("vI85k3GQcz8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt15future_categoryv); - LIB_FUNCTION("CkY0AVa-frg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt15get_new_handlerv); - LIB_FUNCTION("RqeErO3cFHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt15set_new_handlerPFvvE); - LIB_FUNCTION("aotaAaQK6yc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt15system_categoryv); - LIB_FUNCTION("W0j6vCxh9Pc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt16_Throw_Cpp_errori); - LIB_FUNCTION("saSUnPWLq9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt16_Xoverflow_errorPKc); - LIB_FUNCTION("YxwfcCH5Q0I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt16generic_categoryv); - LIB_FUNCTION("0r8rbw2SFqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt17_Future_error_mapi); - LIB_FUNCTION("VoUwme28y4w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt18_String_cpp_unused); - LIB_FUNCTION("NU-T4QowTNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt18_Xinvalid_argumentPKc); - LIB_FUNCTION("Q1BL70XVV0o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt18uncaught_exceptionv); - LIB_FUNCTION("PjwbqtUehPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt19_Throw_future_errorRKSt10error_code); - LIB_FUNCTION("MELi-cKqWq0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt19_Xbad_function_callv); - LIB_FUNCTION("Qoo175Ig+-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt21_sceLibcClassicLocale); - LIB_FUNCTION("cPNeOAYgB0A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt22_Get_future_error_whati); - LIB_FUNCTION("mDIHE-aaRaI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt22_Random_device_entropyv); - LIB_FUNCTION("DNbsDRZ-ntI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt25_Rethrow_future_exceptionSt13exception_ptr); - LIB_FUNCTION("2WVBaSdGIds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt3cin); - LIB_FUNCTION("wiR+rIcbnlc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt4_Fpz); - LIB_FUNCTION("TVfbf1sXt0A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt4cerr); - LIB_FUNCTION("jSquWN7i7lc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt4clog); - LIB_FUNCTION("5PfqUBaQf4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt4cout); - LIB_FUNCTION("vU9svJtEnWc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt4setwi); - LIB_FUNCTION("2bASh0rEeXI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt4wcin); - LIB_FUNCTION("CvJ3HUPlMIY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt5wcerr); - LIB_FUNCTION("awr1A2VAVZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt5wclog); - LIB_FUNCTION("d-YRIvO0jXI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt5wcout); - LIB_FUNCTION("pDFe-IgbTPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt6_ThrowRKSt9exception); - LIB_FUNCTION("kr5ph+wVAtU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt6ignore); - LIB_FUNCTION("FQ9NFbBHb5Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7_BADOFF); - LIB_FUNCTION("vYWK2Pz8vGE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7_FiopenPKcNSt5_IosbIiE9_OpenmodeEi); - LIB_FUNCTION("aqyjhIx7jaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7_FiopenPKwNSt5_IosbIiE9_OpenmodeEi); - LIB_FUNCTION("QfPuSqhub7o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7_MP_AddPyy); - LIB_FUNCTION("lrQSsTRMMr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7_MP_GetPy); - LIB_FUNCTION("Gav1Xt1Ce+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7_MP_MulPyyy); - LIB_FUNCTION("Ozk+Z6QnlTY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7_MP_RemPyy); - LIB_FUNCTION("NLwJ3q+64bY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7nothrow); - LIB_FUNCTION("4rrOHCHAV1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt7setbasei); - LIB_FUNCTION("yYk819F9TyU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt8_XLgammad); - LIB_FUNCTION("bl0DPP6kFBk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt8_XLgammae); - LIB_FUNCTION("DWMcG8yogkY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt8_XLgammaf); - LIB_FUNCTION("X1DNtCe22Ks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt9_LStrcollIcEiPKT_S2_S2_S2_PKSt8_Collvec); - LIB_FUNCTION("m6uU37-b27s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt9_LStrcollIwEiPKT_S2_S2_S2_PKSt8_Collvec); - LIB_FUNCTION("V62E2Q8bJVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt9_LStrxfrmIcEmPT_S1_PKS0_S3_PKSt8_Collvec); - LIB_FUNCTION("BloPUt1HCH0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt9_LStrxfrmIwEmPT_S1_PKS0_S3_PKSt8_Collvec); - LIB_FUNCTION("qYhnoevd9bI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt9terminatev); - LIB_FUNCTION("XO9ihAZCBcY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIa); - LIB_FUNCTION("nEuTkSQAQFw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIb); - LIB_FUNCTION("smeljzleGRQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIc); - LIB_FUNCTION("iZrCfFRsE3Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTId); - LIB_FUNCTION("ltRLAWAeSaM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIDh); - LIB_FUNCTION("7TW4UgJjwJ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIDi); - LIB_FUNCTION("SK0Syya+scs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIDn); - LIB_FUNCTION("rkWOabkkpVo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIDs); - LIB_FUNCTION("NlgA2fMtxl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIe); - LIB_FUNCTION("c5-Jw-LTekM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIf); - LIB_FUNCTION("g-fUPD4HznU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIh); - LIB_FUNCTION("St4apgcBNfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIi); - LIB_FUNCTION("MpiTv3MErEQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIj); - LIB_FUNCTION("b5JSEuAHuDo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIl); - LIB_FUNCTION("DoGS21ugIfI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIm); - LIB_FUNCTION("2EEDQ6uHY2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIn); - LIB_FUNCTION("h1Eewgzowes", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv116__enum_type_infoE); - LIB_FUNCTION("eD+mC6biMFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv117__array_type_infoE); - LIB_FUNCTION("EeOtHxoUkvM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv117__class_type_infoE); - LIB_FUNCTION("dSBshTZ8JcA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv117__pbase_type_infoE); - LIB_FUNCTION("YglrcQaNfds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv119__pointer_type_infoE); - LIB_FUNCTION("DZhZwYkJDCE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv120__function_type_infoE); - LIB_FUNCTION("N2VV+vnEYlw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv120__si_class_type_infoE); - LIB_FUNCTION("gjLRFhKCMNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv121__vmi_class_type_infoE); - LIB_FUNCTION("dHw0YAjyIV4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv123__fundamental_type_infoE); - LIB_FUNCTION("7tTpzMt-PzY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN10__cxxabiv129__pointer_to_member_type_infoE); - LIB_FUNCTION("yZmHOKICuxg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN6Dinkum7threads10lock_errorE); - LIB_FUNCTION("qcaIknDQLwE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIN6Dinkum7threads21thread_resource_errorE); - LIB_FUNCTION("sJUU2ZW-yxU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTINSt6locale5facetE); - LIB_FUNCTION("8Wc+t3BCF-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTINSt6locale7_LocimpE); - LIB_FUNCTION("sBCTjFk7Gi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTINSt8ios_base7failureE); - LIB_FUNCTION("Sn3TCBWJ5wo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIo); - LIB_FUNCTION("Jk+LgZzCsi8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPa); - LIB_FUNCTION("+qso2nVwQzg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPb); - LIB_FUNCTION("M1jmeNsWVK8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPc); - LIB_FUNCTION("3o0PDVnn1qA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPd); - LIB_FUNCTION("7OO0uCJWILQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPDh); - LIB_FUNCTION("DOBCPW6DL3w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPDi); - LIB_FUNCTION("QvWOlLyuQ2o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPDn); - LIB_FUNCTION("OkYxbdkrv64", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPDs); - LIB_FUNCTION("96xdSFbiR7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPe); - LIB_FUNCTION("01FSgNK1wwA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPf); - LIB_FUNCTION("ota-3+co4Jk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPh); - LIB_FUNCTION("YstfcFbhwvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPi); - LIB_FUNCTION("DQ9mChn0nnE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPj); - LIB_FUNCTION("Ml1z3dYEVPM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKa); - LIB_FUNCTION("WV94zKqwgxY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKb); - LIB_FUNCTION("I4y33AOamns", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKc); - LIB_FUNCTION("0G36SAiYUhQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKd); - LIB_FUNCTION("NVCBWomXpcw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKDh); - LIB_FUNCTION("50aDlGVFt5I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKDi); - LIB_FUNCTION("liR+QkhejDk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKDn); - LIB_FUNCTION("kzfj-YSkW7w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKDs); - LIB_FUNCTION("7uX6IsXWwak", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKe); - LIB_FUNCTION("2PXZUKjolAA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKf); - LIB_FUNCTION("RKvygdQzGaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKh); - LIB_FUNCTION("sVUkO0TTpM8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKi); - LIB_FUNCTION("4zhc1xNSIno", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKj); - LIB_FUNCTION("Gr+ih5ipgNk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKl); - LIB_FUNCTION("0cLFYdr1AGc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKm); - LIB_FUNCTION("0Xxtiar8Ceg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKn); - LIB_FUNCTION("hsttk-IbL1o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKo); - LIB_FUNCTION("zqOGToT2dH8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKs); - LIB_FUNCTION("WY7615THqKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKt); - LIB_FUNCTION("0g+zCGZ7dgQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKv); - LIB_FUNCTION("jfqTdKTGbBI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKw); - LIB_FUNCTION("sOz2j1Lxl48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKx); - LIB_FUNCTION("qTgw+f54K34", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPKy); - LIB_FUNCTION("1+5ojo5J2xU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPl); - LIB_FUNCTION("SPiW3NTO8I0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPm); - LIB_FUNCTION("zUwmtNuJABI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPn); - LIB_FUNCTION("A9PfIjQCOUw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPo); - LIB_FUNCTION("nqpARwWZmjI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPs); - LIB_FUNCTION("KUW22XiVxvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPt); - LIB_FUNCTION("OJPn-YR1bow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPv); - LIB_FUNCTION("7gj0BXUP3dc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPw); - LIB_FUNCTION("9opd1ucwDqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPx); - LIB_FUNCTION("a9KMkfXXUsE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIPy); - LIB_FUNCTION("j97CjKJNtQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIs); - LIB_FUNCTION("U1CBVMD42HA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISi); - LIB_FUNCTION("iLSavTYoxx0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISo); - LIB_FUNCTION("H0aqk25W6BI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt10bad_typeid); - LIB_FUNCTION("2GWRrgT8o20", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt10ctype_base); - LIB_FUNCTION("IBtzswgYU3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt10money_base); - LIB_FUNCTION("2e96MkSXo3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt10moneypunctIcLb0EE); - LIB_FUNCTION("Ks2FIQJ2eDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt10moneypunctIcLb1EE); - LIB_FUNCTION("EnMjfRlO5f0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt10moneypunctIwLb0EE); - LIB_FUNCTION("gBZnTFMk6N0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt10moneypunctIwLb1EE); - LIB_FUNCTION("n7iD5r9+4Eo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt11_Facet_base); - LIB_FUNCTION("x8LHSvl5N6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt11logic_error); - LIB_FUNCTION("C0IYaaVSC1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt11range_error); - LIB_FUNCTION("9-TRy4p-YTM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt11regex_error); - LIB_FUNCTION("XtP9KKwyK9Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt12bad_weak_ptr); - LIB_FUNCTION("dDIjj8NBxNA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt12codecvt_base); - LIB_FUNCTION("5BIbzIuDxTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt12domain_error); - LIB_FUNCTION("DCY9coLQcVI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt12future_error); - LIB_FUNCTION("cxqzgvGm1GI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt12length_error); - LIB_FUNCTION("dKjhNUf9FBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt12out_of_range); - LIB_FUNCTION("eDciML+moZs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt12system_error); - LIB_FUNCTION("Z7NWh8jD+Nw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt13bad_exception); - LIB_FUNCTION("STNAj1oxtpk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt13basic_filebufIcSt11char_traitsIcEE); - LIB_FUNCTION("37CMzzbbHn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt13basic_filebufIwSt11char_traitsIwEE); - LIB_FUNCTION("WbBz4Oam3wM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt13messages_base); - LIB_FUNCTION("bLPn1gfqSW8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt13runtime_error); - LIB_FUNCTION("cbvW20xPgyc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt14error_category); - LIB_FUNCTION("lt0mLhNwjs0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt14overflow_error); - LIB_FUNCTION("oNRAB0Zs2+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt15underflow_error); - LIB_FUNCTION("XZzWt0ygWdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt16invalid_argument); - LIB_FUNCTION("FtPFMdiURuM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt16nested_exception); - LIB_FUNCTION("c33GAGjd7Is", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt17bad_function_call); - LIB_FUNCTION("8rd5FvOFk+w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt18bad_variant_access); - LIB_FUNCTION("lbLEAN+Y9iI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt20bad_array_new_length); - LIB_FUNCTION("3aZN32UTqqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt22_Future_error_category); - LIB_FUNCTION("QLqM1r9nPow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt22_System_error_category); - LIB_FUNCTION("+Le0VsFb9mE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt23_Generic_error_category); - LIB_FUNCTION("QQsnQ2bWkdM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt4_Pad); - LIB_FUNCTION("sIvK5xl5pzw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt5_IosbIiE); - LIB_FUNCTION("gZvNGjQsmf8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt5ctypeIcE); - LIB_FUNCTION("Fj7VTFzlI3k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt5ctypeIwE); - LIB_FUNCTION("weALTw0uesc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7_MpunctIcE); - LIB_FUNCTION("DaYYQBc+SY8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7_MpunctIwE); - LIB_FUNCTION("Cs3DBACRSY8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7codecvtIcc9_MbstatetE); - LIB_FUNCTION("+TtUFzALoDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7codecvtIDic9_MbstatetE); - LIB_FUNCTION("v1WebHtIa24", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7codecvtIDsc9_MbstatetE); - LIB_FUNCTION("hbU5HOTy1HM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7codecvtIwc9_MbstatetE); - LIB_FUNCTION("fvgYbBEhXnc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7collateIcE); - LIB_FUNCTION("pphEhnnuXKA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7collateIwE); - LIB_FUNCTION("qOD-ksTkE08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8bad_cast); - LIB_FUNCTION("BJCgW9-OxLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8ios_base); - LIB_FUNCTION("UFsKD1fd1-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8messagesIcE); - LIB_FUNCTION("007PjrBCaUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8messagesIwE); - LIB_FUNCTION("ddLNBT9ks2I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8numpunctIcE); - LIB_FUNCTION("A2TTRMAe6Sw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8numpunctIwE); - LIB_FUNCTION("DwH3gdbYfZo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9bad_alloc); - LIB_FUNCTION("7f4Nl2VS0gw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9basic_iosIcSt11char_traitsIcEE); - LIB_FUNCTION("RjWhdj0ztTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9basic_iosIwSt11char_traitsIwEE); - LIB_FUNCTION("n2kx+OmFUis", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9exception); - LIB_FUNCTION("CVcmmf8VL40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9time_base); - LIB_FUNCTION("xX6s+z0q6oo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9type_info); - LIB_FUNCTION("Qd6zUdRhrhs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIt); - LIB_FUNCTION("JrUnjJ-PCTg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIv); - LIB_FUNCTION("qUxH+Damft4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIw); - LIB_FUNCTION("8Ijx3Srynh0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIx); - LIB_FUNCTION("KBBVmt8Td7c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTIy); - LIB_FUNCTION("iOLTktXe6a0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSa); - LIB_FUNCTION("M86y4bmx+WA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSb); - LIB_FUNCTION("zGpCWBtVC0A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSc); - LIB_FUNCTION("pMQUQSfX6ZE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSd); - LIB_FUNCTION("DghzFjzLqaE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSDi); - LIB_FUNCTION("FUvnVyCDhjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSDn); - LIB_FUNCTION("Z7+siBC690w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSDs); - LIB_FUNCTION("KNgcEteI72I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSe); - LIB_FUNCTION("aFMVMBzO5jk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSf); - LIB_FUNCTION("BNC7IeJelZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSh); - LIB_FUNCTION("papHVcWkO5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSi); - LIB_FUNCTION("1nylaCTiH08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSj); - LIB_FUNCTION("k9kErpz2Sv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSl); - LIB_FUNCTION("OzMC6yz6Row", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSm); - LIB_FUNCTION("au+YxKwehQM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv116__enum_type_infoE); - LIB_FUNCTION("6BYT26CFh58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv117__array_type_infoE); - LIB_FUNCTION("8Vs1AjNm2mE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv117__class_type_infoE); - LIB_FUNCTION("bPUMNZBqRqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv117__pbase_type_infoE); - LIB_FUNCTION("UVft3+rc06o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv119__pointer_type_infoE); - LIB_FUNCTION("4ZXlZy7iRWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv120__function_type_infoE); - LIB_FUNCTION("AQlqO860Ztc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv120__si_class_type_infoE); - LIB_FUNCTION("I1Ru2fZJDoE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv121__vmi_class_type_infoE); - LIB_FUNCTION("6WYrZgAyjuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv123__fundamental_type_infoE); - LIB_FUNCTION("K+w0ofCSsAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN10__cxxabiv129__pointer_to_member_type_infoE); - LIB_FUNCTION("y-bbIiLALd4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN6Dinkum7threads10lock_errorE); - LIB_FUNCTION("hmHH6DsLWgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSN6Dinkum7threads21thread_resource_errorE); - LIB_FUNCTION("RVDooP5gZ4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSNSt6locale5facetE); - LIB_FUNCTION("JjTc4SCuILE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSNSt6locale7_LocimpE); - LIB_FUNCTION("C-3N+mEQli4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSNSt8ios_base7failureE); - LIB_FUNCTION("p07Yvdjjoo4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPa); - LIB_FUNCTION("ickyvjtMLm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPb); - LIB_FUNCTION("jJtoPFrxG-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPc); - LIB_FUNCTION("dIxG0L1esAI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPd); - LIB_FUNCTION("TSMc8vgtvHI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPDi); - LIB_FUNCTION("cj+ge8YLU7s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPDn); - LIB_FUNCTION("mQCm5NmJORg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPDs); - LIB_FUNCTION("N84qS6rJuGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPe); - LIB_FUNCTION("DN0xDLRXD2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPf); - LIB_FUNCTION("HHVZLHmCfI4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPh); - LIB_FUNCTION("g8phA3duRm8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPi); - LIB_FUNCTION("bEbjy6yceWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPj); - LIB_FUNCTION("dSifrMdPVQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKa); - LIB_FUNCTION("qSiIrmgy1D8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKb); - LIB_FUNCTION("wm9QKozFM+s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKc); - LIB_FUNCTION("-7c7thUsi1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKd); - LIB_FUNCTION("lFKA8eMU5PA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKDi); - LIB_FUNCTION("2veyNsXFZuw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKDn); - LIB_FUNCTION("qQ4c52GZlYw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKDs); - LIB_FUNCTION("8Ce6O0B-KpA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKe); - LIB_FUNCTION("emnRy3TNxFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKf); - LIB_FUNCTION("thDTXTikSmc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKh); - LIB_FUNCTION("3Fd+8Pk6fgE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKi); - LIB_FUNCTION("6azovDgjxt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKj); - LIB_FUNCTION("QdPk9cbJrOY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKl); - LIB_FUNCTION("ER8-AFoFDfM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKm); - LIB_FUNCTION("5rD2lCo4688", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKs); - LIB_FUNCTION("iWMhoHS8gqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKt); - LIB_FUNCTION("3op2--wf660", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKv); - LIB_FUNCTION("h64u7Gu3-TM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKw); - LIB_FUNCTION("3THnS7v0D+M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKx); - LIB_FUNCTION("h+xQETZ+6Yo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPKy); - LIB_FUNCTION("6cfcRTPD2zU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPl); - LIB_FUNCTION("OXkzGA9WqVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPm); - LIB_FUNCTION("6XcQYYO2YMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPs); - LIB_FUNCTION("8OSy0MMQ7eI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPt); - LIB_FUNCTION("s1b2SRBzSAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPv); - LIB_FUNCTION("4r--aFJyPpI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPw); - LIB_FUNCTION("pc4-Lqosxgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPx); - LIB_FUNCTION("VJL9W+nOv1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSPy); - LIB_FUNCTION("VenLJSDuDXY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSs); - LIB_FUNCTION("46haDPRVtPo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSi); - LIB_FUNCTION("RgJjmluR+QA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSo); - LIB_FUNCTION("ALcclvT4W3Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt10bad_typeid); - LIB_FUNCTION("idsapmYZ49w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt10ctype_base); - LIB_FUNCTION("VxObo0uiafo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt10money_base); - LIB_FUNCTION("h+iBEkE50Zs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt10moneypunctIcLb0EE); - LIB_FUNCTION("o4DiZqXId90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt10moneypunctIcLb1EE); - LIB_FUNCTION("MxGclWMtl4g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt10moneypunctIwLb0EE); - LIB_FUNCTION("J+hjiBreZr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt10moneypunctIwLb1EE); - LIB_FUNCTION("FAah-AY8+vY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt11_Facet_base); - LIB_FUNCTION("VNHXByo1yuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt11logic_error); - LIB_FUNCTION("msxwgUAPy-Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt11range_error); - LIB_FUNCTION("UG6HJeH5GNI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt11regex_error); - LIB_FUNCTION("P7l9+yBL5VU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt12bad_weak_ptr); - LIB_FUNCTION("NXKsxT-x76M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt12codecvt_base); - LIB_FUNCTION("2ud1bFeR0h8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt12domain_error); - LIB_FUNCTION("YeBP0Rja7vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt12future_error); - LIB_FUNCTION("zEhcQGEiPik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt12length_error); - LIB_FUNCTION("eNW5jsFxS6k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt12out_of_range); - LIB_FUNCTION("XRxuwvN++2w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt12system_error); - LIB_FUNCTION("G8z7rz17xYM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt13bad_exception); - LIB_FUNCTION("WYWf+rJuDVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt13basic_filebufIcSt11char_traitsIcEE); - LIB_FUNCTION("coVkgLzNtaw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt13basic_filebufIwSt11char_traitsIwEE); - LIB_FUNCTION("N0EHkukBz6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt13messages_base); - LIB_FUNCTION("CX3WC8qekJE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt13runtime_error); - LIB_FUNCTION("u5zp3yXW5wA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt14error_category); - LIB_FUNCTION("iy1lPjADRUs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt14overflow_error); - LIB_FUNCTION("Uea1kfRJ7Oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt15underflow_error); - LIB_FUNCTION("KJutwrVUFUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt16invalid_argument); - LIB_FUNCTION("S8kp05fMCqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt16nested_exception); - LIB_FUNCTION("ql6hz7ZOZTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt17bad_function_call); - LIB_FUNCTION("ObdBkrZylOg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt18bad_variant_access); - LIB_FUNCTION("hBvqSQD5yNk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt20bad_array_new_length); - LIB_FUNCTION("ouo2obDE6yU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt22_Future_error_category); - LIB_FUNCTION("iwIUndpU5ZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt22_System_error_category); - LIB_FUNCTION("88Fre+wfuT0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt23_Generic_error_category); - LIB_FUNCTION("qR6GVq1IplU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt4_Pad); - LIB_FUNCTION("uO6YxonQkJI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt5_IosbIiE); - LIB_FUNCTION("jUQ+FlOMEHk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt5ctypeIcE); - LIB_FUNCTION("1jUJO+TZm5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt5ctypeIwE); - LIB_FUNCTION("LfMY9H6d5mI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7_MpunctIcE); - LIB_FUNCTION("mh9Jro0tcjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7_MpunctIwE); - LIB_FUNCTION("rf0BfDQG1KU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7codecvtIcc9_MbstatetE); - LIB_FUNCTION("Tt3ZSp9XD4E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7codecvtIDic9_MbstatetE); - LIB_FUNCTION("9XL3Tlgx6lc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7codecvtIDsc9_MbstatetE); - LIB_FUNCTION("YrYO5bTIPqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7codecvtIwc9_MbstatetE); - LIB_FUNCTION("wElyE0OmoRw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7collateIcE); - LIB_FUNCTION("BdfPxmlM9bs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7collateIwE); - LIB_FUNCTION("--fMWwCvo+c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8bad_cast); - LIB_FUNCTION("Nr+GiZ0tGAk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8ios_base); - LIB_FUNCTION("iUhx-JN27uI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8messagesIcE); - LIB_FUNCTION("5ViZYJRew6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8messagesIwE); - LIB_FUNCTION("2ZqL1jnL8so", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8numpunctIcE); - LIB_FUNCTION("xuEUMolGMwU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8numpunctIwE); - LIB_FUNCTION("22g2xONdXV4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9bad_alloc); - LIB_FUNCTION("TuKJRIKcceA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9basic_iosIcSt11char_traitsIcEE); - LIB_FUNCTION("wYWYC8xNFOI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9basic_iosIwSt11char_traitsIwEE); - LIB_FUNCTION("H61hE9pLBmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9exception); - LIB_FUNCTION("5jX3QET-Jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9time_base); - LIB_FUNCTION("WG7lrmFxyKY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9type_info); - LIB_FUNCTION("f5zmgYKSpIY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSt); - LIB_FUNCTION("mI0SR5s7kxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSv); - LIB_FUNCTION("UXS8VgAnIP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSw); - LIB_FUNCTION("N8KLCZc3Y1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSx); - LIB_FUNCTION("kfuINXyHayQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSy); - LIB_FUNCTION("0bGGr4zLE3w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSiD0Ev); - LIB_FUNCTION("+Uuj++A+I14", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSiD1Ev); - LIB_FUNCTION("QJJ-4Dgm8YQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSoD0Ev); - LIB_FUNCTION("kvqg376KsJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSoD1Ev); - LIB_FUNCTION("fjni7nkqJ4M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv116__enum_type_infoE); - LIB_FUNCTION("aMQhMoYipk4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv117__array_type_infoE); - LIB_FUNCTION("byV+FWlAnB4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv117__class_type_infoE); - LIB_FUNCTION("7EirbE7st4E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv117__pbase_type_infoE); - LIB_FUNCTION("aeHxLWwq0gQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv119__pointer_type_infoE); - LIB_FUNCTION("CSEjkTYt5dw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv120__function_type_infoE); - LIB_FUNCTION("pZ9WXcClPO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv120__si_class_type_infoE); - LIB_FUNCTION("9ByRMdo7ywg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv121__vmi_class_type_infoE); - LIB_FUNCTION("G4XM-SS1wxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv123__fundamental_type_infoE); - LIB_FUNCTION("2H51caHZU0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN10__cxxabiv129__pointer_to_member_type_infoE); - LIB_FUNCTION("WJU9B1OjRbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN6Dinkum7threads10lock_errorE); - LIB_FUNCTION("ouXHPXjKUL4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVN6Dinkum7threads21thread_resource_errorE); - LIB_FUNCTION("QGkJzBs3WmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVNSt6locale7_LocimpE); - LIB_FUNCTION("yLE5H3058Ao", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVNSt8ios_base7failureE); - LIB_FUNCTION("+8jItptyeQQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSi); - LIB_FUNCTION("qjyK90UVVCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSo); - LIB_FUNCTION("jRLwj8TLcQY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt10bad_typeid); - LIB_FUNCTION("XbFyGCk3G2s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt10moneypunctIcLb0EE); - LIB_FUNCTION("MfyPz2J5E0I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt10moneypunctIcLb1EE); - LIB_FUNCTION("RfpPDUaxVJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt10moneypunctIwLb0EE); - LIB_FUNCTION("APrAh-3-ICg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt10moneypunctIwLb1EE); - LIB_FUNCTION("udTM6Nxx-Ng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt11logic_error); - LIB_FUNCTION("RbzWN8X21hY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt11range_error); - LIB_FUNCTION("c-EfVOIbo8M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt11regex_error); - LIB_FUNCTION("apHKv46QaCw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt12bad_weak_ptr); - LIB_FUNCTION("oAidKrxuUv0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt12domain_error); - LIB_FUNCTION("6-LMlTS1nno", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt12future_error); - LIB_FUNCTION("cqvea9uWpvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt12length_error); - LIB_FUNCTION("n+aUKkC-3sI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt12out_of_range); - LIB_FUNCTION("Bq8m04PN1zw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt12system_error); - LIB_FUNCTION("Gvp-ypl9t5E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt13bad_exception); - LIB_FUNCTION("rSADYzp-RTU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt13basic_filebufIcSt11char_traitsIcEE); - LIB_FUNCTION("Tx5Y+BQJrzs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt13basic_filebufIwSt11char_traitsIwEE); - LIB_FUNCTION("-L+-8F0+gBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt13runtime_error); - LIB_FUNCTION("lF66NEAqanc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt14error_category); - LIB_FUNCTION("Azw9C8cy7FY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt14overflow_error); - LIB_FUNCTION("ZrFcJ-Ab0vw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt15underflow_error); - LIB_FUNCTION("keXoyW-rV-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt16invalid_argument); - LIB_FUNCTION("j6qwOi2Nb7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt16nested_exception); - LIB_FUNCTION("wuOrunkpIrU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt17bad_function_call); - LIB_FUNCTION("AZGKZIVok6U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt18bad_variant_access); - LIB_FUNCTION("Z+vcX3rnECg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt20bad_array_new_length); - LIB_FUNCTION("YHfG3-K23CY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt22_Future_error_category); - LIB_FUNCTION("qTwVlzGoViY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt22_System_error_category); - LIB_FUNCTION("UuVHsmfVOHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt23_Generic_error_category); - LIB_FUNCTION("CRoMIoZkYhU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt4_Pad); - LIB_FUNCTION("GKWcAz6-G7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt5ctypeIcE); - LIB_FUNCTION("qdHsu+gIxRo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt5ctypeIwE); - LIB_FUNCTION("6gAhNHCNHxY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7_MpunctIcE); - LIB_FUNCTION("+hlZqs-XpUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7_MpunctIwE); - LIB_FUNCTION("aK1Ymf-NhAs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7codecvtIcc9_MbstatetE); - LIB_FUNCTION("9H2BStEAAMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7codecvtIDic9_MbstatetE); - LIB_FUNCTION("jlNI3SSF41o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7codecvtIDsc9_MbstatetE); - LIB_FUNCTION("H-TDszhsYuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7codecvtIwc9_MbstatetE); - LIB_FUNCTION("ruZtIwbCFjk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7collateIcE); - LIB_FUNCTION("rZwUkaQ02J4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7collateIwE); - LIB_FUNCTION("tVHE+C8vGXk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8bad_cast); - LIB_FUNCTION("AJsqpbcCiwY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8ios_base); - LIB_FUNCTION("FnEnECMJGag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8messagesIcE); - LIB_FUNCTION("2FezsYwelgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8messagesIwE); - LIB_FUNCTION("lJnP-cn0cvQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8numpunctIcE); - LIB_FUNCTION("Gtsl8PUl40U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8numpunctIwE); - LIB_FUNCTION("EMNG6cHitlQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt9bad_alloc); - LIB_FUNCTION("dCzeFfg9WWI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt9exception); - LIB_FUNCTION("749AEdSd4Go", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt9type_info); - LIB_FUNCTION( - "jfq92K8E1Vc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); - LIB_FUNCTION( - "AoZRvn-vaq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEP7__sFILENS2_7_InitflEE7_Stinit); - LIB_FUNCTION("L1SBTkC+Cvw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_abort); - LIB_FUNCTION("SmYrO79NzeI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_abort_handler_s); - LIB_FUNCTION("DQXJraCc1rA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_alarm); - LIB_FUNCTION("2Btkg8k24Zg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_aligned_alloc); - LIB_FUNCTION("jT3xiGpA3B4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asctime); - LIB_FUNCTION("qPe7-h5Jnuc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asctime_s); - LIB_FUNCTION("HC8vbJStYVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_at_quick_exit); - LIB_FUNCTION("8G2LB+A3rzg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atexit); - LIB_FUNCTION("SRI6S9B+-a4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atof); - LIB_FUNCTION("fPxypibz2MY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atoi); - LIB_FUNCTION("+my9jdHCMIQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atol); - LIB_FUNCTION("fLcU5G6Qrjs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atoll); - LIB_FUNCTION("rg5JEBlKCuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_basename); - LIB_FUNCTION("vsK6LzRtRLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_basename_r); - LIB_FUNCTION("5TjaJwkLWxE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_bcmp); - LIB_FUNCTION("RMo7j0iTPfA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_bcopy); - LIB_FUNCTION("NesIgTmfF0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_bsearch); - LIB_FUNCTION("hzX87C+zDAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_bsearch_s); - LIB_FUNCTION("LEvm25Sxi7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_btowc); - LIB_FUNCTION("9oiX1kyeedA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_bzero); - LIB_FUNCTION("EOLQfNZ9HpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_c16rtomb); - LIB_FUNCTION("MzsycG6RYto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_c32rtomb); - LIB_FUNCTION("2X5agFjKxMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_calloc); - LIB_FUNCTION("5ZkEP3Rq7As", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cbrt); - LIB_FUNCTION("GlelR9EEeck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_cbrtf); - LIB_FUNCTION("lO01m-JcDqM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_cbrtl); - LIB_FUNCTION("St9nbxSoezk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_clearerr); - LIB_FUNCTION("cYNk9M+7YkY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_clearerr_unlocked); - LIB_FUNCTION("QZP6I9ZZxpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_clock); - LIB_FUNCTION("n8onIBR4Qdk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_clock_1700); - LIB_FUNCTION("XepdqehVYe4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_closedir); - LIB_FUNCTION("BEFy1ZFv8Fw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_copysign); - LIB_FUNCTION("x-04iOzl1xs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_copysignf); - LIB_FUNCTION("j84nSG4V0B0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_copysignl); - LIB_FUNCTION("0uAUs3hYuG4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ctime); - LIB_FUNCTION("2UFh+YKfuzk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ctime_s); - LIB_FUNCTION("Wn6I3wVATUE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_daemon); - LIB_FUNCTION("tOicWgmk4ZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_daylight); - LIB_FUNCTION("fqLrWSWcGHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_devname); - LIB_FUNCTION("BIALMFTZ75I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_devname_r); - LIB_FUNCTION("-VVn74ZyhEs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_difftime); - LIB_FUNCTION("E4wZaG1zSFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_dirname); - LIB_FUNCTION("2gbcltk3swE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_div); - LIB_FUNCTION("WIg11rA+MRY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_drand48); - LIB_FUNCTION("5OpjqFs8yv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_drem); - LIB_FUNCTION("Gt5RT417EGA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_dremf); - LIB_FUNCTION("Fncgcl1tnXg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_erand48); - LIB_FUNCTION("oXgaqGVnW5o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erf); - LIB_FUNCTION("arIKLlen2sg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erfc); - LIB_FUNCTION("IvF98yl5u4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_erfcf); - LIB_FUNCTION("f2YbMj0gBf8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_erfcl); - LIB_FUNCTION("RePA3bDBJqo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erff); - LIB_FUNCTION("fNH4tsl7rB8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_erfl); - LIB_FUNCTION("aeeMZ0XrNsY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_err); - LIB_FUNCTION("9aODPZAKOmA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_err_set_exit); - LIB_FUNCTION("FihG2CudUNs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_err_set_file); - LIB_FUNCTION("L-jLYJFP9Mc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_errc); - LIB_FUNCTION("t8sFCgJAClE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_errx); - LIB_FUNCTION("uMei1W9uyNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exit); - LIB_FUNCTION("uodLYyUip20", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fclose); - LIB_FUNCTION("cBSM-YB7JVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fcloseall); - LIB_FUNCTION("Zs4p6RemDxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fdim); - LIB_FUNCTION("yb9iUBPkSS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fdimf); - LIB_FUNCTION("IMt+UO5YoQI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fdiml); - LIB_FUNCTION("qdlHjTa9hQ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fdopen); - LIB_FUNCTION("j+XjoRSIvwU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fdopendir); - LIB_FUNCTION("cqt8emEH3kQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_feclearexcept); - LIB_FUNCTION("y4WlO8qzHqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fedisableexcept); - LIB_FUNCTION("utLW7uXm3Ss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_feenableexcept); - LIB_FUNCTION("psx0YiAKm7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fegetenv); - LIB_FUNCTION("VtRkfsD292M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fegetexcept); - LIB_FUNCTION("myQDQapYJdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fegetexceptflag); - LIB_FUNCTION("AeZTCCm1Qqc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fegetround); - LIB_FUNCTION("P38JvXuK-uE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fegettrapenable); - LIB_FUNCTION("1kduKXMqx7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_feholdexcept); - LIB_FUNCTION("LxcEU+ICu8U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_feof); - LIB_FUNCTION("NuydofHcR1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_feof_unlocked); - LIB_FUNCTION("NIfFNcyeCTo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_feraiseexcept); - LIB_FUNCTION("AHxyhN96dy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ferror); - LIB_FUNCTION("yxbGzBQC5xA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ferror_unlocked); - LIB_FUNCTION("Q-bLp+b-RVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fesetenv); - LIB_FUNCTION("FuxaUZsWTok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fesetexceptflag); - LIB_FUNCTION("hAJZ7-FBpEQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fesetround); - LIB_FUNCTION("u5a7Ofymqlg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fesettrapenable); - LIB_FUNCTION("pVjisbvtQKU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fetestexcept); - LIB_FUNCTION("YXQ4gXamCrY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_feupdateenv); - LIB_FUNCTION("MUjC4lbHrK4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fflush); - LIB_FUNCTION("AEuF3F2f8TA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fgetc); - LIB_FUNCTION("KKgUiHSYGRE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fgetln); - LIB_FUNCTION("SHlt7EhOtqA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fgetpos); - LIB_FUNCTION("KdP-nULpuGw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fgets); - LIB_FUNCTION("bzbQ5zQ2Y3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fgetwc); - LIB_FUNCTION("F81hKe2k2tg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fgetws); - LIB_FUNCTION("Fm-dmyywH9Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fileno); - LIB_FUNCTION("kxm0z4T5mMI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fileno_unlocked); - LIB_FUNCTION("TJFQFm+W3wg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_finite); - LIB_FUNCTION("2nqzJ87zsB8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_finitef); - LIB_FUNCTION("hGljHZEfF0U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_flockfile); - LIB_FUNCTION("G3qjOUu7KnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_flsl); - LIB_FUNCTION("YKbL5KR6RDI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fma); - LIB_FUNCTION("RpTR+VY15ss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmaf); - LIB_FUNCTION("uMeLdbwheag", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmal); - LIB_FUNCTION("xeYO4u7uyJ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fopen); - LIB_FUNCTION("NL836gOLANs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fopen_s); - LIB_FUNCTION("y1Ch2nXs4IQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fpurge); - LIB_FUNCTION("aZK8lNei-Qw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fputc); - LIB_FUNCTION("QrZZdJ8XsX0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fputs); - LIB_FUNCTION("1QJWxoB6pCo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fputwc); - LIB_FUNCTION("-7nRJFXMxnM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fputws); - LIB_FUNCTION("lbB+UlZqVG0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fread); - LIB_FUNCTION("N2OjwJJGjeQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_freeifaddrs); - LIB_FUNCTION("gkWgn0p1AfU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_freopen); - LIB_FUNCTION("NdvAi34vV3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_freopen_s); - LIB_FUNCTION("rQFVBXp-Cxg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fseek); - LIB_FUNCTION("pkYiKw09PRA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fseeko); - LIB_FUNCTION("7PkSz+qnTto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fsetpos); - LIB_FUNCTION("6IM2up2+a-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fstatvfs); - LIB_FUNCTION("Qazy8LmXTvw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ftell); - LIB_FUNCTION("5qP1iVQkdck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ftello); - LIB_FUNCTION("h05OHOMZNMw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ftrylockfile); - LIB_FUNCTION("vAc9y8UQ31o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_funlockfile); - LIB_FUNCTION("w6Aq68dFoP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fwide); - LIB_FUNCTION("MpxhMh8QFro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fwrite); - LIB_FUNCTION("BD-xV2fLe2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gamma); - LIB_FUNCTION("q+AdV-EHiKc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gamma_r); - LIB_FUNCTION("sZ93QMbGRJY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gammaf); - LIB_FUNCTION("E3RYvWbYLgk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gammaf_r); - LIB_FUNCTION("8Q60JLJ6Rv4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_getc); - LIB_FUNCTION("5tM252Rs2fc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getc_unlocked); - LIB_FUNCTION("L3XZiuKqZUM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getchar); - LIB_FUNCTION("H0pVDvSuAVQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getchar_unlocked); - LIB_FUNCTION("DYivN1nO-JQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getcwd); - LIB_FUNCTION("smbQukfxYJM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getenv); - LIB_FUNCTION("-nvxBWa0iDs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gethostname); - LIB_FUNCTION("j-gWL6wDros", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getifaddrs); - LIB_FUNCTION("VUtibKJCt1o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getopt); - LIB_FUNCTION("8VVXJxB5nlk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getopt_long); - LIB_FUNCTION("oths6jEyBqo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getopt_long_only); - LIB_FUNCTION("7Psx1DlAyE4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getprogname); - LIB_FUNCTION("Ok+SYcoL19Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_gets); - LIB_FUNCTION("lb+HLLZkbbw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gets_s); - LIB_FUNCTION("AoLA2MRWJvc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_getw); - LIB_FUNCTION("CosTELN5ETk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getwc); - LIB_FUNCTION("n2mWDsholo8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_getwchar); - LIB_FUNCTION("1mecP7RgI2A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gmtime); - LIB_FUNCTION("5bBacGLyLOs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_gmtime_s); - LIB_FUNCTION("YFoOw5GkkK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_hypot); - LIB_FUNCTION("2HzgScoQq9o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_hypot3); - LIB_FUNCTION("xlRcc7Rcqgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_hypot3f); - LIB_FUNCTION("aDmly36AAgI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_hypot3l); - LIB_FUNCTION("iz2shAGFIxc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_hypotf); - LIB_FUNCTION("jJC7x18ge8k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_hypotl); - LIB_FUNCTION("ODGONXcSmz4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ignore_handler_s); - LIB_FUNCTION("t3RFHn0bTPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_index); - LIB_FUNCTION("sBBuXmJ5Kjk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_inet_addr); - LIB_FUNCTION("ISTLytNGT0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_inet_aton); - LIB_FUNCTION("7iTp7O6VOXQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_inet_ntoa); - LIB_FUNCTION("i3E1Ywn4t+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_inet_ntoa_r); - LIB_FUNCTION("IIUY-5hk-4k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_initstate); - LIB_FUNCTION("4uJJNi+C9wk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isalnum); - LIB_FUNCTION("+xU0WKT8mDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isalpha); - LIB_FUNCTION("lhnrCOBiTGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isblank); - LIB_FUNCTION("akpGErA1zdg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iscntrl); - LIB_FUNCTION("JWBr5N8zyNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isdigit); - LIB_FUNCTION("rrgxakQtvc0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isgraph); - LIB_FUNCTION("eGkOpTojJl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isprint); - LIB_FUNCTION("I6Z-684E2C4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ispunct); - LIB_FUNCTION("wazw2x2m3DQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isspace); - LIB_FUNCTION("wDmL2EH0CBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswalnum); - LIB_FUNCTION("D-qDARDb1aM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswalpha); - LIB_FUNCTION("p6DbM0OAHNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswblank); - LIB_FUNCTION("6A+1YZ79qFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswcntrl); - LIB_FUNCTION("45E7omS0vvc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswctype); - LIB_FUNCTION("n0kT+8Eeizs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswdigit); - LIB_FUNCTION("wjG0GyCyaP0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswgraph); - LIB_FUNCTION("Ok8KPy3nFls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswlower); - LIB_FUNCTION("U7IhU4VEB-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswprint); - LIB_FUNCTION("AEPvEZkaLsU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswpunct); - LIB_FUNCTION("vqtytrxgLMs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswspace); - LIB_FUNCTION("1QcrrL9UDRQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswupper); - LIB_FUNCTION("cjmSjRlnMAs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_iswxdigit); - LIB_FUNCTION("srzSVSbKn7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isxdigit); - LIB_FUNCTION("tcN0ngcXegg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j0); - LIB_FUNCTION("RmE3aE8WHuY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j0f); - LIB_FUNCTION("BNbWdC9Jg+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j1); - LIB_FUNCTION("uVXcivvVHzU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_j1f); - LIB_FUNCTION("QdE7Arjzxos", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_jn); - LIB_FUNCTION("M5KJmq-gKM8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_jnf); - LIB_FUNCTION("M7KmRg9CERk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_jrand48); - LIB_FUNCTION("xzZiQgReRGE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_labs); - LIB_FUNCTION("wTjDJ6In3Cg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lcong48); - LIB_FUNCTION("JrwFIMzKNr0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ldexp); - LIB_FUNCTION("kn0yiYeExgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ldexpf); - LIB_FUNCTION("aX8H2+BBlWE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ldexpl); - LIB_FUNCTION("gfP0im5Z3g0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_ldiv); - LIB_FUNCTION("o-kMHRBvkbQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lgamma); - LIB_FUNCTION("EjL+gY1G2lk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lgamma_r); - LIB_FUNCTION("i-ifjh3SLBU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lgammaf); - LIB_FUNCTION("RlGUiqyKf9I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lgammaf_r); - LIB_FUNCTION("lPYpsOb9s-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lgammal); - LIB_FUNCTION("rHRr+131ATY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_llabs); - LIB_FUNCTION("iVhJZvAO2aQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lldiv); - LIB_FUNCTION("-431A-YBAks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_llrint); - LIB_FUNCTION("KPsQA0pis8o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_llrintf); - LIB_FUNCTION("6bRANWNYID0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_llrintl); - LIB_FUNCTION("w-BvXF4O6xo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_llround); - LIB_FUNCTION("eQhBFnTOp40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_llroundf); - LIB_FUNCTION("wRs5S54zjm0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_llroundl); - LIB_FUNCTION("0hlfW1O4Aa4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_localeconv); - LIB_FUNCTION("efhK-YSUYYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_localtime); - LIB_FUNCTION("fiiNDnNBKVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_localtime_s); - LIB_FUNCTION("lKEN2IebgJ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_longjmp); - LIB_FUNCTION("5IpoNfxu84U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lrand48); - LIB_FUNCTION("VOKOgR7L-2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lrint); - LIB_FUNCTION("rcVv5ivMhY0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lrintf); - LIB_FUNCTION("jp2e+RSrcow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lrintl); - LIB_FUNCTION("GipcbdDM5cI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_makecontext); - LIB_FUNCTION("hew0fReI2H0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mblen); - LIB_FUNCTION("j6OnScWpu7k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbrlen); - LIB_FUNCTION("ogPDBoLmCcA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbrtoc16); - LIB_FUNCTION("TEd4egxRmdE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbrtoc32); - LIB_FUNCTION("qVHpv0PxouI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbrtowc); - LIB_FUNCTION("UbnVmck+o10", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbsinit); - LIB_FUNCTION("8hygs6D9KBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbsrtowcs); - LIB_FUNCTION("1NFvAuzw8dA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbsrtowcs_s); - LIB_FUNCTION("VUzjXknPPBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbstowcs); - LIB_FUNCTION("tdcAqgCS+uI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbstowcs_s); - LIB_FUNCTION("6eU9xX9oEdQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mbtowc); - LIB_FUNCTION("HWEOv0+n7cU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mergesort); - LIB_FUNCTION("n7AepwR0s34", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mktime); - LIB_FUNCTION("0WMHDb5Dt94", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_modf); - LIB_FUNCTION("3+UPM-9E6xY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_modff); - LIB_FUNCTION("tG8pGyxdLEs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_modfl); - LIB_FUNCTION("k-l0Jth-Go8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_mrand48); - LIB_FUNCTION("cJLTwtKGXJk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nearbyint); - LIB_FUNCTION("c+4r-T-tEIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nearbyintf); - LIB_FUNCTION("6n23e0gIJ9s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nearbyintl); - LIB_FUNCTION("ZT4ODD2Ts9o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_Need_sceLibcInternal); - LIB_FUNCTION("h+J60RRlfnk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nextafter); - LIB_FUNCTION("3m2ro+Di+Ck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nextafterf); - LIB_FUNCTION("R0-hvihVoy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nextafterl); - LIB_FUNCTION("-Q6FYBO4sn0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nexttoward); - LIB_FUNCTION("QaTrhMKUT18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nexttowardf); - LIB_FUNCTION("ryyn6-WJm6U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nexttowardl); - LIB_FUNCTION("3wcYIMz8LUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_nrand48); - LIB_FUNCTION("ay3uROQAc5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_opendir); - LIB_FUNCTION("zG0BNJOZdm4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_optarg); - LIB_FUNCTION("yaFXXViLWPw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_opterr); - LIB_FUNCTION("zCnSJWp-Qj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_optind); - LIB_FUNCTION("FwzVaZ8Vnus", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_optopt); - LIB_FUNCTION("CZNm+oNmB-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_optreset); - LIB_FUNCTION("EMutwaQ34Jo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_perror); - LIB_FUNCTION("3Nr9caNHhyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawn); - LIB_FUNCTION("Heh4KJwyoX8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawn_file_actions_addclose); - LIB_FUNCTION("LG6O0oW9bQU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawn_file_actions_adddup2); - LIB_FUNCTION("Sj7y+JO5PcM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawn_file_actions_addopen); - LIB_FUNCTION("Ud8CbISKRGM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawn_file_actions_destroy); - LIB_FUNCTION("p--TkNVsXjA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawn_file_actions_init); - LIB_FUNCTION("Hq9-2AMG+ks", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_destroy); - LIB_FUNCTION("7BGUDQDJu-A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_getflags); - LIB_FUNCTION("Q-GfRQNi66I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_getpgroup); - LIB_FUNCTION("jbgqYhmVEGY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_getschedparam); - LIB_FUNCTION("KUYSaO1qv0Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_getschedpolicy); - LIB_FUNCTION("7pASQ1hhH00", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_getsigdefault); - LIB_FUNCTION("wvqDod5pVZg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_getsigmask); - LIB_FUNCTION("44hlATrd47U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_init); - LIB_FUNCTION("UV4m0bznVtU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_setflags); - LIB_FUNCTION("aPDKI3J8PqI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_setpgroup); - LIB_FUNCTION("SFlW4kqPgU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_setschedparam); - LIB_FUNCTION("fBne7gcou0s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_setschedpolicy); - LIB_FUNCTION("Ani6e+T-y6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_setsigdefault); - LIB_FUNCTION("wCavZQ+m1PA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnattr_setsigmask); - LIB_FUNCTION("IUfBO5UIZNc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_spawnp); - LIB_FUNCTION("tjuEJo1obls", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_psignal); - LIB_FUNCTION("tLB5+4TEOK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_putc); - LIB_FUNCTION("H-QeERgWuTM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_putc_unlocked); - LIB_FUNCTION("m5wN+SwZOR4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_putchar); - LIB_FUNCTION("v95AEAzqm+0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_putchar_unlocked); - LIB_FUNCTION("t1ytXodWUH0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_putenv); - LIB_FUNCTION("YQ0navp+YIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_puts); - LIB_FUNCTION("DwcWtj3tSPA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_putw); - LIB_FUNCTION("UZJnC81pUCw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_putwc); - LIB_FUNCTION("aW9KhGC4cOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_putwchar); - LIB_FUNCTION("AEJdIVZTEmo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_qsort); - LIB_FUNCTION("G7yOZJObV+4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_qsort_s); - LIB_FUNCTION("qdGFBoLVNKI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_quick_exit); - LIB_FUNCTION("cpCOXWMgha0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_rand); - LIB_FUNCTION("dW3xsu3EgFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_rand_r); - LIB_FUNCTION("w1o05aHJT4c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_random); - LIB_FUNCTION("lybyyKtP54c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_readdir); - LIB_FUNCTION("J0kng1yac3M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_readdir_r); - LIB_FUNCTION("vhtcIgZG-Lk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_realpath); - LIB_FUNCTION("eS+MVq+Lltw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_remainderf); - LIB_FUNCTION("MvdnffYU3jg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_remainderl); - LIB_FUNCTION("MZO7FXyAPU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_remove); - LIB_FUNCTION("XI0YDgH8x1c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_remquo); - LIB_FUNCTION("AqpZU2Njrmk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_remquof); - LIB_FUNCTION("Fwow0yyW0nI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_remquol); - LIB_FUNCTION("3QIPIh-GDjw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_rewind); - LIB_FUNCTION("kCKHi6JYtmM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_rewinddir); - LIB_FUNCTION("CWiqHSTO5hk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_rindex); - LIB_FUNCTION("LxGIYYKwKYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_rint); - LIB_FUNCTION("q5WzucyVSkM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_rintf); - LIB_FUNCTION("Yy5yMiZHBIc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_rintl); - LIB_FUNCTION("nlaojL9hDtA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_round); - LIB_FUNCTION("DDHG1a6+3q0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_roundf); - LIB_FUNCTION("8F1ctQaP0uk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_roundl); - LIB_FUNCTION("HI4N2S6ZWpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalb); - LIB_FUNCTION("rjak2Xm+4mE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalbf); - LIB_FUNCTION("7Jp3g-qTgZw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalbln); - LIB_FUNCTION("S6LHwvK4h8c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalblnf); - LIB_FUNCTION("NFxDIuqfmgw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalblnl); - LIB_FUNCTION("KGKBeVcqJjc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalbn); - LIB_FUNCTION("9fs1btfLoUs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalbnf); - LIB_FUNCTION("l3fh3QW0Tss", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scalbnl); - LIB_FUNCTION("aqqpmI7-1j0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcDebugOut); - LIB_FUNCTION("Sj3fKG7MwMk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcHeapGetAddressRanges); - LIB_FUNCTION("HFtbbWvBO+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcHeapMutexCalloc); - LIB_FUNCTION("jJKMkpqQr7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcHeapMutexFree); - LIB_FUNCTION("4iOzclpv1M0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcHeapSetAddressRangeCallback); - LIB_FUNCTION("M6qiY0nhk54", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcHeapSetTraceMarker); - LIB_FUNCTION("RlhJVAYLSqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcHeapUnsetTraceMarker); - LIB_FUNCTION("YrL-1y6vfyo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcInternalMemoryGetWakeAddr); - LIB_FUNCTION("h8jq9ee4h5c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcInternalMemoryMutexEnable); - LIB_FUNCTION("LXqt47GvaRA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcInternalSetMallocCallback); - LIB_FUNCTION("HmgKoOWpUc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sceLibcOnce); - LIB_FUNCTION("2g5wco7AAHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_seed48); - LIB_FUNCTION("7WoI+lVawlc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_seekdir); - LIB_FUNCTION("ENLfKJEZTjE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_set_constraint_handler_s); - LIB_FUNCTION("vZMcAfsA31I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_setbuf); - LIB_FUNCTION("M4YYbSFfJ8g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_setenv); - LIB_FUNCTION("gNQ1V2vfXDE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_setjmp); - LIB_FUNCTION("PtsB1Q9wsFA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_setlocale); - LIB_FUNCTION("woQta4WRpk0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_setstate); - LIB_FUNCTION("QMFyLoqNxIg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_setvbuf); - LIB_FUNCTION("Bm3k7JQMN5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sigblock); - LIB_FUNCTION("TsrS8nGDQok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_siginterrupt); - LIB_FUNCTION("SQGxZCv3aYk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_signalcontext); - LIB_FUNCTION("5gOOC0kzW0c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_signgam); - LIB_FUNCTION("Az3tTyAy380", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_significand); - LIB_FUNCTION("L2YaHYQdmHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_significandf); - LIB_FUNCTION("cJvOg1KV8uc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sigsetmask); - LIB_FUNCTION("yhxKO9LYc8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sigvec); - LIB_FUNCTION("+KSnjvZ0NMc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_srand48); - LIB_FUNCTION("sPC7XE6hfFY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_srandom); - LIB_FUNCTION("a2MOZf++Wjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_srandomdev); - LIB_FUNCTION("ayTeobcoGj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_statvfs); - LIB_FUNCTION("+CUrIMpVuaM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_stderr); - LIB_FUNCTION("omQZ36ESr98", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_stdin); - LIB_FUNCTION("3eGXiXpFLt0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_stdout); - LIB_FUNCTION("ZSnX-xZBGCg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_stpcpy); - LIB_FUNCTION("ZD+Dp+-LsGg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sys_nsig); - LIB_FUNCTION("yCdGspbNHZ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sys_siglist); - LIB_FUNCTION("Y16fu+FC+3Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sys_signame); - LIB_FUNCTION("UNS2V4S097M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_syslog); - LIB_FUNCTION("RZA5RZawY04", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_telldir); - LIB_FUNCTION("b7J3q7-UABY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tgamma); - LIB_FUNCTION("B2ZbqV9geCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tgammaf); - LIB_FUNCTION("FU03r76UxaU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tgammal); - LIB_FUNCTION("wLlFkwG9UcQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_time); - LIB_FUNCTION("-Oet9AHzwtU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_timezone); - LIB_FUNCTION("PqF+kHW-2WQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tolower); - LIB_FUNCTION("TYE4irxSmko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_toupper); - LIB_FUNCTION("BEKIcbCV-MU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_towctrans); - LIB_FUNCTION("J3J1T9fjUik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_towlower); - LIB_FUNCTION("1uf1SQsj5go", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_towupper); - LIB_FUNCTION("a4gLGspPEDM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_trunc); - LIB_FUNCTION("Vo8rvWtZw3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_truncf); - LIB_FUNCTION("apdxz6cLMh8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_truncl); - LIB_FUNCTION("BAYjQubSZT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tzname); - LIB_FUNCTION("gYFKAMoNEfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tzset); - LIB_FUNCTION("-LFO7jhD5CE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ungetc); - LIB_FUNCTION("Nz7J62MvgQs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ungetwc); - LIB_FUNCTION("CRJcH8CnPSI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_unsetenv); - LIB_FUNCTION("1nTKA7pN1jw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_utime); - LIB_FUNCTION("aoTkxU86Mr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_verr); - LIB_FUNCTION("7Pc0nOTw8po", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_verrc); - LIB_FUNCTION("ItC2hTrYvHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_verrx); - LIB_FUNCTION("zxecOOffO68", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsyslog); - LIB_FUNCTION("s67G-KeDKOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vwarn); - LIB_FUNCTION("BfAsxVvQVTQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vwarnc); - LIB_FUNCTION("iH+oMJn8YPk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vwarnx); - LIB_FUNCTION("3Rhy2gXDhwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_warn); - LIB_FUNCTION("AqUBdZqHZi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_warnc); - LIB_FUNCTION("aNJaYyn0Ujo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_warnx); - LIB_FUNCTION("y9OoA+P5cjk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcrtomb); - LIB_FUNCTION("oAlR5z2iiCA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcrtomb_s); - LIB_FUNCTION("KZm8HUIX2Rw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcscat); - LIB_FUNCTION("MqeMaVUiyU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcscat_s); - LIB_FUNCTION("Ezzq78ZgHPs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcschr); - LIB_FUNCTION("pNtJdE3x49E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcscmp); - LIB_FUNCTION("fV2xHER+bKE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcscoll); - LIB_FUNCTION("FM5NPnLqBc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcscpy); - LIB_FUNCTION("6f5f-qx4ucA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcscpy_s); - LIB_FUNCTION("7eNus40aGuk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcscspn); - LIB_FUNCTION("XbVXpf5WF28", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsftime); - LIB_FUNCTION("WkkeywLJcgU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcslen); - LIB_FUNCTION("pA9N3VIgEZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsncat); - LIB_FUNCTION("VxG0990tP3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsncat_s); - LIB_FUNCTION("E8wCoUEbfzk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsncmp); - LIB_FUNCTION("0nV21JjYCH8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsncpy); - LIB_FUNCTION("Slmz4HMpNGs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsncpy_s); - LIB_FUNCTION("K+v+cnmGoH4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsnlen_s); - LIB_FUNCTION("H4MCONF+Gps", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcspbrk); - LIB_FUNCTION("g3ShSirD50I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsrchr); - LIB_FUNCTION("sOOMlZoy1pg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsrtombs); - LIB_FUNCTION("79s2tnYQI6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsrtombs_s); - LIB_FUNCTION("x9uumWcxhXU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsspn); - LIB_FUNCTION("7-a7sBHeUQ8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstod); - LIB_FUNCTION("7SXNu+0KBYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstof); - LIB_FUNCTION("ljFisaQPwYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstoimax); - LIB_FUNCTION("8ngzWNZzFJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstok); - LIB_FUNCTION("dsXnVxORFdc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstok_s); - LIB_FUNCTION("d3dMyWORw8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstol); - LIB_FUNCTION("LEbYWl9rBc8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstold); - LIB_FUNCTION("34nH7v2xvNQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstoll); - LIB_FUNCTION("v7S7LhP2OJc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstombs); - LIB_FUNCTION("sZLrjx-yEx4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstombs_s); - LIB_FUNCTION("5AYcEn7aoro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstoul); - LIB_FUNCTION("DAbZ-Vfu6lQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstoull); - LIB_FUNCTION("1e-q5iIukH8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcstoumax); - LIB_FUNCTION("VuMMb5CfpEw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsxfrm); - LIB_FUNCTION("CL7VJxznu6g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wctob); - LIB_FUNCTION("7PxmvOEX3oc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wctomb); - LIB_FUNCTION("y3V0bIq38NE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wctomb_s); - LIB_FUNCTION("seyrqIc4ovc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wctrans); - LIB_FUNCTION("+3PtYiUxl-U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wctype); - LIB_FUNCTION("inwDBwEvw18", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_xtime_get); - LIB_FUNCTION("RvsFE8j3C38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y0); - LIB_FUNCTION("+tfKv1vt0QQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y0f); - LIB_FUNCTION("vh9aGR3ALP0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y1); - LIB_FUNCTION("gklG+J87Pq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_y1f); - LIB_FUNCTION("eWSt5lscApo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_yn); - LIB_FUNCTION("wdPaII721tY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_ynf); - LIB_FUNCTION("GG6441JdYkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_Func_186EB8E3525D6240); - LIB_FUNCTION("QZ9YgTk+yrE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_Func_419F5881393ECAB1); - LIB_FUNCTION("bGuDd3kWVKQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_Func_6C6B8377791654A4); - LIB_FUNCTION("f9LVyN8Ky8g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_Func_7FD2D5C8DF0ACBC8); - LIB_FUNCTION("wUqJ0psUjDo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_Func_C14A89D29B148C3A); -}; - + RegisterlibSceLibcInternalMemory(sym); + RegisterlibSceLibcInternalIo(sym); +} } // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_io.cpp b/src/core/libraries/libc_internal/libc_internal_io.cpp index 82ff08d50..8814fda28 100644 --- a/src/core/libraries/libc_internal/libc_internal_io.cpp +++ b/src/core/libraries/libc_internal/libc_internal_io.cpp @@ -4,469 +4,21 @@ #include #include +#include #include "common/assert.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "libc_internal_io.h" +#include "printf.h" namespace Libraries::LibcInternal { - -s32 PS4_SYSV_ABI internal___vfprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI internal_snprintf(char* s, size_t n, VA_ARGS) { + VA_CTX(ctx); + return snprintf_ctx(s, n, &ctx); } - -s32 PS4_SYSV_ABI internal__Printf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WPrintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_asprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fwprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fwprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_printf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_printf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_snprintf(char* s, size_t n, const char* format, ...) { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_snprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_snwprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_swprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_swprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_swscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_swscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vasprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfwprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfwprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfwscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vfwscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vprintf(const char* format, va_list args) { - // Copy the va_list because vsnprintf consumes it - va_list args_copy; - va_copy(args_copy, args); - - // Calculate the required buffer size - int size = std::vsnprintf(nullptr, 0, format, args_copy); - va_end(args_copy); - - if (size < 0) { - // Handle vsnprintf error - LOG_ERROR(Lib_LibcInternal, "vsnprintf failed to calculate size"); - return size; - } - - // Create a string with the required size - std::string buffer(size, '\0'); - - // Format the string into the buffer - int result = - std::vsnprintf(buffer.data(), buffer.size() + 1, format, args); // +1 for null terminator - if (result >= 0) { - // Log the formatted result - LOG_INFO(Lib_LibcInternal, "{}", buffer); - } else { - LOG_ERROR(Lib_LibcInternal, "vsnprintf failed during formatting"); - } - - return result; -} - -s32 PS4_SYSV_ABI internal_vprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsnprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsnprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsnwprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vsscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vswprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vswprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vswscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vswscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vwprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vwprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vwscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_vwscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wprintf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wprintf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Scanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__WScanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fwscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fwscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_scanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sscanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_sscanf_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - void RegisterlibSceLibcInternalIo(Core::Loader::SymbolsResolver* sym) { - - LIB_FUNCTION("yAZ5vOpmBus", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal___vfprintf); - LIB_FUNCTION("FModQzwn1-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Printf); - LIB_FUNCTION("kvEP5-KOG1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WPrintf); - LIB_FUNCTION("cOYia2dE0Ik", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asprintf); - LIB_FUNCTION("fffwELXNVFA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fprintf); - LIB_FUNCTION("-e-F9HjUFp8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fprintf_s); - LIB_FUNCTION("ZRAcn3dPVmA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fwprintf); - LIB_FUNCTION("9kOFELic7Pk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fwprintf_s); - LIB_FUNCTION("a6CYO8YOzfw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fwscanf); - LIB_FUNCTION("Bo5wtXSj4kc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fwscanf_s); - LIB_FUNCTION("hcuQgD53UxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_printf); - LIB_FUNCTION("w1NxRBQqfmQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_printf_s); LIB_FUNCTION("eLdDw6l0-bU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_snprintf); - LIB_FUNCTION("3BytPOQgVKc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_snprintf_s); - LIB_FUNCTION("jbj2wBoiCyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_snwprintf_s); - LIB_FUNCTION("tcVi5SivF7Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sprintf); - LIB_FUNCTION("xEszJVGpybs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sprintf_s); - LIB_FUNCTION("1Pk0qZQGeWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sscanf); - LIB_FUNCTION("24m4Z4bUaoY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sscanf_s); - LIB_FUNCTION("nJz16JE1txM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_swprintf); - LIB_FUNCTION("Im55VJ-Bekc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_swprintf_s); - LIB_FUNCTION("HNnWdT43ues", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_swscanf); - LIB_FUNCTION("tQNolUV1q5A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_swscanf_s); - LIB_FUNCTION("qjBlw2cVMAM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vasprintf); - LIB_FUNCTION("pDBDcY6uLSA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfprintf); - LIB_FUNCTION("GhTZtaodo7o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfprintf_s); - LIB_FUNCTION("lckWSkHDBrY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfscanf); - LIB_FUNCTION("JjPXy-HX5dY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfscanf_s); - LIB_FUNCTION("M2bGWSqt764", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfwprintf); - LIB_FUNCTION("XX9KWzJvRf0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfwprintf_s); - LIB_FUNCTION("WF4fBmip+38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfwscanf); - LIB_FUNCTION("Wvm90I-TGl0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vfwscanf_s); - LIB_FUNCTION("GMpvxPFW924", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vprintf); - LIB_FUNCTION("YfJUGNPkbK4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vprintf_s); - LIB_FUNCTION("j7Jk3yd3yC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vscanf); - LIB_FUNCTION("fQYpcUzy3zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vscanf_s); - LIB_FUNCTION("Q2V+iqvjgC0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsnprintf); - LIB_FUNCTION("rWSuTWY2JN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsnprintf_s); - LIB_FUNCTION("8SKVXgeK1wY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsnwprintf_s); - LIB_FUNCTION("jbz9I9vkqkk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsprintf); - LIB_FUNCTION("+qitMEbkSWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsprintf_s); - LIB_FUNCTION("UTrpOVLcoOA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsscanf); - LIB_FUNCTION("tfNbpqL3D0M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vsscanf_s); - LIB_FUNCTION("u0XOsuOmOzc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vswprintf); - LIB_FUNCTION("oDoV9tyHTbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vswprintf_s); - LIB_FUNCTION("KGotca3AjYw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vswscanf); - LIB_FUNCTION("39HHkIWrWNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vswscanf_s); - LIB_FUNCTION("QuF2rZGE-v8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vwprintf); - LIB_FUNCTION("XPrliF5n-ww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vwprintf_s); - LIB_FUNCTION("QNwdOK7HfJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vwscanf); - LIB_FUNCTION("YgZ6qvFH3QI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_vwscanf_s); - LIB_FUNCTION("OGVdXU3E-xg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wprintf); - LIB_FUNCTION("FEtOJURNey0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wprintf_s); - LIB_FUNCTION("D8JBAR3RiZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wscanf); - LIB_FUNCTION("RV7X3FrWfTI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wscanf_s); - LIB_FUNCTION("s+MeMHbB1Ro", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Scanf); - LIB_FUNCTION("fzgkSILqRHE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__WScanf); - LIB_FUNCTION("npLpPTaSuHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fscanf); - LIB_FUNCTION("vj2WUi2LrfE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fscanf_s); - LIB_FUNCTION("7XEv6NnznWw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scanf); - LIB_FUNCTION("-B76wP6IeVA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_scanf_s); } - -} // namespace Libraries::LibcInternal +} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_math.cpp b/src/core/libraries/libc_internal/libc_internal_math.cpp index 17f971d26..5a33c0992 100644 --- a/src/core/libraries/libc_internal/libc_internal_math.cpp +++ b/src/core/libraries/libc_internal/libc_internal_math.cpp @@ -5,769 +5,152 @@ #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" -#include "libc_internal_mspace.h" namespace Libraries::LibcInternal { -s32 PS4_SYSV_ABI internal_abs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +double PS4_SYSV_ABI internal_sin(double x) { + return std::sin(x); } -double PS4_SYSV_ABI internal_acos(double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::acos(x); -} - -float PS4_SYSV_ABI internal_acosf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::acosf(x); -} - -float PS4_SYSV_ABI internal_acosh(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::acosh(x); -} - -float PS4_SYSV_ABI internal_acoshf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::acoshf(x); -} - -float PS4_SYSV_ABI internal_acoshl(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::acoshl(x); -} - -float PS4_SYSV_ABI internal_acosl(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::acosl(x); -} - -double PS4_SYSV_ABI internal_asin(double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::asin(x); -} - -float PS4_SYSV_ABI internal_asinf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::asinf(x); -} - -float PS4_SYSV_ABI internal_asinh(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::asinh(x); -} - -float PS4_SYSV_ABI internal_asinhf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::asinhf(x); -} - -float PS4_SYSV_ABI internal_asinhl(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::asinhl(x); -} - -float PS4_SYSV_ABI internal_asinl(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::asinl(x); -} - -double PS4_SYSV_ABI internal_atan(double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::atan(x); -} - -double PS4_SYSV_ABI internal_atan2(double y, double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::atan2(y, x); -} - -s32 PS4_SYSV_ABI internal_atan2f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atan2l() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atanh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atanhf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atanhl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_atanl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ceil() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ceilf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ceill() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +float PS4_SYSV_ABI internal_sinf(float x) { + return std::sinf(x); } double PS4_SYSV_ABI internal_cos(double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); return std::cos(x); } float PS4_SYSV_ABI internal_cosf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); return std::cosf(x); } -s32 PS4_SYSV_ABI internal_cosh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_coshf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_coshl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_cosl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -double PS4_SYSV_ABI internal_exp(double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::exp(x); -} - -double PS4_SYSV_ABI internal_exp2(double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::exp2(x); -} - -float PS4_SYSV_ABI internal_exp2f(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::exp2f(x); -} - -float PS4_SYSV_ABI internal_exp2l(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::exp2l(x); -} - -float PS4_SYSV_ABI internal_expf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::expf(x); -} - -s32 PS4_SYSV_ABI internal_expl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_expm1() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_expm1f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_expm1l() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fabs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fabsf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fabsl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_floor() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_floorf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_floorl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmaxf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmaxl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmin() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fminf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fminl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmod() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmodf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_fmodl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_frexp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_frexpf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_frexpl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ilogb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ilogbf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_ilogbl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_imaxabs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_imaxdiv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isinf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_islower() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isnan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isnanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_isupper() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log10() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -float PS4_SYSV_ABI internal_log10f(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::log10f(x); -} - -s32 PS4_SYSV_ABI internal_log10l() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log1p() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log1pf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log1pl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log2f() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_log2l() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_logb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_logbf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_logbl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_logf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_logl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lround() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lroundf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_lroundl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_nanl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -double PS4_SYSV_ABI internal_pow(double x, double y) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::pow(x, y); -} - -float PS4_SYSV_ABI internal_powf(float x, float y) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::powf(x, y); -} - -s32 PS4_SYSV_ABI internal_powl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_remainder() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -double PS4_SYSV_ABI internal_sin(double x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::sin(x); -} - void PS4_SYSV_ABI internal_sincos(double x, double* sinp, double* cosp) { - LOG_DEBUG(Lib_LibcInternal, "called"); *sinp = std::sin(x); *cosp = std::cos(x); } -void PS4_SYSV_ABI internal_sincosf(double x, double* sinp, double* cosp) { - LOG_DEBUG(Lib_LibcInternal, "called"); +void PS4_SYSV_ABI internal_sincosf(float x, float* sinp, float* cosp) { *sinp = std::sinf(x); *cosp = std::cosf(x); } -float PS4_SYSV_ABI internal_sinf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::sinf(x); +double PS4_SYSV_ABI internal_tan(double x) { + return std::tan(x); } -float PS4_SYSV_ABI internal_sinh(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::sinh(x); +float PS4_SYSV_ABI internal_tanf(float x) { + return std::tanf(x); } -float PS4_SYSV_ABI internal_sinhf(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::sinhf(x); +double PS4_SYSV_ABI internal_asin(double x) { + return std::asin(x); } -float PS4_SYSV_ABI internal_sinhl(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::sinhl(x); +float PS4_SYSV_ABI internal_asinf(float x) { + return std::asinf(x); } -float PS4_SYSV_ABI internal_sinl(float x) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::sinl(x); +double PS4_SYSV_ABI internal_acos(double x) { + return std::acos(x); } -s32 PS4_SYSV_ABI internal_sqrt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +float PS4_SYSV_ABI internal_acosf(float x) { + return std::acosf(x); } -s32 PS4_SYSV_ABI internal_sqrtf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +double PS4_SYSV_ABI internal_atan(double x) { + return std::atan(x); } -s32 PS4_SYSV_ABI internal_sqrtl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +float PS4_SYSV_ABI internal_atanf(float x) { + return std::atanf(x); } -s32 PS4_SYSV_ABI internal_srand() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +double PS4_SYSV_ABI internal_atan2(double y, double x) { + return std::atan2(y, x); } -s32 PS4_SYSV_ABI internal_tan() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +float PS4_SYSV_ABI internal_atan2f(float y, float x) { + return std::atan2f(y, x); } -s32 PS4_SYSV_ABI internal_tanf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +double PS4_SYSV_ABI internal_exp(double x) { + return std::exp(x); } -s32 PS4_SYSV_ABI internal_tanh() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +float PS4_SYSV_ABI internal_expf(float x) { + return std::expf(x); } -s32 PS4_SYSV_ABI internal_tanhf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +double PS4_SYSV_ABI internal_exp2(double x) { + return std::exp2(x); } -s32 PS4_SYSV_ABI internal_tanhl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +float PS4_SYSV_ABI internal_exp2f(float x) { + return std::exp2f(x); } -s32 PS4_SYSV_ABI internal_tanl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +double PS4_SYSV_ABI internal_pow(double x, double y) { + return std::pow(x, y); } -float PS4_SYSV_ABI internal__FSin(float arg, unsigned int m, int n) { - ASSERT(n == 0); - if (m != 0) { - return cosf(arg); - } else { - return sinf(arg); - } +float PS4_SYSV_ABI internal_powf(float x, float y) { + return std::powf(x, y); } -double PS4_SYSV_ABI internal__Sin(double x) { - return sin(x); +double PS4_SYSV_ABI internal_log(double x) { + return std::log(x); +} + +float PS4_SYSV_ABI internal_logf(float x) { + return std::logf(x); +} + +double PS4_SYSV_ABI internal_log10(double x) { + return std::log10(x); +} + +float PS4_SYSV_ABI internal_log10f(float x) { + return std::log10f(x); } void RegisterlibSceLibcInternalMath(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("Ye20uNnlglA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_abs); - LIB_FUNCTION("JBcgYuW8lPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_acos); - LIB_FUNCTION("QI-x0SL8jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_acosf); - LIB_FUNCTION("Fk7-KFKZi-8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_acosh); - LIB_FUNCTION("XJp2C-b0tRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_acoshf); - LIB_FUNCTION("u14Y1HFh0uY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_acoshl); - LIB_FUNCTION("iH4YAIRcecA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_acosl); - LIB_FUNCTION("7Ly52zaL44Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_asin); - LIB_FUNCTION("GZWjF-YIFFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asinf); - LIB_FUNCTION("2eQpqTjJ5Y4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asinh); - LIB_FUNCTION("yPPtp1RMihw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asinhf); - LIB_FUNCTION("iCl-Z-g-uuA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asinhl); - LIB_FUNCTION("Nx-F5v0-qU8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_asinl); - LIB_FUNCTION("OXmauLdQ8kY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atan); - LIB_FUNCTION("HUbZmOnT-Dg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atan2); - LIB_FUNCTION("EH-x713A99c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atan2f); - LIB_FUNCTION("9VeY8wiqf8M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atan2l); - LIB_FUNCTION("weDug8QD-lE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atanf); - LIB_FUNCTION("YjbpxXpi6Zk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atanh); - LIB_FUNCTION("cPGyc5FGjy0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atanhf); - LIB_FUNCTION("a3BNqojL4LM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atanhl); - LIB_FUNCTION("KvOHPTz595Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_atanl); - LIB_FUNCTION("gacfOmO8hNs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_ceil); - LIB_FUNCTION("GAUuLKGhsCw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ceilf); - LIB_FUNCTION("aJKn6X+40Z8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ceill); + LIB_FUNCTION("H8ya2H00jbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sin); + LIB_FUNCTION("Q4rRL34CEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinf); LIB_FUNCTION("2WE3BTYVwKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cos); LIB_FUNCTION("-P6FNMzk2Kc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosf); - LIB_FUNCTION("m7iLTaO9RMs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosh); - LIB_FUNCTION("RCQAffkEh9A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_coshf); - LIB_FUNCTION("XK2R46yx0jc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_coshl); - LIB_FUNCTION("x8dc5Y8zFgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_cosl); - LIB_FUNCTION("NVadfnzQhHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp); - LIB_FUNCTION("dnaeGXbjP6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp2); - LIB_FUNCTION("wuAQt-j+p4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_exp2f); - LIB_FUNCTION("9O1Xdko-wSo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_exp2l); - LIB_FUNCTION("8zsu04XNsZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expf); - LIB_FUNCTION("qMp2fTDCyMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expl); - LIB_FUNCTION("gqKfOiJaCOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_expm1); - LIB_FUNCTION("3EgxfDRefdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_expm1f); - LIB_FUNCTION("jVS263HH1b0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_expm1l); - LIB_FUNCTION("388LcMWHRCA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fabs); - LIB_FUNCTION("fmT2cjPoWBs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fabsf); - LIB_FUNCTION("w-AryX51ObA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fabsl); - LIB_FUNCTION("mpcTgMzhUY8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_floor); - LIB_FUNCTION("mKhVDmYciWA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_floorf); - LIB_FUNCTION("06QaR1Cpn-k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_floorl); - LIB_FUNCTION("fiOgmWkP+Xc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmax); - LIB_FUNCTION("Lyx2DzUL7Lc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fmaxf); - LIB_FUNCTION("0H5TVprQSkA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fmaxl); - LIB_FUNCTION("iU0z6SdUNbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmin); - LIB_FUNCTION("uVRcM2yFdP4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fminf); - LIB_FUNCTION("DQ7K6s8euWY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fminl); - LIB_FUNCTION("pKwslsMUmSk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_fmod); - LIB_FUNCTION("88Vv-AzHVj8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fmodf); - LIB_FUNCTION("A1R5T0xOyn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_fmodl); - LIB_FUNCTION("kA-TdiOCsaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_frexp); - LIB_FUNCTION("aaDMGGkXFxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_frexpf); - LIB_FUNCTION("YZk9sHO0yNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_frexpl); - LIB_FUNCTION("h6pVBKjcLiU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ilogb); - LIB_FUNCTION("0dQrYWd7g94", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ilogbf); - LIB_FUNCTION("wXs12eD3uvA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_ilogbl); - LIB_FUNCTION("UgZ7Rhk60cQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_imaxabs); - LIB_FUNCTION("V0X-mrfdM9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_imaxdiv); - LIB_FUNCTION("2q5PPh7HsKE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isinf); - LIB_FUNCTION("KqYTqtSfGos", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_islower); - LIB_FUNCTION("20qj+7O69XY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isnan); - LIB_FUNCTION("3pF7bUSIH8o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isnanf); - LIB_FUNCTION("GcFKlTJEMkI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_isupper); - LIB_FUNCTION("rtV7-jWC6Yg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log); - LIB_FUNCTION("WuMbPBKN1TU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log10); - LIB_FUNCTION("lhpd6Wk6ccs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log10f); - LIB_FUNCTION("CT4aR0tBgkQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log10l); - LIB_FUNCTION("VfsML+n9cDM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log1p); - LIB_FUNCTION("MFe91s8apQk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log1pf); - LIB_FUNCTION("77qd0ksTwdI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log1pl); - LIB_FUNCTION("Y5DhuDKGlnQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log2); - LIB_FUNCTION("hsi9drzHR2k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log2f); - LIB_FUNCTION("CfOrGjBj-RY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_log2l); - LIB_FUNCTION("owKuegZU4ew", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logb); - LIB_FUNCTION("RWqyr1OKuw4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_logbf); - LIB_FUNCTION("txJTOe0Db6M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_logbl); - LIB_FUNCTION("RQXLbdT2lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logf); - LIB_FUNCTION("EiHf-aLDImI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logl); - LIB_FUNCTION("J3XuGS-cC0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lround); - LIB_FUNCTION("C6gWCWJKM+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lroundf); - LIB_FUNCTION("4ITASgL50uc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_lroundl); - LIB_FUNCTION("zck+6bVj5pA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nan); - LIB_FUNCTION("DZU+K1wozGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nanf); - LIB_FUNCTION("ZUvemFIkkhQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_nanl); - LIB_FUNCTION("9LCjpWyQ5Zc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_pow); - LIB_FUNCTION("1D0H2KNjshE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powf); - LIB_FUNCTION("95V3PF0kUEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powl); - LIB_FUNCTION("pv2etu4pocs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_remainder); - LIB_FUNCTION("H8ya2H00jbI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sin); LIB_FUNCTION("jMB7EFyu30Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sincos); LIB_FUNCTION("pztV4AF18iI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sincosf); - LIB_FUNCTION("Q4rRL34CEeE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinf); - LIB_FUNCTION("ZjtRqSMJwdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinh); - LIB_FUNCTION("1t1-JoZ0sZQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sinhf); - LIB_FUNCTION("lYdqBvDgeHU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sinhl); - LIB_FUNCTION("vxgqrJxDPHo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sinl); - LIB_FUNCTION("MXRNWnosNlM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_sqrt); - LIB_FUNCTION("Q+xU11-h0xQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sqrtf); - LIB_FUNCTION("RIkUZRadZgc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_sqrtl); - LIB_FUNCTION("VPbJwTCgME0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_srand); LIB_FUNCTION("T7uyNqP7vQA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tan); LIB_FUNCTION("ZE6RNL+eLbk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanf); - LIB_FUNCTION("JM4EBvWT9rc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanh); - LIB_FUNCTION("SAd0Z3wKwLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tanhf); - LIB_FUNCTION("JCmHsYVc2eo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_tanhl); - LIB_FUNCTION("QL+3q43NfEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_tanl); - LIB_FUNCTION("ZtjspkJQ+vw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__FSin); - LIB_FUNCTION("cCXjU72Z0Ow", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal__Sin); + LIB_FUNCTION("7Ly52zaL44Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_asin); + LIB_FUNCTION("GZWjF-YIFFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_asinf); + LIB_FUNCTION("JBcgYuW8lPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_acos); + LIB_FUNCTION("QI-x0SL8jhw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_acosf); + LIB_FUNCTION("OXmauLdQ8kY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_atan); + LIB_FUNCTION("weDug8QD-lE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atanf); + LIB_FUNCTION("HUbZmOnT-Dg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atan2); + LIB_FUNCTION("EH-x713A99c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_atan2f); + LIB_FUNCTION("NVadfnzQhHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp); + LIB_FUNCTION("8zsu04XNsZ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_expf); + LIB_FUNCTION("dnaeGXbjP6E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_exp2); + LIB_FUNCTION("wuAQt-j+p4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_exp2f); + LIB_FUNCTION("9LCjpWyQ5Zc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_pow); + LIB_FUNCTION("1D0H2KNjshE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_powf); + LIB_FUNCTION("rtV7-jWC6Yg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_log); + LIB_FUNCTION("RQXLbdT2lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_logf); + LIB_FUNCTION("WuMbPBKN1TU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log10); + LIB_FUNCTION("lhpd6Wk6ccs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_log10f); } } // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_memory.cpp b/src/core/libraries/libc_internal/libc_internal_memory.cpp index 6666aa6bf..0d8c421af 100644 --- a/src/core/libraries/libc_internal/libc_internal_memory.cpp +++ b/src/core/libraries/libc_internal/libc_internal_memory.cpp @@ -9,123 +9,15 @@ namespace Libraries::LibcInternal { -s32 PS4_SYSV_ABI internal__malloc_finalize_lv2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__malloc_fini() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__malloc_init() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__malloc_init_lv2() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__malloc_postfork() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__malloc_prefork() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__malloc_thread_cleanup() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__sceLibcGetMallocParam() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_operator_new(size_t size) { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc(size_t size) { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_check_memory_bounds() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_finalize() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_get_footer_value() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_get_malloc_state() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_initialize() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_report_memory_blocks() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_stats() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_stats_fast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_malloc_usable_size() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_memalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_memchr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_memcmp(const void* s1, const void* s2, size_t n) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::memcmp(s1, s2, n); +void* PS4_SYSV_ABI internal_memset(void* s, int c, size_t n) { + return std::memset(s, c, n); } void* PS4_SYSV_ABI internal_memcpy(void* dest, const void* src, size_t n) { - LOG_DEBUG(Lib_LibcInternal, "called"); return std::memcpy(dest, src, n); } s32 PS4_SYSV_ABI internal_memcpy_s(void* dest, size_t destsz, const void* src, size_t count) { - LOG_DEBUG(Lib_LibcInternal, "called"); #ifdef _WIN64 return memcpy_s(dest, destsz, src, count); #else @@ -134,181 +26,20 @@ s32 PS4_SYSV_ABI internal_memcpy_s(void* dest, size_t destsz, const void* src, s #endif } -s32 PS4_SYSV_ABI internal_memmove(void* d, void* s, size_t n) { - LOG_DEBUG(Lib_LibcInternal, "called"); - std::memmove(d, s, n); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_memmove_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_memrchr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -void* PS4_SYSV_ABI internal_memset(void* s, int c, size_t n) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::memset(s, c, n); -} - -s32 PS4_SYSV_ABI internal_memset_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_posix_memalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_realloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_reallocalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_reallocf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wmemchr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wmemcmp() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wmemcpy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wmemcpy_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wmemmove() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wmemmove_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wmemset() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -void PS4_SYSV_ABI internal_operator_delete(void* ptr) { - if (ptr) { - std::free(ptr); - } -} - -void PS4_SYSV_ABI internal_free(void* ptr) { - std::free(ptr); +s32 PS4_SYSV_ABI internal_memcmp(const void* s1, const void* s2, size_t n) { + return std::memcmp(s1, s2, n); } void RegisterlibSceLibcInternalMemory(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("RnqlvEmvkdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__malloc_finalize_lv2); - LIB_FUNCTION("21KFhEQDJ3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__malloc_fini); - LIB_FUNCTION("z8GPiQwaAEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__malloc_init); - LIB_FUNCTION("20cUk0qX9zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__malloc_init_lv2); - LIB_FUNCTION("V94pLruduLg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__malloc_postfork); - LIB_FUNCTION("aLYyS4Kx6rQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__malloc_prefork); - LIB_FUNCTION("Sopthb9ztZI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__malloc_thread_cleanup); - LIB_FUNCTION("1nZ4Xfnyp38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__sceLibcGetMallocParam); - LIB_FUNCTION("fJnpuVVBbKk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_operator_new); - LIB_FUNCTION("cVSk9y8URbc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_posix_memalign); - LIB_FUNCTION("Ujf3KzMvRmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memalign); - LIB_FUNCTION("8u8lPzUEq+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memchr); - LIB_FUNCTION("DfivPArhucg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memcmp); - LIB_FUNCTION("Q3VBxCXhUHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memcpy); + LIB_FUNCTION("NFLs+dRJGNg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_memcpy_s); - LIB_FUNCTION("+P6FRGH4LfA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memmove); - LIB_FUNCTION("B59+zQQCcbU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memmove_s); - LIB_FUNCTION("5G2ONUzRgjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memrchr); + LIB_FUNCTION("Q3VBxCXhUHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memcpy); LIB_FUNCTION("8zTFvBIAIN8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_memset); - LIB_FUNCTION("h8GwqPFbu6I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_memset_s); - LIB_FUNCTION("Y7aJ1uydPMo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_realloc); - LIB_FUNCTION("OGybVuPAhAY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_reallocalign); - LIB_FUNCTION("YMZO9ChZb0E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_reallocf); - LIB_FUNCTION("fnUEjBCNRVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wmemchr); - LIB_FUNCTION("QJ5xVfKkni0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wmemcmp); - LIB_FUNCTION("fL3O02ypZFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wmemcpy); - LIB_FUNCTION("BTsuaJ6FxKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wmemcpy_s); - LIB_FUNCTION("Noj9PsJrsa8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wmemmove); - LIB_FUNCTION("F8b+Wb-YQVs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wmemmove_s); - LIB_FUNCTION("Al8MZJh-4hM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wmemset); - LIB_FUNCTION("gQX+4GDQjpM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc); - LIB_FUNCTION("ECOPpUQEch0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_check_memory_bounds); - LIB_FUNCTION("J6FoFNydpFI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_finalize); - LIB_FUNCTION("SlG1FN-y0N0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_get_footer_value); - LIB_FUNCTION("Nmezc1Lh7TQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_get_malloc_state); - LIB_FUNCTION("owT6zLJxrTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_initialize); - LIB_FUNCTION("0F08WOP8G3s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_report_memory_blocks); - LIB_FUNCTION("CC-BLMBu9-I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_stats); - LIB_FUNCTION("KuOuD58hqn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_stats_fast); - LIB_FUNCTION("NDcSfcYZRC8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_malloc_usable_size); - LIB_FUNCTION("MLWl90SFWNE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_operator_delete); - LIB_FUNCTION("tIhsqj0qsFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_free); + LIB_FUNCTION("DfivPArhucg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_memcmp); } } // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_mspace.cpp b/src/core/libraries/libc_internal/libc_internal_mspace.cpp deleted file mode 100644 index 916c9ab0d..000000000 --- a/src/core/libraries/libc_internal/libc_internal_mspace.cpp +++ /dev/null @@ -1,247 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/assert.h" -#include "common/logging/log.h" -#include "core/libraries/error_codes.h" -#include "core/libraries/libs.h" -#include "libc_internal_mspace.h" - -namespace Libraries::LibcInternal { - -s32 PS4_SYSV_ABI sceLibcMspaceAlignedAlloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceCalloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -void* PS4_SYSV_ABI sceLibcMspaceCreate(char* name, u64 param_2, u64 param_3, u32 param_4, - s8* param_5) { - UNREACHABLE_MSG("Missing sceLibcMspace impementation!"); - return 0; -} - -s32 PS4_SYSV_ABI sceLibcMspaceDestroy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceFree() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceGetAddressRanges() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceIsHeapEmpty() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceMalloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceMallocStats() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceMallocStatsFast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceMallocUsableSize() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceMemalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspacePosixMemalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceRealloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceReallocalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcMspaceSetMallocCallback() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceCalloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceCheckMemoryBounds() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceCreate() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceDestroy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceFree() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceGetFooterValue() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceIsHeapEmpty() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceMalloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceMallocStats() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceMallocStatsFast() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceMallocUsableSize() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceMemalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspacePosixMemalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceRealloc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceReallocalign() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceReportMemoryBlocks() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI sceLibcPafMspaceTrim() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -void RegisterlibSceLibcInternalMspace(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("ljkqMcC4-mk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceAlignedAlloc); - LIB_FUNCTION("LYo3GhIlB38", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceCalloc); - LIB_FUNCTION("-hn1tcVHq5Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceCreate); - LIB_FUNCTION("W6SiVSiCDtI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceDestroy); - LIB_FUNCTION("Vla-Z+eXlxo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceFree); - LIB_FUNCTION("raRgiuQfvWk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceGetAddressRanges); - LIB_FUNCTION("pzUa7KEoydw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceIsHeapEmpty); - LIB_FUNCTION("OJjm-QOIHlI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceMalloc); - LIB_FUNCTION("mfHdJTIvhuo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceMallocStats); - LIB_FUNCTION("k04jLXu3+Ic", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceMallocStatsFast); - LIB_FUNCTION("fEoW6BJsPt4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceMallocUsableSize); - LIB_FUNCTION("iF1iQHzxBJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceMemalign); - LIB_FUNCTION("qWESlyXMI3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspacePosixMemalign); - LIB_FUNCTION("gigoVHZvVPE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceRealloc); - LIB_FUNCTION("p6lrRW8-MLY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceReallocalign); - LIB_FUNCTION("+CbwGRMnlfU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcMspaceSetMallocCallback); - LIB_FUNCTION("-lZdT34nAAE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceCalloc); - LIB_FUNCTION("Pcq7UoYAcFE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceCheckMemoryBounds); - LIB_FUNCTION("6hdfGRKHefs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceCreate); - LIB_FUNCTION("qB5nGjWa-bk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceDestroy); - LIB_FUNCTION("9mMuuhXMwqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceFree); - LIB_FUNCTION("kv4kgdjswN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceGetFooterValue); - LIB_FUNCTION("htdTOnMxDbQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceIsHeapEmpty); - LIB_FUNCTION("QuZzFJD5Hrw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceMalloc); - LIB_FUNCTION("mO8NB8whKy8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceMallocStats); - LIB_FUNCTION("OmG3YPCBLJs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceMallocStatsFast); - LIB_FUNCTION("6JcY5RDA4jY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceMallocUsableSize); - LIB_FUNCTION("PKJcFUfhKtw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceMemalign); - LIB_FUNCTION("7hOUKGcT6jM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspacePosixMemalign); - LIB_FUNCTION("u32UXVridxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceRealloc); - LIB_FUNCTION("4SvlEtd0j40", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceReallocalign); - LIB_FUNCTION("0FnzR6qum90", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceReportMemoryBlocks); - LIB_FUNCTION("AUYdq63RG3U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - sceLibcPafMspaceTrim); -} - -} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_mspace.h b/src/core/libraries/libc_internal/libc_internal_mspace.h deleted file mode 100644 index b2357e446..000000000 --- a/src/core/libraries/libc_internal/libc_internal_mspace.h +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/types.h" - -namespace Core::Loader { -class SymbolsResolver; -} - -namespace Libraries::LibcInternal { -void RegisterlibSceLibcInternalMspace(Core::Loader::SymbolsResolver* sym); -} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/libc_internal_str.cpp b/src/core/libraries/libc_internal/libc_internal_str.cpp index e7c0666d6..3283822de 100644 --- a/src/core/libraries/libc_internal/libc_internal_str.cpp +++ b/src/core/libraries/libc_internal/libc_internal_str.cpp @@ -9,244 +9,41 @@ namespace Libraries::LibcInternal { -s32 PS4_SYSV_ABI internal__CStrftime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__CStrxfrm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Getstr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stod() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stodx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stof() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoflt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stofx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stold() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoldx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoll() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stollx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stolx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stopfx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoul() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoull() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoullx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoulx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Stoxflt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Strcollx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Strerror() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__Strxfrmx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strcasecmp(const char* str1, const char* str2) { - LOG_DEBUG(Lib_LibcInternal, "called"); -#ifdef _WIN32 - return _stricmp(str1, str2); +s32 PS4_SYSV_ABI internal_strcpy_s(char* dest, size_t dest_size, const char* src) { +#ifdef _WIN64 + return strcpy_s(dest, dest_size, src); #else - return strcasecmp(str1, str2); + std::strcpy(dest, src); + return 0; // ALL OK #endif } -char* PS4_SYSV_ABI internal_strcat(char* dest, const char* src) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strcat(dest, src); -} - -s32 PS4_SYSV_ABI internal_strcat_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -const char* PS4_SYSV_ABI internal_strchr(const char* str, int c) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strchr(str, c); +s32 PS4_SYSV_ABI internal_strcat_s(char* dest, size_t dest_size, const char* src) { +#ifdef _WIN64 + return strcat_s(dest, dest_size, src); +#else + std::strcat(dest, src); + return 0; // ALL OK +#endif } s32 PS4_SYSV_ABI internal_strcmp(const char* str1, const char* str2) { - LOG_DEBUG(Lib_LibcInternal, "called"); return std::strcmp(str1, str2); } -s32 PS4_SYSV_ABI internal_strcoll() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -char* PS4_SYSV_ABI internal_strcpy(char* dest, const char* src) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strcpy(dest, src); -} - -char* PS4_SYSV_ABI internal_strcpy_s(char* dest, u64 len, const char* src) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strncpy(dest, src, len); -} - -s32 PS4_SYSV_ABI internal_strcspn(const char* str1, const char* str2) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strcspn(str1, str2); -} - -char* PS4_SYSV_ABI internal_strdup(const char* str1) { - LOG_DEBUG(Lib_LibcInternal, "called"); - char* dup = (char*)std::malloc(std::strlen(str1) + 1); - if (dup != NULL) - strcpy(dup, str1); - return dup; -} - -s32 PS4_SYSV_ABI internal_strerror() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strerror_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strerror_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strerrorlen_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strftime() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strlcat() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strlcpy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -size_t PS4_SYSV_ABI internal_strlen(const char* str) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strlen(str); -} - -s32 PS4_SYSV_ABI internal_strncasecmp(const char* str1, const char* str2, size_t num) { - LOG_DEBUG(Lib_LibcInternal, "called"); -#ifdef _WIN32 - return _strnicmp(str1, str2, num); -#else - return strncasecmp(str1, str2, num); -#endif -} - -s32 PS4_SYSV_ABI internal_strncat() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strncat_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - s32 PS4_SYSV_ABI internal_strncmp(const char* str1, const char* str2, size_t num) { - LOG_DEBUG(Lib_LibcInternal, "called"); return std::strncmp(str1, str2, num); } +size_t PS4_SYSV_ABI internal_strlen(const char* str) { + return std::strlen(str); +} + char* PS4_SYSV_ABI internal_strncpy(char* dest, const char* src, std::size_t count) { - LOG_DEBUG(Lib_LibcInternal, "called"); return std::strncpy(dest, src, count); } s32 PS4_SYSV_ABI internal_strncpy_s(char* dest, size_t destsz, const char* src, size_t count) { - LOG_DEBUG(Lib_LibcInternal, "called"); #ifdef _WIN64 return strncpy_s(dest, destsz, src, count); #else @@ -255,278 +52,33 @@ s32 PS4_SYSV_ABI internal_strncpy_s(char* dest, size_t destsz, const char* src, #endif } -s32 PS4_SYSV_ABI internal_strndup() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +char* PS4_SYSV_ABI internal_strcat(char* dest, const char* src) { + return std::strcat(dest, src); } -s32 PS4_SYSV_ABI internal_strnlen(const char* str, size_t maxlen) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::min(std::strlen(str), maxlen); -} - -s32 PS4_SYSV_ABI internal_strnlen_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strnstr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -const char* PS4_SYSV_ABI internal_strpbrk(const char* str1, const char* str2) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strpbrk(str1, str2); -} - -const char* PS4_SYSV_ABI internal_strrchr(const char* str, int c) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strrchr(str, c); -} - -char* PS4_SYSV_ABI internal_strsep(char** strp, const char* delim) { - LOG_DEBUG(Lib_LibcInternal, "called"); -#ifdef _GNU_SOURCE - return strsep(strp, delim); -#else - if (!*strp) - return nullptr; - char* token = *strp; - *strp = std::strpbrk(token, delim); - if (*strp) - *(*strp)++ = '\0'; - return token; -#endif -} - -s32 PS4_SYSV_ABI internal_strspn(const char* str1, const char* str2) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strspn(str1, str2); -} - -char* PS4_SYSV_ABI internal_strstr(char* h, char* n) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strstr(h, n); -} - -double PS4_SYSV_ABI internal_strtod(const char* str, char** endptr) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strtod(str, endptr); -} - -float PS4_SYSV_ABI internal_strtof(const char* str, char** endptr) { - LOG_DEBUG(Lib_LibcInternal, "called"); - return std::strtof(str, endptr); -} - -s32 PS4_SYSV_ABI internal_strtoimax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtok() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtok_r() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtok_s() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtol() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtold() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtoll() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtoul() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtoull() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtoumax() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strtouq() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_strxfrm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal_wcsstr() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; +const char* PS4_SYSV_ABI internal_strchr(const char* str, int c) { + return std::strchr(str, c); } void RegisterlibSceLibcInternalStr(Core::Loader::SymbolsResolver* sym) { - - LIB_FUNCTION("ykNF6P3ZsdA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__CStrftime); - LIB_FUNCTION("we-vQBAugV8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__CStrxfrm); - LIB_FUNCTION("i2yN6xBwooo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Getstr); - LIB_FUNCTION("c41UEHVtiEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stod); - LIB_FUNCTION("QlcJbyd6jxM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stodx); - LIB_FUNCTION("CpWcnrEZbLA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stof); - LIB_FUNCTION("wO1-omboFjo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoflt); - LIB_FUNCTION("7dlAxeH-htg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stofx); - LIB_FUNCTION("iNbtyJKM0iQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stold); - LIB_FUNCTION("BKidCxmLC5w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoldx); - LIB_FUNCTION("7pNKcscKrf8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoll); - LIB_FUNCTION("mOnfZ5aNDQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stollx); - LIB_FUNCTION("Ecwid6wJMhY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stolx); - LIB_FUNCTION("yhbF6MbVuYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stopfx); - LIB_FUNCTION("zlfEH8FmyUA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoul); - LIB_FUNCTION("q+9E0X3aWpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoull); - LIB_FUNCTION("pSpDCDyxkaY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoullx); - LIB_FUNCTION("YDnLaav6W6Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoulx); - LIB_FUNCTION("Ouz5Q8+SUq4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Stoxflt); - LIB_FUNCTION("v6rXYSx-WGA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Strcollx); - LIB_FUNCTION("4F11tHMpJa0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Strerror); - LIB_FUNCTION("CpiD2ZXrhNo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__Strxfrmx); - LIB_FUNCTION("AV6ipCNa4Rw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcasecmp); - LIB_FUNCTION("Ls4tzzhimqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcat); - LIB_FUNCTION("K+gcnFFJKVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcat_s); - LIB_FUNCTION("ob5xAW4ln-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strchr); - LIB_FUNCTION("Ovb2dSJOAuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcmp); - LIB_FUNCTION("gjbmYpP-XJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcoll); - LIB_FUNCTION("kiZSXIWd9vg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcpy); LIB_FUNCTION("5Xa2ACNECdo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_strcpy_s); - LIB_FUNCTION("q0F6yS-rCms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strcspn); - LIB_FUNCTION("g7zzzLDYGw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strdup); - LIB_FUNCTION("RIa6GnWp+iU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strerror); - LIB_FUNCTION("RBcs3uut1TA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strerror_r); - LIB_FUNCTION("o+ok6Y+DtgY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strerror_s); - LIB_FUNCTION("-g26XITGVgE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strerrorlen_s); - LIB_FUNCTION("Av3zjWi64Kw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strftime); - LIB_FUNCTION("ByfjUZsWiyg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strlcat); - LIB_FUNCTION("SfQIZcqvvms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strlcpy); + LIB_FUNCTION("K+gcnFFJKVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcat_s); + LIB_FUNCTION("aesyjrHVWy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcmp); + LIB_FUNCTION("Ovb2dSJOAuE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strncmp); LIB_FUNCTION("j4ViWNHEgww", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_strlen); - LIB_FUNCTION("pXvbDfchu6k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strncasecmp); - LIB_FUNCTION("kHg45qPC6f0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strncat); - LIB_FUNCTION("NC4MSB+BRQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strncat_s); - LIB_FUNCTION("aesyjrHVWy4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strncmp); LIB_FUNCTION("6sJWiWSRuqk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_strncpy); LIB_FUNCTION("YNzNkJzYqEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, internal_strncpy_s); - LIB_FUNCTION("XGnuIBmEmyk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strndup); - LIB_FUNCTION("5jNubw4vlAA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strnlen); - LIB_FUNCTION("DQbtGaBKlaw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strnlen_s); - LIB_FUNCTION("Xnrfb2-WhVw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strnstr); - LIB_FUNCTION("kDZvoVssCgQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strpbrk); - LIB_FUNCTION("9yDWMxEFdJU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strrchr); - LIB_FUNCTION("cJWGxiQPmDQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strsep); - LIB_FUNCTION("-kU6bB4M-+k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strspn); - LIB_FUNCTION("viiwFMaNamA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strstr); - LIB_FUNCTION("2vDqwBlpF-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtod); - LIB_FUNCTION("xENtRue8dpI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtof); - LIB_FUNCTION("q5MWYCDfu3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtoimax); - LIB_FUNCTION("oVkZ8W8-Q8A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtok); - LIB_FUNCTION("enqPGLfmVNU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtok_r); - LIB_FUNCTION("-vXEQdRADLI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtok_s); - LIB_FUNCTION("mXlxhmLNMPg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtol); - LIB_FUNCTION("nW9JRkciRk4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtold); - LIB_FUNCTION("VOBg+iNwB-4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtoll); - LIB_FUNCTION("QxmSHBCuKTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtoul); - LIB_FUNCTION("5OqszGpy7Mg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtoull); - LIB_FUNCTION("QNyUWGXmXNc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtoumax); - LIB_FUNCTION("g-McpZfseZo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strtouq); - LIB_FUNCTION("zogPrkd46DY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_strxfrm); - LIB_FUNCTION("WDpobjImAb4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal_wcsstr); + LIB_FUNCTION("Ls4tzzhimqQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strcat); + LIB_FUNCTION("ob5xAW4ln-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, + internal_strchr); } } // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_stream.cpp b/src/core/libraries/libc_internal/libc_internal_stream.cpp deleted file mode 100644 index 2d793d9cb..000000000 --- a/src/core/libraries/libc_internal/libc_internal_stream.cpp +++ /dev/null @@ -1,3139 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/assert.h" -#include "common/logging/log.h" -#include "core/libraries/error_codes.h" -#include "core/libraries/libs.h" -#include "libc_internal_memory.h" - -namespace Libraries::LibcInternal { - -s32 PS4_SYSV_ABI internal__ZGVNSt14_Error_objectsIiE16_Iostream_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE5equalERKS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt19istreambuf_iteratorIwSt11char_traitsIwEE5equalERKS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt24_Iostream_error_category4nameEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNKSt24_Iostream_error_category7messageEi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_PKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcmmmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IputES3_RSt8ios_basecPcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_PKwm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcmmmm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IputES3_RSt8ios_basewPcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKcSE_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetintERS3_S5_iiRiRKSt5ctypeIcE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKwSE_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetintERS3_S5_iiRiRKSt5ctypeIwE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8_PutmfldES3_bRSt8ios_basecbSsc() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8_PutmfldES3_bRSt8ios_basewbSbIwS2_SaIwEEw() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt14_Error_objectsIiE16_Iostream_objectE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt24_Iostream_error_categoryD0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt24_Iostream_error_categoryD1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_TidyEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_TidyEv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_Eb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_Eb() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIcEEEm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIwEEEm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEiRT0_S5_mPKT_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZSt10_GetloctxtIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZSt17iostream_categoryv() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt13basic_istreamIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt13basic_ostreamIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt15basic_streambufIcSt11char_traitsIcEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt15basic_streambufIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt24_Iostream_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt13basic_istreamIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt13basic_ostreamIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt15basic_streambufIcSt11char_traitsIcEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt15basic_streambufIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt24_Iostream_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt13basic_istreamIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt13basic_ostreamIwSt11char_traitsIwEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt24_Iostream_error_category() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI internal__ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePcE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePwE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSsE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -s32 PS4_SYSV_ABI -internal__ZZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEEE4_Src() { - LOG_ERROR(Lib_LibcInternal, "(STUBBED) called"); - return ORBIS_OK; -} - -void RegisterlibSceLibcInternalStream(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("ieNeByYxFgA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt14_Error_objectsIiE16_Iostream_objectE); - LIB_FUNCTION("8o+oBXdeQPk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION("5FD0gWEuuTs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION("ZkP0sDpHLLg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION("wozVkExRax4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION("z-L6coXk6yo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION("TuIEPzIwWcI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION("Awj5m1LfcXQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION("K+-VjJdCYVc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION("HQAa3rCj8ho", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION("koazg-62JMk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION("HDnBZ+mkyjg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION("u6UfGT9+HEA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt19istreambuf_iteratorIcSt11char_traitsIcEE5equalERKS2_); - LIB_FUNCTION("jZmLD-ASDto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt19istreambuf_iteratorIwSt11char_traitsIwEE5equalERKS2_); - LIB_FUNCTION("sb2vivqtLS0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt24_Iostream_error_category4nameEv); - LIB_FUNCTION("n9-NJEULZ-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt24_Iostream_error_category7messageEi); - LIB_FUNCTION( - "OWO5cpNw3NA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); - LIB_FUNCTION( - "mAwXCpkWaYc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); - LIB_FUNCTION( - "wUCRGap1j0U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "6RGkooTERsE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); - LIB_FUNCTION( - "N1VqUWz2OEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); - LIB_FUNCTION( - "I2UzwkwwEPs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); - LIB_FUNCTION( - "2bfL3yIBi5k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); - LIB_FUNCTION( - "my9ujasm6-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); - LIB_FUNCTION( - "gozsp4urvq8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); - LIB_FUNCTION( - "4hiQK82QuLc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); - LIB_FUNCTION( - "eZfFLyWCkvg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); - LIB_FUNCTION( - "SmtBNDda5qU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); - LIB_FUNCTION( - "bNQpG-eKogg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); - LIB_FUNCTION( - "uukWbYS6Bn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "IntAnFb+tw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); - LIB_FUNCTION( - "ywJpNe675zo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); - LIB_FUNCTION( - "ALEXgLx9fqU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); - LIB_FUNCTION( - "Pq4PkG0x1fk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); - LIB_FUNCTION( - "VKdXFE7ualw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); - LIB_FUNCTION( - "dRu2RLn4SKM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); - LIB_FUNCTION( - "F+AmVDFUyqM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); - LIB_FUNCTION( - "TtYifKtVkYA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); - LIB_FUNCTION( - "4+y8-2NsDw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePi); - LIB_FUNCTION( - "G9LB1YD5-xc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale); - LIB_FUNCTION( - "J-0I2PtiZc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi); - LIB_FUNCTION( - "vW-nnV62ea4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); - LIB_FUNCTION( - "+hjXHfvy1Mg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); - LIB_FUNCTION( - "xLZr4GJRMLo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "2mb8FYgER+E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); - LIB_FUNCTION( - "Y3hBU5FYmhM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); - LIB_FUNCTION( - "-m2YPwVCwJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); - LIB_FUNCTION( - "94ZLp2+AOq0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); - LIB_FUNCTION( - "zomvAQ5RFdA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); - LIB_FUNCTION( - "bZ+lKHGvOr8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); - LIB_FUNCTION( - "cG5hQhjFGog", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); - LIB_FUNCTION( - "banNSumaAZ0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); - LIB_FUNCTION( - "wEU8oFtBXT8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERb); - LIB_FUNCTION( - "t39dKpPEuVA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERd); - LIB_FUNCTION( - "MCtJ9D7B5Cs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "Gy2iRxp3LGk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERf); - LIB_FUNCTION( - "2bUUbbcqHUo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERj); - LIB_FUNCTION( - "QossXdwWltI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERl); - LIB_FUNCTION( - "ig6SRr1GCU4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERm); - LIB_FUNCTION( - "BNZq-mRvDS8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERPv); - LIB_FUNCTION( - "kU7PvJJKUng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERt); - LIB_FUNCTION( - "Ou7GV51-ng4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERx); - LIB_FUNCTION( - "rYLrGFoqfi4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateERy); - LIB_FUNCTION( - "W5VYncHdreo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePi); - LIB_FUNCTION( - "GGqIV4cjzzI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6locale); - LIB_FUNCTION( - "bZ0oEGQUKO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePi); - LIB_FUNCTION( - "nftirmo6hBg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb); - LIB_FUNCTION( - "w9NzCYAjEpQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd); - LIB_FUNCTION( - "VPcTGA-LwSo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece); - LIB_FUNCTION( - "ffnhh0HcxJ4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl); - LIB_FUNCTION( - "uODuM76vS4U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm); - LIB_FUNCTION( - "8NVUcufbklM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv); - LIB_FUNCTION( - "NJtKruu9qOs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx); - LIB_FUNCTION( - "dep6W2Ix35s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy); - LIB_FUNCTION( - "k8zgjeBmpVY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_PKcm); - LIB_FUNCTION("tCihLs4UJxQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm); - LIB_FUNCTION( - "w11G58-u4p8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE); - LIB_FUNCTION( - "ll99KkqO6ig", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcm); - LIB_FUNCTION( - "mNk6FfI8T7I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_FputES3_RSt8ios_basecPKcmmmm); - LIB_FUNCTION( - "xlgA01CQtBo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE); - LIB_FUNCTION( - "jykT-VWQVBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_IputES3_RSt8ios_basecPcm); - LIB_FUNCTION( - "ke36E2bqNmI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb); - LIB_FUNCTION( - "F+cp2B3cWNU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd); - LIB_FUNCTION( - "rLiFc4+HyHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece); - LIB_FUNCTION( - "I3+xmBWGPGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl); - LIB_FUNCTION( - "nlAk46weq1w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm); - LIB_FUNCTION( - "0xgFRKf0Lc4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv); - LIB_FUNCTION( - "H2KGT3vA7yQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx); - LIB_FUNCTION( - "Vbeoft607aI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy); - LIB_FUNCTION( - "mY9FWooxqJY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb); - LIB_FUNCTION( - "V7aIsVIsIIA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd); - LIB_FUNCTION( - "vCIFGeI6adI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe); - LIB_FUNCTION( - "USLhWp7sZoU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl); - LIB_FUNCTION( - "qtpzdwMMCPc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm); - LIB_FUNCTION( - "xfOSCbCiY44", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv); - LIB_FUNCTION( - "ryykbHJ04Cw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx); - LIB_FUNCTION( - "lmb3oBpMNPU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy); - LIB_FUNCTION( - "kRGVhisjgMg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_PKwm); - LIB_FUNCTION("-b+Avqa2v9k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm); - LIB_FUNCTION( - "T07KcAOlIeU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FfmtEPccNSt5_IosbIiE9_FmtflagsE); - LIB_FUNCTION( - "IdV-tXejEGQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcm); - LIB_FUNCTION( - "B6JXVOMDdlw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_FputES3_RSt8ios_basewPKcmmmm); - LIB_FUNCTION( - "WheFSRlZ9JA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IfmtEPcPKcNSt5_IosbIiE9_FmtflagsE); - LIB_FUNCTION( - "4pQ3B1BTMgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_IputES3_RSt8ios_basewPcm); - LIB_FUNCTION( - "1C2-2WB9NN4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb); - LIB_FUNCTION( - "sX3o6Zmihw0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd); - LIB_FUNCTION( - "6OYWLisfrB8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe); - LIB_FUNCTION( - "VpwhOe58wsM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl); - LIB_FUNCTION( - "jHo78LGEtmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm); - LIB_FUNCTION( - "BDteGj1gqBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv); - LIB_FUNCTION( - "9SSHrlIamto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx); - LIB_FUNCTION( - "uX0nKsUo8gc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy); - LIB_FUNCTION( - "ShlQcYrzRF8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv); - LIB_FUNCTION( - "T85u2sPrKOo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "73GV+sRHbeY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "dSfKN47p6ac", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "KwJ5V3D0v3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "8PIh8BFpNYQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv); - LIB_FUNCTION( - "vvA7HtdtWnY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "xzYpD5d24aA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "ZuCHPDq-dPw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "+RuThw5axA4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); - LIB_FUNCTION( - "S5WbPO54nD0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKcSE_); - LIB_FUNCTION( - "Vw03kdKZUN0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); - LIB_FUNCTION( - "E7UermPZVcw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc); - LIB_FUNCTION( - "8raXTYQ11cg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetintERS3_S5_iiRiRKSt5ctypeIcE); - LIB_FUNCTION( - "OY5mqEBxP+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "rrqNi95bhMs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "5L5Aft+9nZU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "nc6OsiDx630", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv); - LIB_FUNCTION( - "SYCwZXKZQ08", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "2pJJ0dl-aPQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "cRSJysDpVl4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "A0PftWMfrhk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "dP14OHWe4nI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv); - LIB_FUNCTION( - "xy0MR+OOZI8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "hGlkh5YpcKw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "R1ITHuTUMEI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "64pqofAwJEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); - LIB_FUNCTION( - "B8c4P1vCixQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKwSE_); - LIB_FUNCTION( - "0MzJAexrlr4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmcc); - LIB_FUNCTION( - "r8003V6UwZg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetfmtES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tmPKc); - LIB_FUNCTION( - "lhJWkEh-HXM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetintERS3_S5_iiRiRKSt5ctypeIwE); - LIB_FUNCTION( - "kwp-0uidHpw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "9TfGnN6xq-U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "Krt-A7EnHHs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRNSt5_IosbIiE8_IostateEP2tm); - LIB_FUNCTION( - "qkuA-unH7PU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc); - LIB_FUNCTION( - "j9LU8GsuEGw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_); - LIB_FUNCTION( - "+i81FtUCarA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc); - LIB_FUNCTION( - "Nt6eyVKm+Z4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc); - LIB_FUNCTION( - "Sc0lXhQG5Ko", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_); - LIB_FUNCTION( - "Fr7j8dMsy4s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc); - LIB_FUNCTION( - "G84okRnyJJg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "2fxdcyt5tGs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs); - LIB_FUNCTION( - "IRVqdGwSNXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "D2njLPpEt1E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSs); - LIB_FUNCTION( - "CLT04GjI7UE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePc); - LIB_FUNCTION( - "cx-1THpef1A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "wWIsjOqfcSc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE); - LIB_FUNCTION( - "zzubCm+nDzc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERe); - LIB_FUNCTION( - "DhXTD5eM7LQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRNSt5_IosbIiE8_IostateERSbIwS2_SaIwEE); - LIB_FUNCTION( - "RalOJcOXJJo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePw); - LIB_FUNCTION( - "65cvm2NDLmU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece); - LIB_FUNCTION( - "DR029KeWsHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs); - LIB_FUNCTION( - "iXVrhA51z0M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece); - LIB_FUNCTION( - "OR-4zyIi2aE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs); - LIB_FUNCTION( - "d57FDzON1h0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE8_PutmfldES3_bRSt8ios_basecbSsc); - LIB_FUNCTION( - "fsF-tGtGsD4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe); - LIB_FUNCTION( - "JruBeQgsAaU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE); - LIB_FUNCTION( - "wVY5DpvU6PU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe); - LIB_FUNCTION( - "GDiCYtaiUyM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE); - LIB_FUNCTION( - "r-JSsJQFUsY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE8_PutmfldES3_bRSt8ios_basewbSbIwS2_SaIwEEw); - LIB_FUNCTION("StJaKYTRdUE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev); - LIB_FUNCTION("RP7ijkGGx50", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev); - LIB_FUNCTION("4GbIwW5u5us", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_); - LIB_FUNCTION("MB1VCygerRU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev); - LIB_FUNCTION("7VRfkz22vPk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev); - LIB_FUNCTION("EYZJsnX58DE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev); - LIB_FUNCTION("D5m73fSIxAU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt14_Error_objectsIiE16_Iostream_objectE); - LIB_FUNCTION("VpwymQiS4ck", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci); - LIB_FUNCTION("sXaxl1QGorg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci); - LIB_FUNCTION("IAEl1Ta7yVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv); - LIB_FUNCTION("lZVehk7yFok", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi); - LIB_FUNCTION("041c37QfoUc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi); - LIB_FUNCTION("olsoiZsezkk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv); - LIB_FUNCTION("jVwxMhFRw8Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt24_Iostream_error_categoryD0Ev); - LIB_FUNCTION("27Z-Cx1jbkU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt24_Iostream_error_categoryD1Ev); - LIB_FUNCTION("-mLzBSk-VGs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION( - "cXL+LN0lSwc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "p1WMhxL4Wds", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("uXj-oWD2334", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em); - LIB_FUNCTION( - "iTODM3uXS2s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("RNmYVYlZvv8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em); - LIB_FUNCTION( - "yAobGI2Whrg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("-1G1iE3KyGI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev); - LIB_FUNCTION("kAay0hfgDJs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev); - LIB_FUNCTION("6S8jzWWGcWo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev); - LIB_FUNCTION("NFAhHKyMnCg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION( - "4MHgRGOKOXY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "zTX7LL+w12Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("18rLbEV-NQs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em); - LIB_FUNCTION( - "0UPU3kvxWb0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("-+RKa3As0gE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em); - LIB_FUNCTION( - "e3shgCIZxRc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("aHDdLa7jA1U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev); - LIB_FUNCTION("Zbaaq-d70ms", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev); - LIB_FUNCTION("bwVJf3kat9c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev); - LIB_FUNCTION("E14mW8pVpoE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION( - "BbJ4naWZeRw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "hNAh1l09UpA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("LAEVU8cBSh4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em); - LIB_FUNCTION( - "Hg1im-rUeHc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("1gYJIrfHxkQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em); - LIB_FUNCTION( - "Mniutm2JL2M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("aOK5ucXO-5g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev); - LIB_FUNCTION("WoCt9o2SYHw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev); - LIB_FUNCTION("U4JP-R+-70c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev); - LIB_FUNCTION("kImHEIWZ58Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION( - "V2FICbvPa+s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "6iDi6e2e4x8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("xdHqQoggdfo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em); - LIB_FUNCTION( - "Ky+C-qbKcX0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("f1ZGLUnQGgo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em); - LIB_FUNCTION( - "0Pd-K5jGcgM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("jyXTVnmlJD4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev); - LIB_FUNCTION("WiUy3dEtCOQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev); - LIB_FUNCTION("6hV3y21d59k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev); - LIB_FUNCTION("a54t8+k7KpY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION("+yrOX7MgVlk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_TidyEv); - LIB_FUNCTION( - "eMnBe5mZFLw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("13xzrgS8N4o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em); - LIB_FUNCTION("9pPbNXw5N9E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm); - LIB_FUNCTION( - "iO5AOflrTaA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("dU8Q2yzFNQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em); - LIB_FUNCTION("M0n7l76UVyE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm); - LIB_FUNCTION( - "l7OtvplI42U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("mmq9OwwYx74", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev); - LIB_FUNCTION("Cp9ksNOeun8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev); - LIB_FUNCTION("dOKh96qQFd0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev); - LIB_FUNCTION("Q17eavfOw2Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION("ImblNB7fVVU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_TidyEv); - LIB_FUNCTION( - "e5jQyuEE+9U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("J2xO4cttypo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em); - LIB_FUNCTION("gOzIhGUAkME", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm); - LIB_FUNCTION( - "y0hzUSFrkng", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("p-SW25yE-Q8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em); - LIB_FUNCTION("XBmd6G-HoYI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm); - LIB_FUNCTION( - "bU3S1OS1sc0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("8H3yBUytv-0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev); - LIB_FUNCTION("QTgRx1NTp6o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev); - LIB_FUNCTION("Zqc++JB04Qs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev); - LIB_FUNCTION("BamOsNbUcn4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION( - "QdPT7uDTlo0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "ec0YLGHS8cw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("6htjEH2Gi-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em); - LIB_FUNCTION( - "u5yK3bGG1+w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("6NH0xVj6p7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em); - LIB_FUNCTION( - "IuFImJ5+kTk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("WQQlL0n2SpU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev); - LIB_FUNCTION("h+c9OSfCAEg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev); - LIB_FUNCTION("vu0B+BGlol4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev); - LIB_FUNCTION("JFiji2DpvXQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION( - "ZolDcuDSD0Q", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "bF2uVCqVhBY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("X3DrtC2AZCI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em); - LIB_FUNCTION( - "oi3kpQPqpMY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("lOF5jrFNZUA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em); - LIB_FUNCTION( - "b1LciG4lUUk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("6yplvTHbxpE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev); - LIB_FUNCTION("CiD6-BPDZrA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev); - LIB_FUNCTION("8PJ9qmklj2c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev); - LIB_FUNCTION("UQPicLg8Sx8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_Eb); - LIB_FUNCTION("uqLGWOX7-YE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_Eb); - LIB_FUNCTION("TsGewdW9Rto", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION( - "6zg3ziZ4Qis", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "MSSvHmcbs3g", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("YGPopdkhujM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em); - LIB_FUNCTION( - "7NQGsY7VY3c", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("f+1EaDVL5C4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em); - LIB_FUNCTION( - "iWtXRduTjHA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("b9QSruV4nnc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev); - LIB_FUNCTION("zkCx9c2QKBc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev); - LIB_FUNCTION("CClObiVHzDY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev); - LIB_FUNCTION("dplyQ6+xatg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION( - "JOj6qfc4VLs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "DTH1zTBrOO8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("bY9Y0J3GGbA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em); - LIB_FUNCTION( - "ej+44l1PjjY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("x5yAFCJRz8I", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em); - LIB_FUNCTION( - "m2lChTx-9tM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("RB3ratfpZDc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev); - LIB_FUNCTION("a6yvHMSqsV0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev); - LIB_FUNCTION("7ZmeGHyM6ew", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev); - LIB_FUNCTION("hf2Ljaf19Fs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); - LIB_FUNCTION( - "66AuqgLnsQE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIcEEEm); - LIB_FUNCTION( - "1dY2KJfkgMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE4_RepES3_cm); - LIB_FUNCTION( - "riBxNiKLvI0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "w9fCz0pbHdw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("Qi5fpNt5+T0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em); - LIB_FUNCTION( - "mdYczJb+bb0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("XqbpfYmAZB4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em); - LIB_FUNCTION( - "b2na0Dzd5j8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("s2zG12AYKTg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev); - LIB_FUNCTION("AnE9WWbyWkM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev); - LIB_FUNCTION("MuACiCSA8-s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev); - LIB_FUNCTION("pzfFqaTMsFc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); - LIB_FUNCTION( - "-hrHhi-UFxs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_PutES3_St22_String_const_iteratorISt11_String_valISt13_Simple_typesIwEEEm); - LIB_FUNCTION( - "6QU40olMkOM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE4_RepES3_wm); - LIB_FUNCTION( - "kJmdxo4uM+8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE5_InitERKSt8_Locinfo); - LIB_FUNCTION( - "0sHarDG9BY4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE7_GetcatEPPKNSt6locale5facetEPKS5_); - LIB_FUNCTION("rme+Po9yI5M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em); - LIB_FUNCTION( - "RV6sGVpYa-o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSt8_Locinfom); - LIB_FUNCTION("jIvWFH24Bjw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em); - LIB_FUNCTION( - "aTjYlKCxPGo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSt8_Locinfom); - LIB_FUNCTION("qkl3Siab04M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev); - LIB_FUNCTION("hnGhTkIDFHg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev); - LIB_FUNCTION("4+oswXtp7PQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev); - LIB_FUNCTION( - "bsohl1ZrRXE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEiRT0_S5_mPKT_); - LIB_FUNCTION( - "FX+eS2YsEtY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt10_GetloctxtIcSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_); - LIB_FUNCTION( - "i4J5FvRPG-w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt10_GetloctxtIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEiRT0_S5_mPKT_); - LIB_FUNCTION("V23qt24VPVs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZSt17iostream_categoryv); - LIB_FUNCTION("iXChH4Elf7M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt13basic_istreamIwSt11char_traitsIwEE); - LIB_FUNCTION("Lc-l1GQi7tg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt13basic_ostreamIwSt11char_traitsIwEE); - LIB_FUNCTION("FCuvlxsgg0w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt24_Iostream_error_category); - LIB_FUNCTION("ymXfiwv59Z0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt15basic_streambufIcSt11char_traitsIcEE); - LIB_FUNCTION("muIOyDB+DP8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt15basic_streambufIwSt11char_traitsIwEE); - LIB_FUNCTION("6ddOFPDvuCo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("dO7-MxIPfsw", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("RYlvfQvnOzo", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("C3sAx2aJy3E", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("C4j57iQD4I8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("oYliMCqNYQg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("33t+tvosxCI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("h9C+J68WriE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("oNAnn5cOxfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("QNAIWEkBocY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("hBeW7FhedsY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("7DzM2fl46gU", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("IfWUkB7Snkc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt15basic_streambufIcSt11char_traitsIcEE); - LIB_FUNCTION("qiloU7D8MBM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt15basic_streambufIwSt11char_traitsIwEE); - LIB_FUNCTION("0Ys3rv0tw7Y", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt13basic_istreamIwSt11char_traitsIwEE); - LIB_FUNCTION("R72NCZqMX58", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt13basic_ostreamIwSt11char_traitsIwEE); - LIB_FUNCTION("ItmiNlkXVkQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt24_Iostream_error_category); - LIB_FUNCTION("5DdJdPeXCHE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("XYqrcE4cVMM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("B9rn6eKNPJg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("KY+yxjxFBSY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("-l+ODHZ96LI", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("bn3sb2SwGk8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("OI989Lb3WK0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("gqwPsSmdh+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("K8CzKJ7h1-8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("Q3YIaCcEeOM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("wRyKNdtYYEY", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("0x4NT++LU9s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("izmoTISVoF8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev); - LIB_FUNCTION("q05IXuNA2NE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev); - LIB_FUNCTION("0j1jspKbuFk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev); - LIB_FUNCTION("HSkPyRyFFHQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev); - LIB_FUNCTION("DBO-xlHHEn8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt13basic_istreamIwSt11char_traitsIwEE); - LIB_FUNCTION("BMuRmwMy6eE", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt13basic_ostreamIwSt11char_traitsIwEE); - LIB_FUNCTION("lJPCM50sdTc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt24_Iostream_error_category); - LIB_FUNCTION("KfcTPbeaOqg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("Y9C9GeKyZ3A", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("1kZFcktOm+s", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("59oywaaZbJk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("o4kt51-uO48", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("sEca1nUOueA", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("OwfBD-2nhJQ", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("5KOPB+1eEfs", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("3n3wCJGFP7o", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("CUkG1cK2T+U", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION("zdCex1HjCCM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE); - LIB_FUNCTION("ogi5ZolMUs4", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE); - LIB_FUNCTION( - "4-Fllbzfh2k", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src); - LIB_FUNCTION( - "NQW6QjEPUak", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src); - LIB_FUNCTION( - "3P+CcdakSi0", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src); - LIB_FUNCTION( - "o-gc5R8f50M", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetffldEPcRS3_S6_RSt8ios_basePiE4_Src); - LIB_FUNCTION( - "3kjXzznHyCg", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetifldEPcRS3_S6_NSt5_IosbIiE9_FmtflagsERKSt6localeE4_Src); - LIB_FUNCTION( - "DKkwPpi+uWc", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE9_GetffldxEPcRS3_S6_RSt8ios_basePiE4_Src); - LIB_FUNCTION( - "mZW-My-zemM", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8_GetmfldERS3_S5_bRSt8ios_basePcE4_Src); - LIB_FUNCTION( - "HCzNCcPxu+w", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8_GetmfldERS3_S5_bRSt8ios_basePwE4_Src); - LIB_FUNCTION( - "sHagUsvHBnk", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSsE4_Src); - LIB_FUNCTION( - "A5EX+eJmQI8", "libSceLibcInternal", 1, "libSceLibcInternal", 1, 1, - internal__ZZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEEE4_Src); -} - -} // namespace Libraries::LibcInternal diff --git a/src/core/libraries/libc_internal/libc_internal_stream.h b/src/core/libraries/libc_internal/libc_internal_stream.h deleted file mode 100644 index e245454aa..000000000 --- a/src/core/libraries/libc_internal/libc_internal_stream.h +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/types.h" - -namespace Core::Loader { -class SymbolsResolver; -} - -namespace Libraries::LibcInternal { -void RegisterlibSceLibcInternalStream(Core::Loader::SymbolsResolver* sym); -} // namespace Libraries::LibcInternal \ No newline at end of file diff --git a/src/core/libraries/libc_internal/printf.h b/src/core/libraries/libc_internal/printf.h new file mode 100644 index 000000000..fe63481a0 --- /dev/null +++ b/src/core/libraries/libc_internal/printf.h @@ -0,0 +1,763 @@ +// SPDX-FileCopyrightText: Copyright 2014-2018 Marco Paland (info@paland.com) +// SPDX-License-Identifier: MIT + +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2018, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. +// Use this instead of bloated standard/newlib printf. +// These routines are thread safe and reentrant! +// +/////////////////////////////////////////////////////////////////////////////// +// Vita3K emulator project +// Copyright (C) 2023 Vita3K team +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +// copied from Vita3k project at 6/10/2023 (latest update 30/06/2023) +// modifications for adapting va_args parameters + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +#include "common/va_ctx.h" + +namespace Libraries::LibcInternal { +// ntoa conversion buffer size, this must be big enough to hold +// one converted numeric number including padded zeros (dynamically created on stack) +// 32 byte is a good default +#define PRINTF_NTOA_BUFFER_SIZE 32U + +// ftoa conversion buffer size, this must be big enough to hold +// one converted float number including padded zeros (dynamically created on stack) +// 32 byte is a good default +#define PRINTF_FTOA_BUFFER_SIZE 32U + +// define this to support floating point (%f) +#define PRINTF_SUPPORT_FLOAT + +// define this to support long long types (%llu or %p) +#define PRINTF_SUPPORT_LONG_LONG + +// define this to support the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +#define PRINTF_SUPPORT_PTRDIFF_T + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_WIDTH (1U << 11U) + +// output function type +typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen); + +// wrapper (used as buffer) for output function type +typedef struct { + void (*fct)(char character, void* arg); + void* arg; +} out_fct_wrap_type; + +// internal buffer output +static inline void _out_buffer(char character, void* buffer, size_t idx, size_t maxlen) { + if (idx < maxlen) { + ((char*)buffer)[idx] = character; + } +} + +// internal null output +static inline void _out_null(char character, void* buffer, size_t idx, size_t maxlen) { + (void)character; + (void)buffer; + (void)idx; + (void)maxlen; +} + +// internal output function wrapper +static inline void _out_fct(char character, void* buffer, size_t idx, size_t maxlen) { + (void)idx; + (void)maxlen; + // buffer is the output fct pointer + ((out_fct_wrap_type*)buffer)->fct(character, ((out_fct_wrap_type*)buffer)->arg); +} + +// internal strlen +// \return The length of the string (excluding the terminating 0) +static inline unsigned int _strlen(const char* str) { + const char* s; + for (s = str; *s; ++s) + ; + return (unsigned int)(s - str); +} + +// internal test if char is a digit (0-9) +// \return true if char is a digit +static inline bool _is_digit(char ch) { + return (ch >= '0') && (ch <= '9'); +} + +// internal ASCII string to unsigned int conversion +static inline unsigned int _atoi(const char** str) { + unsigned int i = 0U; + while (_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; +} + +// internal itoa format +static inline size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen, + char* buf, size_t len, bool negative, unsigned int base, + unsigned int prec, unsigned int width, unsigned int flags) { + const size_t start_idx = idx; + + // pad leading zeros + while (!(flags & FLAGS_LEFT) && (len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD) && (len < width) && + (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + + // handle hash + if (flags & FLAGS_HASH) { + if (((len == prec) || (len == width)) && (len > 0U)) { + len--; + if ((base == 16U) && (len > 0U)) { + len--; + } + } + if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } + if ((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } + if (len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } + } + + // handle sign + if ((len == width) && (negative || (flags & FLAGS_PLUS) || (flags & FLAGS_SPACE))) { + len--; + } + if (len < PRINTF_NTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + for (size_t i = 0U; i < len; i++) { + out(buf[len - i - 1U], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} + +// internal itoa for 'long' type +static inline size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, + unsigned long value, bool negative, unsigned long base, + unsigned int prec, unsigned int width, unsigned int flags) { + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = + digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, + width, flags); +} + +// internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static inline size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, + unsigned long long value, bool negative, + unsigned long long base, unsigned int prec, unsigned int width, + unsigned int flags) { + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = + digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, + width, flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + +#if defined(PRINTF_SUPPORT_FLOAT) +static inline size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, + unsigned int prec, unsigned int width, unsigned int flags) { + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; + + // if input is larger than thres_max, revert to exponential + const double thres_max = (double)0x7FFFFFFF; + + // powers of 10 + static const double pow10[] = {1, 10, 100, 1000, 10000, + 100000, 1000000, 10000000, 100000000, 1000000000}; + + // test for negative + bool negative = false; + if (value < 0) { + negative = true; + value = 0 - value; + } + + // set default precision to 6, if not set explicitly + if (!(flags & FLAGS_PRECISION)) { + prec = 6U; + } + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { + buf[len++] = '0'; + prec--; + } + + int whole = (int)value; + double tmp = (value - whole) * pow10[prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; + + if (diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if (frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } else if ((diff == 0.5) && ((frac == 0U) || (frac & 1U))) { + // if halfway, round up if odd, OR if last digit is 0 + ++frac; + } + + // TBD: for very large numbers switch back to native sprintf for exponentials. Anyone want to + // write code to replace this? Normal printf behavior is to print EVERY whole number digit which + // can be 100s of characters overflowing your buffers == bad + if (value > thres_max) { + return 0U; + } + + if (prec == 0U) { + diff = value - (double)whole; + if (diff > 0.5) { + // greater than 0.5, round up, e.g. 1.6 -> 2 + ++whole; + } else if ((diff == 0.5) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while (len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if (!(frac /= 10U)) { + break; + } + } + // add extra 0s + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if (len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } + } + + // do whole part, number is reversed + while (len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if (!(whole /= 10)) { + break; + } + } + + // pad leading zeros + while (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD) && (len < width) && + (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + + // handle sign + if ((len == width) && (negative || (flags & FLAGS_PLUS) || (flags & FLAGS_SPACE))) { + len--; + } + if (len < PRINTF_FTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + for (size_t i = 0U; i < len; i++) { + out(buf[len - i - 1U], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} +#endif // PRINTF_SUPPORT_FLOAT + +// internal vsnprintf +static inline int _vsnprintf(out_fct_type out, char* buffer, const char* format, + Common::VaList* va_list) { + unsigned int flags, width, precision, n; + size_t idx = 0U; + auto maxlen = static_cast(-1); + + if (!buffer) { + // use null output function + out = _out_null; + } + + while (*format) { + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } else { + // yes, evaluate it + format++; + } + + // evaluate flags + flags = 0U; + do { + switch (*format) { + case '0': + flags |= FLAGS_ZEROPAD; + format++; + n = 1U; + break; + case '-': + flags |= FLAGS_LEFT; + format++; + n = 1U; + break; + case '+': + flags |= FLAGS_PLUS; + format++; + n = 1U; + break; + case ' ': + flags |= FLAGS_SPACE; + format++; + n = 1U; + break; + case '#': + flags |= FLAGS_HASH; + format++; + n = 1U; + break; + default: + n = 0U; + break; + } + } while (n); + + // evaluate width field + width = 0U; + if (_is_digit(*format)) { + width = _atoi(&format); + } else if (*format == '*') { + const int w = vaArgInteger(va_list); // const int w = va.next(cpu, mem); + + if (w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int)-w; + } else { + width = (unsigned int)w; + } + format++; + } + + // evaluate precision field + precision = 0U; + if (*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if (_is_digit(*format)) { + precision = _atoi(&format); + } else if (*format == '*') { + precision = + vaArgInteger(va_list); // precision = (unsigned int)va.next(cpu, mem); + format++; + } + } + + // evaluate length field + switch (*format) { + case 'l': + flags |= FLAGS_LONG; + format++; + if (*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h': + flags |= FLAGS_SHORT; + format++; + if (*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't': + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; +#endif + case 'j': + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + case 'z': + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default: + break; + } + + // evaluate specifier + switch (*format) { + case 'd': + case 'i': + case 'u': + case 'x': + case 'X': + case 'o': + case 'b': { + // set the base + unsigned int base; + if (*format == 'x' || *format == 'X') { + base = 16U; + } else if (*format == 'o') { + base = 8U; + } else if (*format == 'b') { + base = 2U; + flags &= ~FLAGS_HASH; // no hash for bin format + } else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if (*format == 'X') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if ((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // convert the integer + if ((*format == 'i') || (*format == 'd')) { + // signed + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + auto value = vaArgLongLong( + va_list); // const long long value = va.next(cpu, mem); + idx = _ntoa_long_long(out, buffer, idx, maxlen, + (unsigned long long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); +#endif + } else if (flags & FLAGS_LONG) { + auto value = vaArgLong(va_list); // const long value = va.next(cpu, mem); + idx = _ntoa_long(out, buffer, idx, maxlen, + (unsigned long)(value > 0 ? value : 0 - value), value < 0, + base, precision, width, flags); + } else { + // const int value = (flags & FLAGS_CHAR) ? (char)va.next(cpu, mem) : + // (flags & FLAGS_SHORT) ? (short int)va.next(cpu, mem): va.next(cpu, + // mem); + const int value = + (flags & FLAGS_CHAR) ? static_cast(vaArgInteger(va_list)) + : (flags & FLAGS_SHORT) ? static_cast(vaArgInteger(va_list)) + : vaArgInteger(va_list); + idx = _ntoa_long(out, buffer, idx, maxlen, + (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, + precision, width, flags); + } + } else { + // unsigned + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + // idx = _ntoa_long_long(out, buffer, idx, maxlen, va.next(cpu, mem), false, base, precision, width, flags); + idx = _ntoa_long_long(out, buffer, idx, maxlen, + static_cast(vaArgLongLong(va_list)), false, base, + precision, width, flags); +#endif + } else if (flags & FLAGS_LONG) { + // idx = _ntoa_long(out, buffer, idx, maxlen, va.next(cpu, mem), + // false, base, precision, width, flags); + idx = _ntoa_long(out, buffer, idx, maxlen, static_cast(vaArgLong(va_list)), + false, base, precision, width, flags); + } else { + // const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned + // char)va.next(cpu, mem) : (flags & FLAGS_SHORT) ? + // (unsigned short int)va.next(cpu, mem) : va.next(cpu, mem); + const unsigned int value = + (flags & FLAGS_CHAR) ? static_cast(vaArgInteger(va_list)) + : (flags & FLAGS_SHORT) ? static_cast(vaArgInteger(va_list)) + : static_cast(vaArgInteger(va_list)); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, + flags); + } + } + format++; + break; + } +#if defined(PRINTF_SUPPORT_FLOAT) + case 'f': + case 'F': + // idx = _ftoa(out, buffer, idx, maxlen, va.next(cpu, mem), precision, width, + // flags); + idx = _ftoa(out, buffer, idx, maxlen, vaArgDouble(va_list), precision, width, flags); + format++; + break; +#endif // PRINTF_SUPPORT_FLOAT + case 'c': { + unsigned int l = 1U; + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + // out((char)va.next(cpu, mem), buffer, idx++, maxlen); + out(static_cast(vaArgInteger(va_list)), buffer, idx++, maxlen); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 's': { + const char* p = vaArgPtr( + va_list); // const char *p = va.next>(cpu, mem).get(mem); + p = p != nullptr ? p : "(null)"; + unsigned int l = _strlen(p); + // pre padding + if (flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 'p': { + width = sizeof(void*) * 2U; + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; +#if defined(PRINTF_SUPPORT_LONG_LONG) + const bool is_ll = sizeof(uintptr_t) == sizeof(long long); + if (is_ll) { + // idx = _ntoa_long_long(out, buffer, idx, maxlen, + // (uintptr_t)va.next>(cpu, mem).address(), false, 16U, precision, width, + // flags); + idx = _ntoa_long_long(out, buffer, idx, maxlen, + reinterpret_cast(vaArgPtr(va_list)), false, + 16U, precision, width, flags); + } else { +#endif + // idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned + // long)((uintptr_t)va.next>(cpu, mem).address()), false, 16U, precision, + // width, flags); + idx = _ntoa_long( + out, buffer, idx, maxlen, + static_cast(reinterpret_cast(vaArgPtr(va_list))), + false, 16U, precision, width, flags); +#if defined(PRINTF_SUPPORT_LONG_LONG) + } +#endif + format++; + break; + } + + case '%': + out('%', buffer, idx++, maxlen); + format++; + break; + + default: + out(*format, buffer, idx++, maxlen); + format++; + break; + } + } + + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + + // return written chars without terminating \0 + return (int)idx; +} + +static int printf_ctx(Common::VaCtx* ctx) { + const char* format = vaArgPtr(&ctx->va_list); + char buffer[256]; + int result = _vsnprintf(_out_buffer, buffer, format, &ctx->va_list); + printf("%s", buffer); + return result; +} + +static int fprintf_ctx(Common::VaCtx* ctx, char* buf) { + const char* format = vaArgPtr(&ctx->va_list); + char buffer[256]; + int result = _vsnprintf(_out_buffer, buffer, format, &ctx->va_list); + std::strcpy(buf, buffer); + return result; +} + +static int vsnprintf_ctx(char* s, size_t n, const char* format, Common::VaList* arg) { + char buffer[n]; + int result = _vsnprintf(_out_buffer, buffer, format, arg); + std::strcpy(s, buffer); + return result; +} + +static int snprintf_ctx(char* s, size_t n, Common::VaCtx* ctx) { + const char* format = vaArgPtr(&ctx->va_list); + char buffer[n]; + int result = _vsnprintf(_out_buffer, buffer, format, &ctx->va_list); + std::strcpy(s, buffer); + return result; +} + +} // namespace Libraries::LibcInternal \ No newline at end of file From 4f1baece33c6c324a14b22508d5755f7ac6885dd Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sat, 22 Feb 2025 21:47:44 -0600 Subject: [PATCH 334/455] Avoid processing job buffers before codec initialization (#2507) --- src/core/libraries/ajm/ajm_instance.cpp | 5 +++++ src/core/libraries/ajm/ajm_instance.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/core/libraries/ajm/ajm_instance.cpp b/src/core/libraries/ajm/ajm_instance.cpp index 8af105c77..01b1d2b21 100644 --- a/src/core/libraries/ajm/ajm_instance.cpp +++ b/src/core/libraries/ajm/ajm_instance.cpp @@ -66,6 +66,7 @@ void AjmInstance::ExecuteJob(AjmJob& job) { LOG_TRACE(Lib_Ajm, "Initializing instance {}", job.instance_id); auto& params = job.input.init_params.value(); m_codec->Initialize(¶ms, sizeof(params)); + is_initialized = true; } if (job.input.resample_parameters.has_value()) { LOG_ERROR(Lib_Ajm, "Unimplemented: resample parameters"); @@ -89,6 +90,10 @@ void AjmInstance::ExecuteJob(AjmJob& job) { } } + if (!is_initialized) { + return; + } + if (!job.input.buffer.empty() && !job.output.buffers.empty()) { std::span in_buf(job.input.buffer); SparseOutputBuffer out_buf(job.output.buffers); diff --git a/src/core/libraries/ajm/ajm_instance.h b/src/core/libraries/ajm/ajm_instance.h index 9d0f6b9f3..e02ac6ffb 100644 --- a/src/core/libraries/ajm/ajm_instance.h +++ b/src/core/libraries/ajm/ajm_instance.h @@ -96,6 +96,7 @@ private: AjmSidebandResampleParameters m_resample_parameters{}; u32 m_total_samples{}; std::unique_ptr m_codec; + bool is_initialized = false; }; } // namespace Libraries::Ajm From 22ca57b1f21c9a08d675196e220bc77892d4c7a2 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Sun, 23 Feb 2025 16:00:24 +0800 Subject: [PATCH 335/455] Trophy pop-up and viewer enhancements (#2493) * Include trophy rarity icons in pop up, remove newlines from viewer Fix layout Update platinum.png Fix linux and apple * Smaller type icons, center text vertically * use original icons * MacOS fixes * Address Review comments Update build.yml Update build.yml Update build.yml Update build.yml Update build.yml Update build.yml Update build.yml test * Move trophy type to leftmost and trophy art to rightmost * Embed resources * Revert packaging of resources with builds --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- CMakeLists.txt | 19 + REUSE.toml | 8 + Resources/bronze.png | Bin 0 -> 40833 bytes Resources/gold.png | Bin 0 -> 43997 bytes Resources/platinum.png | Bin 0 -> 44931 bytes Resources/silver.png | Bin 0 -> 33459 bytes cmake/CMakeRC.cmake | 666 +++++++++++++++++++++ src/core/libraries/np_trophy/np_trophy.cpp | 4 +- src/core/libraries/np_trophy/trophy_ui.cpp | 72 ++- src/core/libraries/np_trophy/trophy_ui.h | 11 +- src/qt_gui/trophy_viewer.cpp | 30 +- src/qt_gui/trophy_viewer.h | 12 +- 12 files changed, 795 insertions(+), 27 deletions(-) create mode 100644 Resources/bronze.png create mode 100644 Resources/gold.png create mode 100644 Resources/platinum.png create mode 100644 Resources/silver.png create mode 100644 cmake/CMakeRC.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b1c0082b..820d46f9d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,6 +195,7 @@ endif() add_subdirectory(externals) include_directories(src) +include_directories(Resources) if(ENABLE_QT_GUI) find_package(Qt6 REQUIRED COMPONENTS Widgets Concurrent LinguistTools Network Multimedia) @@ -953,6 +954,12 @@ set(QT_GUI src/qt_gui/about_dialog.cpp ) endif() +set(RESOURCEFOLDER Resources/bronze.png + Resources/gold.png + Resources/platinum.png + Resources/silver.png +) + if (ENABLE_QT_GUI) qt_add_executable(shadps4 ${AUDIO_CORE} @@ -964,6 +971,7 @@ if (ENABLE_QT_GUI) ${SHADER_RECOMPILER} ${VIDEO_CORE} ${EMULATOR} + ${RESOURCEFOLDER} src/images/shadPS4.icns ) else() @@ -976,6 +984,7 @@ else() ${SHADER_RECOMPILER} ${VIDEO_CORE} ${EMULATOR} + ${RESOURCEFOLDER} src/main.cpp src/emulator.cpp src/emulator.h @@ -1102,6 +1111,16 @@ add_subdirectory(${HOST_SHADERS_INCLUDE}) add_dependencies(shadps4 host_shaders) target_include_directories(shadps4 PRIVATE ${HOST_SHADERS_INCLUDE}) +# embed resources + +include(CMakeRC) +cmrc_add_resource_library(embedded-resources + ALIAS res::embedded + NAMESPACE res + ${RESOURCEFOLDER}) + +target_link_libraries(shadps4 PRIVATE res::embedded) + # ImGui resources add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/imgui/renderer) add_dependencies(shadps4 ImGui_Resources) diff --git a/REUSE.toml b/REUSE.toml index 3bc09e328..9c6ada42a 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -19,6 +19,10 @@ path = [ "documents/Screenshots/*", "documents/Screenshots/Linux/*", "externals/MoltenVK/MoltenVK_icd.json", + "Resources/bronze.png", + "Resources/gold.png", + "Resources/platinum.png", + "Resources/silver.png", "scripts/ps4_names.txt", "src/images/about_icon.png", "src/images/controller_icon.png", @@ -103,3 +107,7 @@ path = "externals/gcn/include/**" SPDX-FileCopyrightText = "NONE" SPDX-License-Identifier = "CC0-1.0" +[[annotations]] +path = "cmake/CMakeRC.cmake" +SPDX-FileCopyrightText = "Copyright (c) 2017 vector-of-bool " +SPDX-License-Identifier = "MIT" \ No newline at end of file diff --git a/Resources/bronze.png b/Resources/bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..65aa2fb695121ab29fa68c37e35553afcbae3e2d GIT binary patch literal 40833 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�CH?6$1 z9#T-0;N1X(9ul>*D6Rla^9oq(97U7jB|vCBM4N>_Gl4lRh>Tp5$~e=w+PA^3zep?& z$BV&BW)REtzW+-Pe&^+Pd77*C?HzzD!qR`{;~)7~<*AYX(J0Lc-Gu>sL#prWH(3y= z6SAYpZaK^tvHu=s#8{gIr|thB7#N(Z+Hkvz#S9h04zh3=kcSarHC(b(2}BcVILYqG zukU$cU=dDlRUe`QkVRVl-}&U-e~=q~?ek5ENhb_Lbb-oFMa>n3V=LjL>d2po?9z~R~Ml=prQn*R{!w-MbS=&We+s;K? zgo|ho@ri3M2^zB_XjF6JYFY6I4b<&aSf!?Dpw8ICfyeO>GRanhcN=@i%oKt}0&ksn zn2PEIUb2=Mr?88%;yY+MF~DOm-ivc?x@GV${^GC47xC0q?V&mVS;VFPt=n$vDvlq@ zvr6Bp&zWJGO3)B;WSfYb2rJkz31(oARK;m1jPM&j8rih{UD}T?1#<@KEma|zC^|Cw zjB4u$B@v2ckyv;3>tB83(O){vX%SC(#UH8zkVRhNPu_Ixf2m9i|FK`5f#0aiO9@%c zEXh_GK{xhNa4ImlUlf|K^F^e@VdiGADT&&(?ARkXMCz!eH2pE@2X|y>W+>VPFTDnd zu63!eeE<9J*&gpjzT8WGxDG&;;1YlQs*8h0ZWMkkuRZVcO;SpdlmV4(vq5bA!wS7w z86#R94g}34^qKz_ZdOZY%(D+;wnFzR4maA3?DidB`tk#hd~OL&Y1JOG1CS+H`cK_@ zs{e_ePiCbXN5tI{;at0KkJt#!45~Zr_zjwl`xir7DdJt81ZQi6Qaf7zik{sz)(2PibIgD z!f|BPhJ!aI9GomsIbjHwe&TbXrJD4*M3-n;9JT|HC0eG>-FB$n#FOzFQU;@ zwZ`^FEtz*7Qt2Yb7#t{L0U;A#Io2SoI$X9Hi(Lnm)GZYswMM7#%rQ>GWY%LHS zFDe!?l;QU;pKy@#GjRLQ9)9qt=YQeM#w9+z6@T~+K$dukZ@c8|JPIee{6=|RT~Ve% znHe4o$k_+Kmeulz3L_9aDXOi+D9T2CTW#5;n?*%ODi^*q;-KdCVcn(IZ~EU~*?nw@ zPh-^{z5|dYUiyFbky~c-2Y;Mx*5@S9w$eikz?rO~8%1zX-_};xnbOVD-3q&?)>|l6 z9aKr{Wp7A}b2S|7n+T&G9m03^9__5*60TwA;x6IEwTHg#oZi5%PD`qmfx67>GwP4j z=i1uqARE`2CIkm92=#8+@4cJHqPqs)-9Oq{za?J3&IMlL3(Ujcbm8WpSvZCeX^Vz% zDD%xjz?L3hQ@6TS1c*##k}=8Dwt~1Iv8B5u zoU23A4oWpm`O>{QcR*b%p}&WKzBG`GQOXCX)LNKk*C6Nnm=OpE#vQzwOJd`dAI6uz zabIT*fAtca@hdtP_lz&yslV}>Z3BT@o5cA80a66Wlul!!#aN#KE*x?Y@l+X}aS2CP zcO`U=AZsU+d99v{dJurOrhr!_<5<7*L-_gw4|Ue?)R*G4U)j01r+vvz{|#4f=?kL% zG%gwp#DzLM4U87lVr=eqaKWICxR$XDj#`jx(g38%QOkj(dHH*O9h-IV;>jomF1jA~ zKeDH@hNr(Ir~Ho2#XaRqb>=U;dUJ0OZO-75b?R2VHKUuHedyc!Xh9Sh^`^!pv>+K{ zK{!r^i_#~bjy!1E(fWVT+0ho5-5vxaBBG{5qlos0V`FVVYu!95@TaQBf{pPEU# z1-x%at;UfVeGm-it#NSSprMga);CZK(v@J~?uc78QBVuQ!8Ux)@mb*MqaK3fIy`lt zLp6DKEA-3X-2uo_UR?k;UvDM^p@Dy+?rx~k@*8=CS(T+h@$r+bW z#e^;vzvs_q<^q)JI{7LV2{2uB@YtIU>fwGod1$<|hD*4Hor}AK7ng^=_U!d@wZh5N zg#%5j%{XZI0S-)Rsy7{VuwxzFEJsuq2?By5n_x9vhi?)fQ*(jnU@>Ut36fGqLSU%9z2aOyL-bZtx2Ntlh=HwH|WfSx$8b3L%R zSAjr)@T)sv$%+dWgeoRnEKZ(fMg8f+z`>aq(u3QFAARxFPCv*Jtz!ouOLSp**iYPk z>z^Lq`}Dmj6mi)Gh~x;tYQ0)&J`E*2FQ*|$DC?ckBu9ke1n_{s28XC0Sl9Xl6x zi7qS;d))ZWMt+fY5@3Jq_O3Q8-=HItbO>({cUTBm04oxhP`U zwGaMi|63nl!c$qbhwcDmiI)EM>#zRe_@P%n8*LSF<;DQXs0P>6(>*w);&JEp1Lv&K zpuF9J$O!6;x>)>TyX{m_MH>=P)#|M^fTs>Q*gN4N-m?Ku?0c)TmP@dfor}5z7nO(n z!1-Humu5!q>WS8H>H0u8R;-jCnbsmUtBDxh#aj-m@_~)NT;DL z7T+&wCniweJL2F+Z@Fkjve^Rj9jA35 zK*-poi`APZ6-Aea@ySdv5QRmX2BxdUK>hK9z@gbNqS>{0>hdf&sE=;>sT(L=K3Nk>a6<`&;(g4<^wNYwIuUZOHP#A-dkVuXevsf|{#8tUb z^090+ofe0BS~cIn^TWW4qb{6S57wQx@)B9GUjUqz2nmGa*1W_2}>UGg=5zQMmb88=)+zj)V@7E74+TCXBzQ8%CAI z{iDE>!w%|B3gNDSJD=Tu=-W$hN~`ve9e^zI(%s(GB%-I6*719U1P zo|t93t-4H%OPJm>)08cI!7ep*bS}W#`qoWVXHDH$F4bWjbq{CC^_vke6*g>G+ z$I-L-eC&Dlh0dBT;+l3Y<|1B99_p%dH(y_yn|Z?Zi@0#0g$>=h>1i3XQA%04o4bMS z{lMCcw%PLcB?jr7Z0l*7Hy+jH;W+71RRO|TArUta?OwWI;{`|@GE$7tg5W0yk9XE| z5!bYHF&FV-@=!Nkz9X19_6A~36_>1IFdhgX$i1R_#kn37W*|V$CP1=ELS$UR7=wH* z8-v6nItyLiUt^%It{Pv%S_pqn>dLc60vwnM1JMl9>(1W%__NO*UF6eRwTJ5fWO0|? zx$>-at?Jw)x+8S~2zx%b$r*s}p8%#y3V^LWYC#yRQ>V9DH!hZu{^?1o1tI?`Xlb!< zrsSa7Pz_&J+gVlTD7Kf52Y7KLgjP6>p7m#6{k>$*tm+PRR6bRl_|kKc03$A(}1@q>&% z&gpN7m0%A#H~mBr(n&}laATj<=U{73fL_x%SgC6omtO=1r%gp8+EvIJ3WtDBk#1sC z-fcyl3&`OA@k79LH4HD+hvyD;GKu*+>8yjqqkO+3wGmd+DM89W zo)(7|gdK`}17nlN-vo~4IbXU9FC6Pgk}lS=b^x+iR}#QwTZe*1X&RYuLn`QY#vlXh zk-Q4VvEIR9om+bxtj`8utU*vvIZ>!4Ce2IX2F4gn*l#T2sjb>WbpW!6OMl6Ro`CVk+H?!=U#oKn`9&JZ z@T@X<34pU<9K5N7%xJ8 zMv(^2CG1Z*=t(M&n5AMRopg5w_Ou|h5Co4{As<3FA&5lSfdEM=K=>X?1MPVoI9>=L z2&a)5-2D9GKmFMii*$Oc_AniQEW*-XbK&;c(#&|a)hMGY;!FL5l0I^)5466)6z@z$ zI|&I8x>-F5pwIN4GX|LlNJy;%ACkr5=;wwuR7n=g2s`lij?1Ph2c>F&C*K72O*m*E z3MZPz;MVj1_>sq-_-~7FimUbz9e}*crQdbgjtBB5kA1vZFTz6uo3a5eSYrm_KFJhPqVphX7%aE>x4I77O{s;$RmogtZ`n)<{YfrKIqS`dFN!&Z<0-$V9-A z$pB9r3NTsm&~#&nq-Q{ecHMmGv`R=MF&5@WSzJx9+;;GZRPN{8FP*fZM7g z6={k7Za*_qa%T@DKxd0BrAE1lSw&|Si}6Q>>Lm#U2+53mEiDG)auO98hp^tkxP&nZ z`B(%9)4uE(p#`DxiQ~BPnqnouPlp4%GUlM{dkDM)vTL{Chd+I}v(9I@&YcT)h8OPc zn{LVs4vkWaIUg;<&W*j^_42;gv)r!E0q!91w`P4J}4&HZ$ zr@E@&)&a;FF8>F1Tv#hi9FMdb6*xfyF*lIZEk~+}+hc}qGJC}$AuR+iHi5uOIV}Jw zCs9xP)A=)|h3SIHwA+y3TSas>I#ao{5`Ieyi+ml`O%lS_Qh6Y@>(0ypdq;tN<3Onq zLd%W8jinIl>Dlzmi~EnA;pwj0w{-w=21|d-_1AuD^2mWZ8&zuY)Ddx8ayKVKm)R$7 zaMmj(i>krP;vfTU*8F75nqln9q+3tjE&_%?p=-r2zJ}Q?b|dolv_=F7LBQkiL5-|b zTxX83V94K>s{xM90GwlZqTrw&cz_p2G}VotywPdNJ>BK*0OWM97=Rs{)&$KOx#u-_ zP7|p}fQ?y=E4bn52GO+|om1C}v4?E>kj58w^LwsNmZIAgCs4>(_lyN$EaIyBMK_G^ zCCEgdk&~!g1rvjH_J!z|Hdm1Xzkf8qzHtY+stex)GYIKo zF?~zW*tmk5o)&}s=AILX)gUX8 z;@@I9vQTN^@C5L)QM!2!{2&a36NqQ~@XWq9JL`Um>)yFgr+A_GvMbKs6jbMC(DJJY z!AC00xFf(i(>5y_R;+ke6(Dr8?55^sr)A(>pH{*Gh2UUDiehp6-U5RbL|iYrU15%5 z3xrZ4$1}q`tpbWDzDF#vQPmh5O%oJfDa8|FTYZ-9!uFim*U4tV9)xYAV=AE73u8*%-tI;?{cb_l#>K@HfC-(JcYII0OVI(q+Ppqd5!7O zMsa2W&3XlHKw{7t93a ze2-+e+5p0jsf9unnX@y~351vzNH&XAb*l)k87)m192#%QRI8J;BCRl5bhV;M^sL+X z$;Y1g>Hj^2eX?p_(gDb?So*6kJ})TGPNG>aOU=VY3$c*K9gIJC=ca`qKzNsz06h;( zmUVOTi>^?6twRJCBD%5pbApG$4feIRUc$H{8P#GUK|_l`fUsytSI(xj#8neF%W|`n z{3-}ny` z$Bul`ua?oMmJs-qUiaZSEeWz&^VpDekdA8Xz`He5x+Eq}nDj0KYRM_FW?_nfj5%a8 zGxji6gzsm-&BdVQ;IU{?Xjup*6_8Vakj+bGuTP7`syd9yiH$>yo5iCMAhwU>z!<0N zI>IPsMymx6P9%4_6Rt(Qyi>s18JIsyWN^U;DP zTqELUsUoxnj4NcwjkrI0_vhVx-d&=LWnv3%Wc^;}dqhmuir|oxE>pFp;w~U*%Y5)_B-AT<%jMt=<%;qUFwvKu1O}DcXa&SwGU-(t zR7?C}zC>TaWS6*^x!LJn(JHVAXo13*#4>id@oiy{ZV~}ps z$6{TKWGPd^4A%L%v>pN!Dh?*+0vw&y3P01&^_GJsK| z;~)3zS@jk74nSA{ykL9Fuaq3WUPqHIRm+#DnhvF+2@r8s)NK);-_#$t3Avg1JNe!` zWb+Gw(6~;9Yh`Kebes5Ep{q*;T$#G_05Qj<1&~ab0S=GJ7ZFsJlVvRl|7}4lRr-*A zX1aQm3YsXWHW#yNbOY6j&}k${LIACa6M_>8!wp9ej>OTwe&bV*JpSZ$tJ#LEYJgn( z{)_&kUM~LUdZjE@gRzEyBWS`2sH4s(+km4D1l;)6l32INf`c1AO!vve8Qip%sY~~V z-*cn0sFzIyl6fMa{1%Ce6krJCcP<=M>MaS#RV*%$EScqX*-dL{Cz|$E01LIn2+k2n z1Ou!3Vm&IV?#Ox#Gh%cHIYxot2%sQwL!JO79E&5G=o)+amDh$=D@ax)KyJI?hHa(% z)S*&t2F-d6t!4u)zkwj|;Rt26sV-GOa4fi1;@Y=Wu*Ds+?viz-OgzC172O?CYEPQR zC{o&4bq_hnrXxtE)*znfg~L0y8$#2s!gZr?Lm{b#H)=)HYdKUZd=$|P0+g#Q8O6p8 z&c9vv=_+a9E+5_WjF4)=pVgWw2*C^+2NhqHRv4eqipXuifP^j=tqEKYE@P8O z6yazbLtD=J>u-H$&mXQfpsYH8+;r_#_v9zXz7{mizwGOJ5uo|9C0$r&jlF5F=;=PE(Ge~x?LpYX3D3Z|l zh7vwaAE8iKKUb@XT5%e+@~r&3To^~KI*USK9EDO1a}|v-SZ`sHfR;v5yZqk#oYq77 z-5ciNFC-M`e)09RK4L{^Gnqc4%SE*mrh-ErTrUDI93>MN-+kh#RkdeU)yZCe`Of3T znaTC@R>KD3%u-3bLAOd>D!NwIZL&ZiAS^g+>hmR2hWYK25Yiv0CLqu=aw3kQle2~`qq~_GHV;6bx2pr1mjv2e>*sA z5Z+D)vF))^%V0l;u^J4#Da1g*h3<41eSO=I&Td4ie+%MWYY<8IBAm>^OJv|iVn8&Z zHH%gY4$JA13gf?<8gSGr`dMog)aRzrsLY|7A47R|6#1#cDCSRKHaCG>sVM_?C=En# zFc7C3Myp~4AqWoTbdhorsEcK4Dg+AMGkc4W?3QG>7F;e`woo`C>ELv4|6e`!%ya*4 zrGsR}1LTVLo%2D|{l^e7kH& zTV)9l%J@)_fxY6rX%~GxYmn*LitOMyNOZ45ta}L2u6{VtIGk8YEC)i7g&taou31WF zfI)h&iOLD&Mh&fM5skSS)aRy9nmme1ZWOcQZz7*Nf?Q!v>K*JRBuHpEXh~>AY>kG` z1jM`*v6jTtZmg?Cw@afh1xOIM2qazSL99tQjBq4|SSs`ClP~SPcqM~mMFZrftFH)V zC&$og)X;2b(T~={);44tShvbq$X00}t{EZTK&5UmU*yv?D+BFFC{W80)$9~$?*vIV zB}KcU$YeL7XU(}tcCSagXFXz>H3+A&BBCIc!y`awHB3&}whR)D1c!~f8?5I02&yGC z%X!oalc>&)qMSd8;?z;hOumj>VH&e@O$7&);%P|?Ek#ICidC?F2NB`X|~8S8bOjdq6s6h%YH_q(!hYdQ4=fDEag!z&7v|h zidtbD#hK$M%p65-_6X)mHRQ{IxL4HBqKjo|F9e5Vu1wRFfW=rB0^@CQ2@RKF154np z90Dm@wpp#kT~P*0l9kr3&lU1#sqn$EuDUC0AbdODv5NjdeUKJvTKp)*^GF4jRDAz zD2s#`d&H7L6y#l40b(kHwj@s1Pv$?He%&BIP$QeTfo8dYMsWtU!W63clPJxMU~c9Z z3b`Z57xO5UX+<2AYJq^m2I=BnnHa>TcsZS_KA#R=aJ@8WcceBW0FewA?QO_Z-Zd^^ zQh_d4h(L)%k<9iXh^OLDJn=+zrPz@b1(02r@0=|c3t56A@aqO3v>eP*+0CZ35ou6O9@XL8r^OL9-XHcFwj=9<6D9?=} zH+vN2Y6FFePQ_&fT?>M5=Ze{saGe3V$#99=#n+jjokc`yZ3$TBK_c7&0f&8-8crw- zFQPORFP=ni-_TtTKla!+R{}^@3P9W&ue!Wcp3BFCp3eG)-$09-Yd%xOG_JZ-78LSq zL1Akg#>-LCpd;*E%b~KoDT0K|S!S;opvx!%2Iq0c9w8(XNo2aWA=x#ERL@4lyN5(4 zHtc4LUsrAr8qFNKla?JxpU9R~ImlM+L zRyZmkVFf;!$v(8_N6&n0xr1ay0Oa-?cLn*$G591JHfj(~Rg=A`j5!$WYPhMS!-Y(h z@~h0lxK>j8Fj=hmw63un?Lu!>iG-Gf7KCI%T8~uRLpC#nWO}WDBavN;Xu1#4u3mWY zE`;JKaj%>(TM-%TYEjM_3~hokAB>hy2vv0ijfS{bLA40KQb2ufRsoV9LnSwcQsE?u z`Qs>+XHlv)kS_(2;-#BKD}HcLx{?uOy3azgYYh@zgNSvnMJ(MfwGTer za12h287zW>tVLr%nBFxdO7*F17K>4}NiHzyP%F!W74~{z8XP%YWx=p8fw{s6D&+~3 zDpi!LO>wa-mx~+Siatn@kf1T{6fFk(Osp#=OwTPz&5X%fo z?IRRRA{WetQb7K?UqHg5VXcg&Sdk)X0*(nu`_{@i z%*`G{v2+5}Y7ND5L&hnHWiV-83k(89Ia^vump=CvEskx-QkTjmF|4d9-(PM7s5Bfc zLbhCO3}Z~f8i~VzJ%X0&A>F?gKX~q?Wxv0c{Rvnf_vWj12Kmt=QV3*gEUgEt;~}>t zjY-iEH?{VL^Q7n9joLDRos19Rye4>@ui);uV)!}x=-hX6$8b$Cdp2a(Qh zLLxnYXsS=#t5{}0+$;8gvwH4$Q8j9VYaynM(8|I~V!;9=0J&olq!S>OIr!D0 z1nCV1>~oW1QA+s{6pQ1ilqXTEw@|7zQEw<&QLKk46k5KP>A9L0wc`zeuA}Wr6j5vg zB8g+_N_eDV3zb{)k_2ETjLlaBNC+V>iolB^w&9!=kIad*MWws)b>PL)^t~H2t^&^t(Mktmt79^%AUIyvpU(wZSFBA$u?A9fcO`@UM zl+2u3kP;|C)F?AhpGCbqiwfPWxd~KCQ{rY7D<#zHs*NS_23;bfhC+bY!~+?}q8aS6 zHCSgN+HA8t8ydY8&L;QkWL^i7PLwQlUemsT#32cEtv&0r-+SgKUtaD3x;7B3ps!nZ zUH6&%$l))wDtS1qD%g2VfON+lnd-z~ns-O*I@o3-yAkMC(EnzkZMv)yKJ>+{_#1WE zBo-l93^9?GB`xYB%E2O7y3UW-I}P(Tt*_9BwVAe_h|6pbU4>XD$9DN+H7 zWDAU_RnRi-A$vPoTK%urK*4Md>k*e~ZVELP3=89^mL^fH=20b3YE@KfO|_7Qi)D4R zXblAP#yYB11Uye=OEsgnAXUUTgI0{sGJ2uO^l>1<6eBrRkL35H)CUyEj&vc~zu~1H zJonPhm9ni?6hOEryDr=DMZcK;Y^#z(&?v$Ue54~P)5FP5D(|UXeD)3@RR?q9=EkB$ zp`Tr-2AGu|3ia15pm>vQCoYO2qOmaCbOewnl9--#X_}%!BGbZgx@RH8B2jqZ1R{~N z6xxKWNYWw!Vd^0Ko|drb`)D>xsMV^d`AylV62nVI$@GE<0eB%jYc+f=xJ94K#9vb9 zF%4b3Vd(gT1^$^dUa?MT35)`^KPp;E=|ircZT3Hedq+0d~dV7CibyigCf#kit09_#@E{s2{Pu* zpjP@iOje3_eAY393~Zzqq@l`)J@B*e^|l~t*#rE!b+7Em24=7bNSp30*BzY51sKk` zs0Azzvgk=}SrW09m-_zRy`>I7mcbSH@CUC8iqqpl7l+Tnp+1v(!nRhcJ7oiHf=7Z^ z(+5tHcEoZ7RL>XmY1m#l>7pwj3@3`ZRKDU%V zSeQ7`P12$h)I|V}7KN!`-eScqH{&-(Fr9$>n*x%yTA|ITiSRWQON`agfLcGNib*WQ4pM6r zmrysm(A!O+&@y?YreW%lv@RN(tBO2t42-{IghNT)P1ZRWXUHQIlb#SZd}RiP?tS3< zkN??e?Yd?3;uQ^$_I0@Bs!P7rDCX~M)+%sWCuwTq6f<6A_|li>{ZleL=Bk*OR@@>R zr&vu~EAb<4l9>c0T&%cK-fg;6EP^RO&inLc)7nkS-_HwDoA1qjmCs`Ju`Eak6e|xz zYeq|A@A`bLrE&?i#8=9R6bgAyFn``B7E=Oq76PRJ=ppPyHI*BV z!HuV5wP>w2jZYySD^;mv(7q5J0FWbx5|uGB9&Eg{uh!S6;A*`i$U=Q z)@(9En};8M{K+k6w9}U9n^qk_>^kk-xih@3H}ltp@zLK$tptu#BTyL3H%U_=Z_6@( z+ZNYuR=O|h-WYK=(^SQc&or_HkiDau@`BOV(uOP;NmAMD#!{Ft#dN1AOeKL}vQ-ug z;*JT^*3{kwWSZ5opru=7|GovA^kP{+8KEHc)vV+X6;|j*MG-_2Nc9d)HcHj)kG=R} zewps^clEJXEkNFR)o#A}in|;KyP5f7F-`(|=_jefb+{9i@*(M16BJwD-In$2#heF& z*^D-}u^?!VdFUcB<778(yX6wni8;7XKg@@=n_XQu9o%Vw(4M^3&!d4iSks{UB`z4< zG6I3BB@wh}CD{HOj>C<_k;wKAyW#L3KD_6#Z@;VEwF2JU0mv^{#M^J!^~dGHOf($w z?xngr^?5m2id~8vgAii1UMMX_U{3Dv3*b=+Qd@awBkNjGH)&}#0l9IpY%DS#PZ;aK z!-&*q+h)swN7Z#SIG}NSI_Vyc>xil1QOeuid+5-In{l z@y%}@SOI%_QBR=*kkh=JpSb|00z zSaz|vLdG4^<}Lj{t%OYuEWpbGL7B55HzYk81OVd&SIB}3U49A%4X$0!LnIbQtzLgP zmP|J@LmPhY8{hcGs*vnC&87XhFYf?kF|Oh}j`6#9+>t0ny^*J3dRZ>o2HO}kQxloF(-vMxb9S;p+#li3J4l?rv>MZ$>15(q^jNF=-d``7P( h;Ln%fbXN5t{~y(W)N7~Znk4`L002ovPDHLkV1n2_yI=qS literal 0 HcmV?d00001 diff --git a/Resources/gold.png b/Resources/gold.png new file mode 100644 index 0000000000000000000000000000000000000000..1af7023f5854f5778dd4f52bb4da51bbf1ec83c3 GIT binary patch literal 43997 zcmV)hK%>8jP)PyA07*naRCr$Oy$P74b#*TOe&1JnRqx$1-Lo?L46`u|y9guh3dkY?A`GIUs2G>T zXiRc3i{6-Pyg|KD;)1B*pQzwMVq%O68c+cl_GM<6wfC-lU%&f*&-wkTsz=lThUex! z&n=#&d#bCezU8d%dCxfx{@>%bUV-h~w+BauLMOW}mb;F#$#I;`UI3dt2XGz0;dj@C z3&8apI4+-a5a4&f{F~4D@^7Ed$#?rN!1wu_A97uJzSe5-z5S5mIJFjk=Q#2jeqM`z z+XDD}v&lo}?|iiQ0yt>3e0eS3gU|EXRUtK?gxEfKWKl=Q`fPmhZ21;19d5(-vk*m+LeT z4mJ>vRnZeKBOVJO8V(>H4h&VvP|$o4S}KO)=$GpT z;kqI4vjScSfnY=>p90!y!1Y3CHEU?L8mQN+s8-V=z>P)=jfM|V4t;A?22nI15Y+eM zXLxQ1j_aY-s-afn@w8BH0QEXhsRHE+P%HwuB2X&pbNqdyVc*x@ZU>GNfa`jq!Jg~E zg%=3Jaielxo)?Da1>txBIF2VuXO+|kvJNoa^!=GuqqV12ucO{*^1LRR z@SY0!p&#DyqkG2xZxyot(hBm*mu%Y#zrF*G`zoOIDhlQ4CoMs-o|UlgUU2N)Ux#ufm5y+K66{fI<+5DF#Wc@em7K!mW> zs-srTqS2_L-l(C`D9O)_W(xt)Ai(niBItoYRQ??b#Sjcc)J?z@!J>l5akc7V>Q#)A1Uz_wAOdb!6tvmovD8p+v{0)7)f!N*0i_C1DgpT- zP$+d2L_LkZr+OBBU;Ai#I`afits!2Fucb1nzoXaUWp-S8DxP}?aQhJs_aV_ch;TU4 zeqWxGyw-7W(zX?N=+QlxoGzhMu8L7`9A__leBF2agUNjOmizC&pBLx9+~dELg1qsK zuN}DPrNfV1^rjm|_dI?d-hKTa8o}3)BoquFk%%D@jvy2YiZyjq61zednqZ(-E2C7% zpkA9pqgjE6I$XB_I4$%h94r{}F)|GF_j!m$hY$|OjDm#BO>*G3YN%8)V)d()EPTI( zMzapj^U!G2+g^l9MTH6ld*KBF@Z2DR!6=%|hA4>7z(^FNA@5bI6-B_S)slD$dJqv_ zBY-?5{+oj8(VGQ4Q96D;EqbF-md~d$Q88+Do-a@=tLMlUR6#^>8XAgGpm|-?r*$cZ zXo@O;Dtwn0V@PL?!+JKpu;tT}1Q85`;01aSi47qh?~&_5h0u^tKS>k?E!67`lq(e! z3T4!I>@*A}1aut-r)(d&_%HtF&u{y$rXl}F6y%L>e9dyV5~)RdTNBYRaPp=gHmqBM zVtzjc7i_?$7rh6`sV8v7rEi4as>And@cjlHht^i5NMnBw0WW|+AdFxzj8G_oU@#)# zjD|b`x%EC=qevRd>x07PBNA*P9<5`bw}Du+iFnLKFz6%T@%I$23Tm~C97Cf~Q9%*` zZpn8lgC0)+p)q>w@qE^qNQYne>iZXackWFq84(am@ z8+phSMhUaLu!MTeri3vXM%C$+e3U8i%y;cz;&}i1sYSM$Y zG#_g5J@|ee{Vg1ZrCtQ@+Bt&JMcYuRI=K732^^dRs&yCjCcgNUuYLQi|ECn^s1@YB z?|A)=i_cyA#my(aVrB1wHGsn##*^fi37Fd#P@MJ==hR70)sCs8`hEr3@%!c9lLzib zxip7uXMF(0;v6o&_yV+A6%BWqH532yLK}-GA7PcnB+azCuKpYdsNe+y`g15qFXST_ za1aVP2!|bngH#9y;gE}9D2i~nUpxtK8U>tRe4gK_1pH)qJ{XqVfC4MR<9aGwfuIO7 zHQ1NXis6Jc-SiYKQ4$96<_f5~(werKVtK7iSD|D`Lj~77LEc-Go~LfUi^jGjw4^Xn zPVpL$YQ=uVKsQ?`vqu^Huqo-h%(8wXA-xH%<7)FwXDfI}Lg)=1z`y zK89kgrYa$o(JCT;mg5w+s6NVX8Dk~q!0jc&j$Qv1rvLI(fG-azWd0P@BZ4hXQOOKr65;ce7wJT^76L2oZ0HSVaD3-cr1{L6rEjx^+!_sVJf_Ch=whPG#ZmtOA9D%pCw)?Qj^N zSBpghh=hX(hBRCXg?bPS#t@12BN7=zI5L1pWB}o4zx*7E^cV{qhU=;KlJ8WSU{rqR zdSUTw5bvf3t)U3d#okzZom9#6T#T^!O;I`#^hOn}W)+Qk8O?f06`)lYFGWy+U(9u? z<+OfP(x{ZvC|8maE;4ki*UPBY2pTj|t=CbhsMle*#xDT?8jc8ltJ!tET_EV0YZU>a z5zU);q`Wr_{Up4rJE%8&l*{yN3MRCg>OrV5>J=l1#Ur@t@)NLX!vz>zuwJfPbYLyu zMB3-x5$ewM(C514%KqG~FjSN(D(QWA=odHPTep1yv)QdzfBBzwedTBr<##H`r5B$0 zy?Wti=Pq9i?7Zr|ShM*Ji1sgmr;7u?r8s386C?YrY7)r%C z9N7J@C=|xAeATN^Dd+L|&)x{X#l*OUW|PS`-L8+CSTRi`MXrvxOp+g(MARyah*%qz zRmHJLQCpFYP$H{9qF^Q;unHCms!+)Hkc$vKN+2kRkd4Cy-SQX)1|@{y?}=^&15u+y z8lJU8`Dxkf>O~}H;qlVSdg4JusQhMI0qXUNpkb1%(||Cp=ijzkXo@G|YZc{cFh{9( z1fG^(gw-bP1~#T+GX`G`i>Jch+XM9Xs?lKX7cw4IP&|nq?7i=Vu)JSXR_0sTTo#AM zePl8~(;#ZRMxg-DEry=nFkbPp)mXIjOpGl%9r2!phz_n2L(-8g1w{;W(e-n;Qdosi z4-JQww24+Vi`?8^-1UP$!F|8F7r|f;X3J;q{PgGVxaD^#$!}GVt1dbH-hBF=lX&5x zQQ)M_QM~LG*CCczAn~Zirh0)~!iExi2jPmKFm?^d4X4W&B!@AoxO?OFiN@4RNKQYD zbb2o)CwHS*Y9bbMP_4K)cpwfJB{zP5^DPuK=@?Q43Z12Zq= z)17*TDuPuWDh8E=A(~YNdYVYcF?ouS4f7t>K3LCY!wtf$5`vgyxgCmh-CGJ~I}sLl z_zW4fIc6)wl!0z&xI2-y33(@HGU8>8gi(NQBf#^N^9y^3h8;v>jzHk?_y{7AJ_G`Z z_C4qQ*Dz0fx!h;*Uh>8JT0^Z~MlL^%nVANrW`KHCEty_l2Z4YK-=VRHV%gFe3=hSz zaN!0F4sSqj|8e4V0|DkJnj5KSR_|;98X6V(YN~9}FwjUayc7dWaHLts?DT{9*MIvb zY+N@c@HOS}&IdP~@cA$O+k?MNNq(b(yyXq+z8eWXc^)mzOj51yK(B)(V?GjzPU2^E z+TQE#H*DYkuA5KTP$AEb_2&OCRE`tVR`wc85I!lV4DUaz+Do8uRyGS6FY zApYEZB;SvU9Sjl$i%Ez`0D(!kcqT>w=Gg6f>-Exe(rdw-in$j5jyaZwiTb>rw;BY^ zc?e{bOBoc4GstB2V=h_8^sJ9c*&%=^;a4c2=S&Yo1!?#ZINqEX9UJb7q2jeQIi`Rz z^TOy3a%ufW=T3L|8WwE>J|?Dl4?|eDW;vS8JRW&`N}N%?dEx#WKY#m*-=rkZs332= zVB@#z<;Pyv-|OR*=d8kyezq6Wvp_5YY&jmNR5V7lR?i9=Z=&W09lYHNoV6N`t9ZY_ zmnL-SNoYJvxR1yZo z+vPE=b!}T<`!e%78+uVmJeNtmT2_V|@hA|F>Gw!PpJ$jA2+*q#`H2dWMqwnnCba@k z7!~>IwrqNUYJqJY(t${=keU->vd=_HLPh;9mef(S%p+|7cN>ur3vgA)?lbItro!%KOuj+^15`pir1WIx}I+v4x=gdbvEjtTrFA%Y~OYg3WX_T zb9q#&Wt2))tXQ!IkM3Rf7a#rP9e?snO7d$8^1*A)@7a6!jvOrlNERJ~#EihqPjBWgepL4U^?Lre{Y3fLnQuA z6+>$n6k-Z5708Besvz_pRzb8LLnxTfYdyy*rTxryGAxEqy^?+oKTkb~evZaHd>^IG zlu;>X#ZsrzPh)nrB??k5ON~}5@P@C(!lLi?;Di$v;P{POG>;WyqVF}&gS6u(s|41p z*ifN!y~OZ{VPFldCHG@$@?P9^_ii!zET*2eeHcB70j2)b>KM9h(xH333Iaz*5A$u)vD2r(@PLp zQ4GKPIsPutPOA9+<#HJhJW>$>T)l#@YFI+GUAv+Px;eN~1=o^az3E8BxKQ>b#HusI z>PmJ+@C|~ciZMSjZ7Y%q&AO9WDg}jKC`xVj?x4TV$NE+Cc~U%X-t4~K5W*qWM|e|B zTrGl41S*I`e8>n;Q$i%IhLca#M6Fts*ANwwTtM=yE@d$iVm*uA4ZhBoP|ALWT6Tqz z#fu14hT%?0l$4*@Y?kGIbSJew6+{$N&sWdEdJl8;j1uy*B*Y3RWX+IEmDJXJx)h|6 zLm@wjWNI&FW?Gm_IjELZWUNeS{>HE{fs;>Jjx}r78_z1fMIsZukH&_#-J6Z0=!Q(Z zqGV4KyO?~>ZwZ};o+ut4LvrpBJpSZkXf{|3R;IzikqE{oE0|3Ym;hETUx1nXslUA8 zufKPywPf!d@U$Mo2^$^6Vts;S$jyX{aAXjTdR}mN zduVEv)Ed=mWz-wx4mRIxp<4ANNn_!Od4^Pa4Q4)@RByFr#+WsEH!tJ_BYgVY&Xg^H8 z5{tSBGqa?Ci%fNrT*(h;X$^ma*De@J7-Xf2Vks?=Kp zr}uN&V)ZC9bHIXO;J9VWkZHbY?{)9{*lKgMz$LE?`z@asoF<%96n+tH7#si=4o47; z4T*vMQfs1KC%&%4I~Izhz+}GEIvV%tDkg8k8i_giZ%1Q% z#`@$-CFjNvbTjZ!RqBW1qhd&TxiV0!sP_;L(iLKLCw51=Osgao0qQ32S=5I)#eyNj z=ruCW>q1X@WTF@evnp?sXT6bpC{-h7YA-5iw74uTO69s)N3~iI%O4IWLe*E*h-tvp~su89isSCB@#wi^AybT?o%(LKaW$^)WtWEVvC#tf-g>$L1>*f;7=Xo1`ao z9R~=7naC-^(Hk2>*iFN8Dxx5~z=VLyH3!+Ek3tz}Sdw2`-8;EQ`*t6Jc(fDrt}u&o z%^OEW;Bg2=+z30bK{({0ug6C$<{}<-#3e@~swGTLK8`6f#ayf2g? zF>I!CZwtUwK0arSG7aq+Cq=MeWVv3WaE~Z^sW^@Ci6@cGRngnS!mWpafd!)cf_ycB zOWyf}SSshT^M-G!SLUwd8#8&L)nB#<*t(Itq+UcLJyM{d76y3}NX@S1F*o-(DizW| zfWs5O{_$8F`V+pAsQ{}*lwzXa@>@Byn%SV&Dtn=jS1#8M`i)kui4a^gUR9~gL@!tW|+t8 zK##_Y#h)#dD-@JC&=VuXOa7KGio)MpoIVl>qbD&eAO;Z<3b7`g8t+%DdCftZ4OA+5 zgu-!z!#$lu-6YL6)KW3+coiv-nb1a|S9+?5+$#!lxjZWr5;79VQdZbGfkW^Ycs#bIT&~v~ z$B8T8L2sn210{gc1GZ4BGPJKtPmko33E=b-gIKg^1-w916rLd*&wm)Wg$fSTE4vI1<{5JyjZqz&oCVhcq%GU@$zV)q{G z*{8yk%{zz>oc=doy7lf4JX1LHY@WOPyyMFC%7F;UeWWxD_KqUxWZ*d^gbcfuG>KBx zkvd4O?289!qq~-3(uEgw-)ft{+lq5H!OjL1%t5Sz*uowEO|(kA2E#xH(TFcGEMZ>$ zj@Kd*VZ&9AQ0Fb&D{NQ^d$h_+1(EWXPeyOW2scA4O_CKdZMAa|MH5NuHxCn&Yfixa z5KkGjGg*kA#H zBiYjG?KDLe57MZiT*)FoPeFV%s!lsW=O+$3WaIZY8B*aC+&Lc z`)=Llyy?Q_ekp&T-5N>*w)!|=)4Cq?^o~i)#l$ii9YMJ?gPG|^(P+|@`Zzcd!+81h z;ahI`kL2?`Df{;~+;D^Y)IKfP-yNp6wnSshF(HsG{r*ZO8l7~Pb=&EeGs8wpM*^8 z->_(pQXUk)FIO@O)%reawSov}P- z_y1tHPUA%(S-r}^sVA)x#x^}+U;hde3X|GY=Y|l8jtKfzET)htZQAvYKm6`C=d$w_ z`L)VKJ3(W-M`GfMo5L6wSSlBRE}CDN)NYhZDM`?2xh7{Sc>iCfkLiioEA#vBxpGr= z?#_ojq(nhT`|uo6x)p-X6gvvi#lmPuTK0X~)pTnkjk~dZ5=`#8BQ(qOWvpvGh*c2r zAW>x$P(k=T+^ryF{)YP0g9J6?l!hq@v9uOaspQ&;c(q!Ts(UyTSL@DTYtX%NhC%PI%{(Ic2N5lLkzBrpxBqeSn4XxG zh4;Pd@{Nu3-H!yQAg+d3w9*vZQpHyfVoYD|}gb$bv+ zp4dFaFiLX{>p2)+Sr20QL!nSex(cZvT5;BbnpF+>uuCW(%ADm5rqyF&8BdHNIrpfv2$aexEM0cCB`v2cHkV)^BpZVHYY=KGA zsUY+qiWq5#*98Y!ofOne6LR*%D|wKpmMKUY@IVrM)>|6v!lZ(XW0pz!j3(*T3dsYu z4cCAUEIIG4d-@EQj>zdjBd_ok&DIgNm4nJ1YZHQ%IUUS{s7x&i= z$f8Gw3C9)t?Q5X%w)`D-a@nBH(}eJq>T<{(l*ZCiK(i~kO&FynnMZ524j$z7v(+70JO!#Sn$76Jps)I+de~ z^JOGZijxM#5(SyvgQ*z@vq>NIsdX^Ms9jMu~-l|qHlAV6}#U1(VtO47WwtA z5UWsfFgoJn#DWoxt~25 zbW#X;XM>f= zL6~n4$+8L}9we+^{JU_NRdseGvLL8kh?3+wHP2 zvf#ou%;xiW>xW;M9OMJiH%L_rD&dQC~vN#`h<5KBCWUTYJ!bfuQU0h_sF@?-6S=Yk5>U z(WHfPIo(Op>tzu>Du^xE&8L+Z-_ho2S)r%UYBjrF%ZlPnP4B_*@Oms-ytU&=+k7+! zGt&>kLEWSmo+z>w{QG08AlJS5RXb-6{_D;39tzSp80h!$@^e-q79VMQkYaHf z#Rg zXNbjCO)3k^_T_RN*L>)O395N!+I-dNrM8?bTL+=y*d(2vi@8Y$=CvV~K1Y~WT6V)sxcd+smvEUBph$SYaKj9nSd^n3|8(`JXrWMxg-0gpZ0t}8q^DvhBl9c@ z8S5a^GrJ|k(n6sRSNd2w$v<0>-9SGggD3ys#+$zV%46w4uDxo<&bjfQ+{}9?V~iTW z;2`kwm#jo2IwPzoc%C{^}s<^YPt2`v=*E%f)Z9U`JxE=Ij3L&PC9Y&{N+Ake$ZfpMnOJ&{q-Yr)BiE! zG-nZV)98&g5!QTELaezQ3x(=Fg?($ntWG4~x!m2#A|aNkqKkr5R0aV9j0dqf z2%on(htmE#O;a{WXTsf45QbPmxDHV)wbBfQhyq$=D3$UEQbA%vU5R-+ITW*S}m)scx!!+ml&!?ebVO zmWpDrX^O~}X_~S*NE^kXf*iuk%pOe6I7p>{T9xD>opMsElc?w*KzQ37K+PXG=a$8M zRFK)Jf1h!hX@mnQB*G0uLcX|5hFH^S?I@(^QHZUz??lf>D2T!KIi16{r&2jWrH&-R>ag$Lz`QY{ zSR|t<9lpB-*D`9gnT*OtPo(|dY;B#GPU86WXP~cti9FwKmNNN+t--MFK_OtDMj^LP z`o#&!4h^l5xmNT0LFPBR2@+@N?uN;$MNoyEZQHFqE?VIX6=ZfVCZ@Cw(xg%lcCOP< zxM(>{(t8k&_M+VA+ws-gAHMTgD#%qAZroWeJa#i#;5wX7*}CWKSZ8QJG4v0tK(R1| zQi;S)RS?#u#t;7jQ<*b%{n5w&eVeoM^(*~aKT*d(g4PhI)Evy^d?^+(iZCN) z#Zp-N+a1Z<@Ls%x9sF#(hs{Im?`$1Jd&N8RwIm5=lHOe?G$9s~cg;a!2n%~QieMn# z?%7bU#+g;@a3j@(-kOM3Nyevkau5SDnB>}e4Bi-8eU{o}OdH4gwCXr`=&*DYo^tZ} z0s^$BptPrqn3h|HS!U)Ik7auDe#u{o#UzG?*N8Q>m2e%*XBccI0oR;IQ8VRZ+1B39 z3@~Bp%3LmnSXu{}p60kwU$|Jcsul`$c!h&{%Yi45ct09Q9D4;hf7Q-PW$(>YN+#;$ z433ThJI-3GG@wAFT_|KNgy+XXA*u5F_TP!w+^cu}@n7As&AIvwYy4VicYAm;2Q;v0 z=;W=y@}1rZpLPLPE{5&%gxIfSX{y_lSagjn?&XQ0tAFw7!c&kNg!5bH8d z?~bqD{=l*IAm=aMS*?uU%xHikPRRsbyx76nXRZ?p5ZeHH`;J4gI4Kk=Do89oCUw5Y zAHNI9%0;{W;*;On=3ITr%13MEr;jI;Nvp}m5emRbTY)tzMi2@qiHmfGLhi7T&?1q3 zG23j5ovvN|uHXOgC;rzl)(v^PYhJ&}M=J}rIg5crRTP94E?)vBQw~ZsT2?a@&d7vK z)GcD!{clTBps|J44IwfE^ZARu3|d&1=W+m>v~5eCY?N zNq)l+YkEfOAoL*hn(l7k;0CEb`5f5Lix3lL@7OEI6|WuIS+6B;<}eNVT~!d^tTT_7 zYZZ?4qo-#niiHW3%X7+!i!DI4lE*LZy&H(X`I{g8t1n;TT>9FvPq~sl9?|(SsC6Vt)Y8RVVq1$39i(r73Yoy)PXJK9D4AM)&1mA>A z8d^0lImO`v4V-?;W+6win~+p)rJpDqYlkq{oJFhL95Gszo{(}mg=}UYGTDldESD_V zVAAsWFtdhvcD;kr-DO%NxnPE{XxXAlRwUIVhg|kBCZ{Zlr8!8GL%LfW>%@6xE_{zu z_50EEdUxDoI)x>xw)$JKu2Xr^@+Xyq8vxkC_x{$v)Pvc5u?xenca2Au7h=3sEl2Ae%iPeFj7V z@`V|sYM0;qo)3Nc%`b$4y!rK8{AN9curr6=XjNcd3anL-LRDoaU?}R{Fs}_`H2&{A zY%>kRDw>d0ck5GYf?#TvM1=i-rOfvM(g4&15zYu@!Yiu}Fa@B`1L(6{Ialoczut zSo^^l>e6pOP+CJ#$P(u(8O2}`%b$C8qsspxC|!S~itMw)}z zoX3`Dsf7HTZUte8l}>98!T?aNH|L-=JUD?qDH+t=o@1^cZ@qlgC-SMie;{mL&k=B7 zade-~HjQzYq%ITyx3RmfuLjYt5oRP6g2$ z#(wlv-jVrO^zcFtu~6@C&{VCanifmOzznf!>h5V>_+WlwE9Vx)5-Van645K}7NG~R zZOQ!EqFnSKI^oA-5+26* zGjkKj9JPdn+|EPVU{Y1(p}7mA^s&jhzYSscV~59HaO(hb@Y+icp7DFtz4}mbL z{=GYH{ob+7LEdrYDVfa7FZ(0{Ffi|?jV?~udZMhu=942#Zm_O zQr~y3`{TVAybvDb>WjDfo}Y&2&tV{55tx_%70V9Nc_2>(F@qMEHwb!a8BHS9oq@}m z2Xty6>Or)B-fm!O!@RDBPNFo1yTyyVaJVxAi*mtmYoMP4EjW5rE7w+;1ZVGEECoZg z-liZYJ=WT;SgvrY38ys<8)(=1JLO^7WSu-NQ69gAQaOVl34Sq-6k^3*d(P=eYT?3f-uiw zh&45}M8H4qls{yd3prP zjyq9$-vW~ z6S%QmfOgi|d}XyNGhacd6f%LFe5|_uj;^0!6qSR2CBiNO;+t($-OnooJTw@<@E|MU zs)6Di%rp=xs7~h4{c6@r$Vj9nJMT&|h@!7=Oi7BiI%!CPI;lg4vFY4n<`(oY*3&2x zk2#?fB(?oe+MTs-5|Yo6UTf|{aXg)nU#DW~d+~K_&z+n+jBq%P#fw+z>z2gBStQ^US!>z zRS>EPQLKqcvU#O<3D*54@<6fO-EUsary=U zPsnyi^emRTUZpZ;u60Y4`rq%$;A`LQ>QS>o{i+vx{(`}#+|22uUaS$4yUq%Vh2u=5 zXmkN8Z>fNMXQ4r=GCI=Cy*LaZ5v_eZ=QBt6c<_U2olqU;!I5Jab3v(e4 zyZclLY#oDuzbv~UdL=W$_dm@W{hntdQ zT27WH8=VM8bMm??otDj(C&$5JB9BSNp$ZF`BZ(-``nDZx+(9rV8|S#Yr3L19gAY+r5wN}y%OvRCJSvErPpBa+f2`4+ltF`#2G!U*xs|eU4RChB$MTa-o*UhKA zTbNf8@;0M4EFre_D(%rf0%xlS$z{heImJ4NCh0U10rsYty)KPbz$i#BoY3Gg%R#Qa z_S#tX;NKT%NTe6U!1p`O3Sr5TlToV|F)+B+3?O;R7SttyK)MyaRVhb)On+P8(YBpARK!5*;3}IlQkfBMNC2MvXcDPZEcC}oD z+2jKX?{+HT)+K7w6$fAIie}v_sKcrmGFYBg2YOXDu2j*Dg0M)abQdlp?Vew&Q%wXE z?(RP}&nhaXLmKS5YZ=)ij9#7Eq6xop#2DL??mjiW8xvClJL)Jp1^G*_BovKLglUDL|TA&WB zR_INKeDi0WCfK&x#+AwM=vjnHq66kUnIg{yCSA3lilO8|9RRJKp#9x!*ri94wQaHn zfw3jqfr-JIHE{C1d%|P)k|ZfrY;9U9O#CbO58`Gn&goVaC7DDKoiTEOJ&V@ULj$qh)Q z$5E)P`NQ}9`JQ39Df+r>VX&CB=Ya}rLmgRnh7u0wm*P>T~ydW5XVo{0_>+>#G<>ntnH z6g0K`nv>|GD~GVt6x-_$Xnxf!S|wq;!YVpx6I2w_9n-F!D@8=fhC*ay*I%P5O+v!U zBK~j3N?MOIk9T1GuX+(_^A!bQc%@TKwDzKtA3JQ`0&@9DVe?9emGV(DV}C4@q1p_> zV}kDW!VfMuW(sn}xdXn#(tsUC>65`5$D+mCgkm!|v;mDq3EAv^G$7w*q+JPN5N(@E{TTQUl~@+BiON0#lj!B7uoChtQcu~;q& zN6pM8<9IT8Ug)NqZZdW0=dUW)TzZP{wUTI5=g=D|AQ~o>f%C8w#UcU~G(!{GA(p9I zSR-h&-R?@dK)iK@IBhLN35%{kkl_%+9NQkM3~!zB*&oOBc>lXKX;uZ6(@7h5*2G!soa2%P35257Yk((dq6=vI%<>?)TTxm>}( zf~3N-x~f1aC`utw%DYTFCojwZ2F7(5-Lx}$jk=o7KMCq=+b!!cLR{2hp&f&&IbKT` z1I$6lX(Ea>ImK;ZoN8i{blc`k;)zF?cK}Xk;f}9<6N2n__kC?E*rIpy3EOn_K1S;MsNrN1xctTjw36WIr8V=VHy*H4KB_)V}n!tQ3=W;h-uNAzundG#WQ#Qx39A=>B&%D0?%Q6Y1{t zP&;oEG|gI+_OqIR+Z@M+Ra!J8VbSb5G_!Kqr(zXkno0V!gSk0E-OA=w4?^TlE9vwg zfzYBIU%mbLE6AHKJ$YZPaPM(c4(TGSJJ_(^$F>u;3tGj&d1OA5q*<$xUcyMCibtP# z3Qv!(`s7!>x%c;vl-*xbke!#G{jrJtcYc_aM_!mr)|YDa)(ybPCoGl=5|8O5KTZ*k z#zzFn%I2n#D{sdieC*z1hGt!J>1n>#nt|sh5f9}N6BLU{y0+UkT8`u(?LFOHOCIfs z+M-%_h-G(@FuW24F-p)LVhvhp8itlA31MX-d#nqwU?=XIGqlVIAUi}Z7VANjBYeyf zA=XcLL)bf>%cZgJU{So*Kz{@qH|WF|TVXeWlRjsa!z9}}utCEe4UIUVv4DO1=LCgQ z21Ed%;3&3iUV)w-!oTzy6p{+|?|Trn`Wyxah(d-Di7t?Fn+!D?%{pQ+OLZ|YlZmX9 z5!^}Ar7zu%8#24#Ez~RLAuFhlR1jcp&XJH-oR&=JSA}b!4}nl0+{m&WU;W09pSK6O z?9~xJ=y4N(Qd{`_%rpA1c*$ltSB6*hdI`Dg0ok}knaJgn_~|_}=s)glr+?xTfA{m> zsUUp8%T5pbp#9@_8Srd929=g;)GA0Or!Y0c;n%EJ_2H5W&O{{EZ&nes zO+%Nrv1pc$Cmz2GJqhkRk4bMzDm9ML(X~=xw)41@anTcDv>S5GOfKoUH_4ww zSY~L039&dAi#Z7QgEUwyC89^G-Jl0y9i$gtupe$@?0JV+zjy7qw@)9u;{w9(%u_i4 zkt1|ZK6SNFaX6@&ZR588LwIS8CJr8c48MA8(e7KmHL>=Y1oj!N{kc09e!N?tYh(El*?J9Gb!Yo7f*ipFTZ(A#zFIvZp8}Dr zSg3?hKHTm8COv@s4Ywn!j{t4?rx&RzoC~UQuNH;Jx zq6iir?6#!B@WJ<_hq3z#nWXb?+1Jb%JrD@u@OV}{5W}AJYsnzh#w1Zh(o+QPRd3x6 zZ^VLYZA1iAs=+1syP26O%*-`0myY19(^p{elH&zZ)-XsFp-pr&(?)Fkrj1iI%*{N3 zbmlN(u^2KLvV(zj>o#{S@974|yPBpXr2e$HIeL`MR;9-<*tbmyvCNJL$v# zRUFApFzaMkbq&8NR|<54Tf+jgF}ao>~w@<=e) z6m&=yFuD$wFY>YDMT3IUXmKipbn+?0;|rx8!lm)qe4zFF|GnB>>3YtdXHi}-E+!8@g?^0CCDHIBa%?x25GqX?O zr}u`-U;9p>d%4~`dHs#~!g((peWX;J+Q<(S7__05`lV-vuxM0!)frypvIo(uR}qf( z%gn6l*)*!bw|wT0{``yAKWEJ_e|XJhXZm4GAmDSlBKOUyOOORR6<-#3hC7!LKL`tS>b5LhTpfuXxGmOEkoj}DT)-2%vjPB|eBv7Esg{0_ zAX}md7wfw1d1r0u&89%94Ncqtm6ReOH_{$D^dNG1^~}ew*M9A`>UM=#`u+;*ND zexriC<;wH__`sg;{W-^dGIU{GgoL&=D}0=J>ZqVuyh+^h!w+W1Aul>(+DvhD;=_ME zwfOle$XnldmLF(Nz;DhW;^oEq(tD6(g^ z<5N?wm2UAxZNcp3QL%r6zvTpzxwMPZPFiQG^dXrSz)HGS?K_aG74VLg(9hM~;SEjB z>m}(=pPqRb2M(1)xtA^;#_$Mln^EL8HCiXiTP5ifByCYr!!V(m$Uea`%EdI2sr?wA z@-aK-h*f8ZC4C_-a}aKq>PO2-Al$QZ$Cqz?ZVK|g_g%Gk;_-hv91T@;Lz*$X*+)Nv^%(EZ=KR0PIV5GGd{aSTm_6 z)t!(p6~v-QggJF0J0;verzQ^(G4wlo?ri=cn|AFY9UJ!;nu6psCLPf8U~Qp=Q@1vy zh`Mx9XDkrkKcClJWi}PS`qc>x4=--lD%zYZYvX0Iy6z;j%Q@SEt!gL4LJ@4gfhTuQ zW7*O{3=NLSh9s?`ha|a{t+2H4(rRlr!_IFOQ&^Y^LeEi@)?f7^1w8uLBVsT(CGz+U zo7)xmju%y^R~1{S_)2ThpY88h6XRzPIU~xJPVbixi_;ZZ2eBSRP(D8-JggR|AZvDf z`PT10Cl7MPYZvcqwZ?B|0he-GDsh&AgRNUP%k`jg@EWmAgXhirP_NhU*b}=knSV9@ z*YDU%@>><;x@#}}#O{aw@eiaJYhqhov{lQ29WP=dm4{e#ShzhLYZ*^0K&h0%>|73& z=K4GS=&zqR@A)XmTQ5J$592UejVv5LqvKmx2VwqDV-JR`K19S!Iizq(i)GhN2;n+0 zIW^scwo%IFAB1^rb=MXXtp`$1()r>IAnm>0aBn!M+6OQK>mXXiLIgdLe7j4iBV zXm9|%B*#gG*$jxb6mpYDcZXP}MBc^AA_bcbRUWFf5_UhG#J0`rOw$sV*l?eGOa^L* z_i#OdU=_9F%`$LtI~TL$L~bL_qh2kdA%i3uxbOb^?Z;#5W={R+EFRVUl8R6%iBh>` ztj?2saYqw1-+1t6V0fXOKz(=!V61Z2k~i+GMvkY4!cLAZDAb5@YcUpwjt-6^R7 zF|;DZO}~YFK7&jy3_o(|IUo7hEzfzRa-R7Qmkk?Y!SYiaI6Z#P?0CI9HEfpp2zJjDj-yyDo%eUXd^4aA@4aqJ<b%Ps$O z%civmhPWM95wwoy>!P^`YGr2snw^Q(2(enoS*^=O0B2 zy=Wqa$a7SXw_W*)ze!L2;C*a8kiL&9uzDqM;)&`#di!i)@M-ZLM9}Ejc0IfoxyDOB z_n9yJ@Ve)%Abf*YoB`kVI|zpkz^Y}yS*MSRwTTMkTR=8_0Eyl)+3aG7?@H ziixZiHdJ?d6q|n>c^usbqB=Nn@2EDYg~TEXJ`EcPa>X zis)xl@YrJy2=GD0-MC>nVllQuDEF&-h=YZrZGEJ>ZlpPsrMx!;mS%{>$%+iIBnL4& z3UwT248GfgrXNSB@Axe@fBicT|1M!Y^7rSR?fCsYn)8vEOhDeak75AnSpdiY*JDfzW^%Q}IL+YbY0cb>30 zhxNB+FTL%3kpdh&NClZJbC4EhW=v}@3%daVCA4B%ec~JM+DSE^BpQC}!I&Fan2d7~W-Qd&{^6d+SITVU5q_PosjjQ4}+;kHw zUC;V)?PVwUVP_ikS_XcrhI*qV^$+m|4PQ1)+3}!uG$=ia?JMW;(ooBwYW9dTxi_7J zQb9Mli5!@@=OO~_N^&Prmqj|pLs2=Rksy|g)sf01uyj!gLqnrRIEsiw;!+Gy;uOH0k>UGTz1VZJ=(ppiv6m_ZySE*4!;?g)p4>r#e30>awm?$Qt zor|)QkV?Y&xfy|DNyUHY;rk_jB5-la_Km{YR>V!cp7f{~ntl5swF@q``%#AhD3nYp zOcD9~VT?~U#Dfs#r2?{jSiGX2fa49oi>-X`7yscu{`T1j#{1v@j%%K}?{i;d(N-4Z zv~=RkN!v$c=LfqTWm0=BCv&gVD70|!@Dq4+&&u-O-}=;Vta}`J97m-f{G&_HTl4mO zZujRH>rtp|B7DjTF4n9hvO+J?FI4JmW(vV@7==O^g`$IO{UuL-{Kg-daT(9%QUKRo zb@q*3Qr%ViGwl=;!p>Y{ zL666}z=IDxq&@WrVe=+VSX8gcut|%UcE(maM(l#7^{5GjMHKxcRn+k6H$;poT1ch=ulGI6Kl)cU9z5Cuv#-11hIb~WpS&v{ax;>w^XAr@q*ePeVUb~y zcCu;iVJ9HAr!A7;*HUO$!U(&Y&`eWohgMc3x)3nUO_V8YJqNw#Kwku_mRIES?1LUF zTL_7uZCJNbH!d}6X4H=9L1z_RWR^uY%B|8uwAId{Lq@3KAe)^QMy@TyF{EPd!G)^q z=G6RyMLWW~-B4^7!^_0HI{VjbqHWfMY|8jNoq7s~4$n&1IXb!!i^hn&b*S{_AM?6I zEVOIK7^#Bjeb8Kw#mF3H=OzT^&E-`&B=-=ubPRRB7rr-o^H;w0^Jg`5aOWi_elt1! ztBYkm0fz>wD=8v8}aKZ?kJIkw>jg8}4=EF1xov;Dch{$i%x z4F7Bn@@2&twE2n;lI~cbCA>?%mu|7r$t1RIvO{p}y1hm@=+QX+ z&??BGgZChvWlxWb?b}WiS`70e9a(BN;L0ak?{NgOC0?eJk1$Upg`DdTre;b=r8$R- z#==FwrE&z(XeH3_d+_Dko_tpF_r{CPSe~1^Z+|3M(@{@mnBR%phA=q1TIl?ox67XU zQgK=r7S(D(NPOVYq2gC=n@v0$xwB{etp4V0SH0%5v*X`?CoQq(>Lhe};mzxTO~)@5 zi^jnYh1`_v%hoMUKDgQ~nOpwAr@nmP#Ao$^=Ed)P<3>N|WZ{C86IQ01Xpq`q=43US zy1!7`XS=pYS%_AYqWwQrY+HF3`nrLJ`FgvPkgFj0etcad!nWfe26`&!=~3$?$d;kL z)6(0?A+%akGcl}R%l+~(X;e~DBD?bJz&1PgRu4=$SUPY*yY<-r9mSzTyD%`ofiawR z52k63I(n$~m;nt^uP^$FuW1g6z}BGw})l&pk8hFFFCVVUxNc)W;_kufY=w%W`Q zrgA7Zy*tEG<+ksr;hYYp(3Nt^=53%@%wR4#q5ILRoMb}SnytejRBAyqTRo_wZ`Uoi zKe+8^WnssT9f2M^P zUu#VHT^H)@mv2udg6Y9#lav#J_6=0)-1SYxP%k1#l}r!kuxFEi(^?zlu(T0LwoTRD z&f;ab$mCv@czVFpEQ@}Q5F{g!AQp}^kcjyb?@B%*N@HJ7WGRGbWDu^$aECxZ1^W(i zWRfer``rmRWtP=(DocAvgV|GVLnR#!O=a>hF>x=32A7%+J{PgrDB?Yflr(4tIdoq? ztzl>(PvK?bxdbSn_pPE?FCmqBN_K_p*hwi{dyN;;D{3r* zj4d)@ZbO#>WwM7cJ6lDeNO+gv06_zKMb^pUXfz`jSo*T-|Ht3n^qJpv-|g=&c=^)V zM)lCJ?1D7;;PLB#^&8e95KN$dV5MB2eD-lryH4HyxRlw5GJoR*{aIIWVNoXxSDut;x0QVbefIX%dJ0CXs7^GXgjThUchp> zs6-sS%7GPpJ`r=Vc%hGQSS_(-4RfqMa}!*f*k^evOH zlgKHTak6uhxgYblhaQ_is<8dPf8o~qKYX-`c;xGj`XHa_11@@b!uS1xgfz6Q6sUzm zz-cFsihwX-FBLceB_r@Ey$GothbE#3_PuoZjW^x#tdjP3T)x>4ds*=yF3M>7bxGKX zQuvOx(K6KH=kNv-*43r;^C4WDKaiSY!z}igQ*k(KnN?-}Jz>P9W6H0R;-gV8*W;#E z4KJx^vgMXDvtk_Bz(La7lg_`LkD$>Eq1Nny7hiwF zO}E@}RFgR0^S0M~a?cb0@_wrvlrt`wJz+~6!wWV_4%XYZOjcVLa^vCwOQkFxdvY%h zOdfaVm%p)Z$8%MV=jB28$5&l=%GzS#{wH~1+iTFkVRH`FuOViy{Gfbx0>vV07;5F| zddH_n@P%(ayZwgmx%Q$NzxeQohb$bFBur_ciF$*cL{TAWhT_C_GwaIMIjmK+1Vp>N zR>t`d7UmMpV8?r~$K<#r9b~LKPqFBgD2Pem`5v)YSeCHp3N}rkZ37c6JLg1E7%hyN z%gI^-PCj46Qa3`CjJTrSXzCX zV$Z=1l{8YxJu+E67VB@12C~(DTXDCrt=-bAP_Ct*bfR=!&eN2pxlDEfsZ;~GJdL3X zj|QU77R(^(%{c0_{;))`L^k!K89@ZW9aGW8ZJnH>#8C1Kd5eJKHH z>x_hzhA#80godty#iAbD0V3f5=92p{HntU!aKZ#HiV{g4V8)Nqd)Ph?EBJh`Og1I$ z&I=YSMIy1J-4`Mqex3NrI3`=mU|z(5ZU>OhXE8FeLMPE1x`85BdYq~RM4q_cUB{wY z5~M|}sJv7R4Pjfd%8ki+Dm^6)SPZWS>GG@9@=&dZQE$fJ#@6Geum0;%-SgL;74luD zCfAzAi_2v(Ru3@_Lsc@Z1H$UI>0%+vcG#6yqA@a5Y|NA(%MOLdOPo4o15 z%{SM|5AWplq9?J-+fUmb!pP8w&SYXSZT5hKF9ON(-)UerJ662qw#lQ0-`;WM4nNR5 zfPhmFFTxx|7F%*TOF=2AuR9<{2AYKZD1}?RfT5^ZvZIXAF~b=wq}$FzWF#pkyX#zFDpf=jghf2I!4jy@kf)tQ zOD#mlhuY$wC}P`dC}eA?A=Z27CMS*=W!M%m`vDo(+r1-(uO<8~B6y^?=w5YBF|qqd z_&h7}ttLG$hgWOPVRIDqB8o^U)kKx3qZAsI+kzl3pfZG;C>FCwr4LF`xLBYEC*hLG zIicN zN$G1LIB@9DV|eKC3jD|`uKWDW|Mt0~k)@+~%`sCD4Y!tNYUM+Hyl<8d#rayNZ66Y= zDgsM*F-e}5LbA1*FY6Y{^>yF=%56_xcr*w7?wv38QJ;Y4aCChcj?)k&;SJZMUA;(m z4~X1yWBn}hCbW1`R7|pNJ&C};24rf7QeCx@b`D}T>@v~k`Em-3tbq=5S7F@DjWTP> zq*88b9n#ay5Jgcd5j#84-6rR4&!de{c5$YxS>wP2+1FufAYE47*7MrkimZERC!wXc zYa6f52v!EJqEwQvbPc7mp2LP=T1V3JP_M%C~`_~y@s)|=ke^8ENa0se*WES9=PPy?4eitnt25XKlGBbyF9NkBYrgR zz}!4C&g~?X$7Ep1O6SzX4DxyHDHK0VVI+fR^ds zlaAN)FYlV1lQ%JuZK^kt3&h~K;ai=({ueu5k&^NszW&AY^5c)*0WX7qkKmx&P!m_n zao9PgLnS4fWyp$_UScciVnK|^u`Lh^PzVZVu9#?Fqj&nb7|W6*g%e~7SQ3Xs)8b}n zDwq5$4Q}*eD?dkFHTCo6Tri`BCDm!o7Fqhc0K|-zmN5hr$2Jrd%SoJzT^K{?%nt&D z8(!Tj68FgHwF>hZWLpxWt)8nDQTDI8QLQx)b+cs5LA9*vB~uw$$9kP^v=#)}!%y&& zcU8r}*6-c$J8ckuna2fZgd0Am;v;>Dz+ek)e-GWN9;CZg$*|IRqF?&m3;9t2`@w?; zuyOMN%of%>`TZNWzhfS8(LB_=1B6HZ#3xSfZ_I8S^Eu@vNO(u+>!H$izxc%(U`=6k zG$+6)lr*Sjd{V9^aMRuSSNv{Y|I%e&uVgm-KS5s(K3`2Ni3b&BruEP&yHa6Ttd!pc z9hz|yT1Sg@kRqV5477eaMaoRjHH=bZY;2^vAnPaRtthQ@D_TDt4&w@k$Hz=HMGaQNgFX$ za~p?9SS}h!t+fx`FY0P(GgrA%KqhklGc#pma*X>3>Hz9>)@NuXNx=`JT<^|aedCia zd&B$8MeqDdF7w2AOJ~3K~%jkoy)zldUYq#T`LiZbt4`hk_tIF zR$7pp#?#O4!F2BMsio^a)qmxcSGJb_=M5{bxCvkHCw<}LryQBfZrI}Yb8+-;%ne9= zsbi1ole;VLklD;QMn=j?OQ7O~!;UBKJ@L$~G)+>A_IrzJiAn8Rm#Z1Hi?H?F0G(!)o>Y`D z8?53&OXp32E*BZkc3P8C)vaQPz}2LbO~;|3iRie4IW6hJOpStL{drFySK47hP*d%rY9EYdT(ZzX*-AGDrM-BxN5F2#? z=ChkeFgDd&y!O_K`0L%HujYLV1`vMu-~P=9K9`+*=m)&J^MiyD3t(sfIC@>b6t=ii zGnomDj#79ID4B*PYR*!TFxCCeAN=sf-+$pRoy^xhd)Bk4?m8yuqjW|Uo>N1$uKm`e zqbMC-EA9N9n_CEtEzMH45XgOE=lijnP~r^3&$3ffZOmbTW37;lTP(nA5mGZ`K}r3R zDnfRyGI5n}WhHy;O!8(hV4J9{PD%nWyVl9t&B$V zt#y#5T&v)PjW6Hp z@yU-K<5jYonxiY2vEp?d>IYV?Oe1Z;K{a;9O@;iJWI;2TF>Km0jM2$7estTx1>L{u zD=hHit6%-x(7`=F9$^CzH;$xK1KQ7h#Ofi_PYo0cv)H#khkRb$ECPga39};U!87;% z;3p5PYU$+pvv2*Czj;r_-xyAXfYLh6L`erYa?XXByYE=gP$} z{Y9;fQ%wtE8>S4c#{S(B9-Bja%=6M;i&%rEhP9)Q51X0N3#BxY7i6p~y}nrlv{qK(sf}bRz(7@%Vv#EH zY@^lo*#-%So(|J-9L8A@shk5L)Ei+m{7a7c?sfORWMk5WXZCnLOi3Al1wifz#vMaL zz={>*R#8j0M>1BF5Msf zO{Lnl4puGoutq?lGc>A|687wwL@uwgpkx8_hn6MLbLxQ~|Lk`!D@OPAuU`_aPVOuE zy(t9zCR5|p;G!lCJW54pR!h^r+yHfxxRE_&GC16vqNQNlG+OQ=HYVZTvg#?8^l1N2 zC(5dovXuDd|CxBk{#`m0jawHqJ;EB)bDp^!gJ!c*R(sbq;0OtWm_XB+g>%X#ws)i1 zr(slCZ1ByiPxpzh(_q|C+r^F2*n_|*muFEd&WZpB3%nwBQC0GxN(|BZh1G3D2$fm@ zjYbG=aQVNx>PPqdkC(dlo_|KF=0`TbAe`}9G^C0&D^~zZmmMYFC)KeM;b@m==&}$< zaF9N~@wqV+Du)5dbm;1EA+G)4&|N<^|T=dHcQ3pZ{_v^wrN@I^8T2kZO|)!Js2!oP(h-LgZqRN$l4Gj;4@Xnz5R7AnRJG z#jt5y+e9q)`GtsBsfXeE2kyM;M-RN@ z8h!Zm&WVtJwwKm|prG~W=pZ=a=o?_2*h6R6TCuE*Ihe|2Kt4XP9hsE)6PHWpPvnaXj6!s67 zns+W*5?0-Pk@b6SxoZpEt(Sa!{fi&JpqAfyyWhzm=&x#16{#qmW^;r$#1yariS{z+ zp_;_TmgXvgLfFCPVH>2(+?!_Fm#-s0tPH8`w&ZiOW@55k&CFR-j_t5jKpt2D1Y0YbrP z*VD!)W~qXluD%)!*FExQYjee?FIhf5`tV+=^mDEG!|y%N3#?hg z;$OFPNOp7{E;mWKbCq&NzSI8UZP@mF7P-pd&;Q`Yoi90}U?IWsrUHZ~a>W%_1ak*| zUUhI#7KtMbESG7`Dj$Xh2TV@{=V|0Iy#JsE?uT9_ zuLVW3ZeoGbGEZHtNwf5=f_GN#v}I+QjD7oyahYt!j7b0m2#bkKFPqqg0I~h*Edx1q zK&Wx8K&Q+-VIw` zvoz3r0Ow5yi2c%+o!43S+*#@67ndun#Wv2CS${;Yh+|v-czkR`20_|-$xN1(O1@UWucFGVk!W^Hd)f&O8P&yr)Mm9LK2fWpHGw$` z(`rR*(a{e0lvZ6SGHML+VoH2#s#sIR3N`_Spv>IUUt~q>C$j9;1-M7kRp z{8P+2YR12{q>+WWYik+ySvg#)pi&h5s7kerLeY^M5&=?Urb=!O^#54h4tiN>!10vy~LT9h3cl+c(|&T!_1gpxzfS%6~{{2Io(B(g}5lVu)C2pmYJD- zcy8+$re_>Dp?74jzW(u7EF8}V7+&fa|7rl?m-*snKICO5e=V!6U48Va)%7}hT?ic= zy+Y(;KsYlqjM34WSd(l~W0FGIk9gq0tLaEUjH#D+hFD`=?0?>TGqo9;kB^+yKkT^U zOXzkcsd^a#I!ISv*Ns%i5(I*Ababv#m#Q!+RD9}KZGV0%_6|2tC`A$Nc=x4OU32eE z3$^)Q&2j%#0m3i%@BhuGJ~X=b-n%__Lhhv8D0CNCGg;E_!^-8oQiT=~=W-T%_Rh#e zBpKvc(pe$ZI!7U|`8PM*x$#>sKIyOg&1t_0V*Fj~K;#ryQ8afc%Eo7oW!8Y*Za}4P z>kd>=YdZw^Lup7FW4mK7<21wcpywU1nJw;N$Ed|F`!sB1EBK$aO$?WeIAhcG} z(_-egGiVP6DfU3+_o$?f>0+tS!rXWTp`-{6hnBP~73xZbsW|J4DOaqSCkn3f%t9YxZ zs~jq=N3B|wn@zE#nM2C-Fk{6ZnX*gT2tuM(BfK&MQLctjb$ZVG?vEe-<(2=-*OpFC zJo=wzrZ;`j2Uh?q7LBd-V3sO?A7{k5-sws&Ult@|2{Eax|A0m--!EG({AzO30sIz2Ux(Q(eA zfTU}=64c*f97BM0q>n;(_u5ZoD=QxS`v3OL(Jx*0wrt3kP5K}Hh>YEq__Zqiyv$ECH&(0iy5k=9Nm_Tn|-e> zK8hx>RP0Gh@kty)S4%axS}N{RASG#0lNQwqc~#m0$V{P~A#YQ<5{Nq?1pG0CrD9I; zg(&=y{$CFagz}}#?=Q|~XC>1o2@0QDUS`2lDF-W8B+!vwA=8i(i6v6FE#${V(Q$fu z7|%R6DZ+BDv*MX+e!k~b%K*KWP5wq+`&R`Jdm>kS`Yf+7`v827@`UKW@~*@T$lH!e z%k)@A(%i@+Bf}UQXCHB=#wm34Vu-gw2~Eh4$Y246Nhl)3Wy9n-o_=ZmcX{k z+WLx(b;PY|Az0dR)|wok+>lc936MEpstl1OGcq1g*HPKLb&&>TeZw=>m$VTxYEOFk z84EH+9OP|Es^rpmWh}=)pM&-5T#S$X356o{r?l=v76eBSuuimWnGb_QM@tfbRwEdS zp;VZV$-1;0PjB3c;W4%WhY;yF_4Myu_r}LSzY!q3+K`mR-TAAh zQ7BM&jum!JJLRUSpvs{kLfq5-Yl4A5;U>0sZXvlg>vakmxm&jMs@pWLP4C+0)@r&9 z=9`4a7T3zgVU`3Ww3C(^jdin{nXeY$@wm3OWD^0_HMEHZS_t0lWq?rGw9Gac&vV0Z z=tj|{qFyiED#r=K^};yi?J1-?RC9~u!R+i_%w|eLcQ2QK!NCxgE;WNQJ66ffjO#?S3BHcJSIq5lNnON8DX;**C7cj&hlQm5;w#fY__`8<7IrH!p)j%?2eqLu(>t#M@ktkx4MXlJ+ zrPEDCk6N{Wnb{Ji4^||Y?nwGEIJ5%2{p-=we;m@iYcY0UFMfR8EizJp;BZh<#XJ zlKoOp@WBQpf+QH?>~ji_t4qar0}dsnLWoByShaK?rVi#Lz0Rabe}4p>oqbB(53|#6 z&=mX1($GXPg^>e$@%%0qrHUWE;8EMYcf&@`Rd~xi-f{r3SNMucPV6YxXJ#AqJ(7j8 zO*iqFgCzr`)2j@qQpNq!-@qoSTy|3Cb~ByHpgtD$VaLevB4x_ji0772qdaGwaSDTX zrh>IQ(KZ@cOJenS`_f2`l-uU{rH=KtK>6Y<3DE6pX@^N_iI1;PXht9V{7&BbDlv z8xPxGIrf_Z6>Qj|#b%5_%`H~I4@~ez5=JO~66&Gu)DM4nNA4|$j26$}t@_>Ndw=x{ zm#nIkMs}65PfE&G6iEy>N$z$%RAuMD8P&8^pI*nJG5?=0<=++mKBfS>n$-+;|9&7 zQE-p0o*n)pz4q4KQZKBTL1=QujAW6rnckREk!BvHQWvaBWwR#ysziVZ++`-cCfvr zA8%O;^5U!h?>_zM_*CVYpHvFlFJxxQ`q{KBOcB!!W4rIrKthC?h3RVgtaXM*4SPq@ z7@bThKwJjzn(ZP_iG?*5F=?%AK~XG;xq?Q{*6^L?s34XSVyP#z6eQ~jXUowPEo&oE zBQX76iS6@r6}K z*dKul(nmO)Cxm0yO`#)|lz2ktkdTz92$YztR=|#(&tmJg12~w`!~~okz`x|P*WUch zwQp%eyy(jxG5~2kuP=P^w3{l0Z6B-GvPK|HGdjXqV&Rd6#1t^t7eq%Yj&N8fL2|(S z^h^xT@1ZL}_o^TqE@ruCSqLI-NxEFD8)yr+R^E-_XiiwO=~?S82|#S++sFyY91^QE zZ~w-QRnxR3u9eJJahgL*#ex`@OX&F~-m$Kfy$&|@%n}f) zfYH2;hvG@Kp3|2;ciu(C%+9MCwF7;QmqVqd1wpxUi?D*yT2?G`FxcNK=}x*F8#ec# zSftoNQ9uHZRB)=Jv-+;{+NJYO8n85uVC}^AYcvsKVgL!u4fTXpL@b+;Y31Zs_QzN^ z%UTc{chFjpN+WKTakcn=EM)3NeIXmzdR(F+*`&r39F#8A6t2)l{4vzskObT7SF;y9 zCDug8!f{gZEOzYJjOVuT+@*3#i!~dLA2-{-A!zx!=b)^4oM60a*OuKPoA7g zhI&4knc8?2+%X~Rk*#Y*7FdKF8gQ_3DPxudX0sjGv^@pC!!g1P-b?V@vShe);;$LK zV9+4USECE8!fPgV+YFR77#FKyVkJ8argeCarLtH(F9O2?q+Bz>dP`PI`R^L<*t!Y9 zL5sy_ajBeu8SkvZ5v*_c{BgvhVVrc#3?k7K#Y(YfFXIW0k~0H|8V(X&$J~zM?B!SA z{8Z*p2gHldZ&3l{#V7yyOW%EN!z=&CVt&_YjyLmyY#7IT4fa!?DTRGwYcZQ)PkT|a zT&$bGRNzUQXU&8Z5!KyNm#ekU-PR-|du6PLSP;5==Gj^l%ks4uEV^jFI5_x|>D)NFQU?$Y9>h#0is@OO#5VB75lx{IA9CHSj9(+aiRs`-WEpBM zC&1FpDoI?zX-!SFLQs!Ni;J`!v?k&Nne39p1cuBsk?|~7+ox5Jy_&Z z@i?Y%)ncgloW>fOrDBI+ObUPvHzL}_jYjpik@)KWaMd-x_}wdAgT?;;ZGgPS9q`pJ ze(b*&W_Elb8uoSioT9j0Z1|x>4JA)ie~OiN1&NIb=y&mV5pi(La8TPfK}%w2`ivJO zZOV$dOv_S$uwR2I-YR?PIs1eO0Yfvfv=s*7l1=kecZ;JE*v{(rCjfss_s#D=ntF|= zyXaru2FUB&0+i}^O3`Wn92!Y0QZmZv>{hI!Tru4ErU;uB^6YRSnV(`s(~Oe2Rl{ek zLNjC0CvTt4UmnB?Z=VdtL z-_{1m8(iWqUw+m-sEvNWb@R#&_DZ4-!u}GasHh0UoHCtu5z@_~TSc*oC^dXTIxd2L zvus|bbZI@lv(kyIu_NrQwCTj=$=AcRlk4Pjk_} zy$z6gSo*Jg;lp3?DkI-^8?#b3aT^8H>J=F-YIT9FK$}Df#?_)*6$>ditkNJs!bM>a z&g>P1^HlL(tp@=j>Ek9FSZO0cnfOEYZ9=$GHMeW>JJ&wUiJ|Ss8@K{(fV_c=*ZS74 ze({pO_lldoDb@Ez5e>@d)Jan@vYtln)Vf)WH8^`uW?`7tVu?dYLN+mm^ods-qg5=O zDuNzm3oF@>;E;x}P!j$?0*(_!-HqcrKmJ2|ZRcTa+ZS;jE}}ie-(Gft=W}gK`42o6L+;T&y1CbcuU>G%ro%;$%KPsLi=C{q)gV40G>@; zo|k~*8$`$Q4-Nd&KmGIgJf7O3JyaVY^SJb1`{dcFiuWJlK&b4(BtQ;R(=!+yrxFQ?FC5U*2RC%&)~kMa z-(Q^OG>@lz$RDZ=ka=F>D?a_M|I4ZE_(!)fDSMAkmyfNvRM&eFs;uDkcIw#R#(FZY5U zt__d{xWs>Z>9L;U?UG>KQcrB3x=8bwqM)6JD7_)(Z$e8k7KH9tBuba658+5sr{ucq zNogRL8^_3KQ2EhfQ+8 zsFD1k1+h$CGf2p?igmW3=?O8ULw>b*yaVxgw+!&)#3!9OSd+OOqvKN;86}Z10M~a! z_3EEKCzDs&kNLX-ZGg<*wS2*muDI+3&yT%m)MteCD+ws0h!~5^$@4H!XErJt_N1vR z5>=5l_QBI)$lUcvhxCgJ*ks;$9p!Q!!z25#XFr4WBpS|KqB5NG!Yr8=J>TD9*7ArxL6#d z$yQ*BQS98k2YZKEI2^*#^?&PMs7bF2bcx;)hiwC7ftKlOpS`5FT--3>U@sihrO`=b zLQSyFMlD*75Njb}Wej(B^&k>vJ%d7Rtcpj4OGWBRgIc=M@=JhJ#l_nA+$genKWgsk z`+o4VZ68>mQ(4r9Z3AQhm;drhj@cFR?OdfiEv3%W46rz;18>al5r|r0I=w`Cz&Tcc zF-IsA7iIf;jqg|06~-U5NK;cg@$_@-^h+U}JmX{E{=scGFW{*x+C#SivVcqf`A>b| zHmCB(3*pTe!2?a(O791i*eQG$24XRwr#p#`)SwQ(@rA^Sgu@*|E2&lUCOB8NaIIR# zp1nKpr(JA^Tvh*<8+MvWB@1{mi}cWKfGqIBfA-=fUcfofoJUTkZZx896)j36NGPX9CFetd*EfbO^t28oQ_4|=`uEL-hs)3VU*ls_gs6^lP^27ae+_o zkUxAIAPc<2pZ>_|Ovt}0MYqU~Ngz!m5>eSvicJsn`q0z69FZ_5jXC08g~OeqB}`zH ziqoe5ognd$&5q%zjg!a~I}uNxwc`K1`sRHLd>V`P@NIxB@X~+b(;u91$`5r?+Emn3 ztf(C){Q7}Z0vPCzp{r}TibngXj~hiS!E9DU2F#Sp2gS`Ico>UJPw&UZ&3WWYOK{CC z!|gR(z%^`N+y%V2_RycZDB*c-UMTDYg&kOG=k~2!o<<@*Ac}=_u^5NM68dk>3ojKX zQLh!uY{Uk3@7;-QJL)LakHK}f{Q2aeqWy?AK;DF<|HOGKJ;&Q4@dh8f=yqh<@H53adovb}x_yngKqyucTjhyU2Q%e{aB@+uA0 zvrjAr19iqCRt9y=ssM%t2hBvxj+IhH z7fsyKK@fd<&ncZGE zFpZPm22db-+fLxXxUzWiT z1b^62L$dF~_~CWGXs_X`Uy9fK%J#*5&6n)8zv28dI=y&w7AGICB*pE!fZh8v&AV>3 zgCp1Ui3K53m$i>%Y6aqnelxt2W8?Npq0psjqvyx)fnogi$tt3qXW_>;-qT*g*S;jL z`W@|y`>HS1>wn?-XQaGDEQ`}l;$&W6$8HaQ+NCo=j$Q|>U%M1OzhA24oEex*E|=*} zI^DL4d~QD~<&4Y&z64qLTG;tLWJeU1kT~jCl7mufzFhJQ%(qB+0r$V!Y$K{ zavUTQ1BfSNJkys)DI|K7V?f}Z= zDTzs<(LRy=dHl(z@XQtuq3BV2Zn}4PO(0@KS`p}i>R0Z!j zg&l+eR4O$*@eD9M3oIW3-hNyhJv~QAI=57uk~kw0=|-w!h15a#_d zIKCjZZ+{#QK30Y2EXn`k{^8^Tp2ng+bQ>TGxcnbJbIn7w@~+blThYJ?M^j|lk3yl2 zKRoRrmj~9Y0**U6g|68H0m zaOnb`%A!4V8z2j~^k=^}?QweU8K*f&cLoIn6H|3O^{meLIDWl@)rSor)v-*nRmI|@ zwARL=T~bZ=2O`4at(2#c&F+^B7cEFM+KqBKi+dmXJ)Ym~gD<$^_B-$2^^pZUl|_5# zHb53==`T9()N67FH(VZ%lyT;}se2U`Htzld4Q$+^RrC{%0uDcH84`&>0SFtTJhvfA zim8rOGKiCbd99j5F1Jr4f7q)|8VaXa{qgBX@cXA61VSrt`@Or{Yq=1OV*#e;oyyz3o41cM=|l<(N%V(Shd9(8d1(H>TcumWvnQbQbj?+W=XB<^S-RNB(`W zu=|_Qa2aQu26S~srBa^HSMk(y!1N3-*ay7rNC!)ou9d75-KR>00I7>URwA`bnx+_o zuojZfjflbt9~5;6g_0*Ry>==lO#2a2I^=*iHG& zmZQ5m>p1${8V)Dc24hGjmzkL$ zS}e@xMw``iTAWCvO9J&x&pnDq9_I|hG`a^*eEW4b-uK4^IHg5<$TmP0VCg^fo+Vzb zasVrrdN}z6KSH4h8jT9ZC+m26v(`XXE+x&K{pjmtbaTC45ErUmt0EFfA=SA`gd1e4 z6zL`fR?{cpGLuDsM7yMBvU~R*aL*%U6iZR~fq93^?h`zof#g(enawwN)Ir3A2b2d$J z^Z^0F6fnt(`TU4vx%hep>YVmDKE54yKd>KDvq8jC$Kuvs{jt5K^SGw%i#d-MlZQI{ zeJkHvD^ENe3>0z7@xZbr5hK1(#*RHobLXU~b%z6M509X`d#!Bvx&a6Q5DdkoFI`3< zIE+DDRLZjg5XLC9ERjf$Xlc#P?#F|VZo`hfemH?a{Q8l$6zO~}X&WH(c{Kr?|G~F; z#mp8Y;x)Yc9US3IbrPUlE@Ja`RW#ucog-IMupx%-?sYzxh@A}=|c|NU0d$=}0=6C6x z559ZIt=GoU-`l{cCvrk9CqyxZC`kop*d47Tzq@tnhIBF#!ZAq3CgBK^YsK0}jptiMWHK*0PG;gU(LU+DU_-k+xd) ze}uyc;bO6BuBD$3J+%)ZX9R9tf0h;?W)sUl|s)5~g^krz?`d$`v3Ai$@>fVENL1baV`f z1tCD#QOHL)l$1IMEeV^Z2ociZ*;!bx6*W)~#-tuX_iJ);JMMdU7$XxtIKDpI^P92u zy3W(OwlCy7T}U40+%t~w%EeuXMQV8W$v|I^W}!$C8K10)i&ZEAeO*lP0?U>z5m$<@ zVb8f{u^>S@sV1Q?E9pKxM!k%D{s1cF8I>pvcL-^b5lTKcfkz&D2HSQr4(Y(XkG14`IT+|4L^4T$ z1SHK{D$NKbp4lljOohWq0SAx4`iBTvm!>ra38xW@Q(TVV%HgS}e~UkCa8ap6(ba$I ztvB9s|3&k7YK!(zZGg<<(x3Ux4i8=yhb{MT^6_CQ5DFW&UdG=2HEekvGDK&^5>-^} z=@~*YNf#?90O2e`QsSwy7>^GM?VTAb`dBP9vL&}%ni9Y;&1OMI=aabik%Pz; zIDmZ_?tOGudu``oZQB=d9xfse@v#d}-#t0{hm}Ep1#esL;m9?d6vd7}R?Z99v8Rq5 zyY<5kTTT`)(4A(p6vY{s#mb5}oa=F1bO`bIkm&O=24RriXppctg=&Q^mV-#NM;fOH zE`n-uVhetC-)@Xf`rtWTxc{;CXoUG#+BQJu<0^`KwZyGe$DCNCfp?z30%1a2AzF}1 zrGPElUF;iyOqp7}k`h2by0aI_)Q}YZY$cuJ5lD@X#rs8FQ2|0xxiX4{aVZ%3d_F{? zea-)8(4Ng4!2J(Bh3$KRdLxNQ;;<)vdG9kP&(rBG+QYN~G7n3C_UWr<%B9gxctv!l zJ-q8A2kA892TxjNOQixfZt*ZSse^M4Uk(fo0O<}kMlCS_Ar~tvF^Hdqz<8fDM$tkL z0L)&MN|TcAW!g9z>lX_`6%?67Rm$Rtr+$kkH&Q+*02iG|bsznYx83>h|2+?#50?LnT(28uUM*qdPheL zDFYA!pkgN3`W#vi#u$B?=Jh-Q2*e#*;sMU3<6u~hxz*!+aq*4Pi?wLV&y-sy^M?gUu37e**FWqxxkWRTYjat0~ z0w@$tOOVc~xR$R~D$Zi_mdEh>4Gm;-4jNt@@zmkC^WKf^b$*@e+`e$H^TJ(n$@@DF zj%=N+*QNolf^f*giX{$CJeC5k z-qRC476bfPv=70s&TV6zgdic1_+VRZEH)s@CrXK@l__It@_9V=?ep?$LuXFj&KI5oLA-69CuYiExLp0)H{c7Owm4H9slhkaz;bF%v z5Bm;i{euB|AONHiI%z5qBRD+yJsPF*Vo)rCPP+{WZT%;Xr4H(%B0IU~CFFFvebV!1Z*(E#-d5=8Z*wP)J80(CtdZ zb^25|tV_Z`omM0o>6EEc8qc`G)uP3qTg6&PB$_sH2th(xd=?WETd`r&1a|J>XZz6b zV(q51Si!Uud@#F3t`=$U zHhFi2O*LnHzO{c1%xCxkyu zfJmV3s0E3pb$+2o)|GO5<#z!Q0n#nZUQVCl-}(8CI?0hcuxZOKsoocg4(g3C;G_^u ztvv3R_dK!jHJ|v;%a|SuufPuAEwF|{M zh7UkS9F)rHUU6V2!9b7*5JGA}=w1;V1X?IWQ1CS&(dDI;h(;13Ag8UjRr$7VgVSz3 znTSiuJ1g$0!bmrZukcVR&R}F@Bc9xt!SE>4zCO5K0>N-Ue*N(C?R9^Z>)yUluku3i zW$!<2xmT-B!Sl)p1zn-7vomn%kPo3?Nbc(FJWlWJZGgPWr9bEW$30!l?LE#F>(LPF zv1~{?1Ct2~GcZldF=}N@&$!sLUsJoReTX~c*Z6|LIYAL-kRG60#vcyG@te3JE`Ah+ z9_V6)BWbCLu%1HY6M}?shQ=X&$#{jsv?3%nsz4pP5ZOpY4%o=Z20XPfgM9})4cOf% z{DCymeMi3QXSd$>*sDDKMfr6bm6v#Mai8#{w>S`Gq&?i2%a0*2Wu{XHg>6N*=}P#6e?q#92REdE`s zM-|no(otNmuGuV5@tpukikPt_Pd_^*(>gnMf`#`Kwe?- z&w9_1UbQ?9*Db(7RWeVpDBEet%5@NrMGfQDMZHnh0DT0azgsM7*2ypL(E_0q3FC}A z9I3vCLLmWw2HEO1aZ#Ao4Ta+3K8c96ScIy?Ae@Fvpb(S_Cc0u>QZ!^>Pisa?!kP)I z>zT|jHgDdHEjwt{7>h7qkHP0pVd-I~;732XrM(YcW*@XK%*$Mui!M0x#@VS|A9ou? z(X8@Nf!}e(y`r16e2MmTB;p*c7Le>!sqA9<7K2OuM5l3k4ONFwoF-E1LF$W8S*}N7983zdY(68@f=87(rWU)-Zu4!He z;V=VzS`)H>8E88Q222(!l!OD-=p~!CA%S{LY93T#WX6j<>TJWc+$`mFX&l1B;ei7L zNF4_z92ANKFRe%r9>OwGArMR=7)pQWSNA`0Pa7k1SD+1$mfdjvIj5gg$P7POujkQV z-v!Em1jF2jBoS&oBgo=jMBOC@*{-WxD{Ai2YSbIXa6pL0Mo zKqrBbF$#gF1wid0q$MC=LP2ieh-tvmN;+vL^t)W?9|?(T#dw9P?*xph!YiA&SeU^0 z_!ey2Sr_U{uE_67iabTHshYy~GqoJ0wfcUl@8~bxeDlrbEEYFh+5j=@f5ADYdAZsB zN(yu=z=->D(l#`HxhJPc) zL_b3-=>&jvm*Vjr1Q^5%dzT^(1TL+Ib{z7xoPJApOtM*0S$8FFp#{lg_F&&|L6Qd? zzd(Litwt3T0-W&*-xHP}ifJc%4?pg<+wNKP756qk0G#=*HLhFFJM~5do=dC23=v6z zp14)KNV0+HE)gtdLzA>iuy8N)rp?!gg%L`L{?6cB-7+l*5;U|Jd|x8bE2G(%s%6~a z2*o5Q!#Zt{&02=G;W}Dt5euWE*;o{0y4RQ#Q+;RlD`xsgxcTccm}h2YHzud3t^!QW zs6H31U87Er@Hni()0(h?Pmn~>(Y@j~x7_jQdls_|S=0de!0E^Qr$#OJe=rrw8G#yW z5FBn39QLj*Ah3WCuo!F5Bo-UX0W56yZOvfcqO2|Ig6Q9kFVtmq-;w66= zhm@-tE2*nxEeV5n)>D)W83?Ave*N&4!Nm%aMG24#&pzYuN@a2f`AV)(H>&W2=Vamy zu^hAvYCWuL#lO*gVyf5nc36u+SBWkYV-v;}%yiLG@b`2lM>n$~o)mH+dp@G^UZIFk zUzZ;u7Nb#SRiQW{F|BbhW}q9zRIk@)z~RBA_rpc4k`qh9nntBG zgL<_n^VG}5DG`xlU4-DN*DAsTBS2_zsIY(W~x+}6zU1(fXbzVs8p$pGK)&3 zgi@Jpy6Q?X)?iT1AA*JdCW(^n6~Q5~NQ0PUKM6Bq%z!a2@-cVE@E<-WBnbkaKZaUl)7+nrp3l`cO$x>;$RNN^avsIcsA{cDUp}^6=TT-@S zF^o%PX(JJ!Bjq5G=t43%DDg!+Ie=uxG66^|(T`B1L-clOJ!m-`e-IAE<@f=vt3nT& z;BEG_dySf8tiUN#<(yc(YH1cFf+RnNa&a1k{1^&_apZFcP%051Gsxv@0uaeo)zw;5 z2@vB}RcoI7O@KlxLXe0BAx2Gh%K*i?Tw+OlAvpdhqKUq5-1+Or|NWs3l0zOKXP$P% z`{2|cY}AXQkS;wHlBKfohNeiFtrAeQSP#p>wa)?&7W|CmASa6!L#ZRQ95KXVy#kJ8 zYAF)QrHCc_kw`5?G?qq~aY!U7d?_FKRpf9<%|e52C8jWMOwgKt)9-Oz;a<74B#cKY zIh68~;&SD(2T;n7qfi(_u`q^wehkIpG|J_C(_#=91cLDWUVB!@IWKK#Lxy?ka=>KfW?#OgCMRjN3`G_Is_ zO{^g?$4g|ZB%Nz&7);qp@EuYv6=M$4M`BTmRd*plKqQtRky;|+(sZk$u`Yz8{OJ(u zL2&p2A%Hau5vR7r6blmj%-cD?YEApm>t!^mB?;8ar5RLcN%9lOWrtBJOz0%s(v%3$ z75V=aYHg9`uD~D|q@c;)`D|P*3l;&1xLxXM2~fm}@L7X*rh?%FC5UI%%}=UI!j0U0 z_YRd?Im8}^BtR}a_kAbkW=H-gRzuRa1O{Ub#vCsMhguC5+*<1$8iY4pD`|Gp>NhP2 zL1AelNa49}gh;F#v3Re<90Ulv1AT!od=z33LQt2Q{#Yq&4V`4!FlyaFdi~$FM z(s&_ID&@Jq2~b)<(r7Rqv9Sq(Lf|kiVZDTLllH+7@clzaja`4!orhdH_>cq01?Rly z`g~^eGV-W6c0jELfni-LS`MuuXeyVK4*k8EwKBy&TQ#?tE7mq7FsCYs)HRHIMS#S6 zkW3Cpypc!_A(j{r3lfTUBF=&!$%LkT))yo#o$3tyP~&1Xtq5RR@ek2%r-GW~_?_?J7P& zMvJ&uCU}=XUMvakAnI~a-I3|wNUR6FwM6vVhacvJKO`Q96hO{CLb$J#8z49A=l?rg8EfSwHk>*0Z2SK zDB^C>M4#3>BB{CHoEC&G7Qw+7N*1gjbrEiO#`{ed%fuoC3|%k#BSAgm6`KNBs&H#zU9vQZ#fhYa;N~r_u&t`qfjZ$M(9>a-!|#shtNkPYvmwd7`$|?H1<$nusY6v$74RkV`;=g*~kNIj%l&7)eH5qFE0gh4yA zS+pXwFdV7C*EH%iRBHw4SE<+P0uXV#OeMXwE<%u$D-No4PcvMS<)SJIi;!AWBsk=2 zNxej^i3r~L={7Phi83K^#~pV+cEMX6B!>h*K6>8iULiLIw_bwlmc_MdumA`a0M$*= z?38Az=;k+FD)W02945WX8@nYW3bD{+t}OA;76hYFQbw4$>J#h1)>pb#v>F6Qm;rj2 zRPv-Sa_7>!v>+xxe}Q{tY9Is*fgvFYV-WJ^8)`vnCDbYfDIjtjLb)_6wGmpAN+ly& zDRnRa01I15L_t)RgRuy!@G^76txFM+V3A6DgB5lX89i~W2$phrE;gYOOSR^pS~aO) zQzvOHD5?dqKU#SwKpY=|5*47_^YG@k{Qi2&p8)Sr=Y8-buUeWGaIgr-z??J-b*+rh zn#ooPI0zP#(iM`SsdGrcZvJg+9yYBj{Txi|S{*A^%ws{sqG~F$U#{0Rf5x z=6n|SDuzIaBtory2n&}kmiT%m0BXJ6+5nx;p3+F%I^C?Q%t{yf2@8kitN{f@y7Bto_IZmD%}_zkmH1P0x$5W5E1 zRvTnWa8xH5;3# z72)|c+#o`+rMUB+4R87V^_D*Yd(-{MIVXDM{ElY5gYF48JS_n?I%Rt37Lj(&eMq;0 z1vAO$82W`3c(XkmRwh*3D$%kcC@kN~hiJ4*tOw;k=~6M);Lw|hi93R!loSRj$wPoh z(-V6&`~mG_XQ9ygdjgP__`_zfBrQ!NqG?`Q5pf{}Ao(T*gAtV0GMmtK1QP-g6@5j3Vm^^gDw1UyN{rc)03dpvY?a-;Ju zXSq*w6X=WAQ7qM^WtLQM_LJMLKw1xRvrLOD+hbYx=ws{$UCm#&x>iZ#X@U6jJcx)AwP>hv?BG2xLCr`GAUnXvzYP~ z*NT}dakDbY1g_>pic}fDw5$XM+lTdT9|*>!C*CL5gc&K*jcBU*+PSE5rvzxFlE=Y= zyRdI~1P8_~bzbs=@LbMmPav3Bd-*MQJn^HqdVtRFf5-rYCv(yH@A*tA`~0==4#MxN zN(PGArrvId$XhZQMkp9F${$>GZaiCeu)%8?xx9<1gQSM5%OToUbi)W1zgi*EOb9+& zmqa{(SS*HQVo-{L4AwavDxU0D7c0UFIyqP|`JojFgc7_!L)ZuNfuc*M((m2z?RD{GC5CFN-}wM!$gGIsFaA5 zsNak;;4^C?cBFyCE2O)}WX4CpA5fY*WkMw;Ny(j?Y+i9^jINgWer7`|PSkR+PlWD~ z1ly9KQ+G=R;#kb9si-w8?Gk4Y6x_6Y9b*{F4ps^afgm6aupvrii`06k5FH$??6Ww? zEFj5}Oc4`|oXJiKOEx!w=Xbj}FzTT022gj?sH3}b*8^KA;&sS84k-&_SLK2a9RDo5 z{4ri*1`aZk?j?;qk$|Wn_H?tOFDj$VG%)5y)H^Hz!l0FD&umWp>}+AK`;MQXL48Ym zt*NdvEo>RUv@8S=UuQF7bkmpwU?wXlF^Tqqi13`$YUsmS(C5>}DfLqWHJ&$dpW;s&;1YL2K#0c+u7ahw518-xM~ z1>+(|N&ryQP1w6KtyZh#5)aVzF?W4#TJ>h!rU;$zdVK)_FN+}u=ZQDy-x0$nY2x5Ro1-G)}ilqU@+`F_S0q^ukm&tczi z1DU*oN`+craa3zjc!>fgVzn;NCq8jrk5ir9UM>u$;g;a{ zvwN^8edlwVb*^sBySyq*(*%oy&JL;^QngU^c6C$%`Aa(2LuwEtADS4$#v7!V&&5O{ z38zXYbiD$~oFzzt!MGF})$Iy418T7XEmRd!ZkWNc!#|nowOUyO4}noC*O4#eF*8%g zwDhc7wG-_HQDFNK2(rEr5{uD5$5gyy#s7Z&O?Q9mPzA=K1BgB0^Upsm>90&~hnE@f zITiSQN@ygBkwK|aqU@M6eV65KS?wxSOf*Gsn{*P5+&Lw8J2lFVHwcD82#4ab=_w4y zN;HFa>8@orp{T?2^X)y0Rcb?%F(1bFs;GlnB!Yv_v^v6ymvPbTQ7=oZP%g75s6%`h zQx!^v+HMMhcJdXAed^+AYMJLjo>jd;8PpJbP8cqt2*+3Lx#{*tR~_o0Xg$A0V?kcL zs8^hLVlcC!t-1zeO z6uvez5q>Wv9L~9uY9$mP96=4xT0~KI69`3zCY@4w&CT~e#cao-dn{Ujym+NAIQ!&_ z{eJIe)HwsBAi=#Sw3V97BIFLzjc3Fi{OXFxeqy*_uB44qczkX~x@mk?@wYiP2?53u z2!TSHhiqJ}$q8UAm;|dLT&?eyxgS~@(bxKvX={NfmcT?%3J&e%Xm;>QLC>7M#2rDY zd{a@8v4!Wv5Q_Bd@qEF5`1x)3|6o92&_b*vP+E!bb})~P zlcZn6fY5%Px^3D4sDg4qcn$;n7+mm~os9`ptCcIe(yMN|_J&)wEp|Y>`25=dd5t^b zvWw6DVX-ishFA9c{r>Yn^>E?V;l96*+2&v{A|L;}9HL79acpip*)Rc*EoGA$Uyv%D-9T2qGAYqEfBi83-mD z>BO=xegB3V7KLQbYh2owe0dun^Klhlbc`#mI4@Q!1xAX6S+O`w>8f8N&QHwqypR?r zU8?eGpl$|pD*K%(i!2suA&@^(6XD;1Sy~TxKKO!09yAa_IGXw&*Iak&e_epnS=5L8 Z{{cI+gaKH3rkMZ$002ovPDHLkV1k9y({um; literal 0 HcmV?d00001 diff --git a/Resources/platinum.png b/Resources/platinum.png new file mode 100644 index 0000000000000000000000000000000000000000..c217fdd024371812ef6286d00920a9beb766129e GIT binary patch literal 44931 zcmV)hK%>8jP)PyA07*naRCr$Oy$O_D)paiX-Fs`Uo?G3T(1Zrih=dT50D;78KoS@b2-{%eIL}F5 zmL2;!vH!dzB!A+>j$5Jb)4F<*oIKRdlPm>ejvI?(y5--p9iKef-iDSiO36)b8(JV};=y+qRblmc87z z?B%d+sHX+~2g?F%2bN{Qa@5~!%R&IY#YVu_EDIsPcLO1RgZvvo$k$?U90XzD^53>) z#X{S1`92;Keh4_0`hXt*p$~-o$xF0Tx#z|ID+0fG1>|1+pZqxef(teTVR$|qXRhr;;W!SQNVMB_tf>gXMIkVS!fM&J z2oOclb8H0hB<#*k#5+5Y=;%N^nL@fFjYurU&%>rb1E@9{aD5*&&xh-IYN;rvlvk|; z6#R&7!*OhRE$%o-L?X>)^@9LW$C2YS{6LObuGis*AsW61*Yo9bVHhF^0;NQj1;?@w zk46x4BBE?OK9$W20@NBVY7GzdMgxsT1NB-BH9pHFxP=0|N(HFZ5HuPHy@n_eZ#Gqw z3eBstwQ|dKaE-zc4quN%t@ z5O_oI@oLfzfAaYK_aFT~RmT2HE6A!%n@(%k_C`CvrJ)sGNI}H0G78y@x~a6{ zBKWkHyqpkW5Ta14q3C%iH$2oF2R?<`cEqwf-Q7q}8NlGQY3S$g@i@8@38Z2%L>vbZ z+kzj2@WTM5S{+s27eSot)t9*@f4HX0(np6?+RjVe9V0vV&Q^1LFBeBR^vcphq=2iJ8`tJl$RT~U%sxdg9R zM5A0rSgRtWu=<`BX04+CNwDnL_88b4y`$rgUZTd)atIBizrH^j9R6FMzH{|R6^*w2pTR=T3dW0?nVwR zIe!)Qg$TKpPDIW@)ek#hqa8VEqHJMB2=j7HIsNT{{r`_$XzqkKP)__%j?Dv3@%xE^`rmr`8)rsX~_Q;1-b09%jWorglk8lLsmSFj+Lk5lqE|s zQYvHq-~fK(ob}i+A2ihz2c|z zJ!^~oErg8u6G?;}orv}KBc4tp)saRb7Kg=SIuu49+~D)OO_iDcDpTKB>%9G%5-IU3D8M)@$%3KcMp4@I2-Z47+?JVlg>xB1(Y; zl2LjkUYCuU*N{-n^%|(u>Jnm6LF$zXDy1TVN*Rrk_8<&}j0f?R2a{El^|2AN)VYfy z%DSm1g`dhB)$6QmQA=Eu$)eL%c^1P&dR(5ncv;UAPseNJHLC7ymw(J$B)|< zPPySmte7z!ZncJ29)A@6&=FW3!$a?@|8eJ?zwy6Iao(_kT=CxbZd|?f>aSk1=8Ti) zPaBX6lbBRrtPJd`he?XRee*%#=KBxnUA^NwVy;JtMFg0?_mD8I2+miy|70Arg&>S7KYnp;iN}U0Zu4_&wukL1&J146oa7`vp5cEF! zDTa%lh%yvH@~pFOx*3-(TY}kreMl$bSk&L!G;ZontH;k1*mil6-|6YWHHH{i8o8%m z+vDAN&%G~x{UaY*^=6dq4JpWytyhJGg{R^#-}5e(`=Euj76Hj;S---i3B>63G^fq=t(B! zcX=(IKrHG=LLGIO*eVZ1B}+tOh)0-5&^j~6Q3#iuFE4}tQAv1x>WUyLW~{efSpJ;~ zz+8swC3y&QtcEMX&%e=f*Cp}yP_8#ns8umpt)Wn@VWL_^fzMh^av;}js3hN2iohJk zb6xlihGw+hK0@DXhFr~_Za2Wo<`tV9kNM`O?hMtEs1~2^BkjCHW4!ZErQ4~UWlO` zy-`#wy$HXcM9S(%sT?|wU>L?wkRcV7i08}@gqB^5fOtyLnkERKlu3nk4Ub_=0~J?+ z1`Urwu0k5$d|q2{T6r253Mq2{Pg{P8|2U|Mc>;BAMvzqg!hB16rbYv~$w?eJd>EC92|>6d&w?fEm9T(RGKrNN&cPY8XXEra zvoO%viMjo~5~YZzInIOpDg}`!gE=41BMecjyVy6D#b;vqy(+y8CNi z`TDO?l3%JIXI}Zvr~k8BJ43!L7Q^6@rTC4DFGhbyS}u@bg}8qS0SI*}E6JQdEubxN zDdTL3MMK8TTsQ@7(yh~iy*!%1q49AX93DZnQb976Lg2cnWU{E*4jML-R)!w|z?)pH zz^YY&MqS*#N+??%<@Fb>E>m(B?e^tHs*FNv8KNP&t|69NBVIORf5N`ZFK8v>aYXo} z@I)eQaXCMuT!JXFR#=8R6i^kKcoLd~RCW`R7y;Fxqw$LRgpZ9WjK|c+Hp#R~2HFD+ zwE`;P*R>NJwuxcT-jt!Hg0vmb5IE5&qVYHqi3AdfBvPpqdeSNMrPG4)F|6bzDyUZ- z(AXu(wd6k2llkJ=2u6&TiWnZvAUiSwuU1zfvdE0B@SDYMCzvU-xMIh>WTjN9-Kx4iC7XNt|aC;)(eqj6x4qTZ&C!=L=D{G0JM z*HFJlzFofCMl2RZl9oE6LPdspae6|YxBebwA6og2F&uIXUZX|e!B#nzK0g{klWaFb z#2}EcuUM@iS1Ds8KZ)UN7Gs$VYUQd}bg9WiqGC*#!zRN3NzX$rROp}>qgYI>p{`vS zK<4A+}f&9`sr2~gUb1el~e-C zBvw!p)(!+3wPi6_jI(VAoh;bJ<4QOj8`WA3Y6d2dP$oQV~|Y zA~CIC_QppX6J=>-QBr%{dsNccJb&|^=8dr=nU|0&8i5s!!$~ILq*6$xSy)UWkxU>S zi%a+s_$B_sV3^(>Zd8vQSc>C;W`p6 z(?ZLis*a<=yjE_*&`hCBOwMUN91|+j z6UzPL_p7k3{n0eUKI=?2`cImLOV3<`T&aXtj}D<+sfY}&I{9Q&UU>e`@A{j+{G*?z zB(GDDEjQoX`IDis0$rC>i2J8t{f2Y#*n{^Ae7JDk*_hhbC)HqDIAiU&NOWE1wyPV> zo2VAq+-SZ=i)0dM{+*DeLS7&iiYHa7RMv)>_;5)8K-Do6w= zqGJ4=^?_In3Gp(@QX7kJKq})6L{Zw5T1S9#uPFS+{wQHpZ>3_W97l&L8kXh#Fc#kA z1>&_B=F)RX?L>vU;+3>#l3IxQBK;lhc?IvK9NQ>}D5Um6Ce+g3Ll45@>R72H9%N`N zgKTCD^oI{LMn*lAt6vHDG%aSB`2}8ax|l26H4i1 zSFWY~N=+fmc#trZ`1-=-OHtDnmZ*>v;7I2nR0<1?cmiP}fe5R{sg$5ygo%xJq_Lm{ zC)(A?I6lHcpCcBVPjea+Y?=p(gq?G9Ipiwh% z-iS4aQmrN)vst*+s^(a#HRti-Hjr=}oU?8%R-Lk_iG~?DYQKAC4VvJJ zUK0a`G;hDYe|%q|UPsMspg*0$-fRw!?A|TK*p7}4l*(nynmQHx4F1)29pZtumGo53*$S8RDjh_cM&(4e5x- zg$pD!360;=I+beq!HBkl@qFi!@bk(<7LzVOm--BPP!_8(uSaERCDVRI+B*|qC zKldz(b`-Tp1Yv}gWl|Pgg*8liHJwucr}rJ6>;l#-fI=wNx_iEvMr=6;H>rQv0~9elwDWkhu>j}qb9VJkWza` zvob2rQV&xj;&s*<4Os&oj|eJ{*Og4jd!E{V0587u5~>q9*zpAVrc&0csN}~nc+zYv zpEnP4vqO77|MA~nU>rL-F54PP%B@e_N~R?lwFvD_n~qu2rlC8T6d~dX^LNJBj1wPy z^)+P1#^BXek%`GWpT2k?V(k>*HvLx6h~V&YBQ#P$xR$QhPNfm=?vZfL&SX$B~q9->m*F=>JpDfgHGDcf!sKL^28Hxi<7KWYS|32 za@A_gp3<*Ughm6m-+Y4#2+rRAp3gl!G5KL=g&nD+6vBi`t}mW9Zy;=l zV3@~Ch~ki~!Z6+(TEO=B-zb=>XS6tId_RxPClgHyFNKMo|GcoKVPjjO@>je1rIuvs z6HKI~IB6i`X0Fyk%uKjw3W0{NB}$@sYAW21=BhVF zVDs)CtUBv#EEpURFT&`DiauVhV%O0lQo!u(>Owpk!%2O;Qg`9~W*TtEd#@KkwWe>q z`s=xd{~lQyCXWpdX}X%zR!Y9X0+F&DKYzf14Up6Orx7%*iAxRX_Gu<+J9F=HuL3W1` z9Od=30UD-;V$i?#P@-kERSw8?Hu(nyf3;sj$8l>i5l>+#)ula1LyC9`$x^^dGmdXV zv)WNG)Au4&nWloMN_z8sQjjN%%p9bSkwO87#ylaKEOhB zXh#$n(9wxy>(0XBlV(T`&2=XX&ybYfs!*$oxhCjDMgobT{5ddk^lM-G#7Ez6&A_iq2_ zaU%Mr|2g-vtExvEUV=3bB3e^>dy#iys1U`9#-)HqH;Q@{R;d7#3$Vm{90!6ozxmiC zy$NL+h*vy_N*d`EKXuKO&7}VJpFVD1>?GU1_O^ zny@Bf*aTcS#=^8rYrP73giEPR?@M6>hn!fm2xyGCsX+*GWx5u{&8R#?ltUw6yxBB& z>3R(-;ObgR2%ptzUFUeYa|-H!j?c-mRo2`Hn|J~33KW#w>V9l02%Ev85ecyjIACZs zf{1Aaq2XkRb#QDpGJM@Bh|qbKkV!9QT3w z@7P*AP^~fip_`SOOV^@Pv1Z8<40d*?K9*PvJ*kvXn`pQge$fexm&&NrUBnCdo&Vp5 zKe)=8bLF++aJ_+$m^)YBYoP1o1z5Ud8K!l0%8g{NM0YAFu8Cn4Y1Xs`V}}l4=Fr|L zPkrxuxwm>z&ClO*i@o@%=Vwjt?L4sGieVxWL&c$j#9&9FB4|EykYXNIr6_qs6DBnW zIS#yP@*xbI$@fW*gz1wA#ez^lOn7tqPangB!=vKOgqp!x42zkGBqHe)Qi&AeDb_&} zN=bwXtO$)#18GBhBqGpMn>F=P(}VE!U4etcj;b6t5hd;U+SR^QJ8Bj1#7jf5VTsPH z52}c3mhhMzL&kQn)T_#>)T42{oa|PN-G(X}np%j7dyImZqNu2qTAN{t-Xu7`OW_+1z~YgdL%+=`1$nJ zEfnk9KYbJr42>!eVki)aB&=jo2z(u>G-A3?*i;bB_+?Ql6;;({#=Hz=glH%sRtbHP zR`Sjqa{;@OFCkgp!jWSX+A{InJCPI1< ztsp|X*Eyih-`)1Ki%QaF zd`y#-?u2VXsXFga)OkgA?EG2c{i$oVs?Z_?zWd1IxbNt&vOYwMm}kTjq9CN4bZP}j zCKT11iM$w+m{B1ek*iPpTYbcytsKxhxtL)sd;N7}EJwh{YUadCVHV_qJPS zyk)o1c7V%oeBVuX50Br<98y>dK?tX(7w@>}LQL!KlnXtnw+H!Z75PfFsUZCQ==cO` z*|D8J`NQ8+3X&BMqAIXqrGnUunOL^!49uI-uTT=URL0}jpPLYDnHGyENU>1BqaXXN zw?#p=+LLyusR?G@(;nt1%oMp?I6#k{}ST z`01;+Ht8KkL0G{TP8I=*IP;K{K;ZNs!pEXA#F(fPC5a1CVmvOx5v6d-QnN-tLGBd} zntGi%$N@X1kUkyzw|H7DN{(6N79Y#}EyNl$&_}$=0$e+Smpl7aSVbDV?_;G~M4IT1 zW#Ookz$*b+)-CU0!X8u4GCVAu@-!*@?FsrZL`_X4l3I(j64x;@S-`;zL#$Cu2+Uho zz?1HYr?e$)<{&nfB<;OF`T9Rg-Qh$%F1_)6H{CNbaVu*;G;l;KBfWjN^uqHowX;*! zdQM-DCduHNE>Wa^@VU^N0~5h znWaO`RyXkRu}j=aN0eDKH4y2DGtV$U$Io(zPhWdwQ*iHm_;LJ%9)uQ16hxs|7ITnP z3h5*pg_441F~m|_te9|qS_-0iv?Nqlmt!s>~||iQ<5zhBTOSm13Gk729Jk zl@OcdR`0f}Wn7w8-@|{u)-`~Nbb6}7A8QMVMjfjHWhDuKJbr{NMF0RG07*naRE7j9 znhM@d-Dt-;4B)Fg$g!35c0#0qf#o>Tt*E$I^dJW^8H|jMB2N!ebDKE`ffYjEgn7Gd z3(Jzu(?9;kKc9J`l!M2);9WP~bpKdEJcw`^{Qyp1FD}3MBI!5b`Oc<-l&cu8scq-4HBo5=Q65AwdQ-_XlJp?tTrnw^ z&?+GzmL%&ka6zFxTtj1B*EUM%i<(Y(V7Csjn*1ZZnkLFI*8EsPfVxUr>nq{`qFS;G zu@nv^yEIWic_c!a%te+rO6ZaVKExOzc#d4!X77rkx3qQpwxx5rw_lGoVxf?POy(oa z!lkCw7zHsNWIq*TL@5Y+LCD1t$_;Bh2#~ZabUPN7ChQZgAm?s>-%Sta^0!LG29Is4g3_h8wYa~wKi`D;(D2U2IzW>-0_>V(J0f&9; zs!xFsFFlAuc4#ssFfV&U=s_e0(Vmt{LQunu2BJlyg0N1p-YbiO7?^jLXXBs~Z+Z|( zc8v#VdKHCSiI339GvBk=t6*VLjoP8ld9`Z*t`G=y%tKeVsWAJ7izP&YtT-<9Xz( zHFPHvq9Da`2|xY4wkyl9^@buM0pVM#3V@<50aKPQC8EFKdZni528XV zdJhS)G?SM%LM*l91WeM)f?}DFXqRtG4stv)ZQ_5adT8WIIYrfyTPu}tU09g?; zj3gLat1!|iprL9ocU<9D(Qhdt=|o`R@j&^WV->^@ixorGBHdM=?nSsW;Rp0rK^PZ4e@5bE;p6xiRaL5B%%b|L{aA$m*-M-}G#$c55gQ zuPxzpbjkoOzhINh5}?A*>g^E)VWQ4!p$DOYygE7xZ}{lWhyLOZS6MUZK{z6W0!G-A z3erD-1*^}*!s*k+l`=u+lM2HA-gG=F%`^E@2@iev{cn#4dEfg6UMw~;IXIYzCE=xd zV6)23P=FpJpM_N|3L+w-K84nDY<&LuY(yuC46ztik}A)ttM8-ZXCcyGU&|z23GWXd zdkR0=e^`ZAT0sy`2*J%trNx6JQ%MlT5)TrMi6P-nHcQciu)jgZj_R&IRy1(93?o9#Fth1_v_$XCtl7s9Y&0uJB1ch7< z9&-?Zc|+;pu_F%B5gR>$k51n`f7cJb{lJM-kQG;Lzv+c?{Z>W*A{$-<(Sbp1zVLhr zrzzJ&u^3*l?!laGptD2Tgm)huMmTb0=R<$_N2{z^S8Wf6=|MCc8IEUR_4ecB)6c}h z8PkQ{%t9gAkVo@H(YRzhhPY#6qDT*N^V_B%&lkN+KD3dKCgCPKVZ{=HNCeD1=s{`~ z*jAvdydL#)Osw8+mNnEXZK6Akz^4dfQeVS6jI2$!G9`eFtS4V|$^H z9)yI-rUywRB+O!=Fs==vl}3lQWou)2FOclBBZz zB_3oHLnFq6kj_K}@nQQO?4W^8$3kz!MmqFQxPr{SeA`Wjz2H_ca4aypE)vscVDqN) z#CS1}n%UE>L#&z@t10QU)Q+Cne-J&H!#nT!%%88a=3o7;@Ss)@DH^daqoWHmSFOR~ zS+j-4z|uS^?wMjmE}TgY6HzjGQ+swK?*9DeN%J}3k0o2Sg?TH2oRdI3-2*$_Dazp2 zYCt{%yQ-3ORm^KmPj5dF1E;F&R9C7r#e~*OauDB>+71FD#-Wu9#mvSdMM7z z)j0_JX4rPiF*sBZ39~fBOC_NTmpNDr&GgBb$s1IVDKP`f0-_+cqMAsTp>9=fWdeo} z%^`3;Hdu9>l-5ao2)rEYLM0j(6*2;AcvPmoVVJvY9-{D0YgDj0rNX=_Y~1T|uCP*% z9z;T{kr9*#^ODZwF|;MUCxjC;&|?MYjXFqL;R#oe zfi2r_8moJ^^4>|`I^phmaV0btpc+rvU=A%h5Nol{_^yHrJ(2-f%rEVrVn&N8b?O;7qcX?c@!-;A@( z_#o{?s36Q4K6{<2r1Nq2lRNNldk!e{N>fe9#gY(<2o^mE!z=m8X^aZRB4vfjrUu0+ z_9!2!k;lV1VFmrM7Tx{Dh9e%tGZEm;5QHnJ#-_GJSs&Ga`*R6Xo%Hw`L>%T8~&}le^R$^ zcu37U37gN|AlJ~5h)KaPTPkBx>L50HQV9tUfAr+jIM*wE=Z-J_&9&C_%dh#|m=pal zE5;Imj46tD_p+5(b?Rc>Mc5)M9?DHfGD;21m&;f%cIfZF_7{Krp|?drHg5}=gJkSD z8tHC?$qpe6h8)_!B)yhbNj0szZcZ|hyUJFNOFpGZ%8beMBp#+^A-qD=NfbmU=|6tz zS={;RK2Z?q%_no2eIcCXo8V-V6w-;5)Iq2iOw`r75YSLm6SG}`^x*3`U}p!)gBZ`Y z%Zp$iLoAa62dCX#b#%kI`|*w)3k->kHSd%U>J>Y_JSZLn(IuA#RmkDv;8LUm!X z?l$n!$S6(?YPfV3>s&w?4t`Q=Dedc$bltzvY?{)u&!n5tG=yk0jGmHp5Jnn%hesqy zFXeLZ>uNR_m4v{E?YZc)e00a7=nVah&z)cenR>-_AIda>zm;L!6a<1xC(p;0bJok+ zlP*Q>)kvWzUX=>MTsvDT;rkEX5BKX|R6*$JTef}fc^@Ap8Bi7`mk~D@TeukOR;`xY zBOQ&RJC#DNTouL(x%muTy-a9im_-lb;Ir3VB|^=|y-z=fJ6_qR zXbO^t*wXgPJw=d6B9=^{Gnqz;NS3aH(0eevG6E}G7H~ke9^lM^-8o^osUZBGT@43& z(e6Q%W*hF68GN?hFJe|_stMul^CEcJQj=3itylY#IKpu<1w5r3N=ei(H5I1q$&BH^ zXa=8HI86{YF4^O56k}$_w4QZlh>NC@PN>(+BR1Z{Q0{rwyiWF+m`XYo4|8XLA(>LAoH%i@zV#&)sKZ1?_CsOy@8Ge^RZ?9TCtl{4%YJ+ z6%o1OYxIx@b6Gq>1-Vm^C#?%^ys`hG;X*d-=n|MTn8>MqiWW)N)xc$vVwR` z4$|Hx+pHQYg;5j}m86T*5Z>i%FAen`??LW)>REjE)qRi!HddQ#-p+17kN)XQr;(l0v@c3(V`lM=t_&MQn80 z;R#oe)3)7|e}1ysEqlUPju^rz%U9sC(@&FgoYCDSpvuvSNlDCA4jAC2qeFP$5jAj=`=DS)9Dui{kr_ z{mWoy1znNF}V{|BqBZ0Y`Yb()OI9vDG@S;g*w|_$(CiG zMluP{4Ak>{fe=rLlK0ixeTq5Ao=|maDz2CkQ2v`?5hsM)(5-fOG756vcohc&j^2r& zGZ9w)MCjTFH<)50^Bm?NtfcQ78Nrc}VN^&psk1?gY)S>IJANI#mXDrT1RXfBA=WLo z++u(3$(MZAcofY*6+D-3I2Wtu&Jr|{JS>KXhsX13gCnjBXDsaAh3SX)VCQ$f(Nd7X zO_#rrOLZ;_;|aj6Bg~Ehu{e5`pN@6QmWwhlF?TEnd&hF}JFN&Q1?9;+p8li%{h#jPFN9)A_lj!A5NM)qYxo?XBr=dRWC}vhE%zQZldGpw$8UNXeE^|pXiIEhUH-|85#r}wr~~_K)->qY zv@&Y}CAsmmpp3;`N%=l=3@WFgm$zFb({RPJq%~~+?&JU6{yCF(O$IjZuc<+K(#fbV zNYPD*g(#{!0SJx_m5{FO8hK9K97mFLD#-8%4v!3@n#;nkvscAY{Wo3%wuD%aXIBI# z)Proe_C4o4lCM3;yjpW$V0Cn3)28z&|+}gO5IpD-*$czxCCB zl>|gV#b~zBFjpd zTWjfULxzrEqA;}oQIMKT>xJd*mK5mxzWO4dJT0ooO#WtZ7TtCH#$T$O{U zo^)l*4HZ68En`a`XOOjz=TVAcAY7?Y7=WUAg322mKbhtD(>wOu)NvoLM=AZxe3 z?;B5zSKckPJv$1xE~2w$WAiy@Nxnu_2&wIy-9>skmyMmOBa@SO;=!Mw@q^pipb))k zk#jBygDF#05}X|sD{b`+VD-ieB@f|Zu!omgmMN6c-n*`cgkAqP|nuo`7Swdg@44>4RUBgpzPo4x4DOsfQ)p2Ovo4CO&+ z5#PCZ0XkDjbR>yP#iTmUrwpo&=xKt4ZcXvbG%Xouwkb&}O-@sdG^ixLgS=W>VINdfI1PEC~8VUez-$am=cKm`v9GFJ1AHTQ}k9QQk9 z;vVuR_tCJB^(`C;j_nlW;RuFMNt&B_>c%PKL3m)5YcWZ$VYE=hzL8NJW)70eA*gdJ zIDWaRNw5ymW%=lJfG%L;bN8M&n0MY4+r#}0)#D`3x{JZn&%h-smdg1}>+TT5@$mR0 z>N5OX?G?$Hy+hADhKYYy`A5@(@RyErF7Yc}y*3dVQroHn4#Ocu0p6+CcP&F!6FxnlTAo(kFr3> z{rR*Nr@##MbPMr~xqs-LF%SHJ870|Bk9R7hQc)$O%S= z6vblU5^P$tPHqHSZwd3gI+~R{gheSbR3~#eJblZF&qGeTd|NmHM+${*suv;IyuK1> zt2hpLRhd`Cd`T$jCJfR7BoufZb{vCZ3B=1Bq<+jEBh5Op37dEv**l}vG{r(8l4;o| zgp*B3T1?4WaG%5oruB3S49*-)!ZI_zNw2u#EUChw0oqJxWr};Mhs0PglLxi-MQm?- zWw=AAmiYmXtp+KmHeXXPG`R`+SPYMgH8psRh?&5@I`bkf4EX<{(rM=fs6rtFOJbd&i`m7vE$1 zh^d_&@)B9RtbL3YO3gYEIa!ZA`Vba-{@my8{OZBiDF|P%*IyK(e-Of<9~)9!rM^L| zzu-~{ub7MUrBc|Roe&M|PR0cy8_MOdtUR{tTc7&lT_@0ifF2|lIv5KbxbY4IsV;TP zN)tdO4+IT0vnm!>wGiuy68TB#k8WOon)475#o zZ}wlv4zsEdDSNVW?2itqgi5ZHYLlx-c%^r+lHqc?6_>&+%BlzNDO;kDG?NF3T<9>7 ziWiM2^h)uu%a^B9Qdn17_!Ul`Up zx)G*3fyr@%r2;sH^yKp{!NTd&WMTT#NsL!&$Q3J+htM?*jZa{PTe|WmfAO*JpGXB+ zb;WgIHgu4&VsIlVgsBdIV>(NDSmg=8uc;g)!C`ZXwb@KOO=uz~WOkn-rJvPYlY`Wi zf|%C;oH}(1ZajBA{_xJbR6s<_%;cY*go>#7Sp3O`DGqO7ErgR4JNYxAD(UTPS0N1Q zYIfPJV{9UiSpx$Kd)F|sseLf$GJGtBHRu^wrodqaYU`)K`b7zNp|^}2t3Bv-f&z5R0Fa6AKxQ|Oki!iLjU zNpXn%=+wA9nH;8ecgUi03PfjV{0|=c)W<)4q7`J!iX#hp5F%KDkt+15oQDa>{&n;@o*s3?mM>!M#qf&5 zBjR!SJ)TUV!#q<-HM3ZI5L$Kx^Qz>V4>sm3v1&NIGlF_7jei^Wq?cWVVQpX-otECw z*LZ_=`iBvI8f4kJIpUx@Xkc|;3T#hjUEU*of)?J1z_TMbQuVOcV;Jhlrk)&Nt!DG; zJf|4~nnI!J!qjuP^q@LP(%Uv8Rnt{kGrgGOlx4DF5eG&`Wm}8dcn+a>5H>EUS<1Fw z7XYHy2Ku7m2~&`cORf(~Ts?YyoqwFZ=>jZ2X}TB%?tMrPN*LPYejN4l=;IILT&sTN zPj3I`V~qSU3bOjb3%j2y1o^PLPb?*}BSK)br_I8-=U*ay*9;+8y?ycMD5iFG$d}~H z6%@0hICpYS?8{&NGPAK0@>sp)hHyNvk?}&*l067G%AZ0nOHXN(hN-$Mq*f}(!Qo-J%t2~(ZYn3FL5^B-LJysGh$#`E+X+sXg5bh! zp?D7}2-l>u8y8=2zA$wuw}V}2OmI*`rK-YC-;?kv`^+O4`r)zRmCC`6dkma)QJCc@ z%+4;LFe$W?Fx`byH(r97ef>h6Aewb(d{Pp+j(AkKEJw0AEcS9||L9Y%Un}O%m$y*iYhsXs)5M0NwH9G zEp1u2am@;xyPQg*3Sp1zdKF)JY=?piyLy1`UUm3r3{mkOgoTx&P(j$cPc9af!VH%# zmx{P=L)riVX^C?XYn#zeELcO zBxd$>3N2?SUl5t)TJYzyFYQL+;LCq=@Q2^}AIHn?>l9?|mTjMWYBcu=bSR`NEKEpz zpI*EY>sFm1i$et=-)1OZM1Mz067|gFB)Urzc=9u!c-=97U4=Pg%l2?Ah{zO(n9z>U%wb1F%MO#LxFqlz4+`5gd0oe#tDToPU-h1Y0*r1h! zbd&pEcnP;Y{w%EC0idT(PpAhXoOGW`i-M#j#G;aLiwL!04Hcvx9=1-2qT$w?IYKP} z?ye=_w-x-1wKBXZi6-^zENZ;uG4&d*of=1+M3&=bkW|zJ#+;% zBnhpy)rE{#DLP5qHQvyz!AjXo?qhn}WdM1zX-X9dRsNxnEp?uHaGV#&>@?#+4h;{Z zo*R=8%Od|qkgSFbI`3eyFk)e9)ZX~`-EY04Fn-~+VV%aE2o?>g6UAxgoQoB+XGnN8 zZ%UugOc-8ydMgI@G(Gv)L%6Chy8iaB{Noe9QbG8J_?hR2F8jZ^uLLI;^6Go1VD$x; zNnZ%jEXLcrhcbc)FzI2ZVP;|+L!bHR2~&_Yo41Fgx@QnW-ASs1nI~8&04_K1bODY* zrQ&dQuDX*gBuf{?nqijQ#a0zvLM+l&bPi%HC&S8*UU(Lk&YLY2Zx#vf+3^Ctv3D5g z8&HGf7`wAyKfxh#%7gT1aw5ad@nR8I45qOp*{ZtpJTiU+57qT9uE#Yf9ZLXEpJNCk z6A-Iqyn9C66h)fh6vMrdSTBZ2S2<=s$W~_}PnO4s1wNMf6Np)ghN2!8UaUp&lG_IH zisLccE$DX{1<`YPIep&@u{M)n%w)xK%|$nu$^ZZ$07*naR22_$D3ig#VdX){re${k zdq9N0v?#XMfD<;5wgU7y76zli#>d}cl79a74}9-|%;c2~8- z=_I-nag0feEhns~y-Z#{d>G{yo_uZi-@mo!=Na;!E6n|8U;LNj4gcdp4wRUml#V$1 z&o~>)=PwjX$S)=DpL2z#bfl#CG@75ll5%eNM}K$A2^k}K#^&uId05%Nh8ycdKqcV$ zaCh5k0r2ZGP@3a-gs>=^MC#c~hQZsu-=9$sDg@Ch(&lBOpN5*Y(N3!R8Ql73TQ9`y z>5A>j=hKHq@rAt^#1m?&3*RpL5vJ135Q__6Dwpuz=Jue+R?`j*`|r7W9Qy+`B+ejM z3OUlX2CXm#0+yNtWB*bC+h?X)$I?`nmm6_Rrg{WCX@*425j?6U(q1SuA%!=31Q$$8 zwP^8{g}WvrC>gqYQ&L*WtzcxmX{gCVbYHpw*pz}O6pKvngQFQ78XZP`EF%g+$0wT| z`5q#HCxAkq4GhNKx(6A&WLr5CMp81SiQ6m$A!ePi7U!J0K=!g(IM^rm>+r;+CL2>vH@@=sZ&*P#ZN7Tx!^7h*`fN^OO{7{;b6{uA!MbxcA;}3I0xjCu zmz@w^7F}4bP(Wca9~}AI@3%Ale%%NQXKsCWIE*-$sMnl?^kbk=SH;3wQ7H&#RV7nW z2N7y>lk#rjZ_}LKMpTp>ggaHS4pLLQU77s~o8t>qqW-z-uRymHm=uh9aI%KaygI6# zk`f>m4Cz56^l)qV$dYN&H_tN=4*(kv)svXi`34249Y<&{)S28vCCoshR>h6e)PMx@ zAT{LSdP>F+nXRV{vCw$S<7io`#-gV??itIXmK(zdPZ?0$GYiOgHtsL#>69|*LFOJpRrQFa)CUR4#5=qQG=OWCTHeD*}9Nxe@gc{nLN?@{5!Qspp&hy8= zaQol=#qa*wnxQ|qcJuad2npmFQ#(mj<)!7Wmw|eTyV5JjRTPBE%<8FO^tM5~QU}oz zCpm~xkdTVcJjB#Nw8d67UkM2-;(xOFLd+ag+jB`XQ#6i`KeJz8Wu6m5FmBE=KL*@< z%G6`>jWQzmQ7I-+tcufHq(s?l(>$7mLG_EOodkGCs*b^=DLPuH2EhH*gj_EPmQ)ZX zo+gntd6dZ?WEI-BG$RE*SFT`BCX4BA5jQQFp5hO9MqH`k`l^!3FiPd;a70TYurux?iXu z7jD`1KkpkF`+ubXM^wObWjcg4cM;B6caGlDDkd)VU@nir&a})#I+`1YUC0jY`NAL1 ze5(qwZp#hfXuwW4M?45&NuEdO5rLwD_yDOUNo7sN+Z{t!*Jsei#S&$p$Iu~`)Is!Q zlO|`2>OoJWQ5}XbzklflEI4UKQy{E(3ZHm-zwEwCmwnCD4y>KpAwd$+FN)W`nuX^= zb^*3Fq%o+INg_-LWYoDS=wXOiei`TXw})gF?k&eqf}))hEn_}twr4hwt4u_pc)N{7e7Xd)CFZyz9pW z9pW0Xz!pnl(Wc8VqrYFg2zf__deRw>VkDo(M1BI72idh>{rsn&dMiq@e(Sr#AwMEh z0IRmzrYvM=6tIp_6*NRBCaJU(@KocJ?$&Dx2RD1vv_J|xd0eE>5GH1VZYt^R)?8Px zRl=_rgA|P4*{~X`PgO(6DI}3(8Xx`XZhYeOdFZmdCPjmvdobr=Jk{HVq#NRkLZMCZ z(CkTQl4j!p`1%#e3Z|r(bgEZhsX5r`#+n^{R9wzScj1R6+*HjBEd_NzNW-qZRZPHF|9K#U4}=;vKVZX|NX@;{_*Cwq9E%w-w+Ok3FHHyBJsPTii8b9v*gkE zvc(qn>>%O>_SH)&2G%V; zxhXq@fn6$@PQ2Mc_)o89f!?W@-rXfuoWiaIRmb*P0SyPr>`B*`Lq~FsI|! zSCIbmuL;L(a`9rq{vgD=bi;XAIzxdgWbUddE2?tN++%oR0=pl70JXbR*WfRE{K_{> zJ^Rv1rrt;jI%LEm8pomwHe*I#uT&>F8tB#0oEmr#2AC)mQ7q)KFfhy18gkU$MT5GA4aXjD`p$#@d9jHv-lWPiRV^!eSGef9K3iE(|da{wX3r^EaBKeaO#$r zJV7}rRqN2-jOnQ3qW;#Tk$eNVyBrr_M5rEZTN}%Mf%;rcvfiqStMB5mm4bv4hqJHe z`NKz$naJZy=ggNpijVsy9Sk>gLzbZ#>-*kLpft#wu%-0|HT({^XJX4*6Kd{&j}FVn><;JG@*rn#z5cV0}8R92+^#TwNq4gvPg|`)L;>15}Ju-^0tRq${jSVYLnH=>rSMwWbSPIKNqZ) z9e2%xa`NE83EWp!lng4!K$k+lSTt;gEE6Bu;zTd00-qjO`Twp7y5OTs8dn6;-r?-dq|iSR|_WlLg8cRI63hlikiBW}c9*;hRG>Oz-QH zrYV&mvk#-K$6F`O!fmpfTYjsMMz8Vd(K?oOwkEsps{oJHROg}0OC~3dNqT$Zl4;pB zGI{rON zFMCgzK^*0VFKwZLOk-!+mvePpPJU86EJD0Y)cKSa+^EiNb$BI&MBPP5Xjiw|s=-lh zaI5wnDsIr`UiU-%&Zf0ky=X21&UJDkvghD`?9Jk;WwV+y9VLv3B=EH(u56?2>Ae6| zMVtw$5_%;}tE?#abzGd++v*D$t%bO^k`!-2)QZzgs34{TFCr^VOAn^rI0!!WqtVZf4}|j-i&Nqf8z&kzJ2%MuOii{X(c`| zFb$`ju@(yl`Xomq(_DJv^F_6HV#C8LhYlh7+B4NXKm6t|ta}`P9&boN_@Vh5H~+VN z<=U4d4wpM?OG4bg@+_Qk@*>ezTD9R~8JYYf;_(4bQium z8lbF;ZpN9lckD55Xlv7I3O7$+hU4L)-c}`^x&w7zP=Rl<7gPzR&u z=Dc_w?1LaR=(z)jFiz#oq9F7j78Qi5A-y1E@&f(Q0K4z~_8XQ#BNH8K-;podv2MB7EI!8Kn6_#i)-ReT z;obbfJ~0F&CAxkfi8;f)T~9xZ3sT|oAKm`d7vHEXzNwR&y5aILQ*|}pNhPhEG%{!1 zCd}-gqMK+`OD=gz95q?4l#tKoa6_Uv=Nn)C`$KQ^#LWAy{q5iGcwv9Jm`4mn)+-ri z1$3DT>Xo{N#MpWp1k%!}DAHl5(JZYXrUt@7A&XT)FEKS^18eF+qnRW^EB&eMR|t(= zeGgD+c=+rqlc>o62W3fVwLUN_jg$LR;$iq&Bo@a5c?SpGmPO{*sE*p!Xq_gaswpS@ zD+gv?+vg(Qnl*}hCnCr~u^8ASCF6JW9whBl_x6NeJVCQqs05gE1=!ECcVra5H7A7y zgCwR}I8?LnU_mA8?Mc1_s%-#56OC)a8d^bQYNZ-+TBuYoJT`{W;iCw-Ygu5yW|$d< zh?B`1HqajnZhiL0cf6^ggG(;C?mI7KC$ARNlJ^%55+^Uh`qNh-5piT=PQtpGB4_TZ zjzR81@Z3wgF@5Nj2VeP*e^m`XZ}9P^6y&0-Z@BEIhjTx2O=z#F9ajG|tU7CxOaNi4 zDfi(%l+7U$i=k33!ejL^d$cfl`{$a?@Ne+^6uUp zWs>0qx)=P?J_lz_PdB+*{O-r{4qj=fWZJ-|{ESr9wRSY2Sca}T+*zM=af;L)Rc=!D zE!mX-0Sqlf@1jrYOag1d|vv|$>b$kXf*;vEC&wvVhJ1QKm)JcfBTz~ zzg6eIbIyyCDyDL;gr>Dv2d_oS}$0zE>!ChLP~ovul3+TG+uhToVn*) zT+KK2cvC0HBcHeRx-UL5T=;F)Ah;ol8ZQr|PhEv&OIJvT8xfYnd4^Y2+1ES>Jd_G~ zbmcS8jePeDr@yH))Nfw=j+?@K$h|CVxp0nH;&FineAYB15!Xs$!Xp+o4Mb_e0_6u3 z!lP$tsXC8nl5ox#no)qi@}A4!Ggr}Eq#gT5@Q?e((bG35Nv&h6%`EwubTXkBqKyWY zr7T=KuS*m{fCXCBSSP-IsEQcr`6i*&gQ|~b;WDq_ccvW+TYIXapoZph$cy8J20IsH z&4JY>b#C_}rtYFtL$&9B!LyRmcEecxI2MrC2+#*L93 zrFcWS1s#GF4v_4`lvQV9&B=3Qt>;ZqL*Wij6a=+$-3Im#597#=hf%-(msiYx(RsXS z1>u2KTzJ)gzBpN3(X5T|D3KUuopm9m4-5*4jfv!InH)T?A>1VXtV~W|b}{oedw=ki z*EOd6s)btdjvI4%JJnb6eeFd^sp6(AzVaqi7PSeUqOZ$lo!SyMO`vAZa`u<(U8kp( zm}_jm zJPnnjQmZ2~K7rw}QTTvq+01jty*g8ppE-Ir(usTw^^2zUf)g4Vvw)Cif* z1=x4aq99Q#T2$5pW`|W=zjP{U<#My9*o!)3J%Tzgoh!Yef)zNHU(uX+7~ctbt- zq0Rzisf4jy4%zWBpi~q{otMwCwGpp@WWZq!9$vctjyEiOr=GXFiXH z8MCo?V><$^@%sCh{wP04WH!C`-0AO z?+DpLAS=kknDpntSy*=F*)oT4_s}4VcH|&dr|WYbz2h5iDrsMG z>3hOS#8Kf4SiOfv5V)cwgnJ1J2>nFgQQ2m#*(a!qfATOC680|3b_bRqA@lot@X2>> zBxS!@LizgBui%l!4L-H=`K8#^RO%Lq6R|1oQY*g z?WO8+f{E&TIjui|s~1m4wNyky2IZ+l%L{FMXIyQ4Ve%tic0JaKw{|0Hu7rYk4He!% zyZn>y`KZ-hWb=89 z1d53p^{Vys4@~lS(zE(5$^y0`Frns?|m=s zpb!VxTrj_Q-yPpLB_+=H-}0yb_QCzf{(Citk|Vi27(-*&aM7hWcl9WI$HLlDK`P2m zR%#LhEi@X~z2`*?O}_H8Blmvu>bDAxw`D>2;tQ|&#P;2_V6O~$NqaF26W&=DVEguS zRo{SV;^aaV)mmLu;>I1cTMZPZk7EAbUtcKp+7r9}lV6xVP&ZbwuOdje5xR7+g!YXS zS`*D?iJTo%F$lUV!ac9%Jd1QC5R$^x0fqXw5L{N^5D}cSO{#)o5U0VZN8wNMGIR z8u($^mvIWI^$?5DQ<+ymy@rM$NR{iqN>fQTC1Xui@XjtQU}kOxT`F_3&6t(P(m@EZ z9yvtV_tR6Oc6WX7=B>}n)n8Foo>toz5$d4}F2%dIZW4%Z9v%>d7Unx-Ku{3kg?%r> zJGwiVy!RWbO!;kmy)6sE_uYQgO}8Ehx?fiMugq$zQ3S>F-i56jx5|ca3`CVQ`A6CK0SE|#()T~_xljYD`K36gcM zr|irn_JePn(!TR9x;_cz&1kh<7`XxD z&%O}vKIbgCk(@g|BA<7nQq!(vgclDSKx^+asJ)4O_3Q9+N+0x%0C@HXKJn%K&Cabd z1XL`E%51N?-G}#wgkyV=qid}OnE5pT#-GmCCkI%GzR8*sCd8u-{yfV~a&fvaOG>QogR^3zIdeGe!kJd{A2 zG%D$K*PNMPyVJs`p<;7TkzDf6ZdlV$SA6Vq@1JcO57gjF##a>eyB&0BnMggqmhKhmSBo`h zbq+=SzFJmPjapM<6x38AMFY#7Q`A!QLw4^HQ1LakgDl-FN{@2-6v0A((7G^@r<<>M zYD&g4?ZQiwASzFj3Sg(n#I(ml1QK)wFOy-S`>VVAcvGT$&L9E|8Ev?1@HJQu7o$U0 z)UZ*BU7YN=D0f*n*_A;^GO}3*^J%Ul?QmS0^-lx!UWJLKs3kX}19b8GB{-kOJo6s) zs#HnaUG~LWLhWV|VZ`a;$v0?Fy5ZBeZhhq7^eZ){^-Z=>bN)*X&ic(b=llyWob`pV zq8{-?wT^l_lS|Sf&0JxiBtLD@4oTYWHvNVODrjm zpnOg@4t3oVt8;#984vA=1z}z&Wtq}K&vfIhz#mAI=8LUqi= zLdnH!PwGjf0XM&s)gc%N4sIrXPe()ZdP`nO)7i=$r6p5rReGG1>yW+>J+4e#vra79 zQgaLQn3|qMw^or#X?73VEGtP2_;DAxB*2=y@v#Sf@bw?Q-Wu=P_2wAD2=3C+s3&!9mw!Q29l0f8QQ+8!;auRKVgsc-wMrJ24hTxx_eDFK}`i(yP zXa4w4FMfWa^E4BO2_R=(_Zg}E?N|4NUunm zO{d$H>fmNv75J-$DP@IHmg`mhCTXREE^p@@p1@!*8$=2mB0ZXpK+u_w)N(LhlCPx< zmiTaL4xx%gNRB9xxP?juQ!|t3)aY6TinZ#-uz9|TflM4>eJ=UlgFpP*@BO;9U3JAx z$sBvv#Z70ysSjuMCam3g0XC@JVblNsAOJ~3K~xVEM7n3JKm{EN(>0{sn$WLQ<=trrauEDS-qF1c(9)`$3eOl?EUwO)UFbyFN;}ebI8r_yaOd zv?fx;tdNvikJQyl8@UJ+(Y~fDrU8@YXIKEpl9fuOg2|albSv{x2+Hx!yG(~leU;65FFveQtFdb5g*bQB2#UTcBVk_WWVH?obRU_Y z$MF}Q!kS?AiG%liJN&6}W zO94f*S^7@cOLR!bpqg=!S_=uxnUK;$c?2M7T%}9jm5QT!NRm;QFc%J0-x-5sa&SoZ zvTlksYN8>fHg`H2O=Zi~GNq%;v`m($Af^_AE)^{bK|#Q%vCm2xbqU;iY!r`2mrC3z zT8<7Y4fJ)+l+bcG8Ca{OtPTcI+^cMpau9w!yYxciOmc$p7r)cYpiuf8A%e z{`bD{{~W5|&l?G8Uyc&%$XGFcCtw65Jy}sbT}oxRv>TCT<5<40#we?C2TRC?6b!%O zyU?g9bEk*xFlcui4<4;ZCJWc|;5e?dfAYrQY5KP}1XGWxQ6*TfZc5@EoM508qV-S( zii}Crq+I?@hx%d}*ndLTLv9jcEmSa`&L!c$(|ks1Jrp6l*f5$}5VC=3wK8KPx@A(S zTW4Nn7WMKRl4ebTBT3-M18`XG4+B}W@xpztPwAfX!Qa1U??U@}iQ`1{k1#cYXNp{jD(kti`qkKNL@P619TlF(}$S9Ead>!-OBVOUfP zu4+RzRl>2SF0b5$9syvxGN*%9#N@x}iV-ZjHJIIrR9jbyg_hh-mMSUov$NlhEdoic6Molug(PTawuAD{ooonQTxjY&hhZb(QuOH!Etu_*eNfxCVa z)@?ltt8*EQ+(py82(d=cs$J15fmc+pqB>>s%l=Y#b;*aMR)iqo zS4wAVz$jW+KaVb(wm_0w5m$n_7WE)#m?scHK2c*aL>N1bQPKcj^{Ou>57|Y?_=p2U z>1r`+pV7g)5CHO}fUq>no^F1gRhsh(Fuag+pL*)_&7t{qAo`5}gdgCdt8X57rI{?W z$%yb>WSA0F!*3)bXU|`!e#?uyCn^8F(s1PBvC?DK9aEc ziO1KLgBB#AAT_%LJ3n~%uCM*dH5$0+`srF?uM)S)%^A5Eq&4C2&Mi6P@V-axR27B4;_D-y{KCf% zEyTAsV;d1`wZJTUM=XkfL>hZ^pNF*XE|MQ=K6%=exWu7j{E{Xpdf%0Bg-S%IHq~Aq zypCC9qYD^xabxO&iL|NuotaK!mAn0`>%`Q1rXwAelzK=?CM|PONlMG};dvfR#yr|x z6CGWNZFsj=r7X%|F5VDQOCke3363a2Cuk#RHqdI;5%VU+hBOThi{sPSPD~316AqcV zIDs997_`H~kKOZ)Us{`MKl-^1&ri%8nWNs8O_8@O63c-*whm)E&XWWndpb4@4G6er z>P^X&@w4qcdIYuo&tbe<+kfc(Up=DWR5$xudERdnApC&LmL9gJ!m5_qXDNYfFc$l5 z*@?oMP14U!H=xyOqjuyVI?R>O2KvHqi;iv>-fHJV~eErg!&V;*e*hhkP;?(Urfw%`SI*Z6#9o zOK4>UEY;@Q>j~7ud2|`f5*I10sTJ$HBu`@s5#Ym;`Y#WrW5aShrM9RkWxg9}W8Mm+ z-b?2-RA5d|Q}yQ)9NjP!a0KlpI?Xx|Dg{cT+YvXI$v^qd?m)u^)wDSCykK?8&)oYJ zYOTKNYumOPymF!2Ug(+iK3fs*H9T`4d99HbN2?MOP8W10^i+>h4L zy;yIyD*NvH`!_8O^i}}z+SmNX0g`@z;mbeXsdc5%Ocex*%jLit8pFUjyQEW(Ur{$f z?Zh!eWKL?#m$ZOJ8D|v??0Lwyf!lOV`>RjwW1sx|zuG;A|Cyr#x&}*9I*Q%uG9DrQ z$xJ(~1!-uVOjP8*zQZauM_HJZNY(El$}UPkkM5KN>1hkEcAe5#MOhKLQ)wl!P8v$a zUgckeywH|HVup0Sdr$mM$4L5by#h)tP~mz$EH49x({&lkkN{w?ESkOQJw!HiNp6Gm zw1;5+Gi$D4QerYf5 z+I4N|<4nNmN{+xFqJIIj(DoIwGokQcq z5p-({YBor_3M*>i{Nc=zryltJreAfESKoB&caPT0PjomXmw+%ClXR84#X`xYmLz4i zQY#{^h{`sLXt!=K>M>n(yXYc{Z>3$Sw4gDq)zTJ2RRT-E(z6hZL3(PH5{oEHB2VjO z+Ls2|I!aQJyRJqyRjF^*qs@L=(OAD zL;<2^15v9c^;B_cIkfd)PlpWfl-R?Bkr?ng4GgRbv%k3Qw${=$7`x<#e*z zuZ|7mIVlaCHc;uNsvc+rM0%WpyiNt_i_@@lMn0`D)|)>Kb$WI0y4W(cFk)pm6UDRy z9JbHlN-kW{1XD$nj763*Vv;lIxsHjFC!+NTLquU4opuwEuvHD2he-V@-W-HVrjh5( zDq;D(ErW2}B*I80dKI0!^}V0?`SDtCC3|%^@F}r8Sx;wd9oC<-Q{+FXClzDMQecB7pL1s(F#BI_`P5M z;h+84f4lCHqqTp2V7~entga?Y#r%dm3=`Q+XJf;bt;o4HwvVWhaWkS@6`&G^IJ)me zgva;630pX)g1-a#xFRc3M(elx1C-x=d&AYDv#eui>EEG5G zkn6?`-I$(4d*ZlKY3HOVZl*XA`qZ#3Y#A(J!>YkQ+T>R5|9}7Tf1fz_1AkO)CQgAh zKi!1NC}g)Zt0lq@%(yESOXUkvae~x(=s2XudXcVH!M4N%DKPi}CAXp5d3!8Z+8HP0 z>!O>a|1BeLdI`xTgGhTIQDk(Qmr+!)s{i6OV%sl?4%<<3M6@DeNf;&QN@BSq^4#>4 zEyf)prV%uy!;{}-{)zykqw*cJ8U_=UHXKup-E-qMhO^e)&fsu;_gwJF`C3)CH!I>n zHEI zDS)IW{hk~CAbDoG1twcn9T(|f7iPAI(#|VnKDnwtj8Qpy2+_n*)$GK409_0z3N_&l zjUiJkVT*5J)BH>2=k^{OXm%+SWD27d5hPk%T7q^d0cRO^rOZKZI6_!|) z9!sT?hmspv5}OFn(?DEGT2f{!4bGR+yQ(Zl1^y~Q*z@XiT%pHe3f&wFYXf04Lf3W}p29;@P88 znzEzhUj4+6|NdvcsZIZ8-sg7`AUpwb=hMyL`2&@(#DpJX6EWG$x~|`W?D%?^dMtFz zkzWV*pyhK6NEN6xl{Mr5h<)X%<;pw$#$urxlTt3|g0%*NA!M2)l)J3rmKJGUVa8IXOTULAo|M}q zZh_=5A_56^4r&+HftdtSe7SL_6*t83O&1Q^m+KilIW7|*>g^VY&Ian?-$sw8t z_aHj-0=#aB?St+erP%!Jz4v~#@n$ydZ}Pdnvj9mi!i_h6cJNp;dgM^Od$x#I(|vF` z*|q?G-F9S0*Q!92S@?P#wIc`6sn=k79^8Qu46R*{4a0*tYh(b$jEjQr;;Ba;#?faV z0R^EMxU=Snv5AZa?hVjPMdOzALP)Q>6g;WDyfkp{NtdQAxr=edQWi@UMY4uVFzvtoaeC0Q}(ckKO{muhq>4|N)?DuY)?Zlr9gfUX? z1iUPAo6dtjGOpYhT7fW>F~_ahNhKnkEg&|8sHexhEkX}!_2rj3AIW0+= zEKJ=h-LI}sT!BHyLEPXeqb6l1Dpu1(SYrWqtdKRdvp7~-k9K)p z;uXu!Be!M){Gnk{&>Z$$tS#n5EKgjiY8}U`Rn#Yrp>^a%xM2&Mvc{elfBMaHej6M7 z?Y`$b4j}0XZ@KoCQqt&_r-E2&x0FPW1=G*LUbPXW_1o06DP4storO_^R;7aW^a-gk z5_ZhZU|ahzA~syn$L=NwsQ^i(6f$1IZYgFz7tUW+zKNLdIV6Q%V~#<0GBr7Yn0jiS*`{rLrEi7IRkLH@P@IERD51D|6a0ZeNi+`nE>`EWDEibTHbt!MXr+OP zg)++fo<=-(9NDCUttAJ3HdB1~j{j79yBqbl_4;=#K++3#{l`AHd9D>6+&do#P$aD- ztd|Fa5OxI9Yp+ECjdoS$VlMPikJpw$InMl9FZ1c4nrF8 zJq%?$k=qeL3C=p~c5z^?B5EeJ{ZGND&B@f-H97NNugTQE_@f{FNR9t}2YnlwP8Wsg{qW|FAk^cM zrLP-?SQD0Hh|8rdiMU+4k3u|pExxAQdjdxV++t~1<07C)Ed~>4>A#sTVPcN}NkJmT zAPNA~9cJ8+kjvxGYWy6>KFD*HSP_**(G6ZY=vIC0bUBrKCE8n(>|$w_c7yX%Hh>S_wyDk#v3u;mFZu`(D|Dx&6-~uFVO7$=909krwmwfP3-#Sr`KGh7n!c0~-8fkNvc7D_c3ac&5Ysq!OBRX>Hs=MWuN5Z`ew# zKzd1ZeV1h0NV`g=28aU%3;~M%T?!CcMQtr~3BJHn3rvW6MV6cvge53^=$OMwVwqGW z({l3zu+O_1;{zpFmeLYX8TbVCW*f&&9LC%Wzd*Y|ac_1#0)w83i`N&wa>uv7^!YOh z80op3kpNk`P#^fnAN>CDa_~3hAReuEA@PM&=!$fx9@l1P;H}+`;@EmE)MjAtm4}7f zZ+8g}C48V_6UA;xcOIxT2)z&6f9)d(intAin_6i01>O-+tg_&9pX+;UE27&UHl3U)fVdVF}_NBjm`b-4H(sMfF0kZUDFT3G} zV$K}=!+leYzgdX5;Z>=LqF^maLfXUYP*}fRN;eAiS!9nsj&^KHt|Xu$p)g#bQVJ1K z1V#O-5+^kjG-Z6nxTG$YxLj$BL6?df(bK@7z#iSM)Xh>BK{h{o>5~vf(iUJONuc`m z>28Sy(JYpjjFci)Rl7=KOGynW0XoVBL5dAs%Rq)|jhP~5wq1onE(^y1W{>Pg=anav zc!ut-+&q%GeQLJz`GZg0RyorF@!IoSQ2=@E$-n#BTWUf4f7QEp$UtV=BA_Of~X zBAns1C{U)T{0h3YX|y`p-J;eMXK;w5r4N! zxO}12{ct_v97M(jCJZl!wK*TdRvST=W0X^%s5V|Iwxkj}Qp=?qlT>bm9ek;zkOqjj zQz<}v1rV_yOD6NmiwOX_SJb*~DAy`hmV|#Z8K4^k3TfO$E#FknSCyz6BCjNt!!(g~ zE$RO_QEAC%AM&Z_XngVPHJSN)Z~yu)wF|8D&9R~_$Qv#G%{Sk=_0U}H-yAIm0}-67 zLoxzJ%O_49QD-v4y}onL$8 zjjq8;|9c-GZ*m9R@bO#!ujBKrKQk?7pcNYkm{`=R>8gC5!{F$Ckql6o{865f`PK4Xp+Ke%D0Y~h-+wgK>z(hqfSsrbvM!;ows~0vHB69hvS>I=iBMWf)RFMXNzYLe~UxW{jtP`pYsr zr|DEz)M5GnIgQJG!TUawoNSq>u@F+v|C7U$VoFECF@zTSS5du+&0;J*j3lp@YBqg2km)3%4O&7ux@DPuwm2j+*wc9( zYy{&t?b_^dbSslEqb71Du*w5AW|9A0?(sg&mwVX{*9XWlT;g-C{B$zeHqnTvy``&t zQ)PDQz*y4kNBk!tS=kdYrq;`ttpEe&q|xa7ruokbQtG!_r@I{b&F5L^=68x>~FTmXi2X zE>seM3Lw3{dKn_)i6V)`c^OhVqAGDS`4VygtS(d0g`!NTk~U%n{oSt2?WoKgLo|07 zZl{g)nK<0@@HbKlY#GjKWgfB*kY!r;o$vijGS#+FjY#*VI*q#5+-A;$R)fu4N}AJf zv#|UkT*?+v3{DpvdYK&jOhyFZq{m(>JqGO-<|Ymyntla&Bf`dP=Znui_|1R0OsBJA z58DUGGA;c@@4MwoGj03xb5ur6H+HH!tX(TLA(zULK1?qQudoV!t^~*7!igu({x9^`@=SVNrc3mWIBXvv%d|{4+;YpRJx9#x zslY%WL~;ItGDkmC(CXLiAy{ zIk?496bHv-oEn>)INKxRd(yuVgb_My)=E1T<1Wf`(or914y>4V*#*DBTHr0 zC8=)6@JbE~QWhiwGdGOl=mz9+1t~b>qGU53in*+ms?=L;gdy8))hLE23^2L>2{`o$ zY|RFTpL_VW*PYq8%%^w8AHENeWnSVfyFO7l5jw?)gG*Co1x@J+-Rn@hYduOMYmwok zUrujw9I+nxjE5kIuux|=A;-s2_9sT8R>s`EM^KE)xMH2V@rOVB>d|FBjTL+NK0uav z>94x((+f{cVt}P5Dx=QiAY%{*9AIi@2H>ySjMC7UbOds4I>#4`6mv2%fU1R+dJ7?E zcCg638=*QsjryTSF`CqI{F&SOYq*SS*uS{TcyZH1m(IT>sdds3(^P&;-762s4kN#2 z2lDv=i9M)~>$whA74xud6HU(Ut2IO`m{x>&kogn)&^h@Wwq{y*>Cx}@*Kirvuzzuv z@#3b39y#yh$$W<+540|?G?24{(1BT6i^7_-h2EtF;nzSehp~ZzWYXswEmWILw8Btw zBOJ83aOfF03kPu3X7|6o^Nz3mhu^>{tk}2c1LQZb^y@FYDLK(H)$G1h(nqX_3u|Nx z@~gMQbsbm+*()2P#R5uMPs-xw>MfKTbtO_q0lT1ug*^{qAezDSbA9(}xtFgGkmbI@ z0M?!V(PSd95fdQfs3;-ISj5i29zPGc(T!>%tzp8q9jqN3fals$!!=WFqTFog-u5m! zts1I(e};i>88a_@r@wy7yng))yv!GvhhKBvjmcDCBgqV?W~rd6luMip>@^p_AK4(2 zX}K6V&&Rq!&h#TdfVoBsbG4f4Zzqe@2~pYiAaboqly`rxzkbWSe*Fu)%omu4Uw!V4 z$#iG~gPW1qK9Yrl07sy)%w+XW_+#6Iy<)Yl@3>eyIEbvre29T&7~%N*f}T$j%Z$PL z!6#tP@5MDclHwhA-0_Z`z405k^l$qu`T%*`m+*}bFnab!lDWu%vHE-%en}W8v?~&m zSfgjdTYH}LexwxdSh0k`tS^Go^>&EKN)kQ1 z7rF!iEplv=wB*>&g1dk`QjX&fsK z$v9<7iE?1iv2q!0CJIezVA*KQoj|bXE{wY^9Dn(q{u;im75eor?qA$xytq8{1()8q z@bXMF5D)Euz4`)4_;siEAer5R#Lfz63Tt*q$Dq_(83u-PMT`~lA_~XBJ(JZMYGOf5 z=B-Ilza$^#>mqyl$1!)FN z8T>hrFJN_{C{v+0QemP}Lp5khB5@#-lQD0zdmjWQpTX8ac;l#r?$O7PwB}%z*2CO*1qKGk(IG%u4JtJt?`5%$ zlV%yX$1!GV4OH3<3FM1j2DV{h`q&HT9{4fF{BHfkp1TXncp5AE(0za`bEp3Ih_EIFKg*d1qKK6*{>0)R*>(RF2XnZ1W9D0rJb3$Omhn_p?4kPrS;nOw+(1>1W_F9zD8_fe8#@byOi|{oHzfv1 z;JO)%l?LG3swbosbue8m%V1F7@leWSB}a1n_#VXjet?42#;&ac1NYr`TVLdyf&%B7Fd=T&kfbmO^8Qp?HrXX_-TWwkp0>sBC z0ph5hkapC;RAoUdh-KLr%;qGcJ~=mm;Kgsl>sGOO$o%4q&)(hF<~_~p*$2pJzMwqZ zwIBKT`A@x6d%hZ)NY-8nb6}&I6B4!%Pd*JaPQu6xBN@8{*;QMR^)n*M5C%M_F{Et4l45zcA57`IE zGA#dDJFojkC+5SyY#Uh^8?S+pRV-E9t|FOy0%*+vxz#YnE=G3MCit$0NC3h~wlOR> zgH?qRJV!N6F;JhaRiqw^U!_b=G<%z^CT92D4{P>WjOKvjd;4`+r+Yd306E=P6u>zb zedvXQQ^C&A9fGy-8o{8Boj{nQ3EKfgE@8)vcv1)2|yx*bg?+r*>wyREcybv|X~iD050GV8`Ze1= zm`vAWbn}~FuDw!ZMrH6#?Ie=vXMk=16gR;fJzoLDw#CJY!WNQFB%=_Agi_kG`AhErOxhwKC7G%x)X@4Mms zdk(iAs75B@kqcpsoG%&lq#Ge-f#U27vdJ-c7VOcT$PTWN8RtP1q7$}6^@M;LDU_r? zoh9y+9Bl>x78*5i!EDRHKvq@z&di-aYyTZ^gIR1}?cn(*`_;Xtb4mLEIh|LN55Ivdu=xyTKS!m%82m#BHg5zvP1W4Jhg zjLV^(YQ}oA-Nsy_1|#mmv>X&NS&;~uug;;i|86+7SFkDzoOtEF{+gb~HSJ%_(|9p? zsPiuRQ1Z%TfXFHU>)sC|Ga?c{ao9vM^8!#ktj4bmoeOK^Y!n8@#El|AqIOf{M>))M zI6okPI2))$-6RMwU#}`P6w^Y^&q{AdtyRPP!JosLeF{apgN?)9re~hH>&R(7trdH? zK0r?I(i^L{d@!DE#OV0rFxR{nhF?_k(t|pZsi%SF1Yl)=;qzdx+JSsw7`ADl9R=vp zf*1xY+eL{qujh-4MGF!}k+@i$uq^=bT_1TbgP_yK?6K#76AvJ32G}%WzvqQ#?*7H; zJ*|~{v_3#iK%(2IAsbFvi}cl-z~lEhCwF5@^rEaPyKtbcWADp)e#C zq#d>qN1+He*shO(TuCNOksg-6M-eLZDmqapAaWcJ1wSM4$=vh-bPoRrUblvgBPRAd z->>dHUCY`B$mzP00N(e$kA3{LC|cYDq?kLwe_>@z9{k{J~j zD>Jkixm;1Q0sg5{rz=4P3zjfkf-TF@-SnYK9J0}5_H^EFxGxRTqzm3#v;Y)QDE)`pxXv=YhetX z1HZHuxm-z}L%{}?n$SAfwu?fx2;cMNZv+8dsamsvpxuOFno{vw&{S_bXyN3cM`27o zf(+WYa9i%X4?lRv@1Mp~Td{}g1LQO=eQE90Nj(I*g{`nwzei27<(7{-=q?-p7Ip(k z7szjrJV>T6E&yRGEdjy+oCS#lNG?-A#`k+OLuf%71c~*FNQfxy~v9Y)&)c)elva+*-TcHPgvkM zJvV{s{_nvJCNbc~m_GW`{@R{~we4TT({K@ah_zcj5YN=RMr34=j9m%4xKSob@dC%4 zHsaamf!a|u_Mo&4C~Sb68$mu>lGz}naYN=x5=hXV%@mN!WMNvIE2RL^Xw*dVN9Kqy z55gebRDZ8l7cjl=PMEd*$XgNCt#TfJ>DhZPJ58szVh_^?$Z1&mEjzARn5jks&5nVt zGYn((`(R0ekp30tnm3V5KLs==WvUcPTY>yK*qI>|a)Sa8b_fO$S*%1<-ZPoJ0tm}g zIN>%5(P+2O?Wl@gw&l`-2tbkq?RFc-5B?mOc?@3CLf(zBZC&o4KKjU=|L18q#T9#q zK0w~)((ktJOzXcfaw8+O+bDgk%XHTGh=pLBO z`k>Y+;gB3?Ic8x3+a_eAtCHR>EIJP70w0sZ{GVRv(P{N58M@)ob$wbx!-dig+9 zUTAg^(6ur=82OFB=(}Lq8QIjNY`g6RmH%kZsdut`z#j%O6U|xbPjs*yH?OfhpLRM1Wo|SgJknCIonXGwGy!|)ALhk9RC^2+CeyIBj>~zEZCnp z@bXW-^%hTcMZc^Mkhi$}J9b_hOw0vtE2L{>BQZ0;z&XIc_QlN}caV_1svTB6AiUEv zv+fiCw+O?|iGVfS0t_by!)9X8mO!2inD6*-y^QpOP_mSu>yjph0b7`^ya0t|?-Jc7 zG3xaSrYBy4G4mLVP8At5Lf!+0bN0sFyYD;t7EgD@zN`?gkz%Hm|mDbF!?x)+5uQe3t6j+ft-n>uk@+k zH@n<@fV|l&24Hmkdy{$qw7UjkIDk6@l(qx8HIf`;a}?UMKWTSkXS@{|=)gi^<$=N$N&cCv z(oJF{od9T_0BT26aU$oU^A2xV!fqu5idYIq^@iAa1rR5zz+zZZ(oQ$ac5`rKexW*q z!bc(&#Ijsuyo|V64DN*%h!Yrbg!%F;YLm|Z3?gH+kAC z_UV0qyosg1>^&d(-YZ9HH#dR=VPYaSGC+1UFmNsme@NJ;IO!sxFm?S1&^Q5fsCC7- z!Bp0QF^J`B3qo*Y0Vk*85X(bix&jOZCR^Al2JFnJQ}}`I8)p^Dz)#B-H_P)f%A)Ai zWa=<%H84GU1ku!^K=U}9Bt*{XVyI~2;GTZh;i)crA0VfCr2wqodUdi;@1oU7(1i;) zB?-*QUdfbNX3fRDnpc5&Yf40_J%3s~T=p802Cc5CpA5INVtaMAk9y)WJO zPu|3-uh^&d0dk5P=f}m@l3r8gd2hM|0SPzpMUm}A9F&V4IBv2zj%0R;SgY1)fJzHyoCg*b-#0hKoHRj6ECzM9&H7vah5Q^w=yZg@*x$Gef)#3<5-cm%w1m z5_iz3S1>pE9E^qMVT22CjSjL-7pq4+y!2eZ^YD$9zYmZ%xI$N7eYJgT(u!uw0a_6d zrPd?64#w~WFx`?&g`yk906mWCirQri!he(Ar3E2C+`Oi8$yjCeBLhQRE3#H}!L1gF{#Mdh0>(rW(i_xMFLFC96>bw1W-RLw6AY; zk@JAn=LTrr0a8SRJL-uG}l;I*RJyFfo`%B5szq7?cas#Sq(oW!lnr&O{+gQMgcSnxaH$ z++{|+qhcF=BFhmsi%nF*ei@L7xB|{jh+4gj@&p;J-7q?3*ocs^V&pTx1?P<5?z_Iz z-v_U=5BeA8buP@6@B8RCPfXT6-3mAwEk?TobQ1%KP_sE8w?U{~!z;irEX6Pp5R5-) zLBcAKF#n+gbOz=Ej*|Yatcc0n2Lp4%)K9e~eqgZf*uGG>>`iCTK^H6RL^`Y9RaQh7 zH#&|22(1VwQKi8;x)Iu~I_75f19Q&;?I~CY;DD|cko8TJ@>clL^Y%y%(IHcVm#7gv3w~rkpvA+EF42J`wWcM1ki23LIlr@;aUki*F-L3BA>NB{M^&`-P6a& z;uYuvWXW!L_m$UOIy)0S(QJ3o4r7EJ15r%NL2&R=(fwh-&HP11#}j!LqpMmgKFC_p z{SntnH8Y8eB^h*;Nf*XT0F#!QXzG`M(d8%-YICErP9mA#t;%1zbr^97%jm)}VmM|3&oSV;2C^CJ?=CoZ_`kaC zw%eGzS@B17{Ire>OG1ziN}?TCRWrf{_6tu;8(7$LO?Dqo>)`8pU+BWD2z zH?#&6gY*<6X-m+#-g+j@Rkoh9(#ose; z!s_34yN+gK9^J|zp?k&3b=xqE4vZuPNetIE;Mr`(van`V{-U4%{D&((U0xywADx$cW7S70OJJuEo7SX=GQ^BDkV_?wtVO2=XVC;-1t&&m6n(A zySbP>PaP;RItp|O1k9_n)z2o~FHgRcwGxqQ4HRvrM4^#?H*H6<>|9*NMpTV&)#nhi zqml6u^D``gNjhM`3|q2nBZh4zaQLwtz;`W-kL4bE{E<7aTFGW)MFZr#^FR2{>#ffJ z+G;cSO%Ul=L&Y15z)*gTwjwDI1Pr{}>m;CnLb*iBeWJzCwN}Dlm;etH@NvbeYI1G47Cmzs5TBVv!UeszO)MxwIGz#4|cu?!jP#l${mT zcE@9!VIh|-p^(d=p!IjD!AoHV$F@YN#5N4n+aan^gjTyPU=eH338ej&pkb~=sAcKR zTH@j{{~^C;Y(yQR010z4ls%0qNGM*{ZK-%ktOx^smeG?=pfzD!1GqM=iGhq~Vf~uI zUp@H19shWx0cFJjWY@bt^x3)j=GViBdbiwg2|BbKoMBF@A@PKErBchW)OAYBM#N$; z7SVw>*(V9Q2@Kr?MNs&Ik_hztBC^>ca+wVBzK@Zthta_dN;wz4$2f-7xdu9&7>;cs z>M(vtFjoywX@uhTO;wwy1_2t4I@;|9I#E* zKlArOCXj|^haz9cAq|XcXnhtR4B#1?xUPvcqd7eO=*pTuvZ4TT!9^cDwonb%1z{pC zl>j3)l;se2<+W}VLGaqxVo4A!Rzq74GEf8tEr>fH6fRq7{lch7_++y=oHI6rfxIh^ zv0?UdI6|*_jtSdla?q5r z6KNr-1MBF`p8|uf6oDWt8$m&kYb8N<8e{01 zDglN{0-D|+9KV1}wuGU9VQd^MVB=^WqeDK1OD+bB4oZ0w8IJ;R1O|x#z~SNfHcYF~ zJBoo;TYaeD zSAs*R+@)ZlTSa#(EhuC*ootoPiW4AouLur*0FGZmHaCb|zJ&9}2eD>2i?ypV7$5d9 zSQ2IkS+=ngUySQhPflAizE$dC5i~&vgb~naB`DWo%q)aBG1JDxTnoo%>Nq%8Mypvx ztI6>QO>wglVX3rBB?-(F7&`XoSrCFHwIb@f1ns55} zb67p>WA%uSV%|bNV<1O7v42WcxC=;#Nq(mV5s?zf#Q+ftB}1Sc5FiN_su51iwlOsy z;N)xrhvus&bB=nejxcBlOO?hX;%=o@gMguh5R0P0qnRwRFzNHsm_)1zV-gj-)A>}E zM1h5I2|?n!Cbn!Goczgs-#g>z;4=;&mtS$i*JtOOpKWSzq`)8x#QR~&RHezk#Tt4P$w%9(FN2;IS}J+^dYQ z0Kx~qELG($Uv#b1@Xke$G+PQdv>*$Wj(}roA;83J14riSn5@ygG8WVyt0D2u{!lY{_az}|~j6i}F9CsmxXTPY2k#wB7+XhrCDNdRwPK;o+?^S}cS zD2d23;OmS6$c2|&vrunz23Tasz&4=u(B&fHGzg8GCjB&H#hgLi_2!~=oiIl#*=zVnCpoDl%I@RAQD zl^WI2V_~dRT~%6enAR(4*D5U?kyvACmF{cu9=d3-C-#<#E{I#j!b7&q>ZT`l71~+& zei42qkHO*q))ccCEoCu2>|@oSr*j`Ra=w9V){rue6d)qNu!PA{)U&QuC#fI>lqx6E zY?IB3F<*%!aX3@vqm9{W8^>!6aj{sI!UDxE%Tg%zkP6qu%(%1AjAbb5J6$G;MS6+E zKwLA#?N^uYOW>~ZBl6(uboSjcVz?$?v%f@`EgP<#VE@ZMe#h^xcl-&^7Hr=9!Hpq| z!*r{pwu+2Z%tWAat)v)G5`IgZd?Bngort&cCJWMYS$H~IW88c}Hi)AqUSW9yu1V^pWl_0%RkHm_U>meq}4NNy%=*XCa zP(&WM`B~7&u?ZsLpmQ6HOT_uqF&4$?SVnKNppyM0QklFcip_T4P86Wst|F`-2O1MV zI1hAcFya8F(S>Uy0uaxRkuy7)!-wDbY}OeAkn66yY0XQoG*6V92?DAfa$}|a|J{s?0N8iKX3uqKHWMDuYDot@09_vuxdQ^T=lM$QO!O zoy%aT;A3<^Sr5h_`HY2p&PG<3moS(mwaf3^hvMz&&}eC4E~#C~-^4&WOwgnSX~n43 zyDCtxr66fzzShEIvyD~|NTA-K^$=jF=0FxU>WB;`^?})i$d+FAj!?QZE!o%oDe{qo zy#h=ED~Z9<`AT&Lp)_Byw}jfmb)86zk#m5JWA^8ted^Ayywd~pG*Uei&O^@O-Iw2Z z>(R;J%jG5zBy_771sBv@^85yv-hikT%3V{eh-zEaId#SMFgT^2ReM_LT1iim zoEU3{@$`$&-M#Bf*;HqY1xXj={0p!9Ql*a1mzxIaBx@4-GD9LTZDhwqMMUBa>BiG7 z-dglc07Ex~)}z}(LJ@}ci~>rUaaP(Ri_~x0CM&rSojerqq^0i})gw+Sm?8{rMugtz z&QO8Ga~$}Vg(zkjhly_57{we2rG%K^q(}qxu%ZB+xFeQ8;--{n&>LBGPcf!o{2)50 zQXNcpNn(!lRXlfg9$F4u+fnVgORAQYH8aFwNR*bu63c`n0HPMUQJ@;I$}huc9)oLk zP;|Q(%y)x*yYHhs{TcIh#sP#Yv-861pKrE}^Q+ASHP$f+0mHO!0T{dhMs`#ziQ4G8 zCrbP0(rCoYG6T`5qI7ooUFcFR<0CsL4divnNm_c6b{a~~M7Q2@1B$XD1r@Y-gS5t` zKkMmIdT@@46ZmpVyEv)^mv?^VW~h@zFiBIF&hE%?9Rfmxt<`LHQJR<9D%EN%_)32-8KG9*e%cDr!_p?J7$zF+fVS%D4g*IH$8e)bn&oQ$*l& zD=)2&^qLbSuc;MFw{q~%bgybpp-{YKaw#NDTG&)< zke&#onxRx&A>Ds+S60J2(|Aa!m86uk5@t|AH06Ih8QQ7((RDBUQhA{zpPey-Y;N z_J4V%0V6%1Ga4XE7j5T7AN^jf5#P+2f?;f-&17P%>$6g@h&norpd%)olb$VO7 zXJUy&1TGKwBl0l)ArW$;MNv5zVoTMKq<3w)aY|oT1wv{w>$|!BovMOSZctCC!Sdia zR5u|Fn<}d;>78E+ZOMal1Q`6z{0Q#`9QK*IQ7ns3Lb{T3D&FG1#nSMGz&>@rHUQtY zB@yV^2@08bc5GGle|hL<-~D%IDlk?YK++Sw^2(bE6LaCddJE%Wm%?xsLM;x*=}bx` zWa;Hef6|*V_0gBy<$F&TAD#^!+WnF`Ev>~%$sQT6rUrR30G3Hp@|6lMEZJ_U@S8*k z%B7NjY4=L1$+T#;qH&e$Ci#v|3o)Cfr2m|m@$}zm`)yj3s98L^kV_1wno*L#Wrmzp zyEfoE3D%CfhadmN4>q6apjdi-E5?Gnc2Rfj+U0oJwSP4|8~lSt+XO936q_>pLxNqU z|G9`3p@ozXb*fplsGi6Ttp6rfB8?HW5~5fHf+1zVSO}@J`vQ`s&)3gU&X{)g7;F={ zx`s-%dZ`+!)S~Hpg;HG9@q=u9{ke6ApdypC<%W-n4e zaaiYK452wP?Mf}qLQlb!YGP?WOM_6?jmhTLE?qjtO>m>yVO7|`&z8D<$|5L8s6bnJ zjoJ$8*&#|>iwR0YYN#B#PR{?|-nFYl3`Eg8k8Cyzx(I^)iCBrP5c~~GOUo^6{RMkL z3l&5HR)XJPX=AUhvTiby(R1hFR(eVucLsKApu8m{UmrQG4e{mo?; zjbiCR=GgVE?Y*P%hsnRgjS*17)=H|aq|e&;OLUxOyjKfsQ#h7hb|)V08LXEtQT@!y z`AD$1WMI*mhg>9uaKQ_uBEgJDh~vcEDS0SA9}Ix6LI6_{xdeo&mE!~(V8SdD%uQ)b zGum8VIjgFR$2pd!Q?GP3#9DNhcXszrU*GDrx^YTKSpr1J8dgz4$hKrTO!L~ljD5AC zjEjDBqWi`wn*ZlBB_#z_9!lD|F>SXwpE}D$n|Z zLSkdgbh;l$7gQA4Np*XE{Li1(x#7P6 X4DE^^wfmX}00000NkvXXu0mjfi69^a literal 0 HcmV?d00001 diff --git a/Resources/silver.png b/Resources/silver.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9ff8ff6b0b33a535ecb9cc14f5c4114dd22c07 GIT binary patch literal 33459 zcmV+9KpVe_P)PyA07*naRCr$Oy$P6A<(2QfYosWkpqM8a6-O|DfCCDmL57GpU^K>dNMh2R_;vSp z@9mrJzF%6Od)svS>!@)`%=0BdO^k}I2AoA9#sQ53iUXh^pv+ShHB!_0`nT5ppZ%Ug zAq7??8qW49&*7YX_I~&KuK$|Xdh?>(@u@Q~e*E~N?%lgjh@xm{US8e_`T6;y3kvc_ zM^RpsmzVr;k%EH!_%mLkC@(KRilUT#mLKIsE%BZ5^ZC3bYH5ig-nXc%;PpyceR84bp z%O6vz)aJs%mK9Gwz4VJ1S>q<$EoL{u(o; zOV>33YePdrR9|0bgw1FC6#x_?ZvWG@i;4il8~qrG|5L0YcXhAQP?+ z7l*Uw8S#by;oQc?1|vSe$hBNLxP(dww7~Ak*nAv~QA0zcT@S+4b!%(uY}{P4smY(i z83Pig#a`3=!sd*BC!~;{m&e(`=gcqP`#k6IKF^;WAa(9s5_Rw1-R95F)AayjestoA zW1@H8eK*>%V~354@#p2`tx2V#-{j{<8|v#D?tcCC*E6}#=LAuoD}cJO2kn-{#QF(b!1B#>w3(TTxfmuih86pb_nsc~jC^;ZPB$5-e6AqvG^-zoW z10*d*$o!sb!o4*$DqsR2fWxIyz5O9U9N2Jk2Z$t-<|v^* z5p*_C92ESH=adQuc$jdQ2+!K7Q*qR#OIKSL#wpcPU=pxkELgHkh01O1`DiZ1d#N}#|e#g56NX|t$uc)Xv>e{udalmXf3*v>K zAuji`{pOo*M7wtF(tQ2mzWeU~=AR2VZ3f6U zzj@`N&{O+87tt3-KvvRUweyRrBzynw=DLu{@~0}2O}xIWJ{qg1)TJ~4nM5~rCC+qZAGMSB1J_oGdlHbv8>O*78; zt!us&>;H{u^+f7ILLe?x#N9+t4jebm1r|4?6JuJ&DTMBT;T4dSM4d}YqE02Kat;mw z2z4y{L*k%b@EZZgKp7jj0;22)0W<_nNbFAZuDfS5AHEBTTSP5x-2w-XiCs1c>K1AZ zb_wrmYHCdFh5QuFENU(Ten6_moAO&yYD`p>B`3* zd+e^ZT=#$gnKf(HqV3zZeWg#|zR@?o`ORp;gb7ivUcGE`GKukkm&%d=&H+&~P^U1e zu{-wc*%KXi+;KLcH{En&da_;pZ~~Fqf+3rj=gH$HLQLRE0K_5!80Y$o+4X6uTYL_P z66xa}9{tHKK;^+M5U4`wl+E=8js%E_Di+!&dNu(j8K(o?RT(EffkFh%YskqpSMn<9 zRRGhy#AVUv4m!G-nPohJ<;aPn{164 zhoqzC3`fbCXPz027%?(B^2m`>1Zo)(zd+c%1oH=u%Zr!?N!~l2*5l;B(K7Lm- zv>@^VCHiVZ^vNfmm{*Ed9tMuGcW-_4@y8!${8rbHxR-xFR=hIo3+KKvJTq;N>`C!O zkn1x6kAo#~bD~Z;k-IU@cgb%ZY~cbq_i{qs@mms+&>~MNg7+p<{yYHg5bRTD0iV=$K=U zNynAetXcD=`|rR1txp5VegQIb=8T0+P0i<`cUD$Z+S)TwxJDsh^y^Ru&NhCXP~s&I z{QLfSI&ftt_~g3b$>bx30TKk1ty60v8XFqTE)k*We&S9dw$N4)XB1&(6LTg|+)Kma z;KuCQwOdqL+Bxdn+19xhax@F2f9h7xi=%~i<3#q~8-NiV5}?qqPu;e?e01!Z)H zAkjGv3g_&ST2diH2ZrtwN&vlgBRVo8+Fi{u+T{RoZy$3IJ{!*jlS5iyXv6q;H5IGL zr5y7rrb=vwd+2kdvgS6Nzr_Ah0M=(M)~?g8>yQq8e9pXgY~K-;buWuXjXK)YN7Q+) zUshJOZvOnchVKs~tpennbEZGCYuE1c(5u2k9uEj3+kBr$36F4dFrn|i_g>mXC@z|51S$xoM-yO^Kvi0T1ko`q zMB;7HnDslK7DbL_ZRZpM6wrw*{*(aZT936Gk zC<7?R4}S22R)xhrAD(yKxj+2)<4?Y?1>ypzR^7YzFjWKYIcU(}*iSF+>z4^#l>Tob zrf!Fb3y6ctHsQfQ_0}z0qQasgi-SOHOwc>;tVl1W768M%$pU0bqeygjsUz|NB^)}7 zH=y#R^Oh3*KjfI%#2KcgplX$rpl)@JI^nE{(@aD-N?j2Fq{p6i%O=6OFvgQD$wa6j zv4`N`bN9@-ZIn&8d>$fgRPI|Pfak!Fi=`b?-^DW1eRtOxe&OE0}>S^@U$m%cRC zvM87j#vDb_cYgT8AKsZQMQo*z8u|Ho+ge&uB^WcHZtvcP2)7}uu3z82(a0l@Gy@L8 z;D%Z}8*EH)k|Hbw6QEaag8R{>1;Ms_yEdP>w5W^Td+$9%`taeyY_S>myYIYX=cE_2 zC1rMpa*()In5dULT$mam9uP)`BTMDL*73t5^*k#~AkocTg2Nz&4jB@sU$_fa#K$Bf zEks~)OgK^HnfJ%;fDIAr>kt>r1GlO?MIr_9iPslTO@BMKv|GW^b@Yn>TNX-h1y|lPWMaY@)t>`=DM$yLat2m;TV9LrL^} z_4eC;Iw_uizwGI!PhL`6TQ?QL@7}#E>esKofrR)3#KYh*%)4|cH4hFCz)j>w7jcC8 zwSNbfN7TW&lw#q2cZkEkCrH&4RaRD*dUeDRgUyS<=c`t&Oegq>OQnr;^WS60JAo%@ z5dlnM;Ueyn9k2?ys1^k-2~ZO*>N9`D5l0w!GL8Po40i&Ht*JvH=Vgwtv+xk{p64JK zsu)YQTBGO99)}yHNo+>|5jWO7k;+^X;*bQBi#XfGn=L&O@1G=H;-zd&QiT#kMmqK* z(gPZ*sMu{eac&1WQ)HZq9i4R2glN>LQN}2FUKoy~V+fGYA)sr7j9Slyx6E_Y$op!s z>p{P)_lF;T5Up9W#^xSoPu#_G`*xW*0Z6)aD_isZ?|=VDyEp$k`Q%9{<;HmO8R`Rp zuObTy;<*AGcyJhya+gqpR<3;CI7GwVhIGmU*CGn56ayv5!H)AR!tK&UL;CIQpso!uO~2MI|TS001>fqec2w0n}kjezqhCI z=*R}V)VEO03W-?KM*xB0AwAp%*&Qb-x{AfQl17Yu^yo2`W&&X=`@lVzNr)gF&?IZw zRibo$nHX^5h-fy|cfh~_M!%wI?u8BV`s=UTcsz~AnHAnG40&g!Ez!UH%XQ9+zWUXR zZ~E}VHGd~D3bl1E?QAg*K*0~XcIj$)Mj~LM%nXvKHw&?D-A6VViO!$s*dk!%0cB1+ zF2XR8F3(f~Ws?%1(j;jC(Aky6>aJi(kTl){Vhca>m_s<-i^ zej~L&0B7#pPH8s1TmiYz!4WbM0Y~GP=SbXJE@;NZcQrNDre5sXQyG<(c1f#n9=mEz zr^ahu1rp6(+U*i#NQd@Lk}{(lG>^H25(Gj=YQU|b3sfwX4M-~bym~HN&z?P_;loE* zl45gn%LjFJb?-(|RM_0y+{ATDN;-||(xuB$drfqty69dWi*ukW9wxQl=gHRtCjhE@ z5gF0(eE|i(2h4ttl5~aw(yCLZ;$QyrKmV_9=7GZ$Jfq)O~!UVi=c*N@FR`|Pt)9+2~i=K%%{92AW@`sk=fkM1T8K{*qRIz`@; zj3J~*US3}BhaY};=VyH={rp;1D2kfqQBR3`GPlX##hbqzl!X zFr_?EO3u<`Il;_6#M=I21LL4&At20>NphInloqie_OkD-G5k0J>J786%8FS zG@3ARqS@HY9Y#5MVypxIhQ_g-s;a7)$K^lz(T~QWVx{0V66>Tg_wCo$5(deK;o_)0 zGH~4bcX5u6`HNrtqFo(FMB4G93equ z8_Of@T0uUg!(J%~;06sE7~ONvZ`zfPzWwcQUbO7xR~L9yrZawQF)~9) zhUA$r%9%6NEanxBg@40T>g(&5|MKwMOvDjb*WFtp@~}`x-HVl^yGuw4uAuZLL`73E~y-_P|XT$wb1Ym9Rk^bLOBJr zX8Qw(Y!IJsk6AE&0c7yt!JF^7=hp)dMN;hVH{bZiH?DZ?wLi{JG$UNz-J+>e&y0HZ zEH}C#IkLLC#?(;(g!eml?f^8)Z@&2_ESC^xBP|tn?ZJ_nk|{@+v=%p*XQP!F{@_mFdM22bCvF6RomQ8O_{Ngdq^P zdgUO|XYM8OIEPd%<}Fm61P~E8+)6%r-Cxfruw!UudzBIc-5V*e*jx*BhU*=7?6K(# zTh7HZB(Ii$lN~4wC5ZqMzKWpb!IG^O+DDT1&;`2v)~#-&lWOA4FJge0$1tI*!Gi~{ zx$CaGE$+}>$5mHdb;TQRyfI(%2rywJNDw3mv;uvjP5}xI>=Up6v#GAGUVhtcw~fu4 zI%P_#rnWXcF1Qc|9RR^S#w1DC1|Z}}A<_W|(&XlwZ|)EY^4;%#chu_Dt5zk^*GzyY z)dXOKoHfzg6Qk1?I!P@LIl4SqQWd0c3m}QUj9W5Mp_HsB6$!#oo|Zs^r$kw`x{r)> zsat@EU}I*Qg!__0Ls^_$L@UFYbGRm6E8M9kope$V0c7av)vMOwv1*Cym^Fc_6X!e65J}ql zgi+wuJX%RSB{OMH*B0UFw^C(P90f=O4qS+dibd6-CohIxED^TUI#eL;!Sw+-@0nkD zcS4&(1fD#TePT>Y#IAaI)&_<~z%7(UdJdc`k`g?VK%#MlDwf|R?fpncwH5pfrHIC8 z^GcaQGw$nJlN#>+-yT)$u88XD>oa0rj6t!9!Gj04J3ubI^wKNdd+*)(>P;pILbWQA zgaZj8yN%};Kq#)Nsi|3h`|Y=n&6_q2fYhWThXa5+(l$)}ki_Dek|2y1W`r9OyC4L!-nVX`Cl!&>`BAOlf|DjqO!v^r&K}_0 z_3PK$Gca#}GPE_anTY@sR$a<44_&B?u~3j~?k@B{qnuSktCW zOTpE|U3d?Y@M0lBm=p!aaNF@c5q4ApCZeMN^1bhUZ{W(6?{9?5N(WbJvRd4b(jt{e zoH}!oL$J8oBDXHrRBePn;{fplJY^#9&j!f`h=8KcMMR;R#5KuDlCy!iRD?d$y_@+I zVI7FhV_eefQDu-Ec!QL@8QxdF0Z1x)g-G#IhH6&mk%|ezg2!S`k|1FkO=yFNdBFrw zu>gqYV!4Wi#3vJ5Yob5tt@ z{3J;d36iu3k^~VU2p}w&#^u(M+gnc9i3%AS&C2IuO#sTNr=FVrjliMv!?YPX$KbN9 z-@Dh`zDh?CgUlvUF`h7X;Q%29qmtt!lFqoG5x{6RNGw72*6%g9x@=0%4EK4=%gdkk z)KgC_X-|O6m@(su&6_vRcjf}kG+W$b+L_Z#a`6lq5+qi!m`j4-0OZa)?<7!ow%H(D zNF52wx^;_=Iri9S(4av!fs!B+ND?<`qYRi>ARDw+~9dnFJ;G1&I1| zB@HE{^6^|=oU}FCwvAk@-5HtPVnocPd)4x$KJ&~ozi&@~oORY&SM1!m(~NYLTOct} zv6Kcx9E9L%EgDn+kag?UkqNx~jyrxjHt(Esrl30+hURV+>UzKM!*NhSdCbF#fy zp^D}1ZkHHofCRA+1rHTCRCT1J0{4P=WRvh->Gk5^dXCTz3DqjjQyc@Ef_XXZwA0d& zf7wv!Cy)C9h%xZFnqj~g0f>Pr&UFik)W>3MCZlL7t!j}16ITc7nIzq_RV=B4tfd1o zib`?*bcUN3wmU$kPMvy1MMZ@JB#-b#qjgF_#Zr=_0);Rd)*a)WaenZ@2QZuEcieHu z*u0rDXQn`rbB&g$qN36OaqO|jL`NJkB&|9C5asye=7mrQ(>FFYmfU*lt+4raKh8R9 zT1tgJI1AKWkk7n*XJUh-UA;kRZMHok{ah|r2v#);k}`=6;>A?v|EJGYV5BGD04NTa zbcEg122WI!y2f=BcOW?EbM4YZ6`LW~P7LM*v`Quwppo9F0;imEiW&JFq3gFbfbd(M zhxPW1UvGYms&OC{%OrS4BWrKU7djF`3E}|RZ0YW#Z=eZyD^$Eb_d8A zXPj}xo;`c!OB;Y@1`OyQO_?$^ZkgK2q;BZN0w6FgDp`w*i$M3(n(PEYLGWxjT$abtLO>sI#NAN=44ceFb?qA2?Em(NbgTg8Kt@&cjI z?T=y@R4lJA@x_u#<%{hjYRyxldS%z+-IJv_Kqx^(bfNdg!QsI`fFV6P6CmCMI|PV> zGBMJ*9~lhX4~7#;5Iu)uJt^vd>%CCtE+BnjXt^A}Y* zF}C;h0%jZO+3D^YW44MVBOQRKA2EP56)R>sctnef3#LBv%&~**W&i*n07*naRFZa8 zu}(Yfv@2?BYtn9B?mKYc0PC+Hvw{B1FbidpK;zg?ue`DhhsT3A-+arwyfe-?{iepo z#=nEeSTvU=`O(M`BP?N2&BEYPpbew2OKGX;-H7OJ-MZa!{q@)XZASnE6-&CZvNFBK z-OE)~(wjte_a9LYy)~|Gcu-4*x(HNtF`-%`&Z&&vFj+B-o`(sHGSWpn;+)FG;`16R z3av4l8|gaSi{?pviK-Q)I};M~fWS{a`Q&u;-o0iXyi=S-Qc3ESDhf#_f+*nfFhl@G zC0%QW#-DA2h-oAa0cT1w(z!Ox;v_*>M=Rq_=fBZwjcnsmUfW%QOr1LQZ!0S+Z`SyE z=D~xHh)zHKbYnW+XQ8{94XlY`L(upi{_uzB>8GD|<#P7y**ERjvE%PlU4`0272gp< zhFBrJQmMHh;KBIvMq(uqwo7Sg>HO=jzy7L@0Lb*|Urwoxz*L>MpOUFqu~$T&r&X+Y zAR>-rTuCHdDi(_=Z;%KvI}YNig%cigB!=OR3nWOAZW4AL4D*(BKVH?XgE=OHL7CFo z5=0IIAHP@EaiCg#^wCE~(CE}u&H=KJt7p4j-KCwxAW-d?!|LiPBVdS^_BT9Vw(Y|` zHMhKGN7D73905F|BIyD$bfYwTn440Blx9;@RNU?WnKf(Hzi-*H<$q}W+<*A+;pXk* z030$K#IyiC0^sGBUj`%&kiYt?zv}hgd++XGp|t=^7{(jo8{aTLL=9kKxd6JGdqnm` zB_+l4Z@A&#Iszbh=S-j8LfwZ41d}EKjE_H5EZ^Wo9mv%Nb6+*V7v4c4RmF{6?|kS4 z3fK02P44DR^K^TUN(IN`RgMd}yrp6Z#LN$Krr3>pvIwp=WW+&agR~Y0$=2@~6Y~#9 zP=S@+0-=R5iUe#)qd9$sN{Qsx#yigRc9`RZy8CR^Okk7hX~2)wBYhTn%R(a^58L)_ z+oFm};vh)_Y}rD^MaAZFEi5dYx@1ZFs#q6XaDK(Qb?dup4S8OQ0BI1x7@=X-4u&6h zHL+*Mu6z6Kx1$$dd@(7am^g7l3jLl322HLyb&ZZc{)A}QFt1-hYG7n-+O*lw$AWNP zLqo&wZn@=_xg8-v@UVpyVp^xGY3z#0@NbwD_l5g0R^@`p4%v4d zlB{5U&wS#2ggG!)#)Dgv&#*a_U>ROVKuGKycVA~4>0EywfCPa;>s8Q5;Mb)hDwf+I z?W6$eo27JmEfw|9uE_sd`Ya!U2*W~8$zO&kFy zB5fI}NRTXmm}pG*wX9bXWtu(wqU#G=w8h)P2|yteK$?kp$e`wXh*(*?ZqvAp z1|fv@4N`>YF&q^sqI>HcT|0DEgc3a*ubvCt9tncPBXl5}(VZf`)0UhaB_*BPRmGY& zZ{CzOYt}3c?LTPt^wZBUU~qq4VNlp$q6?VMtFOKi9dpdFSKe~VE!O?rR^t5g&->l_ z^&93u01ycV76+*&6DLkgr@Qk&q%bqtxWwQ>h^YTs;OlO<;fCwmTZ$k-yo*UvyyW_{ zN76korv39!vpnkT#ItX=lTc4awUUu8fOsXI$Q^d&*pl6D2irI%cC&*~3W zf87D%+uK3QlP8~^z9*93f`oA*dJ1_(g5Mjm@#8g5ItOmSO^PBdhn!4C))xt zIe4;AtGEz1V3NJPOzOIuZ@#770WxF8Ij&+gG}_i0ypl=pb-lcp7(TV7u#+?f3Fb8elVpsvdeV^Xp^w-|JYt zdUZNYJzIt2eoBnw9#W0?JaqeJCrwJN;x*f_msAK1?@(H1s#u>RmymHsaST_wmOV&+E80ptJ( z=O)uGO8PrVDoBEaV+hBl_hAOHoB^2`1r)}AWXHP>8I`o#c6z zf$8k|^{;>3Jw1<-Pz!%tD=A zLW4uyY{>jQA)vqyq3 zk$^;YNLg9g2|xPLkLYLAZpVxnGg5dWBnCaVDdk-p*{LYP5cOT2w3oOzhjYWsp{Tr8 zu3b3*LNAjDxivKlB2-O?7={2sz|c1Wb-*OvAWy51?_c*45G6GP2zjh@e-Wr`7d@X+ zSv025P7pu@x{!D?BxevC38hEKBy@jWKan7KlBz$9M84pz(yww&7i)X@_w_ADap=nuVQ$&w6*Q^r3|Jn_Vo7GC>| zv*7rSmHG})u=X)<0FUjwf@=_H&L;|NP74iNhlRe z(Yh%qnDUL0G$z>~Wo2EaKJi5RWb0}nj#)sS*B05Wghy!%$ITJ=>>2H~JOaWVYkq*U`>-45Xn#04NyJX!hq`Tz5_ z+iv^!_67*uOL$0eL8Y3IqXoB5B!~wK#bM=Q4T(_%$*Wf-#*!$GH1k^pv4W0}rWyed zaXdA#2vbgcV^7}}K`Kwk{UJ^nsQB5n31+r?*T-wWjGx7cQ$#FDqgT9Ew1y>_GCb64 zR~|V@SVho%TR7Pv2^qAeVr7Fe1P7huWev;DarY^1UJ9lFh;LXU#^m>)nYSl-cJ11A z>Jv{q(Jr}Ir=511Id(L!+-vgW$rjIpj*uqM4km=uPlN$`7Y-cQckbPH-FyAL`-rJL>uotKa?62yQmtw5%m5@&3JMB}fBy5IyIY_gj@h$kr9d|^ z4~V9)pwQ~mDZ_2F?Y!Iu@$}__^cDspp3KEgQcaY&C%stQR3096Hpy<>rsz56DT~*n z25BdyH20483<sgb62E1}z*B z!iR`hcoO3%I8kP=cRlom4$2NKD=Rzg#v5;ZsU5IkmjECvsOlf!TuiQS;@NCX0w4gn zHAN`mc)W({gBCFah|=lRanU&sY2hBBcW;k3NQQAJSQttX0Vk0l#p#{2JjczO#PKZD zVxWF7mPwN)rBhKt2@%==Qn9kX=iiKtARNTVT3Ee|ZMe#~TWk%LODB&Jk_6wsoCIMs zTmWlr{mhF+URoR{3Z;k`lI#l@S^^Lx2wp5NPcU%O8_SwD(5e{Vay8vYN>{%ae z+qP|(@AcvVQQ}M!CQP(>A=t}2pz$ys4qn->u%cqukDq$#ng5>s?E3)Zf(tIVVdct| z|ERiiQlcRiTx4JR(wB@-P{CAIseoZ6TNR{I(VchR*=|wwuY6^8O8PPn$Re?bnrxFQ zg$|IAo3*yU0*8!bsaQ&R54U5Jc!szjaJfaXxp;Qzx3bqHIkbN|zvsHN{3Poc?unWK zI9N1P(_@Y~)`pqQwL_IKbfF6LO3!CZ=-NDoXF#~O28k4I>cjW!hryiTVM8SY==@&H zLH&C}W+JsNw1IdZ1_|Z*4IK>fVr5H^1^^P57I=WyJz=P+-Mjagx@gg&&#YoioH)@6 ztd*(2Jx)3K?t^EZSv;yW#@Z?|Pna;_hcz`d-B#|I2B0;85|Mp5aFWn>! zBwK>CW`l@8loApe>7nZ}DN^#d1%x2Z%fFSr zuNMuTm+a6ityi3XELV^kDI$j(VYp>;vg71 zcATkuetq9FuyyA|{8VvmI?t*u@B#CMyXid(GVhWgVVEVgJO?;57zfj)Q3NV4RZSFr~kaZzW!UTUSXp)SiKAqgu@$CVhHN-5*|tZvnxi~4bY-|73`)tF0!dh# z5&k~p?4i^ZbKtp&AY)5%AVDA|4yCPRgCrX$E@2!~o|x(CFYAUnvvsTQB5T>#vEHxW zxCAL=7lEk{Km70^8R_5o&UXgA{`%{m$Q#FeF)!F21h=^t(vi=hO%9$L&@Nj>=I%?M zYBPW8mlGyTsIRT9?UYP3S);{vb6Uq+JN?qqXzR9ZMvT}c+!*mXWXOO?|N5{0{_1A| z$@%BcwVqva>#7TfCmec^iwX9uR`+BH(1J(Ulv$#c>{|ALWM0 z-7LZlgNzCIoPZ^TLk}MBSFCv3=9qE@isVA|F?(ELm&YXMD**`iP_$kRtat6)X^rZ% z!&K-6WbXR)>OFPAAp(T%B{XO7a$(<6V&uppt%*1H0UQ7ku=-kikQmo4&vKxRdp;E) zS6+GLzrXtGtN$b6O3sl{u>c95qz*Rs`97<{u z#0=-iwnM@ck3_X``$KgY9z}PM$Z$-LHC8c<)5SWF<^b-*`9~dfq)j$N%fDFw#>HH) zDE#&4-rZza=pj@8DXu4wgj_%5*eYz|nshOt1UhlEdSpLLXXm@n_R_Ow&jHs{ml4K5 z6j>^n?vV`=0a*adl+EFNq)CCI`9Fhbf za?YCa?5rnif66JRnlxmLFchShVo#jQc;0y9jcDo8r3du59`J;dPd>S}y1J@!*n$Ss zlfWo+@}P)naRxWms{zuq8*jYvkXuS3K@_Z1aTB0Wz)6b=*H&#rn3E;KkjfAOMCw(N z8zc#mKsq!~rAlESmvt*M!-4c0H9A1&h8UO=Cbhh0xn&wq1A=NH!VT57Z1p8nw~WxJ zQ=v_0eZARsqmDW%-6)UeRGcQX3p6L8x~L~g925-5H3KLuZV>S;5|Ax(RCJw2r?5+bRBO2Ib5h4 z7|g%=)vwxgkJbiy@x}8hD=RC@ToodzP>tR^ny!|l3Kq)Un^v=8-B_L?iGQh9eob!y zfuiF5?ggL%S#hZ?@gRzxAv<3**FX z%KhXyg1C_0+4cBZr)=9sbHJ-qAW2hVBd8`kKZd$03bR2b>Cu{$3PC7In(R}!BOTmT zQJ8Exo~Li$eq$CaSg_(i#G3v6m@%VMFh;IH_6Kt^al!-(3`)IHS*?HzBmeNj52B$% zhqWm!s!hZ@Yu2ofH*DB2IGi8`fE4lKcdueo8a%oko)H$cxVZR&yYIgH;e&m6&cEc6 zd6)0px%+O2Se`4@G@D@^_vUpkll#;m7}Y9hfkO|D5){LR4Srs@TBGibh4EW7A-;5jRHQScSJfn`*BvJNShJcZsmnlK;V$p2eRUyV8N#Cto zx5}rUdfGQ~KZt{#(x~z);$$BV^9s4Dl4^%7efnn~Boo0*Gz4g{xQKwFYUw`ny zhkw(S+qDTGS6y}05zCh^-{6L^KOBn&amb@3S0jFUqL!#w+EB7ruU=h#{_~$F+gP<_ zWbrw(X3ex{x^KCr{XD$>oAFqtEncKT+=kwLU7}k=kv7iLRfI?+pR_Q=#Bb@~a8*d} zeVR-yC@8cTfO>HI4o4FZUlra5(oaW?T=8^GPxBS=po@T2LKM@=lPUl zC7UEu%2#g^1plJkw<=V5F`;@d+oJXKlj|TzhDlOR)RV;e*AdTY?vQh@ywah zO1L-Px-DC_)Gb=HXuolf>~XXSApGd8v!;G~$Bx}U6X7Ve{P^RKGmi}m1xI627!>az z9CW@;ojR?ZKY#wngP8=Kd%*>BZ>g%PzEv`8ib+Z(_DC}QX{U4?6p@6} z9)$cGiKY7sAoAQfu=ceTLV$#-rko#05hRGKZh6rOCyd@_nS8w21!$SQ$Ml?3M+hU$rS!7<%XP$Yc%`~WijT<+%qPe-HyOJ`IqDVesAIv)-;Xcrz=i0ej7e+8- z$dJ*$_{A^YX)7%r)Zk8^JULalXHPn?rG4fo$;CJoH3uGrNM*&>pB0!ES(B5RoOoa-$>+ zilM%-2RShgZ`bOF$3Ey1USJK%IJmE?J4tX*=Z7Aq@G~ESFAEE-c1!$Q<;B_pPPO=n zyVV1b*=n1vF9L;V)f_RMWv(vt~ZHe*K0Eah9lNhIAVmGOz|{HOvbPOQpq(g>?2kdn%Vc z@x+s79t8QtRXJ_^#n-;}wOOlHt$fTyb<&cuN008�eAA!8#@guM6r9Y8KlRRPL$V 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 literal 0 HcmV?d00001 diff --git a/cmake/CMakeRC.cmake b/cmake/CMakeRC.cmake new file mode 100644 index 000000000..cea12fba7 --- /dev/null +++ b/cmake/CMakeRC.cmake @@ -0,0 +1,666 @@ +# MIT License +# +# Copyright (c) 2017 vector-of-bool +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# This block is executed when generating an intermediate resource file, not when +# running in CMake configure mode +if(_CMRC_GENERATE_MODE) + # Read in the digits + file(READ "${INPUT_FILE}" bytes HEX) + # Format each pair into a character literal. Heuristics seem to favor doing + # the conversion in groups of five for fastest conversion + string(REGEX REPLACE "(..)(..)(..)(..)(..)" "'\\\\x\\1','\\\\x\\2','\\\\x\\3','\\\\x\\4','\\\\x\\5'," chars "${bytes}") + # Since we did this in groups, we have some leftovers to clean up + string(LENGTH "${bytes}" n_bytes2) + math(EXPR n_bytes "${n_bytes2} / 2") + math(EXPR remainder "${n_bytes} % 5") # <-- '5' is the grouping count from above + set(cleanup_re "$") + set(cleanup_sub ) + while(remainder) + set(cleanup_re "(..)${cleanup_re}") + set(cleanup_sub "'\\\\x\\${remainder}',${cleanup_sub}") + math(EXPR remainder "${remainder} - 1") + endwhile() + if(NOT cleanup_re STREQUAL "$") + string(REGEX REPLACE "${cleanup_re}" "${cleanup_sub}" chars "${chars}") + endif() + string(CONFIGURE [[ + namespace { const char file_array[] = { @chars@ 0 }; } + namespace cmrc { namespace @NAMESPACE@ { namespace res_chars { + extern const char* const @SYMBOL@_begin = file_array; + extern const char* const @SYMBOL@_end = file_array + @n_bytes@; + }}} + ]] code) + file(WRITE "${OUTPUT_FILE}" "${code}") + # Exit from the script. Nothing else needs to be processed + return() +endif() + +set(_version 2.0.0) + +cmake_minimum_required(VERSION 3.12) +include(CMakeParseArguments) + +if(COMMAND cmrc_add_resource_library) + if(NOT DEFINED _CMRC_VERSION OR NOT (_version STREQUAL _CMRC_VERSION)) + message(WARNING "More than one CMakeRC version has been included in this project.") + endif() + # CMakeRC has already been included! Don't do anything + return() +endif() + +set(_CMRC_VERSION "${_version}" CACHE INTERNAL "CMakeRC version. Used for checking for conflicts") + +set(_CMRC_SCRIPT "${CMAKE_CURRENT_LIST_FILE}" CACHE INTERNAL "Path to CMakeRC script") + +function(_cmrc_normalize_path var) + set(path "${${var}}") + file(TO_CMAKE_PATH "${path}" path) + while(path MATCHES "//") + string(REPLACE "//" "/" path "${path}") + endwhile() + string(REGEX REPLACE "/+$" "" path "${path}") + set("${var}" "${path}" PARENT_SCOPE) +endfunction() + +get_filename_component(_inc_dir "${CMAKE_BINARY_DIR}/_cmrc/include" ABSOLUTE) +set(CMRC_INCLUDE_DIR "${_inc_dir}" CACHE INTERNAL "Directory for CMakeRC include files") +# Let's generate the primary include file +file(MAKE_DIRECTORY "${CMRC_INCLUDE_DIR}/cmrc") +set(hpp_content [==[ +#ifndef CMRC_CMRC_HPP_INCLUDED +#define CMRC_CMRC_HPP_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !(defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) || defined(CMRC_NO_EXCEPTIONS)) +#define CMRC_NO_EXCEPTIONS 1 +#endif + +namespace cmrc { namespace detail { struct dummy; } } + +#define CMRC_DECLARE(libid) \ + namespace cmrc { namespace detail { \ + struct dummy; \ + static_assert(std::is_same::value, "CMRC_DECLARE() must only appear at the global namespace"); \ + } } \ + namespace cmrc { namespace libid { \ + cmrc::embedded_filesystem get_filesystem(); \ + } } static_assert(true, "") + +namespace cmrc { + +class file { + const char* _begin = nullptr; + const char* _end = nullptr; + +public: + using iterator = const char*; + using const_iterator = iterator; + iterator begin() const noexcept { return _begin; } + iterator cbegin() const noexcept { return _begin; } + iterator end() const noexcept { return _end; } + iterator cend() const noexcept { return _end; } + std::size_t size() const { return static_cast(std::distance(begin(), end())); } + + file() = default; + file(iterator beg, iterator end) noexcept : _begin(beg), _end(end) {} +}; + +class directory_entry; + +namespace detail { + +class directory; +class file_data; + +class file_or_directory { + union _data_t { + class file_data* file_data; + class directory* directory; + } _data; + bool _is_file = true; + +public: + explicit file_or_directory(file_data& f) { + _data.file_data = &f; + } + explicit file_or_directory(directory& d) { + _data.directory = &d; + _is_file = false; + } + bool is_file() const noexcept { + return _is_file; + } + bool is_directory() const noexcept { + return !is_file(); + } + const directory& as_directory() const noexcept { + assert(!is_file()); + return *_data.directory; + } + const file_data& as_file() const noexcept { + assert(is_file()); + return *_data.file_data; + } +}; + +class file_data { +public: + const char* begin_ptr; + const char* end_ptr; + file_data(const file_data&) = delete; + file_data(const char* b, const char* e) : begin_ptr(b), end_ptr(e) {} +}; + +inline std::pair split_path(const std::string& path) { + auto first_sep = path.find("/"); + if (first_sep == path.npos) { + return std::make_pair(path, ""); + } else { + return std::make_pair(path.substr(0, first_sep), path.substr(first_sep + 1)); + } +} + +struct created_subdirectory { + class directory& directory; + class file_or_directory& index_entry; +}; + +class directory { + std::list _files; + std::list _dirs; + std::map _index; + + using base_iterator = std::map::const_iterator; + +public: + + directory() = default; + directory(const directory&) = delete; + + created_subdirectory add_subdir(std::string name) & { + _dirs.emplace_back(); + auto& back = _dirs.back(); + auto& fod = _index.emplace(name, file_or_directory{back}).first->second; + return created_subdirectory{back, fod}; + } + + file_or_directory* add_file(std::string name, const char* begin, const char* end) & { + assert(_index.find(name) == _index.end()); + _files.emplace_back(begin, end); + return &_index.emplace(name, file_or_directory{_files.back()}).first->second; + } + + const file_or_directory* get(const std::string& path) const { + auto pair = split_path(path); + auto child = _index.find(pair.first); + if (child == _index.end()) { + return nullptr; + } + auto& entry = child->second; + if (pair.second.empty()) { + // We're at the end of the path + return &entry; + } + + if (entry.is_file()) { + // We can't traverse into a file. Stop. + return nullptr; + } + // Keep going down + return entry.as_directory().get(pair.second); + } + + class iterator { + base_iterator _base_iter; + base_iterator _end_iter; + public: + using value_type = directory_entry; + using difference_type = std::ptrdiff_t; + using pointer = const value_type*; + using reference = const value_type&; + using iterator_category = std::input_iterator_tag; + + iterator() = default; + explicit iterator(base_iterator iter, base_iterator end) : _base_iter(iter), _end_iter(end) {} + + iterator begin() const noexcept { + return *this; + } + + iterator end() const noexcept { + return iterator(_end_iter, _end_iter); + } + + inline value_type operator*() const noexcept; + + bool operator==(const iterator& rhs) const noexcept { + return _base_iter == rhs._base_iter; + } + + bool operator!=(const iterator& rhs) const noexcept { + return !(*this == rhs); + } + + iterator& operator++() noexcept { + ++_base_iter; + return *this; + } + + iterator operator++(int) noexcept { + auto cp = *this; + ++_base_iter; + return cp; + } + }; + + using const_iterator = iterator; + + iterator begin() const noexcept { + return iterator(_index.begin(), _index.end()); + } + + iterator end() const noexcept { + return iterator(); + } +}; + +inline std::string normalize_path(std::string path) { + while (path.find("/") == 0) { + path.erase(path.begin()); + } + while (!path.empty() && (path.rfind("/") == path.size() - 1)) { + path.pop_back(); + } + auto off = path.npos; + while ((off = path.find("//")) != path.npos) { + path.erase(path.begin() + static_cast(off)); + } + return path; +} + +using index_type = std::map; + +} // detail + +class directory_entry { + std::string _fname; + const detail::file_or_directory* _item; + +public: + directory_entry() = delete; + explicit directory_entry(std::string filename, const detail::file_or_directory& item) + : _fname(filename) + , _item(&item) + {} + + const std::string& filename() const & { + return _fname; + } + std::string filename() const && { + return std::move(_fname); + } + + bool is_file() const { + return _item->is_file(); + } + + bool is_directory() const { + return _item->is_directory(); + } +}; + +directory_entry detail::directory::iterator::operator*() const noexcept { + assert(begin() != end()); + return directory_entry(_base_iter->first, _base_iter->second); +} + +using directory_iterator = detail::directory::iterator; + +class embedded_filesystem { + // Never-null: + const cmrc::detail::index_type* _index; + const detail::file_or_directory* _get(std::string path) const { + path = detail::normalize_path(path); + auto found = _index->find(path); + if (found == _index->end()) { + return nullptr; + } else { + return found->second; + } + } + +public: + explicit embedded_filesystem(const detail::index_type& index) + : _index(&index) + {} + + file open(const std::string& path) const { + auto entry_ptr = _get(path); + if (!entry_ptr || !entry_ptr->is_file()) { +#ifdef CMRC_NO_EXCEPTIONS + fprintf(stderr, "Error no such file or directory: %s\n", path.c_str()); + abort(); +#else + throw std::system_error(make_error_code(std::errc::no_such_file_or_directory), path); +#endif + } + auto& dat = entry_ptr->as_file(); + return file{dat.begin_ptr, dat.end_ptr}; + } + + bool is_file(const std::string& path) const noexcept { + auto entry_ptr = _get(path); + return entry_ptr && entry_ptr->is_file(); + } + + bool is_directory(const std::string& path) const noexcept { + auto entry_ptr = _get(path); + return entry_ptr && entry_ptr->is_directory(); + } + + bool exists(const std::string& path) const noexcept { + return !!_get(path); + } + + directory_iterator iterate_directory(const std::string& path) const { + auto entry_ptr = _get(path); + if (!entry_ptr) { +#ifdef CMRC_NO_EXCEPTIONS + fprintf(stderr, "Error no such file or directory: %s\n", path.c_str()); + abort(); +#else + throw std::system_error(make_error_code(std::errc::no_such_file_or_directory), path); +#endif + } + if (!entry_ptr->is_directory()) { +#ifdef CMRC_NO_EXCEPTIONS + fprintf(stderr, "Error not a directory: %s\n", path.c_str()); + abort(); +#else + throw std::system_error(make_error_code(std::errc::not_a_directory), path); +#endif + } + return entry_ptr->as_directory().begin(); + } +}; + +} + +#endif // CMRC_CMRC_HPP_INCLUDED +]==]) + +set(cmrc_hpp "${CMRC_INCLUDE_DIR}/cmrc/cmrc.hpp" CACHE INTERNAL "") +set(_generate 1) +if(EXISTS "${cmrc_hpp}") + file(READ "${cmrc_hpp}" _current) + if(_current STREQUAL hpp_content) + set(_generate 0) + endif() +endif() +file(GENERATE OUTPUT "${cmrc_hpp}" CONTENT "${hpp_content}" CONDITION ${_generate}) + +add_library(cmrc-base INTERFACE) +target_include_directories(cmrc-base INTERFACE $) +# Signal a basic C++11 feature to require C++11. +target_compile_features(cmrc-base INTERFACE cxx_nullptr) +set_property(TARGET cmrc-base PROPERTY INTERFACE_CXX_EXTENSIONS OFF) +add_library(cmrc::base ALIAS cmrc-base) + +function(cmrc_add_resource_library name) + set(args ALIAS NAMESPACE TYPE) + cmake_parse_arguments(ARG "" "${args}" "" "${ARGN}") + # Generate the identifier for the resource library's namespace + set(ns_re "[a-zA-Z_][a-zA-Z0-9_]*") + if(NOT DEFINED ARG_NAMESPACE) + # Check that the library name is also a valid namespace + if(NOT name MATCHES "${ns_re}") + message(SEND_ERROR "Library name is not a valid namespace. Specify the NAMESPACE argument") + endif() + set(ARG_NAMESPACE "${name}") + else() + if(NOT ARG_NAMESPACE MATCHES "${ns_re}") + message(SEND_ERROR "NAMESPACE for ${name} is not a valid C++ namespace identifier (${ARG_NAMESPACE})") + endif() + endif() + set(libname "${name}") + # Check that type is either "STATIC" or "OBJECT", or default to "STATIC" if + # not set + if(NOT DEFINED ARG_TYPE) + set(ARG_TYPE STATIC) + elseif(NOT "${ARG_TYPE}" MATCHES "^(STATIC|OBJECT)$") + message(SEND_ERROR "${ARG_TYPE} is not a valid TYPE (STATIC and OBJECT are acceptable)") + set(ARG_TYPE STATIC) + endif() + # Generate a library with the compiled in character arrays. + string(CONFIGURE [=[ + #include + #include + #include + + namespace cmrc { + namespace @ARG_NAMESPACE@ { + + namespace res_chars { + // These are the files which are available in this resource library + $, + > + } + + namespace { + + const cmrc::detail::index_type& + get_root_index() { + static cmrc::detail::directory root_directory_; + static cmrc::detail::file_or_directory root_directory_fod{root_directory_}; + static cmrc::detail::index_type root_index; + root_index.emplace("", &root_directory_fod); + struct dir_inl { + class cmrc::detail::directory& directory; + }; + dir_inl root_directory_dir{root_directory_}; + (void)root_directory_dir; + $, + > + $, + > + return root_index; + } + + } + + cmrc::embedded_filesystem get_filesystem() { + static auto& index = get_root_index(); + return cmrc::embedded_filesystem{index}; + } + + } // @ARG_NAMESPACE@ + } // cmrc + ]=] cpp_content @ONLY) + get_filename_component(libdir "${CMAKE_CURRENT_BINARY_DIR}/__cmrc_${name}" ABSOLUTE) + get_filename_component(lib_tmp_cpp "${libdir}/lib_.cpp" ABSOLUTE) + string(REPLACE "\n " "\n" cpp_content "${cpp_content}") + file(GENERATE OUTPUT "${lib_tmp_cpp}" CONTENT "${cpp_content}") + get_filename_component(libcpp "${libdir}/lib.cpp" ABSOLUTE) + add_custom_command(OUTPUT "${libcpp}" + DEPENDS "${lib_tmp_cpp}" "${cmrc_hpp}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${lib_tmp_cpp}" "${libcpp}" + COMMENT "Generating ${name} resource loader" + ) + # Generate the actual static library. Each source file is just a single file + # with a character array compiled in containing the contents of the + # corresponding resource file. + add_library(${name} ${ARG_TYPE} ${libcpp}) + set_property(TARGET ${name} PROPERTY CMRC_LIBDIR "${libdir}") + set_property(TARGET ${name} PROPERTY CMRC_NAMESPACE "${ARG_NAMESPACE}") + target_link_libraries(${name} PUBLIC cmrc::base) + set_property(TARGET ${name} PROPERTY CMRC_IS_RESOURCE_LIBRARY TRUE) + if(ARG_ALIAS) + add_library("${ARG_ALIAS}" ALIAS ${name}) + endif() + cmrc_add_resources(${name} ${ARG_UNPARSED_ARGUMENTS}) +endfunction() + +function(_cmrc_register_dirs name dirpath) + if(dirpath STREQUAL "") + return() + endif() + # Skip this dir if we have already registered it + get_target_property(registered "${name}" _CMRC_REGISTERED_DIRS) + if(dirpath IN_LIST registered) + return() + endif() + # Register the parent directory first + get_filename_component(parent "${dirpath}" DIRECTORY) + if(NOT parent STREQUAL "") + _cmrc_register_dirs("${name}" "${parent}") + endif() + # Now generate the registration + set_property(TARGET "${name}" APPEND PROPERTY _CMRC_REGISTERED_DIRS "${dirpath}") + _cm_encode_fpath(sym "${dirpath}") + if(parent STREQUAL "") + set(parent_sym root_directory) + else() + _cm_encode_fpath(parent_sym "${parent}") + endif() + get_filename_component(leaf "${dirpath}" NAME) + set_property( + TARGET "${name}" + APPEND PROPERTY CMRC_MAKE_DIRS + "static auto ${sym}_dir = ${parent_sym}_dir.directory.add_subdir(\"${leaf}\")\;" + "root_index.emplace(\"${dirpath}\", &${sym}_dir.index_entry)\;" + ) +endfunction() + +function(cmrc_add_resources name) + get_target_property(is_reslib ${name} CMRC_IS_RESOURCE_LIBRARY) + if(NOT TARGET ${name} OR NOT is_reslib) + message(SEND_ERROR "cmrc_add_resources called on target '${name}' which is not an existing resource library") + return() + endif() + + set(options) + set(args WHENCE PREFIX) + set(list_args) + cmake_parse_arguments(ARG "${options}" "${args}" "${list_args}" "${ARGN}") + + if(NOT ARG_WHENCE) + set(ARG_WHENCE ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + _cmrc_normalize_path(ARG_WHENCE) + get_filename_component(ARG_WHENCE "${ARG_WHENCE}" ABSOLUTE) + + # Generate the identifier for the resource library's namespace + get_target_property(lib_ns "${name}" CMRC_NAMESPACE) + + get_target_property(libdir ${name} CMRC_LIBDIR) + get_target_property(target_dir ${name} SOURCE_DIR) + file(RELATIVE_PATH reldir "${target_dir}" "${CMAKE_CURRENT_SOURCE_DIR}") + if(reldir MATCHES "^\\.\\.") + message(SEND_ERROR "Cannot call cmrc_add_resources in a parent directory from the resource library target") + return() + endif() + + foreach(input IN LISTS ARG_UNPARSED_ARGUMENTS) + _cmrc_normalize_path(input) + get_filename_component(abs_in "${input}" ABSOLUTE) + # Generate a filename based on the input filename that we can put in + # the intermediate directory. + file(RELATIVE_PATH relpath "${ARG_WHENCE}" "${abs_in}") + if(relpath MATCHES "^\\.\\.") + # For now we just error on files that exist outside of the soure dir. + message(SEND_ERROR "Cannot add file '${input}': File must be in a subdirectory of ${ARG_WHENCE}") + continue() + endif() + if(DEFINED ARG_PREFIX) + _cmrc_normalize_path(ARG_PREFIX) + endif() + if(ARG_PREFIX AND NOT ARG_PREFIX MATCHES "/$") + set(ARG_PREFIX "${ARG_PREFIX}/") + endif() + get_filename_component(dirpath "${ARG_PREFIX}${relpath}" DIRECTORY) + _cmrc_register_dirs("${name}" "${dirpath}") + get_filename_component(abs_out "${libdir}/intermediate/${ARG_PREFIX}${relpath}.cpp" ABSOLUTE) + # Generate a symbol name relpath the file's character array + _cm_encode_fpath(sym "${relpath}") + # Get the symbol name for the parent directory + if(dirpath STREQUAL "") + set(parent_sym root_directory) + else() + _cm_encode_fpath(parent_sym "${dirpath}") + endif() + # Generate the rule for the intermediate source file + _cmrc_generate_intermediate_cpp(${lib_ns} ${sym} "${abs_out}" "${abs_in}") + target_sources(${name} PRIVATE "${abs_out}") + set_property(TARGET ${name} APPEND PROPERTY CMRC_EXTERN_DECLS + "// Pointers to ${input}" + "extern const char* const ${sym}_begin\;" + "extern const char* const ${sym}_end\;" + ) + get_filename_component(leaf "${relpath}" NAME) + set_property( + TARGET ${name} + APPEND PROPERTY CMRC_MAKE_FILES + "root_index.emplace(" + " \"${ARG_PREFIX}${relpath}\"," + " ${parent_sym}_dir.directory.add_file(" + " \"${leaf}\"," + " res_chars::${sym}_begin," + " res_chars::${sym}_end" + " )" + ")\;" + ) + endforeach() +endfunction() + +function(_cmrc_generate_intermediate_cpp lib_ns symbol outfile infile) + add_custom_command( + # This is the file we will generate + OUTPUT "${outfile}" + # These are the primary files that affect the output + DEPENDS "${infile}" "${_CMRC_SCRIPT}" + COMMAND + "${CMAKE_COMMAND}" + -D_CMRC_GENERATE_MODE=TRUE + -DNAMESPACE=${lib_ns} + -DSYMBOL=${symbol} + "-DINPUT_FILE=${infile}" + "-DOUTPUT_FILE=${outfile}" + -P "${_CMRC_SCRIPT}" + COMMENT "Generating intermediate file for ${infile}" + ) +endfunction() + +function(_cm_encode_fpath var fpath) + string(MAKE_C_IDENTIFIER "${fpath}" ident) + string(MD5 hash "${fpath}") + string(SUBSTRING "${hash}" 0 4 hash) + set(${var} f_${hash}_${ident} PARENT_SCOPE) +endfunction() diff --git a/src/core/libraries/np_trophy/np_trophy.cpp b/src/core/libraries/np_trophy/np_trophy.cpp index ccd8ab710..91dd5b4b4 100644 --- a/src/core/libraries/np_trophy/np_trophy.cpp +++ b/src/core/libraries/np_trophy/np_trophy.cpp @@ -941,7 +941,7 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr std::filesystem::path current_icon_path = trophy_dir / "trophy00" / "Icons" / trophy_icon_file; - AddTrophyToQueue(current_icon_path, current_trophy_name); + AddTrophyToQueue(current_icon_path, current_trophy_name, current_trophy_type); } } } @@ -978,7 +978,7 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr trophy_dir / "trophy00" / "Icons" / platinum_icon_file; *platinumId = platinum_trophy_id; - AddTrophyToQueue(platinum_icon_path, platinum_trophy_name); + AddTrophyToQueue(platinum_icon_path, platinum_trophy_name, "P"); } } diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp index 4bb8c8240..e5c11f4cb 100644 --- a/src/core/libraries/np_trophy/trophy_ui.cpp +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include "common/assert.h" #include "common/config.h" @@ -10,6 +11,8 @@ #include "imgui/imgui_std.h" #include "trophy_ui.h" +CMRC_DECLARE(res); + using namespace ImGui; namespace Libraries::NpTrophy { @@ -17,14 +20,34 @@ std::optional current_trophy_ui; std::queue trophy_queue; std::mutex queueMtx; -TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName) - : trophy_name(trophyName) { +TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName, + const std::string_view& rarity) + : trophy_name(trophyName), trophy_type(rarity) { + if (std::filesystem::exists(trophyIconPath)) { trophy_icon = RefCountedTexture::DecodePngFile(trophyIconPath); } else { LOG_ERROR(Lib_NpTrophy, "Couldnt load trophy icon at {}", fmt::UTF(trophyIconPath.u8string())); } + + std::string pathString; + if (trophy_type == "P") { + pathString = "Resources/platinum.png"; + } else if (trophy_type == "G") { + pathString = "Resources/gold.png"; + } else if (trophy_type == "S") { + pathString = "Resources/silver.png"; + } else if (trophy_type == "B") { + pathString = "Resources/bronze.png"; + } + + auto resource = cmrc::res::get_filesystem(); + auto trophytypefile = resource.open(pathString); + std::filesystem::path trophyTypePath = pathString; + if (std::filesystem::exists(trophyTypePath)) + trophy_type_icon = RefCountedTexture::DecodePngFile(trophyTypePath); + AddLayer(this); } @@ -42,29 +65,49 @@ void TrophyUI::Draw() { float AdjustWidth = io.DisplaySize.x / 1280; float AdjustHeight = io.DisplaySize.y / 720; const ImVec2 window_size{ - std::min(io.DisplaySize.x, (300 * AdjustWidth)), + std::min(io.DisplaySize.x, (350 * AdjustWidth)), std::min(io.DisplaySize.y, (70 * AdjustHeight)), }; SetNextWindowSize(window_size); SetNextWindowCollapsed(false); - SetNextWindowPos(ImVec2(io.DisplaySize.x - (300 * AdjustWidth), (50 * AdjustHeight))); + SetNextWindowPos(ImVec2(io.DisplaySize.x - (370 * AdjustWidth), (50 * AdjustHeight))); KeepNavHighlight(); if (Begin("Trophy Window", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoInputs)) { - if (trophy_icon) { - Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); - ImGui::SameLine(); + if (trophy_type_icon) { + SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); + Image(trophy_type_icon.GetTexture().im_id, + ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); } else { // placeholder const auto pos = GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f}, + ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight}, GetColorU32(ImVec4{0.7f})); - ImGui::Indent(60); } + + ImGui::SameLine(); + SetWindowFontScale((1.2 * AdjustHeight)); + char earned_text[] = "Trophy earned!\n%s"; + const float text_height = + ImGui::CalcTextSize(std::strcat(earned_text, trophy_name.c_str())).y; + SetCursorPosY((window_size.y - text_height) * 0.5f); + + ImGui::PushTextWrapPos(window_size.x - (60 * AdjustWidth)); TextWrapped("Trophy earned!\n%s", trophy_name.c_str()); + ImGui::SameLine(window_size.x - (60 * AdjustWidth)); + + if (trophy_icon) { + SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); + Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); + } else { + // placeholder + const auto pos = GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{30.0f * AdjustHeight}, + GetColorU32(ImVec4{0.7f})); + } } End(); @@ -74,14 +117,16 @@ void TrophyUI::Draw() { if (!trophy_queue.empty()) { TrophyInfo next_trophy = trophy_queue.front(); trophy_queue.pop(); - current_trophy_ui.emplace(next_trophy.trophy_icon_path, next_trophy.trophy_name); + current_trophy_ui.emplace(next_trophy.trophy_icon_path, next_trophy.trophy_name, + next_trophy.trophy_type); } else { current_trophy_ui.reset(); } } } -void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName) { +void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName, + const std::string_view& rarity) { std::lock_guard lock(queueMtx); if (Config::getisTrophyPopupDisabled()) { @@ -90,10 +135,11 @@ void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::st TrophyInfo new_trophy; new_trophy.trophy_icon_path = trophyIconPath; new_trophy.trophy_name = trophyName; + new_trophy.trophy_type = rarity; trophy_queue.push(new_trophy); } else { - current_trophy_ui.emplace(trophyIconPath, trophyName); + current_trophy_ui.emplace(trophyIconPath, trophyName, rarity); } } -} // namespace Libraries::NpTrophy \ No newline at end of file +} // namespace Libraries::NpTrophy diff --git a/src/core/libraries/np_trophy/trophy_ui.h b/src/core/libraries/np_trophy/trophy_ui.h index ce7a1c63a..16e707059 100644 --- a/src/core/libraries/np_trophy/trophy_ui.h +++ b/src/core/libraries/np_trophy/trophy_ui.h @@ -17,7 +17,8 @@ namespace Libraries::NpTrophy { class TrophyUI final : public ImGui::Layer { public: - TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName); + TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName, + const std::string_view& rarity); ~TrophyUI() override; void Finish(); @@ -26,15 +27,19 @@ public: private: std::string trophy_name; + std::string_view trophy_type; float trophy_timer = 5.0f; ImGui::RefCountedTexture trophy_icon; + ImGui::RefCountedTexture trophy_type_icon; }; struct TrophyInfo { std::filesystem::path trophy_icon_path; std::string trophy_name; + std::string_view trophy_type; }; -void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName); +void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::string& trophyName, + const std::string_view& rarity); -}; // namespace Libraries::NpTrophy \ No newline at end of file +}; // namespace Libraries::NpTrophy diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 4fa5ee5e2..697840268 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -2,9 +2,12 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "common/path_util.h" #include "trophy_viewer.h" +CMRC_DECLARE(res); + TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindow() { this->setWindowTitle(tr("Trophy Viewer")); this->setAttribute(Qt::WA_DeleteOnClose); @@ -115,13 +118,34 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { item->setData(Qt::DecorationRole, icon); item->setFlags(item->flags() & ~Qt::ItemIsEditable); tableWidget->setItem(row, 1, item); + + const std::string filename = GetTrpType(trpType[row].at(0)); + QTableWidgetItem* typeitem = new QTableWidgetItem(); + + auto resource = cmrc::res::get_filesystem(); + std::string resourceString = "Resources/" + filename; + auto trophytypefile = resource.open(resourceString); + + QImage type_icon = + QImage(QString::fromStdString(resourceString)) + .scaled(QSize(64, 64), Qt::KeepAspectRatio, Qt::SmoothTransformation); + typeitem->setData(Qt::DecorationRole, type_icon); + typeitem->setFlags(typeitem->flags() & ~Qt::ItemIsEditable); + tableWidget->setItem(row, 6, typeitem); + + std::string detailString = trophyDetails[row].toStdString(); + std::size_t newline_pos = 0; + while ((newline_pos = detailString.find("\n", newline_pos)) != std::string::npos) { + detailString.replace(newline_pos, 1, " "); + ++newline_pos; + } + if (!trophyNames.isEmpty() && !trophyDetails.isEmpty()) { SetTableItem(tableWidget, row, 0, trpUnlocked[row]); SetTableItem(tableWidget, row, 2, trophyNames[row]); - SetTableItem(tableWidget, row, 3, trophyDetails[row]); + SetTableItem(tableWidget, row, 3, QString::fromStdString(detailString)); SetTableItem(tableWidget, row, 4, trpId[row]); SetTableItem(tableWidget, row, 5, trpHidden[row]); - SetTableItem(tableWidget, row, 6, GetTrpType(trpType[row].at(0))); SetTableItem(tableWidget, row, 7, trpPid[row]); } tableWidget->verticalHeader()->resizeSection(row, icon.height()); @@ -157,7 +181,7 @@ void TrophyViewer::SetTableItem(QTableWidget* parent, int row, int column, QStri label->setGraphicsEffect(shadowEffect); // Apply shadow effect to the QLabel layout->addWidget(label); - if (column != 1 && column != 2) + if (column != 1 && column != 2 && column != 3) layout->setAlignment(Qt::AlignCenter); widget->setLayout(layout); parent->setItem(row, column, item); diff --git a/src/qt_gui/trophy_viewer.h b/src/qt_gui/trophy_viewer.h index 81b9b1adc..089de433e 100644 --- a/src/qt_gui/trophy_viewer.h +++ b/src/qt_gui/trophy_viewer.h @@ -32,17 +32,17 @@ private: QString gameTrpPath_; TRP trp; - QString GetTrpType(const QChar trp_) { + std::string GetTrpType(const QChar trp_) { switch (trp_.toLatin1()) { case 'B': - return "Bronze"; + return "bronze.png"; case 'S': - return "Silver"; + return "silver.png"; case 'G': - return "Gold"; + return "gold.png"; case 'P': - return "Platinum"; + return "platinum.png"; } return "Unknown"; } -}; \ No newline at end of file +}; From e1ae0521850f9a6644eb43d575ea9aae55294782 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 23 Feb 2025 05:02:00 -0300 Subject: [PATCH 336/455] QT: Various interface fixes (#2496) * QT: Various interface fixes * fix close without saving * + * + using the save and close buttons, everything works fine, but when using the X button it doesn't work very well... * fix close (X) without saving --- src/qt_gui/cheats_patches.cpp | 6 ++++-- src/qt_gui/gui_context_menus.h | 14 +++++++++++--- src/qt_gui/main_window.cpp | 25 +++++++++++++++++++++++++ src/qt_gui/settings_dialog.cpp | 27 +++++++++++++++++++++++++++ src/qt_gui/settings_dialog.h | 3 +++ 5 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index 597729a45..bf7877f18 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -26,8 +26,10 @@ #include #include #include -#include + #include "cheats_patches.h" +#include "common/config.h" +#include "common/logging/log.h" #include "common/memory_patcher.h" #include "common/path_util.h" #include "core/module.h" @@ -92,7 +94,7 @@ void CheatsPatches::setupUI() { gameVersionLabel->setAlignment(Qt::AlignLeft); gameInfoLayout->addWidget(gameVersionLabel); - if (m_gameSize.left(4) != "0.00") { + if (Config::GetLoadGameSizeEnabled()) { QLabel* gameSizeLabel = new QLabel(tr("Size: ") + m_gameSize); gameSizeLabel->setAlignment(Qt::AlignLeft); gameInfoLayout->addWidget(gameSizeLabel); diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index deb35de8d..1a059a850 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -84,7 +84,9 @@ public: copyMenu->addAction(copyName); copyMenu->addAction(copySerial); copyMenu->addAction(copyVersion); - copyMenu->addAction(copySize); + if (Config::GetLoadGameSizeEnabled()) { + copyMenu->addAction(copySize); + } copyMenu->addAction(copyNameAll); menu.addMenu(copyMenu); @@ -362,12 +364,18 @@ public: } if (selected == copyNameAll) { + QString GameSizeEnabled; + if (Config::GetLoadGameSizeEnabled()) { + GameSizeEnabled = " | Size:" + QString::fromStdString(m_games[itemID].size); + } + QClipboard* clipboard = QGuiApplication::clipboard(); - QString combinedText = QString("Name:%1 | Serial:%2 | Version:%3 | Size:%4") + QString combinedText = QString("Name:%1 | Serial:%2 | Version:%3%4") .arg(QString::fromStdString(m_games[itemID].name)) .arg(QString::fromStdString(m_games[itemID].serial)) .arg(QString::fromStdString(m_games[itemID].version)) - .arg(QString::fromStdString(m_games[itemID].size)); + .arg(GameSizeEnabled); + clipboard->setText(combinedText); } diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 0da6428aa..96bd1d9e5 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -290,6 +290,27 @@ void MainWindow::CreateConnects() { connect(settingsDialog, &SettingsDialog::CompatibilityChanged, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::accepted, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::rejected, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::close, this, &MainWindow::RefreshGameTable); + + connect(settingsDialog, &SettingsDialog::BackgroundOpacityChanged, this, + [this](int opacity) { + Config::setBackgroundImageOpacity(opacity); + if (m_game_list_frame) { + QTableWidgetItem* current = m_game_list_frame->GetCurrentItem(); + if (current) { + m_game_list_frame->SetListBackgroundImage(current); + } + } + if (m_game_grid_frame) { + if (m_game_grid_frame->IsValidCellSelected()) { + m_game_grid_frame->SetGridBackgroundImage(m_game_grid_frame->crtRow, + m_game_grid_frame->crtColumn); + } + } + }); + settingsDialog->exec(); }); @@ -302,6 +323,10 @@ void MainWindow::CreateConnects() { connect(settingsDialog, &SettingsDialog::CompatibilityChanged, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::accepted, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::rejected, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::close, this, &MainWindow::RefreshGameTable); + connect(settingsDialog, &SettingsDialog::BackgroundOpacityChanged, this, [this](int opacity) { Config::setBackgroundImageOpacity(opacity); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index bebb16c9a..ee88bbbab 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -63,6 +63,9 @@ QMap logTypeMap; QMap fullscreenModeMap; QMap chooseHomeTabMap; +int backgroundImageOpacitySlider_backup; +int bgm_volume_backup; + SettingsDialog::SettingsDialog(std::span physical_devices, std::shared_ptr m_compat_info, QWidget* parent) @@ -115,6 +118,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this, config_dir](QAbstractButton* button) { if (button == ui->buttonBox->button(QDialogButtonBox::Save)) { + is_saving = true; UpdateSettings(); Config::save(config_dir / "config.toml"); QWidget::close(); @@ -126,6 +130,10 @@ SettingsDialog::SettingsDialog(std::span physical_devices, Config::save(config_dir / "config.toml"); LoadValuesFromConfig(); } else if (button == ui->buttonBox->button(QDialogButtonBox::Close)) { + ui->backgroundImageOpacitySlider->setValue(backgroundImageOpacitySlider_backup); + emit BackgroundOpacityChanged(backgroundImageOpacitySlider_backup); + ui->BGMVolumeSlider->setValue(bgm_volume_backup); + BackgroundMusicPlayer::getInstance().setVolume(bgm_volume_backup); ResetInstallFolders(); } if (Common::Log::IsActive()) { @@ -197,6 +205,12 @@ SettingsDialog::SettingsDialog(std::span physical_devices, // Gui TAB { + connect(ui->backgroundImageOpacitySlider, &QSlider::valueChanged, this, + [this](int value) { emit BackgroundOpacityChanged(value); }); + + connect(ui->BGMVolumeSlider, &QSlider::valueChanged, this, + [](int value) { BackgroundMusicPlayer::getInstance().setVolume(value); }); + connect(ui->chooseHomeTabComboBox, &QComboBox::currentTextChanged, this, [](const QString& hometab) { Config::setChooseHomeTab(hometab.toStdString()); }); @@ -330,6 +344,16 @@ SettingsDialog::SettingsDialog(std::span physical_devices, } } +void SettingsDialog::closeEvent(QCloseEvent* event) { + if (!is_saving) { + ui->backgroundImageOpacitySlider->setValue(backgroundImageOpacitySlider_backup); + emit BackgroundOpacityChanged(backgroundImageOpacitySlider_backup); + ui->BGMVolumeSlider->setValue(bgm_volume_backup); + BackgroundMusicPlayer::getInstance().setVolume(bgm_volume_backup); + } + QDialog::closeEvent(event); +} + void SettingsDialog::LoadValuesFromConfig() { std::filesystem::path userdir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); @@ -460,6 +484,9 @@ void SettingsDialog::LoadValuesFromConfig() { ResetInstallFolders(); ui->backgroundImageOpacitySlider->setValue(Config::getBackgroundImageOpacity()); ui->showBackgroundImageCheckBox->setChecked(Config::getShowBackgroundImage()); + + backgroundImageOpacitySlider_backup = Config::getBackgroundImageOpacity(); + bgm_volume_backup = Config::getBGMvolume(); } void SettingsDialog::InitializeEmulatorLanguages() { diff --git a/src/qt_gui/settings_dialog.h b/src/qt_gui/settings_dialog.h index c440351f6..09aa2b855 100644 --- a/src/qt_gui/settings_dialog.h +++ b/src/qt_gui/settings_dialog.h @@ -42,6 +42,7 @@ private: void InitializeEmulatorLanguages(); void OnLanguageChanged(int index); void OnCursorStateChanged(s16 index); + void closeEvent(QCloseEvent* event) override; std::unique_ptr ui; @@ -50,4 +51,6 @@ private: QString defaultTextEdit; int initialHeight; + + bool is_saving = false; }; From 10486db091efd3a4b55584b9aded03f4a1809859 Mon Sep 17 00:00:00 2001 From: marcoppenheimer <51744472+marcoppenheimer@users.noreply.github.com> Date: Sun, 23 Feb 2025 10:09:53 +0000 Subject: [PATCH 337/455] docs: add qt6-tools to Arch build guide (#2495) --- documents/building-linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documents/building-linux.md b/documents/building-linux.md index 4ca953af6..18ddab0c6 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -36,7 +36,7 @@ sudo dnf install clang git cmake libatomic alsa-lib-devel \ ```bash sudo pacman -S base-devel clang git cmake sndio jack2 openal \ - qt6-base qt6-declarative qt6-multimedia sdl2 \ + qt6-base qt6-declarative qt6-multimedia qt6-tools sdl2 \ vulkan-validation-layers libpng ``` From e1e697a3ff491df53b0ccb38d3c3b0fffdb1ca78 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:00:26 +0800 Subject: [PATCH 338/455] Revert use of embedded icons (#2509) Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/core/libraries/np_trophy/trophy_ui.cpp | 39 +++------------------- src/qt_gui/trophy_viewer.cpp | 23 ++++++------- src/qt_gui/trophy_viewer.h | 14 -------- 3 files changed, 15 insertions(+), 61 deletions(-) diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp index e5c11f4cb..ab396ef6f 100644 --- a/src/core/libraries/np_trophy/trophy_ui.cpp +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -31,23 +31,6 @@ TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::strin fmt::UTF(trophyIconPath.u8string())); } - std::string pathString; - if (trophy_type == "P") { - pathString = "Resources/platinum.png"; - } else if (trophy_type == "G") { - pathString = "Resources/gold.png"; - } else if (trophy_type == "S") { - pathString = "Resources/silver.png"; - } else if (trophy_type == "B") { - pathString = "Resources/bronze.png"; - } - - auto resource = cmrc::res::get_filesystem(); - auto trophytypefile = resource.open(pathString); - std::filesystem::path trophyTypePath = pathString; - if (std::filesystem::exists(trophyTypePath)) - trophy_type_icon = RefCountedTexture::DecodePngFile(trophyTypePath); - AddLayer(this); } @@ -76,38 +59,24 @@ void TrophyUI::Draw() { if (Begin("Trophy Window", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoInputs)) { - if (trophy_type_icon) { + if (trophy_icon) { SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); - Image(trophy_type_icon.GetTexture().im_id, - ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); + Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); + ImGui::SameLine(); } else { // placeholder const auto pos = GetCursorScreenPos(); ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight}, GetColorU32(ImVec4{0.7f})); + ImGui::Indent(60); } - ImGui::SameLine(); - SetWindowFontScale((1.2 * AdjustHeight)); char earned_text[] = "Trophy earned!\n%s"; const float text_height = ImGui::CalcTextSize(std::strcat(earned_text, trophy_name.c_str())).y; SetCursorPosY((window_size.y - text_height) * 0.5f); - - ImGui::PushTextWrapPos(window_size.x - (60 * AdjustWidth)); TextWrapped("Trophy earned!\n%s", trophy_name.c_str()); - ImGui::SameLine(window_size.x - (60 * AdjustWidth)); - - if (trophy_icon) { - SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); - Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); - } else { - // placeholder - const auto pos = GetCursorScreenPos(); - ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{30.0f * AdjustHeight}, - GetColorU32(ImVec4{0.7f})); - } } End(); diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 697840268..4ec1392d8 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -118,20 +118,18 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { item->setData(Qt::DecorationRole, icon); item->setFlags(item->flags() & ~Qt::ItemIsEditable); tableWidget->setItem(row, 1, item); - - const std::string filename = GetTrpType(trpType[row].at(0)); QTableWidgetItem* typeitem = new QTableWidgetItem(); - auto resource = cmrc::res::get_filesystem(); - std::string resourceString = "Resources/" + filename; - auto trophytypefile = resource.open(resourceString); - - QImage type_icon = - QImage(QString::fromStdString(resourceString)) - .scaled(QSize(64, 64), Qt::KeepAspectRatio, Qt::SmoothTransformation); - typeitem->setData(Qt::DecorationRole, type_icon); - typeitem->setFlags(typeitem->flags() & ~Qt::ItemIsEditable); - tableWidget->setItem(row, 6, typeitem); + QString type; + if (trpType[row] == "P") { + type = "Platinum"; + } else if (trpType[row] == "G") { + type = "Gold"; + } else if (trpType[row] == "S") { + type = "Silver"; + } else if (trpType[row] == "B") { + type = "Bronze"; + } std::string detailString = trophyDetails[row].toStdString(); std::size_t newline_pos = 0; @@ -146,6 +144,7 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { SetTableItem(tableWidget, row, 3, QString::fromStdString(detailString)); SetTableItem(tableWidget, row, 4, trpId[row]); SetTableItem(tableWidget, row, 5, trpHidden[row]); + SetTableItem(tableWidget, row, 6, type); SetTableItem(tableWidget, row, 7, trpPid[row]); } tableWidget->verticalHeader()->resizeSection(row, icon.height()); diff --git a/src/qt_gui/trophy_viewer.h b/src/qt_gui/trophy_viewer.h index 089de433e..0e6894dc6 100644 --- a/src/qt_gui/trophy_viewer.h +++ b/src/qt_gui/trophy_viewer.h @@ -31,18 +31,4 @@ private: QStringList headers; QString gameTrpPath_; TRP trp; - - std::string GetTrpType(const QChar trp_) { - switch (trp_.toLatin1()) { - case 'B': - return "bronze.png"; - case 'S': - return "silver.png"; - case 'G': - return "gold.png"; - case 'P': - return "platinum.png"; - } - return "Unknown"; - } }; From bc85357235e26a571953262cc84acc0204205d97 Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Sun, 23 Feb 2025 09:01:09 -0600 Subject: [PATCH 339/455] move display mode and hdr to graphics tab (#2485) * move display mode and hdr to graphics tab * add left margin to display settings box * merge display combo box and fullscreen checkbox * remove commented out checkbox * Rename borderless to windowed * rename graphics box and mode * Rename window modes and map * fix formatting * fix: xml formatting * Rename borderless windowed * change resolution input layout * rename resolution to window size * change window size layout oriention * add true fullscreen mode * fix duplicate label name * set fullscreen on true fullscreen or borderless * remove commented out ref * rearrange settings config for new schema * move HDR config to GPU section --- src/common/config.cpp | 15 +- src/qt_gui/settings_dialog.cpp | 25 ++- src/qt_gui/settings_dialog.ui | 308 +++++++++++++++++---------------- src/sdl_window.cpp | 4 +- 4 files changed, 178 insertions(+), 174 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 32c5e670b..a190e4da1 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -34,7 +34,7 @@ namespace Config { static bool isHDRAllowed = false; static bool isNeo = false; static bool isFullscreen = false; -static std::string fullscreenMode = "borderless"; +static std::string fullscreenMode = "Fullscreen (Borderless)"; static bool playBGM = false; static bool isTrophyPopupDisabled = false; static int BGMvolume = 50; @@ -694,10 +694,7 @@ void load(const std::filesystem::path& path) { if (data.contains("General")) { const toml::value& general = data.at("General"); - isHDRAllowed = toml::find_or(general, "allowHDR", false); isNeo = toml::find_or(general, "isPS4Pro", false); - isFullscreen = toml::find_or(general, "Fullscreen", false); - fullscreenMode = toml::find_or(general, "FullscreenMode", "borderless"); playBGM = toml::find_or(general, "playBGM", false); isTrophyPopupDisabled = toml::find_or(general, "isTrophyPopupDisabled", false); BGMvolume = toml::find_or(general, "BGMvolume", 50); @@ -742,6 +739,10 @@ void load(const std::filesystem::path& path) { shouldDumpShaders = toml::find_or(gpu, "dumpShaders", false); shouldPatchShaders = toml::find_or(gpu, "patchShaders", true); vblankDivider = toml::find_or(gpu, "vblankDivider", 1); + isFullscreen = toml::find_or(gpu, "Fullscreen", false); + fullscreenMode = + toml::find_or(gpu, "FullscreenMode", "Fullscreen (Borderless)"); + isHDRAllowed = toml::find_or(gpu, "allowHDR", false); } if (data.contains("Vulkan")) { @@ -844,10 +845,7 @@ void save(const std::filesystem::path& path) { fmt::print("Saving new configuration file {}\n", fmt::UTF(path.u8string())); } - data["General"]["allowHDR"] = isHDRAllowed; data["General"]["isPS4Pro"] = isNeo; - data["General"]["Fullscreen"] = isFullscreen; - data["General"]["FullscreenMode"] = fullscreenMode; data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled; data["General"]["playBGM"] = playBGM; data["General"]["BGMvolume"] = BGMvolume; @@ -877,6 +875,9 @@ void save(const std::filesystem::path& path) { data["GPU"]["dumpShaders"] = shouldDumpShaders; data["GPU"]["patchShaders"] = shouldPatchShaders; data["GPU"]["vblankDivider"] = vblankDivider; + data["GPU"]["Fullscreen"] = isFullscreen; + data["GPU"]["FullscreenMode"] = fullscreenMode; + data["GPU"]["allowHDR"] = isHDRAllowed; data["Vulkan"]["gpuId"] = gpuId; data["Vulkan"]["validation"] = vkValidation; data["Vulkan"]["validation_sync"] = vkValidationSync; diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index ee88bbbab..bf09c979b 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -60,7 +60,7 @@ const QVector languageIndexes = {21, 23, 14, 6, 18, 1, 12, 22, 2, 4, 25, 2 15, 16, 17, 7, 26, 8, 11, 20, 3, 13, 27, 10, 19, 30, 28}; QMap channelMap; QMap logTypeMap; -QMap fullscreenModeMap; +QMap screenModeMap; QMap chooseHomeTabMap; int backgroundImageOpacitySlider_backup; @@ -80,7 +80,9 @@ SettingsDialog::SettingsDialog(std::span physical_devices, channelMap = {{tr("Release"), "Release"}, {tr("Nightly"), "Nightly"}}; logTypeMap = {{tr("async"), "async"}, {tr("sync"), "sync"}}; - fullscreenModeMap = {{tr("Borderless"), "Borderless"}, {tr("True"), "True"}}; + screenModeMap = {{tr("Fullscreen (Borderless)"), "Fullscreen (Borderless)"}, + {tr("Windowed"), "Windowed"}, + {tr("Fullscreen"), "Fullscreen"}}; chooseHomeTabMap = {{tr("General"), "General"}, {tr("GUI"), "GUI"}, {tr("Graphics"), "Graphics"}, {tr("User"), "User"}, {tr("Input"), "Input"}, {tr("Paths"), "Paths"}, @@ -288,7 +290,6 @@ SettingsDialog::SettingsDialog(std::span physical_devices, // General ui->consoleLanguageGroupBox->installEventFilter(this); ui->emulatorLanguageGroupBox->installEventFilter(this); - ui->fullscreenCheckBox->installEventFilter(this); ui->separateUpdatesCheckBox->installEventFilter(this); ui->showSplashCheckBox->installEventFilter(this); ui->discordRPCCheckbox->installEventFilter(this); @@ -314,8 +315,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, // Graphics ui->graphicsAdapterGroupBox->installEventFilter(this); - ui->widthGroupBox->installEventFilter(this); - ui->heightGroupBox->installEventFilter(this); + ui->windowSizeGroupBox->installEventFilter(this); ui->heightDivider->installEventFilter(this); ui->dumpShadersCheckBox->installEventFilter(this); ui->nullGpuCheckBox->installEventFilter(this); @@ -406,12 +406,9 @@ void SettingsDialog::LoadValuesFromConfig() { ui->BGMVolumeSlider->setValue(toml::find_or(data, "General", "BGMvolume", 50)); ui->discordRPCCheckbox->setChecked( toml::find_or(data, "General", "enableDiscordRPC", true)); - ui->fullscreenCheckBox->setChecked(toml::find_or(data, "General", "Fullscreen", false)); QString translatedText_FullscreenMode = - fullscreenModeMap.key(QString::fromStdString(Config::getFullscreenMode())); - if (!translatedText_FullscreenMode.isEmpty()) { - ui->fullscreenModeComboBox->setCurrentText(translatedText_FullscreenMode); - } + screenModeMap.key(QString::fromStdString(Config::getFullscreenMode())); + ui->displayModeComboBox->setCurrentText(translatedText_FullscreenMode); ui->separateUpdatesCheckBox->setChecked( toml::find_or(data, "General", "separateUpdateEnabled", false)); ui->gameSizeCheckBox->setChecked(toml::find_or(data, "GUI", "loadGameSizeEnabled", true)); @@ -560,8 +557,6 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { text = tr("Console Language:\\nSets the language that the PS4 game uses.\\nIt's recommended to set this to a language the game supports, which will vary by region."); } else if (elementName == "emulatorLanguageGroupBox") { text = tr("Emulator Language:\\nSets the language of the emulator's user interface."); - } else if (elementName == "fullscreenCheckBox") { - text = tr("Enable Full Screen:\\nAutomatically puts the game window into full-screen mode.\\nThis can be toggled by pressing the F11 key."); } else if (elementName == "separateUpdatesCheckBox") { text = tr("Enable Separate Update Folder:\\nEnables installing game updates into a separate folder for easy management.\\nThis can be manually created by adding the extracted update to the game folder with the name \"CUSA00000-UPDATE\" where the CUSA ID matches the game's ID."); } else if (elementName == "showSplashCheckBox") { @@ -608,7 +603,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { // Graphics if (elementName == "graphicsAdapterGroupBox") { text = tr("Graphics Device:\\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\\nor select \"Auto Select\" to automatically determine it."); - } else if (elementName == "widthGroupBox" || elementName == "heightGroupBox") { + } else if (elementName == "windowSizeGroupBox") { text = tr("Width/Height:\\nSets the size of the emulator window at launch, which can be resized during gameplay.\\nThis is different from the in-game resolution."); } else if (elementName == "heightDivider") { text = tr("Vblank Divider:\\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change!"); @@ -679,9 +674,9 @@ void SettingsDialog::UpdateSettings() { const QVector TouchPadIndex = {"left", "center", "right", "none"}; Config::setBackButtonBehavior(TouchPadIndex[ui->backButtonBehaviorComboBox->currentIndex()]); - Config::setIsFullscreen(ui->fullscreenCheckBox->isChecked()); + Config::setIsFullscreen(ui->displayModeComboBox->currentText().toStdString() != "Windowed"); Config::setFullscreenMode( - fullscreenModeMap.value(ui->fullscreenModeComboBox->currentText()).toStdString()); + screenModeMap.value(ui->displayModeComboBox->currentText()).toStdString()); Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 53bae664f..c65162e37 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -135,49 +135,6 @@ 10 - - - - Enable Fullscreen - - - - - - - Fullscreen Mode - - - - - - - 0 - 0 - - - - - Borderless - - - - - True - - - - - - - - - - - Enable HDR - - - @@ -1007,117 +964,168 @@ - - - 6 + + + Video - - 0 - - - - - - - Width - - - - - - true + + + 6 + + + 12 + + + + + Display Mode + + + + + + + 0 + 0 + + + + + Windowed - - QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + + + + Fullscreen - - false + + + + Fullscreen (Borderless) - - 0 - - - 9999 - - - 1280 - - - - - - - - - - Height - - - - - - true - - - true - - - QAbstractSpinBox::CorrectionMode::CorrectToNearestValue - - - false - - - 0 - - - 9999 - - - 720 - - - - - - - - - - Vblank Divider - - - - - - true - - - true - - - QAbstractSpinBox::CorrectionMode::CorrectToNearestValue - - - false - - - 1 - - - 9999 - - - 1 - - - - - - - - - + + + + + + + + + + + + Window Size + + + + + + W: + + + + + + + true + + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + + + false + + + 0 + + + 9999 + + + 1280 + + + + + + + H: + + + + + + + true + + + true + + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + + + false + + + 0 + + + 9999 + + + 720 + + + + + + + + + + Vblank Divider + + + + + + true + + + true + + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + + + false + + + 1 + + + 9999 + + + 1 + + + + + + + + + + + + Enable HDR + + + + + diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index db6f37e2a..943746e3f 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -290,8 +290,8 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_ error = true; } if (!error) { - SDL_SetWindowFullscreenMode(window, - Config::getFullscreenMode() == "True" ? displayMode : NULL); + SDL_SetWindowFullscreenMode( + window, Config::getFullscreenMode() == "Fullscreen" ? displayMode : NULL); } SDL_SetWindowFullscreen(window, Config::getIsFullscreen()); From 02f9d03f57f22fc34238b7d487a2303445178e6a Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:06:42 -0600 Subject: [PATCH 340/455] fix:[#2513] align emulator settings content top (#2515) --- src/qt_gui/settings_dialog.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index c65162e37..fe8d6733e 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -130,6 +130,9 @@ 9 + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop + From f1c70ce53c7a07e12940fb2f06eadf387d92a855 Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Sun, 23 Feb 2025 14:07:06 -0600 Subject: [PATCH 341/455] Fix/display mode default (#2516) * fix: move fullscreen config options to GUI section of variable declarations * fix:[#2514] set display mode default to windowed --- src/common/config.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index a190e4da1..cc3b86315 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -31,10 +31,7 @@ std::filesystem::path find_fs_path_or(const basic_value& v, const K& ky, namespace Config { -static bool isHDRAllowed = false; static bool isNeo = false; -static bool isFullscreen = false; -static std::string fullscreenMode = "Fullscreen (Borderless)"; static bool playBGM = false; static bool isTrophyPopupDisabled = false; static int BGMvolume = 50; @@ -102,6 +99,9 @@ std::vector m_recent_files; std::string emulator_language = "en_US"; static int backgroundImageOpacity = 50; static bool showBackgroundImage = true; +static bool isFullscreen = false; +static std::string fullscreenMode = "Windowed"; +static bool isHDRAllowed = false; // Language u32 m_language = 1; // english @@ -740,8 +740,7 @@ void load(const std::filesystem::path& path) { shouldPatchShaders = toml::find_or(gpu, "patchShaders", true); vblankDivider = toml::find_or(gpu, "vblankDivider", 1); isFullscreen = toml::find_or(gpu, "Fullscreen", false); - fullscreenMode = - toml::find_or(gpu, "FullscreenMode", "Fullscreen (Borderless)"); + fullscreenMode = toml::find_or(gpu, "FullscreenMode", "Windowed"); isHDRAllowed = toml::find_or(gpu, "allowHDR", false); } From 84a614dddc8d181cc7f41061617a7771cef0dd96 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 23 Feb 2025 17:17:29 -0300 Subject: [PATCH 342/455] Fix cache size (#2517) --- src/qt_gui/game_list_utils.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/game_list_utils.h b/src/qt_gui/game_list_utils.h index c6b69e70e..804f0e4b7 100644 --- a/src/qt_gui/game_list_utils.h +++ b/src/qt_gui/game_list_utils.h @@ -69,8 +69,12 @@ public: } // Cache path - QFile size_cache_file(Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / - game.serial / "size_cache.txt"); + QDir cacheDir = + QDir(Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game.serial); + if (!cacheDir.exists()) { + cacheDir.mkpath("."); + } + QFile size_cache_file(cacheDir.absoluteFilePath("size_cache.txt")); QFileInfo cacheInfo(size_cache_file); QFileInfo dirInfo(dirPath); From c38e1635ea14a59dbc45511450c68bc3e396dd0a Mon Sep 17 00:00:00 2001 From: Fire Cube Date: Sun, 23 Feb 2025 21:30:11 +0100 Subject: [PATCH 343/455] Add option to save logfiles seperate for each game (#2504) * add option to split log * better naming * fix * fix * fix formatting * fix misspelling * make clang conform * clang fix --- src/common/config.cpp | 11 ++++ src/common/config.h | 3 +- src/common/logging/backend.cpp | 5 +- src/emulator.cpp | 56 +++++++++--------- src/qt_gui/settings_dialog.cpp | 6 +- src/qt_gui/settings_dialog.ui | 103 ++++++++++++++++++--------------- 6 files changed, 108 insertions(+), 76 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index cc3b86315..0260d8e17 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -66,6 +66,7 @@ static bool vkHostMarkers = false; static bool vkGuestMarkers = false; static bool rdocEnable = false; static bool isFpsColor = true; +static bool isSeparateLogFilesEnabled = false; static s16 cursorState = HideCursorState::Idle; static int cursorHideTimeout = 5; // 5 seconds (default) static bool useUnifiedInputConfig = true; @@ -451,6 +452,10 @@ void setLogFilter(const std::string& type) { logFilter = type; } +void setSeparateLogFilesEnabled(bool enabled) { + isSeparateLogFilesEnabled = enabled; +} + void setUserName(const std::string& type) { userName = type; } @@ -656,6 +661,10 @@ u32 GetLanguage() { return m_language; } +bool getSeparateLogFilesEnabled() { + return isSeparateLogFilesEnabled; +} + int getBackgroundImageOpacity() { return backgroundImageOpacity; } @@ -761,6 +770,7 @@ void load(const std::filesystem::path& path) { const toml::value& debug = data.at("Debug"); isDebugDump = toml::find_or(debug, "DebugDump", false); + isSeparateLogFilesEnabled = toml::find_or(debug, "isSeparateLogFilesEnabled", false); isShaderDebug = toml::find_or(debug, "CollectShader", false); isFpsColor = toml::find_or(debug, "FPSColor", true); } @@ -887,6 +897,7 @@ void save(const std::filesystem::path& path) { data["Vulkan"]["rdocEnable"] = rdocEnable; data["Debug"]["DebugDump"] = isDebugDump; data["Debug"]["CollectShader"] = isShaderDebug; + data["Debug"]["isSeparateLogFilesEnabled"] = isSeparateLogFilesEnabled; data["Debug"]["FPSColor"] = isFpsColor; data["Keys"]["TrophyKey"] = trophyKey; diff --git a/src/common/config.h b/src/common/config.h index 7b9bc789b..abf8da8aa 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -111,7 +111,8 @@ void setIsMotionControlsEnabled(bool use); void setLogType(const std::string& type); void setLogFilter(const std::string& type); - +void setSeparateLogFilesEnabled(bool enabled); +bool getSeparateLogFilesEnabled(); void setVkValidation(bool enable); void setVkSyncValidation(bool enable); void setRdocEnabled(bool enable); diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index 7802977f5..c16a5399a 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -139,8 +139,9 @@ public: std::filesystem::create_directory(log_dir); Filter filter; filter.ParseFilterString(Config::getLogFilter()); - instance = std::unique_ptr(new Impl(log_dir / LOG_FILE, filter), - Deleter); + const auto& log_file_path = log_file.empty() ? LOG_FILE : log_file; + instance = std::unique_ptr( + new Impl(log_dir / log_file_path, filter), Deleter); initialization_in_progress_suppress_logging = false; } diff --git a/src/emulator.cpp b/src/emulator.cpp index cd981add2..0f444c887 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -50,29 +50,6 @@ Emulator::Emulator() { SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); #endif - // Start logger. - Common::Log::Initialize(); - Common::Log::Start(); - LOG_INFO(Loader, "Starting shadps4 emulator v{} ", Common::VERSION); - LOG_INFO(Loader, "Revision {}", Common::g_scm_rev); - LOG_INFO(Loader, "Branch {}", Common::g_scm_branch); - LOG_INFO(Loader, "Description {}", Common::g_scm_desc); - LOG_INFO(Loader, "Remote {}", Common::g_scm_remote_url); - - LOG_INFO(Config, "General LogType: {}", Config::getLogType()); - LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole()); - LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu()); - LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders()); - LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv()); - LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId()); - LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled()); - LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled()); - LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled()); - LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::getVkCrashDiagnosticEnabled()); - LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::getVkHostMarkersEnabled()); - LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::getVkGuestMarkersEnabled()); - LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled()); - // Create stdin/stdout/stderr Common::Singleton::Instance()->CreateStdHandles(); @@ -90,9 +67,8 @@ Emulator::Emulator() { const auto user_dir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); QString filePath = QString::fromStdString((user_dir / "play_time.txt").string()); QFile file(filePath); - if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) { - LOG_INFO(Loader, "Error opening or creating play_time.txt"); - } + ASSERT_MSG(file.open(QIODevice::ReadWrite | QIODevice::Text), + "Error opening or creating play_time.txt"); #endif } @@ -138,6 +114,34 @@ void Emulator::Run(const std::filesystem::path& file, const std::vectorGetString("CONTENT_ID"); ASSERT_MSG(content_id.has_value(), "Failed to get CONTENT_ID"); id = std::string(*content_id, 7, 9); + + if (Config::getSeparateLogFilesEnabled()) { + Common::Log::Initialize(id + ".log"); + } + else { + Common::Log::Initialize(); + } + Common::Log::Start(); + LOG_INFO(Loader, "Starting shadps4 emulator v{} ", Common::VERSION); + LOG_INFO(Loader, "Revision {}", Common::g_scm_rev); + LOG_INFO(Loader, "Branch {}", Common::g_scm_branch); + LOG_INFO(Loader, "Description {}", Common::g_scm_desc); + LOG_INFO(Loader, "Remote {}", Common::g_scm_remote_url); + + LOG_INFO(Config, "General LogType: {}", Config::getLogType()); + LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole()); + LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu()); + LOG_INFO(Config, "GPU shouldDumpShaders: {}", Config::dumpShaders()); + LOG_INFO(Config, "GPU vblankDivider: {}", Config::vblankDiv()); + LOG_INFO(Config, "Vulkan gpuId: {}", Config::getGpuId()); + LOG_INFO(Config, "Vulkan vkValidation: {}", Config::vkValidationEnabled()); + LOG_INFO(Config, "Vulkan vkValidationSync: {}", Config::vkValidationSyncEnabled()); + LOG_INFO(Config, "Vulkan vkValidationGpu: {}", Config::vkValidationGpuEnabled()); + LOG_INFO(Config, "Vulkan crashDiagnostics: {}", Config::getVkCrashDiagnosticEnabled()); + LOG_INFO(Config, "Vulkan hostMarkers: {}", Config::getVkHostMarkersEnabled()); + LOG_INFO(Config, "Vulkan guestMarkers: {}", Config::getVkGuestMarkersEnabled()); + LOG_INFO(Config, "Vulkan rdocEnable: {}", Config::isRdocEnabled()); + Libraries::NpTrophy::game_serial = id; const auto trophyDir = Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / id / "TrophyFiles"; diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index bf09c979b..ce6f59937 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -425,6 +425,8 @@ void SettingsDialog::LoadValuesFromConfig() { QString::fromStdString(toml::find_or(data, "Keys", "TrophyKey", ""))); ui->trophyKeyLineEdit->setEchoMode(QLineEdit::Password); ui->debugDump->setChecked(toml::find_or(data, "Debug", "DebugDump", false)); + ui->separateLogFilesCheckbox->setChecked( + toml::find_or(data, "Debug", "isSeparateLogFilesEnabled", false)); ui->vkValidationCheckBox->setChecked(toml::find_or(data, "Vulkan", "validation", false)); ui->vkSyncValidationCheckBox->setChecked( toml::find_or(data, "Vulkan", "validation_sync", false)); @@ -648,7 +650,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { text = tr("Copy GPU Buffers:\\nGets around race conditions involving GPU submits.\\nMay or may not help with PM4 type 0 crashes."); } else if (elementName == "collectShaderCheckBox") { text = tr("Collect Shaders:\\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10)."); - } + } else if (elementName == "separateLogFilesCheckbox") { + text = tr("Separate Log Files:\\nWrites a separate logfile for each game.");} // clang-format on ui->descriptionText->setText(text.replace("\\n", "\n")); } @@ -700,6 +703,7 @@ void SettingsDialog::UpdateSettings() { Config::setLoadGameSizeEnabled(ui->gameSizeCheckBox->isChecked()); Config::setShowSplash(ui->showSplashCheckBox->isChecked()); Config::setDebugDump(ui->debugDump->isChecked()); + Config::setSeparateLogFilesEnabled(ui->separateLogFilesCheckbox->isChecked()); Config::setVkValidation(ui->vkValidationCheckBox->isChecked()); Config::setVkSyncValidation(ui->vkSyncValidationCheckBox->isChecked()); Config::setRdocEnabled(ui->rdocCheckBox->isChecked()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index fe8d6733e..2df328fbe 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -59,7 +59,7 @@ - 0 + 6 @@ -73,8 +73,8 @@ 0 0 - 946 - 536 + 718 + 332 @@ -454,8 +454,8 @@ 0 0 - 946 - 536 + 646 + 395 @@ -903,8 +903,8 @@ 0 0 - 946 - 536 + 545 + 141 @@ -1198,8 +1198,8 @@ 0 0 - 946 - 536 + 234 + 292 @@ -1342,8 +1342,8 @@ 0 0 - 946 - 536 + 455 + 252 @@ -1626,8 +1626,8 @@ 0 0 - 946 - 536 + 216 + 254 @@ -1888,39 +1888,50 @@ - - - Enable Crash Diagnostics - - - - - - - Collect Shaders - - - - - - - Copy GPU Buffers - - - - - - - Host Debug Markers - - - - - - - Guest Debug Markers - - + + + + + Collect Shaders + + + + + + + Copy GPU Buffers + + + + + + + Enable Crash Diagnostics + + + + + + + Host Debug Markers + + + + + + + Guest Debug Markers + + + + + + + Separate Log Files + + + + From 42dd79a32d2e7d105dcdcaa3493a7a323b25cef8 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 23 Feb 2025 22:41:55 +0200 Subject: [PATCH 344/455] clang-format fix --- src/emulator.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/emulator.cpp b/src/emulator.cpp index 0f444c887..68c1e332c 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -117,8 +117,7 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector Date: Sun, 23 Feb 2025 22:52:30 +0200 Subject: [PATCH 345/455] [ci skip] Qt GUI: Update Translation. (#2518) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 68 +++++++++++++++++++------------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 8d719977a..2571b265e 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Fullscreen Mode - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulator Language:\nSets the language of the emulator's user interface. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - - - - True - - Release @@ -1791,6 +1763,46 @@ Directory to save data + + Video + + + + Display Mode + + + + Windowed + + + + Fullscreen + + + + Fullscreen (Borderless) + + + + Window Size + + + + W: + + + + H: + + + + Separate Log Files + + + + Separate Log Files:\nWrites a separate logfile for each game. + + TrophyViewer From 07baf17c2ac73a74535f56522d218b34e77f790b Mon Sep 17 00:00:00 2001 From: Paris Oplopoios Date: Mon, 24 Feb 2025 06:02:52 +0200 Subject: [PATCH 346/455] Save rest of ymms in SaveContext (#2512) --- src/core/cpu_patches.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/cpu_patches.cpp b/src/core/cpu_patches.cpp index 65cd38b02..ceb0345b9 100644 --- a/src/core/cpu_patches.cpp +++ b/src/core/cpu_patches.cpp @@ -225,9 +225,9 @@ static void SaveContext(Xbyak::CodeGenerator& c, bool save_flags = false) { for (int reg = Xbyak::Operand::RAX; reg <= Xbyak::Operand::R15; reg++) { c.push(Xbyak::Reg64(reg)); } - for (int reg = 0; reg <= 7; reg++) { - c.lea(rsp, ptr[rsp - 32]); - c.vmovdqu(ptr[rsp], Xbyak::Ymm(reg)); + c.lea(rsp, ptr[rsp - 32 * 16]); + for (int reg = 0; reg <= 15; reg++) { + c.vmovdqu(ptr[rsp + 32 * reg], Xbyak::Ymm(reg)); } if (save_flags) { c.pushfq(); @@ -241,12 +241,12 @@ static void RestoreContext(Xbyak::CodeGenerator& c, const Xbyak::Operand& dst, if (restore_flags) { c.popfq(); } - for (int reg = 7; reg >= 0; reg--) { + for (int reg = 15; reg >= 0; reg--) { if ((!dst.isXMM() && !dst.isYMM()) || dst.getIdx() != reg) { - c.vmovdqu(Xbyak::Ymm(reg), ptr[rsp]); + c.vmovdqu(Xbyak::Ymm(reg), ptr[rsp + 32 * reg]); } - c.lea(rsp, ptr[rsp + 32]); } + c.lea(rsp, ptr[rsp + 32 * 16]); for (int reg = Xbyak::Operand::R15; reg >= Xbyak::Operand::RAX; reg--) { if (!dst.isREG() || dst.getIdx() != reg) { c.pop(Xbyak::Reg64(reg)); From bc0b42ee539113fdd4a8a41aca207f905dcd61d1 Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Mon, 24 Feb 2025 08:26:14 +0300 Subject: [PATCH 347/455] Update libatrac9 (#2524) --- externals/LibAtrac9 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/LibAtrac9 b/externals/LibAtrac9 index 9640129dc..ec8899dad 160000 --- a/externals/LibAtrac9 +++ b/externals/LibAtrac9 @@ -1 +1 @@ -Subproject commit 9640129dc6f2afbca6ceeca3019856e8653a5fb2 +Subproject commit ec8899dadf393f655f2871a94e0fe4b3d6220c9a From 47ac8b6c03197766c8c27589dbd7530c3c630dde Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Mon, 24 Feb 2025 18:41:57 +0800 Subject: [PATCH 348/455] Fix and add back Trophy type icons for both the trophy pop-up and viewer (#2522) * Add back fixed trophy type icons to trophy viewer * Remove unused declaration until it is needed again * Fix trophy pop-up icons * Adjust size and alignment based on trophy name length --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/core/libraries/np_trophy/trophy_ui.cpp | 54 +++++++++++++++++++--- src/qt_gui/trophy_viewer.cpp | 22 ++++----- src/qt_gui/trophy_viewer.h | 14 ++++++ 3 files changed, 72 insertions(+), 18 deletions(-) diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp index ab396ef6f..2b909e5cf 100644 --- a/src/core/libraries/np_trophy/trophy_ui.cpp +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -31,6 +31,22 @@ TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::strin fmt::UTF(trophyIconPath.u8string())); } + std::string pathString; + if (trophy_type == "P") { + pathString = "Resources/platinum.png"; + } else if (trophy_type == "G") { + pathString = "Resources/gold.png"; + } else if (trophy_type == "S") { + pathString = "Resources/silver.png"; + } else if (trophy_type == "B") { + pathString = "Resources/bronze.png"; + } + + auto resource = cmrc::res::get_filesystem(); + auto file = resource.open(pathString); + std::vector imgdata(file.begin(), file.end()); + trophy_type_icon = RefCountedTexture::DecodePngTexture(imgdata); + AddLayer(this); } @@ -59,9 +75,10 @@ void TrophyUI::Draw() { if (Begin("Trophy Window", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoInputs)) { - if (trophy_icon) { + if (trophy_type_icon) { SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); - Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); + Image(trophy_type_icon.GetTexture().im_id, + ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); ImGui::SameLine(); } else { // placeholder @@ -71,12 +88,35 @@ void TrophyUI::Draw() { ImGui::Indent(60); } - SetWindowFontScale((1.2 * AdjustHeight)); - char earned_text[] = "Trophy earned!\n%s"; - const float text_height = - ImGui::CalcTextSize(std::strcat(earned_text, trophy_name.c_str())).y; - SetCursorPosY((window_size.y - text_height) * 0.5f); + const std::string combinedString = "Trophy earned!\n%s" + trophy_name; + const float wrap_width = + CalcWrapWidthForPos(GetCursorScreenPos(), (window_size.x - (60 * AdjustWidth))); + SetWindowFontScale(1.2 * AdjustHeight); + // If trophy name exceeds 1 line + if (CalcTextSize(trophy_name.c_str()).x > wrap_width) { + SetCursorPosY(5 * AdjustHeight); + if (CalcTextSize(trophy_name.c_str()).x > (wrap_width * 2)) { + SetWindowFontScale(0.95 * AdjustHeight); + } else { + SetWindowFontScale(1.1 * AdjustHeight); + } + } else { + const float text_height = ImGui::CalcTextSize(combinedString.c_str()).y; + SetCursorPosY((window_size.y - text_height) * 0.5); + } + ImGui::PushTextWrapPos(window_size.x - (60 * AdjustWidth)); TextWrapped("Trophy earned!\n%s", trophy_name.c_str()); + ImGui::SameLine(window_size.x - (60 * AdjustWidth)); + + if (trophy_icon) { + SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); + Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); + } else { + // placeholder + const auto pos = GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight}, + GetColorU32(ImVec4{0.7f})); + } } End(); diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 4ec1392d8..9a0f33eed 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -118,18 +118,19 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { item->setData(Qt::DecorationRole, icon); item->setFlags(item->flags() & ~Qt::ItemIsEditable); tableWidget->setItem(row, 1, item); + + const std::string filename = GetTrpType(trpType[row].at(0)); QTableWidgetItem* typeitem = new QTableWidgetItem(); - QString type; - if (trpType[row] == "P") { - type = "Platinum"; - } else if (trpType[row] == "G") { - type = "Gold"; - } else if (trpType[row] == "S") { - type = "Silver"; - } else if (trpType[row] == "B") { - type = "Bronze"; - } + auto resource = cmrc::res::get_filesystem(); + std::string resourceString = "Resources/" + filename; + auto file = resource.open(resourceString); + std::vector imgdata(file.begin(), file.end()); + QImage type_icon = QImage::fromData(imgdata).scaled(QSize(64, 64), Qt::KeepAspectRatio, + Qt::SmoothTransformation); + typeitem->setData(Qt::DecorationRole, type_icon); + typeitem->setFlags(typeitem->flags() & ~Qt::ItemIsEditable); + tableWidget->setItem(row, 6, typeitem); std::string detailString = trophyDetails[row].toStdString(); std::size_t newline_pos = 0; @@ -144,7 +145,6 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { SetTableItem(tableWidget, row, 3, QString::fromStdString(detailString)); SetTableItem(tableWidget, row, 4, trpId[row]); SetTableItem(tableWidget, row, 5, trpHidden[row]); - SetTableItem(tableWidget, row, 6, type); SetTableItem(tableWidget, row, 7, trpPid[row]); } tableWidget->verticalHeader()->resizeSection(row, icon.height()); diff --git a/src/qt_gui/trophy_viewer.h b/src/qt_gui/trophy_viewer.h index 0e6894dc6..089de433e 100644 --- a/src/qt_gui/trophy_viewer.h +++ b/src/qt_gui/trophy_viewer.h @@ -31,4 +31,18 @@ private: QStringList headers; QString gameTrpPath_; TRP trp; + + std::string GetTrpType(const QChar trp_) { + switch (trp_.toLatin1()) { + case 'B': + return "bronze.png"; + case 'S': + return "silver.png"; + case 'G': + return "gold.png"; + case 'P': + return "platinum.png"; + } + return "Unknown"; + } }; From c9ba8e989eecc053ac8966f991d1471812942309 Mon Sep 17 00:00:00 2001 From: Randomuser8219 <168323856+Randomuser8219@users.noreply.github.com> Date: Mon, 24 Feb 2025 02:43:00 -0800 Subject: [PATCH 349/455] Fix capitalization mistake (#2521) --- src/qt_gui/translations/en_US.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 2571b265e..263267aba 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1361,7 +1361,7 @@ GUI - Gui + GUI User From ad683185157ea217deb41ca8d7ab0977a1bb1887 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 24 Feb 2025 12:43:12 +0200 Subject: [PATCH 350/455] New Crowdin updates (#2520) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Spanish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Polish) * New translations en_us.ts (Russian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Turkish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Italian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Russian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Russian) --- src/qt_gui/translations/ar_SA.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/da_DK.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/de_DE.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/el_GR.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/es_ES.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/fa_IR.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/fi_FI.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/fr_FR.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/hu_HU.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/id_ID.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/it_IT.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/ja_JP.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/ko_KR.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/lt_LT.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/nb_NO.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/nl_NL.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/pl_PL.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/pt_BR.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/pt_PT.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/ro_RO.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/ru_RU.ts | 70 +++++++++++++++++++------------- src/qt_gui/translations/sq_AL.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/sv_SE.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/tr_TR.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/uk_UA.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/vi_VN.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/zh_CN.ts | 68 ++++++++++++++++++------------- src/qt_gui/translations/zh_TW.ts | 68 ++++++++++++++++++------------- 28 files changed, 1121 insertions(+), 785 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 2c4535cf6..f1b16d4b0 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -1279,14 +1279,6 @@ Emulator المحاكي - - Enable Fullscreen - تمكين ملء الشاشة - - - Fullscreen Mode - وضع ملء الشاشة - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device جهاز الرسومات - - Width - العرض - - - Height - الارتفاع - Vblank Divider Vblank مقسم @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. لغة المحاكي:\nتحدد لغة واجهة المستخدم الخاصة بالمحاكي. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - تمكين وضع ملء الشاشة:\nيجعل نافذة اللعبة تنتقل تلقائيًا إلى وضع ملء الشاشة.\nيمكن التبديل بالضغط على المفتاح F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index b82b451bb..e6af07e74 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Fuldskærmstilstand - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulatorsprog:\nIndstiller sproget i emulatorens brugergrænseflade. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Aktiver fuld skærm:\nSætter automatisk spilvinduet i fuld skærm.\nDette kan skiftes ved at trykke på F11-tasten. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index b1251452c..5d57b6361 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Vollbild aktivieren - - - Fullscreen Mode - Vollbildmodus - Enable Separate Update Folder Separaten Update-Ordner aktivieren @@ -1379,14 +1371,6 @@ Graphics Device Grafikgerät - - Width - Breite - - - Height - Höhe - Vblank Divider Vblank-Teiler @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulatorsprache:\nLegt die Sprache der Emulator-Benutzeroberfläche fest. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Vollbildmodus aktivieren:\nSchaltet das Spielfenster automatisch in den Vollbildmodus.\nKann durch Drücken der F11-Taste umgeschaltet werden. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Separaten Update-Ordner aktivieren:\nErmöglicht die Installation von Spielaktualiserungen in einem separaten Ordner zur einfachen Verwaltung. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 8ecc06e6c..3d2763409 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Λειτουργία Πλήρους Οθόνης - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Γλώσσα Εξομοιωτή:\nΡυθμίζει τη γλώσσα του γραφικού περιβάλλοντος του εξομοιωτή. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Ενεργοποίηση Πλήρους Οθόνης:\nΑυτόματα μετατρέπει το παράθυρο του παιχνιδιού σε λειτουργία πλήρους οθόνης.\nΜπορεί να ενεργοποιηθεί/απενεργοποιηθεί πατώντας το πλήκτρο F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index e342bf51f..932d72d2a 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1279,14 +1279,6 @@ Emulator Emulador - - Enable Fullscreen - Habilitar pantalla completa - - - Fullscreen Mode - Modo de Pantalla Completa - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Dispositivo gráfico - - Width - Ancho - - - Height - Alto - Vblank Divider Divisor de Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Idioma del Emulador:\nConfigura el idioma de la interfaz de usuario del emulador. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Habilitar Pantalla Completa:\nColoca automáticamente la ventana del juego en modo de pantalla completa.\nEsto se puede alternar presionando la tecla F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 1cdddcf46..a173dc9d4 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1279,14 +1279,6 @@ Emulator شبیه ساز - - Enable Fullscreen - تمام صفحه - - - Fullscreen Mode - حالت تمام صفحه - Enable Separate Update Folder فعال‌سازی پوشه جداگانه برای به‌روزرسانی @@ -1379,14 +1371,6 @@ Graphics Device کارت گرافیک مورداستفاده - - Width - عرض - - - Height - طول - Vblank Divider تقسیم‌کننده Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. زبان شبیه‌ساز:\nزبان رابط کاربری شبیه‌ساز را انتخاب می‌کند. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - فعال‌سازی تمام صفحه:\nپنجره بازی را به‌طور خودکار به حالت تمام صفحه در می‌آورد.\nبرای تغییر این حالت می‌توانید کلید F11 را فشار دهید. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. فعال‌سازی پوشه جداگانه برای به‌روزرسانی:\nامکان نصب به‌روزرسانی‌های بازی در یک پوشه جداگانه برای مدیریت راحت‌تر را فراهم می‌کند. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 1b8ef4166..bcbbd07f6 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -1279,14 +1279,6 @@ Emulator Emulaattori - - Enable Fullscreen - Ota Käyttöön Koko Ruudun Tila - - - Fullscreen Mode - Koko näytön tila - Enable Separate Update Folder Ota Käyttöön Erillinen Päivityshakemisto @@ -1379,14 +1371,6 @@ Graphics Device Näytönohjain - - Width - Leveys - - - Height - Korkeus - Vblank Divider Vblank jakaja @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulaattorin Kieli:\nAsettaa emulaattorin käyttöliittymän kielen. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Ota Koko Näytön Tila Käyttöön:\nAvaa pelin ikkunan automaattisesti koko näytön tilassa.\nTilaa voi vaihtaa painamalla F11-näppäintä. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Ota Käyttöön Erillinen Päivityskansio:\nOttaa käyttöön päivitysten asennuksen erilliseen kansioon helpottamaan niiden hallintaa.\nTämä on tehtävissä manuaalisesti lisäämällä puretun päivityksen pelikansioon "CUSA00000-UPDATE" nimellä, missä CUSA ID vastaa pelin ID:tä. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index d328e9bcc..fef03d7bb 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -1279,14 +1279,6 @@ Emulator Émulateur - - Enable Fullscreen - Plein écran - - - Fullscreen Mode - Mode Plein Écran - Enable Separate Update Folder Dossier séparé pour les mises à jour @@ -1379,14 +1371,6 @@ Graphics Device Carte graphique - - Width - Largeur - - - Height - Hauteur - Vblank Divider Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Langue de l'émulateur:\nDéfinit la langue de l'interface utilisateur de l'émulateur. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Activer le mode plein écran:\nMet automatiquement la fenêtre du jeu en mode plein écran.\nCela peut être activé en appuyant sur la touche F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Dossier séparé pour les mises à jour:\nInstalle les mises à jours des jeux dans un dossier séparé pour une gestion plus facile. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 5be4a6658..93e266f2c 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1279,14 +1279,6 @@ Emulator Emulátor - - Enable Fullscreen - Teljes Képernyő Engedélyezése - - - Fullscreen Mode - Teljes képernyős mód - Enable Separate Update Folder Külön Frissítési Mappa Engedélyezése @@ -1379,14 +1371,6 @@ Graphics Device Grafikai Eszköz - - Width - Szélesség - - - Height - Magasság - Vblank Divider Vblank Elosztó @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulátor nyelve:\nBeállítja az emulátor felhasználói felületének nyelvét. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Teljes képernyő engedélyezése:\nAutomatikusan teljes képernyőre állítja a játék ablakát.\nEz a F11 billentyű megnyomásával kapcsolható ki/be. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Külön Frissítéi Mappa Engedélyezése:\nEngedélyezi a frissítések külön mappába helyezését, a könnyű kezelésük érdekében. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 81ae6b0ff..335450ca2 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Mode Layar Penuh - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Bahasa Emulator:\nMenetapkan bahasa antarmuka pengguna emulator. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Aktifkan Mode Layar Penuh:\nSecara otomatis menempatkan jendela permainan dalam mode layar penuh.\nIni dapat dinonaktifkan dengan menekan tombol F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index be61e0df2..fd1f4d521 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -1279,14 +1279,6 @@ Emulator Emulatore - - Enable Fullscreen - Abilita Schermo Intero - - - Fullscreen Mode - Modalità Schermo Intero - Enable Separate Update Folder Abilita Cartella Aggiornamenti Separata @@ -1379,14 +1371,6 @@ Graphics Device Scheda Grafica - - Width - Larghezza - - - Height - Altezza - Vblank Divider Divisore Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Lingua dell'Emulatore:\nImposta la lingua dell'interfaccia utente dell'emulatore. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Abilita Schermo Intero:\nMetti automaticamente la finestra di gioco in modalità schermo intero.\nQuesto può essere disattivato premendo il tasto F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Abilita Cartella Aggiornamenti Separata:\nAbilita l'installazione degli aggiornamenti in una cartella separata per una più facile gestione. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Esplora:\nEsplora una cartella da impostare come percorso dati di salvataggio. - - Borderless - Finestra senza bordi - - - True - Vero - Release Rilascio @@ -1791,6 +1763,46 @@ Directory to save data Cartella per salvare i dati + + Video + Video + + + Display Mode + Modalità di visualizzazione + + + Windowed + In finestra + + + Fullscreen + Schermo Intero + + + Fullscreen (Borderless) + Schermo Intero (Senza Bordi) + + + Window Size + Dimensione Finestra + + + W: + L: + + + H: + A: + + + Separate Log Files + File Di Registro Separati + + + Separate Log Files:\nWrites a separate logfile for each game. + File di registro separati:\nScrive un file di registro separato per ogni gioco. + TrophyViewer diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 8614fb79d..6e11dfe0c 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1279,14 +1279,6 @@ Emulator エミュレーター - - Enable Fullscreen - フルスクリーンを有効にする - - - Fullscreen Mode - 全画面モード - Enable Separate Update Folder アップデートフォルダの分離を有効化 @@ -1379,14 +1371,6 @@ Graphics Device グラフィックスデバイス - - Width - - - - Height - 高さ - Vblank Divider Vblankディバイダー @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. エミュレーターの言語:\nエミュレーターのユーザーインターフェースの言語を設定します。 - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - 全画面モードを有効にする:\nゲームウィンドウを自動的に全画面モードにします。\nF11キーを押すことで切り替えることができます。 - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nゲームのアップデートを別のフォルダにインストールすることで、管理が容易になります。 @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - ボーダーレス - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 98393050f..ad24f6f54 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - 전체 화면 모드 - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulator Language:\nSets the language of the emulator's user interface. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index b9be1abbd..c1886a4fa 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Viso ekranas - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emuliatoriaus kalba:\nNustato emuliatoriaus vartotojo sąsajos kalbą. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Įjungti visą ekraną:\nAutomatiškai perjungia žaidimo langą į viso ekrano režimą.\nTai galima išjungti paspaudus F11 klavišą. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 67e74b9b2..daf44c3bb 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Bruk fullskjerm - - - Fullscreen Mode - Fullskjermmodus - Enable Separate Update Folder Bruk seperat oppdateringsmappe @@ -1379,14 +1371,6 @@ Graphics Device Grafikkenhet - - Width - Bredde - - - Height - Høyde - Vblank Divider Vblank skillelinje @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulatorspråket:\nAngir språket for emulatorens brukergrensesnitt. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Bruk fullskjerm:\nSetter spillvinduet automatisk i fullskjermmodus.\nDette kan slås av ved å trykke på F11-tasten. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Bruk separat oppdateringsmappe:\n Gjør det mulig å installere spilloppdateringer i en egen mappe for enkel administrasjon.\nDette kan gjøres manuelt ved å legge til den utpakkede oppdateringen, til spillmappa med navnet "CUSA00000-UPDATE" der CUSA-ID-en samsvarer med spillets-ID. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Endre mappe:\nEndrer hvilken mappe shadPS4 skal lagre data til. - - Borderless - Kantløs - - - True - Sant - Release Offisiell @@ -1791,6 +1763,46 @@ Directory to save data Mappe for lagring av data + + Video + Video + + + Display Mode + Skjermmodus + + + Windowed + I vindu + + + Fullscreen + Fullskjerm + + + Fullscreen (Borderless) + Fullskjerm i vindu + + + Window Size + Vindustørrelse + + + W: + B: + + + H: + H: + + + Separate Log Files + Separate loggfiler + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate loggfiler:\nOppretter en separat loggfil for hvert spill. + TrophyViewer diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index e6497768e..762254a6e 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Volledig schermmodus - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulator Taal:\nStelt de taal van de gebruikersinterface van de emulator in. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Volledig scherm inschakelen:\nZet het gamevenster automatisch in de volledig scherm modus.\nDit kan worden omgeschakeld door op de F11-toets te drukken. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 379abe346..05ce4d9be 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Włącz pełny ekran - - - Fullscreen Mode - Tryb Pełnoekranowy - Enable Separate Update Folder Włącz oddzielny folder aktualizacji @@ -1379,14 +1371,6 @@ Graphics Device Karta graficzna - - Width - Szerokość - - - Height - Wysokość - Vblank Divider Dzielnik przerwy pionowej (Vblank) @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Język emulatora:\nUstala język interfejsu użytkownika emulatora. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Włącz tryb pełnoekranowy:\nAutomatycznie przełącza okno gry w tryb pełnoekranowy.\nMożna to wyłączyć naciskając klawisz F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Włącz oddzielny folder aktualizacji:\nUmożliwia instalowanie aktualizacji gier w oddzielnym folderze w celu łatwego zarządzania. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 6b92e74af..3ff4e106a 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1279,14 +1279,6 @@ Emulator Emulador - - Enable Fullscreen - Ativar Tela Cheia - - - Fullscreen Mode - Modo de Tela Cheia - Enable Separate Update Folder Ativar Pasta de Atualização Separada @@ -1379,14 +1371,6 @@ Graphics Device Placa de Vídeo - - Width - Largura - - - Height - Altura - Vblank Divider Divisor Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Idioma do emulador:\nDefine o idioma da interface do emulador. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Ativar Tela Cheia:\nAltera a janela do jogo para o modo tela cheia.\nIsso pode ser alterado pressionando a tecla F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Ativar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento.\nIsso pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome "CUSA00000-UPDATE" onde o ID do CUSA corresponde ao ID do jogo. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Procurar:\nProcure uma pasta para definir como o caminho para salvar dados. - - Borderless - Janela sem Bordas - - - True - Tela Cheia - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Diretório para salvar dados + + Video + Vídeo + + + Display Mode + Modo de Exibição + + + Windowed + Em Janela + + + Fullscreen + Tela Cheia + + + Fullscreen (Borderless) + Tela Cheia (Sem Bordas) + + + Window Size + Tamanho da Janela + + + W: + L: + + + H: + A: + + + Separate Log Files + Separar Arquivos de Log + + + Separate Log Files:\nWrites a separate logfile for each game. + Separar Arquivos de Log:\nGrava um arquivo de log para cada jogo. + TrophyViewer diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 0b5cd5632..e5cbedb96 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -1279,14 +1279,6 @@ Emulator Emulador - - Enable Fullscreen - Ativar Ecrã Inteiro - - - Fullscreen Mode - Modo de Ecrã Inteiro - Enable Separate Update Folder Ativar Pasta de Atualizações Separada @@ -1379,14 +1371,6 @@ Graphics Device Placa Gráfica - - Width - Largura - - - Height - Altura - Vblank Divider Divisor Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Idioma do Emulador:\nDefine o idioma da interface gráfica do emulador. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Ativar Ecrã Cheio:\nPõe automaticamente a janela do jogo no modo de ecrã cheio.\nIsto pode ser alterado pressionando a tecla F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Ativar Pasta de Atualização Separada:\nPermite instalar as atualizações dos jogos numa pasta separada para uma fácil gestão.\nIsto pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome "CUSA00000-UPDATE" onde o ID do CUSA corresponde ao ID do jogo. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Procurar:\nProcure uma pasta para definir como o caminho para guardar os dados. - - Borderless - Janela sem Bordas - - - True - Verdadeiro - Release Lançamento @@ -1791,6 +1763,46 @@ Directory to save data Diretório onde guardar os dados + + Video + Vídeo + + + Display Mode + Modo de Exibição + + + Windowed + Em Janela + + + Fullscreen + Ecrã inteiro + + + Fullscreen (Borderless) + Ecrã Inteiro (Sem Bordas) + + + Window Size + Tamanho da Janela + + + W: + L: + + + H: + A: + + + Separate Log Files + Separar Ficheiros de Registo + + + Separate Log Files:\nWrites a separate logfile for each game. + Separar Ficheiros de Registo:\nEscreve um ficheiro de registo para cada jogo. + TrophyViewer diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 4f74cb21d..4d9052261 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - Mod Ecran Complet - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Limba emulatorului:\nSetează limba interfeței utilizatorului a emulatorului. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Activează modul pe ecran complet:\nPune automat fereastra jocului în modul pe ecran complet.\nAceasta poate fi dezactivată apăsând tasta F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 71fd06b6f..d9e90d1a2 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1279,14 +1279,6 @@ Emulator Эмулятор - - Enable Fullscreen - Полноэкранный режим - - - Fullscreen Mode - Тип полноэкранного режима - Enable Separate Update Folder Отдельная папка обновлений @@ -1333,7 +1325,7 @@ Open Log Location - Открыть местоположение журнала + Открыть местоположение логов Input @@ -1379,14 +1371,6 @@ Graphics Device Графическое устройство - - Width - Ширина - - - Height - Высота - Vblank Divider Делитель Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Язык эмулятора:\nУстанавливает язык пользовательского интерфейса эмулятора. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Полноэкранный режим:\nАвтоматически переводит игровое окно в полноэкранный режим.\nЭто можно переключить, нажав клавишу F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Отдельная папка обновлений:\nПозволяет устанавливать обновления игры в отдельную папку для удобства.\nМожно создать вручную, добавив извлеченное обновление в папку с игрой с именем "CUSA00000-UPDATE", где идентификатор CUSA совпадает с идентификатором игры. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Обзор:\nНайдите папку, которую можно указать в качестве пути для сохранений. - - Borderless - Без полей - - - True - Истинный - Release Релиз @@ -1791,6 +1763,46 @@ Directory to save data Каталог для сохранений + + Video + Видео + + + Display Mode + Режим отображения + + + Windowed + Оконный + + + Fullscreen + Полный экран + + + Fullscreen (Borderless) + Полный экран (без рамок) + + + Window Size + Размер окна + + + W: + Ш: + + + H: + В: + + + Separate Log Files + Отдельные файлы логов + + + Separate Log Files:\nWrites a separate logfile for each game. + Отдельные файлы логов:\nПишет отдельный файл логов для каждой игры. + TrophyViewer diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 623b15604..ec07db041 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -1279,14 +1279,6 @@ Emulator Emulatori - - Enable Fullscreen - Aktivizo Ekranin e plotë - - - Fullscreen Mode - Mënyra me ekran të plotë - Enable Separate Update Folder Aktivizo dosjen e ndarë të përditësimit @@ -1379,14 +1371,6 @@ Graphics Device Pajisja e Grafikës - - Width - Gjerësia - - - Height - Lartësia - Vblank Divider Ndarës Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Gjuha e emulatorit:\nPërcakton gjuhën e ndërfaqes së përdoruesit të emulatorit. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Aktivizo ekranin e plotë:\nVendos automatikisht dritaren e lojës në mënyrën e ekranit të plotë.\nKjo mund të aktivizohet duke shtypur tastin F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Aktivizo dosjen e ndarë të përditësimit:\nAktivizon instalimin e përditësimeve të lojërave në dosje të veçanta për menaxhim më të lehtë.\nKjo mund të krijohet manualisht duke shtuar përditësimin e shpaketuar në dosjen e lojës me emrin "CUSA00000-UPDATE" ku ID-ja CUSA përputhet me ID-në e lojës. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Shfleto:\nShfleto për të vendosur një dosje si shteg të ruajtjes së të dhënave. - - Borderless - Pa kufij - - - True - Vërtetë - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Dosja për të ruajtur të dhënat + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index c7d83055a..bdd2d2aa0 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Aktivera helskärm - - - Fullscreen Mode - Helskärmsläge - Enable Separate Update Folder Aktivera separat uppdateringsmapp @@ -1379,14 +1371,6 @@ Graphics Device Grafikenhet - - Width - Bredd - - - Height - Höjd - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emulatorspråk:\nStäller in språket för emulatorns användargränssnitt - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Aktivera helskärm:\nStäller automatiskt in spelfönstret till helskämsläget.\nDetta kan växlas genom att trycka på F11-tangenten - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Aktivera separat uppdateringsmapp:\nAktiverar installation av speluppdateringar i en separat mapp för enkel hantering.\nDetta kan skapas manuellt genom att lägga till uppackad uppdatering till spelmappen med namnet "CUSA00000-UPDATE" där CUSA ID matchar spelets id @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Bläddra:\nBläddra efter en mapp att ställa in som sökväg för sparat data - - Borderless - Fönster utan kanter - - - True - Sant - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Katalog för sparat data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 0ecddb128..ac7dee9a4 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1279,14 +1279,6 @@ Emulator Emülatör - - Enable Fullscreen - Tam Ekranı Etkinleştir - - - Fullscreen Mode - Tam Ekran Modu - Enable Separate Update Folder Ayrı Güncelleme Klasörünü Etkinleştir @@ -1379,14 +1371,6 @@ Graphics Device Grafik Cihazı - - Width - Genişlik - - - Height - Yükseklik - Vblank Divider Vblank Bölücü @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Emülatör Dili:\nEmülatörün kullanıcı arayüzünün dilini ayarlar. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Tam Ekranı Etkinleştir:\nOyun penceresini otomatik olarak tam ekran moduna alır.\nBu, F11 tuşuna basarak geçiş yapılabilir. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Gözat:\nVerileri kaydetme yolu olarak ayarlamak için bir klasöre göz atın. - - Borderless - Çerçevesiz - - - True - Gerçek Ekran - Release Kararlı @@ -1791,6 +1763,46 @@ Directory to save data Kayıt verilerinin tutulacağı dizin + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Tam Ekran + + + Fullscreen (Borderless) + Tam Ekran (Kenarlıksız) + + + Window Size + Pencere Boyutu + + + W: + G: + + + H: + Y: + + + Separate Log Files + Ayrı Günlük Dosyaları + + + Separate Log Files:\nWrites a separate logfile for each game. + Ayrı Günlük Dosyaları:\nHer oyun için ayrı bir günlük dosyası yazar. + TrophyViewer diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index aa430d401..0a3865d49 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1279,14 +1279,6 @@ Emulator Емулятор - - Enable Fullscreen - Увімкнути повноекранний режим - - - Fullscreen Mode - Тип повноекранного режиму - Enable Separate Update Folder Увімкнути окрему папку оновлень @@ -1379,14 +1371,6 @@ Graphics Device Графічний пристрій - - Width - Ширина - - - Height - Висота - Vblank Divider Розділювач Vblank @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Мова емулятора:\nВстановіть мову користувацького інтерфейсу емулятора. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Повноекранний режим:\nАвтоматично переводить вікно гри у повноекранний режим.\nВи можете відключити це, натиснувши клавішу F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Окрема папка для оновлень:\nДає змогу встановлювати оновлення гри в окрему папку для зручності. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Вибрати:\nВиберіть папку для ігрових збережень. - - Borderless - Без рамок - - - True - Повний екран - Release Релізний @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index cccec7ae0..50a34ad7a 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1279,14 +1279,6 @@ Emulator Trình giả lập - - Enable Fullscreen - Bật toàn màn hình - - - Fullscreen Mode - Chế độ Toàn màn hình - Enable Separate Update Folder Bật thư mục cập nhật riêng @@ -1379,14 +1371,6 @@ Graphics Device Thiết bị đồ họa - - Width - Rộng - - - Height - Cao - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. Ngôn ngữ của trình giả lập:\nChọn ngôn ngữ của giao diện người dùng của trình giả lập. - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - Bật chế độ toàn màn hình:\nTự động đặt cửa sổ trò chơi ở chế độ toàn màn hình.\nĐiều này có thể bị vô hiệu hóa bằng cách nhấn phím F11. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Không viền - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Thư mục để lưu dữ liệu + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 2c5d5005e..b855f2dcd 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1279,14 +1279,6 @@ Emulator 模拟器 - - Enable Fullscreen - 启用全屏 - - - Fullscreen Mode - 全屏模式 - Enable Separate Update Folder 启用单独的更新目录 @@ -1379,14 +1371,6 @@ Graphics Device 图形设备 - - Width - 宽度 - - - Height - 高度 - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. 模拟器语言:\n设置模拟器用户界面的语言。 - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - 启用全屏:\n以全屏模式启动游戏。\n您可以按 F11 键切换回窗口模式。 - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. 启用单独的更新目录:\n启用安装游戏更新到一个单独的目录中以更便于管理。 @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. 浏览:\n选择一个目录保存游戏存档数据。 - - Borderless - 无边框全屏 - - - True - 真全屏 - Release 稳定版 @@ -1791,6 +1763,46 @@ Directory to save data 存档数据目录 + + Video + 显示 + + + Display Mode + 显示模式 + + + Windowed + 窗口 + + + Fullscreen + 全屏 + + + Fullscreen (Borderless) + 无边框全屏 + + + Window Size + 窗口大小 + + + W: + 宽: + + + H: + 高: + + + Separate Log Files + 独立日志文件 + + + Separate Log Files:\nWrites a separate logfile for each game. + 独立日志文件:\n每个游戏使用单独的日志文件。 + TrophyViewer diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 82202a6d6..15c921d15 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1279,14 +1279,6 @@ Emulator Emulator - - Enable Fullscreen - Enable Fullscreen - - - Fullscreen Mode - 全螢幕模式 - Enable Separate Update Folder Enable Separate Update Folder @@ -1379,14 +1371,6 @@ Graphics Device Graphics Device - - Width - Width - - - Height - Height - Vblank Divider Vblank Divider @@ -1559,10 +1543,6 @@ Emulator Language:\nSets the language of the emulator's user interface. 模擬器語言:\n設定模擬器的用戶介面的語言。 - - Enable Full Screen:\nAutomatically puts the game window into full-screen mode.\nThis can be toggled by pressing the F11 key. - 啟用全螢幕:\n自動將遊戲視窗設置為全螢幕模式。\n可以按F11鍵進行切換。 - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management. @@ -1739,14 +1719,6 @@ Browse:\nBrowse for a folder to set as the save data path. Browse:\nBrowse for a folder to set as the save data path. - - Borderless - Borderless - - - True - True - Release Release @@ -1791,6 +1763,46 @@ Directory to save data Directory to save data + + Video + Video + + + Display Mode + Display Mode + + + Windowed + Windowed + + + Fullscreen + Fullscreen + + + Fullscreen (Borderless) + Fullscreen (Borderless) + + + Window Size + Window Size + + + W: + W: + + + H: + H: + + + Separate Log Files + Separate Log Files + + + Separate Log Files:\nWrites a separate logfile for each game. + Separate Log Files:\nWrites a separate logfile for each game. + TrophyViewer From f975c0603c0e5f4e36964150024bf107c9706d2e Mon Sep 17 00:00:00 2001 From: smiRaphi <87574679+smiRaphi@users.noreply.github.com> Date: Mon, 24 Feb 2025 11:44:22 +0100 Subject: [PATCH 351/455] change sizeof to TmpMount.size (#2523) Co-authored-by: smiRaphi --- src/core/libraries/app_content/app_content.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/libraries/app_content/app_content.cpp b/src/core/libraries/app_content/app_content.cpp index 1223022c5..fad270e2b 100644 --- a/src/core/libraries/app_content/app_content.cpp +++ b/src/core/libraries/app_content/app_content.cpp @@ -323,7 +323,7 @@ int PS4_SYSV_ABI sceAppContentTemporaryDataMount2(OrbisAppContentTemporaryDataOp return ORBIS_APP_CONTENT_ERROR_PARAMETER; } static constexpr std::string_view TmpMount = "/temp0"; - TmpMount.copy(mountPoint->data, sizeof(mountPoint->data)); + TmpMount.copy(mountPoint->data, TmpMount.size()); LOG_INFO(Lib_AppContent, "sceAppContentTemporaryDataMount2: option = {}, mountPoint = {}", option, mountPoint->data); return ORBIS_OK; From 0885d8fce7e76e639ab1d28768c1f1f44773e2cf Mon Sep 17 00:00:00 2001 From: Paris Oplopoios Date: Mon, 24 Feb 2025 12:53:11 +0200 Subject: [PATCH 352/455] Simplify ANDN (#2511) --- src/core/cpu_patches.cpp | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/core/cpu_patches.cpp b/src/core/cpu_patches.cpp index ceb0345b9..21acf1a7b 100644 --- a/src/core/cpu_patches.cpp +++ b/src/core/cpu_patches.cpp @@ -264,16 +264,37 @@ static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat const auto src1 = ZydisToXbyakRegisterOperand(operands[1]); const auto src2 = ZydisToXbyakOperand(operands[2]); - const auto scratch = AllocateScratchRegister({&dst, &src1, src2.get()}, dst.getBit()); + // Check if src2 is a memory operand or a register different to dst. + // In those cases, we don't need to use a temporary register and are free to modify dst. + // In cases where dst and src2 are the same register, a temporary needs to be used to avoid + // modifying src2. + bool src2_uses_dst = false; + if (src2->isMEM()) { + const auto base = src2->getAddress().getRegExp().getBase().getIdx(); + const auto index = src2->getAddress().getRegExp().getIndex().getIdx(); + src2_uses_dst = base == dst.getIdx() || index == dst.getIdx(); + } else { + ASSERT(src2->isREG()); + src2_uses_dst = src2->getReg() == dst; + } - SaveRegisters(c, {scratch}); + if (!src2_uses_dst) { + if (dst != src1) + c.mov(dst, src1); + c.not_(dst); + c.and_(dst, *src2); + } else { + const auto scratch = AllocateScratchRegister({&dst, &src1, src2.get()}, dst.getBit()); - c.mov(scratch, src1); - c.not_(scratch); - c.and_(scratch, *src2); - c.mov(dst, scratch); + SaveRegisters(c, {scratch}); - RestoreRegisters(c, {scratch}); + c.mov(scratch, src1); + c.not_(scratch); + c.and_(scratch, *src2); + c.mov(dst, scratch); + + RestoreRegisters(c, {scratch}); + } } static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { From 76b4da6212752b678e351b8df404c3f7d5e6acf5 Mon Sep 17 00:00:00 2001 From: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Mon, 24 Feb 2025 14:31:12 +0200 Subject: [PATCH 353/455] video_core: Various small improvements and bug fixes (#2525) * ir_passes: Add barrier at end of block too * vk_platform: Always assign names to resources * texture_cache: Better overlap handling * liverpool: Avoid resuming ce_task when its finished * spirv_quad_rect: Skip default attributes Fixes some crashes * memory: Improve buffer size clamping * liverpool: Relax binary header validity check * liverpool: Stub SetPredication with a warning * Better than outright crash * emit_spirv: Implement round to zero mode * liverpool: queue::pop takes the front element * image_info: Remove obsolete assert The old code assumed the mip only had 1 layer thus a right overlap could not return mip 0. But with the new path we handle images that are both mip-mapped and multi-layer, thus this can happen * tile_manager: Fix size calculation * spirv_quad_rect: Skip default attributes --------- Co-authored-by: poly <47796739+polybiusproxy@users.noreply.github.com> Co-authored-by: squidbus <175574877+squidbus@users.noreply.github.com> --- src/core/libraries/playgo/playgo.cpp | 7 +- src/core/memory.cpp | 18 +++-- .../backend/spirv/emit_spirv.cpp | 7 +- .../backend/spirv/emit_spirv_quad_rect.cpp | 19 +++--- .../ir/passes/shared_memory_barrier_pass.cpp | 4 ++ src/shader_recompiler/profile.h | 1 + src/video_core/amdgpu/liverpool.cpp | 18 +++-- src/video_core/amdgpu/liverpool.h | 3 +- src/video_core/buffer_cache/buffer_cache.cpp | 9 +-- .../renderer_vulkan/vk_pipeline_cache.cpp | 1 + src/video_core/renderer_vulkan/vk_platform.h | 9 --- src/video_core/texture_cache/image.cpp | 9 +-- src/video_core/texture_cache/image.h | 2 +- src/video_core/texture_cache/image_info.cpp | 19 +++--- src/video_core/texture_cache/image_info.h | 4 +- .../texture_cache/texture_cache.cpp | 67 ++++++++++--------- src/video_core/texture_cache/tile_manager.cpp | 3 +- 17 files changed, 112 insertions(+), 88 deletions(-) diff --git a/src/core/libraries/playgo/playgo.cpp b/src/core/libraries/playgo/playgo.cpp index ade2ee496..aec32e139 100644 --- a/src/core/libraries/playgo/playgo.cpp +++ b/src/core/libraries/playgo/playgo.cpp @@ -137,9 +137,6 @@ s32 PS4_SYSV_ABI scePlayGoGetLanguageMask(OrbisPlayGoHandle handle, s32 PS4_SYSV_ABI scePlayGoGetLocus(OrbisPlayGoHandle handle, const OrbisPlayGoChunkId* chunkIds, uint32_t numberOfEntries, OrbisPlayGoLocus* outLoci) { - LOG_DEBUG(Lib_PlayGo, "called handle = {}, chunkIds = {}, numberOfEntries = {}", handle, - *chunkIds, numberOfEntries); - if (handle != PlaygoHandle) { return ORBIS_PLAYGO_ERROR_BAD_HANDLE; } @@ -149,6 +146,10 @@ s32 PS4_SYSV_ABI scePlayGoGetLocus(OrbisPlayGoHandle handle, const OrbisPlayGoCh if (numberOfEntries == 0) { return ORBIS_PLAYGO_ERROR_BAD_SIZE; } + + LOG_DEBUG(Lib_PlayGo, "called handle = {}, chunkIds = {}, numberOfEntries = {}", handle, + *chunkIds, numberOfEntries); + if (!playgo) { return ORBIS_PLAYGO_ERROR_NOT_INITIALIZED; } diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 017b77cdb..98d587e00 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -57,15 +57,25 @@ void MemoryManager::SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1 } u64 MemoryManager::ClampRangeSize(VAddr virtual_addr, u64 size) { - static constexpr u64 MinSizeToClamp = 1_GB; + static constexpr u64 MinSizeToClamp = 512_MB; // Dont bother with clamping if the size is small so we dont pay a map lookup on every buffer. if (size < MinSizeToClamp) { return size; } - const auto vma = FindVMA(virtual_addr); + + // Clamp size to the remaining size of the current VMA. + auto vma = FindVMA(virtual_addr); ASSERT_MSG(vma != vma_map.end(), "Attempted to access invalid GPU address {:#x}", virtual_addr); - const u64 clamped_size = - std::min(size, vma->second.base + vma->second.size - virtual_addr); + u64 clamped_size = vma->second.base + vma->second.size - virtual_addr; + ++vma; + + // Keep adding to the size while there is contigious virtual address space. + while (!vma->second.IsFree() && clamped_size < size) { + clamped_size += vma->second.size; + ++vma; + } + clamped_size = std::min(clamped_size, size); + if (size != clamped_size) { LOG_WARNING(Kernel_Vmm, "Clamped requested buffer range addr={:#x}, size={:#x} to {:#x}", virtual_addr, size, clamped_size); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 2a5b9335e..6b0d7228b 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -369,7 +369,12 @@ void SetupFloatMode(EmitContext& ctx, const Profile& profile, const RuntimeInfo& LOG_WARNING(Render_Vulkan, "Unknown FP denorm mode {}", u32(fp_denorm_mode)); } const auto fp_round_mode = runtime_info.fp_round_mode32; - if (fp_round_mode != AmdGpu::FpRoundMode::NearestEven) { + if (fp_round_mode == AmdGpu::FpRoundMode::ToZero) { + if (profile.support_fp32_round_to_zero) { + ctx.AddCapability(spv::Capability::RoundingModeRTZ); + ctx.AddExecutionMode(main_func, spv::ExecutionMode::RoundingModeRTZ, 32U); + } + } else if (fp_round_mode != AmdGpu::FpRoundMode::NearestEven) { LOG_WARNING(Render_Vulkan, "Unknown FP rounding mode {}", u32(fp_round_mode)); } } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp index e74044f63..48aa9f870 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp @@ -13,8 +13,7 @@ constexpr u32 SPIRV_VERSION_1_5 = 0x00010500; struct QuadRectListEmitter : public Sirit::Module { explicit QuadRectListEmitter(const FragmentRuntimeInfo& fs_info_) - : Sirit::Module{SPIRV_VERSION_1_5}, fs_info{fs_info_}, inputs{fs_info_.num_inputs}, - outputs{fs_info_.num_inputs} { + : Sirit::Module{SPIRV_VERSION_1_5}, fs_info{fs_info_} { void_id = TypeVoid(); bool_id = TypeBool(); float_id = TypeFloat(32); @@ -253,15 +252,16 @@ private: } else { gl_per_vertex = AddOutput(gl_per_vertex_type); } + outputs.reserve(fs_info.num_inputs); for (int i = 0; i < fs_info.num_inputs; i++) { const auto& input = fs_info.inputs[i]; if (input.IsDefault()) { continue; } - outputs[i] = AddOutput(model == spv::ExecutionModel::TessellationControl - ? TypeArray(vec4_id, Int(4)) - : vec4_id); - Decorate(outputs[i], spv::Decoration::Location, input.param_index); + outputs.emplace_back(AddOutput(model == spv::ExecutionModel::TessellationControl + ? TypeArray(vec4_id, Int(4)) + : vec4_id)); + Decorate(outputs.back(), spv::Decoration::Location, input.param_index); } } @@ -276,13 +276,14 @@ private: const Id gl_per_vertex_array{TypeArray(gl_per_vertex_type, Constant(uint_id, 32U))}; gl_in = AddInput(gl_per_vertex_array); const Id float_arr{TypeArray(vec4_id, Int(32))}; + inputs.reserve(fs_info.num_inputs); for (int i = 0; i < fs_info.num_inputs; i++) { const auto& input = fs_info.inputs[i]; if (input.IsDefault()) { continue; } - inputs[i] = AddInput(float_arr); - Decorate(inputs[i], spv::Decoration::Location, input.param_index); + inputs.emplace_back(AddInput(float_arr)); + Decorate(inputs.back(), spv::Decoration::Location, input.param_index); } } @@ -334,4 +335,4 @@ std::vector EmitAuxilaryTessShader(AuxShaderType type, const FragmentRuntim return ctx.Assemble(); } -} // namespace Shader::Backend::SPIRV \ No newline at end of file +} // namespace Shader::Backend::SPIRV diff --git a/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp b/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp index 0ee52cf19..baf6ad0d1 100644 --- a/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp +++ b/src/shader_recompiler/ir/passes/shared_memory_barrier_pass.cpp @@ -43,6 +43,10 @@ static void EmitBarrierInBlock(IR::Block* block) { action = BarrierAction::BarrierOnRead; } } + if (action != BarrierAction::None) { + IR::IREmitter ir{*block, --block->end()}; + ir.Barrier(); + } } // Inserts a barrier after divergent conditional blocks to avoid undefined diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index 43d2b87d4..1ceaea664 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -21,6 +21,7 @@ struct Profile { bool support_separate_rounding_mode{}; bool support_fp32_denorm_preserve{}; bool support_fp32_denorm_flush{}; + bool support_fp32_round_to_zero{}; bool support_explicit_workgroup_layout{}; bool support_legacy_vertex_attributes{}; bool supports_image_load_store_lod{}; diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 2f40d4136..246c8c947 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -93,17 +93,14 @@ void Liverpool::Process(std::stop_token stoken) { // Process incoming commands with high priority while (num_commands) { - Common::UniqueFunction callback{}; { std::unique_lock lk{submit_mutex}; - callback = std::move(command_queue.back()); + callback = std::move(command_queue.front()); command_queue.pop(); + --num_commands; } - callback(); - - --num_commands; } curr_qid = (curr_qid + 1) % num_mapped_queues; @@ -395,6 +392,10 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(header); regs.index_buffer_type.raw = index_type->raw; @@ -670,6 +671,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::spanIsVoLabel(wait_addr) && num_submits == mapped_queues[GfxQueueId].submits.size()) { vo_port->WaitVoLabel([&] { return wait_reg_mem->Test(); }); + break; } while (!wait_reg_mem->Test()) { YIELD_GFX(); @@ -693,7 +695,7 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span dcb, std::span> m, 1u) : 1u; const auto& [mip_size, mip_pitch, mip_height, mip_ofs] = image.info.mips_layout[m]; - offset += mip_ofs * num_layers; - if (offset + (mip_size * num_layers) > max_offset) { + offset += mip_ofs; + if (offset + mip_size > max_offset) { break; } copies.push_back({ diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 3db22d585..4823b8ffe 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -196,6 +196,7 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, .subgroup_size = instance.SubgroupSize(), .support_fp32_denorm_preserve = bool(vk12_props.shaderDenormPreserveFloat32), .support_fp32_denorm_flush = bool(vk12_props.shaderDenormFlushToZeroFloat32), + .support_fp32_round_to_zero = bool(vk12_props.shaderRoundingModeRTZFloat32), .support_explicit_workgroup_layout = true, .support_legacy_vertex_attributes = instance_.IsLegacyVertexAttributesSupported(), .supports_image_load_store_lod = instance_.IsImageLoadStoreLodSupported(), diff --git a/src/video_core/renderer_vulkan/vk_platform.h b/src/video_core/renderer_vulkan/vk_platform.h index 4e9587e46..0f70312ed 100644 --- a/src/video_core/renderer_vulkan/vk_platform.h +++ b/src/video_core/renderer_vulkan/vk_platform.h @@ -3,11 +3,8 @@ #pragma once -#include -#include #include -#include "common/config.h" #include "common/logging/log.h" #include "common/types.h" #include "video_core/renderer_vulkan/vk_common.h" @@ -33,9 +30,6 @@ concept VulkanHandleType = vk::isVulkanHandleType::value; template void SetObjectName(vk::Device device, const HandleType& handle, std::string_view debug_name) { - if (!Config::getVkHostMarkersEnabled()) { - return; - } const vk::DebugUtilsObjectNameInfoEXT name_info = { .objectType = HandleType::objectType, .objectHandle = reinterpret_cast(static_cast(handle)), @@ -50,9 +44,6 @@ void SetObjectName(vk::Device device, const HandleType& handle, std::string_view template void SetObjectName(vk::Device device, const HandleType& handle, const char* format, const Args&... args) { - if (!Config::getVkHostMarkersEnabled()) { - return; - } const std::string debug_name = fmt::vformat(format, fmt::make_format_args(args...)); SetObjectName(device, handle, debug_name); } diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp index 96881c564..3c85c451c 100644 --- a/src/video_core/texture_cache/image.cpp +++ b/src/video_core/texture_cache/image.cpp @@ -394,7 +394,7 @@ void Image::CopyImage(const Image& image) { vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eTransferRead, {}); } -void Image::CopyMip(const Image& image, u32 mip) { +void Image::CopyMip(const Image& image, u32 mip, u32 slice) { scheduler->EndRendering(); Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}); @@ -407,18 +407,19 @@ void Image::CopyMip(const Image& image, u32 mip) { ASSERT(mip_w == image.info.size.width); ASSERT(mip_h == image.info.size.height); + const u32 num_layers = std::min(image.info.resources.layers, info.resources.layers); const vk::ImageCopy image_copy{ .srcSubresource{ .aspectMask = image.aspect_mask, .mipLevel = 0, .baseArrayLayer = 0, - .layerCount = image.info.resources.layers, + .layerCount = num_layers, }, .dstSubresource{ .aspectMask = image.aspect_mask, .mipLevel = mip, - .baseArrayLayer = 0, - .layerCount = info.resources.layers, + .baseArrayLayer = slice, + .layerCount = num_layers, }, .extent = {mip_w, mip_h, mip_d}, }; diff --git a/src/video_core/texture_cache/image.h b/src/video_core/texture_cache/image.h index b04fd188c..66d65ceec 100644 --- a/src/video_core/texture_cache/image.h +++ b/src/video_core/texture_cache/image.h @@ -104,7 +104,7 @@ struct Image { void Upload(vk::Buffer buffer, u64 offset); void CopyImage(const Image& image); - void CopyMip(const Image& image, u32 mip); + void CopyMip(const Image& src_image, u32 mip, u32 slice); bool IsTracked() { return track_addr != 0 && track_addr_end != 0; diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 852ade1f0..60c52c666 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -208,15 +208,14 @@ void ImageInfo::UpdateSize() { mip_info.pitch = std::max(mip_info.pitch * 4, 32u); mip_info.height = std::max(mip_info.height * 4, 32u); } - mip_info.size *= mip_d; + mip_info.size *= mip_d * resources.layers; mip_info.offset = guest_size; mips_layout.emplace_back(mip_info); guest_size += mip_info.size; } - guest_size *= resources.layers; } -int ImageInfo::IsMipOf(const ImageInfo& info) const { +s32 ImageInfo::MipOf(const ImageInfo& info) const { if (!IsCompatible(info)) { return -1; } @@ -237,7 +236,12 @@ int ImageInfo::IsMipOf(const ImageInfo& info) const { // Find mip auto mip = -1; for (auto m = 0; m < info.mips_layout.size(); ++m) { - if (guest_address == (info.guest_address + info.mips_layout[m].offset)) { + const auto& [mip_size, mip_pitch, mip_height, mip_ofs] = info.mips_layout[m]; + const VAddr mip_base = info.guest_address + mip_ofs; + const VAddr mip_end = mip_base + mip_size; + const u32 slice_size = mip_size / info.resources.layers; + if (guest_address >= mip_base && guest_address < mip_end && + (guest_address - mip_base) % slice_size == 0) { mip = m; break; } @@ -246,7 +250,6 @@ int ImageInfo::IsMipOf(const ImageInfo& info) const { if (mip < 0) { return -1; } - ASSERT(mip != 0); const auto mip_w = std::max(info.size.width >> mip, 1u); const auto mip_h = std::max(info.size.height >> mip, 1u); @@ -269,7 +272,7 @@ int ImageInfo::IsMipOf(const ImageInfo& info) const { return mip; } -int ImageInfo::IsSliceOf(const ImageInfo& info) const { +s32 ImageInfo::SliceOf(const ImageInfo& info, s32 mip) const { if (!IsCompatible(info)) { return -1; } @@ -285,13 +288,13 @@ int ImageInfo::IsSliceOf(const ImageInfo& info) const { } // Check for size alignment. - const bool slice_size = info.guest_size / info.resources.layers; + const u32 slice_size = info.mips_layout[mip].size / info.resources.layers; if (guest_size % slice_size != 0) { return -1; } // Ensure that address is aligned too. - const auto addr_diff = guest_address - info.guest_address; + const auto addr_diff = guest_address - (info.guest_address + info.mips_layout[mip].offset); if ((addr_diff % guest_size) != 0) { return -1; } diff --git a/src/video_core/texture_cache/image_info.h b/src/video_core/texture_cache/image_info.h index dad0e751e..ca4d9f5e9 100644 --- a/src/video_core/texture_cache/image_info.h +++ b/src/video_core/texture_cache/image_info.h @@ -30,8 +30,8 @@ struct ImageInfo { bool IsDepthStencil() const; bool HasStencil() const; - int IsMipOf(const ImageInfo& info) const; - int IsSliceOf(const ImageInfo& info) const; + s32 MipOf(const ImageInfo& info) const; + s32 SliceOf(const ImageInfo& info, s32 mip) const; /// Verifies if images are compatible for subresource merging. bool IsCompatible(const ImageInfo& info) const { diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index ecac78847..d41ee57cc 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -223,16 +223,13 @@ std::tuple TextureCache::ResolveOverlap(const ImageInfo& imag // Right overlap, the image requested is a possible subresource of the image from cache. if (image_info.guest_address > tex_cache_image.info.guest_address) { - if (auto mip = image_info.IsMipOf(tex_cache_image.info); mip >= 0) { - return {cache_image_id, mip, -1}; + if (auto mip = image_info.MipOf(tex_cache_image.info); mip >= 0) { + if (auto slice = image_info.SliceOf(tex_cache_image.info, mip); slice >= 0) { + return {cache_image_id, mip, slice}; + } } - if (auto slice = image_info.IsSliceOf(tex_cache_image.info); slice >= 0) { - return {cache_image_id, -1, slice}; - } - - // TODO: slice and mip - + // Image isn't a subresource but a chance overlap. if (safe_to_delete) { FreeImage(cache_image_id); } @@ -240,31 +237,33 @@ std::tuple TextureCache::ResolveOverlap(const ImageInfo& imag return {{}, -1, -1}; } else { // Left overlap, the image from cache is a possible subresource of the image requested - if (auto mip = tex_cache_image.info.IsMipOf(image_info); mip >= 0) { - if (tex_cache_image.binding.is_target) { - // We have a larger image created and a separate one, representing a subres of it, - // bound as render target. In this case we need to rebind render target. - tex_cache_image.binding.needs_rebind = 1u; - if (merged_image_id) { - GetImage(merged_image_id).binding.is_target = 1u; + if (auto mip = tex_cache_image.info.MipOf(image_info); mip >= 0) { + if (auto slice = tex_cache_image.info.SliceOf(image_info, mip); slice >= 0) { + if (tex_cache_image.binding.is_target) { + // We have a larger image created and a separate one, representing a subres of + // it, bound as render target. In this case we need to rebind render target. + tex_cache_image.binding.needs_rebind = 1u; + if (merged_image_id) { + GetImage(merged_image_id).binding.is_target = 1u; + } + + FreeImage(cache_image_id); + return {merged_image_id, -1, -1}; } - FreeImage(cache_image_id); - return {merged_image_id, -1, -1}; - } + // We need to have a larger, already allocated image to copy this one into + if (merged_image_id) { + tex_cache_image.Transit(vk::ImageLayout::eTransferSrcOptimal, + vk::AccessFlagBits2::eTransferRead, {}); - // We need to have a larger, already allocated image to copy this one into - if (merged_image_id) { - tex_cache_image.Transit(vk::ImageLayout::eTransferSrcOptimal, - vk::AccessFlagBits2::eTransferRead, {}); + const auto num_mips_to_copy = tex_cache_image.info.resources.levels; + ASSERT(num_mips_to_copy == 1); - const auto num_mips_to_copy = tex_cache_image.info.resources.levels; - ASSERT(num_mips_to_copy == 1); + auto& merged_image = slot_images[merged_image_id]; + merged_image.CopyMip(tex_cache_image, mip, slice); - auto& merged_image = slot_images[merged_image_id]; - merged_image.CopyMip(tex_cache_image, mip); - - FreeImage(cache_image_id); + FreeImage(cache_image_id); + } } } } @@ -374,12 +373,16 @@ ImageId TextureCache::FindImage(BaseDesc& desc, FindFlags flags) { RegisterImage(image_id); } + Image& image = slot_images[image_id]; + image.tick_accessed_last = scheduler.CurrentTick(); + + // If the image requested is a subresource of the image from cache record its location. if (view_mip > 0) { desc.view_info.range.base.level = view_mip; } - - Image& image = slot_images[image_id]; - image.tick_accessed_last = scheduler.CurrentTick(); + if (view_slice > 0) { + desc.view_info.range.base.layer = view_slice; + } return image_id; } @@ -526,7 +529,7 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule } image_copy.push_back({ - .bufferOffset = mip.offset * num_layers, + .bufferOffset = mip.offset, .bufferRowLength = static_cast(mip.pitch), .bufferImageHeight = static_cast(mip.height), .imageSubresource{ diff --git a/src/video_core/texture_cache/tile_manager.cpp b/src/video_core/texture_cache/tile_manager.cpp index ede91d128..d7fc54338 100644 --- a/src/video_core/texture_cache/tile_manager.cpp +++ b/src/video_core/texture_cache/tile_manager.cpp @@ -279,8 +279,7 @@ std::pair TileManager::TryDetile(vk::Buffer in_buffer, u32 in_o ASSERT(info.resources.levels <= 14); std::memset(¶ms.sizes, 0, sizeof(params.sizes)); for (int m = 0; m < info.resources.levels; ++m) { - params.sizes[m] = info.mips_layout[m].size * info.resources.layers + - (m > 0 ? params.sizes[m - 1] : 0); + params.sizes[m] = info.mips_layout[m].size + (m > 0 ? params.sizes[m - 1] : 0); } } From 0a230729380fc969623190aa4cf4a1709c9c2693 Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:43:05 +0200 Subject: [PATCH 354/455] hot-fix: Compare with correct size --- src/video_core/texture_cache/image_info.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp index 60c52c666..26928eaf7 100644 --- a/src/video_core/texture_cache/image_info.cpp +++ b/src/video_core/texture_cache/image_info.cpp @@ -283,7 +283,9 @@ s32 ImageInfo::SliceOf(const ImageInfo& info, s32 mip) const { } // 2D dimensions of both images should be the same. - if ((size.width != info.size.width) || (size.height != info.size.height)) { + const auto mip_w = std::max(info.size.width >> mip, 1u); + const auto mip_h = std::max(info.size.height >> mip, 1u); + if ((size.width != mip_w) || (size.height != mip_h)) { return -1; } From fd3bfdae807ee747d55b655717331475dea5679a Mon Sep 17 00:00:00 2001 From: Paris Oplopoios Date: Mon, 24 Feb 2025 19:52:57 +0200 Subject: [PATCH 355/455] Implement some RDNA flags (#2510) --- .../frontend/translate/scalar_alu.cpp | 44 +++++++++++++++---- .../frontend/translate/translate.h | 1 + 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index b5c7c98ae..39f972848 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -27,7 +27,7 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { case Opcode::S_ADD_I32: return S_ADD_I32(inst); case Opcode::S_SUB_I32: - return S_SUB_U32(inst); + return S_SUB_I32(inst); case Opcode::S_ADDC_U32: return S_ADDC_U32(inst); case Opcode::S_MIN_I32: @@ -216,24 +216,52 @@ void Translator::EmitSOPK(const GcnInst& inst) { void Translator::S_ADD_U32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.IAdd(src0, src1)); - // TODO: Carry out - ir.SetScc(ir.Imm1(false)); + const IR::U32 result{ir.IAdd(src0, src1)}; + SetDst(inst.dst[0], result); + + // SCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U; + // The above assumes tmp is a 64-bit value. + // It should be enough however to test that the truncated result is less than at least one + // of the operands. In unsigned addition the result is always bigger than both the operands, + // except in the case of overflow where the truncated result is less than both. + ir.SetScc(ir.ILessThan(result, src0, false)); } void Translator::S_SUB_U32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; SetDst(inst.dst[0], ir.ISub(src0, src1)); - // TODO: Carry out - ir.SetScc(ir.Imm1(false)); + + // SCC = S1.u > S0.u ? 1'1U : 1'0U; + ir.SetScc(ir.IGreaterThan(src1, src0, false)); } void Translator::S_ADD_I32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.IAdd(src0, src1)); - // TODO: Overflow flag + const IR::U32 result{ir.IAdd(src0, src1)}; + SetDst(inst.dst[0], result); + + // SCC = ((S0.u[31] == S1.u[31]) && (S0.u[31] != Result.u[31])); + const IR::U32 shift{ir.Imm32(31)}; + const IR::U32 sign0{ir.ShiftRightLogical(src0, shift)}; + const IR::U32 sign1{ir.ShiftRightLogical(src1, shift)}; + const IR::U32 signr{ir.ShiftRightLogical(result, shift)}; + ir.SetScc(ir.LogicalAnd(ir.IEqual(sign0, sign1), ir.INotEqual(sign0, signr))); +} + +void Translator::S_SUB_I32(const GcnInst& inst) { + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{GetSrc(inst.src[1])}; + const IR::U32 result{ir.ISub(src0, src1)}; + SetDst(inst.dst[0], result); + + // SCC = ((S0.u[31] != S1.u[31]) && (S0.u[31] != tmp.u[31])); + const IR::U32 shift{ir.Imm32(31)}; + const IR::U32 sign0{ir.ShiftRightLogical(src0, shift)}; + const IR::U32 sign1{ir.ShiftRightLogical(src1, shift)}; + const IR::U32 signr{ir.ShiftRightLogical(result, shift)}; + ir.SetScc(ir.LogicalAnd(ir.INotEqual(sign0, sign1), ir.INotEqual(sign0, signr))); } void Translator::S_ADDC_U32(const GcnInst& inst) { diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 190129e5f..2fd48a051 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -81,6 +81,7 @@ public: void S_ADD_U32(const GcnInst& inst); void S_SUB_U32(const GcnInst& inst); void S_ADD_I32(const GcnInst& inst); + void S_SUB_I32(const GcnInst& inst); void S_ADDC_U32(const GcnInst& inst); void S_MIN_U32(bool is_signed, const GcnInst& inst); void S_MAX_U32(bool is_signed, const GcnInst& inst); From b8aac357cb261dc8b8f61ae7143a402148ee5bbc Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Mon, 24 Feb 2025 21:38:06 +0100 Subject: [PATCH 356/455] Fix SDL gyro and acceleration sensor handling (#2532) * Fix sensor handling if they are enabled but an error was thrown regardless * Initialise orientation to a default value + clang --- src/core/libraries/pad/pad.cpp | 14 ++++++++------ src/input/controller.cpp | 2 +- src/sdl_window.cpp | 8 ++++++-- src/sdl_window.h | 4 ++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index bcc90c49b..2e5973144 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -315,12 +315,13 @@ int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num) { pData[i].angularVelocity.x = states[i].angularVelocity.x; pData[i].angularVelocity.y = states[i].angularVelocity.y; pData[i].angularVelocity.z = states[i].angularVelocity.z; + pData[i].orientation = {0.0f, 0.0f, 0.0f, 1.0f}; if (engine) { - const auto accel_poll_rate = engine->GetAccelPollRate(); - if (accel_poll_rate != 0.0f) { + const auto gyro_poll_rate = engine->GetAccelPollRate(); + if (gyro_poll_rate != 0.0f) { GameController::CalculateOrientation(pData[i].acceleration, pData[i].angularVelocity, - 1.0f / accel_poll_rate, pData[i].orientation); + 1.0f / gyro_poll_rate, pData[i].orientation); } } pData[i].touchData.touchNum = @@ -384,11 +385,12 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) { pData->angularVelocity.x = state.angularVelocity.x; pData->angularVelocity.y = state.angularVelocity.y; pData->angularVelocity.z = state.angularVelocity.z; + pData->orientation = {0.0f, 0.0f, 0.0f, 1.0f}; if (engine) { - const auto accel_poll_rate = engine->GetAccelPollRate(); - if (accel_poll_rate != 0.0f) { + const auto gyro_poll_rate = engine->GetAccelPollRate(); + if (gyro_poll_rate != 0.0f) { GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity, - 1.0f / accel_poll_rate, pData->orientation); + 1.0f / gyro_poll_rate, pData->orientation); } } pData->touchData.touchNum = diff --git a/src/input/controller.cpp b/src/input/controller.cpp index ae54553f4..bb8db9a7c 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -182,7 +182,7 @@ void GameController::CalculateOrientation(Libraries::Pad::OrbisFVector3& acceler // Normalize accelerometer measurement float norm = std::sqrt(ax * ax + ay * ay + az * az); - if (norm == 0.0f) + if (norm == 0.0f || deltaTime == 0.0f) return; // Handle NaN norm = 1.0f / norm; ax *= norm; diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index 943746e3f..80d196147 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -134,13 +134,17 @@ void SDLInputEngine::Init() { m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO); LOG_INFO(Input, "Gyro initialized, poll rate: {}", m_gyro_poll_rate); } else { - LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad"); + LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad, error: {}", + SDL_GetError()); + SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_GYRO, false); } if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, true)) { m_accel_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_ACCEL); LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate); } else { - LOG_ERROR(Input, "Failed to initialize accel controls for gamepad"); + LOG_ERROR(Input, "Failed to initialize accel controls for gamepad, error: {}", + SDL_GetError()); + SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, false); } } diff --git a/src/sdl_window.h b/src/sdl_window.h index 9acd2b16b..03ba0797b 100644 --- a/src/sdl_window.h +++ b/src/sdl_window.h @@ -27,8 +27,8 @@ public: private: SDL_Gamepad* m_gamepad = nullptr; - float m_gyro_poll_rate{}; - float m_accel_poll_rate{}; + float m_gyro_poll_rate = 0.0f; + float m_accel_poll_rate = 0.0f; }; } // namespace Input From eac1daa5f77db62dec778686df85c55ecb0d4f88 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Mon, 24 Feb 2025 17:38:20 -0300 Subject: [PATCH 357/455] QT: Fix Fullscreen (#2533) There are these 2 options about full screen, and 'Fullscreen' was being set to 'true' because it was comparing the word "Windowed" with the interface information, but if you are using another language it might not identify it and even using 'Borderless' the screen would be full. --- src/qt_gui/settings_dialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index ce6f59937..9a946658f 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -677,7 +677,8 @@ void SettingsDialog::UpdateSettings() { const QVector TouchPadIndex = {"left", "center", "right", "none"}; Config::setBackButtonBehavior(TouchPadIndex[ui->backButtonBehaviorComboBox->currentIndex()]); - Config::setIsFullscreen(ui->displayModeComboBox->currentText().toStdString() != "Windowed"); + Config::setIsFullscreen(screenModeMap.value(ui->displayModeComboBox->currentText()) != + "Windowed"); Config::setFullscreenMode( screenModeMap.value(ui->displayModeComboBox->currentText()).toStdString()); Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); From 15d10e47ea272b1b4c8bf97f2b3bbb406d34b213 Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Mon, 24 Feb 2025 14:39:27 -0600 Subject: [PATCH 358/455] fix: move trophy pngs to src/images (#2519) * fix: move trophy pngs to src/images * Fix pointers to trophy files --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- CMakeLists.txt | 13 ++++--------- REUSE.toml | 8 ++++---- src/core/libraries/np_trophy/trophy_ui.cpp | 8 ++++---- {Resources => src/images}/bronze.png | Bin {Resources => src/images}/gold.png | Bin {Resources => src/images}/platinum.png | Bin {Resources => src/images}/silver.png | Bin src/qt_gui/trophy_viewer.cpp | 2 +- 8 files changed, 13 insertions(+), 18 deletions(-) rename {Resources => src/images}/bronze.png (100%) rename {Resources => src/images}/gold.png (100%) rename {Resources => src/images}/platinum.png (100%) rename {Resources => src/images}/silver.png (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 820d46f9d..0437c0ebb 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -954,12 +954,6 @@ set(QT_GUI src/qt_gui/about_dialog.cpp ) endif() -set(RESOURCEFOLDER Resources/bronze.png - Resources/gold.png - Resources/platinum.png - Resources/silver.png -) - if (ENABLE_QT_GUI) qt_add_executable(shadps4 ${AUDIO_CORE} @@ -971,7 +965,6 @@ if (ENABLE_QT_GUI) ${SHADER_RECOMPILER} ${VIDEO_CORE} ${EMULATOR} - ${RESOURCEFOLDER} src/images/shadPS4.icns ) else() @@ -984,7 +977,6 @@ else() ${SHADER_RECOMPILER} ${VIDEO_CORE} ${EMULATOR} - ${RESOURCEFOLDER} src/main.cpp src/emulator.cpp src/emulator.h @@ -1117,7 +1109,10 @@ include(CMakeRC) cmrc_add_resource_library(embedded-resources ALIAS res::embedded NAMESPACE res - ${RESOURCEFOLDER}) + src/images/bronze.png + src/images/gold.png + src/images/platinum.png + src/images/silver.png) target_link_libraries(shadps4 PRIVATE res::embedded) diff --git a/REUSE.toml b/REUSE.toml index 9c6ada42a..d8f31c2f2 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -19,11 +19,11 @@ path = [ "documents/Screenshots/*", "documents/Screenshots/Linux/*", "externals/MoltenVK/MoltenVK_icd.json", - "Resources/bronze.png", - "Resources/gold.png", - "Resources/platinum.png", - "Resources/silver.png", "scripts/ps4_names.txt", + "src/images/bronze.png", + "src/images/gold.png", + "src/images/platinum.png", + "src/images/silver.png", "src/images/about_icon.png", "src/images/controller_icon.png", "src/images/discord.png", diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp index 2b909e5cf..efa02e9c4 100644 --- a/src/core/libraries/np_trophy/trophy_ui.cpp +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -33,13 +33,13 @@ TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::strin std::string pathString; if (trophy_type == "P") { - pathString = "Resources/platinum.png"; + pathString = "src/images/platinum.png"; } else if (trophy_type == "G") { - pathString = "Resources/gold.png"; + pathString = "src/images/gold.png"; } else if (trophy_type == "S") { - pathString = "Resources/silver.png"; + pathString = "src/images/silver.png"; } else if (trophy_type == "B") { - pathString = "Resources/bronze.png"; + pathString = "src/images/bronze.png"; } auto resource = cmrc::res::get_filesystem(); diff --git a/Resources/bronze.png b/src/images/bronze.png similarity index 100% rename from Resources/bronze.png rename to src/images/bronze.png diff --git a/Resources/gold.png b/src/images/gold.png similarity index 100% rename from Resources/gold.png rename to src/images/gold.png diff --git a/Resources/platinum.png b/src/images/platinum.png similarity index 100% rename from Resources/platinum.png rename to src/images/platinum.png diff --git a/Resources/silver.png b/src/images/silver.png similarity index 100% rename from Resources/silver.png rename to src/images/silver.png diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 9a0f33eed..63e9f04dd 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -123,7 +123,7 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { QTableWidgetItem* typeitem = new QTableWidgetItem(); auto resource = cmrc::res::get_filesystem(); - std::string resourceString = "Resources/" + filename; + std::string resourceString = "src/images/" + filename; auto file = resource.open(resourceString); std::vector imgdata(file.begin(), file.end()); QImage type_icon = QImage::fromData(imgdata).scaled(QSize(64, 64), Qt::KeepAspectRatio, From be6840f6a9e4181a9f2a52f75b8ee2aea432a163 Mon Sep 17 00:00:00 2001 From: Osyotr Date: Tue, 25 Feb 2025 21:46:26 +0300 Subject: [PATCH 359/455] cmake: Cleanup (#2535) - Don't call enable_language before project. See CMake docs for CMP0165. - Remove boost-related cache variables. It's too late to set them because Boost::headers has already been found. - Don't build SDL3-test library. Not used by shadps4. - Remove /Zc:preprocessor from toml11's INTERFACE_COMPILE_OPTIONS. Clang-cl does not support this flag and emits a lot of warnings. - Remove dummy.cpp and make gcn a proper INTERFACE target. --- CMakeLists.txt | 4 ++-- externals/CMakeLists.txt | 11 +++++++++-- externals/gcn/CMakeLists.txt | 6 +++++- externals/gcn/dummy.cpp | 2 -- 4 files changed, 16 insertions(+), 7 deletions(-) delete mode 100644 externals/gcn/dummy.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0437c0ebb..b05a175bb 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED True) if(APPLE) - enable_language(OBJC) + list(APPEND ADDITIONAL_LANGUAGES OBJC) set(CMAKE_OSX_DEPLOYMENT_TARGET 14) endif() @@ -16,7 +16,7 @@ if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() -project(shadPS4 CXX C ASM) +project(shadPS4 CXX C ASM ${ADDITIONAL_LANGUAGES}) # Forcing PIE makes sure that the base address is high enough so that it doesn't clash with the PS4 memory. if(UNIX AND NOT APPLE) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 4ce5636d8..bb434677d 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -18,8 +18,6 @@ endif() # Boost if (NOT TARGET Boost::headers) - set(BOOST_ROOT "${CMAKE_SOURCE_DIR}/externals/ext-boost" CACHE STRING "") - set(Boost_NO_SYSTEM_PATHS ON CACHE BOOL "") add_subdirectory(ext-boost) endif() @@ -77,6 +75,7 @@ endif() # SDL3 if (NOT TARGET SDL3::SDL3) + set(SDL_TEST_LIBRARY OFF) set(SDL_PIPEWIRE OFF) add_subdirectory(sdl3) endif() @@ -131,6 +130,14 @@ endif() # Toml11 if (NOT TARGET toml11::toml11) add_subdirectory(toml11) + + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") + get_target_property(_toml11_compile_options toml11 INTERFACE_COMPILE_OPTIONS) + list(REMOVE_ITEM _toml11_compile_options "/Zc:preprocessor") + set_target_properties(toml11 PROPERTIES INTERFACE_COMPILE_OPTIONS ${_toml11_compile_options}) + endif() + endif() endif() # xxHash diff --git a/externals/gcn/CMakeLists.txt b/externals/gcn/CMakeLists.txt index 592f28d0d..f5c612be1 100644 --- a/externals/gcn/CMakeLists.txt +++ b/externals/gcn/CMakeLists.txt @@ -3,6 +3,10 @@ project(gcn LANGUAGES CXX) -add_library(gcn dummy.cpp) +add_library(gcn INTERFACE) +target_sources(gcn PRIVATE + "include/gcn/si_ci_vi_merged_offset.h" + "include/gcn/si_ci_vi_merged_pm4_it_opcodes.h" +) target_include_directories(gcn INTERFACE include) diff --git a/externals/gcn/dummy.cpp b/externals/gcn/dummy.cpp deleted file mode 100644 index 4fd1bb62d..000000000 --- a/externals/gcn/dummy.cpp +++ /dev/null @@ -1,2 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later From f0cc8c0d54c7da5224b9a82f3e090a8bc659830e Mon Sep 17 00:00:00 2001 From: Osyotr Date: Tue, 25 Feb 2025 21:46:35 +0300 Subject: [PATCH 360/455] config: Keep in order (#2536) --- src/common/config.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 0260d8e17..0b720c5b4 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -834,7 +834,7 @@ void load(const std::filesystem::path& path) { } void save(const std::filesystem::path& path) { - toml::value data; + toml::ordered_value data; std::error_code error; if (std::filesystem::exists(path, error)) { @@ -842,7 +842,8 @@ void save(const std::filesystem::path& path) { std::ifstream ifs; ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit); ifs.open(path, std::ios_base::binary); - data = toml::parse(ifs, std::string{fmt::UTF(path.filename().u8string()).data}); + data = toml::parse( + ifs, std::string{fmt::UTF(path.filename().u8string()).data}); } catch (const std::exception& ex) { fmt::print("Exception trying to parse config file. Exception: {}\n", ex.what()); return; @@ -924,7 +925,7 @@ void save(const std::filesystem::path& path) { } void saveMainWindow(const std::filesystem::path& path) { - toml::value data; + toml::ordered_value data; std::error_code error; if (std::filesystem::exists(path, error)) { @@ -932,7 +933,8 @@ void saveMainWindow(const std::filesystem::path& path) { std::ifstream ifs; ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit); ifs.open(path, std::ios_base::binary); - data = toml::parse(ifs, std::string{fmt::UTF(path.filename().u8string()).data}); + data = toml::parse( + ifs, std::string{fmt::UTF(path.filename().u8string()).data}); } catch (const std::exception& ex) { fmt::print("Exception trying to parse config file. Exception: {}\n", ex.what()); return; From 927f398658b6c548fef2fc48d71f0179de3d196b Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 26 Feb 2025 06:51:02 -0600 Subject: [PATCH 361/455] core: Ensure logger is initialized when there is no param.sfo (#2542) * Make sure log is initialized when there is no param.sfo Helps with testing firmware elfs and probably some homebrew. * Clang * Clang --- src/emulator.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/emulator.cpp b/src/emulator.cpp index 68c1e332c..758720325 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -107,6 +107,11 @@ void Emulator::Run(const std::filesystem::path& file, const std::vectorGetHostPath("/app0/sce_sys/param.sfo"); + if (!std::filesystem::exists(param_sfo_path) || !Config::getSeparateLogFilesEnabled()) { + Common::Log::Initialize(); + Common::Log::Start(); + } + if (std::filesystem::exists(param_sfo_path)) { auto* param_sfo = Common::Singleton::Instance(); const bool success = param_sfo->Open(param_sfo_path); @@ -117,10 +122,8 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector Date: Wed, 26 Feb 2025 16:53:46 +0100 Subject: [PATCH 362/455] OLED Theme (#2530) * OLED Theme * improve check box & text box visibility * clang format --------- Co-authored-by: smiRaphi --- src/qt_gui/main_window.cpp | 14 ++++++++++++++ src/qt_gui/main_window_themes.cpp | 25 +++++++++++++++++++++++++ src/qt_gui/main_window_themes.h | 2 +- src/qt_gui/main_window_ui.h | 6 ++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 96bd1d9e5..d9fb45fac 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -130,6 +130,7 @@ void MainWindow::CreateActions() { m_theme_act_group->addAction(ui->setThemeViolet); m_theme_act_group->addAction(ui->setThemeGruvbox); m_theme_act_group->addAction(ui->setThemeTokyoNight); + m_theme_act_group->addAction(ui->setThemeOled); } void MainWindow::AddUiWidgets() { @@ -651,6 +652,14 @@ void MainWindow::CreateConnects() { isIconBlack = false; } }); + connect(ui->setThemeOled, &QAction::triggered, &m_window_themes, [this]() { + m_window_themes.SetWindowTheme(Theme::Oled, ui->mw_searchbar); + Config::setMainWindowTheme(static_cast(Theme::Oled)); + if (isIconBlack) { + SetUiIcons(false); + isIconBlack = false; + } + }); } void MainWindow::StartGame() { @@ -1098,6 +1107,11 @@ void MainWindow::SetLastUsedTheme() { isIconBlack = false; SetUiIcons(false); break; + case Theme::Oled: + ui->setThemeOled->setChecked(true); + isIconBlack = false; + SetUiIcons(false); + break; } } diff --git a/src/qt_gui/main_window_themes.cpp b/src/qt_gui/main_window_themes.cpp index 5fffd4c9e..c5574fca9 100644 --- a/src/qt_gui/main_window_themes.cpp +++ b/src/qt_gui/main_window_themes.cpp @@ -6,6 +6,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { QPalette themePalette; + qApp->setStyleSheet(""); switch (theme) { case Theme::Dark: mw_searchbar->setStyleSheet( @@ -165,5 +166,29 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::HighlightedText, Qt::black); qApp->setPalette(themePalette); break; + case Theme::Oled: + mw_searchbar->setStyleSheet("QLineEdit:focus {" + "border: 1px solid #2A82DA; }"); + themePalette.setColor(QPalette::Window, Qt::black); + themePalette.setColor(QPalette::WindowText, Qt::white); + themePalette.setColor(QPalette::Base, Qt::black); + themePalette.setColor(QPalette::AlternateBase, Qt::black); + themePalette.setColor(QPalette::ToolTipBase, Qt::black); + themePalette.setColor(QPalette::ToolTipText, Qt::white); + themePalette.setColor(QPalette::Text, Qt::white); + themePalette.setColor(QPalette::Button, QColor(5, 5, 5)); + themePalette.setColor(QPalette::ButtonText, Qt::white); + themePalette.setColor(QPalette::BrightText, Qt::red); + themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); + themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); + themePalette.setColor(QPalette::HighlightedText, Qt::black); + qApp->setPalette(themePalette); + qApp->setStyleSheet("QLineEdit {" + "background-color: #000000; color: #ffffff; border: 1px solid #a0a0a0; " + "border-radius: 4px; padding: 5px; }" + + "QCheckBox::indicator:unchecked {" + "border: 1px solid #808080; border-radius: 4px; }"); + break; } } \ No newline at end of file diff --git a/src/qt_gui/main_window_themes.h b/src/qt_gui/main_window_themes.h index 0ec2cce58..babde0f27 100644 --- a/src/qt_gui/main_window_themes.h +++ b/src/qt_gui/main_window_themes.h @@ -7,7 +7,7 @@ #include #include -enum class Theme : int { Dark, Light, Green, Blue, Violet, Gruvbox, TokyoNight }; +enum class Theme : int { Dark, Light, Green, Blue, Violet, Gruvbox, TokyoNight, Oled }; class WindowThemes : public QObject { Q_OBJECT diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index e74ffcacb..3ebfcee9e 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -39,6 +39,7 @@ public: QAction* setThemeViolet; QAction* setThemeGruvbox; QAction* setThemeTokyoNight; + QAction* setThemeOled; QWidget* centralWidget; QLineEdit* mw_searchbar; QPushButton* playButton; @@ -171,6 +172,9 @@ public: setThemeTokyoNight = new QAction(MainWindow); setThemeTokyoNight->setObjectName("setThemeTokyoNight"); setThemeTokyoNight->setCheckable(true); + setThemeOled = new QAction(MainWindow); + setThemeOled->setObjectName("setThemeOled"); + setThemeOled->setCheckable(true); centralWidget = new QWidget(MainWindow); centralWidget->setObjectName("centralWidget"); sizePolicy.setHeightForWidth(centralWidget->sizePolicy().hasHeightForWidth()); @@ -303,6 +307,7 @@ public: menuThemes->addAction(setThemeViolet); menuThemes->addAction(setThemeGruvbox); menuThemes->addAction(setThemeTokyoNight); + menuThemes->addAction(setThemeOled); menuGame_List_Icons->addAction(setIconSizeTinyAct); menuGame_List_Icons->addAction(setIconSizeSmallAct); menuGame_List_Icons->addAction(setIconSizeMediumAct); @@ -393,6 +398,7 @@ public: setThemeViolet->setText(QCoreApplication::translate("MainWindow", "Violet", nullptr)); setThemeGruvbox->setText("Gruvbox"); setThemeTokyoNight->setText("Tokyo Night"); + setThemeOled->setText("OLED"); toolBar->setWindowTitle(QCoreApplication::translate("MainWindow", "toolBar", nullptr)); } // retranslateUi }; From 5e5ca2138e14ccf0245eb8d0b56d9c1bed2afecf Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 28 Feb 2025 03:31:42 -0300 Subject: [PATCH 363/455] Custom Trophy images / sound | and improvements (#2539) * Custom Trophy images * text and button - settings * Description * + * plural * translation for 'Trophy earned!' * Revert: translation for 'Trophy earned!' * play audio * fixes crash due to having too many trophies The game 'My Name is Mayo' has so many trophies in sequence that when overlapping them, the emulator ended up crashing, so if there is something on the screen and a new trophies are achieved, it will clear and show the new one. * Animations, config: position, duration * - * TR * fix sdl/qt * clang \O/ * Side menu with filter options. Sorting * +TR * fix showHiddenCheck * Time Unlocked * Fixes ghost text, larger image, black text in light theme * Button - Delete Trophy * limits the width of Description - showMaximized * changing column positions * useEuropeanDateFormat en_US, zh_CN, zh_TW, ja_JP, ko_KR, lt_LT, nb_NO, nl_NL useEuropeanDateFormat = false --- src/common/config.cpp | 23 ++ src/common/config.h | 4 + src/common/path_util.cpp | 1 + src/common/path_util.h | 2 + src/core/libraries/np_trophy/np_trophy.cpp | 18 +- src/core/libraries/np_trophy/trophy_ui.cpp | 144 ++++++++++-- src/core/libraries/np_trophy/trophy_ui.h | 1 - src/qt_gui/background_music_player.cpp | 9 +- src/qt_gui/background_music_player.h | 2 +- src/qt_gui/gui_context_menus.h | 21 +- src/qt_gui/settings_dialog.cpp | 28 ++- src/qt_gui/settings_dialog.ui | 157 ++++++++++--- src/qt_gui/translations/en_US.ts | 58 ++++- src/qt_gui/trophy_viewer.cpp | 248 ++++++++++++++++++--- src/qt_gui/trophy_viewer.h | 8 + 15 files changed, 620 insertions(+), 104 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 0b720c5b4..36566a14c 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -53,6 +53,7 @@ static bool isShaderDebug = false; static bool isShowSplash = false; static bool isAutoUpdate = false; static bool isAlwaysShowChangelog = false; +static bool isLeftSideTrophy = false; static bool isNullGpu = false; static bool shouldCopyGPUBuffers = false; static bool shouldDumpShaders = false; @@ -69,6 +70,7 @@ static bool isFpsColor = true; static bool isSeparateLogFilesEnabled = false; static s16 cursorState = HideCursorState::Idle; static int cursorHideTimeout = 5; // 5 seconds (default) +static double trophyNotificationDuration = 6.0; static bool useUnifiedInputConfig = true; static bool overrideControllerColor = false; static int controllerCustomColorRGB[3] = {0, 0, 255}; @@ -196,6 +198,10 @@ int getCursorHideTimeout() { return cursorHideTimeout; } +double getTrophyNotificationDuration() { + return trophyNotificationDuration; +} + u32 getScreenWidth() { return screenWidth; } @@ -264,6 +270,10 @@ bool alwaysShowChangelog() { return isAlwaysShowChangelog; } +bool leftSideTrophy() { + return isLeftSideTrophy; +} + bool nullGpu() { return isNullGpu; } @@ -371,6 +381,9 @@ void setAutoUpdate(bool enable) { void setAlwaysShowChangelog(bool enable) { isAlwaysShowChangelog = enable; } +void setLeftSideTrophy(bool enable) { + isLeftSideTrophy = enable; +} void setNullGpu(bool enable) { isNullGpu = enable; @@ -435,6 +448,9 @@ void setCursorState(s16 newCursorState) { void setCursorHideTimeout(int newcursorHideTimeout) { cursorHideTimeout = newcursorHideTimeout; } +void setTrophyNotificationDuration(double newTrophyNotificationDuration) { + trophyNotificationDuration = newTrophyNotificationDuration; +} void setLanguage(u32 language) { m_language = language; @@ -706,6 +722,8 @@ void load(const std::filesystem::path& path) { isNeo = toml::find_or(general, "isPS4Pro", false); playBGM = toml::find_or(general, "playBGM", false); isTrophyPopupDisabled = toml::find_or(general, "isTrophyPopupDisabled", false); + trophyNotificationDuration = + toml::find_or(general, "trophyNotificationDuration", 5.0); BGMvolume = toml::find_or(general, "BGMvolume", 50); enableDiscordRPC = toml::find_or(general, "enableDiscordRPC", true); logFilter = toml::find_or(general, "logFilter", ""); @@ -719,6 +737,7 @@ void load(const std::filesystem::path& path) { isShowSplash = toml::find_or(general, "showSplash", true); isAutoUpdate = toml::find_or(general, "autoUpdate", false); isAlwaysShowChangelog = toml::find_or(general, "alwaysShowChangelog", false); + isLeftSideTrophy = toml::find_or(general, "leftSideTrophy", false); separateupdatefolder = toml::find_or(general, "separateUpdateEnabled", false); compatibilityData = toml::find_or(general, "compatibilityEnabled", false); checkCompatibilityOnStartup = @@ -857,6 +876,7 @@ void save(const std::filesystem::path& path) { data["General"]["isPS4Pro"] = isNeo; data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled; + data["General"]["trophyNotificationDuration"] = trophyNotificationDuration; data["General"]["playBGM"] = playBGM; data["General"]["BGMvolume"] = BGMvolume; data["General"]["enableDiscordRPC"] = enableDiscordRPC; @@ -868,6 +888,7 @@ void save(const std::filesystem::path& path) { data["General"]["showSplash"] = isShowSplash; data["General"]["autoUpdate"] = isAutoUpdate; data["General"]["alwaysShowChangelog"] = isAlwaysShowChangelog; + data["General"]["leftSideTrophy"] = isLeftSideTrophy; data["General"]["separateUpdateEnabled"] = separateupdatefolder; data["General"]["compatibilityEnabled"] = compatibilityData; data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup; @@ -988,6 +1009,7 @@ void setDefaultValues() { chooseHomeTab = "General"; cursorState = HideCursorState::Idle; cursorHideTimeout = 5; + trophyNotificationDuration = 6.0; backButtonBehavior = "left"; useSpecialPad = false; specialPadClass = 1; @@ -996,6 +1018,7 @@ void setDefaultValues() { isShowSplash = false; isAutoUpdate = false; isAlwaysShowChangelog = false; + isLeftSideTrophy = false; isNullGpu = false; shouldDumpShaders = false; vblankDivider = 1; diff --git a/src/common/config.h b/src/common/config.h index abf8da8aa..988734b93 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -41,6 +41,7 @@ std::string getChooseHomeTab(); s16 getCursorState(); int getCursorHideTimeout(); +double getTrophyNotificationDuration(); std::string getBackButtonBehavior(); bool getUseSpecialPad(); int getSpecialPadClass(); @@ -62,6 +63,7 @@ bool collectShadersForDebug(); bool showSplash(); bool autoUpdate(); bool alwaysShowChangelog(); +bool leftSideTrophy(); bool nullGpu(); bool copyGPUCmdBuffers(); bool dumpShaders(); @@ -75,6 +77,7 @@ void setCollectShaderForDebug(bool enable); void setShowSplash(bool enable); void setAutoUpdate(bool enable); void setAlwaysShowChangelog(bool enable); +void setLeftSideTrophy(bool enable); void setNullGpu(bool enable); void setAllowHDR(bool enable); void setCopyGPUCmdBuffers(bool enable); @@ -104,6 +107,7 @@ void setShowBackgroundImage(bool show); void setCursorState(s16 cursorState); void setCursorHideTimeout(int newcursorHideTimeout); +void setTrophyNotificationDuration(double newTrophyNotificationDuration); void setBackButtonBehavior(const std::string& type); void setUseSpecialPad(bool use); void setSpecialPadClass(int type); diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp index a4312fada..d48e8c3fe 100644 --- a/src/common/path_util.cpp +++ b/src/common/path_util.cpp @@ -128,6 +128,7 @@ static auto UserPaths = [] { create_path(PathType::CheatsDir, user_dir / CHEATS_DIR); create_path(PathType::PatchesDir, user_dir / PATCHES_DIR); create_path(PathType::MetaDataDir, user_dir / METADATA_DIR); + create_path(PathType::CustomTrophy, user_dir / CUSTOM_TROPHY); return paths; }(); diff --git a/src/common/path_util.h b/src/common/path_util.h index 7190378d6..2fd9b1588 100644 --- a/src/common/path_util.h +++ b/src/common/path_util.h @@ -27,6 +27,7 @@ enum class PathType { CheatsDir, // Where cheats are stored. PatchesDir, // Where patches are stored. MetaDataDir, // Where game metadata (e.g. trophies and menu backgrounds) is stored. + CustomTrophy, // Where custom files for trophies are stored. }; constexpr auto PORTABLE_DIR = "user"; @@ -44,6 +45,7 @@ constexpr auto CAPTURES_DIR = "captures"; constexpr auto CHEATS_DIR = "cheats"; constexpr auto PATCHES_DIR = "patches"; constexpr auto METADATA_DIR = "game_data"; +constexpr auto CUSTOM_TROPHY = "custom_trophy"; // Filenames constexpr auto LOG_FILE = "shad_log.txt"; diff --git a/src/core/libraries/np_trophy/np_trophy.cpp b/src/core/libraries/np_trophy/np_trophy.cpp index 91dd5b4b4..a951d5655 100644 --- a/src/core/libraries/np_trophy/np_trophy.cpp +++ b/src/core/libraries/np_trophy/np_trophy.cpp @@ -923,15 +923,16 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr node.attribute("unlockstate").set_value("true"); } - Rtc::OrbisRtcTick trophyTimestamp; - Rtc::sceRtcGetCurrentTick(&trophyTimestamp); + auto trophyTimestamp = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count(); if (node.attribute("timestamp").empty()) { node.append_attribute("timestamp") = - std::to_string(trophyTimestamp.tick).c_str(); + std::to_string(trophyTimestamp).c_str(); } else { node.attribute("timestamp") - .set_value(std::to_string(trophyTimestamp.tick).c_str()); + .set_value(std::to_string(trophyTimestamp).c_str()); } std::string trophy_icon_file = "TROP"; @@ -955,15 +956,16 @@ int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTr platinum_node.attribute("unlockstate").set_value("true"); } - Rtc::OrbisRtcTick trophyTimestamp; - Rtc::sceRtcGetCurrentTick(&trophyTimestamp); + auto trophyTimestamp = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count(); if (platinum_node.attribute("timestamp").empty()) { platinum_node.append_attribute("timestamp") = - std::to_string(trophyTimestamp.tick).c_str(); + std::to_string(trophyTimestamp).c_str(); } else { platinum_node.attribute("timestamp") - .set_value(std::to_string(trophyTimestamp.tick).c_str()); + .set_value(std::to_string(trophyTimestamp).c_str()); } int platinum_trophy_id = diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp index efa02e9c4..2564cbf5d 100644 --- a/src/core/libraries/np_trophy/trophy_ui.cpp +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -2,9 +2,17 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include +#include #include #include +#include #include + +#ifdef ENABLE_QT_GUI +#include +#endif + #include "common/assert.h" #include "common/config.h" #include "common/singleton.h" @@ -12,18 +20,23 @@ #include "trophy_ui.h" CMRC_DECLARE(res); - +namespace fs = std::filesystem; using namespace ImGui; namespace Libraries::NpTrophy { std::optional current_trophy_ui; std::queue trophy_queue; std::mutex queueMtx; +bool isLeftSide; +double trophy_timer; TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName, const std::string_view& rarity) : trophy_name(trophyName), trophy_type(rarity) { + isLeftSide = Config::leftSideTrophy(); + trophy_timer = Config::getTrophyNotificationDuration(); + if (std::filesystem::exists(trophyIconPath)) { trophy_icon = RefCountedTexture::DecodePngFile(trophyIconPath); } else { @@ -31,23 +44,57 @@ TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::strin fmt::UTF(trophyIconPath.u8string())); } - std::string pathString; + std::string pathString = "src/images/"; + if (trophy_type == "P") { - pathString = "src/images/platinum.png"; + pathString += "platinum.png"; } else if (trophy_type == "G") { - pathString = "src/images/gold.png"; + pathString += "gold.png"; } else if (trophy_type == "S") { - pathString = "src/images/silver.png"; + pathString += "silver.png"; } else if (trophy_type == "B") { - pathString = "src/images/bronze.png"; + pathString += "bronze.png"; + } + + const auto CustomTrophy_Dir = Common::FS::GetUserPath(Common::FS::PathType::CustomTrophy); + std::string customPath; + + if (trophy_type == "P" && fs::exists(CustomTrophy_Dir / "platinum.png")) { + customPath = (CustomTrophy_Dir / "platinum.png").string(); + } else if (trophy_type == "G" && fs::exists(CustomTrophy_Dir / "gold.png")) { + customPath = (CustomTrophy_Dir / "gold.png").string(); + } else if (trophy_type == "S" && fs::exists(CustomTrophy_Dir / "silver.png")) { + customPath = (CustomTrophy_Dir / "silver.png").string(); + } else if (trophy_type == "B" && fs::exists(CustomTrophy_Dir / "bronze.png")) { + customPath = (CustomTrophy_Dir / "bronze.png").string(); + } + + std::vector imgdata; + if (!customPath.empty()) { + std::ifstream file(customPath, std::ios::binary); + if (file) { + imgdata = std::vector(std::istreambuf_iterator(file), + std::istreambuf_iterator()); + } else { + LOG_ERROR(Lib_NpTrophy, "Could not open custom file for trophy in {}", customPath); + } + } else { + auto resource = cmrc::res::get_filesystem(); + auto file = resource.open(pathString); + imgdata = std::vector(file.begin(), file.end()); } - auto resource = cmrc::res::get_filesystem(); - auto file = resource.open(pathString); - std::vector imgdata(file.begin(), file.end()); trophy_type_icon = RefCountedTexture::DecodePngTexture(imgdata); AddLayer(this); + +#ifdef ENABLE_QT_GUI + QString musicPath = QString::fromStdString(CustomTrophy_Dir.string() + "/trophy.mp3"); + if (fs::exists(musicPath.toStdString())) { + BackgroundMusicPlayer::getInstance().setVolume(100); + BackgroundMusicPlayer::getInstance().playMusic(musicPath, false); + } +#endif } TrophyUI::~TrophyUI() { @@ -58,6 +105,13 @@ void TrophyUI::Finish() { RemoveLayer(this); } +float fade_opacity = 0.0f; // Initial opacity (invisible) +ImVec2 start_pos = ImVec2(1280.0f, 50.0f); // Starts off screen, right +ImVec2 target_pos = ImVec2(0.0f, 50.0f); // Final position +float animation_duration = 0.5f; // Animation duration +float elapsed_time = 0.0f; // Animation time +float fade_out_duration = 0.5f; // Final fade duration + void TrophyUI::Draw() { const auto& io = GetIO(); @@ -68,26 +122,60 @@ void TrophyUI::Draw() { std::min(io.DisplaySize.y, (70 * AdjustHeight)), }; + elapsed_time += io.DeltaTime; + float progress = std::min(elapsed_time / animation_duration, 1.0f); + + // left or right position + float final_pos_x; + if (isLeftSide) { + start_pos.x = -window_size.x; + final_pos_x = 20 * AdjustWidth; + } else { + start_pos.x = io.DisplaySize.x; + final_pos_x = io.DisplaySize.x - window_size.x - 20 * AdjustWidth; + } + + ImVec2 current_pos = ImVec2(start_pos.x + (final_pos_x - start_pos.x) * progress, + start_pos.y + (target_pos.y - start_pos.y) * progress); + + trophy_timer -= io.DeltaTime; + + // If the remaining time of the trophy is less than or equal to 1 second, the fade-out begins. + if (trophy_timer <= 1.0f) { + float fade_out_time = 1.0f - (trophy_timer / 1.0f); + fade_opacity = 1.0f - fade_out_time; + } else { + // Fade in , 0 to 1 + fade_opacity = progress; + } + + fade_opacity = std::max(0.0f, std::min(fade_opacity, 1.0f)); + SetNextWindowSize(window_size); + SetNextWindowPos(current_pos); SetNextWindowCollapsed(false); - SetNextWindowPos(ImVec2(io.DisplaySize.x - (370 * AdjustWidth), (50 * AdjustHeight))); KeepNavHighlight(); + PushStyleVar(ImGuiStyleVar_Alpha, fade_opacity); + if (Begin("Trophy Window", nullptr, ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoInputs)) { + + // Displays the trophy icon if (trophy_type_icon) { SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); Image(trophy_type_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); ImGui::SameLine(); } else { - // placeholder + // Placeholder const auto pos = GetCursorScreenPos(); ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight}, GetColorU32(ImVec4{0.7f})); ImGui::Indent(60); } + // Displays the name of the trophy const std::string combinedString = "Trophy earned!\n%s" + trophy_name; const float wrap_width = CalcWrapWidthForPos(GetCursorScreenPos(), (window_size.x - (60 * AdjustWidth))); @@ -108,11 +196,12 @@ void TrophyUI::Draw() { TextWrapped("Trophy earned!\n%s", trophy_name.c_str()); ImGui::SameLine(window_size.x - (60 * AdjustWidth)); + // Displays the trophy icon if (trophy_icon) { SetCursorPosY((window_size.y * 0.5f) - (25 * AdjustHeight)); Image(trophy_icon.GetTexture().im_id, ImVec2((50 * AdjustWidth), (50 * AdjustHeight))); } else { - // placeholder + // Placeholder const auto pos = GetCursorScreenPos(); ImGui::GetWindowDrawList()->AddRectFilled(pos, pos + ImVec2{50.0f * AdjustHeight}, GetColorU32(ImVec4{0.7f})); @@ -120,7 +209,8 @@ void TrophyUI::Draw() { } End(); - trophy_timer -= io.DeltaTime; + PopStyleVar(); + if (trophy_timer <= 0) { std::lock_guard lock(queueMtx); if (!trophy_queue.empty()) { @@ -141,13 +231,27 @@ void AddTrophyToQueue(const std::filesystem::path& trophyIconPath, const std::st if (Config::getisTrophyPopupDisabled()) { return; } else if (current_trophy_ui.has_value()) { - TrophyInfo new_trophy; - new_trophy.trophy_icon_path = trophyIconPath; - new_trophy.trophy_name = trophyName; - new_trophy.trophy_type = rarity; - trophy_queue.push(new_trophy); - } else { - current_trophy_ui.emplace(trophyIconPath, trophyName, rarity); + current_trophy_ui.reset(); + } + + TrophyInfo new_trophy; + new_trophy.trophy_icon_path = trophyIconPath; + new_trophy.trophy_name = trophyName; + new_trophy.trophy_type = rarity; + trophy_queue.push(new_trophy); + + if (!current_trophy_ui.has_value()) { +#ifdef ENABLE_QT_GUI + BackgroundMusicPlayer::getInstance().stopMusic(); +#endif + // Resetting the animation for the next trophy + elapsed_time = 0.0f; // Resetting animation time + fade_opacity = 0.0f; // Starts invisible + start_pos = ImVec2(1280.0f, 50.0f); // Starts off screen, right + TrophyInfo next_trophy = trophy_queue.front(); + trophy_queue.pop(); + current_trophy_ui.emplace(next_trophy.trophy_icon_path, next_trophy.trophy_name, + next_trophy.trophy_type); } } diff --git a/src/core/libraries/np_trophy/trophy_ui.h b/src/core/libraries/np_trophy/trophy_ui.h index 16e707059..553c99f6f 100644 --- a/src/core/libraries/np_trophy/trophy_ui.h +++ b/src/core/libraries/np_trophy/trophy_ui.h @@ -28,7 +28,6 @@ public: private: std::string trophy_name; std::string_view trophy_type; - float trophy_timer = 5.0f; ImGui::RefCountedTexture trophy_icon; ImGui::RefCountedTexture trophy_type_icon; }; diff --git a/src/qt_gui/background_music_player.cpp b/src/qt_gui/background_music_player.cpp index a40c5bfae..a63f1d1be 100644 --- a/src/qt_gui/background_music_player.cpp +++ b/src/qt_gui/background_music_player.cpp @@ -7,7 +7,6 @@ BackgroundMusicPlayer::BackgroundMusicPlayer(QObject* parent) : QObject(parent) m_mediaPlayer = new QMediaPlayer(this); m_audioOutput = new QAudioOutput(this); m_mediaPlayer->setAudioOutput(m_audioOutput); - m_mediaPlayer->setLoops(QMediaPlayer::Infinite); } void BackgroundMusicPlayer::setVolume(int volume) { @@ -16,7 +15,7 @@ void BackgroundMusicPlayer::setVolume(int volume) { m_audioOutput->setVolume(linearVolume); } -void BackgroundMusicPlayer::playMusic(const QString& snd0path) { +void BackgroundMusicPlayer::playMusic(const QString& snd0path, bool loops) { if (snd0path.isEmpty()) { stopMusic(); return; @@ -28,6 +27,12 @@ void BackgroundMusicPlayer::playMusic(const QString& snd0path) { return; } + if (loops) { + m_mediaPlayer->setLoops(QMediaPlayer::Infinite); + } else { + m_mediaPlayer->setLoops(1); + } + m_currentMusic = newMusic; m_mediaPlayer->setSource(newMusic); m_mediaPlayer->play(); diff --git a/src/qt_gui/background_music_player.h b/src/qt_gui/background_music_player.h index 6d70fe68c..078710a01 100644 --- a/src/qt_gui/background_music_player.h +++ b/src/qt_gui/background_music_player.h @@ -17,7 +17,7 @@ public: } void setVolume(int volume); - void playMusic(const QString& snd0path); + void playMusic(const QString& snd0path, bool loops = true); void stopMusic(); private: diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 1a059a850..385b5fda9 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -97,11 +97,13 @@ public: QAction* deleteUpdate = new QAction(tr("Delete Update"), widget); QAction* deleteSaveData = new QAction(tr("Delete Save Data"), widget); QAction* deleteDLC = new QAction(tr("Delete DLC"), widget); + QAction* deleteTrophy = new QAction(tr("Delete Trophy"), widget); deleteMenu->addAction(deleteGame); deleteMenu->addAction(deleteUpdate); deleteMenu->addAction(deleteSaveData); deleteMenu->addAction(deleteDLC); + deleteMenu->addAction(deleteTrophy); menu.addMenu(deleteMenu); @@ -380,9 +382,9 @@ public: } if (selected == deleteGame || selected == deleteUpdate || selected == deleteDLC || - selected == deleteSaveData) { + selected == deleteSaveData || selected == deleteTrophy) { bool error = false; - QString folder_path, game_update_path, dlc_path, save_data_path; + QString folder_path, game_update_path, dlc_path, save_data_path, trophy_data_path; Common::FS::PathToQString(folder_path, m_games[itemID].path); game_update_path = folder_path + "-UPDATE"; Common::FS::PathToQString( @@ -391,6 +393,11 @@ public: Common::FS::PathToQString(save_data_path, Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "savedata/1" / m_games[itemID].serial); + + Common::FS::PathToQString(trophy_data_path, + Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / + m_games[itemID].serial / "TrophyFiles"); + QString message_type = tr("Game"); if (selected == deleteUpdate) { @@ -420,6 +427,16 @@ public: folder_path = save_data_path; message_type = tr("Save Data"); } + } else if (selected == deleteTrophy) { + if (!std::filesystem::exists(Common::FS::PathFromQString(trophy_data_path))) { + QMessageBox::critical( + nullptr, tr("Error"), + QString(tr("This game has no saved trophies to delete!"))); + error = true; + } else { + folder_path = trophy_data_path; + message_type = tr("Trophy"); + } } if (!error) { QString gameName = QString::fromStdString(m_games[itemID].name); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 9a946658f..bde104828 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -225,6 +225,17 @@ SettingsDialog::SettingsDialog(std::span physical_devices, Config::setShowBackgroundImage(state == Qt::Checked); }); } + + // User TAB + { + connect(ui->OpenCustomTrophyLocationButton, &QPushButton::clicked, this, []() { + QString userPath; + Common::FS::PathToQString(userPath, + Common::FS::GetUserPath(Common::FS::PathType::CustomTrophy)); + QDesktopServices::openUrl(QUrl::fromLocalFile(userPath)); + }); + } + // Input TAB { connect(ui->hideCursorComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, @@ -280,8 +291,8 @@ SettingsDialog::SettingsDialog(std::span physical_devices, connect(ui->OpenLogLocationButton, &QPushButton::clicked, this, []() { QString userPath; Common::FS::PathToQString(userPath, - Common::FS::GetUserPath(Common::FS::PathType::UserDir)); - QDesktopServices::openUrl(QUrl::fromLocalFile(userPath + "/log")); + Common::FS::GetUserPath(Common::FS::PathType::LogDir)); + QDesktopServices::openUrl(QUrl::fromLocalFile(userPath)); }); } @@ -308,6 +319,9 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->checkCompatibilityOnStartupCheckBox->installEventFilter(this); ui->updateCompatibilityButton->installEventFilter(this); + // User + ui->OpenCustomTrophyLocationButton->installEventFilter(this); + // Input ui->hideCursorGroupBox->installEventFilter(this); ui->idleTimeoutGroupBox->installEventFilter(this); @@ -403,6 +417,9 @@ void SettingsDialog::LoadValuesFromConfig() { ui->playBGMCheckBox->setChecked(toml::find_or(data, "General", "playBGM", false)); ui->disableTrophycheckBox->setChecked( toml::find_or(data, "General", "isTrophyPopupDisabled", false)); + ui->popUpDurationSpinBox->setValue(Config::getTrophyNotificationDuration()); + ui->radioButton_Left->setChecked(Config::leftSideTrophy()); + ui->radioButton_Right->setChecked(!ui->radioButton_Left->isChecked()); ui->BGMVolumeSlider->setValue(toml::find_or(data, "General", "BGMvolume", 50)); ui->discordRPCCheckbox->setChecked( toml::find_or(data, "General", "enableDiscordRPC", true)); @@ -593,6 +610,11 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { text = tr("Update Compatibility Database:\\nImmediately update the compatibility database."); } + //User + if (elementName == "OpenCustomTrophyLocationButton") { + text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png"); + } + // Input if (elementName == "hideCursorGroupBox") { text = tr("Hide Cursor:\\nChoose when the cursor will disappear:\\nNever: You will always see the mouse.\\nidle: Set a time for it to disappear after being idle.\\nAlways: you will never see the mouse."); @@ -683,6 +705,8 @@ void SettingsDialog::UpdateSettings() { screenModeMap.value(ui->displayModeComboBox->currentText()).toStdString()); Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); + Config::setTrophyNotificationDuration(ui->popUpDurationSpinBox->value()); + Config::setLeftSideTrophy(ui->radioButton_Left->isChecked()); Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); Config::setAllowHDR(ui->enableHDRCheckBox->isChecked()); Config::setLogType(logTypeMap.value(ui->logTypeComboBox->currentText()).toStdString()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 2df328fbe..c793aced5 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -59,7 +59,7 @@ - 6 + 0 @@ -73,8 +73,8 @@ 0 0 - 718 - 332 + 946 + 545 @@ -454,8 +454,8 @@ 0 0 - 646 - 395 + 946 + 545 @@ -903,8 +903,8 @@ 0 0 - 545 - 141 + 946 + 545 @@ -1198,8 +1198,8 @@ 0 0 - 234 - 292 + 946 + 545 @@ -1264,30 +1264,121 @@ - Disable Trophy Pop-ups + Disable Trophy Notification - + + + 0 + + + + + + 0 + 0 + + + + Trophy Notification Position + + + + + + + Left + + + + + + + + 0 + 0 + + + + Right + + + + + + + + + 0 + + + + + + 0 + 0 + + + + Notification Duration + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + + + Trophy Key + + + + + + + + 0 + 0 + + + + + 10 + false + + + + + + + + - Trophy Key - - - - - - - - 0 - 0 - - - - - 10 - false - + Open the custom trophy images/sounds folder @@ -1342,8 +1433,8 @@ 0 0 - 455 - 252 + 946 + 545 @@ -1626,8 +1717,8 @@ 0 0 - 216 - 254 + 946 + 545 @@ -1717,7 +1808,7 @@ 0 0 946 - 536 + 545 diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 263267aba..24ad63ca3 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -859,10 +863,18 @@ This game has no save data to delete! + + This game has no saved trophies to delete! + + Save Data + + Trophy + + SFO Viewer for @@ -1311,6 +1323,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1492,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1627,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Never @@ -1803,6 +1823,22 @@ Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1846,21 @@ Trophy Viewer Trophy Viewer + + Progress + + + + Show Earned Trophies + + + + Show Not Earned Trophies + + + + Show Hidden Trophies + + - + \ No newline at end of file diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 63e9f04dd..ace475a7f 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -1,27 +1,169 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include #include #include +#include #include "common/path_util.h" +#include "main_window_themes.h" #include "trophy_viewer.h" +namespace fs = std::filesystem; + CMRC_DECLARE(res); +// true: European format; false: American format +bool useEuropeanDateFormat = true; + +void TrophyViewer::updateTrophyInfo() { + int total = 0; + int unlocked = 0; + + // Cycles through each tab (table) of the QTabWidget + for (int i = 0; i < tabWidget->count(); i++) { + QTableWidget* table = qobject_cast(tabWidget->widget(i)); + if (table) { + total += table->rowCount(); + for (int row = 0; row < table->rowCount(); ++row) { + QString cellText; + // The "Unlocked" column can be a widget or a simple item + QWidget* widget = table->cellWidget(row, 0); + if (widget) { + // Looks for the QLabel inside the widget (as defined in SetTableItem) + QLabel* label = widget->findChild(); + if (label) { + cellText = label->text(); + } + } else { + QTableWidgetItem* item = table->item(row, 0); + if (item) { + cellText = item->text(); + } + } + if (cellText == "unlocked") + unlocked++; + } + } + } + int progress = (total > 0) ? (unlocked * 100 / total) : 0; + trophyInfoLabel->setText( + QString(tr("Progress") + ": %1% (%2/%3)").arg(progress).arg(unlocked).arg(total)); +} + +void TrophyViewer::updateTableFilters() { + bool showEarned = showEarnedCheck->isChecked(); + bool showNotEarned = showNotEarnedCheck->isChecked(); + bool showHidden = showHiddenCheck->isChecked(); + + // Cycles through each tab of the QTabWidget + for (int i = 0; i < tabWidget->count(); ++i) { + QTableWidget* table = qobject_cast(tabWidget->widget(i)); + if (!table) + continue; + for (int row = 0; row < table->rowCount(); ++row) { + QString unlockedText; + // Gets the text of the "Unlocked" column (index 0) + QWidget* widget = table->cellWidget(row, 0); + if (widget) { + QLabel* label = widget->findChild(); + if (label) + unlockedText = label->text(); + } else { + QTableWidgetItem* item = table->item(row, 0); + if (item) + unlockedText = item->text(); + } + + QString hiddenText; + // Gets the text of the "Hidden" column (index 7) + QWidget* hiddenWidget = table->cellWidget(row, 7); + if (hiddenWidget) { + QLabel* label = hiddenWidget->findChild(); + if (label) + hiddenText = label->text(); + } else { + QTableWidgetItem* item = table->item(row, 7); + if (item) + hiddenText = item->text(); + } + + bool visible = true; + if (unlockedText == "unlocked" && !showEarned) + visible = false; + if (unlockedText == "locked" && !showNotEarned) + visible = false; + if (hiddenText.toLower() == "yes" && !showHidden) + visible = false; + + table->setRowHidden(row, !visible); + } + } +} + TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindow() { this->setWindowTitle(tr("Trophy Viewer")); this->setAttribute(Qt::WA_DeleteOnClose); tabWidget = new QTabWidget(this); + + auto lan = Config::getEmulatorLanguage(); + if (lan == "en_US" || lan == "zh_CN" || lan == "zh_TW" || lan == "ja_JP" || lan == "ko_KR" || + lan == "lt_LT" || lan == "nb_NO" || lan == "nl_NL") { + useEuropeanDateFormat = false; + } + gameTrpPath_ = gameTrpPath; headers << "Unlocked" << "Trophy" << "Name" << "Description" + << "Time Unlocked" + << "Type" << "ID" << "Hidden" - << "Type" << "PID"; PopulateTrophyWidget(trophyPath); + + QDockWidget* trophyInfoDock = new QDockWidget("", this); + QWidget* dockWidget = new QWidget(trophyInfoDock); + QVBoxLayout* dockLayout = new QVBoxLayout(dockWidget); + dockLayout->setAlignment(Qt::AlignTop); + + trophyInfoLabel = new QLabel(tr("Progress") + ": 0% (0/0)", dockWidget); + trophyInfoLabel->setStyleSheet( + "font-weight: bold; font-size: 16px; color: white; background: #333; padding: 5px;"); + dockLayout->addWidget(trophyInfoLabel); + + // Creates QCheckBox to filter trophies + showEarnedCheck = new QCheckBox(tr("Show Earned Trophies"), dockWidget); + showNotEarnedCheck = new QCheckBox(tr("Show Not Earned Trophies"), dockWidget); + showHiddenCheck = new QCheckBox(tr("Show Hidden Trophies"), dockWidget); + + // Defines the initial states (all checked) + showEarnedCheck->setChecked(true); + showNotEarnedCheck->setChecked(true); + showHiddenCheck->setChecked(false); + + // Adds checkboxes to the layout + dockLayout->addWidget(showEarnedCheck); + dockLayout->addWidget(showNotEarnedCheck); + dockLayout->addWidget(showHiddenCheck); + + dockWidget->setLayout(dockLayout); + trophyInfoDock->setWidget(dockWidget); + + // Adds the dock to the left area + this->addDockWidget(Qt::LeftDockWidgetArea, trophyInfoDock); + + // Connects checkbox signals to update trophy display + connect(showEarnedCheck, &QCheckBox::stateChanged, this, &TrophyViewer::updateTableFilters); + connect(showNotEarnedCheck, &QCheckBox::stateChanged, this, &TrophyViewer::updateTableFilters); + connect(showHiddenCheck, &QCheckBox::stateChanged, this, &TrophyViewer::updateTableFilters); + + updateTrophyInfo(); + updateTableFilters(); } void TrophyViewer::PopulateTrophyWidget(QString title) { @@ -68,6 +210,7 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { QStringList trpPid; QStringList trophyNames; QStringList trophyDetails; + QStringList trpTimeUnlocked; QString xmlPath = trpDir + "/Xml/TROP.XML"; QFile file(xmlPath); @@ -84,14 +227,35 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { trpHidden.append(reader.attributes().value("hidden").toString()); trpType.append(reader.attributes().value("ttype").toString()); trpPid.append(reader.attributes().value("pid").toString()); + if (reader.attributes().hasAttribute("unlockstate")) { if (reader.attributes().value("unlockstate").toString() == "true") { trpUnlocked.append("unlocked"); } else { trpUnlocked.append("locked"); } + if (reader.attributes().hasAttribute("timestamp")) { + QString ts = reader.attributes().value("timestamp").toString(); + if (ts.length() > 10) + trpTimeUnlocked.append("unknown"); + else { + bool ok; + qint64 timestampInt = ts.toLongLong(&ok); + if (ok) { + QDateTime dt = QDateTime::fromSecsSinceEpoch(timestampInt); + QString format = useEuropeanDateFormat ? "dd/MM/yyyy HH:mm:ss" + : "MM/dd/yyyy HH:mm:ss"; + trpTimeUnlocked.append(dt.toString(format)); + } else { + trpTimeUnlocked.append("unknown"); + } + } + } else { + trpTimeUnlocked.append(""); + } } else { trpUnlocked.append("locked"); + trpTimeUnlocked.append(""); } } @@ -105,7 +269,7 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { } QTableWidget* tableWidget = new QTableWidget(this); tableWidget->setShowGrid(false); - tableWidget->setColumnCount(8); + tableWidget->setColumnCount(9); tableWidget->setHorizontalHeaderLabels(headers); tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); @@ -113,6 +277,8 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { tableWidget->horizontalHeader()->setStretchLastSection(true); tableWidget->verticalHeader()->setVisible(false); tableWidget->setRowCount(icons.size()); + tableWidget->setSortingEnabled(true); + for (int row = 0; auto& icon : icons) { QTableWidgetItem* item = new QTableWidgetItem(); item->setData(Qt::DecorationRole, icon); @@ -122,15 +288,34 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { const std::string filename = GetTrpType(trpType[row].at(0)); QTableWidgetItem* typeitem = new QTableWidgetItem(); - auto resource = cmrc::res::get_filesystem(); - std::string resourceString = "src/images/" + filename; - auto file = resource.open(resourceString); - std::vector imgdata(file.begin(), file.end()); - QImage type_icon = QImage::fromData(imgdata).scaled(QSize(64, 64), Qt::KeepAspectRatio, - Qt::SmoothTransformation); + const auto CustomTrophy_Dir = + Common::FS::GetUserPath(Common::FS::PathType::CustomTrophy); + std::string customPath; + + if (fs::exists(CustomTrophy_Dir / filename)) { + customPath = (CustomTrophy_Dir / filename).string(); + } + + std::vector imgdata; + + if (!customPath.empty()) { + std::ifstream file(customPath, std::ios::binary); + if (file) { + imgdata = std::vector(std::istreambuf_iterator(file), + std::istreambuf_iterator()); + } + } else { + auto resource = cmrc::res::get_filesystem(); + std::string resourceString = "src/images/" + filename; + auto file = resource.open(resourceString); + imgdata = std::vector(file.begin(), file.end()); + } + + QImage type_icon = QImage::fromData(imgdata).scaled( + QSize(100, 100), Qt::KeepAspectRatio, Qt::SmoothTransformation); typeitem->setData(Qt::DecorationRole, type_icon); typeitem->setFlags(typeitem->flags() & ~Qt::ItemIsEditable); - tableWidget->setItem(row, 6, typeitem); + tableWidget->setItem(row, 5, typeitem); std::string detailString = trophyDetails[row].toStdString(); std::size_t newline_pos = 0; @@ -143,46 +328,45 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { SetTableItem(tableWidget, row, 0, trpUnlocked[row]); SetTableItem(tableWidget, row, 2, trophyNames[row]); SetTableItem(tableWidget, row, 3, QString::fromStdString(detailString)); - SetTableItem(tableWidget, row, 4, trpId[row]); - SetTableItem(tableWidget, row, 5, trpHidden[row]); - SetTableItem(tableWidget, row, 7, trpPid[row]); + SetTableItem(tableWidget, row, 4, trpTimeUnlocked[row]); + SetTableItem(tableWidget, row, 6, trpId[row]); + SetTableItem(tableWidget, row, 7, trpHidden[row]); + SetTableItem(tableWidget, row, 8, trpPid[row]); } tableWidget->verticalHeader()->resizeSection(row, icon.height()); row++; } tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); int width = 16; - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 9; i++) { width += tableWidget->horizontalHeader()->sectionSize(i); } tableWidget->resize(width, 720); tabWidget->addTab(tableWidget, tabName.insert(6, " ").replace(0, 1, tabName.at(0).toUpper())); - this->resize(width + 20, 720); + + this->showMaximized(); + + tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed); + tableWidget->setColumnWidth(3, 650); } this->setCentralWidget(tabWidget); } void TrophyViewer::SetTableItem(QTableWidget* parent, int row, int column, QString str) { - QWidget* widget = new QWidget(); - QVBoxLayout* layout = new QVBoxLayout(); - QLabel* label = new QLabel(str); - QTableWidgetItem* item = new QTableWidgetItem(); - label->setWordWrap(true); - label->setStyleSheet("color: white; font-size: 15px; font-weight: bold;"); + QTableWidgetItem* item = new QTableWidgetItem(str); - // Create shadow effect - QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(); - shadowEffect->setBlurRadius(5); // Set the blur radius of the shadow - shadowEffect->setColor(QColor(0, 0, 0, 160)); // Set the color and opacity of the shadow - shadowEffect->setOffset(2, 2); // Set the offset of the shadow - - label->setGraphicsEffect(shadowEffect); // Apply shadow effect to the QLabel - - layout->addWidget(label); if (column != 1 && column != 2 && column != 3) - layout->setAlignment(Qt::AlignCenter); - widget->setLayout(layout); + item->setTextAlignment(Qt::AlignCenter); + item->setFont(QFont("Arial", 12, QFont::Bold)); + + Theme theme = static_cast(Config::getMainWindowTheme()); + + if (theme == Theme::Light) { + item->setForeground(QBrush(Qt::black)); + } else { + item->setForeground(QBrush(Qt::white)); + } + parent->setItem(row, column, item); - parent->setCellWidget(row, column, widget); } diff --git a/src/qt_gui/trophy_viewer.h b/src/qt_gui/trophy_viewer.h index 089de433e..bd99e1a8c 100644 --- a/src/qt_gui/trophy_viewer.h +++ b/src/qt_gui/trophy_viewer.h @@ -23,6 +23,10 @@ class TrophyViewer : public QMainWindow { public: explicit TrophyViewer(QString trophyPath, QString gameTrpPath); + void updateTrophyInfo(); + + void updateTableFilters(); + private: void PopulateTrophyWidget(QString title); void SetTableItem(QTableWidget* parent, int row, int column, QString str); @@ -31,6 +35,10 @@ private: QStringList headers; QString gameTrpPath_; TRP trp; + QLabel* trophyInfoLabel; + QCheckBox* showEarnedCheck; + QCheckBox* showNotEarnedCheck; + QCheckBox* showHiddenCheck; std::string GetTrpType(const QChar trp_) { switch (trp_.toLatin1()) { From bf995d659bd349e655733f42e49fb5fb126a346d Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 28 Feb 2025 03:33:50 -0300 Subject: [PATCH 364/455] Cheats dont show other authors (#2558) --- src/qt_gui/cheats_patches.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/cheats_patches.cpp b/src/qt_gui/cheats_patches.cpp index bf7877f18..7239affd5 100644 --- a/src/qt_gui/cheats_patches.cpp +++ b/src/qt_gui/cheats_patches.cpp @@ -1082,7 +1082,11 @@ void CheatsPatches::addCheatsToLayout(const QJsonArray& modsArray, const QJsonAr QLabel* creditsLabel = new QLabel(); QString creditsText = tr("Author: "); if (!creditsArray.isEmpty()) { - creditsText += creditsArray[0].toString(); + QStringList authors; + for (const QJsonValue& credit : creditsArray) { + authors << credit.toString(); + } + creditsText += authors.join(", "); } creditsLabel->setText(creditsText); creditsLabel->setAlignment(Qt::AlignLeft); From 3b5d9459f3acbe08991ea4258a8ecbd975905d54 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 28 Feb 2025 03:34:01 -0300 Subject: [PATCH 365/455] 'Game Compatibility' read an issue from another operating system (#2559) --- src/qt_gui/compatibility_info.cpp | 47 ++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/src/qt_gui/compatibility_info.cpp b/src/qt_gui/compatibility_info.cpp index 443d56a20..da32f24ae 100644 --- a/src/qt_gui/compatibility_info.cpp +++ b/src/qt_gui/compatibility_info.cpp @@ -78,25 +78,38 @@ void CompatibilityInfoClass::UpdateCompatibilityDatabase(QWidget* parent, bool f CompatibilityEntry CompatibilityInfoClass::GetCompatibilityInfo(const std::string& serial) { QString title_id = QString::fromStdString(serial); if (m_compatibility_database.contains(title_id)) { - { - QJsonObject compatibility_obj = m_compatibility_database[title_id].toObject(); - for (int os_int = 0; os_int != static_cast(OSType::Last); os_int++) { - QString os_string = OSTypeToString.at(static_cast(os_int)); - if (compatibility_obj.contains(os_string)) { - QJsonObject compatibility_entry_obj = compatibility_obj[os_string].toObject(); - CompatibilityEntry compatibility_entry{ - LabelToCompatStatus.at(compatibility_entry_obj["status"].toString()), - compatibility_entry_obj["version"].toString(), - QDateTime::fromString(compatibility_entry_obj["last_tested"].toString(), - Qt::ISODate), - compatibility_entry_obj["url"].toString(), - compatibility_entry_obj["issue_number"].toString()}; - return compatibility_entry; - } - } + QJsonObject compatibility_obj = m_compatibility_database[title_id].toObject(); + + // Set current_os automatically + QString current_os; +#ifdef Q_OS_WIN + current_os = "os-windows"; +#elif defined(Q_OS_MAC) + current_os = "os-macOS"; +#elif defined(Q_OS_LINUX) + current_os = "os-linux"; +#else + current_os = "os-unknown"; +#endif + // Check if the game is compatible with the current operating system + if (compatibility_obj.contains(current_os)) { + QJsonObject compatibility_entry_obj = compatibility_obj[current_os].toObject(); + CompatibilityEntry compatibility_entry{ + LabelToCompatStatus.at(compatibility_entry_obj["status"].toString()), + compatibility_entry_obj["version"].toString(), + QDateTime::fromString(compatibility_entry_obj["last_tested"].toString(), + Qt::ISODate), + compatibility_entry_obj["url"].toString(), + compatibility_entry_obj["issue_number"].toString()}; + return compatibility_entry; + } else { + // If there is no entry for the current operating system, return "Unknown" + return CompatibilityEntry{CompatibilityStatus::Unknown, "", + QDateTime::currentDateTime(), "", 0}; } } + // If title not found, return "Unknown" return CompatibilityEntry{CompatibilityStatus::Unknown, "", QDateTime::currentDateTime(), "", 0}; } @@ -200,4 +213,4 @@ const QString CompatibilityInfoClass::GetCompatStatusString(const CompatibilityS default: return tr("Unknown"); } -} \ No newline at end of file +} From f5c75a5f5578c8f99d96d3b992fdfe87fd6d0786 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 28 Feb 2025 08:35:49 +0200 Subject: [PATCH 366/455] New Crowdin updates (#2527) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Polish) * New translations en_us.ts (Polish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Polish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Polish) * New translations en_us.ts (Romanian) * New translations en_us.ts (Polish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (French) * New translations en_us.ts (French) * New translations en_us.ts (French) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) --- src/qt_gui/translations/es_ES.ts | 216 ++++++++++++------------- src/qt_gui/translations/fr_FR.ts | 46 +++--- src/qt_gui/translations/pl_PL.ts | 268 +++++++++++++++---------------- src/qt_gui/translations/pt_BR.ts | 132 +++++++-------- src/qt_gui/translations/ro_RO.ts | 10 +- src/qt_gui/translations/sq_AL.ts | 20 +-- src/qt_gui/translations/sv_SE.ts | 20 +-- 7 files changed, 356 insertions(+), 356 deletions(-) diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 932d72d2a..148613422 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -411,7 +411,7 @@ D-Pad - D-Pad + Botones de dirección Up @@ -419,27 +419,27 @@ Left - Left + Izquierda Right - Right + Derecha Down - Down + Abajo Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Zona muerta del stick izquierdo (defecto: 2, máx.: 127) Left Deadzone - Left Deadzone + Zona muerta del stick izquierdo Left Stick - Left Stick + Stick izquierdo Config Selection @@ -455,31 +455,31 @@ L1 / LB - L1 / LB + L1/LB L2 / LT - L2 / LT + L2/LT Back - Back + Back R1 / RB - R1 / RB + R1/RB R2 / RT - R2 / RT + R2/RT L3 - L3 + L3 Options / Start - Options / Start + Options/Start R3 @@ -487,19 +487,19 @@ Face Buttons - Face Buttons + Botones de acción Triangle / Y - Triangle / Y + Triángulo/Y Square / X - Square / X + Cuadrado/X Circle / B - Circle / B + Círculo/B Cross / A @@ -507,31 +507,31 @@ Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Zona muerta del stick derecho (defecto: 2, máx.: 127) Right Deadzone - Right Deadzone + Zona muerta del stick derecho Right Stick - Right Stick + Stick derecho Color Adjustment - Color Adjustment + Calibración de color R: - R: + R: G: - G: + V: B: - B: + A: Override Lightbar Color @@ -580,11 +580,11 @@ Error - Error + Error Directory to install DLC - Directory to install DLC + Carpeta para instalar DLC @@ -603,7 +603,7 @@ Compatibility - Compatibility + Compatibilidad Region @@ -611,7 +611,7 @@ Firmware - Firmware + Firmware Size @@ -635,31 +635,31 @@ h - h + h m - m + m s - s + s Compatibility is untested - Compatibility is untested + Compatibilidad no comprobada Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + El juego no se inicia correctamente o cuelga el emulador Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + El juego arranca, pero se queda en blanco Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + El juego muestra imágenes, pero no va más allá de los menús Game has game-breaking glitches or unplayable performance @@ -667,7 +667,7 @@ Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + El juego puede completarse con un rendimiento jugable y sin errores de importancia Click to see details on github @@ -682,19 +682,19 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB @@ -749,7 +749,7 @@ Copy Version - Copy Version + Copiar versión Copy Size @@ -761,11 +761,11 @@ Delete... - Delete... + Eliminar... Delete Game - Delete Game + Eliminar juego Delete Update @@ -773,23 +773,23 @@ Delete DLC - Delete DLC + Eliminar DLC Compatibility... - Compatibility... + Compatibilidad... Update database - Update database + Actualizar base de datos View report - View report + Ver informe Submit a report - Submit a report + Enviar un informe Shortcut creation @@ -801,7 +801,7 @@ Error - Error + Error Error creating shortcut! @@ -813,59 +813,59 @@ Game - Game + Juego This game has no update to delete! - This game has no update to delete! + ¡Este juego no tiene actualizaciones! Update - Update + Actualización This game has no DLC to delete! - This game has no DLC to delete! + ¡Este juego no tiene DLCs! DLC - DLC + DLC Delete %1 - Delete %1 + Eliminar %1 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + ¿Seguro que quieres eliminar el directorio %2 de %1? Open Update Folder - Open Update Folder + Abrir carpeta de actualizaciones Delete Save Data - Delete Save Data + Eliminar datos guardados This game has no update folder to open! - This game has no update folder to open! + ¡Este juego no tiene carpeta de actualizaciones! Failed to convert icon. - Failed to convert icon. + Error al convertir el icono. This game has no save data to delete! - This game has no save data to delete! + ¡Este juego no tiene datos guardados! Save Data - Save Data + Datos guardados SFO Viewer for - SFO Viewer for + Visualizador de SFO para @@ -876,15 +876,15 @@ Select which directory you want to install to. - Select which directory you want to install to. + Selecciona el directorio de instalación. Install All Queued to Selected Folder - Install All Queued to Selected Folder + Instalar toda la cola en la carpeta seleccionada Delete PKG File on Install - Delete PKG File on Install + Eliminar archivo PKG tras la instalación @@ -923,7 +923,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + Abrir carpeta de shadPS4 Exit @@ -1163,7 +1163,7 @@ Run Game - Run Game + Ejecutar juego Eboot.bin file not found @@ -1171,19 +1171,19 @@ PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + Archivo PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + El archivo PKG es un parche o un DLC, ¡debes instalar el juego primero! Game is already running! - Game is already running! + ¡El juego ya se está ejecutando! shadPS4 - shadPS4 + shadPS4 @@ -1214,19 +1214,19 @@ Category - Category + Categoría Type - Type + Tipo App Ver - App Ver + Versión de aplicación FW - FW + FW Region @@ -1234,7 +1234,7 @@ Flags - Flags + Etiquetas Path @@ -1250,7 +1250,7 @@ Package - Package + Paquete @@ -1261,7 +1261,7 @@ General - General + General System @@ -1281,7 +1281,7 @@ Enable Separate Update Folder - Enable Separate Update Folder + Habilitar carpeta independiente de actualizaciones Default tab when opening settings @@ -1305,11 +1305,11 @@ Trophy Key - Trophy Key + Clave de trofeos Trophy - Trophy + Trofeo Logger @@ -1333,7 +1333,7 @@ Cursor - Cursor + Cursor Hide Cursor @@ -1345,7 +1345,7 @@ s - s + s Controller @@ -1389,7 +1389,7 @@ Enable HDR - Enable HDR + Habilitar HDR Paths @@ -1429,15 +1429,15 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Habilitar diagnóstico de fallos Collect Shaders - Collect Shaders + Recopilar shaders Copy GPU Buffers - Copy GPU Buffers + Copiar búferes de GPU Host Debug Markers @@ -1473,11 +1473,11 @@ Title Music - Title Music + Música de título Disable Trophy Pop-ups - Disable Trophy Pop-ups + Deshabilitar mensajes de trofeos Background Image @@ -1497,7 +1497,7 @@ Update Compatibility Database On Startup - Update Compatibility Database On Startup + Actualizar base de datos de compatibilidad al iniciar Game Compatibility @@ -1505,11 +1505,11 @@ Display Compatibility Data - Display Compatibility Data + Mostrar datos de compatibilidad Update Compatibility Database - Update Compatibility Database + Actualizar base de datos de compatibilidad Volume @@ -1721,11 +1721,11 @@ Release - Release + Principal Nightly - Nightly + Nightly Set the volume of the background music. @@ -1733,11 +1733,11 @@ Enable Motion Controls - Enable Motion Controls + Habilitar controles de movimiento Save Data Path - Save Data Path + Ruta de datos guardados Browse @@ -1753,7 +1753,7 @@ Auto Select - Auto Select + Selección automática Directory to install games @@ -1761,39 +1761,39 @@ Directory to save data - Directory to save data + Directorio para guardar datos Video - Video + Vídeo Display Mode - Display Mode + Modo de imagen Windowed - Windowed + Ventana Fullscreen - Fullscreen + Pantalla completa Fullscreen (Borderless) - Fullscreen (Borderless) + Pantalla completa (sin bordes) Window Size - Window Size + Tamaño de ventana W: - W: + Ancho: H: - H: + Alto: Separate Log Files diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index fef03d7bb..a812631f5 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -519,19 +519,19 @@ Color Adjustment - Color Adjustment + Ajustement des couleurs R: - R: + R: G: - G: + G: B: - B: + B: Override Lightbar Color @@ -539,7 +539,7 @@ Override Color - Override Color + Remplacer la couleur @@ -1234,7 +1234,7 @@ Flags - Flags + Les indicateurs Path @@ -1577,7 +1577,7 @@ Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Image de fond :\nContrôle l'opacité de l'image de fond du jeu. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. @@ -1661,7 +1661,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Activer HDR:\nActive le HDR dans les jeux qui le supportent.\nVotre moniteur doit avoir la prise en charge de l'espace couleur PQ BT2020 et du format swapchain RGB10A2. Game Folders:\nThe list of folders to check for installed games. @@ -1721,11 +1721,11 @@ Release - Release + Sortie Nightly - Nightly + Nocturne Set the volume of the background music. @@ -1737,7 +1737,7 @@ Save Data Path - Save Data Path + Enregistrer le chemin vers les données Browse @@ -1745,15 +1745,15 @@ async - async + asynchrone sync - sync + synchrone Auto Select - Auto Select + Sélection automatique Directory to install games @@ -1761,39 +1761,39 @@ Directory to save data - Directory to save data + Répertoire d'enregistrement des données Video - Video + Vidéo Display Mode - Display Mode + Mode d'affichage Windowed - Windowed + Fenêtré Fullscreen - Fullscreen + Plein écran Fullscreen (Borderless) - Fullscreen (Borderless) + Plein écran (sans bordure) Window Size - Window Size + Taille de fenêtre W: - W: + W: H: - H: + H: Separate Log Files diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 05ce4d9be..407948fae 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -22,7 +22,7 @@ CheatsPatches Cheats / Patches for - Kody / Łatki dla + Kody / Poprawki dla Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -58,15 +58,15 @@ Delete File - Delete File + Usuń plik No files selected. - No files selected. + Nie wybrano pliku. You can delete the cheats you don't want after downloading them. - You can delete the cheats you don't want after downloading them. + Możesz usunąć kody, których nie chcesz po ich pobraniu. Do you want to delete the selected file?\n%1 @@ -202,7 +202,7 @@ You may need to update your game. - Możesz potrzebować zaktualizować swoją grę. + Może być konieczne uaktualnienie gry. Incompatibility Notice @@ -230,11 +230,11 @@ Failed to open files.json for reading. - Failed to open files.json for reading. + Nie można otworzyć pliku files.json do odczytu. Name: - Name: + Nazwa: Can't apply cheats before the game is started @@ -249,7 +249,7 @@ CheckUpdate Auto Updater - Automatyczne aktualizacje + Asystent aktualizacji Error @@ -289,7 +289,7 @@ Update Channel - Kanał Aktualizacji + Kanał aktualizacji Current Version @@ -297,7 +297,7 @@ Latest Version - Ostatnia wersja + Najnowsza wersja Do you want to update? @@ -388,7 +388,7 @@ Boots - Buty + Uruchamia się Menus @@ -400,146 +400,146 @@ Playable - Do grania + Grywalne ControlSettings Configure Controls - Configure Controls + Skonfiguruj sterowanie D-Pad - D-Pad + Krzyżak Up - Up + Góra Left - Left + Lewo Right - Right + Prawo Down - Down + Dół Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Martwa strefa lewego drążka (def:2 max:127) Left Deadzone - Left Deadzone + Martwa strefa lewego drążka Left Stick - Left Stick + Lewy drążek Config Selection - Config Selection + Wybór konfiguracji Common Config - Common Config + Typowa konfiguracja Use per-game configs - Use per-game configs + Użyj osobnej konfiguracji dla każdej gry L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT Back - Back + Wstecz R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Opcje / Start R3 - R3 + R3 Face Buttons - Face Buttons + Przyciski akcji Triangle / Y - Triangle / Y + Trójkąt / Y Square / X - Square / X + Kwadrat / X Circle / B - Circle / B + Kółko / B Cross / A - Cross / A + Krzyżyk / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Martwa strefa prawego drążka (def:2 max:127) Right Deadzone - Right Deadzone + Martwa strefa prawego drążka Right Stick - Right Stick + Prawy drążek Color Adjustment - Color Adjustment + Dostosowanie koloru R: - R: + Czerwony: G: - G: + Zielony: B: - B: + Niebieski: Override Lightbar Color - Override Lightbar Color + Zastąp kolor paska świetlnego Override Color - Override Color + Zastąp kolor @@ -584,7 +584,7 @@ Directory to install DLC - Directory to install DLC + Katalog do instalacji dodatkowej zawartości (DLC) @@ -603,11 +603,11 @@ Compatibility - Zgodność + Kompatybilność Region - Region + Region Firmware @@ -635,15 +635,15 @@ h - h + godz. m - m + min s - s + s Compatibility is untested @@ -682,23 +682,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -729,7 +729,7 @@ Open Save Data Folder - Otwórz Folder Danych Zapisów + Otwórz folder zapisanych danych Open Log Folder @@ -749,11 +749,11 @@ Copy Version - Copy Version + Kopiuj wersję Copy Size - Copy Size + Kopiuj rozmiar Copy All @@ -765,19 +765,19 @@ Delete Game - Usuń Grę + Usuń grę Delete Update - Usuń Aktualizację + Usuń aktualizację Delete DLC - Usuń DLC + Usuń dodatkową zawartość (DLC) Compatibility... - kompatybilność... + Kompatybilność... Update database @@ -825,11 +825,11 @@ This game has no DLC to delete! - Ta gra nie ma DLC do usunięcia! + Ta gra nie ma dodatkowej zawartości (DLC) do usunięcia! DLC - DLC + Dodatkowa zawartość (DLC) Delete %1 @@ -841,31 +841,31 @@ Open Update Folder - Open Update Folder + Otwórz folder aktualizacji Delete Save Data - Delete Save Data + Usuń zapisane dane This game has no update folder to open! - This game has no update folder to open! + Ta gra nie ma folderu aktualizacji do otwarcia! Failed to convert icon. - Failed to convert icon. + Nie udało się przekonwertować ikony. This game has no save data to delete! - This game has no save data to delete! + Ta gra nie ma zapisów do usunięcia! Save Data - Save Data + Zapisane dane SFO Viewer for - SFO Viewer for + Menedżer plików SFO dla @@ -880,11 +880,11 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Zainstaluj wszystkie oczekujące do wybranego folderu Delete PKG File on Install - Delete PKG File on Install + Usuń plik PKG po instalacji @@ -1127,15 +1127,15 @@ DLC Installation - Instalacja DLC + Instalacja dodatkowej zawartości (DLC) Would you like to install DLC: %1? - Czy chcesz zainstalować DLC: %1? + Czy chcesz zainstalować dodatkową zawartość (DLC): %1? DLC already installed: - DLC już zainstalowane: + Dodatkowa zawartość (DLC) już zainstalowana: Game already installed @@ -1163,27 +1163,27 @@ Run Game - Run Game + Uruchom grę Eboot.bin file not found - Eboot.bin file not found + Nie znaleziono pliku EBOOT.BIN PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + Plik PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG jest aktualizacją lub dodatkową zawartością (DLC), najpierw zainstaluj grę! Game is already running! - Game is already running! + Gra jest już uruchomiona! shadPS4 - shadPS4 + shadPS4 @@ -1206,7 +1206,7 @@ Installed - Installed + Zainstalowano Size @@ -1214,27 +1214,27 @@ Category - Category + Kategoria Type - Type + Typ App Ver - App Ver + Wersja aplikacji FW - FW + Oprogramowanie Region - Region + Region Flags - Flags + Flagi Path @@ -1250,7 +1250,7 @@ Package - Package + Paczka @@ -1265,7 +1265,7 @@ System - System + System Console Language @@ -1277,7 +1277,7 @@ Emulator - Emulator + Emulator Enable Separate Update Folder @@ -1329,7 +1329,7 @@ Input - Wejście + Sterowanie Cursor @@ -1345,7 +1345,7 @@ s - s + s Controller @@ -1389,7 +1389,7 @@ Enable HDR - Enable HDR + Włącz HDR Paths @@ -1429,23 +1429,23 @@ Enable Crash Diagnostics - Enable Crash Diagnostics + Włącz diagnostykę awarii Collect Shaders - Collect Shaders + Zbieraj cienie Copy GPU Buffers - Copy GPU Buffers + Kopiuj bufory GPU Host Debug Markers - Host Debug Markers + Znaczniki diagnostyczne gospodarza Guest Debug Markers - Guest Debug Markers + Znaczniki diagnostyczne gościa Update @@ -1473,7 +1473,7 @@ Title Music - Title Music + Muzyka tytułowa Disable Trophy Pop-ups @@ -1481,15 +1481,15 @@ Background Image - Background Image + Obraz tła Show Background Image - Show Background Image + Pokaż obraz tła Opacity - Opacity + Przezroczystość Play title music @@ -1577,7 +1577,7 @@ Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Obraz tła:\nKontroluj przezroczystość obrazu tła gry. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. @@ -1661,7 +1661,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Włącz HDR:\nWłącza HDR w grach, które go wspierają.\nTwój monitor musi mieć wsparcie dla przestrzeni kolorów BT2020 PQ oraz formatu RGB10A2 swapchain. Game Folders:\nThe list of folders to check for installed games. @@ -1693,51 +1693,51 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Zbieranie cieni:\nPotrzebujesz tej opcji aby edytować cienie za pomocą menu debugowania (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Diagnostyka awarii:\nTworzy plik .yaml z informacjami o stanie Vulkan w momencie awarii.\nPrzydatne do debugowania błędów 'DEVICE LOST' . Jeśli ta opcja jest włączona, powinieneś włączyć "Znaczniki błędów gospodarza" oraz "Znaczniki błędów gościa".\nNie działa na kartach graficznych Intela.\nOpcja "Włącz warstwy walidacji Vulkan" i Vulkan SDK jest wymagana do działania. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Kopiowanie buforów karty graficznej:\nOmija problemy wyścigów związane z przesyłaniem danych do karty graficznej.\nMoże, ale nie musi, pomóc w przypadku awarii typu PM4 0. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Wskaźniki debugowania gospodarza:\nWstawia informacje emulatora, takie jak znaczniki dla konkretnych poleceń AMDGPU wokół poleceń Vulkan, a także nadaje nazwy debugowania zasobów.\nJeśli ta opcja jest włączona, powinieneś włączyć diagnostykę awarii.\nPrzydatne dla programów takich jak RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Znaczniki debugowania gościa:\nWstawia wszystkie znaczniki debugowania, które gra dodała do buforu poleceń.\nJeśli ta opcja jest włączona, powinieneś włączyć diagnostykę awarii.\nPrzydatne dla programów takich jak RenderDoc. Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Ścieżka zapisu danych:\nFolder, w którym zapisywane będą dane gry. Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Przeglądaj:\nPrzeglądaj folder, aby ustawić ścieżkę zapisywania danych. Release - Release + Wersja stablina Nightly - Nightly + Wersja rozwojowa Set the volume of the background music. - Set the volume of the background music. + Wybierz poziom głośności muzyki w tle. Enable Motion Controls - Enable Motion Controls + Włącz sterowanie ruchem Save Data Path - Save Data Path + Ścieżka zapisanych danych Browse @@ -1745,15 +1745,15 @@ async - async + asynchroniczny sync - sync + synchroniczny Auto Select - Auto Select + Wybór automatyczny Directory to install games @@ -1761,47 +1761,47 @@ Directory to save data - Directory to save data + Katalog do zapisywania danych Video - Video + Wyświetlanie Display Mode - Display Mode + Tryb wyświetlania Windowed - Windowed + Tryb okna Fullscreen - Fullscreen + Tryb pełnoekranowy Fullscreen (Borderless) - Fullscreen (Borderless) + Tryb pełnoekranowy (bez obramowania) Window Size - Window Size + Rozmiar okna W: - W: + Szerokość: H: - H: + Wysokość: Separate Log Files - Separate Log Files + Oddzielne pliki dziennika Separate Log Files:\nWrites a separate logfile for each game. - Separate Log Files:\nWrites a separate logfile for each game. + Oddzielne pliki dziennika:\nZapisuje oddzielny plik dziennika dla każdej gry. diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 3ff4e106a..406109150 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -11,26 +11,26 @@ shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. + O shadPS4 é um emulador experimental de código-fonte aberto para o PlayStation 4. This software should not be used to play games you have not legally obtained. - Este programa não deve ser usado para jogar jogos que tenham sido obtidos ilegalmente. + Este programa não deve ser usado para executar jogos que tenham sido obtidos ilegalmente. CheatsPatches Cheats / Patches for - Cheats / Patches para + Trapaças / Patches para Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - Cheats/Patches são experimentais.\nUse com cautela.\n\nBaixe os cheats individualmente selecionando o repositório e clicando no botão de download.\nNa aba Patches, você pode baixar todos os Patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos os Cheats/Patches,\npor favor, reporte os problemas relacionados ao autor do cheat.\n\nCriou um novo cheat? Visite:\n + As Trapaças/Patches são experimentais.\nUse com cautela.\n\nBaixe as trapaças individualmente selecionando o repositório e clicando no botão de baixar.\nNa aba Patches, você pode baixar todos os patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos as Trapaças/Patches,\npor favor, reporte os problemas relacionados ao autor da trapaça.\n\nCriou uma nova trapaça? Visite:\n No Image Available - Imagem Não Disponível + Nenhuma Imagem Disponível Serial: @@ -46,7 +46,7 @@ Select Cheat File: - Selecione o Arquivo de Cheat: + Selecione o Arquivo de Trapaça: Repository: @@ -54,7 +54,7 @@ Download Cheats - Baixar Cheats + Baixar Trapaças Delete File @@ -66,7 +66,7 @@ You can delete the cheats you don't want after downloading them. - Você pode excluir os cheats que não deseja após baixá-los. + Você pode excluir as trapaças que não deseja após baixá-las. Do you want to delete the selected file?\n%1 @@ -86,7 +86,7 @@ Cheats - Cheats + Trapaças Patches @@ -118,7 +118,7 @@ Failed to parse XML: - Falha ao analisar XML: + Falha ao analisar o XML: Success @@ -154,19 +154,19 @@ Cheats Not Found - Cheats Não Encontrados + Trapaças Não Encontradas No Cheats found for this game in this version of the selected repository,try another repository or a different version of the game. - Nenhum cheat encontrado para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. + Nenhuma trapaça encontrada para este jogo nesta versão do repositório selecionado, tente outro repositório ou uma versão diferente do jogo. Cheats Downloaded Successfully - Cheats Baixados com Sucesso + Trapaças Baixadas com Sucesso You have successfully downloaded the cheats for this version of the game from the selected repository. You can try downloading from another repository, if it is available it will also be possible to use it by selecting the file from the list. - Você baixou os cheats para esta versão do jogo do repositório selecionado com sucesso. É possível tentar baixar de outro repositório, se estiver disponível, também será possível utilizá-lo selecionando o arquivo da lista. + Você baixou as trapaças para esta versão do jogo do repositório selecionado com sucesso. É possível tentar baixar de outro repositório, se estiver disponível, também será possível utilizá-lo selecionando o arquivo da lista. Failed to save: @@ -182,11 +182,11 @@ Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece em Cheats. Se o patch não aparecer, pode ser que ele não exista para o serial e versão específicas do jogo. + Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece em Trapaças. Se o patch não aparecer, pode ser que ele não exista para o serial e versão específicas do jogo. Failed to parse JSON data from HTML. - Falha ao analisar dados JSON do HTML. + Falha ao analisar os dados JSON do HTML. Failed to retrieve HTML page. @@ -206,7 +206,7 @@ Incompatibility Notice - Aviso de incompatibilidade + Aviso de Incompatibilidade Failed to open file: @@ -214,7 +214,7 @@ XML ERROR: - ERRO de XML: + ERRO DE XML: Failed to open files.json for writing @@ -238,7 +238,7 @@ Can't apply cheats before the game is started - Não é possível aplicar cheats antes que o jogo comece. + Não é possível aplicar trapaças antes de começar o jogo. Close @@ -285,7 +285,7 @@ Update Available - Atualização disponível + Atualização Disponível Update Channel @@ -309,7 +309,7 @@ Check for Updates at Startup - Verificar Atualizações ao Iniciar + Verificar por Atualizações ao Iniciar Update @@ -376,7 +376,7 @@ Unable to open compatibility_data.json for writing. - Não foi possível abrir o compatibility_data.json para escrita. + Não foi possível abrir o compatibility_data.json para gravação. Unknown @@ -388,7 +388,7 @@ Boots - Boot + Inicia Menus @@ -487,7 +487,7 @@ Face Buttons - Botões de Face + Botões de Ação Triangle / Y @@ -535,7 +535,7 @@ Override Lightbar Color - Substituir cor da Lightbar + Substituir Cor da Barra de Luz Override Color @@ -631,7 +631,7 @@ Never Played - Nunca jogado + Nunca Jogado h @@ -663,11 +663,11 @@ Game has game-breaking glitches or unplayable performance - O jogo tem falhas que interrompem o jogo ou desempenho injogável + O jogo tem defeitos que interrompem o jogo ou desempenho injogável Game can be completed with playable performance and no major glitches - O jogo pode ser concluído com desempenho jogável e sem grandes falhas + O jogo pode ser concluído com desempenho jogável e sem grandes defeitos Click to see details on github @@ -709,7 +709,7 @@ Cheats / Patches - Cheats / Patches + Trapaças / Patches SFO Viewer @@ -761,19 +761,19 @@ Delete... - Deletar... + Excluir... Delete Game - Deletar Jogo + Excluir Jogo Delete Update - Deletar Atualização + Excluir Atualização Delete DLC - Deletar DLC + Excluir DLC Compatibility... @@ -825,7 +825,7 @@ This game has no DLC to delete! - Este jogo não tem DLC para deletar! + Este jogo não tem DLC para excluir! DLC @@ -833,11 +833,11 @@ Delete %1 - Deletar %1 + Excluir %1 Are you sure you want to delete %1's %2 directory? - Tem certeza de que deseja excluir o diretório %2 de %1 ? + Tem certeza de que deseja excluir o diretório %2 de %1? Open Update Folder @@ -849,7 +849,7 @@ This game has no update folder to open! - Este jogo não tem atualização para deletar! + Este jogo não possui pasta de atualização para abrir! Failed to convert icon. @@ -857,7 +857,7 @@ This game has no save data to delete! - Este jogo não tem dados salvos para deletar! + Este jogo não tem dados salvos para excluir! Save Data @@ -880,11 +880,11 @@ Install All Queued to Selected Folder - Instalar Todas da Fila para a Pasta Selecionada + Instalar Tudo da Fila para a Pasta Selecionada Delete PKG File on Install - Deletar PKG após instalação + Excluir o PKG após a Instalação @@ -923,7 +923,7 @@ Open shadPS4 Folder - Abrir pasta shadPS4 + Abrir Pasta do shadPS4 Exit @@ -979,11 +979,11 @@ Download Cheats/Patches - Baixar Cheats/Patches + Baixar Trapaças/Patches Dump Game List - Dumpar Lista de Jogos + Exportar Lista de Jogos PKG Viewer @@ -1059,7 +1059,7 @@ Download Cheats For All Installed Games - Baixar Cheats para Todos os Jogos Instalados + Baixar Trapaças para Todos os Jogos Instalados Download Patches For All Games @@ -1071,7 +1071,7 @@ You have downloaded cheats for all the games you have installed. - Você baixou cheats para todos os jogos que instalou. + Você baixou trapaças para todos os jogos que instalou. Patches Downloaded Successfully! @@ -1107,15 +1107,15 @@ PKG and Game versions match: - As versões do PKG e do Jogo são igual: + As versões do PKG e do Jogo são iguais: Would you like to overwrite? - Gostaria de substituir? + Você gostaria de sobrescrever? PKG Version %1 is older than installed version: - Versão do PKG %1 é mais antiga do que a versão instalada: + A Versão do PKG %1 é mais antiga do que a versão instalada: Game is installed: @@ -1143,7 +1143,7 @@ PKG ERROR - ERRO de PKG + ERRO DE PKG Extracting PKG %1/%2 @@ -1194,7 +1194,7 @@ PKG ERROR - ERRO de PKG + ERRO DE PKG Name @@ -1222,7 +1222,7 @@ App Ver - App Ver + Versão do App FW @@ -1238,7 +1238,7 @@ Path - Diretório + Caminho File @@ -1381,7 +1381,7 @@ Enable Shaders Dumping - Ativar Dumping de Shaders + Ativar Exportação de Shaders Enable NULL GPU @@ -1413,7 +1413,7 @@ Enable Debug Dumping - Ativar Depuração de Dumping + Ativar Exportação de Depuração Enable Vulkan Validation Layers @@ -1453,7 +1453,7 @@ Check for Updates at Startup - Verificar Atualizações ao Iniciar + Verificar por Atualizações ao Iniciar Always Show Changelog @@ -1497,7 +1497,7 @@ Update Compatibility Database On Startup - Atualizar Compatibilidade ao Inicializar + Atualizar Base de Dados de Compatibilidade ao Inicializar Game Compatibility @@ -1537,15 +1537,15 @@ Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. - Idioma do console:\nDefine o idioma usado pelo jogo do PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. + Idioma do Console:\nDefine o idioma usado pelo jogo do PS4.\nRecomenda-se configurá-lo para um idioma que o jogo suporte, o que pode variar conforme a região. Emulator Language:\nSets the language of the emulator's user interface. - Idioma do emulador:\nDefine o idioma da interface do emulador. + Idioma do Emulador:\nDefine o idioma da interface do emulador. Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Ativar pasta de atualização separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento.\nIsso pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome "CUSA00000-UPDATE" onde o ID do CUSA corresponde ao ID do jogo. + Ativar Pasta de Atualização Separada:\nPermite instalar atualizações de jogos em uma pasta separada para fácil gerenciamento.\nIsso pode ser manualmente criado adicionando a atualização extraída à pasta do jogo com o nome "CUSA00000-UPDATE" onde o ID do CUSA corresponde ao ID do jogo. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1557,7 +1557,7 @@ Username:\nSets the PS4's account username, which may be displayed by some games. - Nome de usuário:\nDefine o nome de usuário da conta PS4 que pode ser exibido por alguns jogos. + Nome de usuário:\nDefine o nome de usuário da conta do PS4, que pode ser exibido por alguns jogos. Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. @@ -1565,7 +1565,7 @@ Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Tipo de Registro:\nDetermina se a saída da janela de log deve ser sincronizada por motivos de desempenho. Pode impactar negativamente a emulação. + Tipo de Registro:\nDetermina se a saída da janela de log deve ser sincronizada por motivos de desempenho. Pode impactar negativamente na emulação. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. @@ -1601,7 +1601,7 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na visualização de tabela.\nAtivar "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. + Exibir Dados de Compatibilidade:\nExibe informações de compatibilidade dos jogos na visualização de tabela.\nAtive "Atualizar Compatibilidade ao Inicializar" para obter informações atualizadas. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. @@ -1609,7 +1609,7 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Atualizar Lista de Compatibilidade:\nAtualizar imediatamente o banco de dados de compatibilidade. + Atualizar Lista de Compatibilidade:\nAtualiza imediatamente o banco de dados de compatibilidade. Never @@ -1633,7 +1633,7 @@ Touchpad Center - Touchpad Centro + Centro do Touchpad None @@ -1653,7 +1653,7 @@ Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Ativar Dumping de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. + Ativar Exportação de Shaders:\nArmazena os shaders do jogo em uma pasta durante a renderização para fins de depuração técnica. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. @@ -1677,7 +1677,7 @@ Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - Ativar Depuração de Dumping:\nArmazena os símbolos de importação, exportação e informações do cabeçalho do arquivo do programa PS4 atual em um diretório. + Ativar Exportação de Depuração:\nArmazena os símbolos de importação, exportação e informações do cabeçalho do arquivo do programa PS4 atual em um diretório. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 4d9052261..7083e6d49 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -7,7 +7,7 @@ AboutDialog About shadPS4 - About shadPS4 + Despre shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -584,7 +584,7 @@ Directory to install DLC - Directory to install DLC + Director pentru a instala DLC @@ -845,11 +845,11 @@ Delete Save Data - Delete Save Data + Șterge Salvare Date This game has no update folder to open! - This game has no update folder to open! + Acest joc nu are folderul de actualizări pentru a fi deschis! Failed to convert icon. @@ -1190,7 +1190,7 @@ PKGViewer Open Folder - Open Folder + Deschide Folder PKG ERROR diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index ec07db041..0a90bcd10 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -1765,43 +1765,43 @@ Video - Video + Video Display Mode - Display Mode + Mënyra e Shfaqjes Windowed - Windowed + Dritare Fullscreen - Fullscreen + Ekran të plotë Fullscreen (Borderless) - Fullscreen (Borderless) + Ekran të plotë (Pa kufij) Window Size - Window Size + Masa e Dritares W: - W: + Gjer: H: - H: + Lart: Separate Log Files - Separate Log Files + Skedarë të Ditarit të Ndarë Separate Log Files:\nWrites a separate logfile for each game. - Separate Log Files:\nWrites a separate logfile for each game. + Skedarë të Ditarit të Ndarë:\nShkruan një skedar të ditarit të veçuar për secilën lojë. diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index bdd2d2aa0..e9ea2f20a 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1765,43 +1765,43 @@ Video - Video + Video Display Mode - Display Mode + Visningsläge Windowed - Windowed + Fönster Fullscreen - Fullscreen + Helskärm Fullscreen (Borderless) - Fullscreen (Borderless) + Helskärm (kantlöst) Window Size - Window Size + Fönsterstorlek W: - W: + B: H: - H: + H: Separate Log Files - Separate Log Files + Separata loggfiler Separate Log Files:\nWrites a separate logfile for each game. - Separate Log Files:\nWrites a separate logfile for each game. + Separata loggfiler:\nSkriver en separat loggfil för varje spel. From 169cbe90a5cb4c0c75817163716f37fdc668d365 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 28 Feb 2025 08:37:05 +0200 Subject: [PATCH 367/455] [ci skip] Qt GUI: Update Translation. (#2561) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 24ad63ca3..ea777a73a 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -419,11 +419,11 @@ Left - + Left Right - + Right Down @@ -873,7 +873,7 @@ Trophy - + Trophy SFO Viewer for @@ -1863,4 +1863,4 @@ - \ No newline at end of file + From 6331eb1d8af6794fc7eef70f2d4a21241c1ab529 Mon Sep 17 00:00:00 2001 From: Randomuser8219 <168323856+Randomuser8219@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:16:53 -0800 Subject: [PATCH 368/455] Add unexcepted depth format to unreachable (#2557) --- src/video_core/renderer_vulkan/liverpool_to_vk.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.h b/src/video_core/renderer_vulkan/liverpool_to_vk.h index a9fcd03a9..42da7aa06 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.h +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.h @@ -104,7 +104,7 @@ static inline vk::Format PromoteFormatToDepth(vk::Format fmt) { } else if (fmt == vk::Format::eR16Unorm) { return vk::Format::eD16Unorm; } - UNREACHABLE(); + UNREACHABLE_MSG("Unexpected depth format {}", vk::to_string(fmt)); } } // namespace Vulkan::LiverpoolToVK From 75db2533705b686dab34273c19571d948c4e4560 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 28 Feb 2025 12:33:52 -0300 Subject: [PATCH 369/455] 'Select' the log when opening the folder if SeparateLogFiles (#2560) * Select when opening log folder when getSeparateLogFilesEnabled * TR * + --- src/qt_gui/gui_context_menus.h | 52 +++++++++++++++++++++++++++++--- src/qt_gui/translations/en_US.ts | 4 +++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 385b5fda9..8a6e07847 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -157,10 +157,54 @@ public: } if (selected == openLogFolder) { - QString userPath; - Common::FS::PathToQString(userPath, - Common::FS::GetUserPath(Common::FS::PathType::UserDir)); - QDesktopServices::openUrl(QUrl::fromLocalFile(userPath + "/log")); + QString logPath; + Common::FS::PathToQString(logPath, + Common::FS::GetUserPath(Common::FS::PathType::LogDir)); + if (!Config::getSeparateLogFilesEnabled()) { + QDesktopServices::openUrl(QUrl::fromLocalFile(logPath)); + } else { + QString fileName = QString::fromStdString(m_games[itemID].serial) + ".log"; + QString filePath = logPath + "/" + fileName; + QStringList arguments; + if (QFile::exists(filePath)) { +#ifdef Q_OS_WIN + arguments << "/select," << filePath.replace("/", "\\"); + QProcess::startDetached("explorer", arguments); + +#elif defined(Q_OS_MAC) + arguments << "-R" << filePath; + QProcess::startDetached("open", arguments); + +#elif defined(Q_OS_LINUX) + QStringList arguments; + arguments << "--select" << filePath; + if (!QProcess::startDetached("nautilus", arguments)) { + // Failed to open Nautilus to select file + arguments.clear(); + arguments << logPath; + if (!QProcess::startDetached("xdg-open", arguments)) { + // Failed to open directory on Linux + } + } +#else + QDesktopServices::openUrl(QUrl::fromLocalFile(logPath)); +#endif + } else { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Information); + msgBox.setText(tr("No log file found for this game!")); + + QPushButton* okButton = msgBox.addButton(QMessageBox::Ok); + QPushButton* openFolderButton = + msgBox.addButton(tr("Open Log Folder"), QMessageBox::ActionRole); + + msgBox.exec(); + + if (msgBox.clickedButton() == openFolderButton) { + QDesktopServices::openUrl(QUrl::fromLocalFile(logPath)); + } + } + } } if (selected == &openSfoViewer) { diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index ea777a73a..92fb59a02 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -855,6 +855,10 @@ This game has no update folder to open! + + No log file found for this game! + + Failed to convert icon. From 99c7fc40496e0fdc46cec3f2e7bcaf68c4d1be41 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Fri, 28 Feb 2025 16:35:13 +0100 Subject: [PATCH 370/455] fix deprecation (#2563) --- src/qt_gui/trophy_viewer.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index ace475a7f..148cbee06 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -158,9 +158,18 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo this->addDockWidget(Qt::LeftDockWidgetArea, trophyInfoDock); // Connects checkbox signals to update trophy display +#if (QT_VERSION < QT_VERSION_CHECK(6, 7, 0)) connect(showEarnedCheck, &QCheckBox::stateChanged, this, &TrophyViewer::updateTableFilters); connect(showNotEarnedCheck, &QCheckBox::stateChanged, this, &TrophyViewer::updateTableFilters); connect(showHiddenCheck, &QCheckBox::stateChanged, this, &TrophyViewer::updateTableFilters); +#else + connect(showEarnedCheck, &QCheckBox::checkStateChanged, this, + &TrophyViewer::updateTableFilters); + connect(showNotEarnedCheck, &QCheckBox::checkStateChanged, this, + &TrophyViewer::updateTableFilters); + connect(showHiddenCheck, &QCheckBox::checkStateChanged, this, + &TrophyViewer::updateTableFilters); +#endif updateTrophyInfo(); updateTableFilters(); From db868ea40076a981ac010b1f85e2503cbac526fb Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Fri, 28 Feb 2025 18:11:41 -0300 Subject: [PATCH 371/455] Fix: sce_sys/snd0.at9 remains after game deletion (#2565) --- src/qt_gui/background_music_player.cpp | 1 + src/qt_gui/gui_context_menus.h | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/background_music_player.cpp b/src/qt_gui/background_music_player.cpp index a63f1d1be..e2b7177b3 100644 --- a/src/qt_gui/background_music_player.cpp +++ b/src/qt_gui/background_music_player.cpp @@ -40,4 +40,5 @@ void BackgroundMusicPlayer::playMusic(const QString& snd0path, bool loops) { void BackgroundMusicPlayer::stopMusic() { m_mediaPlayer->stop(); + m_mediaPlayer->setSource(QUrl("")); } diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 8a6e07847..df86686f3 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -10,6 +10,7 @@ #include #include +#include #include "cheats_patches.h" #include "common/config.h" #include "common/version.h" @@ -442,9 +443,12 @@ public: Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / m_games[itemID].serial / "TrophyFiles"); - QString message_type = tr("Game"); + QString message_type; - if (selected == deleteUpdate) { + if (selected == deleteGame) { + BackgroundMusicPlayer::getInstance().stopMusic(); + message_type = tr("Game"); + } else if (selected == deleteUpdate) { if (!std::filesystem::exists(Common::FS::PathFromQString(game_update_path))) { QMessageBox::critical(nullptr, tr("Error"), QString(tr("This game has no update to delete!"))); From 636a90386ba2ceb03f20d3ade01ab7b524048dcd Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sat, 1 Mar 2025 20:02:29 +0200 Subject: [PATCH 372/455] fix for ime (#2475) * fix for ime * typo --- src/core/libraries/ime/ime.cpp | 11 +++++++++-- src/core/libraries/ime/ime.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/ime/ime.cpp b/src/core/libraries/ime/ime.cpp index dfd659db8..1c61bc276 100644 --- a/src/core/libraries/ime/ime.cpp +++ b/src/core/libraries/ime/ime.cpp @@ -49,9 +49,9 @@ public: // Are we supposed to call the event handler on init with // ADD_OSK? - if (!ime_mode && False(m_param.key.option & OrbisImeKeyboardOption::AddOsk)) { + /* if (!ime_mode && False(m_param.key.option & OrbisImeKeyboardOption::AddOsk)) { Execute(nullptr, &openEvent, true); - } + }*/ if (ime_mode) { g_ime_state = ImeState(&m_param.ime); @@ -274,6 +274,13 @@ s32 PS4_SYSV_ABI sceImeKeyboardOpen(s32 userId, const OrbisImeKeyboardParam* par if (!param) { return ORBIS_IME_ERROR_INVALID_ADDRESS; } + if (!param->arg) { + return ORBIS_IME_ERROR_INVALID_ARG; + } + if (!param->handler) { + return ORBIS_IME_ERROR_INVALID_HANDLER; + } + if (g_keyboard_handler) { return ORBIS_IME_ERROR_BUSY; } diff --git a/src/core/libraries/ime/ime.h b/src/core/libraries/ime/ime.h index 448ee6896..fcf381048 100644 --- a/src/core/libraries/ime/ime.h +++ b/src/core/libraries/ime/ime.h @@ -20,7 +20,7 @@ enum class OrbisImeKeyboardOption : u32 { Repeat = 1, RepeatEachKey = 2, AddOsk = 4, - EffectiveWithTime = 8, + EffectiveWithIme = 8, DisableResume = 16, DisableCapslockWithoutShift = 32, }; From 0bdd21b4e49c25955b16a3651255381b4a60f538 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sat, 1 Mar 2025 17:48:57 -0300 Subject: [PATCH 373/455] Fix list after deleting a game (#2577) --- src/qt_gui/gui_context_menus.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index df86686f3..24b421b9d 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -13,6 +13,7 @@ #include #include "cheats_patches.h" #include "common/config.h" +#include "common/path_util.h" #include "common/version.h" #include "compatibility_info.h" #include "game_info.h" @@ -26,12 +27,11 @@ #include #include #endif -#include "common/path_util.h" class GuiContextMenus : public QObject { Q_OBJECT public: - void RequestGameMenu(const QPoint& pos, QVector m_games, + void RequestGameMenu(const QPoint& pos, QVector& m_games, std::shared_ptr m_compat_info, QTableWidget* widget, bool isList) { QPoint global_pos = widget->viewport()->mapToGlobal(pos); From 9061028ce588037fa6f467cd2c0740d10ed725ed Mon Sep 17 00:00:00 2001 From: Randomuser8219 <168323856+Randomuser8219@users.noreply.github.com> Date: Sun, 2 Mar 2025 01:55:45 -0800 Subject: [PATCH 374/455] Reduce some service ID log spam (#2578) * Change systemserivce param ID calling to debug only Some games, including Namco Museum Archives spam this. * Update userservice.cpp Also reduces log spam in Dysmantle. --- src/core/libraries/system/systemservice.cpp | 2 +- src/core/libraries/system/userservice.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/system/systemservice.cpp b/src/core/libraries/system/systemservice.cpp index a67b9a2fc..9dc9dd781 100644 --- a/src/core/libraries/system/systemservice.cpp +++ b/src/core/libraries/system/systemservice.cpp @@ -1893,7 +1893,7 @@ int PS4_SYSV_ABI sceSystemServiceNavigateToGoHome() { s32 PS4_SYSV_ABI sceSystemServiceParamGetInt(OrbisSystemServiceParamId param_id, int* value) { // TODO this probably should be stored in config for UI configuration - LOG_INFO(Lib_SystemService, "called param_id {}", u32(param_id)); + LOG_DEBUG(Lib_SystemService, "called param_id {}", u32(param_id)); if (value == nullptr) { LOG_ERROR(Lib_SystemService, "value is null"); return ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER; diff --git a/src/core/libraries/system/userservice.cpp b/src/core/libraries/system/userservice.cpp index e1f9f75e8..b4bf189ea 100644 --- a/src/core/libraries/system/userservice.cpp +++ b/src/core/libraries/system/userservice.cpp @@ -1043,7 +1043,7 @@ int PS4_SYSV_ABI sceUserServiceGetTraditionalChineseInputType() { s32 PS4_SYSV_ABI sceUserServiceGetUserColor(int user_id, OrbisUserServiceUserColor* color) { // TODO fix me better - LOG_INFO(Lib_UserService, "called user_id = {}", user_id); + LOG_DEBUG(Lib_UserService, "called user_id = {}", user_id); if (color == nullptr) { LOG_ERROR(Lib_UserService, "color is null"); return ORBIS_USER_SERVICE_ERROR_INVALID_ARGUMENT; @@ -1068,7 +1068,7 @@ int PS4_SYSV_ABI sceUserServiceGetUserGroupNum() { } s32 PS4_SYSV_ABI sceUserServiceGetUserName(int user_id, char* user_name, std::size_t size) { - LOG_INFO(Lib_UserService, "called user_id = {} ,size = {} ", user_id, size); + LOG_DEBUG(Lib_UserService, "called user_id = {} ,size = {} ", user_id, size); if (user_name == nullptr) { LOG_ERROR(Lib_UserService, "user_name is null"); return ORBIS_USER_SERVICE_ERROR_INVALID_ARGUMENT; From 4c7c703ea27cea318b5dfea47b74f76a19140cd1 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 2 Mar 2025 21:16:01 +0200 Subject: [PATCH 375/455] New Crowdin updates (#2562) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Russian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Italian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Russian) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Italian) * New translations en_us.ts (Italian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Swedish) --- src/qt_gui/translations/ar_SA.ts | 60 +++++++++++++++++++- src/qt_gui/translations/da_DK.ts | 60 +++++++++++++++++++- src/qt_gui/translations/de_DE.ts | 60 +++++++++++++++++++- src/qt_gui/translations/el_GR.ts | 60 +++++++++++++++++++- src/qt_gui/translations/es_ES.ts | 60 +++++++++++++++++++- src/qt_gui/translations/fa_IR.ts | 60 +++++++++++++++++++- src/qt_gui/translations/fi_FI.ts | 60 +++++++++++++++++++- src/qt_gui/translations/fr_FR.ts | 60 +++++++++++++++++++- src/qt_gui/translations/hu_HU.ts | 60 +++++++++++++++++++- src/qt_gui/translations/id_ID.ts | 60 +++++++++++++++++++- src/qt_gui/translations/it_IT.ts | 60 +++++++++++++++++++- src/qt_gui/translations/ja_JP.ts | 60 +++++++++++++++++++- src/qt_gui/translations/ko_KR.ts | 60 +++++++++++++++++++- src/qt_gui/translations/lt_LT.ts | 60 +++++++++++++++++++- src/qt_gui/translations/nb_NO.ts | 60 +++++++++++++++++++- src/qt_gui/translations/nl_NL.ts | 60 +++++++++++++++++++- src/qt_gui/translations/pl_PL.ts | 62 ++++++++++++++++++++- src/qt_gui/translations/pt_BR.ts | 96 +++++++++++++++++++++++++------- src/qt_gui/translations/pt_PT.ts | 60 +++++++++++++++++++- src/qt_gui/translations/ro_RO.ts | 60 +++++++++++++++++++- src/qt_gui/translations/ru_RU.ts | 60 +++++++++++++++++++- src/qt_gui/translations/sq_AL.ts | 60 +++++++++++++++++++- src/qt_gui/translations/sv_SE.ts | 60 +++++++++++++++++++- src/qt_gui/translations/tr_TR.ts | 68 ++++++++++++++++++++-- src/qt_gui/translations/uk_UA.ts | 60 +++++++++++++++++++- src/qt_gui/translations/vi_VN.ts | 60 +++++++++++++++++++- src/qt_gui/translations/zh_CN.ts | 60 +++++++++++++++++++- src/qt_gui/translations/zh_TW.ts | 60 +++++++++++++++++++- 28 files changed, 1647 insertions(+), 79 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index f1b16d4b0..493a33f82 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger المسجل @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never أبداً @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer عارض الجوائز + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index e6af07e74..6e8c8a6ff 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Aldrig @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 5d57b6361..64b28c179 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -775,6 +775,10 @@ Delete DLC Lösche DLC + + Delete Trophy + Delete Trophy + Compatibility... Kompatibilität... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophäe + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Titelmusik - Disable Trophy Pop-ups - Deaktiviere Trophäen Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Niemals @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophäenansicht + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 3d2763409..3d0b89bb8 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Ποτέ @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 148613422..a9db8860e 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -775,6 +775,10 @@ Delete DLC Eliminar DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibilidad... @@ -851,6 +855,10 @@ This game has no update folder to open! ¡Este juego no tiene carpeta de actualizaciones! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Error al convertir el icono. @@ -859,10 +867,18 @@ This game has no save data to delete! ¡Este juego no tiene datos guardados! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Datos guardados + + Trophy + Trophy + SFO Viewer for Visualizador de SFO para @@ -1311,6 +1327,10 @@ Trophy Trofeo + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Registro @@ -1476,8 +1496,8 @@ Música de título - Disable Trophy Pop-ups - Deshabilitar mensajes de trofeos + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Nunca @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Vista de trofeos + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index a173dc9d4..da9424a3a 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -775,6 +775,10 @@ Delete DLC حذف محتوای اضافی (DLC) + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - غیرفعال کردن نمایش جوایز + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never هرگز @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer مشاهده جوایز + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index bcbbd07f6..f20461015 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -775,6 +775,10 @@ Delete DLC Poista Lisäsisältö + + Delete Trophy + Delete Trophy + Compatibility... Yhteensopivuus... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Lokinkerääjä @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Poista Trophy Pop-upit Käytöstä + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Ei koskaan @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Selain + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index a812631f5..41a588aee 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -775,6 +775,10 @@ Delete DLC Supprimer DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibilité... @@ -851,6 +855,10 @@ This game has no update folder to open! Ce jeu n'a pas de dossier de mise à jour à ouvrir! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Échec de la conversion de l'icône. @@ -859,10 +867,18 @@ This game has no save data to delete! Ce jeu n'a pas de mise à jour à supprimer! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Enregistrer les Données + + Trophy + Trophy + SFO Viewer for Visionneuse SFO pour @@ -1311,6 +1327,10 @@ Trophy Trophée + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Journalisation @@ -1476,8 +1496,8 @@ Musique du titre - Disable Trophy Pop-ups - Désactiver les notifications de trophées + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Jamais @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Visionneuse de trophées + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 93e266f2c..35ad71d59 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -775,6 +775,10 @@ Delete DLC DLC-k törlése + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Naplózó @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Soha @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trófeák Megtekintése + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 335450ca2..25835f925 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Tidak Pernah @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index fd1f4d521..a3f06591d 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -775,6 +775,10 @@ Delete DLC Elimina DLC + + Delete Trophy + Elimina Trofei + Compatibility... Compatibilità... @@ -851,6 +855,10 @@ This game has no update folder to open! Questo gioco non ha nessuna cartella di aggiornamento da aprire! + + No log file found for this game! + Nessun file di log trovato per questo gioco! + Failed to convert icon. Impossibile convertire l'icona. @@ -859,10 +867,18 @@ This game has no save data to delete! Questo gioco non ha alcun salvataggio dati da eliminare! + + This game has no saved trophies to delete! + Questo gioco non ha nessun trofeo salvato da eliminare! + Save Data Dati Salvataggio + + Trophy + Trofei + SFO Viewer for Visualizzatore SFO per @@ -1311,6 +1327,10 @@ Trophy Trofei + + Open the custom trophy images/sounds folder + Apri la cartella personalizzata delle immagini/suoni dei trofei + Logger Registro @@ -1476,8 +1496,8 @@ Musica del Titolo - Disable Trophy Pop-ups - Disabilita Notifica Trofei + Disable Trophy Notification + Disabilita Notifiche Trofei Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Apri la cartella personalizzata delle immagini/suoni dei trofei:\nPuoi aggiungere immagini e audio personalizzato ai trofei.\nAggiungi i file in custom_trophy con i seguenti nomi:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Mai @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. File di registro separati:\nScrive un file di registro separato per ogni gioco. + + Trophy Notification Position + Posizione Notifica Trofei + + + Left + Sinistra + + + Right + Destra + + + Notification Duration + Durata Notifica + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Visualizzatore Trofei + + Progress + Progresso + + + Show Earned Trophies + Mostra Trofei Guadagnati + + + Show Not Earned Trophies + Mostra Trofei Non Guadagnati + + + Show Hidden Trophies + Mostra Trofei Nascosti + diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 6e11dfe0c..f9f4d6370 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -775,6 +775,10 @@ Delete DLC DLCを削除 + + Delete Trophy + Delete Trophy + Compatibility... 互換性... @@ -851,6 +855,10 @@ This game has no update folder to open! このゲームにはアップデートフォルダがありません! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. アイコンの変換に失敗しました。 @@ -859,10 +867,18 @@ This game has no save data to delete! このゲームには削除するセーブデータがありません! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy トロフィー + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger ロガー @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - トロフィーのポップアップを無効化 + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never 無効 @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer トロフィービューアー + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index ad24f6f54..3e6c26dde 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Never @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index c1886a4fa..c9be4c048 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Niekada @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index daf44c3bb..d163396ee 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -775,6 +775,10 @@ Delete DLC Slett DLC + + Delete Trophy + Slett trofé + Compatibility... Kompatibilitet... @@ -851,6 +855,10 @@ This game has no update folder to open! Dette spillet har ingen oppdateringsmappe å åpne! + + No log file found for this game! + Fant ingen loggfil for dette spillet! + Failed to convert icon. Klarte ikke konvertere ikon. @@ -859,10 +867,18 @@ This game has no save data to delete! Dette spillet har ingen lagret data å slette! + + This game has no saved trophies to delete! + Dette spillet har ingen lagrede trofeer å slette! + Save Data Lagret data + + Trophy + Trofé + SFO Viewer for SFO-viser for @@ -1311,6 +1327,10 @@ Trophy Trofé + + Open the custom trophy images/sounds folder + Åpne mappa med tilpassede bilder og lyder for trofé + Logger Loggføring @@ -1476,8 +1496,8 @@ Tittelmusikk - Disable Trophy Pop-ups - Deaktiver trofé hurtigmeny + Disable Trophy Notification + Slå av trofévarsler Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Åpne mappa med tilpassede bilder og lyder for trofé:\nDu kan legge til tilpassede bilder til trofeene og en lyd.\nLegg filene til custom_trophy med følgende navn:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Aldri @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate loggfiler:\nOppretter en separat loggfil for hvert spill. + + Trophy Notification Position + Trofévarsel plassering + + + Left + Venstre + + + Right + Høyre + + + Notification Duration + Varslingsvarighet + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Troféviser + + Progress + Fremdrift + + + Show Earned Trophies + Vis opptjente trofeer + + + Show Not Earned Trophies + Vis ikke opptjente trofeer + + + Show Hidden Trophies + Vis skjulte trofeer + diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 762254a6e..a61ca1adf 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Nooit @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 407948fae..64134d055 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -775,6 +775,10 @@ Delete DLC Usuń dodatkową zawartość (DLC) + + Delete Trophy + Usuń trofeum + Compatibility... Kompatybilność... @@ -851,6 +855,10 @@ This game has no update folder to open! Ta gra nie ma folderu aktualizacji do otwarcia! + + No log file found for this game! + Nie znaleziono pliku dziennika dla tej gry! + Failed to convert icon. Nie udało się przekonwertować ikony. @@ -859,10 +867,18 @@ This game has no save data to delete! Ta gra nie ma zapisów do usunięcia! + + This game has no saved trophies to delete! + Ta gra nie ma zapisanych trofeuów do usunięcia! + Save Data Zapisane dane + + Trophy + Trofeum + SFO Viewer for Menedżer plików SFO dla @@ -1309,7 +1325,11 @@ Trophy - Trofeum + Trofea + + + Open the custom trophy images/sounds folder + Otwórz niestandardowy folder obrazów/dźwięków trofeów Logger @@ -1476,8 +1496,8 @@ Muzyka tytułowa - Disable Trophy Pop-ups - Wyłącz wyskakujące okienka trofeów + Disable Trophy Notification + Wyłącz powiadomienia o trofeach Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Otwórz niestandardowy folder obrazów/dźwięków:\nMożesz dodać własne obrazy do trofeów i dźwięku.\nDodaj pliki do custom_trophy o następujących nazwach:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Nigdy @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Oddzielne pliki dziennika:\nZapisuje oddzielny plik dziennika dla każdej gry. + + Trophy Notification Position + Pozycja powiadomień trofeów + + + Left + Z lewej + + + Right + Z prawej + + + Notification Duration + Czas trwania powiadomienia + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Menedżer trofeów + + Progress + Postęp + + + Show Earned Trophies + Pokaż zdobyte trofea + + + Show Not Earned Trophies + Pokaż niezdobyte trofea + + + Show Hidden Trophies + Pokaż ukryte trofea + diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 406109150..103f0b66e 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -22,11 +22,11 @@ CheatsPatches Cheats / Patches for - Trapaças / Patches para + Trapaças / Modificações para Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - As Trapaças/Patches são experimentais.\nUse com cautela.\n\nBaixe as trapaças individualmente selecionando o repositório e clicando no botão de baixar.\nNa aba Patches, você pode baixar todos os patches de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos as Trapaças/Patches,\npor favor, reporte os problemas relacionados ao autor da trapaça.\n\nCriou uma nova trapaça? Visite:\n + As Trapaças/Modificações são experimentais.\nUse com cautela.\n\nBaixe as trapaças individualmente selecionando o repositório e clicando no botão de baixar.\nNa aba Modificações, você pode baixar todas as modificações de uma vez, escolha qual deseja usar e salve a opção.\n\nComo não desenvolvemos as Trapaças/Modificações,\npor favor, reporte os problemas relacionados ao autor da trapaça.\n\nCriou uma nova trapaça? Visite:\n No Image Available @@ -78,7 +78,7 @@ Download Patches - Baixar Patches + Baixar Modificações Save @@ -90,7 +90,7 @@ Patches - Patches + Modificações Error @@ -182,7 +182,7 @@ Patches Downloaded Successfully! All Patches available for all games have been downloaded, there is no need to download them individually for each game as happens in Cheats. If the patch does not appear, it may be that it does not exist for the specific serial and version of the game. - Patches Baixados com Sucesso! Todos os patches disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece em Trapaças. Se o patch não aparecer, pode ser que ele não exista para o serial e versão específicas do jogo. + Modificações Baixados com Sucesso! Todos as modificações disponíveis para todos os jogos foram baixados, não é necessário baixá-los individualmente para cada jogo como acontece em trapaças. Se a modificação não aparecer, pode ser que ela não exista para o serial e versão específicas do jogo. Failed to parse JSON data from HTML. @@ -709,7 +709,7 @@ Cheats / Patches - Trapaças / Patches + Trapaças / Modificações SFO Viewer @@ -733,7 +733,7 @@ Open Log Folder - Abrir Pasta de Log + Abrir Pasta de Registros Copy info... @@ -775,6 +775,10 @@ Delete DLC Excluir DLC + + Delete Trophy + Excluir Troféu + Compatibility... Compatibilidade... @@ -851,6 +855,10 @@ This game has no update folder to open! Este jogo não possui pasta de atualização para abrir! + + No log file found for this game! + Nenhum arquivo de registro foi encontrado para este jogo! + Failed to convert icon. Falha ao converter o ícone. @@ -859,10 +867,18 @@ This game has no save data to delete! Este jogo não tem dados salvos para excluir! + + This game has no saved trophies to delete! + Este jogo não tem troféus salvos para excluir! + Save Data Dados Salvos + + Trophy + Troféus + SFO Viewer for Visualizador de SFO para @@ -915,7 +931,7 @@ Install application from a .pkg file - Instalar aplicação de um arquivo .pkg + Instalar aplicativo de um arquivo .pkg Recent Games @@ -935,7 +951,7 @@ Exit the application. - Sair da aplicação. + Sair do aplicativo. Show Game List @@ -979,7 +995,7 @@ Download Cheats/Patches - Baixar Trapaças/Patches + Baixar Trapaças/Modificações Dump Game List @@ -1063,7 +1079,7 @@ Download Patches For All Games - Baixar Patches para Todos os Jogos + Baixar Modificações para Todos os Jogos Download Complete @@ -1075,11 +1091,11 @@ Patches Downloaded Successfully! - Patches Baixados com Sucesso! + Modificações Baixadas com Sucesso! All Patches available for all games have been downloaded. - Todos os patches disponíveis para todos os jogos foram baixados. + Todos as modificações disponíveis para todos os jogos foram baixadas. Games: @@ -1309,11 +1325,15 @@ Trophy - Troféus + Troféu + + + Open the custom trophy images/sounds folder + Abrir a pasta de imagens/sons de troféus personalizados Logger - Registros de Log + Log/Registro Log Type @@ -1476,8 +1496,8 @@ Música no Menu - Disable Trophy Pop-ups - Desabilitar Pop-ups dos Troféus + Disable Trophy Notification + Desativar Notificações de Troféu Background Image @@ -1565,7 +1585,7 @@ Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. - Tipo de Registro:\nDetermina se a saída da janela de log deve ser sincronizada por motivos de desempenho. Pode impactar negativamente na emulação. + Tipo de Registro:\nDetermina se a saída da janela de registro deve ser sincronizada por motivos de desempenho. Pode impactar negativamente na emulação. Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Atualizar Lista de Compatibilidade:\nAtualiza imediatamente o banco de dados de compatibilidade. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Abrir a pasta de imagens/sons de troféus personalizados:\nVocê pode adicionar imagens e sons personalizados aos troféus.\nAdicione os arquivos em custom_trophy com os seguintes nomes:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Nunca @@ -1797,11 +1821,27 @@ Separate Log Files - Separar Arquivos de Log + Separar Arquivos de Registro Separate Log Files:\nWrites a separate logfile for each game. - Separar Arquivos de Log:\nGrava um arquivo de log para cada jogo. + Separar Arquivos de Registro:\nGrava um arquivo de registro para cada jogo. + + + Trophy Notification Position + Posição da Notificação do Troféu + + + Left + Esquerda + + + Right + Direita + + + Notification Duration + Duração da Notificação @@ -1810,5 +1850,21 @@ Trophy Viewer Visualizador de Troféus + + Progress + Progresso + + + Show Earned Trophies + Mostrar Troféus Conquistados + + + Show Not Earned Trophies + Mostrar Troféus Não Conquistados + + + Show Hidden Trophies + Mostrar Troféus Ocultos + diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index e5cbedb96..8db33ca5b 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -775,6 +775,10 @@ Delete DLC Eliminar DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibilidade... @@ -851,6 +855,10 @@ This game has no update folder to open! Este jogo não tem nenhuma pasta de atualização para abrir! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Falha ao converter ícone. @@ -859,10 +867,18 @@ This game has no save data to delete! Este jogo não tem dados guardados para eliminar! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Dados Guardados + + Trophy + Trophy + SFO Viewer for Visualizador SFO para @@ -1311,6 +1327,10 @@ Trophy Troféus + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Registos @@ -1476,8 +1496,8 @@ Música de Título - Disable Trophy Pop-ups - Desativar Pop-ups dos Troféus + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Atualizar Base de Dados de Compatibilidade:\nAtualiza imediatamente a base de dados de compatibilidade. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Nunca @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separar Ficheiros de Registo:\nEscreve um ficheiro de registo para cada jogo. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Visualizador de Troféus + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 7083e6d49..be1613c57 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! Acest joc nu are folderul de actualizări pentru a fi deschis! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Niciodată @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index d9e90d1a2..313233c92 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -775,6 +775,10 @@ Delete DLC Удалить DLC + + Delete Trophy + Удалить трофей + Compatibility... Совместимость... @@ -851,6 +855,10 @@ This game has no update folder to open! У этой игры нет папки обновлений, которую можно открыть! + + No log file found for this game! + Не найден файл журнала для этой игры! + Failed to convert icon. Не удалось преобразовать иконку. @@ -859,10 +867,18 @@ This game has no save data to delete! У этой игры нет сохранений, которые можно удалить! + + This game has no saved trophies to delete! + У этой игры нет сохраненных трофеев для удаления! + Save Data Сохранения + + Trophy + Трофей + SFO Viewer for Просмотр SFO для @@ -1311,6 +1327,10 @@ Trophy Трофеи + + Open the custom trophy images/sounds folder + Откройте папку с пользовательскими изображениями/звуками трофеев + Logger Логирование @@ -1476,8 +1496,8 @@ Заглавная музыка - Disable Trophy Pop-ups - Отключить уведомления о трофеях + Disable Trophy Notification + Отключить уведомления о трофее Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Открыть пользовательскую папку с трофеями изображений/звуков:\nВы можете добавить пользовательские изображения к трофеям и аудио.\nДобавьте файлы в custom_trophy со следующими именами:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Никогда @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Отдельные файлы логов:\nПишет отдельный файл логов для каждой игры. + + Trophy Notification Position + Местоположение уведомления о трофее + + + Left + Влево + + + Right + Вправо + + + Notification Duration + Продолжительность уведомления + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Просмотр трофеев + + Progress + Прогресс + + + Show Earned Trophies + Показать заработанные трофеи + + + Show Not Earned Trophies + Показать не заработанные трофеи + + + Show Hidden Trophies + Показать скрытые трофеи + diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 0a90bcd10..0783fb1a7 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -775,6 +775,10 @@ Delete DLC Fshi DLC-në + + Delete Trophy + Fshi Trofeun + Compatibility... Përputhshmëria... @@ -851,6 +855,10 @@ This game has no update folder to open! Kjo lojë nuk ka dosje përditësimi për të hapur! + + No log file found for this game! + Nuk u gjet asnjë skedar ditari për këtë lojë! + Failed to convert icon. Konvertimi i ikonës dështoi. @@ -859,10 +867,18 @@ This game has no save data to delete! Kjo lojë nuk ka të dhëna ruajtje për të fshirë! + + This game has no saved trophies to delete! + Kjo lojë nuk ka trofe të ruajtur për të fshirë! + Save Data Të dhënat e ruajtjes + + Trophy + Trofeu + SFO Viewer for Shikuesi SFO për @@ -1311,6 +1327,10 @@ Trophy Trofeu + + Open the custom trophy images/sounds folder + Hap dosjen e imazheve/tingujve të trofeve të personalizuar + Logger Regjistruesi i ditarit @@ -1476,8 +1496,8 @@ Muzika e titullit - Disable Trophy Pop-ups - Çaktivizo njoftimet për Trofetë + Disable Trophy Notification + Çaktivizo Njoftimin e Trofeut Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Hap dosjen e imazheve/tingujve të trofeve të personalizuar:\nMund të shtosh imazhe të personalizuara për trofetë dhe një skedar audio.\nShto skedarët në dosjen custom_trophy me emrat që vijojnë:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Kurrë @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Skedarë të Ditarit të Ndarë:\nShkruan një skedar të ditarit të veçuar për secilën lojë. + + Trophy Notification Position + Pozicioni i Njoftimit të Trofeve + + + Left + Majtas + + + Right + Djathtas + + + Notification Duration + Kohëzgjatja e Njoftimit + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Shikuesi i Trofeve + + Progress + Ecuria + + + Show Earned Trophies + Shfaq Trofetë që janë fituar + + + Show Not Earned Trophies + Shfaq Trofetë që nuk janë fituar + + + Show Hidden Trophies + Shfaq Trofetë e Fshehur + diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index e9ea2f20a..6cbd33f17 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -775,6 +775,10 @@ Delete DLC Ta bort DLC + + Delete Trophy + Ta bort trofé + Compatibility... Kompatibilitet... @@ -851,6 +855,10 @@ This game has no update folder to open! Detta spel har ingen uppdateringsmapp att öppna! + + No log file found for this game! + Ingen loggfil hittades för detta spel! + Failed to convert icon. Misslyckades med att konvertera ikon. @@ -859,10 +867,18 @@ This game has no save data to delete! Detta spel har inget sparat data att ta bort! + + This game has no saved trophies to delete! + Detta spel har inga sparade troféer att ta bort! + Save Data Sparat data + + Trophy + Trofé + SFO Viewer for SFO-visare för @@ -1311,6 +1327,10 @@ Trophy Troféer + + Open the custom trophy images/sounds folder + Öppna mapp för anpassade trofébilder/ljud + Logger Loggning @@ -1476,8 +1496,8 @@ Titelmusik - Disable Trophy Pop-ups - Inaktivera popup för troféer + Disable Trophy Notification + Inaktivera troféaviseringar Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Öppna mappen med anpassade trofébilder/ljud:\nDu kan lägga till anpassade bilder till troféerna och ett ljud.\nLägg till filerna i custom_trophy med följande namn:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Aldrig @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separata loggfiler:\nSkriver en separat loggfil för varje spel. + + Trophy Notification Position + Aviseringsposition för trofé + + + Left + Vänster + + + Right + Höger + + + Notification Duration + Varaktighet för avisering + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trofé-visare + + Progress + Förlopp + + + Show Earned Trophies + Visa förtjänade troféer + + + Show Not Earned Trophies + Visa icke-förtjänade troféer + + + Show Hidden Trophies + Visa dolda troféer + diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index ac7dee9a4..cd4f1cadd 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -775,6 +775,10 @@ Delete DLC İndirilebilir İçeriği Sil + + Delete Trophy + Kupayı Sil + Compatibility... Uyumluluk... @@ -851,6 +855,10 @@ This game has no update folder to open! Bu oyunun açılacak güncelleme klasörü yok! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Simge dönüştürülemedi. @@ -859,10 +867,18 @@ This game has no save data to delete! Bu oyunun silinecek kayıt verisi yok! + + This game has no saved trophies to delete! + Bu oyunun silinecek kupası yok! + Save Data Kayıt Verisi + + Trophy + Kupa + SFO Viewer for SFO Görüntüleyici: @@ -1311,6 +1327,10 @@ Trophy Kupa + + Open the custom trophy images/sounds folder + Özel kupa görüntüleri/sesleri klasörünü aç + Logger Kayıt Tutucu @@ -1476,8 +1496,8 @@ Oyun Müziği - Disable Trophy Pop-ups - Kupa Açılır Pencerelerini Devre Dışı Bırak + Disable Trophy Notification + Kupa Bildirimini Devre Dışı Bırak Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Uyumluluk Veritabanını Güncelle:\nUyumluluk veri tabanını hemen güncelleyin. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Asla @@ -1661,7 +1685,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + HDR'yi Etkinleştir:\nDestekleyen oyunlarda HDR'yi etkinleştirir.\nMonitörünüz, BT2020 PQ renk alanını ve RGB10A2 takas zinciri biçimini desteklemelidir. Game Folders:\nThe list of folders to check for installed games. @@ -1765,15 +1789,15 @@ Video - Video + Görüntü Display Mode - Display Mode + Görüntü Modu Windowed - Windowed + Pencereli Fullscreen @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Ayrı Günlük Dosyaları:\nHer oyun için ayrı bir günlük dosyası yazar. + + Trophy Notification Position + Kupa Bildirim Konumu + + + Left + Sol + + + Right + Sağ + + + Notification Duration + Bildirim Süresi + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Kupa Görüntüleyici + + Progress + İlerleme + + + Show Earned Trophies + Kazanılmış Kupaları Göster + + + Show Not Earned Trophies + Kazanılmamış Kupaları Göster + + + Show Hidden Trophies + Gizli Kupaları Göster + diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 0a3865d49..63f8b012f 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -775,6 +775,10 @@ Delete DLC Видалити DLC + + Delete Trophy + Delete Trophy + Compatibility... Сумісність... @@ -851,6 +855,10 @@ This game has no update folder to open! Ця гра не має папки оновленнь, щоб відкрити її! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! Ця гра не містить збережень, які можна видалити! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Збереження + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Трофеї + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Логування @@ -1476,8 +1496,8 @@ Титульна музика - Disable Trophy Pop-ups - Вимкнути спливаючі вікна трофеїв + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Ніколи @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Трофеї + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 50a34ad7a..fe9ad915f 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never Không bao giờ @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trình xem chiến tích + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index b855f2dcd..a9cf7ca19 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -775,6 +775,10 @@ Delete DLC 删除 DLC + + Delete Trophy + 删除奖杯 + Compatibility... 兼容性... @@ -851,6 +855,10 @@ This game has no update folder to open! 这个游戏没有可打开的更新文件夹! + + No log file found for this game! + 没有找到这个游戏的日志文件! + Failed to convert icon. 转换图标失败。 @@ -859,10 +867,18 @@ This game has no save data to delete! 这个游戏没有更新可以删除! + + This game has no saved trophies to delete! + 这个游戏没有保存的奖杯可删除! + Save Data 存档数据 + + Trophy + 奖杯 + SFO Viewer for SFO 查看器 - @@ -1311,6 +1327,10 @@ Trophy 奖杯 + + Open the custom trophy images/sounds folder + 打开自定义奖杯图像/声音文件夹 + Logger 日志 @@ -1476,8 +1496,8 @@ 标题音乐 - Disable Trophy Pop-ups - 禁止弹出奖杯 + Disable Trophy Notification + 禁用奖杯通知 Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. 更新兼容性数据库:\n立即更新兼容性数据库。 + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + 打开自定义奖杯图像/声音文件夹:\n您可以自定义奖杯图像和声音。\n将文件添加到 custom_trophy 文件夹中,文件名如下:\nthophy.mp3、bronze.png、gold.png、platinum.png、silver.png + Never 从不 @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. 独立日志文件:\n每个游戏使用单独的日志文件。 + + Trophy Notification Position + 奖杯通知位置 + + + Left + 左边 + + + Right + 右边 + + + Notification Duration + 通知显示持续时间 + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer 奖杯查看器 + + Progress + 进度 + + + Show Earned Trophies + 显示获得的奖杯 + + + Show Not Earned Trophies + 显示未获得的奖杯 + + + Show Hidden Trophies + 显示隐藏奖杯 + diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 15c921d15..bd3ef8f0b 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -775,6 +775,10 @@ Delete DLC Delete DLC + + Delete Trophy + Delete Trophy + Compatibility... Compatibility... @@ -851,6 +855,10 @@ This game has no update folder to open! This game has no update folder to open! + + No log file found for this game! + No log file found for this game! + Failed to convert icon. Failed to convert icon. @@ -859,10 +867,18 @@ This game has no save data to delete! This game has no save data to delete! + + This game has no saved trophies to delete! + This game has no saved trophies to delete! + Save Data Save Data + + Trophy + Trophy + SFO Viewer for SFO Viewer for @@ -1311,6 +1327,10 @@ Trophy Trophy + + Open the custom trophy images/sounds folder + Open the custom trophy images/sounds folder + Logger Logger @@ -1476,8 +1496,8 @@ Title Music - Disable Trophy Pop-ups - Disable Trophy Pop-ups + Disable Trophy Notification + Disable Trophy Notification Background Image @@ -1611,6 +1631,10 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Never 從不 @@ -1803,6 +1827,22 @@ Separate Log Files:\nWrites a separate logfile for each game. Separate Log Files:\nWrites a separate logfile for each game. + + Trophy Notification Position + Trophy Notification Position + + + Left + Left + + + Right + Right + + + Notification Duration + Notification Duration + TrophyViewer @@ -1810,5 +1850,21 @@ Trophy Viewer Trophy Viewer + + Progress + Progress + + + Show Earned Trophies + Show Earned Trophies + + + Show Not Earned Trophies + Show Not Earned Trophies + + + Show Hidden Trophies + Show Hidden Trophies + From 76483f9c7b9554ce82ece6c4358cbba0fd5c9fde Mon Sep 17 00:00:00 2001 From: Missake212 Date: Sun, 2 Mar 2025 19:31:49 +0000 Subject: [PATCH 376/455] opcode implementation test (#2567) --- src/shader_recompiler/frontend/translate/data_share.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/shader_recompiler/frontend/translate/data_share.cpp b/src/shader_recompiler/frontend/translate/data_share.cpp index 460f8913c..22f5b8644 100644 --- a/src/shader_recompiler/frontend/translate/data_share.cpp +++ b/src/shader_recompiler/frontend/translate/data_share.cpp @@ -61,6 +61,8 @@ void Translator::EmitDataShare(const GcnInst& inst) { return DS_WRITE(64, false, false, false, inst); case Opcode::DS_WRITE2_B64: return DS_WRITE(64, false, true, false, inst); + case Opcode::DS_WRITE2ST64_B64: + return DS_WRITE(64, false, true, true, inst); case Opcode::DS_READ_B64: return DS_READ(64, false, false, false, inst); case Opcode::DS_READ2_B64: From f4110c43a78a1b0d13c33ddbd75bd5b552bcfdda Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 2 Mar 2025 16:32:28 -0300 Subject: [PATCH 377/455] Fix time - sceKernelClockGettime (#2582) --- src/core/libraries/kernel/time.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/core/libraries/kernel/time.cpp b/src/core/libraries/kernel/time.cpp index 2565b8078..508e54089 100644 --- a/src/core/libraries/kernel/time.cpp +++ b/src/core/libraries/kernel/time.cpp @@ -115,14 +115,16 @@ int PS4_SYSV_ABI sceKernelClockGettime(s32 clock_id, OrbisKernelTimespec* tp) { break; } - timespec t{}; - int result = clock_gettime(pclock_id, &t); - tp->tv_sec = t.tv_sec; - tp->tv_nsec = t.tv_nsec; - if (result == 0) { - return ORBIS_OK; + time_t raw_time = time(nullptr); + + if (raw_time == (time_t)(-1)) { + return ORBIS_KERNEL_ERROR_EINVAL; } - return ORBIS_KERNEL_ERROR_EINVAL; + + tp->tv_sec = static_cast(raw_time); + tp->tv_nsec = 0; + + return ORBIS_OK; } int PS4_SYSV_ABI posix_clock_gettime(s32 clock_id, OrbisKernelTimespec* time) { From d59536a71c923508e8f2d730110f55fa43161696 Mon Sep 17 00:00:00 2001 From: Dmugetsu <168934208+diegolix29@users.noreply.github.com> Date: Sun, 2 Mar 2025 13:36:12 -0600 Subject: [PATCH 378/455] Adding Top and Bottom trophy option for pop window + Trophy improvements (#2566) * Adding top button option for trophy pop up * Ui fix * Clang format * improvements to trophy pr * improvements * Note: The sound will only work in QT versions * -. * Update path_util.cpp * Update path_util.cpp * centered text when using top and bottom option * Clang * trophy viewer now opens in window not fullscreen --------- Co-authored-by: DanielSvoboda --- src/common/config.cpp | 17 ++++---- src/common/config.h | 4 +- src/common/path_util.cpp | 18 +++++++- src/core/libraries/np_trophy/trophy_ui.cpp | 51 +++++++++++++++++----- src/qt_gui/settings_dialog.cpp | 24 ++++++++-- src/qt_gui/settings_dialog.ui | 20 ++++++--- src/qt_gui/translations/en_US.ts | 12 ++++- src/qt_gui/trophy_viewer.cpp | 40 ++++++++++++++++- src/qt_gui/trophy_viewer.h | 8 ++++ 9 files changed, 158 insertions(+), 36 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 36566a14c..514024c30 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -53,7 +53,7 @@ static bool isShaderDebug = false; static bool isShowSplash = false; static bool isAutoUpdate = false; static bool isAlwaysShowChangelog = false; -static bool isLeftSideTrophy = false; +static std::string isSideTrophy = "right"; static bool isNullGpu = false; static bool shouldCopyGPUBuffers = false; static bool shouldDumpShaders = false; @@ -270,8 +270,8 @@ bool alwaysShowChangelog() { return isAlwaysShowChangelog; } -bool leftSideTrophy() { - return isLeftSideTrophy; +std::string sideTrophy() { + return isSideTrophy; } bool nullGpu() { @@ -381,8 +381,9 @@ void setAutoUpdate(bool enable) { void setAlwaysShowChangelog(bool enable) { isAlwaysShowChangelog = enable; } -void setLeftSideTrophy(bool enable) { - isLeftSideTrophy = enable; + +void setSideTrophy(std::string side) { + isSideTrophy = side; } void setNullGpu(bool enable) { @@ -737,7 +738,7 @@ void load(const std::filesystem::path& path) { isShowSplash = toml::find_or(general, "showSplash", true); isAutoUpdate = toml::find_or(general, "autoUpdate", false); isAlwaysShowChangelog = toml::find_or(general, "alwaysShowChangelog", false); - isLeftSideTrophy = toml::find_or(general, "leftSideTrophy", false); + isSideTrophy = toml::find_or(general, "sideTrophy", "right"); separateupdatefolder = toml::find_or(general, "separateUpdateEnabled", false); compatibilityData = toml::find_or(general, "compatibilityEnabled", false); checkCompatibilityOnStartup = @@ -888,7 +889,7 @@ void save(const std::filesystem::path& path) { data["General"]["showSplash"] = isShowSplash; data["General"]["autoUpdate"] = isAutoUpdate; data["General"]["alwaysShowChangelog"] = isAlwaysShowChangelog; - data["General"]["leftSideTrophy"] = isLeftSideTrophy; + data["General"]["sideTrophy"] = isSideTrophy; data["General"]["separateUpdateEnabled"] = separateupdatefolder; data["General"]["compatibilityEnabled"] = compatibilityData; data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup; @@ -1018,7 +1019,7 @@ void setDefaultValues() { isShowSplash = false; isAutoUpdate = false; isAlwaysShowChangelog = false; - isLeftSideTrophy = false; + isSideTrophy = "right"; isNullGpu = false; shouldDumpShaders = false; vblankDivider = 1; diff --git a/src/common/config.h b/src/common/config.h index 988734b93..82d65d30e 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -63,7 +63,7 @@ bool collectShadersForDebug(); bool showSplash(); bool autoUpdate(); bool alwaysShowChangelog(); -bool leftSideTrophy(); +std::string sideTrophy(); bool nullGpu(); bool copyGPUCmdBuffers(); bool dumpShaders(); @@ -77,7 +77,7 @@ void setCollectShaderForDebug(bool enable); void setShowSplash(bool enable); void setAutoUpdate(bool enable); void setAlwaysShowChangelog(bool enable); -void setLeftSideTrophy(bool enable); +void setSideTrophy(std::string side); void setNullGpu(bool enable); void setAllowHDR(bool enable); void setCopyGPUCmdBuffers(bool enable); diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp index d48e8c3fe..6bc73ee43 100644 --- a/src/common/path_util.cpp +++ b/src/common/path_util.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include "common/logging/log.h" #include "common/path_util.h" @@ -130,6 +131,21 @@ static auto UserPaths = [] { create_path(PathType::MetaDataDir, user_dir / METADATA_DIR); create_path(PathType::CustomTrophy, user_dir / CUSTOM_TROPHY); + std::ofstream notice_file(user_dir / CUSTOM_TROPHY / "Notice.txt"); + if (notice_file.is_open()) { + notice_file + << "++++++++++++++++++++++++++++++++\n+ Custom Trophy Images / Sound " + "+\n++++++++++++++++++++++++++++++++\n\nYou can add custom images to the " + "trophies.\n*We recommend a square resolution image, for example 200x200, 500x500, " + "the same size as the height and width.\nIn this folder ('user\\custom_trophy'), " + "add the files with the following " + "names:\n\nbronze.png\nsilver.png\ngold.png\nplatinum.png\n\nYou can add a custom " + "sound for trophy notifications.\n*By default, no audio is played unless it is in " + "this folder and you are using the QT version.\nIn this folder " + "('user\\custom_trophy'), add the files with the following names:\n\ntrophy.mp3"; + notice_file.close(); + } + return paths; }(); @@ -223,4 +239,4 @@ std::filesystem::path PathFromQString(const QString& path) { } #endif -} // namespace Common::FS \ No newline at end of file +} // namespace Common::FS diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp index 2564cbf5d..aba56f341 100644 --- a/src/core/libraries/np_trophy/trophy_ui.cpp +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -27,14 +27,17 @@ namespace Libraries::NpTrophy { std::optional current_trophy_ui; std::queue trophy_queue; std::mutex queueMtx; -bool isLeftSide; + +std::string side = "right"; + double trophy_timer; TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::string& trophyName, const std::string_view& rarity) : trophy_name(trophyName), trophy_type(rarity) { - isLeftSide = Config::leftSideTrophy(); + side = Config::sideTrophy(); + trophy_timer = Config::getTrophyNotificationDuration(); if (std::filesystem::exists(trophyIconPath)) { @@ -115,8 +118,8 @@ float fade_out_duration = 0.5f; // Final fade duration void TrophyUI::Draw() { const auto& io = GetIO(); - float AdjustWidth = io.DisplaySize.x / 1280; - float AdjustHeight = io.DisplaySize.y / 720; + float AdjustWidth = io.DisplaySize.x / 1920; + float AdjustHeight = io.DisplaySize.y / 1080; const ImVec2 window_size{ std::min(io.DisplaySize.x, (350 * AdjustWidth)), std::min(io.DisplaySize.y, (70 * AdjustHeight)), @@ -125,21 +128,38 @@ void TrophyUI::Draw() { elapsed_time += io.DeltaTime; float progress = std::min(elapsed_time / animation_duration, 1.0f); - // left or right position - float final_pos_x; - if (isLeftSide) { - start_pos.x = -window_size.x; + float final_pos_x, start_x; + float final_pos_y, start_y; + + if (side == "top") { + start_x = (io.DisplaySize.x - window_size.x) * 0.5f; + start_y = -window_size.y; + final_pos_x = start_x; + final_pos_y = 20 * AdjustHeight; + } else if (side == "left") { + start_x = -window_size.x; + start_y = 50 * AdjustHeight; final_pos_x = 20 * AdjustWidth; - } else { - start_pos.x = io.DisplaySize.x; + final_pos_y = start_y; + } else if (side == "right") { + start_x = io.DisplaySize.x; + start_y = 50 * AdjustHeight; final_pos_x = io.DisplaySize.x - window_size.x - 20 * AdjustWidth; + final_pos_y = start_y; + } else if (side == "bottom") { + start_x = (io.DisplaySize.x - window_size.x) * 0.5f; + start_y = io.DisplaySize.y; + final_pos_x = start_x; + final_pos_y = io.DisplaySize.y - window_size.y - 20 * AdjustHeight; } - ImVec2 current_pos = ImVec2(start_pos.x + (final_pos_x - start_pos.x) * progress, - start_pos.y + (target_pos.y - start_pos.y) * progress); + ImVec2 current_pos = ImVec2(start_x + (final_pos_x - start_x) * progress, + start_y + (final_pos_y - start_y) * progress); trophy_timer -= io.DeltaTime; + ImGui::SetNextWindowPos(current_pos); + // If the remaining time of the trophy is less than or equal to 1 second, the fade-out begins. if (trophy_timer <= 1.0f) { float fade_out_time = 1.0f - (trophy_timer / 1.0f); @@ -192,6 +212,13 @@ void TrophyUI::Draw() { const float text_height = ImGui::CalcTextSize(combinedString.c_str()).y; SetCursorPosY((window_size.y - text_height) * 0.5); } + + if (side == "top" || side == "bottom") { + float text_width = ImGui::CalcTextSize(trophy_name.c_str()).x; + float centered_x = (window_size.x - text_width) * 0.5f; + ImGui::SetCursorPosX(std::max(centered_x, 10.0f * AdjustWidth)); + } + ImGui::PushTextWrapPos(window_size.x - (60 * AdjustWidth)); TextWrapped("Trophy earned!\n%s", trophy_name.c_str()); ImGui::SameLine(window_size.x - (60 * AdjustWidth)); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index bde104828..a3890b548 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -418,8 +418,14 @@ void SettingsDialog::LoadValuesFromConfig() { ui->disableTrophycheckBox->setChecked( toml::find_or(data, "General", "isTrophyPopupDisabled", false)); ui->popUpDurationSpinBox->setValue(Config::getTrophyNotificationDuration()); - ui->radioButton_Left->setChecked(Config::leftSideTrophy()); - ui->radioButton_Right->setChecked(!ui->radioButton_Left->isChecked()); + + QString side = QString::fromStdString(Config::sideTrophy()); + + ui->radioButton_Left->setChecked(side == "left"); + ui->radioButton_Right->setChecked(side == "right"); + ui->radioButton_Top->setChecked(side == "top"); + ui->radioButton_Bottom->setChecked(side == "bottom"); + ui->BGMVolumeSlider->setValue(toml::find_or(data, "General", "BGMvolume", 50)); ui->discordRPCCheckbox->setChecked( toml::find_or(data, "General", "enableDiscordRPC", true)); @@ -612,7 +618,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { //User if (elementName == "OpenCustomTrophyLocationButton") { - text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png"); + text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png\\nNote: The sound will only work in QT versions."); } // Input @@ -706,7 +712,17 @@ void SettingsDialog::UpdateSettings() { Config::setIsMotionControlsEnabled(ui->motionControlsCheckBox->isChecked()); Config::setisTrophyPopupDisabled(ui->disableTrophycheckBox->isChecked()); Config::setTrophyNotificationDuration(ui->popUpDurationSpinBox->value()); - Config::setLeftSideTrophy(ui->radioButton_Left->isChecked()); + + if (ui->radioButton_Top->isChecked()) { + Config::setSideTrophy("top"); + } else if (ui->radioButton_Left->isChecked()) { + Config::setSideTrophy("left"); + } else if (ui->radioButton_Right->isChecked()) { + Config::setSideTrophy("right"); + } else if (ui->radioButton_Bottom->isChecked()) { + Config::setSideTrophy("bottom"); + } + Config::setPlayBGM(ui->playBGMCheckBox->isChecked()); Config::setAllowHDR(ui->enableHDRCheckBox->isChecked()); Config::setLogType(logTypeMap.value(ui->logTypeComboBox->currentText()).toStdString()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index c793aced5..7db0afa59 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -1295,17 +1295,25 @@ - - - 0 - 0 - - Right + + + + Top + + + + + + + Bottom + + + diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 92fb59a02..29ce27f07 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index 148cbee06..bfa47e3cc 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include "common/path_util.h" @@ -157,6 +158,15 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo // Adds the dock to the left area this->addDockWidget(Qt::LeftDockWidgetArea, trophyInfoDock); + expandButton = new QPushButton(">>", this); + expandButton->setGeometry(80, 0, 27, 27); + expandButton->hide(); + + connect(expandButton, &QPushButton::clicked, this, [this, trophyInfoDock] { + trophyInfoDock->setVisible(true); + expandButton->hide(); + }); + // Connects checkbox signals to update trophy display #if (QT_VERSION < QT_VERSION_CHECK(6, 7, 0)) connect(showEarnedCheck, &QCheckBox::stateChanged, this, &TrophyViewer::updateTableFilters); @@ -173,6 +183,31 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo updateTrophyInfo(); updateTableFilters(); + + connect(trophyInfoDock, &QDockWidget::topLevelChanged, this, [this, trophyInfoDock] { + if (!trophyInfoDock->isVisible()) { + expandButton->show(); + } + }); + + connect(trophyInfoDock, &QDockWidget::visibilityChanged, this, [this, trophyInfoDock] { + if (!trophyInfoDock->isVisible()) { + expandButton->show(); + } else { + expandButton->hide(); + } + }); +} + +void TrophyViewer::onDockClosed() { + if (!trophyInfoDock->isVisible()) { + reopenButton->setVisible(true); + } +} + +void TrophyViewer::reopenLeftDock() { + trophyInfoDock->show(); + reopenButton->setVisible(false); } void TrophyViewer::PopulateTrophyWidget(QString title) { @@ -354,7 +389,10 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { tabWidget->addTab(tableWidget, tabName.insert(6, " ").replace(0, 1, tabName.at(0).toUpper())); - this->showMaximized(); + this->resize(width + 400, 720); + QSize mainWindowSize = QApplication::activeWindow()->size(); + this->resize(mainWindowSize.width() * 0.8, mainWindowSize.height() * 0.8); + this->show(); tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed); tableWidget->setColumnWidth(3, 650); diff --git a/src/qt_gui/trophy_viewer.h b/src/qt_gui/trophy_viewer.h index bd99e1a8c..75fb500e7 100644 --- a/src/qt_gui/trophy_viewer.h +++ b/src/qt_gui/trophy_viewer.h @@ -4,12 +4,15 @@ #pragma once #include +#include #include +#include #include #include #include #include #include +#include #include #include #include @@ -26,6 +29,8 @@ public: void updateTrophyInfo(); void updateTableFilters(); + void onDockClosed(); + void reopenLeftDock(); private: void PopulateTrophyWidget(QString title); @@ -39,6 +44,9 @@ private: QCheckBox* showEarnedCheck; QCheckBox* showNotEarnedCheck; QCheckBox* showHiddenCheck; + QPushButton* expandButton; + QDockWidget* trophyInfoDock; + QPushButton* reopenButton; std::string GetTrpType(const QChar trp_) { switch (trp_.toLatin1()) { From 7a4244ac8b37caab876463421c07939a2e222831 Mon Sep 17 00:00:00 2001 From: baggins183 Date: Sun, 2 Mar 2025 11:52:32 -0800 Subject: [PATCH 379/455] Misc Cleanups (#2579) -dont do trivial phi removal during SRT pass, that's now done in ssa_rewrite -remove unused variable when walking tess attributes -fix some tess comments --- .../ir/passes/hull_shader_transform.cpp | 29 +++++------ src/shader_recompiler/ir/srt_gvn_table.h | 52 ++++--------------- 2 files changed, 24 insertions(+), 57 deletions(-) diff --git a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp index fced4b362..48727e32a 100644 --- a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp +++ b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp @@ -75,10 +75,12 @@ namespace Shader::Optimization { * * output_patch_stride and output_cp_stride are usually compile time constants in the gcn * - * Hull shaders can probably also read output control points corresponding to other threads, like - * shared memory (but we havent seen this yet). - * ^ This is an UNREACHABLE for now. We may need to insert additional barriers if this happens. - * They should also be able to read PatchConst values, + * Hull shaders can also read output control points corresponding to other threads. + * In HLSL style, this should only be possible in the Patch Constant function. + * TODO we may need to insert additional barriers if sync is free/more permissive + * on AMD LDS HW + + * They should also be able to read output PatchConst values, * although not sure if this happens in practice. * * To determine which type of attribute (input, output, patchconst) we the check the users of @@ -101,22 +103,22 @@ namespace Shader::Optimization { * layout (location = 0) in vec4 in_attrs[][NUM_INPUT_ATTRIBUTES]; * * Here the NUM_INPUT_ATTRIBUTES is derived from the ls_stride member of the TessConstants V#. - * We divide ls_stride (in bytes) by 16 to get the number of vec4 attributes. - * For TES, the number of attributes comes from hs_cp_stride / 16. + * We take ALIGN_UP(ls_stride, 16) / 16 to get the number of vec4 attributes. + * For TES, NUM_INPUT_ATTRIBUTES is ALIGN_UP(hs_cp_stride, 16) / 16. * The first (outer) dimension is unsized but corresponds to the number of vertices in the hs input * patch (for Hull) or the hs output patch (for Domain). * * For input reads in TCS or TES, we emit SPIR-V like: - * float value = in_attrs[addr / ls_stride][(addr % ls_stride) >> 4][(addr & 0xF) >> 2]; + * float value = in_attrs[addr / ls_stride][(addr % ls_stride) >> 4][(addr % ls_stride) >> 2]; * * For output writes, we assume the control point index is InvocationId, since high level languages * impose that restriction (although maybe it's technically possible on hardware). So SPIR-V looks * like this: * layout (location = 0) in vec4 in_attrs[][NUM_OUTPUT_ATTRIBUTES]; - * out_attrs[InvocationId][(addr % hs_cp_stride) >> 4][(addr & 0xF) >> 2] = value; + * out_attrs[InvocationId][(addr % hs_cp_stride) >> 4][(addr % hs_cp_stride) >> 2] = value; * - * NUM_OUTPUT_ATTRIBUTES is derived by hs_cp_stride / 16, so it can link with the TES in_attrs - * variable. + * NUM_OUTPUT_ATTRIBUTES is derived by ALIGN_UP(hs_cp_stride, 16) / 16, so it matches + * NUM_INPUT_ATTRIBUTES of the TES. * * Another challenge is the fact that the GCN shader needs to address attributes from LDS as a whole * which contains the attributes from many patches. On the other hand, higher level shading @@ -235,12 +237,11 @@ private: case IR::Opcode::Phi: { struct PhiCounter { u16 seq_num; - u8 unique_edge; - u8 counter; + u16 unique_edge; }; PhiCounter count = inst->Flags(); - ASSERT_MSG(count.counter == 0 || count.unique_edge == use.operand); + ASSERT_MSG(count.seq_num == 0 || count.unique_edge == use.operand); // the point of seq_num is to tell us if we've already traversed this // phi on the current walk. Alternatively we could keep a set of phi's // seen on the current walk. This is to handle phi cycles @@ -249,13 +250,11 @@ private: count.seq_num = seq_num; // Mark the phi as having been traversed originally through this edge count.unique_edge = use.operand; - count.counter = inc; } else if (count.seq_num < seq_num) { count.seq_num = seq_num; // For now, assume we are visiting this phi via the same edge // as on other walks. If not, some dataflow analysis might be necessary ASSERT(count.unique_edge == use.operand); - count.counter += inc; } else { // count.seq_num == seq_num // there's a cycle, and we've already been here on this walk diff --git a/src/shader_recompiler/ir/srt_gvn_table.h b/src/shader_recompiler/ir/srt_gvn_table.h index 232ee6152..3baa1c7da 100644 --- a/src/shader_recompiler/ir/srt_gvn_table.h +++ b/src/shader_recompiler/ir/srt_gvn_table.h @@ -52,24 +52,16 @@ private: switch (inst->GetOpcode()) { case IR::Opcode::Phi: { - // hack to get to parity with main - // Need to fix ssa_rewrite pass to remove certain phis - std::optional source = TryRemoveTrivialPhi(inst); - if (!source) { - const auto pred = [](IR::Inst* inst) -> std::optional { - if (inst->GetOpcode() == IR::Opcode::GetUserData || - inst->GetOpcode() == IR::Opcode::CompositeConstructU32x2 || - inst->GetOpcode() == IR::Opcode::ReadConst) { - return inst; - } - return std::nullopt; - }; - source = IR::BreadthFirstSearch(inst, pred).transform([](auto inst) { - return IR::Value{inst}; - }); - ASSERT(source); - } - vn = GetValueNumber(source.value()); + const auto pred = [](IR::Inst* inst) -> std::optional { + if (inst->GetOpcode() == IR::Opcode::GetUserData || + inst->GetOpcode() == IR::Opcode::CompositeConstructU32x2 || + inst->GetOpcode() == IR::Opcode::ReadConst) { + return inst; + } + return std::nullopt; + }; + IR::Inst* source = IR::BreadthFirstSearch(inst, pred).value(); + vn = GetValueNumber(source); value_numbers[IR::Value(inst)] = vn; break; } @@ -117,30 +109,6 @@ private: return iv; } - // Temp workaround for something like this: - // [0000555558a5baf8] %297 = Phi [ %24, {Block $1} ], [ %297, {Block $5} ] (uses: 4) - // [0000555558a4e038] %305 = CompositeConstructU32x2 %297, %296 (uses: 4) - // [0000555558a4e0a8] %306 = ReadConst %305, #0 (uses: 2) - // Should probably be fixed in ssa_rewrite - std::optional TryRemoveTrivialPhi(IR::Inst* phi) { - IR::Value single_source{}; - - for (auto i = 0; i < phi->NumArgs(); i++) { - IR::Value v = phi->Arg(i).Resolve(); - if (v == IR::Value(phi)) { - continue; - } - if (!single_source.IsEmpty() && single_source != v) { - return std::nullopt; - } - single_source = v; - } - - ASSERT(!single_source.IsEmpty()); - phi->ReplaceUsesWith(single_source); - return single_source; - } - struct HashInstVector { size_t operator()(const InstVector& iv) const { u32 h = 0; From a583a9abe08622ff90c0589f06c9abc2165e7994 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Sun, 2 Mar 2025 20:13:23 +0000 Subject: [PATCH 380/455] fixes to get in game (#2583) --- src/shader_recompiler/backend/spirv/emit_spirv.cpp | 2 ++ src/shader_recompiler/backend/spirv/spirv_emit_context.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 6b0d7228b..036df24d8 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -32,6 +32,8 @@ static constexpr spv::ExecutionMode GetInputPrimitiveType(AmdGpu::PrimitiveType return spv::ExecutionMode::Triangles; case AmdGpu::PrimitiveType::AdjTriangleList: return spv::ExecutionMode::InputTrianglesAdjacency; + case AmdGpu::PrimitiveType::AdjLineList: + return spv::ExecutionMode::InputLinesAdjacency; default: UNREACHABLE_MSG("Unknown input primitive type {}", u32(type)); } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 7c25d1477..e20cfeae2 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -50,6 +50,8 @@ static constexpr u32 NumVertices(AmdGpu::PrimitiveType type) { return 3u; case AmdGpu::PrimitiveType::AdjTriangleList: return 6u; + case AmdGpu::PrimitiveType::AdjLineList: + return 4u; default: UNREACHABLE(); } From 951128389d3b87a95fdfccf033795486985c7bd5 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 2 Mar 2025 23:09:38 +0200 Subject: [PATCH 381/455] [Lib] libsceHttp (#2576) * implemented sceHttpUriParse * argg clang * improved in case of file://// (probably) * rewrote httpuriparse to support file://// * fixed uriparse --- CMakeLists.txt | 1 + src/core/libraries/network/http.cpp | 275 +++++++++++++++++++++++- src/core/libraries/network/http.h | 20 +- src/core/libraries/network/http_error.h | 66 ++++++ 4 files changed, 352 insertions(+), 10 deletions(-) create mode 100644 src/core/libraries/network/http_error.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b05a175bb..88d874af0 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,6 +298,7 @@ set(KERNEL_LIB src/core/libraries/kernel/sync/mutex.cpp set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/http.h + src/core/libraries/network/http_error.h src/core/libraries/network/http2.cpp src/core/libraries/network/http2.h src/core/libraries/network/net.cpp diff --git a/src/core/libraries/network/http.cpp b/src/core/libraries/network/http.cpp index 8e06c76fa..dbb5b096a 100644 --- a/src/core/libraries/network/http.cpp +++ b/src/core/libraries/network/http.cpp @@ -5,6 +5,7 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/http.h" +#include "http_error.h" namespace Libraries::Http { @@ -566,17 +567,277 @@ int PS4_SYSV_ABI sceHttpUriMerge() { return ORBIS_OK; } -int PS4_SYSV_ABI sceHttpUriParse() { +int PS4_SYSV_ABI sceHttpUriParse(OrbisHttpUriElement* out, const char* srcUri, void* pool, + size_t* require, size_t prepare) { + LOG_INFO(Lib_Http, "srcUri = {}", std::string(srcUri)); + if (!srcUri) { + LOG_ERROR(Lib_Http, "invalid url"); + return ORBIS_HTTP_ERROR_INVALID_URL; + } + if (!out && !pool && !require) { + LOG_ERROR(Lib_Http, "invalid values"); + return ORBIS_HTTP_ERROR_INVALID_VALUE; + } + + if (out && pool) { + memset(out, 0, sizeof(OrbisHttpUriElement)); + out->scheme = (char*)pool; + } + + // Track the total required buffer size + size_t requiredSize = 0; + + // Parse the scheme (e.g., "http:", "https:", "file:") + size_t schemeLength = 0; + while (srcUri[schemeLength] && srcUri[schemeLength] != ':') { + if (!isalnum(srcUri[schemeLength])) { + LOG_ERROR(Lib_Http, "invalid url"); + return ORBIS_HTTP_ERROR_INVALID_URL; + } + schemeLength++; + } + + if (pool && prepare < schemeLength + 1) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + if (out && pool) { + memcpy(out->scheme, srcUri, schemeLength); + out->scheme[schemeLength] = '\0'; + } + + requiredSize += schemeLength + 1; + + // Move past the scheme and ':' character + size_t offset = schemeLength + 1; + + // Check if "//" appears after the scheme + if (strncmp(srcUri + offset, "//", 2) == 0) { + // "//" is present + if (out) { + out->opaque = false; + } + offset += 2; // Move past "//" + } else { + // "//" is not present + if (out) { + out->opaque = true; + } + } + + // Handle "file" scheme + if (strncmp(srcUri, "file", 4) == 0) { + // File URIs typically start with "file://" + if (out && !out->opaque) { + // Skip additional slashes (e.g., "////") + while (srcUri[offset] == '/') { + offset++; + } + + // Parse the path (everything after the slashes) + char* pathStart = (char*)srcUri + offset; + size_t pathLength = 0; + while (pathStart[pathLength] && pathStart[pathLength] != '?' && + pathStart[pathLength] != '#') { + pathLength++; + } + + // Ensure the path starts with '/' + if (pathLength > 0 && pathStart[0] != '/') { + // Prepend '/' to the path + requiredSize += pathLength + 2; // Include '/' and null terminator + + if (pool && prepare < requiredSize) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + if (out && pool) { + out->path = (char*)pool + (requiredSize - pathLength - 2); + out->path[0] = '/'; // Add leading '/' + memcpy(out->path + 1, pathStart, pathLength); + out->path[pathLength + 1] = '\0'; + } + } else { + // Path already starts with '/' + requiredSize += pathLength + 1; + + if (pool && prepare < requiredSize) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + if (out && pool) { + memcpy((char*)pool + (requiredSize - pathLength - 1), pathStart, pathLength); + out->path = (char*)pool + (requiredSize - pathLength - 1); + out->path[pathLength] = '\0'; + } + } + + // Move past the path + offset += pathLength; + } + } + + // Handle non-file schemes (e.g., "http", "https") + else { + // Parse the host and port + char* hostStart = (char*)srcUri + offset; + while (*hostStart == '/') { + hostStart++; + } + + size_t hostLength = 0; + while (hostStart[hostLength] && hostStart[hostLength] != '/' && + hostStart[hostLength] != '?' && hostStart[hostLength] != ':') { + hostLength++; + } + + requiredSize += hostLength + 1; + + if (pool && prepare < requiredSize) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + if (out && pool) { + memcpy((char*)pool + (requiredSize - hostLength - 1), hostStart, hostLength); + out->hostname = (char*)pool + (requiredSize - hostLength - 1); + out->hostname[hostLength] = '\0'; + } + + // Move past the host + offset += hostLength; + + // Parse the port (if present) + if (hostStart[hostLength] == ':') { + char* portStart = hostStart + hostLength + 1; + size_t portLength = 0; + while (portStart[portLength] && isdigit(portStart[portLength])) { + portLength++; + } + + requiredSize += portLength + 1; + + if (pool && prepare < requiredSize) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + // Convert the port string to a uint16_t + char portStr[6]; // Max length for a port number (65535) + if (portLength > 5) { + LOG_ERROR(Lib_Http, "invalid url"); + return ORBIS_HTTP_ERROR_INVALID_URL; + } + memcpy(portStr, portStart, portLength); + portStr[portLength] = '\0'; + + uint16_t port = (uint16_t)atoi(portStr); + if (port == 0 && portStr[0] != '0') { + LOG_ERROR(Lib_Http, "invalid url"); + return ORBIS_HTTP_ERROR_INVALID_URL; + } + + // Set the port in the output structure + if (out) { + out->port = port; + } + + // Move past the port + offset += portLength + 1; + } + } + + // Parse the path (if present) + if (srcUri[offset] == '/') { + char* pathStart = (char*)srcUri + offset; + size_t pathLength = 0; + while (pathStart[pathLength] && pathStart[pathLength] != '?' && + pathStart[pathLength] != '#') { + pathLength++; + } + + requiredSize += pathLength + 1; + + if (pool && prepare < requiredSize) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + if (out && pool) { + memcpy((char*)pool + (requiredSize - pathLength - 1), pathStart, pathLength); + out->path = (char*)pool + (requiredSize - pathLength - 1); + out->path[pathLength] = '\0'; + } + + // Move past the path + offset += pathLength; + } + + // Parse the query (if present) + if (srcUri[offset] == '?') { + char* queryStart = (char*)srcUri + offset + 1; + size_t queryLength = 0; + while (queryStart[queryLength] && queryStart[queryLength] != '#') { + queryLength++; + } + + requiredSize += queryLength + 1; + + if (pool && prepare < requiredSize) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + if (out && pool) { + memcpy((char*)pool + (requiredSize - queryLength - 1), queryStart, queryLength); + out->query = (char*)pool + (requiredSize - queryLength - 1); + out->query[queryLength] = '\0'; + } + + // Move past the query + offset += queryLength + 1; + } + + // Parse the fragment (if present) + if (srcUri[offset] == '#') { + char* fragmentStart = (char*)srcUri + offset + 1; + size_t fragmentLength = 0; + while (fragmentStart[fragmentLength]) { + fragmentLength++; + } + + requiredSize += fragmentLength + 1; + + if (pool && prepare < requiredSize) { + LOG_ERROR(Lib_Http, "out of memory"); + return ORBIS_HTTP_ERROR_OUT_OF_MEMORY; + } + + if (out && pool) { + memcpy((char*)pool + (requiredSize - fragmentLength - 1), fragmentStart, + fragmentLength); + out->fragment = (char*)pool + (requiredSize - fragmentLength - 1); + out->fragment[fragmentLength] = '\0'; + } + } + + // Calculate the total required buffer size + if (require) { + *require = requiredSize; // Update with actual required size + } + + return ORBIS_OK; +} + +int PS4_SYSV_ABI sceHttpUriSweepPath(char* dst, const char* src, size_t srcSize) { LOG_ERROR(Lib_Http, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceHttpUriSweepPath() { - LOG_ERROR(Lib_Http, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceHttpUriUnescape() { +int PS4_SYSV_ABI sceHttpUriUnescape(char* out, size_t* require, size_t prepare, const char* in) { LOG_ERROR(Lib_Http, "(STUBBED) called"); return ORBIS_OK; } diff --git a/src/core/libraries/network/http.h b/src/core/libraries/network/http.h index 24bc83020..c687c60c4 100644 --- a/src/core/libraries/network/http.h +++ b/src/core/libraries/network/http.h @@ -11,6 +11,19 @@ class SymbolsResolver; namespace Libraries::Http { +struct OrbisHttpUriElement { + bool opaque; + char* scheme; + char* username; + char* password; + char* hostname; + char* path; + char* query; + char* fragment; + u16 port; + u8 reserved[10]; +}; + int PS4_SYSV_ABI sceHttpAbortRequest(); int PS4_SYSV_ABI sceHttpAbortRequestForce(); int PS4_SYSV_ABI sceHttpAbortWaitRequest(); @@ -122,9 +135,10 @@ int PS4_SYSV_ABI sceHttpUriBuild(); int PS4_SYSV_ABI sceHttpUriCopy(); int PS4_SYSV_ABI sceHttpUriEscape(); int PS4_SYSV_ABI sceHttpUriMerge(); -int PS4_SYSV_ABI sceHttpUriParse(); -int PS4_SYSV_ABI sceHttpUriSweepPath(); -int PS4_SYSV_ABI sceHttpUriUnescape(); +int PS4_SYSV_ABI sceHttpUriParse(OrbisHttpUriElement* out, const char* srcUri, void* pool, + size_t* require, size_t prepare); +int PS4_SYSV_ABI sceHttpUriSweepPath(char* dst, const char* src, size_t srcSize); +int PS4_SYSV_ABI sceHttpUriUnescape(char* out, size_t* require, size_t prepare, const char* in); int PS4_SYSV_ABI sceHttpWaitRequest(); void RegisterlibSceHttp(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/libraries/network/http_error.h b/src/core/libraries/network/http_error.h new file mode 100644 index 000000000..49cc89766 --- /dev/null +++ b/src/core/libraries/network/http_error.h @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/libraries/error_codes.h" + +constexpr int ORBIS_HTTP_ERROR_BEFORE_INIT = 0x80431001; +constexpr int ORBIS_HTTP_ERROR_ALREADY_INITED = 0x80431020; +constexpr int ORBIS_HTTP_ERROR_BUSY = 0x80431021; +constexpr int ORBIS_HTTP_ERROR_OUT_OF_MEMORY = 0x80431022; +constexpr int ORBIS_HTTP_ERROR_NOT_FOUND = 0x80431025; +constexpr int ORBIS_HTTP_ERROR_INVALID_VERSION = 0x8043106a; +constexpr int ORBIS_HTTP_ERROR_INVALID_ID = 0x80431100; +constexpr int ORBIS_HTTP_ERROR_OUT_OF_SIZE = 0x80431104; +constexpr int ORBIS_HTTP_ERROR_INVALID_VALUE = 0x804311fe; + +constexpr int ORBIS_HTTP_ERROR_INVALID_URL = 0x80433060; +constexpr int ORBIS_HTTP_ERROR_UNKNOWN_SCHEME = 0x80431061; +constexpr int ORBIS_HTTP_ERROR_NETWORK = 0x80431063; +constexpr int ORBIS_HTTP_ERROR_BAD_RESPONSE = 0x80431064; +constexpr int ORBIS_HTTP_ERROR_BEFORE_SEND = 0x80431065; +constexpr int ORBIS_HTTP_ERROR_AFTER_SEND = 0x80431066; +constexpr int ORBIS_HTTP_ERROR_TIMEOUT = 0x80431068; +constexpr int ORBIS_HTTP_ERROR_UNKNOWN_AUTH_TYPE = 0x80431069; +constexpr int ORBIS_HTTP_ERROR_UNKNOWN_METHOD = 0x8043106b; +constexpr int ORBIS_HTTP_ERROR_READ_BY_HEAD_METHOD = 0x8043106f; +constexpr int ORBIS_HTTP_ERROR_NOT_IN_COM = 0x80431070; +constexpr int ORBIS_HTTP_ERROR_NO_CONTENT_LENGTH = 0x80431071; +constexpr int ORBIS_HTTP_ERROR_CHUNK_ENC = 0x80431072; +constexpr int ORBIS_HTTP_ERROR_TOO_LARGE_RESPONSE_HEADER = 0x80431073; +constexpr int ORBIS_HTTP_ERROR_SSL = 0x80431075; +constexpr int ORBIS_HTTP_ERROR_INSUFFICIENT_STACKSIZE = 0x80431076; +constexpr int ORBIS_HTTP_ERROR_ABORTED = 0x80431080; +constexpr int ORBIS_HTTP_ERROR_UNKNOWN = 0x80431081; +constexpr int ORBIS_HTTP_ERROR_EAGAIN = 0x80431082; +constexpr int ORBIS_HTTP_ERROR_PROXY = 0x80431084; +constexpr int ORBIS_HTTP_ERROR_BROKEN = 0x80431085; + +constexpr int ORBIS_HTTP_ERROR_PARSE_HTTP_NOT_FOUND = 0x80432025; +constexpr int ORBIS_HTTP_ERROR_PARSE_HTTP_INVALID_RESPONSE = 0x80432060; +constexpr int ORBIS_HTTP_ERROR_PARSE_HTTP_INVALID_VALUE = 0x804321fe; + +constexpr int ORBIS_HTTP_ERROR_RESOLVER_EPACKET = 0x80436001; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENODNS = 0x80436002; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ETIMEDOUT = 0x80436003; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENOSUPPORT = 0x80436004; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_EFORMAT = 0x80436005; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ESERVERFAILURE = 0x80436006; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENOHOST = 0x80436007; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENOTIMPLEMENTED = 0x80436008; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ESERVERREFUSED = 0x80436009; +constexpr int ORBIS_HTTP_ERROR_RESOLVER_ENORECORD = 0x8043600a; + +constexpr int ORBIS_HTTPS_ERROR_CERT = 0x80435060; +constexpr int ORBIS_HTTPS_ERROR_HANDSHAKE = 0x80435061; +constexpr int ORBIS_HTTPS_ERROR_IO = 0x80435062; +constexpr int ORBIS_HTTPS_ERROR_INTERNAL = 0x80435063; +constexpr int ORBIS_HTTPS_ERROR_PROXY = 0x80435064; + +constexpr int ORBIS_HTTPS_ERROR_SSL_INTERNAL = 0x01; +constexpr int ORBIS_HTTPS_ERROR_SSL_INVALID_CERT = 0x02; +constexpr int ORBIS_HTTPS_ERROR_SSL_CN_CHECK = 0x04; +constexpr int ORBIS_HTTPS_ERROR_SSL_NOT_AFTER_CHECK = 0x08; +constexpr int ORBIS_HTTPS_ERROR_SSL_NOT_BEFORE_CHECK = 0x10; +constexpr int ORBIS_HTTPS_ERROR_SSL_UNKNOWN_CA = 0x20; From c59d5eef45634c08ec1999b8fdb1cc6b6cca3566 Mon Sep 17 00:00:00 2001 From: baggins183 Date: Sun, 2 Mar 2025 19:17:11 -0800 Subject: [PATCH 382/455] Specialize vertex attributes on dst_sel (#2580) * Specialize vertex attributes on dst_sel * compare vs attrib specs by default, ignore NumberFmt when vertex input dynamic state is supported * specialize data_format when attribute uses step rates * use num_components in data fmt instead of fmt itself --- src/shader_recompiler/specialization.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/specialization.h b/src/shader_recompiler/specialization.h index 1c3bfc60a..e40309aaf 100644 --- a/src/shader_recompiler/specialization.h +++ b/src/shader_recompiler/specialization.h @@ -13,7 +13,9 @@ namespace Shader { struct VsAttribSpecialization { + s32 num_components{}; AmdGpu::NumberClass num_class{}; + AmdGpu::CompMapping dst_select{}; auto operator<=>(const VsAttribSpecialization&) const = default; }; @@ -89,12 +91,17 @@ struct StageSpecialization { Backend::Bindings start_) : info{&info_}, runtime_info{runtime_info_}, start{start_} { fetch_shader_data = Gcn::ParseFetchShader(info_); - if (info_.stage == Stage::Vertex && fetch_shader_data && - !profile_.support_legacy_vertex_attributes) { + if (info_.stage == Stage::Vertex && fetch_shader_data) { // Specialize shader on VS input number types to follow spec. ForEachSharp(vs_attribs, fetch_shader_data->attributes, - [](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { - spec.num_class = AmdGpu::GetNumberClass(sharp.GetNumberFmt()); + [&profile_](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { + spec.num_components = desc.UsesStepRates() + ? AmdGpu::NumComponents(sharp.GetDataFmt()) + : 0; + spec.num_class = profile_.support_legacy_vertex_attributes + ? AmdGpu::NumberClass{} + : AmdGpu::GetNumberClass(sharp.GetNumberFmt()); + spec.dst_select = sharp.DstSelect(); }); } u32 binding{}; From 517d7f04c660c9b0562a01430cd1759109397667 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Mon, 3 Mar 2025 04:29:39 -0300 Subject: [PATCH 383/455] Grammatical error: thophy to trophy :) (#2585) * Update settings_dialog.cpp * Update en_US.ts --- src/qt_gui/settings_dialog.cpp | 2 +- src/qt_gui/translations/en_US.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index a3890b548..8bd72a237 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -618,7 +618,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { //User if (elementName == "OpenCustomTrophyLocationButton") { - text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png\\nNote: The sound will only work in QT versions."); + text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\\nNote: The sound will only work in QT versions."); } // Input diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 29ce27f07..df4abdbf0 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never From c2adaf41c0c5e792796dbe2b5c63990f47913bc7 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:52:13 +0800 Subject: [PATCH 384/455] Qt: Add Initial KBM remapping GUI (#2544) * Initial KBM remapping GUI * Added Mousewheel mapping * Make window wider so for mousewheel + modifier string * Fix alt + mousewheel vertical being changed to horizontal for qwidgets --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- CMakeLists.txt | 3 + REUSE.toml | 1 + src/images/KBM.png | Bin 0 -> 241859 bytes src/qt_gui/kbm_gui.cpp | 1047 ++++++++++++++++++++++ src/qt_gui/kbm_gui.h | 56 ++ src/qt_gui/kbm_gui.ui | 1708 ++++++++++++++++++++++++++++++++++++ src/qt_gui/main_window.cpp | 6 +- src/shadps4.qrc | 1 + 8 files changed, 2818 insertions(+), 4 deletions(-) create mode 100644 src/images/KBM.png create mode 100644 src/qt_gui/kbm_gui.cpp create mode 100644 src/qt_gui/kbm_gui.h create mode 100644 src/qt_gui/kbm_gui.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 88d874af0..b8d82a11c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -917,6 +917,9 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/control_settings.cpp src/qt_gui/control_settings.h src/qt_gui/control_settings.ui + src/qt_gui/kbm_gui.cpp + src/qt_gui/kbm_gui.h + src/qt_gui/kbm_gui.ui src/qt_gui/main_window_ui.h src/qt_gui/main_window.cpp src/qt_gui/main_window.h diff --git a/REUSE.toml b/REUSE.toml index d8f31c2f2..5cf7b01bf 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -41,6 +41,7 @@ path = [ "src/images/grid_icon.png", "src/images/keyboard_icon.png", "src/images/iconsize_icon.png", + "src/images/KBM.png", "src/images/ko-fi.png", "src/images/list_icon.png", "src/images/list_mode_icon.png", diff --git a/src/images/KBM.png b/src/images/KBM.png new file mode 100644 index 0000000000000000000000000000000000000000..37f52d549da567eb88eae45a60b174def40691b2 GIT binary patch literal 241859 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

" + tr("Changes") + ":

" + changes); } From 96560ed3caa2afb171302d6e4adccd13d24cec1d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 5 Mar 2025 18:12:35 +0200 Subject: [PATCH 394/455] New Crowdin updates (#2596) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (French) * New translations en_us.ts (Russian) * New translations en_us.ts (Russian) * New translations en_us.ts (Italian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Swedish) * New translations en_us.ts (Swedish) * New translations en_us.ts (Albanian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Albanian) --- src/qt_gui/translations/ar_SA.ts | 24 +++-- src/qt_gui/translations/da_DK.ts | 24 +++-- src/qt_gui/translations/de_DE.ts | 24 +++-- src/qt_gui/translations/el_GR.ts | 24 +++-- src/qt_gui/translations/es_ES.ts | 24 +++-- src/qt_gui/translations/fa_IR.ts | 24 +++-- src/qt_gui/translations/fi_FI.ts | 24 +++-- src/qt_gui/translations/fr_FR.ts | 146 +++++++++++++++---------------- src/qt_gui/translations/hu_HU.ts | 24 +++-- src/qt_gui/translations/id_ID.ts | 24 +++-- src/qt_gui/translations/it_IT.ts | 28 +++--- src/qt_gui/translations/ja_JP.ts | 24 +++-- src/qt_gui/translations/ko_KR.ts | 24 +++-- src/qt_gui/translations/lt_LT.ts | 24 +++-- src/qt_gui/translations/nb_NO.ts | 102 +++++++++++---------- src/qt_gui/translations/nl_NL.ts | 24 +++-- src/qt_gui/translations/pl_PL.ts | 24 +++-- src/qt_gui/translations/pt_BR.ts | 32 +++---- src/qt_gui/translations/pt_PT.ts | 24 +++-- src/qt_gui/translations/ro_RO.ts | 24 +++-- src/qt_gui/translations/ru_RU.ts | 110 +++++++++++------------ src/qt_gui/translations/sq_AL.ts | 54 ++++++------ src/qt_gui/translations/sv_SE.ts | 102 +++++++++++---------- src/qt_gui/translations/tr_TR.ts | 78 ++++++++--------- src/qt_gui/translations/uk_UA.ts | 24 +++-- src/qt_gui/translations/vi_VN.ts | 24 +++-- src/qt_gui/translations/zh_CN.ts | 24 +++-- src/qt_gui/translations/zh_TW.ts | 24 +++-- 28 files changed, 510 insertions(+), 622 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 7c5cf1631..87ccf0bd9 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 591f9b659..c000a31d5 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 8a903070e..ee4ddbc15 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 113d095fc..e85e02eab 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 24b8a9bfe..4a5977239 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 8e03ec59d..d7cd34d7e 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 9d171b7fc..5d546f91f 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index e17ff70cb..608b5d9ae 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -487,7 +487,7 @@ Face Buttons - Face Buttons + Touches d'action Triangle / Y @@ -535,7 +535,7 @@ Override Lightbar Color - Override Lightbar Color + Remplacer la couleur de la barre de lumière Override Color @@ -777,7 +777,7 @@ Delete Trophy - Delete Trophy + Supprimer Trophée Compatibility... @@ -857,7 +857,7 @@ No log file found for this game! - No log file found for this game! + Aucun fichier journal trouvé pour ce jeu! Failed to convert icon. @@ -869,7 +869,7 @@ This game has no saved trophies to delete! - This game has no saved trophies to delete! + Ce jeu n'a aucun trophée sauvegardé à supprimer! Save Data @@ -877,7 +877,7 @@ Trophy - Trophy + Trophée SFO Viewer for @@ -907,163 +907,159 @@ KBMSettings Configure Controls - Configure Controls + Configurer les Commandes D-Pad - D-Pad + Croix directionnelle Up - Up + Haut unmapped - unmapped + non mappé Left - Left + Gauche Right - Right + Droite Down - Down + Bas Left Analog Halfmode - Left Analog Halfmode + Demi-mode analogique gauche hold to move left stick at half-speed - hold to move left stick at half-speed + maintenez pour déplacer le joystick gauche à mi-vitesse Left Stick - Left Stick + Joystick gauche Config Selection - Config Selection + Sélection de la Configuration Common Config - Common Config + Configuration Commune Use per-game configs - Use per-game configs - - - Copy from Common Config - Copy from Common Config + Utiliser les configurations par jeu L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Éditeur de Texte Help - Help + Aide R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Clic tactile Mouse to Joystick - Mouse to Joystick + Souris vers Joystick *press F7 ingame to activate - *press F7 ingame to activate + *Appuyez sur F7 en jeu pour activer R3 - R3 + R3 Options - Options + Options Mouse Movement Parameters - Mouse Movement Parameters + Paramètres du mouvement de la souris note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + remarque: cliquez sur le bouton Aide / Raccourcis spéciaux pour plus d'informations Face Buttons - Face Buttons + Touches d'action Triangle - Triangle + Triangle Square - Square + Carré Circle - Circle + Rond Cross - Cross + Croix Right Analog Halfmode - Right Analog Halfmode + Demi-mode analogique droit hold to move right stick at half-speed - hold to move right stick at half-speed + maintenez pour déplacer le joystick droit à mi-vitesse Right Stick - Right Stick - - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Joystick Droit Speed Offset (def 0.125): - Speed Offset (def 0.125): + Décalage de vitesse (def 0,125) : - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copier à partir de la configuration commune + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0,50): + + + Speed Multiplier (def 1.0): + Multiplicateur de vitesse (def 1,0) : @@ -1492,7 +1488,7 @@ Open the custom trophy images/sounds folder - Open the custom trophy images/sounds folder + Ouvrir le dossier des images/sons de trophée personnalisé Logger @@ -1660,7 +1656,7 @@ Disable Trophy Notification - Disable Trophy Notification + Désactiver la notification de trophée Background Image @@ -1796,7 +1792,7 @@ Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Ouvrez le dossier des images/sons de trophée personnalisés:\nVous pouvez ajouter des images personnalisées aux trophées et un audio.\nAjouter les fichiers à custom_trophy avec les noms suivants :\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: Le son ne fonctionnera que dans les versions QT. Never @@ -1904,7 +1900,7 @@ Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Parcourir:\nNaviguez pour trouver un dossier pour définir le chemin des données de sauvegarde. Release @@ -1984,47 +1980,47 @@ Separate Log Files - Separate Log Files + Séparer les fichiers de log Separate Log Files:\nWrites a separate logfile for each game. - Separate Log Files:\nWrites a separate logfile for each game. + Fichiers journaux séparés :\nÉcrit un fichier journal séparé pour chaque jeu. Trophy Notification Position - Trophy Notification Position + Position de notification du trophée Left - Left + Gauche Right - Right + Droite Top - Top + Haut Bottom - Bottom + Bas Notification Duration - Notification Duration + Durée de la notification Portable User Folder - Portable User Folder + Dossier d'utilisateur portable Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Créer un dossier utilisateur portable à partir du dossier utilisateur commun Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Dossier utilisateur portable :\nStocke les paramètres et données shadPS4 qui seront appliqués uniquement à la version shadPS4 située dans le dossier actuel. Redémarrez l'application après avoir créé le dossier utilisateur portable pour commencer à l'utiliser. @@ -2035,19 +2031,19 @@ Progress - Progress + Progression Show Earned Trophies - Show Earned Trophies + Afficher les trophées gagnés Show Not Earned Trophies - Show Not Earned Trophies + Afficher les trophées non gagnés Show Hidden Trophies - Show Hidden Trophies + Afficher les trophées cachés diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 1ee60ef19..62c327c8c 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 2ef26aa37..1551c0aac 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index bb357ef04..558b6f166 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -957,10 +957,6 @@ Use per-game configs Usa configurazioni per gioco - - Copy from Common Config - Copia da Configurazione Comune - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Levetta Destra - - Deadzone Offset (def 0.50): - Scostamento Zona Morta (def 0,50): - - - Speed Multiplier (def 1.0): - Moltiplicatore Di Velocità (def 1,0): - Speed Offset (def 0.125): Scostamento Velocità (def 0,125): - Speed Offset (def 0.125): - Scostamento Velocità (def 0,125): + Copy from Common Config + Copia da Configurazione Comune + + + Deadzone Offset (def 0.50): + Scostamento Zona Morta (def 0,50): + + + Speed Multiplier (def 1.0): + Moltiplicatore Di Velocità (def 1,0): @@ -2016,11 +2012,11 @@ Portable User Folder - Portable User Folder + Cartella Utente Portatile Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Crea una Cartella Utente Portatile dalla Cartella Comune Utente Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 70264ef12..2e1bbe394 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 096fef0a3..7f2bc531c 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 7d69e10b9..a9932cb1a 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index a3adbcc5d..4069da198 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -907,163 +907,159 @@ KBMSettings Configure Controls - Configure Controls + Tastaturoppsett D-Pad - D-Pad + Navigasjonsknapper Up - Up + Opp unmapped - unmapped + Ikke satt opp Left - Left + Venstre Right - Right + Høyre Down - Down + Ned Left Analog Halfmode - Left Analog Halfmode + Venstre analog halvmodus hold to move left stick at half-speed - hold to move left stick at half-speed + Hold for å bevege venstre analog med halv hastighet Left Stick - Left Stick + Venstre analog Config Selection - Config Selection + Valg av oppsett Common Config - Common Config + Felles oppsett Use per-game configs - Use per-game configs - - - Copy from Common Config - Copy from Common Config + Bruk oppsett per spill L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Skriveprogram Help - Help + Hjelp R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Berøringsplate knapp Mouse to Joystick - Mouse to Joystick + Mus til styrespak *press F7 ingame to activate - *press F7 ingame to activate + Trykk F7 i spillet for å bruke R3 - R3 + R3 Options - Options + Options Mouse Movement Parameters - Mouse Movement Parameters + Oppsett av musebevegelse note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + Merk: Trykk på hjelpeknappen for mer informasjon Face Buttons - Face Buttons + Handlingsknapper Triangle - Triangle + Triangel Square - Square + Firkant Circle - Circle + Sirkel Cross - Cross + Kryss Right Analog Halfmode - Right Analog Halfmode + Høyre analog halvmodus hold to move right stick at half-speed - hold to move right stick at half-speed + Hold for å bevege høyre analog med halv hastighet Right Stick - Right Stick - - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Høyre analog Speed Offset (def 0.125): - Speed Offset (def 0.125): + Hastighetsforskyvning (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Kopier fra felles oppsettet + + + Deadzone Offset (def 0.50): + Dødsoneforskyvning (def 0.50): + + + Speed Multiplier (def 1.0): + Hurtighetsmultiplikator (def 1.0): @@ -2016,15 +2012,15 @@ Portable User Folder - Portable User Folder + Separat brukermappe Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Lag ny separat brukermappe fra fellesbrukermappa Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Separat brukermappe:\n Lagrer shadPS4-innstillinger og data som kun brukes til shadPS4 programmet i gjeldende mappe. Start programmet på nytt etter opprettelsen av mappa for å ta den i bruk. diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 1b752649a..493468bc8 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 3b22ba9a5..f29b731be 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 9fa7c49aa..ae5567cc9 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -911,7 +911,7 @@ D-Pad - Direcionais + Direcional Up @@ -957,10 +957,6 @@ Use per-game configs Usar configurações por jogo - - Copy from Common Config - Copiar da Configuração Comum - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Analógico Direito - - Deadzone Offset (def 0.50): - Deslocamento da Zona Morta (Pad 0,50): - - - Speed Multiplier (def 1.0): - Multiplicador de Velocidade (Pad 1,0): - Speed Offset (def 0.125): Deslocamento de Velocidade (Pad 0,125): - Speed Offset (def 0.125): - Deslocamento de Velocidade (Pad 0,125): + Copy from Common Config + Copiar da Configuração Comum + + + Deadzone Offset (def 0.50): + Deslocamento da Zona Morta (Pad 0,50): + + + Speed Multiplier (def 1.0): + Multiplicador de Velocidade (Pad 1,0): @@ -2016,15 +2012,15 @@ Portable User Folder - Pasta de Usuário Portátil + Pasta Portátil do Usuário Create Portable User Folder from Common User Folder - Criar Pasta de Usuário Portátil a partir da Pasta de Usuário Comum + Criar Pasta Portátil do Usuário a partir da Pasta Comum do Usuário Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Pasta de usuário portátil:\nArmazena as configurações e dados do shadPS4 que serão aplicados apenas à compilação do shadPS4 localizada na pasta atual. Reinicie o aplicativo após criar a pasta de usuário portátil para começar a usá-la. + Pasta Portátil do Usuário:\nArmazena as configurações e dados do shadPS4 que serão aplicados apenas à compilação do shadPS4 localizada na pasta atual. Reinicie o aplicativo após criar a pasta portátil do usuário para começar a usá-la. diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index db7e15107..5a3a83bab 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -957,10 +957,6 @@ Use per-game configs Utilizar configurações por jogo - - Copy from Common Config - Copiar da Configuração Comum - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Manípulo Direito - - Deadzone Offset (def 0.50): - Deslocamento da Zona Morta (def 0,50): - - - Speed Multiplier (def 1.0): - Multiplicador de Velocidade (def 1,0): - Speed Offset (def 0.125): Deslocamento de Velocidade (def 0,125): - Speed Offset (def 0.125): - Deslocamento de Velocidade (def 0,125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 1fc4b9e99..df3eb5337 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index cf7fdccb9..f20989158 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -857,7 +857,7 @@ No log file found for this game! - Не найден файл журнала для этой игры! + Не найден файл логов для этой игры! Failed to convert icon. @@ -907,163 +907,159 @@ KBMSettings Configure Controls - Configure Controls + Настроить управление D-Pad - D-Pad + Крестовина Up - Up + Вверх unmapped - unmapped + не назначено Left - Left + Влево Right - Right + Вправо Down - Down + Вниз Left Analog Halfmode - Left Analog Halfmode + Левый стик вполовину hold to move left stick at half-speed - hold to move left stick at half-speed + удерживайте для перемещения левого стика вполовину меньше Left Stick - Left Stick + Левый стик Config Selection - Config Selection + Выбор конфига Common Config - Common Config + Общий конфиг Use per-game configs - Use per-game configs - - - Copy from Common Config - Copy from Common Config + Использовать настройки для каждой игры L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Текстовый редактор Help - Help + Помощь R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Нажатие на тачпад Mouse to Joystick - Mouse to Joystick + Мышь в джойстик *press F7 ingame to activate - *press F7 ingame to activate + *нажмите F7 в игре для активации R3 - R3 + R3 Options - Options + Options Mouse Movement Parameters - Mouse Movement Parameters + Параметры движения мыши note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + примечание: нажмите кнопку Help/Special Keybindings клавиш для получения дополнительной информации Face Buttons - Face Buttons + Кнопки действий Triangle - Triangle + Треугольник Square - Square + Квадрат Circle - Circle + Круг Cross - Cross + Крест Right Analog Halfmode - Right Analog Halfmode + Правый стик вполовину hold to move right stick at half-speed - hold to move right stick at half-speed + удерживайте для перемещения правого стика вполовину меньше Right Stick - Right Stick - - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Правый стик Speed Offset (def 0.125): - Speed Offset (def 0.125): + Смещение скорости (по умолч 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Копировать из общего конфига + + + Deadzone Offset (def 0.50): + Смещение мёртвой зоны (по умолч 0.50) + + + Speed Multiplier (def 1.0): + Множитель скорости (по умолч 1.0) @@ -1492,7 +1488,7 @@ Open the custom trophy images/sounds folder - Откройте папку с пользовательскими изображениями/звуками трофеев + Открыть папку с пользовательскими изображениями/звуками трофеев Logger @@ -1996,11 +1992,11 @@ Left - Влево + Слева Right - Вправо + Справа Top @@ -2016,15 +2012,15 @@ Portable User Folder - Portable User Folder + Портативная папка пользователя Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Создать портативную папку пользователя из общей папки пользователя Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Портативная папка пользователя:\nХранит настройки и данные shadPS4, которые будут применяться только к билду shadPS4, расположенному в этой папке. Перезагрузите приложение после создания портативной папки пользователя чтобы начать использовать её. diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index c34d3c6be..3bea8dc00 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -907,31 +907,31 @@ KBMSettings Configure Controls - Configure Controls + Konfiguro Kontrollet D-Pad - D-Pad + Shigjetat Up - Up + Lartë unmapped - unmapped + pacaktuar Left - Left + Majtas Right - Right + Djathtas Down - Down + Poshtë Left Analog Halfmode @@ -955,19 +955,15 @@ Use per-game configs - Use per-game configs - - - Copy from Common Config - Copy from Common Config + Përdor konfigurime për secilën lojë L1 - L1 + L1 L2 - L2 + L2 Text Editor @@ -975,19 +971,19 @@ Help - Help + Ndihmë R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click @@ -1003,7 +999,7 @@ R3 - R3 + R3 Options @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 0bea6b717..a43b2da1c 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -907,163 +907,159 @@ KBMSettings Configure Controls - Configure Controls + Konfigurera kontroller D-Pad - D-Pad + Riktningsknappar Up - Up + Upp unmapped - unmapped + inte mappad Left - Left + Vänster Right - Right + Höger Down - Down + Ner Left Analog Halfmode - Left Analog Halfmode + Halvläge för vänster analog hold to move left stick at half-speed - hold to move left stick at half-speed + håll ner för att flytta vänster spak i halvfart Left Stick - Left Stick + Vänster spak Config Selection - Config Selection + Konfigurationsval Common Config - Common Config + Gemensam konfiguration Use per-game configs - Use per-game configs - - - Copy from Common Config - Copy from Common Config + Använd konfiguration per-spel L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Textredigerare Help - Help + Hjälp R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Klick på styrplatta Mouse to Joystick - Mouse to Joystick + Mus till styrspak *press F7 ingame to activate - *press F7 ingame to activate + *tryck F7 i spelet för att aktivera R3 - R3 + R3 Options - Options + Alternativ Mouse Movement Parameters - Mouse Movement Parameters + Parametrar för musrörelse note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + observera: klicka på Hjälp-knapp/Speciella tangentbindningar för mer information Face Buttons - Face Buttons + Handlingsknappar Triangle - Triangle + Triangel Square - Square + Fyrkant Circle - Circle + Cirkel Cross - Cross + Kryss Right Analog Halfmode - Right Analog Halfmode + Halvläge för höger analog hold to move right stick at half-speed - hold to move right stick at half-speed + håll ner för att flytta höger spak i halvfart Right Stick - Right Stick - - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Höger spak Speed Offset (def 0.125): - Speed Offset (def 0.125): + Offset för hastighet (standard 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Kopiera från gemensam konfiguration + + + Deadzone Offset (def 0.50): + Offset för dödläge (standard 0.50): + + + Speed Multiplier (def 1.0): + Hastighetsmultiplikator (standard 1.0): @@ -2016,15 +2012,15 @@ Portable User Folder - Portable User Folder + Portabel användarmapp Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Skapa portabel användarmapp från gemensam användarmapp Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portabel användarmapp:\nLagrar shadPS4-inställningar och data som endast tillämpas på den shadPS4-version som finns i den aktuella mappen. Starta om appen efter att du har skapat den portabla användarmappen för att börja använda den. diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 18362ae75..22fbb76c9 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -451,7 +451,7 @@ Use per-game configs - Oyuna özel yapılandırmaları kullan + Oyuna özel yapılandırma kullan L1 / LB @@ -907,15 +907,15 @@ KBMSettings Configure Controls - Configure Controls + Kontrolleri Yapılandır D-Pad - D-Pad + Yön Düğmeleri Up - Up + Yukarı unmapped @@ -923,15 +923,15 @@ Left - Left + Sol Right - Right + Sağ Down - Down + Aşağı Left Analog Halfmode @@ -943,51 +943,47 @@ Left Stick - Left Stick + Sol Analog Config Selection - Config Selection + Yapılandırma Seçimi Common Config - Common Config + Genel Yapılandırma Use per-game configs - Use per-game configs - - - Copy from Common Config - Copy from Common Config + Oyuna özel yapılandırma kullan L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Metin Düzenleyici Help - Help + Yardım R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click @@ -1003,15 +999,15 @@ R3 - R3 + R3 Options - Options + Seçenekler Mouse Movement Parameters - Mouse Movement Parameters + Mouse Hızı Değişkenleri note: click Help Button/Special Keybindings for more information @@ -1019,23 +1015,23 @@ Face Buttons - Face Buttons + Eylem Düğmeleri Triangle - Triangle + Üçgen Square - Square + Kare Circle - Circle + Daire Cross - Cross + Çarpı Right Analog Halfmode @@ -1047,23 +1043,23 @@ Right Stick - Right Stick - - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Sağ Analog Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Genel Yapılandırmadan Kopyala + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 96c8e7c14..36626fefd 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 30a69e2f3..52f63bfe6 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 2dd554753..25b394df2 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -957,10 +957,6 @@ Use per-game configs 每个游戏使用单独的配置 - - Copy from Common Config - 从通用配置中复制 - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick 右摇杆 - - Deadzone Offset (def 0.50): - 死区偏移量(默认 0.50): - - - Speed Multiplier (def 1.0): - 速度系数(默认 1.0): - Speed Offset (def 0.125): 速度偏移量(默认 0.125): - Speed Offset (def 0.125): - 速度偏移量(默认 0.125): + Copy from Common Config + 从通用配置中复制 + + + Deadzone Offset (def 0.50): + 死区偏移量(默认 0.50): + + + Speed Multiplier (def 1.0): + 速度系数(默认 1.0): diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 913ca9aba..7a3caa474 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -957,10 +957,6 @@ Use per-game configs Use per-game configs - - Copy from Common Config - Copy from Common Config - L1 L1 @@ -1049,21 +1045,21 @@ Right Stick Right Stick - - Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): - - - Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): - Speed Offset (def 0.125): Speed Offset (def 0.125): - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + Copy from Common Config + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): From f1aea5176d00f13085080f0ea6bf0543f0083105 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 6 Mar 2025 09:09:12 +0200 Subject: [PATCH 395/455] New translations en_us.ts (Norwegian Bokmal) (#2599) --- src/qt_gui/translations/nb_NO.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 4069da198..0f9656189 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -22,11 +22,11 @@ CheatsPatches Cheats / Patches for - Juks / Programrettelser for + Juks og programrettelser for Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - Juks/programrettelse er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og klikke på nedlastingsknappen.\nPå fanen programrettelse kan du laste ned alle programrettelser samtidig, velge hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler Juks/Programrettelse,\nvær vennlig å rapportere problemer til juks/programrettelse utvikleren.\n\nHar du laget en ny juks? Besøk:\n + Juks og programrettelser er eksperimentelle.\nBruk med forsiktighet.\n\nLast ned juks individuelt ved å velge pakkebrønn og trykke på nedlastingsknappen.\nPå fanen programrettelser kan du laste ned alle programrettelser samtidig, velg hvilke du ønsker å bruke, og lagre valget ditt.\n\nSiden vi ikke utvikler juks eller programrettelser,\nmeld fra om feil til jukse eller programrettelse utvikleren.\n\nHar du utviklet en ny juks? Besøk:\n No Image Available @@ -337,7 +337,7 @@ The update has been downloaded, press OK to install. - Oppdateringen har blitt lastet ned, trykk OK for å installere. + Oppdateringen ble lastet ned, trykk OK for å installere. Failed to save the update file at @@ -407,11 +407,11 @@ ControlSettings Configure Controls - Sett opp kontroller + Kontrolleroppsett D-Pad - D-Pad + Navigasjonsknapper Up @@ -443,7 +443,7 @@ Config Selection - Utvalg av oppsett + Valg av oppsett Common Config @@ -709,7 +709,7 @@ Cheats / Patches - Juks / Programrettelse + Juks og programrettelser SFO Viewer @@ -841,7 +841,7 @@ Are you sure you want to delete %1's %2 directory? - Er du sikker på at du vil slette %1's %2 directory? + Er du sikker på at du vil slette %1's %2 mappa? Open Update Folder @@ -1154,7 +1154,7 @@ Download Cheats/Patches - Last ned juks/programrettelse + Last ned juks og programrettelser Dump Game List @@ -1436,7 +1436,7 @@ General - Generell + Generelt System @@ -1824,7 +1824,7 @@ Graphics Device:\nOn multiple GPU systems, select the GPU the emulator will use from the drop down list,\nor select "Auto Select" to automatically determine it. - Grafikkenhet:\nI systemer med flere GPU-er, velg GPU-en emulatoren skal bruke fra rullegardinlista,\neller "Velg automatisk&quot. + Grafikkenhet:\nSystemer med flere GPU-er, kan emulatoren velge hvilken enhet som skal brukes fra rullegardinlista,\neller velg "Velg automatisk". Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. @@ -1940,7 +1940,7 @@ Directory to install games - Mappe for å installere spill + Mappe for installering av spill Directory to save data From 0efe9a4d0f06d4dba40fbdce3c776d22159a6801 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Thu, 6 Mar 2025 15:09:27 +0800 Subject: [PATCH 396/455] Adds missing tr functions for certain GUI strings that should be translatable (#2598) * Adds missing tr functions for certain GUI strings that should be translatable * set clang format off for multi-line strings, set userDir as arg --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/qt_gui/control_settings.cpp | 4 ++-- src/qt_gui/kbm_config_dialog.cpp | 22 ++++++++--------- src/qt_gui/kbm_gui.cpp | 41 ++++++++++++++++---------------- src/qt_gui/kbm_help_dialog.cpp | 12 +++++----- src/qt_gui/settings_dialog.cpp | 30 +++++++++++------------ 5 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/qt_gui/control_settings.cpp b/src/qt_gui/control_settings.cpp index 820a490a0..885e36680 100644 --- a/src/qt_gui/control_settings.cpp +++ b/src/qt_gui/control_settings.cpp @@ -100,8 +100,8 @@ void ControlSettings::SaveControllerConfig(bool CloseOnSave) { if (count_axis_left_x > 1 | count_axis_left_y > 1 | count_axis_right_x > 1 | count_axis_right_y > 1) { QMessageBox::StandardButton nosave; - nosave = QMessageBox::information(this, "Unable to Save", - "Cannot bind axis values more than once"); + nosave = QMessageBox::information(this, tr("Unable to Save"), + tr("Cannot bind axis values more than once")); return; } diff --git a/src/qt_gui/kbm_config_dialog.cpp b/src/qt_gui/kbm_config_dialog.cpp index cfff056a0..49a6bcd89 100644 --- a/src/qt_gui/kbm_config_dialog.cpp +++ b/src/qt_gui/kbm_config_dialog.cpp @@ -28,7 +28,7 @@ HelpDialog* helpDialog; EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) { - setWindowTitle("Edit Keyboard + Mouse and Controller input bindings"); + setWindowTitle(tr("Edit Keyboard + Mouse and Controller input bindings")); resize(600, 400); // Create the editor widget @@ -42,7 +42,7 @@ EditorDialog::EditorDialog(QWidget* parent) : QDialog(parent) { // Load all installed games loadInstalledGames(); - QCheckBox* unifiedInputCheckBox = new QCheckBox("Use Per-Game configs", this); + QCheckBox* unifiedInputCheckBox = new QCheckBox(tr("Use Per-Game configs"), this); unifiedInputCheckBox->setChecked(!Config::GetUseUnifiedInputConfig()); // Connect checkbox signal @@ -94,7 +94,7 @@ void EditorDialog::loadFile(QString game) { originalConfig = editor->toPlainText(); file.close(); } else { - QMessageBox::warning(this, "Error", "Could not open the file for reading"); + QMessageBox::warning(this, tr("Error"), tr("Could not open the file for reading")); } } @@ -108,7 +108,7 @@ void EditorDialog::saveFile(QString game) { out << editor->toPlainText(); file.close(); } else { - QMessageBox::warning(this, "Error", "Could not open the file for writing"); + QMessageBox::warning(this, tr("Error"), tr("Could not open the file for writing")); } } @@ -121,7 +121,7 @@ void EditorDialog::closeEvent(QCloseEvent* event) { } if (hasUnsavedChanges()) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(this, "Save Changes", "Do you want to save changes?", + reply = QMessageBox::question(this, tr("Save Changes"), tr("Do you want to save changes?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if (reply == QMessageBox::Yes) { @@ -168,7 +168,7 @@ void EditorDialog::onCancelClicked() { void EditorDialog::onHelpClicked() { if (!isHelpOpen) { helpDialog = new HelpDialog(&isHelpOpen, this); - helpDialog->setWindowTitle("Help"); + helpDialog->setWindowTitle(tr("Help")); helpDialog->setAttribute(Qt::WA_DeleteOnClose); // Clean up on close // Get the position and size of the Config window QRect configGeometry = this->geometry(); @@ -188,10 +188,10 @@ void EditorDialog::onResetToDefaultClicked() { bool default_default = gameComboBox->currentText() == "default"; QString prompt = default_default - ? "Do you want to reset your custom default config to the original default config?" - : "Do you want to reset this config to your custom default config?"; - QMessageBox::StandardButton reply = - QMessageBox::question(this, "Reset to Default", prompt, QMessageBox::Yes | QMessageBox::No); + ? tr("Do you want to reset your custom default config to the original default config?") + : tr("Do you want to reset this config to your custom default config?"); + QMessageBox::StandardButton reply = QMessageBox::question(this, tr("Reset to Default"), prompt, + QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { if (default_default) { @@ -206,7 +206,7 @@ void EditorDialog::onResetToDefaultClicked() { editor->setPlainText(in.readAll()); file.close(); } else { - QMessageBox::warning(this, "Error", "Could not open the file for reading"); + QMessageBox::warning(this, tr("Error"), tr("Could not open the file for reading")); } // saveFile(gameComboBox->currentText()); } diff --git a/src/qt_gui/kbm_gui.cpp b/src/qt_gui/kbm_gui.cpp index ced9a5b0c..b78a6cf75 100644 --- a/src/qt_gui/kbm_gui.cpp +++ b/src/qt_gui/kbm_gui.cpp @@ -87,15 +87,16 @@ KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* connect(ui->CopyCommonButton, &QPushButton::clicked, this, [this] { if (ui->ProfileComboBox->currentText() == "Common Config") { - QMessageBox::information(this, "Common Config Selected", - "This button copies mappings from the Common Config to the " - "currently selected profile, and cannot be used when the " - "currently selected profile is the Common Config."); + QMessageBox::information(this, tr("Common Config Selected"), + // clang-format off +tr("This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config.")); + // clang-format on } else { QMessageBox::StandardButton reply = - QMessageBox::question(this, "Copy values from Common Config", - "Do you want to overwrite existing mappings with the " - "mappings from the Common Config?", + QMessageBox::question(this, tr("Copy values from Common Config"), + // clang-format off +tr("Do you want to overwrite existing mappings with the mappings from the Common Config?"), + // clang-format on QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { SetUIValuestoMappings("default"); @@ -423,8 +424,8 @@ void KBMSettings::SaveKBMConfig(bool CloseOnSave) { // Prevent duplicate inputs for KBM as this breaks the engine for (auto it = inputs.begin(); it != inputs.end(); ++it) { if (std::find(it + 1, inputs.end(), *it) != inputs.end()) { - QMessageBox::information(this, "Unable to Save", - "Cannot bind any unique input more than once"); + QMessageBox::information(this, tr("Unable to Save"), + tr("Cannot bind any unique input more than once")); return; } } @@ -625,7 +626,7 @@ void KBMSettings::GetGameTitle() { void KBMSettings::onHelpClicked() { if (!HelpWindowOpen) { HelpWindow = new HelpDialog(&HelpWindowOpen, this); - HelpWindow->setWindowTitle("Help"); + HelpWindow->setWindowTitle(tr("Help")); HelpWindow->setAttribute(Qt::WA_DeleteOnClose); // Clean up on close HelpWindow->show(); HelpWindowOpen = true; @@ -643,7 +644,7 @@ void KBMSettings::StartTimer(QPushButton*& button) { mapping = button->text(); DisableMappingButtons(); - button->setText("Press a key [" + QString::number(MappingTimer) + "]"); + button->setText(tr("Press a key") + " [" + QString::number(MappingTimer) + "]"); timer = new QTimer(this); MappingButton = button; connect(timer, &QTimer::timeout, this, [this]() { CheckMapping(MappingButton); }); @@ -652,7 +653,7 @@ void KBMSettings::StartTimer(QPushButton*& button) { void KBMSettings::CheckMapping(QPushButton*& button) { MappingTimer -= 1; - button->setText("Press a key [" + QString::number(MappingTimer) + "]"); + button->setText(tr("Press a key") + " [" + QString::number(MappingTimer) + "]"); if (MappingCompleted) { EnableMapping = false; @@ -1003,15 +1004,15 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) { if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { SetMapping("mousewheelup"); } else { - QMessageBox::information(this, "Cannot set mapping", - "Mousewheel cannot be mapped to stick outputs"); + QMessageBox::information(this, tr("Cannot set mapping"), + tr("Mousewheel cannot be mapped to stick outputs")); } } else if (wheelEvent->angleDelta().y() < -5) { if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { SetMapping("mousewheeldown"); } else { - QMessageBox::information(this, "Cannot set mapping", - "Mousewheel cannot be mapped to stick outputs"); + QMessageBox::information(this, tr("Cannot set mapping"), + tr("Mousewheel cannot be mapped to stick outputs")); } } if (wheelEvent->angleDelta().x() > 5) { @@ -1023,8 +1024,8 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) { SetMapping("mousewheelright"); } } else { - QMessageBox::information(this, "Cannot set mapping", - "Mousewheel cannot be mapped to stick outputs"); + QMessageBox::information(this, tr("Cannot set mapping"), + tr("Mousewheel cannot be mapped to stick outputs")); } } else if (wheelEvent->angleDelta().x() < -5) { if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { @@ -1034,8 +1035,8 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) { SetMapping("mousewheelleft"); } } else { - QMessageBox::information(this, "Cannot set mapping", - "Mousewheel cannot be mapped to stick outputs"); + QMessageBox::information(this, tr("Cannot set mapping"), + tr("Mousewheel cannot be mapped to stick outputs")); } } return true; diff --git a/src/qt_gui/kbm_help_dialog.cpp b/src/qt_gui/kbm_help_dialog.cpp index 44f75f6f8..c13e18b59 100644 --- a/src/qt_gui/kbm_help_dialog.cpp +++ b/src/qt_gui/kbm_help_dialog.cpp @@ -77,11 +77,11 @@ HelpDialog::HelpDialog(bool* open_flag, QWidget* parent) : QDialog(parent) { QVBoxLayout* containerLayout = new QVBoxLayout(containerWidget); // Add expandable sections to container layout - auto* quickstartSection = new ExpandableSection("Quickstart", quickstart()); - auto* faqSection = new ExpandableSection("FAQ", faq()); - auto* syntaxSection = new ExpandableSection("Syntax", syntax()); - auto* specialSection = new ExpandableSection("Special Bindings", special()); - auto* bindingsSection = new ExpandableSection("Keybindings", bindings()); + auto* quickstartSection = new ExpandableSection(tr("Quickstart"), quickstart()); + auto* faqSection = new ExpandableSection(tr("FAQ"), faq()); + auto* syntaxSection = new ExpandableSection(tr("Syntax"), syntax()); + auto* specialSection = new ExpandableSection(tr("Special Bindings"), special()); + auto* bindingsSection = new ExpandableSection(tr("Keybindings"), bindings()); containerLayout->addWidget(quickstartSection); containerLayout->addWidget(faqSection); @@ -109,4 +109,4 @@ HelpDialog::HelpDialog(bool* open_flag, QWidget* parent) : QDialog(parent) { connect(syntaxSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); connect(specialSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); connect(bindingsSection, &ExpandableSection::expandedChanged, this, &HelpDialog::adjustSize); -} \ No newline at end of file +} diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 69f5d3c8a..bff4b8221 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -235,21 +235,6 @@ SettingsDialog::SettingsDialog(std::span physical_devices, Common::FS::GetUserPath(Common::FS::PathType::CustomTrophy)); QDesktopServices::openUrl(QUrl::fromLocalFile(userPath)); }); - - connect(ui->PortableUserButton, &QPushButton::clicked, this, []() { - QString userDir; - Common::FS::PathToQString(userDir, std::filesystem::current_path() / "user"); - if (std::filesystem::exists(std::filesystem::current_path() / "user")) { - QMessageBox::information(NULL, "Cannot create portable user folder", - userDir + " already exists"); - } else { - std::filesystem::copy(Common::FS::GetUserPath(Common::FS::PathType::UserDir), - std::filesystem::current_path() / "user", - std::filesystem::copy_options::recursive); - QMessageBox::information(NULL, "Portable user folder created", - userDir + " successfully created"); - } - }); } // Input TAB @@ -300,6 +285,21 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->currentSaveDataPath->setText(save_data_path_string); } }); + + connect(ui->PortableUserButton, &QPushButton::clicked, this, []() { + QString userDir; + Common::FS::PathToQString(userDir, std::filesystem::current_path() / "user"); + if (std::filesystem::exists(std::filesystem::current_path() / "user")) { + QMessageBox::information(NULL, tr("Cannot create portable user folder"), + tr("%1 already exists").arg(userDir)); + } else { + std::filesystem::copy(Common::FS::GetUserPath(Common::FS::PathType::UserDir), + std::filesystem::current_path() / "user", + std::filesystem::copy_options::recursive); + QMessageBox::information(NULL, tr("Portable user folder created"), + tr("%1 successfully created.").arg(userDir)); + } + }); } // DEBUG TAB From f4dc8dca8d9255f843a0f8ab0dc439c82bd79e7a Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 6 Mar 2025 16:20:22 +0200 Subject: [PATCH 397/455] [ci skip] Qt GUI: Update Translation. (#2605) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 130 +++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 8e43a9ae0..9b03ebddb 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -541,6 +541,61 @@ Override Color + + Unable to Save + + + + Cannot bind axis values more than once + + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + + + + Use Per-Game configs + + + + Error + Error + + + Could not open the file for reading + + + + Could not open the file for writing + + + + Save Changes + + + + Do you want to save changes? + + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + + + + Do you want to reset this config to your custom default config? + + + + Reset to Default + + ElfViewer @@ -884,6 +939,29 @@ + + HelpDialog + + Quickstart + + + + FAQ + + + + Syntax + + + + Special Bindings + + + + Keybindings + + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): + + Common Config Selected + + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + + Copy values from Common Config + + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + + Unable to Save + + + + Cannot bind any unique input more than once + + + + Press a key + + + + Cannot set mapping + + + + Mousewheel cannot be mapped to stick outputs + + MainWindow @@ -2022,6 +2136,22 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + + + + %1 already exists + + + + Portable user folder created + + + + %1 successfully created. + + TrophyViewer From eaa18d4e3cf70ac0e2bcf277b3ea085a209d9ef9 Mon Sep 17 00:00:00 2001 From: smiRaphi <87574679+smiRaphi@users.noreply.github.com> Date: Thu, 6 Mar 2025 15:20:55 +0100 Subject: [PATCH 398/455] load trophy from .wav (#2603) Co-authored-by: smiRaphi --- src/core/libraries/np_trophy/trophy_ui.cpp | 10 +++++++--- src/qt_gui/settings_dialog.cpp | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/core/libraries/np_trophy/trophy_ui.cpp b/src/core/libraries/np_trophy/trophy_ui.cpp index aba56f341..3c9f883b3 100644 --- a/src/core/libraries/np_trophy/trophy_ui.cpp +++ b/src/core/libraries/np_trophy/trophy_ui.cpp @@ -92,10 +92,14 @@ TrophyUI::TrophyUI(const std::filesystem::path& trophyIconPath, const std::strin AddLayer(this); #ifdef ENABLE_QT_GUI - QString musicPath = QString::fromStdString(CustomTrophy_Dir.string() + "/trophy.mp3"); - if (fs::exists(musicPath.toStdString())) { + QString musicPathWav = QString::fromStdString(CustomTrophy_Dir.string() + "/trophy.wav"); + QString musicPathMp3 = QString::fromStdString(CustomTrophy_Dir.string() + "/trophy.mp3"); + if (fs::exists(musicPathWav.toStdString())) { BackgroundMusicPlayer::getInstance().setVolume(100); - BackgroundMusicPlayer::getInstance().playMusic(musicPath, false); + BackgroundMusicPlayer::getInstance().playMusic(musicPathWav, false); + } else if (fs::exists(musicPathMp3.toStdString())) { + BackgroundMusicPlayer::getInstance().setVolume(100); + BackgroundMusicPlayer::getInstance().playMusic(musicPathMp3, false); } #endif } diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index bff4b8221..6e38bd025 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -635,7 +635,7 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { //User if (elementName == "OpenCustomTrophyLocationButton") { - text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\\nNote: The sound will only work in QT versions."); + text = tr("Open the custom trophy images/sounds folder:\\nYou can add custom images to the trophies and an audio.\\nAdd the files to custom_trophy with the following names:\\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\\nNote: The sound will only work in QT versions."); } // Input From 8b7eed3ffc9835886b088f6c1b0595948bce4c8d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 6 Mar 2025 16:21:52 +0200 Subject: [PATCH 399/455] [ci skip] Qt GUI: Update Translation. (#2607) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 9b03ebddb..924f2d6e5 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1904,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Never @@ -2152,6 +2148,10 @@ %1 successfully created. + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + + TrophyViewer From b5029ab940a7d489cdbe76796d8ebe6a4c2c8aff Mon Sep 17 00:00:00 2001 From: jarred wilson <20207921+jardon@users.noreply.github.com> Date: Fri, 7 Mar 2025 08:51:38 -0500 Subject: [PATCH 400/455] fix:[#2618] load HDR setting from GPU in GUI (#2619) --- src/qt_gui/settings_dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 6e38bd025..41caccec9 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -430,7 +430,7 @@ void SettingsDialog::LoadValuesFromConfig() { ui->vblankSpinBox->setValue(toml::find_or(data, "GPU", "vblankDivider", 1)); ui->dumpShadersCheckBox->setChecked(toml::find_or(data, "GPU", "dumpShaders", false)); ui->nullGpuCheckBox->setChecked(toml::find_or(data, "GPU", "nullGpu", false)); - ui->enableHDRCheckBox->setChecked(toml::find_or(data, "General", "allowHDR", false)); + ui->enableHDRCheckBox->setChecked(toml::find_or(data, "GPU", "allowHDR", false)); ui->playBGMCheckBox->setChecked(toml::find_or(data, "General", "playBGM", false)); ui->disableTrophycheckBox->setChecked( toml::find_or(data, "General", "isTrophyPopupDisabled", false)); From bfb8b46d7da9567110d5d82b9ae90019d8e41d2a Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 7 Mar 2025 15:52:57 +0200 Subject: [PATCH 401/455] New Crowdin updates (#2608) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Italian) * New translations en_us.ts (Russian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Russian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Arabic) --- src/qt_gui/translations/ar_SA.ts | 142 +++++++++++- src/qt_gui/translations/da_DK.ts | 138 ++++++++++- src/qt_gui/translations/de_DE.ts | 138 ++++++++++- src/qt_gui/translations/el_GR.ts | 138 ++++++++++- src/qt_gui/translations/es_ES.ts | 138 ++++++++++- src/qt_gui/translations/fa_IR.ts | 138 ++++++++++- src/qt_gui/translations/fi_FI.ts | 138 ++++++++++- src/qt_gui/translations/fr_FR.ts | 138 ++++++++++- src/qt_gui/translations/hu_HU.ts | 138 ++++++++++- src/qt_gui/translations/id_ID.ts | 138 ++++++++++- src/qt_gui/translations/it_IT.ts | 138 ++++++++++- src/qt_gui/translations/ja_JP.ts | 138 ++++++++++- src/qt_gui/translations/ko_KR.ts | 138 ++++++++++- src/qt_gui/translations/lt_LT.ts | 138 ++++++++++- src/qt_gui/translations/nb_NO.ts | 150 +++++++++++- src/qt_gui/translations/nl_NL.ts | 138 ++++++++++- src/qt_gui/translations/pl_PL.ts | 138 ++++++++++- src/qt_gui/translations/pt_BR.ts | 142 +++++++++++- src/qt_gui/translations/pt_PT.ts | 138 ++++++++++- src/qt_gui/translations/ro_RO.ts | 138 ++++++++++- src/qt_gui/translations/ru_RU.ts | 140 ++++++++++- src/qt_gui/translations/sq_AL.ts | 138 ++++++++++- src/qt_gui/translations/sv_SE.ts | 138 ++++++++++- src/qt_gui/translations/tr_TR.ts | 138 ++++++++++- src/qt_gui/translations/uk_UA.ts | 384 +++++++++++++++++++++---------- src/qt_gui/translations/vi_VN.ts | 138 ++++++++++- src/qt_gui/translations/zh_CN.ts | 138 ++++++++++- src/qt_gui/translations/zh_TW.ts | 138 ++++++++++- 28 files changed, 3886 insertions(+), 246 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 87ccf0bd9..d45af76b8 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + المساعدة + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -584,7 +639,7 @@ Directory to install DLC - Directory to install DLC + مكان تثبيت حزمات DLC @@ -603,7 +658,7 @@ Compatibility - Compatibility + التوافق Region @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never أبداً @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index c000a31d5..bc9ed1d39 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Aldrig @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index ee4ddbc15..db691b11d 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Niemals @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index e85e02eab..e09bf7192 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Ποτέ @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 4a5977239..9f7fb3721 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ Visualizador de SFO para + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Nunca @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index d7cd34d7e..f58d691ad 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never هرگز @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 5d546f91f..5e1c20d47 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Ei koskaan @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 608b5d9ae..e815c2b94 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -541,6 +541,61 @@ Override Color Remplacer la couleur + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ Visionneuse SFO pour + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Multiplicateur de vitesse (def 1,0) : + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Ouvrez le dossier des images/sons de trophée personnalisés:\nVous pouvez ajouter des images personnalisées aux trophées et un audio.\nAjouter les fichiers à custom_trophy avec les noms suivants :\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: Le son ne fonctionnera que dans les versions QT. - Never Jamais @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Dossier utilisateur portable :\nStocke les paramètres et données shadPS4 qui seront appliqués uniquement à la version shadPS4 située dans le dossier actuel. Redémarrez l'application après avoir créé le dossier utilisateur portable pour commencer à l'utiliser. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 62c327c8c..bb510a479 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Soha @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 1551c0aac..e6a8aabd9 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Tidak Pernah @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 558b6f166..2e6dcf14a 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -541,6 +541,61 @@ Override Color Sostituisci Colore + + Unable to Save + Impossibile Salvare + + + Cannot bind axis values more than once + Impossibile associare i valori degli assi più di una volta + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Modifica le associazioni di input di tastiera + mouse e controller + + + Use Per-Game configs + Usa Configurazioni Per Gioco + + + Error + Errore + + + Could not open the file for reading + Impossibile aprire il file per la lettura + + + Could not open the file for writing + Impossibile aprire il file per la scrittura + + + Save Changes + Salva Modifiche + + + Do you want to save changes? + Vuoi salvare le modifiche? + + + Help + Aiuto + + + Do you want to reset your custom default config to the original default config? + Vuoi reimpostare la configurazione predefinita personalizzata alla configurazione predefinita originale? + + + Do you want to reset this config to your custom default config? + Vuoi reimpostare questa configurazione alla configurazione predefinita personalizzata? + + + Reset to Default + Ripristina a Predefinito + ElfViewer @@ -884,6 +939,29 @@ Visualizzatore SFO per + + HelpDialog + + Quickstart + Avvio rapido + + + FAQ + FAQ + + + Syntax + Sintassi + + + Special Bindings + Associazioni Speciali + + + Keybindings + Associazioni dei pulsanti + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Moltiplicatore Di Velocità (def 1,0): + + Common Config Selected + Configurazione Comune Selezionata + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Questo pulsante copia le mappature dalla Configurazione Comune al profilo attualmente selezionato, e non può essere usato quando il profilo attualmente selezionato è Configurazione Comune. + + + Copy values from Common Config + Copia valori da Configurazione Comune + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Vuoi sovrascrivere le mappature esistenti con le mappature dalla Configurazione Comune? + + + Unable to Save + Impossibile Salvare + + + Cannot bind any unique input more than once + Non è possibile associare qualsiasi input univoco più di una volta + + + Press a key + Premi un tasto + + + Cannot set mapping + Impossibile impostare la mappatura + + + Mousewheel cannot be mapped to stick outputs + La rotella del mouse non può essere associata ai comandi della levetta analogica + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Apri la cartella personalizzata delle immagini/suoni trofei:\nÈ possibile aggiungere immagini personalizzate ai trofei e un audio.\nAggiungi i file a custom_trophy con i seguenti nomi:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNota: Il suono funzionerà solo nelle versioni QT. - Never Mai @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Cartella utente portatile:\nMemorizza le impostazioni e i dati shadPS4 che saranno applicati solo alla build shadPS4 situata nella cartella attuale. Riavviare l'applicazione dopo aver creato la cartella utente portatile per iniziare a usarla. + + Cannot create portable user folder + Impossibile creare la cartella utente portatile + + + %1 already exists + %1: esiste già + + + Portable user folder created + Cartella utente portatile creata + + + %1 successfully created. + %1 creato con successo. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Apri la cartella personalizzata delle immagini/suoni trofei:\nÈ possibile aggiungere immagini personalizzate ai trofei e un audio.\nAggiungi i file a custom_trophy con i seguenti nomi:\ntrophy.wav OPPURE trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNota: Il suono funzionerà solo nelle versioni QT. + TrophyViewer diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 2e1bbe394..981b7cf3b 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never 無効 @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 7f2bc531c..d76a16430 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Never @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index a9932cb1a..41b203e2b 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Niekada @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 0f9656189..9f71e0aa5 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -22,7 +22,7 @@ CheatsPatches Cheats / Patches for - Juks og programrettelser for + Juks og programrettelser for Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -102,7 +102,7 @@ Unable to open files.json for reading. - Kan ikke åpne files.json for lesing. + Klarte ikke åpne files.json for lesing. No patch file found for the current serial. @@ -110,11 +110,11 @@ Unable to open the file for reading. - Kan ikke åpne fila for lesing. + Klarte ikke åpne fila for lesing. Unable to open the file for writing. - Kan ikke åpne fila for skriving. + Klarte ikke åpne fila for skriving. Failed to parse XML: @@ -372,11 +372,11 @@ Unable to update compatibility data! Try again later. - Kan ikke oppdatere kompatibilitetsdata! Prøv igjen senere. + Klarte ikke oppdatere kompatibilitetsdata! Prøv igjen senere. Unable to open compatibility_data.json for writing. - Kan ikke åpne compatibility_data.json for skriving. + Klarte ikke åpne compatibility_data.json for skriving. Unknown @@ -541,6 +541,61 @@ Override Color Overstyr farge + + Unable to Save + Klarte ikke lagre + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Feil + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Lagre endringer + + + Do you want to save changes? + Vil du lagre endringene? + + + Help + Hjelp + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Tilbakestill + ElfViewer @@ -884,6 +939,29 @@ SFO-viser for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + Ofte stilte spørsmål + + + Syntax + Syntaks + + + Special Bindings + Special Bindings + + + Keybindings + Hurtigtast + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Hurtighetsmultiplikator (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Klarte ikke lagre + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Åpne mappa med tilpassede bilder og lyder for trofé:\nDu kan legge til tilpassede bilder til trofeer med en lyd.\nLegg filene til custom_trophy med følgende navn:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nMerk: Avspilling av lyden vil bare fungere med Qt versjonen. - Never Aldri @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Separat brukermappe:\n Lagrer shadPS4-innstillinger og data som kun brukes til shadPS4 programmet i gjeldende mappe. Start programmet på nytt etter opprettelsen av mappa for å ta den i bruk. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 finnes allerede + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 opprettet. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 493468bc8..8596c7e71 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Nooit @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index f29b731be..d179d2172 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -541,6 +541,61 @@ Override Color Zastąp kolor + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ Menedżer plików SFO dla + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Nigdy @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index ae5567cc9..6aefdb36e 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -541,6 +541,61 @@ Override Color Substituir a Cor + + Unable to Save + Não foi possível salvar + + + Cannot bind axis values more than once + Não é possível vincular os valores do eixo mais de uma vez + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Editar atalhos de entrada do Teclado + Mouse e do Controle + + + Use Per-Game configs + Usar configurações por jogo + + + Error + Erro + + + Could not open the file for reading + Não foi possível abrir o arquivo para leitura + + + Could not open the file for writing + Não foi possível abrir o arquivo para gravação + + + Save Changes + Salvar Alterações + + + Do you want to save changes? + Gostaria de salvar as alterações? + + + Help + Ajuda + + + Do you want to reset your custom default config to the original default config? + Você gostaria de redefinir sua configuração padrão personalizada de volta para a configuração padrão original? + + + Do you want to reset this config to your custom default config? + Você gostaria de redefinir esta configuração para a sua configuração padrão personalizada? + + + Reset to Default + Redefinir ao Padrão + ElfViewer @@ -651,7 +706,7 @@ Game does not initialize properly / crashes the emulator - Jogo não inicializa corretamente / trava o emulador + O jogo não inicializa corretamente ou trava o emulador Game boots, but only displays a blank screen @@ -884,6 +939,29 @@ Visualizador de SFO para + + HelpDialog + + Quickstart + Introdução + + + FAQ + Perguntas frequentes + + + Syntax + Sintaxe + + + Special Bindings + Atalhos Especiais + + + Keybindings + Teclas de atalho + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Multiplicador de Velocidade (Pad 1,0): + + Common Config Selected + Configuração Comum Selecionada + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Este botão copia os mapeamentos da Configuração Comum para o perfil atualmente selecionado, e não pode ser usado quando o perfil atualmente selecionado é a Configuração Comum. + + + Copy values from Common Config + Copiar valores da Configuração Comum + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Você deseja substituir os mapeamentos existentes com os mapeamentos da Configuração Comum? + + + Unable to Save + Não foi possível salvar + + + Cannot bind any unique input more than once + Não é possível vincular qualquer entrada única mais de uma vez + + + Press a key + Aperte uma tecla + + + Cannot set mapping + Não é possível definir o mapeamento + + + Mousewheel cannot be mapped to stick outputs + A rolagem do mouse não pode ser mapeada para saídas do analógico + MainWindow @@ -1488,7 +1602,7 @@ Open the custom trophy images/sounds folder - Abrir a pasta de imagens/sons de troféus personalizados + Abrir a pasta de imagens e sons de troféus personalizados Logger @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Atualizar Lista de Compatibilidade:\nAtualiza imediatamente o banco de dados de compatibilidade. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Abrir a pasta de imagens/sons de troféus personalizados:\nVocê pode adicionar imagens personalizadas aos troféus e um áudio.\nAdicione os arquivos na pasta custom_trophy com os seguintes nomes:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservação: O som funcionará apenas em versões Qt. - Never Nunca @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Pasta Portátil do Usuário:\nArmazena as configurações e dados do shadPS4 que serão aplicados apenas à compilação do shadPS4 localizada na pasta atual. Reinicie o aplicativo após criar a pasta portátil do usuário para começar a usá-la. + + Cannot create portable user folder + Não é possível criar a pasta portátil do usuário + + + %1 already exists + %1 já existe + + + Portable user folder created + Pasta portátil do usuário criada + + + %1 successfully created. + %1 criado com sucesso. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Abrir a pasta de imagens e sons de troféus personalizados:\nVocê pode adicionar imagens personalizadas aos troféus e um áudio.\nAdicione os arquivos na pasta custom_trophy com os seguintes nomes:\ntrophy.wav OU trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservação: O som funcionará apenas em versões Qt. + TrophyViewer diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 5a3a83bab..0667447e1 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -541,6 +541,61 @@ Override Color Substituir Cor + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ Visualizador SFO para + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Atualizar Base de Dados de Compatibilidade:\nAtualiza imediatamente a base de dados de compatibilidade. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Abrir a pasta de imagens/sons de troféus personalizados:\nPoderá adicionar imagens personalizadas aos troféus e um áudio.\nAdicione os ficheiros na pasta custom_trophy com os seguintes nomes:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservação: O som funcionará apenas nas versões Qt. - Never Nunca @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Pasta de utilizador portátil:\nArmazena as definições e dados do shadPS4 que serão aplicados apenas na compilação do shadPS4 localizada na pasta atual. Reinicie a aplicação após criar a pasta de utilizador portátil para começar a usá-la. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index df3eb5337..ded417640 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Niciodată @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index f20989158..ecf155dbf 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -541,6 +541,61 @@ Override Color Заменить цвет + + Unable to Save + Не удаётся сохранить + + + Cannot bind axis values more than once + Невозможно привязать значения оси более одного раза + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Редактировать бинды клавиатуры + мыши и контроллера + + + Use Per-Game configs + Использовать настройки для каждой игры + + + Error + Ошибка + + + Could not open the file for reading + Не удалось открыть файл для чтения + + + Could not open the file for writing + Не удалось открыть файл для записи + + + Save Changes + Сохранить изменения + + + Do you want to save changes? + Хотите сохранить изменения? + + + Help + Помощь + + + Do you want to reset your custom default config to the original default config? + Хотите ли вы сбросить ваш пользовательский конфиг по умолчанию к первоначальному конфигу по умолчанию? + + + Do you want to reset this config to your custom default config? + Хотите ли вы сбросить этот конфиг к вашему пользовательскому конфигу по умолчанию? + + + Reset to Default + Сбросить по умолчанию + ElfViewer @@ -884,6 +939,29 @@ Просмотр SFO для + + HelpDialog + + Quickstart + Быстрый старт + + + FAQ + ЧАВО + + + Syntax + Синтаксис + + + Special Bindings + Специальные бинды + + + Keybindings + Бинды клавиш + + InstallDirSelect @@ -1011,7 +1089,7 @@ note: click Help Button/Special Keybindings for more information - примечание: нажмите кнопку Help/Special Keybindings клавиш для получения дополнительной информации + примечание: нажмите кнопку Помощь/Специальные бинды для получения дополнительной информации Face Buttons @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Множитель скорости (по умолч 1.0) + + Common Config Selected + Выбран общий конфиг + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Эта кнопка копирует настройки из общего конфига в текущий выбранный профиль, и не может быть использован, когда выбранный профиль это общий конфиг. + + + Copy values from Common Config + Копировать значения из общего конфига + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Вы хотите перезаписать существующие настройки настройками из общего конфига? + + + Unable to Save + Не удаётся сохранить + + + Cannot bind any unique input more than once + Невозможно привязать уникальный ввод более одного раза + + + Press a key + Нажмите кнопку + + + Cannot set mapping + Не удаётся задать настройки + + + Mousewheel cannot be mapped to stick outputs + Колесо не может быть назначено для вывода стиков + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Открыть папку с пользовательскими изображениями/звуками трофеев:\nВы можете добавить пользовательские изображения к трофеям и аудио.\nДобавьте файлы в custom_trophy со следующими именами:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nПримечание: звук будет работать только в QT-версии. - Never Никогда @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Портативная папка пользователя:\nХранит настройки и данные shadPS4, которые будут применяться только к билду shadPS4, расположенному в этой папке. Перезагрузите приложение после создания портативной папки пользователя чтобы начать использовать её. + + Cannot create portable user folder + Невозможно создать папку для портативной папки пользователя + + + %1 already exists + %1 уже существует + + + Portable user folder created + Портативная папка пользователя создана + + + %1 successfully created. + %1 успешно создано. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Открыть папку с пользовательскими изображениями/звуками трофеев:\nВы можете добавить пользовательские изображения к трофеям и аудио.\nДобавьте файлы в custom_trophy со следующими именами:\ntrophy.wav ИЛИ trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nПримечание: звук будет работать только в QT-версии. + TrophyViewer diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 3bea8dc00..c371e2323 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -541,6 +541,61 @@ Override Color Zëvendëso Ngjyrën + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ Shikuesi SFO për + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Hap dosjen e imazheve/tingujve të trofeve të personalizuar:\nMund të shtosh imazhe të personalizuara për trofetë dhe një audio.\nShto skedarët në dosjen custom_trophy me emrat që vijojnë:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nShënim: Tingulli do të punojë vetëm në versionet QT. - Never Kurrë @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index a43b2da1c..8120cb403 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -541,6 +541,61 @@ Override Color Åsidosätt färg + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO-visare för + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Hastighetsmultiplikator (standard 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Öppna mappen för anpassade trofébilder/ljud:\nDu kan lägga till anpassade bilder till troféerna och ett ljud.\nLägg till filerna i custom_trophy med följande namn:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservera: Ljudet fungerar endast i QT-versioner. - Never Aldrig @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portabel användarmapp:\nLagrar shadPS4-inställningar och data som endast tillämpas på den shadPS4-version som finns i den aktuella mappen. Starta om appen efter att du har skapat den portabla användarmappen för att börja använda den. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 22fbb76c9..447cebf5f 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -541,6 +541,61 @@ Override Color Rengi Geçersiz Kıl + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Görüntüleyici: + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Uyumluluk Veritabanını Güncelle:\nUyumluluk veri tabanını hemen güncelleyin. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Asla @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 36626fefd..688cedf9d 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -407,139 +407,194 @@ ControlSettings Configure Controls - Configure Controls + Налаштування елементів керування D-Pad - D-Pad + Хрестовина Up - Up + Вгору Left - Left + Ліворуч Right - Right + Праворуч Down - Down + Вниз Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Мертва зона лівого стику (за замов.: 2, максимум: 127) Left Deadzone - Left Deadzone + Ліва мертва зона Left Stick - Left Stick + Лівий стік Config Selection - Config Selection + Вибір конфігурації Common Config - Common Config + Загальна конфігурація Use per-game configs - Use per-game configs + Використовувати ігрові конфігурації L1 / LB - L1 / LB + L1 / Лівий Бампер L2 / LT - L2 / LT + L2 / Лівий Тригер Back - Back + Назад R1 / RB - R1 / RB + R1 / Правий Бампер R2 / RT - R2 / RT + R2 / Правий Тригер L3 - L3 + Кнопка лівого стику Options / Start - Options / Start + Опції / Старт R3 - R3 + Кнопка правого стику Face Buttons - Face Buttons + Лицьові кнопки Triangle / Y - Triangle / Y + Трикутник / Y Square / X - Square / X + Квадрат / X Circle / B - Circle / B + Коло / B Cross / A - Cross / A + Хрест / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Мертва зона правого стику (за замов.: 2, максимум: 127) Right Deadzone - Right Deadzone + Права мертва зона Right Stick - Right Stick + Правий стик Color Adjustment - Color Adjustment + Налаштування Кольору R: - R: + R: G: - G: + G: B: - B: + B: Override Lightbar Color - Override Lightbar Color + Змінити колір підсвітки Override Color - Override Color + Змінити колір + + + Unable to Save + Не вдалося зберегти + + + Cannot bind axis values more than once + Неможливо пере назначити кнопку більше одного разу + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Налаштування клавіатури, миші та перевизначення кнопок контролеру + + + Use Per-Game configs + Використовувати ігрові конфігурації + + + Error + Помилка + + + Could not open the file for reading + Не вдалося відкрити файл для читання + + + Could not open the file for writing + Не вдалось відкрити файл для запису + + + Save Changes + Зберегти зміни + + + Do you want to save changes? + Бажаєте зберегти зміни? + + + Help + Допомога + + + Do you want to reset your custom default config to the original default config? + Ви бажаєте скинути ваші налаштування за замовчуванням до початкової конфігурації? + + + Do you want to reset this config to your custom default config? + Ви бажаєте скинути ці налаштування до вашої конфігурації за замовчуванням? + + + Reset to Default + Відновити налаштування за замовчанням @@ -584,7 +639,7 @@ Directory to install DLC - Directory to install DLC + Папка для встановлення DLC @@ -777,7 +832,7 @@ Delete Trophy - Delete Trophy + Видалити трофей Compatibility... @@ -833,7 +888,7 @@ DLC - DLC + DLC Delete %1 @@ -857,11 +912,11 @@ No log file found for this game! - No log file found for this game! + Файл звіту для цієї гри не знайдено! Failed to convert icon. - Failed to convert icon. + Не вдалося конвертувати значок. This game has no save data to delete! @@ -869,7 +924,7 @@ This game has no saved trophies to delete! - This game has no saved trophies to delete! + Ця гра немає збережених трофеїв для видалення! Save Data @@ -877,11 +932,34 @@ Trophy - Trophy + Трофеї SFO Viewer for - SFO Viewer for + Перегляд SFO + + + + HelpDialog + + Quickstart + Швидкий старт + + + FAQ + ЧаПи + + + Syntax + Синтаксис + + + Special Bindings + Спеціальні прив'язки + + + Keybindings + Призначення клавіш @@ -907,159 +985,195 @@ KBMSettings Configure Controls - Configure Controls + Налаштування елементів керування D-Pad - D-Pad + Хрестовина Up - Up + Вгору unmapped - unmapped + не назначено Left - Left + Ліворуч Right - Right + Праворуч Down - Down + Вниз Left Analog Halfmode - Left Analog Halfmode + Напіврежим лівого аналогового стику hold to move left stick at half-speed - hold to move left stick at half-speed + утримуйте щоб рухати лівий стик в половину швидкості Left Stick - Left Stick + Лівий стик Config Selection - Config Selection + Вибір конфігурації Common Config - Common Config + Загальна конфігурація Use per-game configs - Use per-game configs + Використовувати ігрові конфігурації L1 - L1 + L1 / Лівий Бампер L2 - L2 + L2 / Лівий Тригер Text Editor - Text Editor + Текстовий редактор Help - Help + Довідка R1 - R1 + R1 / Правий Бампер R2 - R2 + R2 / Правий Тригер L3 - L3 + Кнопка лівого стику Touchpad Click - Touchpad Click + Натискання на сенсорну панель Mouse to Joystick - Mouse to Joystick + Миша в джойстик *press F7 ingame to activate - *press F7 ingame to activate + *натисніть F7 у грі для увімкнення R3 - R3 + Кнопка правого стику Options - Options + Опції Mouse Movement Parameters - Mouse Movement Parameters + Параметри руху миші note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + замітка: натисніть кнопку Довідки/Спеціального Призначення клавіш для отримання додаткової інформації Face Buttons - Face Buttons + Лицьові кнопки Triangle - Triangle + Трикутник Square - Square + Квадрат Circle - Circle + Коло Cross - Cross + Хрест Right Analog Halfmode - Right Analog Halfmode + Напіврежим правого аналогового стику hold to move right stick at half-speed - hold to move right stick at half-speed + утримуйте щоб рухати правий стик в половину швидкості Right Stick - Right Stick + Правий стик Speed Offset (def 0.125): - Speed Offset (def 0.125): + Зміщення швидкості (замовч 0,125): Copy from Common Config - Copy from Common Config + Копіювати з Загальної конфігурації Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Зміщення мертвої зони (замовч 0,50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Модифікатор швидкості (замовч 1,0): + + + Common Config Selected + Вибрані Загальні налаштування + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Ця кнопка копіює перепризначення кнопок із Загальної конфігурації до поточного вибраного профілю, і не може бути використана, якщо поточний вибраний профіль є загальною конфігурацією. + + + Copy values from Common Config + Копіювати значення з Загальної конфігурації + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Ви бажаєте перезаписати наявні перепризначення кнопок з загальної конфігурації? + + + Unable to Save + Не вдалося зберегти + + + Cannot bind any unique input more than once + Не можна прив'язати кнопку вводу більш ніж один раз + + + Press a key + Натисніть клавішу + + + Cannot set mapping + Не вдалося встановити прив'язку + + + Mousewheel cannot be mapped to stick outputs + Коліщатко миші не можна прив'язати зі значенням стиків @@ -1338,27 +1452,27 @@ Run Game - Run Game + Запустити гру Eboot.bin file not found - Eboot.bin file not found + Файл Boot.bin не знайдено PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + Файл PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG - це патч або DLC, будь ласка, спочатку встановіть гру! Game is already running! - Game is already running! + Гра вже запущена! shadPS4 - shadPS4 + shadPS4 @@ -1381,7 +1495,7 @@ Installed - Installed + Встановлені Size @@ -1389,19 +1503,19 @@ Category - Category + Категорія Type - Type + Тип App Ver - App Ver + Версія додатку FW - FW + ПЗ Region @@ -1409,7 +1523,7 @@ Flags - Flags + Мітки Path @@ -1425,7 +1539,7 @@ Package - Package + Пакет @@ -1488,7 +1602,7 @@ Open the custom trophy images/sounds folder - Open the custom trophy images/sounds folder + Відкрити папку користувацьких зображень трофеїв/звуків Logger @@ -1568,7 +1682,7 @@ Enable HDR - Enable HDR + Увімкнути HDR Paths @@ -1656,7 +1770,7 @@ Disable Trophy Notification - Disable Trophy Notification + Вимкнути сповіщення про отримання трофею Background Image @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Ніколи @@ -1844,7 +1954,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Увімкнути HDR:\nУвімкнути HDR в іграх, які його підтримують.\nВаш монітор повинен мати колірний простір BT2020 PQ та формат swapchain RGB10A2. Game Folders:\nThe list of folders to check for installed games. @@ -1912,7 +2022,7 @@ Set the volume of the background music. - Set the volume of the background music. + Налаштування гучності фонової музики. Enable Motion Controls @@ -1944,83 +2054,103 @@ Directory to save data - Directory to save data + Папка для збереження даних Video - Video + Відео Display Mode - Display Mode + Режим відображення Windowed - Windowed + У вікні Fullscreen - Fullscreen + Повноекранний Fullscreen (Borderless) - Fullscreen (Borderless) + Повний екран (без рамок) Window Size - Window Size + Розмір вікна W: - W: + Висота: H: - H: + Ширина: Separate Log Files - Separate Log Files + Окремі файли журналу Separate Log Files:\nWrites a separate logfile for each game. - Separate Log Files:\nWrites a separate logfile for each game. + Окремі файли журналу:\nЗаписує окремий файл журналу для кожної гри. Trophy Notification Position - Trophy Notification Position + Розміщення сповіщень про трофеї Left - Left + Ліворуч Right - Right + Праворуч Top - Top + Вгорі Bottom - Bottom + Внизу Notification Duration - Notification Duration + Тривалість сповіщення Portable User Folder - Portable User Folder + Портативна папка користувача Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Створити портативну папку користувача з загальної папки Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Портативна папка користувача:\nЗберігає налаштування та дані shadPS4, які будуть застосовані лише до збірки shadPS4, розташованої у поточній теці. Перезапустіть програму після створення портативної теки користувача, щоб почати користуватися нею. + + + Cannot create portable user folder + Не вдалося створити портативну папку користувача + + + %1 already exists + %1 вже існує + + + Portable user folder created + Портативна папка користувача створена + + + %1 successfully created. + %1 успішно створено. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Відкрити папку користувацьких зображень трофеїв/звуків:\nВи можете додати користувацькі зображення до трофеїв та звук.\nДодайте файли до теки custom_trophy з такими назвами:\ntrophy.wav АБО trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nПримітка: Звук буде працювати лише у версіях ShadPS4 з графічним інтерфейсом. @@ -2031,19 +2161,19 @@ Progress - Progress + Прогрес Show Earned Trophies - Show Earned Trophies + Показати отримані трофеї Show Not Earned Trophies - Show Not Earned Trophies + Показати не отримані трофеї Show Hidden Trophies - Show Hidden Trophies + Показати приховані трофеї diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 52f63bfe6..d20c07dd9 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never Không bao giờ @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 25b394df2..fe13f4092 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -541,6 +541,61 @@ Override Color 覆盖颜色 + + Unable to Save + 无法保存 + + + Cannot bind axis values more than once + 摇杆 X/Y 轴的操作绑定不在同一直线 + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + 编辑键盘鼠标和手柄按键绑定 + + + Use Per-Game configs + 每个游戏使用单独的配置 + + + Error + 错误 + + + Could not open the file for reading + 无法打开文件进行读取 + + + Could not open the file for writing + 无法打开文件进行读取 + + + Save Changes + 保存更改 + + + Do you want to save changes? + 您要保存更改吗? + + + Help + 帮助 + + + Do you want to reset your custom default config to the original default config? + 您要将自定义默认配置重置为默认配置吗? + + + Do you want to reset this config to your custom default config? + 您想要将此配置重置为自定义默认配置吗? + + + Reset to Default + 重置为默认 + ElfViewer @@ -884,6 +939,29 @@ SFO 查看器 - + + HelpDialog + + Quickstart + 快速入门 + + + FAQ + 常见问题 + + + Syntax + 语法 + + + Special Bindings + 特殊绑定 + + + Keybindings + 按键绑定 + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): 速度系数(默认 1.0): + + Common Config Selected + 已选中通用配置 + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + 此按钮用于将通用配置中的映射复制到当前选定的配置文件,当前选定的配置文件为通用配置时无法使用。 + + + Copy values from Common Config + 从通用配置中复制配置 + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + 您想要用通用配置的映射覆盖现有映射吗? + + + Unable to Save + 无法保存 + + + Cannot bind any unique input more than once + 不能绑定重复的按键 + + + Press a key + 按下按键 + + + Cannot set mapping + 无法设置映射 + + + Mousewheel cannot be mapped to stick outputs + 鼠标滚轮无法映射到摇杆 + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. 更新兼容性数据库:\n立即更新兼容性数据库。 - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - 打开自定义奖杯图像/声音文件夹:\n您可以自定义奖杯图像和声音。\n将文件添加到 custom_trophy 文件夹中,文件名如下:\ntrophy.mp3、bronze.png、gold.png、platinum.png、silver.png。\n注意:自定义声音只能在 QT 版本中生效。 - Never 从不 @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. 本地用户文件夹:\n存储 shadPS4 设置和数据,这些设置和数据仅应用于当前运行的 shadPS4。创建本地用户文件夹后,重启应用即可开始使用。 + + Cannot create portable user folder + 无法创建本地用户文件夹 + + + %1 already exists + %1 已存在 + + + Portable user folder created + 本地用户文件夹已创建 + + + %1 successfully created. + %1 创建成功。 + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + 打开自定义奖杯图像/声音文件夹:\n您可以自定义奖杯图像和声音。\n将文件添加到 custom_trophy 文件夹中,文件名如下:\ntrophy.wav 或 trophy.mp3、bronze.png、gold.png、platinum.png、silver.png。\n注意:自定义声音只能在 QT 版本中生效。 + TrophyViewer diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 7a3caa474..311ce3ab8 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -541,6 +541,61 @@ Override Color Override Color + + Unable to Save + Unable to Save + + + Cannot bind axis values more than once + Cannot bind axis values more than once + + + + EditorDialog + + Edit Keyboard + Mouse and Controller input bindings + Edit Keyboard + Mouse and Controller input bindings + + + Use Per-Game configs + Use Per-Game configs + + + Error + Error + + + Could not open the file for reading + Could not open the file for reading + + + Could not open the file for writing + Could not open the file for writing + + + Save Changes + Save Changes + + + Do you want to save changes? + Do you want to save changes? + + + Help + Help + + + Do you want to reset your custom default config to the original default config? + Do you want to reset your custom default config to the original default config? + + + Do you want to reset this config to your custom default config? + Do you want to reset this config to your custom default config? + + + Reset to Default + Reset to Default + ElfViewer @@ -884,6 +939,29 @@ SFO Viewer for + + HelpDialog + + Quickstart + Quickstart + + + FAQ + FAQ + + + Syntax + Syntax + + + Special Bindings + Special Bindings + + + Keybindings + Keybindings + + InstallDirSelect @@ -1061,6 +1139,42 @@ Speed Multiplier (def 1.0): Speed Multiplier (def 1.0): + + Common Config Selected + Common Config Selected + + + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + + + Copy values from Common Config + Copy values from Common Config + + + Do you want to overwrite existing mappings with the mappings from the Common Config? + Do you want to overwrite existing mappings with the mappings from the Common Config? + + + Unable to Save + Unable to Save + + + Cannot bind any unique input more than once + Cannot bind any unique input more than once + + + Press a key + Press a key + + + Cannot set mapping + Cannot set mapping + + + Mousewheel cannot be mapped to stick outputs + Mousewheel cannot be mapped to stick outputs + MainWindow @@ -1790,10 +1904,6 @@ Update Compatibility Database:\nImmediately update the compatibility database. Update Compatibility Database:\nImmediately update the compatibility database. - - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Never 從不 @@ -2022,6 +2132,26 @@ Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + Cannot create portable user folder + Cannot create portable user folder + + + %1 already exists + %1 already exists + + + Portable user folder created + Portable user folder created + + + %1 successfully created. + %1 successfully created. + + + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + TrophyViewer From 6b3746f3a688cd4c7c2acfbbe8238ebd97235d37 Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Fri, 7 Mar 2025 21:42:25 +0300 Subject: [PATCH 402/455] kernel: re-implement clock_gettime (#2615) --- src/core/libraries/kernel/time.cpp | 192 +++++++++++++++++++++++++---- 1 file changed, 168 insertions(+), 24 deletions(-) diff --git a/src/core/libraries/kernel/time.cpp b/src/core/libraries/kernel/time.cpp index 508e54089..42d959885 100644 --- a/src/core/libraries/kernel/time.cpp +++ b/src/core/libraries/kernel/time.cpp @@ -5,6 +5,7 @@ #include "common/assert.h" #include "common/native_clock.h" +#include "core/libraries/kernel/kernel.h" #include "core/libraries/kernel/orbis_error.h" #include "core/libraries/kernel/time.h" #include "core/libraries/libs.h" @@ -19,6 +20,7 @@ #if __APPLE__ #include #endif +#include #include #include #include @@ -93,46 +95,188 @@ u32 PS4_SYSV_ABI sceKernelSleep(u32 seconds) { return 0; } -int PS4_SYSV_ABI sceKernelClockGettime(s32 clock_id, OrbisKernelTimespec* tp) { - if (tp == nullptr) { +#ifdef _WIN64 +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME 0 +#endif +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC 1 +#endif +#ifndef CLOCK_PROCESS_CPUTIME_ID +#define CLOCK_PROCESS_CPUTIME_ID 2 +#endif +#ifndef CLOCK_THREAD_CPUTIME_ID +#define CLOCK_THREAD_CPUTIME_ID 3 +#endif +#ifndef CLOCK_REALTIME_COARSE +#define CLOCK_REALTIME_COARSE 5 +#endif +#ifndef CLOCK_MONOTONIC_COARSE +#define CLOCK_MONOTONIC_COARSE 6 +#endif + +#define DELTA_EPOCH_IN_100NS 116444736000000000ULL + +static u64 FileTimeTo100Ns(FILETIME& ft) { + return *reinterpret_cast(&ft); +} + +static s32 clock_gettime(u32 clock_id, struct timespec* ts) { + switch (clock_id) { + case CLOCK_REALTIME: + case CLOCK_REALTIME_COARSE: { + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + const u64 ns = FileTimeTo100Ns(ft) - DELTA_EPOCH_IN_100NS; + ts->tv_sec = ns / 10'000'000; + ts->tv_nsec = (ns % 10'000'000) * 100; + return 0; + } + case CLOCK_MONOTONIC: + case CLOCK_MONOTONIC_COARSE: { + static LARGE_INTEGER pf = [] { + LARGE_INTEGER res{}; + QueryPerformanceFrequency(&pf); + return res; + }(); + + LARGE_INTEGER pc{}; + QueryPerformanceCounter(&pc); + ts->tv_sec = pc.QuadPart / pf.QuadPart; + ts->tv_nsec = ((pc.QuadPart % pf.QuadPart) * 1000'000'000) / pf.QuadPart; + return 0; + } + case CLOCK_PROCESS_CPUTIME_ID: { + FILETIME ct, et, kt, ut; + if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) { + return EFAULT; + } + const u64 ns = FileTimeTo100Ns(ut) + FileTimeTo100Ns(kt); + ts->tv_sec = ns / 10'000'000; + ts->tv_nsec = (ns % 10'000'000) * 100; + return 0; + } + case CLOCK_THREAD_CPUTIME_ID: { + FILETIME ct, et, kt, ut; + if (!GetThreadTimes(GetCurrentThread(), &ct, &et, &kt, &ut)) { + return EFAULT; + } + const u64 ns = FileTimeTo100Ns(ut) + FileTimeTo100Ns(kt); + ts->tv_sec = ns / 10'000'000; + ts->tv_nsec = (ns % 10'000'000) * 100; + return 0; + } + default: + return EINVAL; + } +} +#endif + +int PS4_SYSV_ABI orbis_clock_gettime(s32 clock_id, struct timespec* ts) { + if (ts == nullptr) { return ORBIS_KERNEL_ERROR_EFAULT; } - clockid_t pclock_id = CLOCK_REALTIME; + + clockid_t pclock_id = CLOCK_MONOTONIC; switch (clock_id) { case ORBIS_CLOCK_REALTIME: case ORBIS_CLOCK_REALTIME_PRECISE: - case ORBIS_CLOCK_REALTIME_FAST: pclock_id = CLOCK_REALTIME; break; case ORBIS_CLOCK_SECOND: + case ORBIS_CLOCK_REALTIME_FAST: +#ifndef __APPLE__ + pclock_id = CLOCK_REALTIME_COARSE; +#else + pclock_id = CLOCK_REALTIME; +#endif + break; + case ORBIS_CLOCK_UPTIME: + case ORBIS_CLOCK_UPTIME_PRECISE: case ORBIS_CLOCK_MONOTONIC: case ORBIS_CLOCK_MONOTONIC_PRECISE: - case ORBIS_CLOCK_MONOTONIC_FAST: pclock_id = CLOCK_MONOTONIC; break; - default: - LOG_ERROR(Lib_Kernel, "unsupported = {} using CLOCK_REALTIME", clock_id); + case ORBIS_CLOCK_UPTIME_FAST: + case ORBIS_CLOCK_MONOTONIC_FAST: +#ifndef __APPLE__ + pclock_id = CLOCK_MONOTONIC_COARSE; +#else + pclock_id = CLOCK_MONOTONIC; +#endif break; + case ORBIS_CLOCK_THREAD_CPUTIME_ID: + pclock_id = CLOCK_THREAD_CPUTIME_ID; + break; + case ORBIS_CLOCK_PROCTIME: { + const auto us = sceKernelGetProcessTime(); + ts->tv_sec = us / 1'000'000; + ts->tv_nsec = (us % 1'000'000) * 1000; + return 0; + } + case ORBIS_CLOCK_VIRTUAL: { +#ifdef _WIN64 + FILETIME ct, et, kt, ut; + if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) { + return EFAULT; + } + const u64 ns = FileTimeTo100Ns(ut); + ts->tv_sec = ns / 10'000'000; + ts->tv_nsec = (ns % 10'000'000) * 100; +#else + struct rusage ru; + const auto res = getrusage(RUSAGE_SELF, &ru); + if (res < 0) { + return res; + } + ts->tv_sec = ru.ru_utime.tv_sec; + ts->tv_nsec = ru.ru_utime.tv_usec * 1000; +#endif + return 0; + } + case ORBIS_CLOCK_PROF: { +#ifdef _WIN64 + FILETIME ct, et, kt, ut; + if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) { + return EFAULT; + } + const u64 ns = FileTimeTo100Ns(kt); + ts->tv_sec = ns / 10'000'000; + ts->tv_nsec = (ns % 10'000'000) * 100; +#else + struct rusage ru; + const auto res = getrusage(RUSAGE_SELF, &ru); + if (res < 0) { + return res; + } + ts->tv_sec = ru.ru_stime.tv_sec; + ts->tv_nsec = ru.ru_stime.tv_usec * 1000; +#endif + return 0; + } + case ORBIS_CLOCK_EXT_NETWORK: + case ORBIS_CLOCK_EXT_DEBUG_NETWORK: + case ORBIS_CLOCK_EXT_AD_NETWORK: + case ORBIS_CLOCK_EXT_RAW_NETWORK: + pclock_id = CLOCK_MONOTONIC; + LOG_ERROR(Lib_Kernel, "unsupported = {} using CLOCK_MONOTONIC", clock_id); + break; + default: + return EINVAL; } - time_t raw_time = time(nullptr); - - if (raw_time == (time_t)(-1)) { - return ORBIS_KERNEL_ERROR_EINVAL; - } - - tp->tv_sec = static_cast(raw_time); - tp->tv_nsec = 0; - - return ORBIS_OK; + return clock_gettime(pclock_id, ts); } -int PS4_SYSV_ABI posix_clock_gettime(s32 clock_id, OrbisKernelTimespec* time) { - int result = sceKernelClockGettime(clock_id, time); - if (result < 0) { - UNREACHABLE(); // TODO return posix error code +int PS4_SYSV_ABI sceKernelClockGettime(s32 clock_id, OrbisKernelTimespec* tp) { + struct timespec ts; + const auto res = orbis_clock_gettime(clock_id, &ts); + if (res < 0) { + return ErrnoToSceKernelError(res); } - return result; + tp->tv_sec = ts.tv_sec; + tp->tv_nsec = ts.tv_nsec; + return ORBIS_OK; } int PS4_SYSV_ABI posix_nanosleep(const OrbisKernelTimespec* rqtp, OrbisKernelTimespec* rmtp) { @@ -318,8 +462,8 @@ void RegisterTime(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("yS8U2TGCe1A", "libScePosix", 1, "libkernel", 1, 1, posix_nanosleep); LIB_FUNCTION("QBi7HCK03hw", "libkernel", 1, "libkernel", 1, 1, sceKernelClockGettime); LIB_FUNCTION("kOcnerypnQA", "libkernel", 1, "libkernel", 1, 1, sceKernelGettimezone); - LIB_FUNCTION("lLMT9vJAck0", "libkernel", 1, "libkernel", 1, 1, posix_clock_gettime); - LIB_FUNCTION("lLMT9vJAck0", "libScePosix", 1, "libkernel", 1, 1, posix_clock_gettime); + LIB_FUNCTION("lLMT9vJAck0", "libkernel", 1, "libkernel", 1, 1, orbis_clock_gettime); + LIB_FUNCTION("lLMT9vJAck0", "libScePosix", 1, "libkernel", 1, 1, orbis_clock_gettime); LIB_FUNCTION("smIj7eqzZE8", "libScePosix", 1, "libkernel", 1, 1, posix_clock_getres); LIB_FUNCTION("0NTHN1NKONI", "libkernel", 1, "libkernel", 1, 1, sceKernelConvertLocaltimeToUtc); LIB_FUNCTION("-o5uEDpN+oY", "libkernel", 1, "libkernel", 1, 1, sceKernelConvertUtcToLocaltime); From 0e315cbd8fe869e98b94f8862143ee5546cb4864 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 9 Mar 2025 08:12:05 -0500 Subject: [PATCH 403/455] sceKernelReleaseDirectMemory fix (#2623) * Fix error return on sceKernelMunmap FreeBSD docs state that len <= 0 is a EINVAL return. * Early return on ReleaseDirectMemory with len = 0 Calls to these two functions with len = 0 cause an assert in CarveDmemArea. Since there's no memory to release, an early return should be safe here. * Remove check for negative length in munmap Addresses review comment --- src/core/libraries/kernel/memory.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/memory.cpp b/src/core/libraries/kernel/memory.cpp index 82c5115f1..7b3ac5646 100644 --- a/src/core/libraries/kernel/memory.cpp +++ b/src/core/libraries/kernel/memory.cpp @@ -79,6 +79,9 @@ s32 PS4_SYSV_ABI sceKernelAllocateMainDirectMemory(size_t len, size_t alignment, } s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, size_t len) { + if (len == 0) { + return ORBIS_OK; + } LOG_INFO(Kernel_Vmm, "called start = {:#x}, len = {:#x}", start, len); auto* memory = Core::Memory::Instance(); memory->Free(start, len); @@ -86,6 +89,9 @@ s32 PS4_SYSV_ABI sceKernelCheckedReleaseDirectMemory(u64 start, size_t len) { } s32 PS4_SYSV_ABI sceKernelReleaseDirectMemory(u64 start, size_t len) { + if (len == 0) { + return ORBIS_OK; + } auto* memory = Core::Memory::Instance(); memory->Free(start, len); return ORBIS_OK; @@ -507,7 +513,7 @@ s32 PS4_SYSV_ABI sceKernelConfiguredFlexibleMemorySize(u64* sizeOut) { int PS4_SYSV_ABI sceKernelMunmap(void* addr, size_t len) { LOG_INFO(Kernel_Vmm, "addr = {}, len = {:#x}", fmt::ptr(addr), len); if (len == 0) { - return ORBIS_OK; + return ORBIS_KERNEL_ERROR_EINVAL; } auto* memory = Core::Memory::Instance(); return memory->UnmapMemory(std::bit_cast(addr), len); From aa22d80c3fb65e89d4eadbbb98a948e5cb6c361b Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 9 Mar 2025 15:12:37 +0200 Subject: [PATCH 404/455] New Crowdin updates (#2622) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Swedish) * New translations en_us.ts (Albanian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Albanian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Turkish) * New translations en_us.ts (German) * New translations en_us.ts (Turkish) * New translations en_us.ts (German) * New translations en_us.ts (French) * New translations en_us.ts (French) * New translations en_us.ts (French) --- src/qt_gui/translations/de_DE.ts | 38 ++++----- src/qt_gui/translations/fr_FR.ts | 30 +++---- src/qt_gui/translations/pt_BR.ts | 4 +- src/qt_gui/translations/sq_AL.ts | 136 +++++++++++++++---------------- src/qt_gui/translations/sv_SE.ts | 64 +++++++-------- src/qt_gui/translations/tr_TR.ts | 130 ++++++++++++++--------------- src/qt_gui/translations/zh_CN.ts | 26 +++--- 7 files changed, 214 insertions(+), 214 deletions(-) diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index db691b11d..931f93905 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -234,7 +234,7 @@ Name: - Name: + Name: Can't apply cheats before the game is started @@ -463,7 +463,7 @@ Back - Back + Zurück R1 / RB @@ -523,15 +523,15 @@ R: - R: + R: G: - G: + G: B: - B: + B: Override Lightbar Color @@ -562,7 +562,7 @@ Error - Error + Fehler Could not open the file for reading @@ -582,7 +582,7 @@ Help - Help + Hilfe Do you want to reset your custom default config to the original default config? @@ -932,7 +932,7 @@ Trophy - Trophy + Trophäe SFO Viewer for @@ -943,7 +943,7 @@ HelpDialog Quickstart - Quickstart + Schnellstart FAQ @@ -1049,7 +1049,7 @@ Help - Help + Hilfe R1 @@ -1487,7 +1487,7 @@ Name - Name + Name Serial @@ -1503,11 +1503,11 @@ Category - Category + Kategorie Type - Type + Typ App Ver @@ -1519,7 +1519,7 @@ Region - Region + Region Flags @@ -1554,7 +1554,7 @@ System - System + System Console Language @@ -2046,7 +2046,7 @@ Auto Select - Auto Select + Auto-Wählen Directory to install games @@ -2058,7 +2058,7 @@ Video - Video + Video Display Mode @@ -2102,11 +2102,11 @@ Left - Left + Links Right - Right + Rechts Top diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index e815c2b94..46ba1cfc5 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -543,50 +543,50 @@ Unable to Save - Unable to Save + Impossible de sauvegarder Cannot bind axis values more than once - Cannot bind axis values more than once + Impossible de lier les valeurs de l'axe plusieurs fois EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Modifier les raccourcis d'entrée clavier + souris et contrôleur Use Per-Game configs - Use Per-Game configs + Utiliser les configurations pour chaque jeu Error - Error + Erreur Could not open the file for reading - Could not open the file for reading + Impossible d'ouvrir le fichier pour la lecture Could not open the file for writing - Could not open the file for writing + Impossible d'ouvrir le fichier pour l'écriture Save Changes - Save Changes + Enregistrer les Modifications Do you want to save changes? - Do you want to save changes? + Voulez-vous sauvegarder les modifications? Help - Help + Aide Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Voulez-vous réinitialiser votre configuration par défaut personnalisée à la configuration par défaut d'origine ? Do you want to reset this config to your custom default config? @@ -947,7 +947,7 @@ FAQ - FAQ + FAQ Syntax @@ -1157,7 +1157,7 @@ Unable to Save - Unable to Save + Impossible de sauvegarder Cannot bind any unique input more than once @@ -1165,7 +1165,7 @@ Press a key - Press a key + Appuyez sur un bouton Cannot set mapping @@ -2150,7 +2150,7 @@ Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Ouvrez le dossier des images/sons des trophées personnalisés:\nVous pouvez ajouter des images personnalisées aux trophées et aux sons.\nAjoutez les fichiers à custom_trophy avec les noms suivants:\ntrophy.wav OU trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote : Le son ne fonctionnera que dans les versions QT. diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 6aefdb36e..8f3975cb1 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -682,7 +682,7 @@ Play Time - Tempo Jogado + Tempo de Jogo Never Played @@ -1089,7 +1089,7 @@ note: click Help Button/Special Keybindings for more information - Nota: clique no botão de Ajuda -> Special Bindings para obter mais informações + Nota: clique no botão de Ajuda e Atalhos Especiais para obter mais informações Face Buttons diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index c371e2323..412735209 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -74,7 +74,7 @@ Select Patch File: - Përzgjidh Skedarin e Arnës: + Përzgjidh skedarin e arnës: Download Patches @@ -138,7 +138,7 @@ File Exists - Skedari Ekziston + Skedari ekziston File already exists. Do you want to replace it? @@ -451,7 +451,7 @@ Use per-game configs - Përdor konfigurime për secilën lojë + Përdor konfigurime të veçanta për secilën lojë L1 / LB @@ -543,58 +543,58 @@ Unable to Save - Unable to Save + Ruajtja Dështoi Cannot bind axis values more than once - Cannot bind axis values more than once + Nuk mund të caktohen vlerat e boshtit më shumë se një herë EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Redakto caktimet e hyrjeve për Tastierën + Miun dhe Dorezën Use Per-Game configs - Use Per-Game configs + Përdor konfigurime për secilën lojë Error - Error + Gabim Could not open the file for reading - Could not open the file for reading + Skedari nuk mund të hapet për lexim Could not open the file for writing - Could not open the file for writing + Skedari nuk mund të hapet për shkrim Save Changes - Save Changes + Ruaj Ndryshimet Do you want to save changes? - Do you want to save changes? + Do të ruash ndryshimet? Help - Help + Ndihmë Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + A do ta rivendosësh konfigurimin tënd të paracaktuar të personalizuar te konfigurimi i paracaktuar origjinal? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + A do ta rivendosësh këtë konfigurim në konfigurimin tënd të paracaktuar të personalizuar? Reset to Default - Reset to Default + Rivendos në të Paracaktuarit @@ -943,23 +943,23 @@ HelpDialog Quickstart - Quickstart + Nisje e shpejtë FAQ - FAQ + Pyetje të Shpeshta Syntax - Syntax + Sintaksa Special Bindings - Special Bindings + Caktimet e Veçantë Keybindings - Keybindings + Caktimet e Tasteve @@ -1013,23 +1013,23 @@ Left Analog Halfmode - Left Analog Halfmode + Mënyra e gjysmuar për levën e majtë hold to move left stick at half-speed - hold to move left stick at half-speed + mbaj shtypur për të lëvizur levën e majtë me gjysmën e shpejtësisë Left Stick - Left Stick + Leva e Majtë Config Selection - Config Selection + Zgjedhja e Konfigurimit Common Config - Common Config + Konfigurim i Përbashkët Use per-game configs @@ -1045,7 +1045,7 @@ Text Editor - Text Editor + Redaktuesi i Tekstit Help @@ -1065,15 +1065,15 @@ Touchpad Click - Touchpad Click + Klikim i Panelit me Prekje Mouse to Joystick - Mouse to Joystick + Miu në Levë *press F7 ingame to activate - *press F7 ingame to activate + *shtyp F7 gjatë lojës për ta aktivizuar R3 @@ -1081,99 +1081,99 @@ Options - Options + Rregullime Mouse Movement Parameters - Mouse Movement Parameters + Parametrat e Lëvizjes së Miut note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + shënim: kliko Butonin e Ndihmës/Caktimet e Tasteve të Veçantë për më shumë informacion Face Buttons - Face Buttons + Butonat Kryesore Triangle - Triangle + Trekëndësh Square - Square + Katror Circle - Circle + Rreth Cross - Cross + Kryq Right Analog Halfmode - Right Analog Halfmode + Mënyra e gjysmuar për levën e djathtë hold to move right stick at half-speed - hold to move right stick at half-speed + mbaj shtypur për të lëvizur levën e djathtë me gjysmën e shpejtësisë Right Stick - Right Stick + Leva e Djathtë Speed Offset (def 0.125): - Speed Offset (def 0.125): + Ofset i Shpejtësisë (paracaktuar 0.125): Copy from Common Config - Copy from Common Config + Kopjo nga Konfigurimi i Përbashkët Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Ofseti i Zonës së Vdekur (paracaktuar 0.50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Shumëzuesi i Shpejtësisë (paracaktuar 1.0): Common Config Selected - Common Config Selected + Konfigurimi i Përbashkët i Zgjedhur This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Ky buton kopjon caktimet nga Konfigurimi i Përbashkët në profilin e zgjedhur aktualisht, dhe nuk mund të përdoret kur profili i zgjedhur aktualisht është Konfigurimi i Përbashkët. Copy values from Common Config - Copy values from Common Config + Kopjo vlerat nga Konfigurimi i Përbashkët Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + A dëshiron të mbishkruash caktimet ekzistuese me ato nga Konfigurimi i Përbashkët? Unable to Save - Unable to Save + Ruajtja Dështoi Cannot bind any unique input more than once - Cannot bind any unique input more than once + Asnjë hyrje unike nuk mund të caktohet më shumë se një herë Press a key - Press a key + Shtyp një tast Cannot set mapping - Cannot set mapping + Caktimi nuk u vendos dot Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Rrota e miut nuk mund të caktohet për daljet e levës @@ -1674,7 +1674,7 @@ Enable Shaders Dumping - Aktivizo Zbrazjen e Shaders-ave + Aktivizo Zbrazjen e Shader-ave Enable NULL GPU @@ -1750,7 +1750,7 @@ Always Show Changelog - Shfaq gjithmonë regjistrin e ndryshimeve + Shfaq gjithmonë ditarin e ndryshimeve Update Channel @@ -1890,7 +1890,7 @@ Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. - Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të tastierës prekëse do të imitojë një prekje butoni mbrapa. + Sjellja e butonit mbrapa:\nLejon të përcaktohet se në cilën pjesë të panelit me prekje të dorezës do të imitojë një prekje butoni mbrapa. Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. @@ -1918,15 +1918,15 @@ Touchpad Left - Tastiera prekëse majtas + Paneli me Prekje Majtas Touchpad Right - Tastiera prekëse djathtas + Paneli me Prekje Djathtas Touchpad Center - Tastiera prekëse në qendër + Paneli me Prekje në Qendër None @@ -2122,35 +2122,35 @@ Portable User Folder - Portable User Folder + Dosja Portative e Përdoruesit Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Krijo Dosje Portative të Përdoruesit nga Dosja e Përbashkët e Përdoruesit Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Dosja portative e përdoruesit:\nRuan cilësimet dhe të dhënat të shadPS4 që do të zbatohen vetëm për konstruktin e shadPS4 të vendosur në dosjen aktuale. Rinis aplikacionin pasi të krijosh dosjen portative te përdoruesit për ta përdorur. Cannot create portable user folder - Cannot create portable user folder + Dosja portative e përdoruesit nuk u krijua dot %1 already exists - %1 already exists + %1 tashmë ekziston Portable user folder created - Portable user folder created + Dosja portative e përdoruesit u krijua %1 successfully created. - %1 successfully created. + %1 u krijua me sukses. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Hap dosjen e imazheve/tingujve të trofeve të personalizuar:\nMund të shtosh imazhe të personalizuara për trofetë dhe një audio.\nShto skedarët në dosjen custom_trophy me emrat që vijojnë:\ntrophy.wav ose trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nShënim: Tingulli do të punojë vetëm në versionet QT. diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 8120cb403..eb453b4d9 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -543,58 +543,58 @@ Unable to Save - Unable to Save + Kunde inte spara Cannot bind axis values more than once - Cannot bind axis values more than once + Kan inte binda axelvärden fler än en gång EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Redigera inmatningsbindningar för tangentbord + mus och kontroller Use Per-Game configs - Use Per-Game configs + Använd konfigurationer per-spel Error - Error + Fel Could not open the file for reading - Could not open the file for reading + Kunde inte öppna filen för läsning Could not open the file for writing - Could not open the file for writing + Kunde inte öppna filen för skrivning Save Changes - Save Changes + Spara ändringar Do you want to save changes? - Do you want to save changes? + Vill du spara ändringarna? Help - Help + Hjälp Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Vill du återställa din anpassade standardkonfiguration till ursprungliga standardkonfigurationen? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Vill du återställa denna konfiguration till din anpassade standardkonfiguration? Reset to Default - Reset to Default + Återställ till standard @@ -943,23 +943,23 @@ HelpDialog Quickstart - Quickstart + Snabbstart FAQ - FAQ + Frågor och svar Syntax - Syntax + Syntax Special Bindings - Special Bindings + Speciella bindningar Keybindings - Keybindings + Tangentbindningar @@ -1141,39 +1141,39 @@ Common Config Selected - Common Config Selected + Gemensam konfiguration valdes This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Den här knappen kopierar mappningar från gemensam konfiguration till den aktuella valda profilen och kan inte användas när den aktuella valda profilen är gemensam konfiguration. Copy values from Common Config - Copy values from Common Config + Kopiera värden från gemensam konfiguration Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Vill du skriva över befintliga mappningar med mappningarna från gemensam konfiguration? Unable to Save - Unable to Save + Kunde inte spara Cannot bind any unique input more than once - Cannot bind any unique input more than once + Kan inte binda någon unik inmatning fler än en gång Press a key - Press a key + Tryck på en tangent Cannot set mapping - Cannot set mapping + Kan inte ställa in mappning Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Mushjulet kan inte mappas till spakutmatningar @@ -2134,23 +2134,23 @@ Cannot create portable user folder - Cannot create portable user folder + Kan inte skapa portabel användarmapp %1 already exists - %1 already exists + %1 finns redan Portable user folder created - Portable user folder created + Portabel användarmapp skapad %1 successfully created. - %1 successfully created. + %1 skapades. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Öppna mappen för anpassade trofébilder/ljud:\nDu kan lägga till egna bilder till troféerna och ett ljud.\nLägg till filerna i custom_trophy med följande namn:\ntrophy.wav ELLER trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservera: Ljudet fungerar endast i QT-versioner. diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 447cebf5f..095c73c7b 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -313,7 +313,7 @@ Update - Güncelle + Güncelleme No @@ -431,7 +431,7 @@ Left Stick Deadzone (def:2 max:127) - Sol Analog Ölü Bölgesi (şu an:2, en çok:127) + Sol Analog Ölü Bölgesi (varsayılan: 2, en çok: 127) Left Deadzone @@ -447,7 +447,7 @@ Common Config - Genel Yapılandırma + Ortak Yapılandırma Use per-game configs @@ -507,7 +507,7 @@ Right Stick Deadzone (def:2, max:127) - Sağ Analog Ölü Bölgesi (şu an:2, en çok:127) + Sağ Analog Ölü Bölgesi (varsayılan: 2, en çok: 127) Right Deadzone @@ -543,11 +543,11 @@ Unable to Save - Unable to Save + Kaydedilemedi Cannot bind axis values more than once - Cannot bind axis values more than once + Eksen değerleri birden fazla kez bağlanamaz @@ -558,43 +558,43 @@ Use Per-Game configs - Use Per-Game configs + Oyuna özel yapılandırma kullan Error - Error + Hata Could not open the file for reading - Could not open the file for reading + Dosya okumak için açılamadı Could not open the file for writing - Could not open the file for writing + Dosya yazmak için açılamadı Save Changes - Save Changes + Değişiklikleri Kaydet Do you want to save changes? - Do you want to save changes? + Değişiklikleri kaydetmek istiyor musunuz? Help - Help + Yardım Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Özel varsayılan yapılandırmanızı, orijinal varsayılan yapılandırmaya sıfırlamak istiyor musunuz? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Bu yapılandırmayı özel varsayılan yapılandırmanıza sıfırlamak istiyor musunuz? Reset to Default - Reset to Default + Varsayılanlara Sıfırla @@ -639,7 +639,7 @@ Directory to install DLC - İndirilebilir içeriğin yükleneceği dizin + DLC'lerin yükleneceği dizin @@ -828,7 +828,7 @@ Delete DLC - İndirilebilir İçeriği Sil + DLC'yi Sil Delete Trophy @@ -884,11 +884,11 @@ This game has no DLC to delete! - Bu oyunun silinecek indirilebilir içeriği yok! + Bu oyunun silinecek DLC'si yok! DLC - İndirilebilir İçerik + DLC Delete %1 @@ -912,7 +912,7 @@ No log file found for this game! - No log file found for this game! + Bu oyun için günlük dosyası bulunamadı! Failed to convert icon. @@ -943,23 +943,23 @@ HelpDialog Quickstart - Quickstart + Hızlı Başlangıç FAQ - FAQ + SSS Syntax - Syntax + Sözdizimi Special Bindings - Special Bindings + Özel Atamalar Keybindings - Keybindings + Tuş Atamaları @@ -997,7 +997,7 @@ unmapped - unmapped + atanmamış Left @@ -1013,11 +1013,11 @@ Left Analog Halfmode - Left Analog Halfmode + Sol Analog Yarı Modu hold to move left stick at half-speed - hold to move left stick at half-speed + sol analogu yarı hızda hareket ettirmek için basılı tutun Left Stick @@ -1029,7 +1029,7 @@ Common Config - Genel Yapılandırma + Ortak Yapılandırma Use per-game configs @@ -1065,15 +1065,15 @@ Touchpad Click - Touchpad Click + Dokunmatik Yüzey Tıklaması Mouse to Joystick - Mouse to Joystick + Mouse'dan Kontrolcü *press F7 ingame to activate - *press F7 ingame to activate + *Etkinleştirmek için oyundayken F7'ye basın R3 @@ -1089,7 +1089,7 @@ note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + Not: Daha fazla bilgi için Yardım ya da Özel Atamalar'a tıklayın Face Buttons @@ -1113,11 +1113,11 @@ Right Analog Halfmode - Right Analog Halfmode + Sağ Analog Yarı Modu hold to move right stick at half-speed - hold to move right stick at half-speed + sağ analogu yarı hızda hareket ettirmek için basılı tutun Right Stick @@ -1129,7 +1129,7 @@ Copy from Common Config - Genel Yapılandırmadan Kopyala + Ortak Yapılandırmadan Kopyala Deadzone Offset (def 0.50): @@ -1137,11 +1137,11 @@ Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Hız Çarpanı (varsayılan 1.0): Common Config Selected - Common Config Selected + Ortak Yapılandırma Seçildi This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. @@ -1149,38 +1149,38 @@ Copy values from Common Config - Copy values from Common Config + Ortak Yapılandırmadan Değerleri Kopyala Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Mevcut atamaların üzerine ortak yapılandırmadaki atamaları yazmak istiyor musunuz? Unable to Save - Unable to Save + Kaydedilemedi Cannot bind any unique input more than once - Cannot bind any unique input more than once + Herhangi bir benzersiz girdi birden fazla kez bağlanamaz Press a key - Press a key + Bir tuşa basın Cannot set mapping - Cannot set mapping + Atama ayarlanamıyor Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Mouse tekerleği analog çıkışlarına atanamaz MainWindow Open/Add Elf Folder - Elf Klasörünü Aç/Ekle + Elf Klasörü Aç/Ekle Install Packages (PKG) @@ -1236,11 +1236,11 @@ Tiny - Küçük + Minik Small - Ufak + Küçük Medium @@ -1464,7 +1464,7 @@ PKG is a patch or DLC, please install the game first! - PKG bir yama ya da indirilebilir içerik, lütfen önce oyunu yükleyin! + PKG bir yama ya da DLC, lütfen önce oyunu yükleyin! Game is already running! @@ -1678,11 +1678,11 @@ Enable NULL GPU - NULL GPU'yu Etkinleştir + NULL GPU'yu Etkinleştir Enable HDR - HDR'yi Etkinleştir + HDR Paths @@ -1826,7 +1826,7 @@ Point your mouse at an option to display its description. - Seçenek üzerinde farenizi tutarak açıklamasını görüntüleyin. + Açıklamasını görüntülemek için mouse'unuzu bir seçeneğin üzerine getirin. Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. @@ -1886,7 +1886,7 @@ Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Hareket etmeden sonra imlecin kaybolacağı süreyi ayarlayın. + İmleç İçin Hareketsizlik Zaman Aşımı:\nBoşta kalan imlecin kendini kaç saniye sonra gizleyeceğidir. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. @@ -1990,7 +1990,7 @@ Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Çökme Tanılamaları:\nÇökme anındaki Vulkan durumu hakkında bilgi içeren bir .yaml dosyası oluşturur.\n'Cihaz kayıp' hatalarını ayıklamak için kullanışlıdır. Bunu etkinleştirdiyseniz, Ana Bilgisayar ve Konuk Hata Ayıklama İşaretleyicileri'ni etkinleştirmelisiniz.\nIntel GPU'lar üzerinde çalışmaz.\nÇalışabilmesi için Vulkan Doğrulama Katmanları'nın etkinleştirilmesine ve Vulkan SDK'sine ihtiyacınız vardır. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. @@ -2110,11 +2110,11 @@ Top - Top + Üst Bottom - Bottom + Alt Notification Duration @@ -2122,35 +2122,35 @@ Portable User Folder - Portable User Folder + Taşınabilir Kullanıcı Klasörü Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Ortak Kullanıcı Klasöründen Taşınabilir Kullanıcı Klasörü Oluştur Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Taşınabilir kullanıcı klasörü:\nYalnızca geçerli klasörde bulunan shadPS4 derlemesine uygulanacak shadPS4 ayarlarını ve verilerini depolar. Kullanmaya başlamak için taşınabilir kullanıcı klasörünü oluşturduktan sonra uygulamayı yeniden başlatın. Cannot create portable user folder - Cannot create portable user folder + Taşınabilir kullanıcı klasörü oluşturulamıyor %1 already exists - %1 already exists + %1 zaten mevcut Portable user folder created - Portable user folder created + Taşınabilir kullanıcı klasörü oluşturuldu %1 successfully created. - %1 successfully created. + %1 başarıyla oluşturuldu. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Özel kupa görüntüleri/sesleri klasörünü aç:\nKupalara özel görüntüler ve sesler ekleyebilirsiniz.\nDosyaları aşağıdaki adlarla custom_trophy'ye ekleyin:\ntrophy.wav ya da trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNot: Ses yalnızca QT sürümlerinde çalışacaktır. diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index fe13f4092..f761fe8c4 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -411,7 +411,7 @@ D-Pad - D-Pad + 十字键 Up @@ -487,23 +487,23 @@ Face Buttons - 正面按钮 + 功能键(动作键) Triangle / Y - Triangle / Y + 三角 / Y Square / X - Square / X + 方框 / X Circle / B - Circle / B + 圈 / B Cross / A - Cross / A + 叉 / A Right Stick Deadzone (def:2, max:127) @@ -989,7 +989,7 @@ D-Pad - D-Pad + 十字键 Up @@ -1081,7 +1081,7 @@ Options - Options + 选项设置 Mouse Movement Parameters @@ -1093,23 +1093,23 @@ Face Buttons - 正面按钮 + 功能键(动作键) Triangle - Triangle + 三角 Square - Square + 方框 Circle - Circle + Cross - Cross + Right Analog Halfmode From 74c2c6c74ffdacd23bfc07b323e8f7f238eeee59 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Sun, 9 Mar 2025 21:13:14 +0800 Subject: [PATCH 405/455] Make button bar translatable in controller/KBM dialog (#2625) --- src/qt_gui/control_settings.cpp | 5 +++++ src/qt_gui/kbm_gui.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/qt_gui/control_settings.cpp b/src/qt_gui/control_settings.cpp index 885e36680..4206e45b8 100644 --- a/src/qt_gui/control_settings.cpp +++ b/src/qt_gui/control_settings.cpp @@ -28,6 +28,11 @@ ControlSettings::ControlSettings(std::shared_ptr game_info_get, Q } }); + ui->buttonBox->button(QDialogButtonBox::Save)->setText(tr("Save")); + ui->buttonBox->button(QDialogButtonBox::Apply)->setText(tr("Apply")); + ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)->setText(tr("Restore Defaults")); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QWidget::close); connect(ui->ProfileComboBox, &QComboBox::currentTextChanged, this, [this] { diff --git a/src/qt_gui/kbm_gui.cpp b/src/qt_gui/kbm_gui.cpp index b78a6cf75..c148884e9 100644 --- a/src/qt_gui/kbm_gui.cpp +++ b/src/qt_gui/kbm_gui.cpp @@ -63,6 +63,11 @@ KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* } }); + ui->buttonBox->button(QDialogButtonBox::Save)->setText(tr("Save")); + ui->buttonBox->button(QDialogButtonBox::Apply)->setText(tr("Apply")); + ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)->setText(tr("Restore Defaults")); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + connect(ui->HelpButton, &QPushButton::clicked, this, &KBMSettings::onHelpClicked); connect(ui->TextEditorButton, &QPushButton::clicked, this, [this]() { auto kbmWindow = new EditorDialog(this); From 20ea0ee1909de7355491c562f05fb19e91d936b2 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 9 Mar 2025 16:17:33 -0500 Subject: [PATCH 406/455] Handle error behavior in sceSysmoduleGetModuleInfoForUnwind stub (#2629) * Stubby implementation of sceSysmoduleGetModuleInfoForUnwind * Update sysmodule.cpp * Minor cleanup --- src/core/libraries/kernel/process.cpp | 14 +------------- src/core/libraries/kernel/process.h | 15 +++++++++++++++ src/core/libraries/system/sysmodule.cpp | 8 ++++++-- src/core/libraries/system/sysmodule.h | 2 +- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index 58628867a..cb61bbda9 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -85,19 +85,7 @@ s32 PS4_SYSV_ABI sceKernelDlsym(s32 handle, const char* symbol, void** addrp) { return ORBIS_OK; } -static constexpr size_t ORBIS_DBG_MAX_NAME_LENGTH = 256; - -struct OrbisModuleInfoForUnwind { - u64 st_size; - std::array name; - VAddr eh_frame_hdr_addr; - VAddr eh_frame_addr; - u64 eh_frame_size; - VAddr seg0_addr; - u64 seg0_size; -}; - -s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, int flags, +s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags, OrbisModuleInfoForUnwind* info) { if (flags >= 3) { std::memset(info, 0, sizeof(OrbisModuleInfoForUnwind)); diff --git a/src/core/libraries/kernel/process.h b/src/core/libraries/kernel/process.h index 0340a9793..09e4276fb 100644 --- a/src/core/libraries/kernel/process.h +++ b/src/core/libraries/kernel/process.h @@ -11,10 +11,25 @@ class SymbolsResolver; namespace Libraries::Kernel { +static constexpr size_t ORBIS_DBG_MAX_NAME_LENGTH = 256; + +struct OrbisModuleInfoForUnwind { + u64 st_size; + std::array name; + VAddr eh_frame_hdr_addr; + VAddr eh_frame_addr; + u64 eh_frame_size; + VAddr seg0_addr; + u64 seg0_size; +}; + int PS4_SYSV_ABI sceKernelIsNeoMode(); int PS4_SYSV_ABI sceKernelGetCompiledSdkVersion(int* ver); +s32 PS4_SYSV_ABI sceKernelGetModuleInfoForUnwind(VAddr addr, s32 flags, + OrbisModuleInfoForUnwind* info); + void RegisterProcess(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::Kernel diff --git a/src/core/libraries/system/sysmodule.cpp b/src/core/libraries/system/sysmodule.cpp index 350f1317b..6c73764f2 100644 --- a/src/core/libraries/system/sysmodule.cpp +++ b/src/core/libraries/system/sysmodule.cpp @@ -7,6 +7,7 @@ #include "common/logging/log.h" #include "core/libraries/error_codes.h" +#include "core/libraries/kernel/process.h" #include "core/libraries/libs.h" #include "core/libraries/system/sysmodule.h" #include "core/libraries/system/system_error.h" @@ -18,9 +19,12 @@ int PS4_SYSV_ABI sceSysmoduleGetModuleHandleInternal() { return ORBIS_OK; } -int PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind() { +s32 PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind(VAddr addr, s32 flags, void* info) { LOG_ERROR(Lib_SysModule, "(STUBBED) called"); - return ORBIS_OK; + Kernel::OrbisModuleInfoForUnwind module_info; + module_info.st_size = 0x130; + s32 res = Kernel::sceKernelGetModuleInfoForUnwind(addr, flags, &module_info); + return res; } int PS4_SYSV_ABI sceSysmoduleIsCalledFromSysModule() { diff --git a/src/core/libraries/system/sysmodule.h b/src/core/libraries/system/sysmodule.h index 3630fb58e..dfbdca162 100644 --- a/src/core/libraries/system/sysmodule.h +++ b/src/core/libraries/system/sysmodule.h @@ -152,7 +152,7 @@ enum class OrbisSysModuleInternal : u32 { }; int PS4_SYSV_ABI sceSysmoduleGetModuleHandleInternal(); -int PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind(); +s32 PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind(VAddr addr, s32 flags, void* info); int PS4_SYSV_ABI sceSysmoduleIsCalledFromSysModule(); int PS4_SYSV_ABI sceSysmoduleIsCameraPreloaded(); int PS4_SYSV_ABI sceSysmoduleIsLoaded(OrbisSysModule id); From a711f4d86eb760047fa9183dc501a91d255c0e62 Mon Sep 17 00:00:00 2001 From: panzone91 <150828896+panzone91@users.noreply.github.com> Date: Sun, 9 Mar 2025 22:44:17 +0100 Subject: [PATCH 407/455] libkernel: improve module finding in sceKernelLoadStartModule (#2541) * libkernel: improve module finding in sceKernelLoadStartModule * clang-format * asserts for system module * fixes * linting * cleaning * fix linker impl --- src/core/libraries/kernel/process.cpp | 45 ++++++++++----------------- src/core/linker.cpp | 29 +++++++++++++++++ src/core/linker.h | 2 ++ src/core/module.cpp | 2 +- src/core/module.h | 2 +- 5 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index cb61bbda9..ed833068c 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -32,44 +32,33 @@ void* PS4_SYSV_ABI sceKernelGetProcParam() { return linker->GetProcParam(); } -s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, size_t args, const void* argp, +s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, u64 args, const void* argp, u32 flags, const void* pOpt, int* pRes) { LOG_INFO(Lib_Kernel, "called filename = {}, args = {}", moduleFileName, args); - - if (flags != 0) { - return ORBIS_KERNEL_ERROR_EINVAL; - } + ASSERT(flags == 0); auto* mnt = Common::Singleton::Instance(); - const auto path = mnt->GetHostPath(moduleFileName); - - // Load PRX module and relocate any modules that import it. auto* linker = Common::Singleton::Instance(); - u32 handle = linker->FindByName(path); - if (handle != -1) { + + std::filesystem::path path; + std::string guest_path(moduleFileName); + + const bool is_root = guest_path[0] == '/'; + if (is_root || guest_path.contains('/')) { + path = mnt->GetHostPath(guest_path); + } else if (!guest_path.contains('/')) { + path = mnt->GetHostPath("/app0/" + guest_path); + } + + if (const s32 handle = linker->LoadAndStartModule(path, args, argp, pRes); handle != -1) { return handle; } - handle = linker->LoadModule(path, true); - if (handle == -1) { - return ORBIS_KERNEL_ERROR_ESRCH; - } - auto* module = linker->GetModule(handle); - linker->RelocateAnyImports(module); - // If the new module has a TLS image, trigger its load when TlsGetAddr is called. - if (module->tls.image_size != 0) { - linker->AdvanceGenerationCounter(); + if (is_root) { + UNREACHABLE(); } - // Retrieve and verify proc param according to libkernel. - u64* param = module->GetProcParam(); - ASSERT_MSG(!param || param[0] >= 0x18, "Invalid module param size: {}", param[0]); - s32 ret = module->Start(args, argp, param); - if (pRes) { - *pRes = ret; - } - - return handle; + return ORBIS_KERNEL_ERROR_ENOENT; } s32 PS4_SYSV_ABI sceKernelDlsym(s32 handle, const char* symbol, void** addrp) { diff --git a/src/core/linker.cpp b/src/core/linker.cpp index 2461edcb2..18ae62f4b 100644 --- a/src/core/linker.cpp +++ b/src/core/linker.cpp @@ -139,6 +139,35 @@ s32 Linker::LoadModule(const std::filesystem::path& elf_name, bool is_dynamic) { return m_modules.size() - 1; } +s32 Linker::LoadAndStartModule(const std::filesystem::path& path, u64 args, const void* argp, + int* pRes) { + u32 handle = FindByName(path); + if (handle != -1) { + return handle; + } + handle = LoadModule(path, true); + if (handle == -1) { + return -1; + } + auto* module = GetModule(handle); + RelocateAnyImports(module); + + // If the new module has a TLS image, trigger its load when TlsGetAddr is called. + if (module->tls.image_size != 0) { + AdvanceGenerationCounter(); + } + + // Retrieve and verify proc param according to libkernel. + u64* param = module->GetProcParam(); + ASSERT_MSG(!param || param[0] >= 0x18, "Invalid module param size: {}", param[0]); + s32 ret = module->Start(args, argp, param); + if (pRes) { + *pRes = ret; + } + + return handle; +} + Module* Linker::FindByAddress(VAddr address) { for (auto& module : m_modules) { const VAddr base = module->GetBaseAddress(); diff --git a/src/core/linker.h b/src/core/linker.h index 9c07400c4..63dfc37e8 100644 --- a/src/core/linker.h +++ b/src/core/linker.h @@ -144,6 +144,8 @@ public: void FreeTlsForNonPrimaryThread(void* pointer); s32 LoadModule(const std::filesystem::path& elf_name, bool is_dynamic = false); + s32 LoadAndStartModule(const std::filesystem::path& path, u64 args, const void* argp, + int* pRes); Module* FindByAddress(VAddr address); void Relocate(Module* module); diff --git a/src/core/module.cpp b/src/core/module.cpp index 70afb932c..a18c1141a 100644 --- a/src/core/module.cpp +++ b/src/core/module.cpp @@ -94,7 +94,7 @@ Module::Module(Core::MemoryManager* memory_, const std::filesystem::path& file_, Module::~Module() = default; -s32 Module::Start(size_t args, const void* argp, void* param) { +s32 Module::Start(u64 args, const void* argp, void* param) { LOG_INFO(Core_Linker, "Module started : {}", name); const VAddr addr = dynamic_info.init_virtual_addr + GetBaseAddress(); return ExecuteGuest(reinterpret_cast(addr), args, argp, param); diff --git a/src/core/module.h b/src/core/module.h index 630c5d583..320680485 100644 --- a/src/core/module.h +++ b/src/core/module.h @@ -203,7 +203,7 @@ public: return (rela_bits[index >> 3] >> (index & 7)) & 1; } - s32 Start(size_t args, const void* argp, void* param); + s32 Start(u64 args, const void* argp, void* param); void LoadModuleToMemory(u32& max_tls_index); void LoadDynamicInfo(); void LoadSymbols(); From 46b1bafa1741d14e6c9c8aefe379c62f1d8e4477 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 10 Mar 2025 11:11:59 +0200 Subject: [PATCH 408/455] [ci skip] Qt GUI: Update Translation. (#2636) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 924f2d6e5..9c9d56076 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow From 8bcdd9c068f262f03de3e5e5d264081834af7947 Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Mon, 10 Mar 2025 12:12:12 +0300 Subject: [PATCH 409/455] Fix sceKernelLoadStartModule (#2635) --- src/core/libraries/kernel/process.cpp | 35 ++++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/core/libraries/kernel/process.cpp b/src/core/libraries/kernel/process.cpp index ed833068c..d61ee37ac 100644 --- a/src/core/libraries/kernel/process.cpp +++ b/src/core/libraries/kernel/process.cpp @@ -43,19 +43,30 @@ s32 PS4_SYSV_ABI sceKernelLoadStartModule(const char* moduleFileName, u64 args, std::filesystem::path path; std::string guest_path(moduleFileName); - const bool is_root = guest_path[0] == '/'; - if (is_root || guest_path.contains('/')) { + s32 handle = -1; + + if (guest_path[0] == '/') { + // try load /system/common/lib/ +path + // try load /system/priv/lib/ +path path = mnt->GetHostPath(guest_path); - } else if (!guest_path.contains('/')) { - path = mnt->GetHostPath("/app0/" + guest_path); - } - - if (const s32 handle = linker->LoadAndStartModule(path, args, argp, pRes); handle != -1) { - return handle; - } - - if (is_root) { - UNREACHABLE(); + handle = linker->LoadAndStartModule(path, args, argp, pRes); + if (handle != -1) + return handle; + } else { + if (!guest_path.contains('/')) { + path = mnt->GetHostPath("/app0/" + guest_path); + handle = linker->LoadAndStartModule(path, args, argp, pRes); + if (handle != -1) + return handle; + // if ((flags & 0x10000) != 0) + // try load /system/priv/lib/ +basename + // try load /system/common/lib/ +basename + } else { + path = mnt->GetHostPath(guest_path); + handle = linker->LoadAndStartModule(path, args, argp, pRes); + if (handle != -1) + return handle; + } } return ORBIS_KERNEL_ERROR_ENOENT; From ba1eb298dec48f88431068390232e3978ae07bda Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 10 Mar 2025 11:12:29 +0200 Subject: [PATCH 410/455] New Crowdin updates (#2631) * New translations en_us.ts (French) * New translations en_us.ts (Spanish) * New translations en_us.ts (Polish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Albanian) --- src/qt_gui/translations/es_ES.ts | 16 +++++++-------- src/qt_gui/translations/fr_FR.ts | 34 ++++++++++++++++---------------- src/qt_gui/translations/pl_PL.ts | 10 +++++----- src/qt_gui/translations/sq_AL.ts | 2 +- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 9f7fb3721..a727792ba 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -594,7 +594,7 @@ Reset to Default - Reset to Default + Resetear A Valores Originales @@ -1037,11 +1037,11 @@ L1 - L1 + L1 L2 - L2 + L2 Text Editor @@ -1053,23 +1053,23 @@ R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Clic de pantalla táctil Mouse to Joystick - Mouse to Joystick + Ratón A Joystick *press F7 ingame to activate diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 46ba1cfc5..75a770c09 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -590,11 +590,11 @@ Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Voulez-vous réinitialiser cette configuration à votre configuration personnalisée par défaut ? Reset to Default - Reset to Default + Rétablir par défaut @@ -943,7 +943,7 @@ HelpDialog Quickstart - Quickstart + Démarrage rapide FAQ @@ -951,15 +951,15 @@ Syntax - Syntax + Syntaxe Special Bindings - Special Bindings + Special bindings Keybindings - Keybindings + Raccourcis @@ -1141,19 +1141,19 @@ Common Config Selected - Common Config Selected + Configuration courante sélectionnée This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Ce bouton copie les mappings de la configuration commune vers le profil actuellement sélectionné, et ne peut pas être utilisé lorsque le profil actuellement sélectionné est la configuration commune. Copy values from Common Config - Copy values from Common Config + Copier à partir de la configuration commune Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Voulez-vous remplacer les mappings existants par les mappings de la configuration commune ? Unable to Save @@ -1161,7 +1161,7 @@ Cannot bind any unique input more than once - Cannot bind any unique input more than once + Impossible de lier une entrée unique plus d'une fois Press a key @@ -1169,11 +1169,11 @@ Cannot set mapping - Cannot set mapping + Impossible de définir le mapping Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + La molette de la souris ne peut pas être affectée aux sorties de la manette @@ -2134,19 +2134,19 @@ Cannot create portable user folder - Cannot create portable user folder + Impossible de créer le dossier utilisateur portable %1 already exists - %1 already exists + %1 existe déjà Portable user folder created - Portable user folder created + Dossier utilisateur portable créé %1 successfully created. - %1 successfully created. + %1 a été créé avec succès. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index d179d2172..faa464792 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -562,7 +562,7 @@ Error - Error + Błąd Could not open the file for reading @@ -574,15 +574,15 @@ Save Changes - Save Changes + Zapisać zmiany Do you want to save changes? - Do you want to save changes? + Czy chcesz zapisać zmiany? Help - Help + Pomóc Do you want to reset your custom default config to the original default config? @@ -594,7 +594,7 @@ Reset to Default - Reset to Default + Zresetować do domyślnych diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 412735209..da64729d0 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -411,7 +411,7 @@ D-Pad - D-Pad + Shigjetat Up From f663176a5d93decac9ea3dca092649a9c9c2d638 Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Wed, 12 Mar 2025 15:33:30 -0300 Subject: [PATCH 411/455] FidelityFX FSR implementation (#2624) * host_shaders: support for includes * video_core: add a simpler vulkan asserts * video_core: refactored post processing pipeline to another file * renderer_vulkan: add define param to compile shader utility * video_core: fsr implementation * devtools: show resolution & fsr state --- CMakeLists.txt | 5 + REUSE.toml | 7 +- src/common/string_literal.h | 15 + src/core/debug_state.h | 4 + src/core/devtools/layer.cpp | 18 +- src/core/devtools/widget/frame_graph.cpp | 15 +- src/core/libraries/kernel/kernel.h | 10 +- src/core/libraries/videoout/video_out.cpp | 2 +- src/video_core/host_shaders/CMakeLists.txt | 1 + .../host_shaders/StringShaderHeader.cmake | 39 +- src/video_core/host_shaders/fsr.comp | 91 + src/video_core/host_shaders/fsr/ffx_a.h | 2657 +++++++++++++++++ src/video_core/host_shaders/fsr/ffx_fsr1.h | 1200 ++++++++ src/video_core/host_shaders/post_process.frag | 2 +- .../host_shaders/source_shader.h.in | 4 +- .../renderer_vulkan/host_passes/fsr_pass.cpp | 445 +++ .../renderer_vulkan/host_passes/fsr_pass.h | 56 + .../renderer_vulkan/host_passes/pp_pass.cpp | 255 ++ .../renderer_vulkan/host_passes/pp_pass.h | 34 + src/video_core/renderer_vulkan/vk_platform.h | 23 + .../renderer_vulkan/vk_presenter.cpp | 335 +-- src/video_core/renderer_vulkan/vk_presenter.h | 31 +- .../renderer_vulkan/vk_shader_util.cpp | 50 +- .../renderer_vulkan/vk_shader_util.h | 3 +- src/video_core/texture_cache/image.cpp | 5 + src/video_core/texture_cache/image.h | 1 + 26 files changed, 4984 insertions(+), 324 deletions(-) create mode 100644 src/common/string_literal.h create mode 100644 src/video_core/host_shaders/fsr.comp create mode 100644 src/video_core/host_shaders/fsr/ffx_a.h create mode 100644 src/video_core/host_shaders/fsr/ffx_fsr1.h create mode 100644 src/video_core/renderer_vulkan/host_passes/fsr_pass.cpp create mode 100644 src/video_core/renderer_vulkan/host_passes/fsr_pass.h create mode 100644 src/video_core/renderer_vulkan/host_passes/pp_pass.cpp create mode 100644 src/video_core/renderer_vulkan/host_passes/pp_pass.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b8d82a11c..99620e7d3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -584,6 +584,7 @@ set(COMMON src/common/logging/backend.cpp src/common/spin_lock.h src/common/stb.cpp src/common/stb.h + src/common/string_literal.h src/common/string_util.cpp src/common/string_util.h src/common/thread.cpp @@ -845,6 +846,10 @@ set(VIDEO_CORE src/video_core/amdgpu/liverpool.cpp src/video_core/renderer_vulkan/vk_shader_util.h src/video_core/renderer_vulkan/vk_swapchain.cpp src/video_core/renderer_vulkan/vk_swapchain.h + src/video_core/renderer_vulkan/host_passes/fsr_pass.cpp + src/video_core/renderer_vulkan/host_passes/fsr_pass.h + src/video_core/renderer_vulkan/host_passes/pp_pass.cpp + src/video_core/renderer_vulkan/host_passes/pp_pass.h src/video_core/texture_cache/image.cpp src/video_core/texture_cache/image.h src/video_core/texture_cache/image_info.cpp diff --git a/REUSE.toml b/REUSE.toml index 5cf7b01bf..d9b307d39 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -111,4 +111,9 @@ SPDX-License-Identifier = "CC0-1.0" [[annotations]] path = "cmake/CMakeRC.cmake" SPDX-FileCopyrightText = "Copyright (c) 2017 vector-of-bool " -SPDX-License-Identifier = "MIT" \ No newline at end of file +SPDX-License-Identifier = "MIT" + +[[annotations]] +path = "src/video_core/host_shaders/fsr/*" +SPDX-FileCopyrightText = "Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved." +SPDX-License-Identifier = "MIT" diff --git a/src/common/string_literal.h b/src/common/string_literal.h new file mode 100644 index 000000000..9f64f62bd --- /dev/null +++ b/src/common/string_literal.h @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +template +struct StringLiteral { + static constexpr size_t len = N; + + constexpr StringLiteral(const C (&str)[N]) { + std::copy_n(str, N, value); + } + + C value[N]{}; +}; diff --git a/src/core/debug_state.h b/src/core/debug_state.h index 217efd1a9..b1b8c00d6 100644 --- a/src/core/debug_state.h +++ b/src/core/debug_state.h @@ -158,6 +158,10 @@ public: float Framerate = 1.0f / 60.0f; float FrameDeltaTime; + std::pair game_resolution{}; + std::pair output_resolution{}; + bool is_using_fsr{}; + void ShowDebugMessage(std::string message) { if (message.empty()) { return; diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index 603d76df5..5f0fd0c95 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -81,8 +81,24 @@ void L::DrawMenuBar() { ImGui::EndMenu(); } if (BeginMenu("Display")) { + auto& pp_settings = presenter->GetPPSettingsRef(); if (BeginMenu("Brightness")) { - SliderFloat("Gamma", &presenter->GetGammaRef(), 0.1f, 2.0f); + SliderFloat("Gamma", &pp_settings.gamma, 0.1f, 2.0f); + ImGui::EndMenu(); + } + if (BeginMenu("FSR")) { + auto& fsr = presenter->GetFsrSettingsRef(); + Checkbox("FSR Enabled", &fsr.enable); + BeginDisabled(!fsr.enable); + { + Checkbox("RCAS", &fsr.use_rcas); + BeginDisabled(!fsr.use_rcas); + { + SliderFloat("RCAS Attenuation", &fsr.rcas_attenuation, 0.0, 3.0); + } + EndDisabled(); + } + EndDisabled(); ImGui::EndMenu(); } ImGui::EndMenu(); diff --git a/src/core/devtools/widget/frame_graph.cpp b/src/core/devtools/widget/frame_graph.cpp index d93de571a..8f3e133f5 100644 --- a/src/core/devtools/widget/frame_graph.cpp +++ b/src/core/devtools/widget/frame_graph.cpp @@ -74,7 +74,7 @@ void FrameGraph::Draw() { if (!is_open) { return; } - SetNextWindowSize({340.0, 185.0f}, ImGuiCond_FirstUseEver); + SetNextWindowSize({308.0, 270.0f}, ImGuiCond_FirstUseEver); if (Begin("Video debug info", &is_open)) { const auto& ctx = *GImGui; const auto& io = ctx.IO; @@ -88,13 +88,20 @@ void FrameGraph::Draw() { frameRate = 1000.0f / deltaTime; } + SeparatorText("Frame graph"); + DrawFrameGraph(); + + SeparatorText("Renderer info"); + Text("Frame time: %.3f ms (%.1f FPS)", deltaTime, frameRate); Text("Presenter time: %.3f ms (%.1f FPS)", io.DeltaTime * 1000.0f, 1.0f / io.DeltaTime); Text("Flip frame: %d Gnm submit frame: %d", DebugState.flip_frame_count.load(), DebugState.gnm_frame_count.load()); - - SeparatorText("Frame graph"); - DrawFrameGraph(); + Text("Game Res: %dx%d", DebugState.game_resolution.first, + DebugState.game_resolution.second); + Text("Output Res: %dx%d", DebugState.output_resolution.first, + DebugState.output_resolution.second); + Text("FSR: %s", DebugState.is_using_fsr ? "on" : "off"); } End(); } diff --git a/src/core/libraries/kernel/kernel.h b/src/core/libraries/kernel/kernel.h index 8e7f475ad..58911727d 100644 --- a/src/core/libraries/kernel/kernel.h +++ b/src/core/libraries/kernel/kernel.h @@ -5,6 +5,7 @@ #include #include +#include "common/string_literal.h" #include "common/types.h" #include "core/libraries/kernel/orbis_error.h" @@ -18,15 +19,6 @@ void ErrSceToPosix(int result); int ErrnoToSceKernelError(int e); void SetPosixErrno(int e); -template -struct StringLiteral { - constexpr StringLiteral(const char (&str)[N]) { - std::copy_n(str, N, value); - } - - char value[N]; -}; - template struct WrapperImpl; diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 91616a5ae..4d6972d14 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -360,7 +360,7 @@ s32 PS4_SYSV_ABI sceVideoOutAdjustColor(s32 handle, const SceVideoOutColorSettin return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE; } - presenter->GetGammaRef() = settings->gamma; + presenter->GetPPSettingsRef().gamma = settings->gamma; return ORBIS_OK; } diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index e60cca122..3001bf773 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt @@ -12,6 +12,7 @@ set(SHADER_FILES detilers/micro_64bpp.comp detilers/micro_8bpp.comp fs_tri.vert + fsr.comp post_process.frag ) diff --git a/src/video_core/host_shaders/StringShaderHeader.cmake b/src/video_core/host_shaders/StringShaderHeader.cmake index 9f7525535..798b43e6c 100644 --- a/src/video_core/host_shaders/StringShaderHeader.cmake +++ b/src/video_core/host_shaders/StringShaderHeader.cmake @@ -9,28 +9,31 @@ get_filename_component(CONTENTS_NAME ${SOURCE_FILE} NAME) string(REPLACE "." "_" CONTENTS_NAME ${CONTENTS_NAME}) string(TOUPPER ${CONTENTS_NAME} CONTENTS_NAME) -FILE(READ ${SOURCE_FILE} line_contents) +# Function to recursively parse #include directives and replace them with file contents +function(parse_includes file_path output_content) + file(READ ${file_path} file_content) + # This regex includes \n at the begin to (hackish) avoid including comments + string(REGEX MATCHALL "\n#include +\"[^\"]+\"" includes "${file_content}") -# Replace double quotes with single quotes, -# as double quotes will be used to wrap the lines -STRING(REGEX REPLACE "\"" "'" line_contents "${line_contents}") + set(parsed_content "${file_content}") + foreach (include_match ${includes}) + string(REGEX MATCH "\"([^\"]+)\"" _ "${include_match}") + set(include_file ${CMAKE_MATCH_1}) + get_filename_component(include_full_path "${file_path}" DIRECTORY) + set(include_full_path "${include_full_path}/${include_file}") -# CMake separates list elements with semicolons, but semicolons -# are used extensively in the shader code. -# Replace with a temporary marker, to be reverted later. -STRING(REGEX REPLACE ";" "{{SEMICOLON}}" line_contents "${line_contents}") + if (NOT EXISTS "${include_full_path}") + message(FATAL_ERROR "Included file not found: ${include_full_path} from ${file_path}") + endif () -# Make every line an individual element in the CMake list. -STRING(REGEX REPLACE "\n" ";" line_contents "${line_contents}") + parse_includes("${include_full_path}" sub_content) + string(REPLACE "${include_match}" "\n${sub_content}" parsed_content "${parsed_content}") + endforeach () + set(${output_content} "${parsed_content}" PARENT_SCOPE) +endfunction() -# Build the shader string, wrapping each line in double quotes. -foreach(line IN LISTS line_contents) - string(CONCAT CONTENTS "${CONTENTS}" \"${line}\\n\"\n) -endforeach() - -# Revert the original semicolons in the source. -STRING(REGEX REPLACE "{{SEMICOLON}}" ";" CONTENTS "${CONTENTS}") +parse_includes("${SOURCE_FILE}" CONTENTS) get_filename_component(OUTPUT_DIR ${HEADER_FILE} DIRECTORY) -make_directory(${OUTPUT_DIR}) +file(MAKE_DIRECTORY ${OUTPUT_DIR}) configure_file(${INPUT_FILE} ${HEADER_FILE} @ONLY) diff --git a/src/video_core/host_shaders/fsr.comp b/src/video_core/host_shaders/fsr.comp new file mode 100644 index 000000000..105859e35 --- /dev/null +++ b/src/video_core/host_shaders/fsr.comp @@ -0,0 +1,91 @@ +// SPDX-FileCopyrightText: Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +// SPDX-License-Identifier: MIT + +#version 450 +#extension GL_ARB_separate_shader_objects: enable +#extension GL_ARB_shading_language_420pack: enable + +// FidelityFX Super Resolution Sample +// +// Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +layout (push_constant) uniform const_buffer +{ + uvec4 Const0; + uvec4 Const1; + uvec4 Const2; + uvec4 Const3; + uvec4 Sample; +}; + +#define A_GPU 1 +#define A_GLSL 1 + +#define A_HALF +#include "fsr/ffx_a.h" + +layout (set = 0, binding = 0) uniform texture2D InputTexture; +layout (set = 0, binding = 1, rgba16f) uniform image2D OutputTexture; +layout (set = 0, binding = 2) uniform sampler InputSampler; + +#if SAMPLE_EASU +#define FSR_EASU_H 1 +AH4 FsrEasuRH(AF2 p) { AH4 res = AH4(textureGather(sampler2D(InputTexture, InputSampler), p, 0)); return res; } +AH4 FsrEasuGH(AF2 p) { AH4 res = AH4(textureGather(sampler2D(InputTexture, InputSampler), p, 1)); return res; } +AH4 FsrEasuBH(AF2 p) { AH4 res = AH4(textureGather(sampler2D(InputTexture, InputSampler), p, 2)); return res; } +#endif// SAMPLE_EASU + +#if SAMPLE_RCAS +#define FSR_RCAS_H +AH4 FsrRcasLoadH(ASW2 p) { return AH4(texelFetch(sampler2D(InputTexture, InputSampler), ASU2(p), 0)); } +void FsrRcasInputH(inout AH1 r, inout AH1 g, inout AH1 b) { } +#endif// SAMPLE_RCAS + +#include "fsr/ffx_fsr1.h" + +void CurrFilter(AU2 pos) +{ + #if SAMPLE_EASU + AH3 c; + FsrEasuH(c, pos, Const0, Const1, Const2, Const3); + if (Sample.x == 1) + c *= c; + imageStore(OutputTexture, ASU2(pos), AH4(c, 1)); + #endif// SAMPLE_EASU +#if SAMPLE_RCAS + AH3 c; + FsrRcasH(c.r, c.g, c.b, pos, Const0); + if (Sample.x == 1) + c *= c; + imageStore(OutputTexture, ASU2(pos), AH4(c, 1)); + #endif// SAMPLE_RCAS +} + +layout (local_size_x = 64) in; +void main() +{ + // Do remapping of local xy in workgroup for a more PS-like swizzle pattern. + AU2 gxy = ARmp8x8(gl_LocalInvocationID.x) + AU2(gl_WorkGroupID.x << 4u, gl_WorkGroupID.y << 4u); + CurrFilter(gxy); + gxy.x += 8u; + CurrFilter(gxy); + gxy.y += 8u; + CurrFilter(gxy); + gxy.x -= 8u; + CurrFilter(gxy); +} \ No newline at end of file diff --git a/src/video_core/host_shaders/fsr/ffx_a.h b/src/video_core/host_shaders/fsr/ffx_a.h new file mode 100644 index 000000000..882b0381c --- /dev/null +++ b/src/video_core/host_shaders/fsr/ffx_a.h @@ -0,0 +1,2657 @@ +// clang-format off +//============================================================================================================================== +// +// [A] SHADER PORTABILITY 1.20210629 +// +//============================================================================================================================== +// FidelityFX Super Resolution Sample +// +// Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +//------------------------------------------------------------------------------------------------------------------------------ +// MIT LICENSE +// =========== +// Copyright (c) 2014 Michal Drobot (for concepts used in "FLOAT APPROXIMATIONS"). +// ----------- +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// ----------- +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +// Software. +// ----------- +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +//------------------------------------------------------------------------------------------------------------------------------ +// ABOUT +// ===== +// Common central point for high-level shading language and C portability for various shader headers. +//------------------------------------------------------------------------------------------------------------------------------ +// DEFINES +// ======= +// A_CPU ..... Include the CPU related code. +// A_GPU ..... Include the GPU related code. +// A_GLSL .... Using GLSL. +// A_HLSL .... Using HLSL. +// A_HLSL_6_2 Using HLSL 6.2 with new 'uint16_t' and related types (requires '-enable-16bit-types'). +// A_NO_16_BIT_CAST Don't use instructions that are not availabe in SPIR-V (needed for running A_HLSL_6_2 on Vulkan) +// A_GCC ..... Using a GCC compatible compiler (else assume MSVC compatible compiler by default). +// ======= +// A_BYTE .... Support 8-bit integer. +// A_HALF .... Support 16-bit integer and floating point. +// A_LONG .... Support 64-bit integer. +// A_DUBL .... Support 64-bit floating point. +// ======= +// A_WAVE .... Support wave-wide operations. +//------------------------------------------------------------------------------------------------------------------------------ +// To get #include "ffx_a.h" working in GLSL use '#extension GL_GOOGLE_include_directive:require'. +//------------------------------------------------------------------------------------------------------------------------------ +// SIMPLIFIED TYPE SYSTEM +// ====================== +// - All ints will be unsigned with exception of when signed is required. +// - Type naming simplified and shortened "A<#components>", +// - H = 16-bit float (half) +// - F = 32-bit float (float) +// - D = 64-bit float (double) +// - P = 1-bit integer (predicate, not using bool because 'B' is used for byte) +// - B = 8-bit integer (byte) +// - W = 16-bit integer (word) +// - U = 32-bit integer (unsigned) +// - L = 64-bit integer (long) +// - Using "AS<#components>" for signed when required. +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Make sure 'ALerp*(a,b,m)' does 'b*m+(-a*m+a)' (2 ops). +//------------------------------------------------------------------------------------------------------------------------------ +// CHANGE LOG +// ========== +// 20200914 - Expanded wave ops and prx code. +// 20200713 - Added [ZOL] section, fixed serious bugs in sRGB and Rec.709 color conversion code, etc. +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// COMMON +//============================================================================================================================== +#define A_2PI 6.28318530718 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// CPU +// +// +//============================================================================================================================== +#ifdef A_CPU + // Supporting user defined overrides. + #ifndef A_RESTRICT + #define A_RESTRICT __restrict + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifndef A_STATIC + #define A_STATIC static + #endif +//------------------------------------------------------------------------------------------------------------------------------ + // Same types across CPU and GPU. + // Predicate uses 32-bit integer (C friendly bool). + typedef uint32_t AP1; + typedef float AF1; + typedef double AD1; + typedef uint8_t AB1; + typedef uint16_t AW1; + typedef uint32_t AU1; + typedef uint64_t AL1; + typedef int8_t ASB1; + typedef int16_t ASW1; + typedef int32_t ASU1; + typedef int64_t ASL1; +//------------------------------------------------------------------------------------------------------------------------------ + #define AD1_(a) ((AD1)(a)) + #define AF1_(a) ((AF1)(a)) + #define AL1_(a) ((AL1)(a)) + #define AU1_(a) ((AU1)(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASL1_(a) ((ASL1)(a)) + #define ASU1_(a) ((ASU1)(a)) +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AU1 AU1_AF1(AF1 a){union{AF1 f;AU1 u;}bits;bits.f=a;return bits.u;} +//------------------------------------------------------------------------------------------------------------------------------ + #define A_TRUE 1 + #define A_FALSE 0 +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// CPU/GPU PORTING +// +//------------------------------------------------------------------------------------------------------------------------------ +// Get CPU and GPU to share all setup code, without duplicate code paths. +// This uses a lower-case prefix for special vector constructs. +// - In C restrict pointers are used. +// - In the shading language, in/inout/out arguments are used. +// This depends on the ability to access a vector value in both languages via array syntax (aka color[2]). +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY +//============================================================================================================================== + #define retAD2 AD1 *A_RESTRICT + #define retAD3 AD1 *A_RESTRICT + #define retAD4 AD1 *A_RESTRICT + #define retAF2 AF1 *A_RESTRICT + #define retAF3 AF1 *A_RESTRICT + #define retAF4 AF1 *A_RESTRICT + #define retAL2 AL1 *A_RESTRICT + #define retAL3 AL1 *A_RESTRICT + #define retAL4 AL1 *A_RESTRICT + #define retAU2 AU1 *A_RESTRICT + #define retAU3 AU1 *A_RESTRICT + #define retAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define inAD2 AD1 *A_RESTRICT + #define inAD3 AD1 *A_RESTRICT + #define inAD4 AD1 *A_RESTRICT + #define inAF2 AF1 *A_RESTRICT + #define inAF3 AF1 *A_RESTRICT + #define inAF4 AF1 *A_RESTRICT + #define inAL2 AL1 *A_RESTRICT + #define inAL3 AL1 *A_RESTRICT + #define inAL4 AL1 *A_RESTRICT + #define inAU2 AU1 *A_RESTRICT + #define inAU3 AU1 *A_RESTRICT + #define inAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define inoutAD2 AD1 *A_RESTRICT + #define inoutAD3 AD1 *A_RESTRICT + #define inoutAD4 AD1 *A_RESTRICT + #define inoutAF2 AF1 *A_RESTRICT + #define inoutAF3 AF1 *A_RESTRICT + #define inoutAF4 AF1 *A_RESTRICT + #define inoutAL2 AL1 *A_RESTRICT + #define inoutAL3 AL1 *A_RESTRICT + #define inoutAL4 AL1 *A_RESTRICT + #define inoutAU2 AU1 *A_RESTRICT + #define inoutAU3 AU1 *A_RESTRICT + #define inoutAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define outAD2 AD1 *A_RESTRICT + #define outAD3 AD1 *A_RESTRICT + #define outAD4 AD1 *A_RESTRICT + #define outAF2 AF1 *A_RESTRICT + #define outAF3 AF1 *A_RESTRICT + #define outAF4 AF1 *A_RESTRICT + #define outAL2 AL1 *A_RESTRICT + #define outAL3 AL1 *A_RESTRICT + #define outAL4 AL1 *A_RESTRICT + #define outAU2 AU1 *A_RESTRICT + #define outAU3 AU1 *A_RESTRICT + #define outAU4 AU1 *A_RESTRICT +//------------------------------------------------------------------------------------------------------------------------------ + #define varAD2(x) AD1 x[2] + #define varAD3(x) AD1 x[3] + #define varAD4(x) AD1 x[4] + #define varAF2(x) AF1 x[2] + #define varAF3(x) AF1 x[3] + #define varAF4(x) AF1 x[4] + #define varAL2(x) AL1 x[2] + #define varAL3(x) AL1 x[3] + #define varAL4(x) AL1 x[4] + #define varAU2(x) AU1 x[2] + #define varAU3(x) AU1 x[3] + #define varAU4(x) AU1 x[4] +//------------------------------------------------------------------------------------------------------------------------------ + #define initAD2(x,y) {x,y} + #define initAD3(x,y,z) {x,y,z} + #define initAD4(x,y,z,w) {x,y,z,w} + #define initAF2(x,y) {x,y} + #define initAF3(x,y,z) {x,y,z} + #define initAF4(x,y,z,w) {x,y,z,w} + #define initAL2(x,y) {x,y} + #define initAL3(x,y,z) {x,y,z} + #define initAL4(x,y,z,w) {x,y,z,w} + #define initAU2(x,y) {x,y} + #define initAU3(x,y,z) {x,y,z} + #define initAU4(x,y,z,w) {x,y,z,w} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Replace transcendentals with manual versions. +//============================================================================================================================== + #ifdef A_GCC + A_STATIC AD1 AAbsD1(AD1 a){return __builtin_fabs(a);} + A_STATIC AF1 AAbsF1(AF1 a){return __builtin_fabsf(a);} + A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(__builtin_abs(ASU1_(a)));} + A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(__builtin_llabs(ASL1_(a)));} + #else + A_STATIC AD1 AAbsD1(AD1 a){return fabs(a);} + A_STATIC AF1 AAbsF1(AF1 a){return fabsf(a);} + A_STATIC AU1 AAbsSU1(AU1 a){return AU1_(abs(ASU1_(a)));} + A_STATIC AL1 AAbsSL1(AL1 a){return AL1_(labs((long)ASL1_(a)));} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ACosD1(AD1 a){return __builtin_cos(a);} + A_STATIC AF1 ACosF1(AF1 a){return __builtin_cosf(a);} + #else + A_STATIC AD1 ACosD1(AD1 a){return cos(a);} + A_STATIC AF1 ACosF1(AF1 a){return cosf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ADotD2(inAD2 a,inAD2 b){return a[0]*b[0]+a[1]*b[1];} + A_STATIC AD1 ADotD3(inAD3 a,inAD3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} + A_STATIC AD1 ADotD4(inAD4 a,inAD4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];} + A_STATIC AF1 ADotF2(inAF2 a,inAF2 b){return a[0]*b[0]+a[1]*b[1];} + A_STATIC AF1 ADotF3(inAF3 a,inAF3 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} + A_STATIC AF1 ADotF4(inAF4 a,inAF4 b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 AExp2D1(AD1 a){return __builtin_exp2(a);} + A_STATIC AF1 AExp2F1(AF1 a){return __builtin_exp2f(a);} + #else + A_STATIC AD1 AExp2D1(AD1 a){return exp2(a);} + A_STATIC AF1 AExp2F1(AF1 a){return exp2f(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 AFloorD1(AD1 a){return __builtin_floor(a);} + A_STATIC AF1 AFloorF1(AF1 a){return __builtin_floorf(a);} + #else + A_STATIC AD1 AFloorD1(AD1 a){return floor(a);} + A_STATIC AF1 AFloorF1(AF1 a){return floorf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ALerpD1(AD1 a,AD1 b,AD1 c){return b*c+(-a*c+a);} + A_STATIC AF1 ALerpF1(AF1 a,AF1 b,AF1 c){return b*c+(-a*c+a);} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ALog2D1(AD1 a){return __builtin_log2(a);} + A_STATIC AF1 ALog2F1(AF1 a){return __builtin_log2f(a);} + #else + A_STATIC AD1 ALog2D1(AD1 a){return log2(a);} + A_STATIC AF1 ALog2F1(AF1 a){return log2f(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AMaxD1(AD1 a,AD1 b){return a>b?a:b;} + A_STATIC AF1 AMaxF1(AF1 a,AF1 b){return a>b?a:b;} + A_STATIC AL1 AMaxL1(AL1 a,AL1 b){return a>b?a:b;} + A_STATIC AU1 AMaxU1(AU1 a,AU1 b){return a>b?a:b;} +//------------------------------------------------------------------------------------------------------------------------------ + // These follow the convention that A integer types don't have signage, until they are operated on. + A_STATIC AL1 AMaxSL1(AL1 a,AL1 b){return (ASL1_(a)>ASL1_(b))?a:b;} + A_STATIC AU1 AMaxSU1(AU1 a,AU1 b){return (ASU1_(a)>ASU1_(b))?a:b;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AMinD1(AD1 a,AD1 b){return a>ASL1_(b));} + A_STATIC AU1 AShrSU1(AU1 a,AU1 b){return AU1_(ASU1_(a)>>ASU1_(b));} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ASinD1(AD1 a){return __builtin_sin(a);} + A_STATIC AF1 ASinF1(AF1 a){return __builtin_sinf(a);} + #else + A_STATIC AD1 ASinD1(AD1 a){return sin(a);} + A_STATIC AF1 ASinF1(AF1 a){return sinf(a);} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_GCC + A_STATIC AD1 ASqrtD1(AD1 a){return __builtin_sqrt(a);} + A_STATIC AF1 ASqrtF1(AF1 a){return __builtin_sqrtf(a);} + #else + A_STATIC AD1 ASqrtD1(AD1 a){return sqrt(a);} + A_STATIC AF1 ASqrtF1(AF1 a){return sqrtf(a);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS - DEPENDENT +//============================================================================================================================== + A_STATIC AD1 AClampD1(AD1 x,AD1 n,AD1 m){return AMaxD1(n,AMinD1(x,m));} + A_STATIC AF1 AClampF1(AF1 x,AF1 n,AF1 m){return AMaxF1(n,AMinF1(x,m));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 AFractD1(AD1 a){return a-AFloorD1(a);} + A_STATIC AF1 AFractF1(AF1 a){return a-AFloorF1(a);} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 APowD1(AD1 a,AD1 b){return AExp2D1(b*ALog2D1(a));} + A_STATIC AF1 APowF1(AF1 a,AF1 b){return AExp2F1(b*ALog2F1(a));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ARsqD1(AD1 a){return ARcpD1(ASqrtD1(a));} + A_STATIC AF1 ARsqF1(AF1 a){return ARcpF1(ASqrtF1(a));} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC AD1 ASatD1(AD1 a){return AMinD1(1.0,AMaxD1(0.0,a));} + A_STATIC AF1 ASatF1(AF1 a){return AMinF1(1.0f,AMaxF1(0.0f,a));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR OPS +//------------------------------------------------------------------------------------------------------------------------------ +// These are added as needed for production or prototyping, so not necessarily a complete set. +// They follow a convention of taking in a destination and also returning the destination value to increase utility. +//============================================================================================================================== + A_STATIC retAD2 opAAbsD2(outAD2 d,inAD2 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);return d;} + A_STATIC retAD3 opAAbsD3(outAD3 d,inAD3 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);return d;} + A_STATIC retAD4 opAAbsD4(outAD4 d,inAD4 a){d[0]=AAbsD1(a[0]);d[1]=AAbsD1(a[1]);d[2]=AAbsD1(a[2]);d[3]=AAbsD1(a[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAbsF2(outAF2 d,inAF2 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);return d;} + A_STATIC retAF3 opAAbsF3(outAF3 d,inAF3 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);return d;} + A_STATIC retAF4 opAAbsF4(outAF4 d,inAF4 a){d[0]=AAbsF1(a[0]);d[1]=AAbsF1(a[1]);d[2]=AAbsF1(a[2]);d[3]=AAbsF1(a[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;} + A_STATIC retAD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;} + A_STATIC retAD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];return d;} + A_STATIC retAF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];return d;} + A_STATIC retAF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]+b[0];d[1]=a[1]+b[1];d[2]=a[2]+b[2];d[3]=a[3]+b[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opAAddOneD2(outAD2 d,inAD2 a,AD1 b){d[0]=a[0]+b;d[1]=a[1]+b;return d;} + A_STATIC retAD3 opAAddOneD3(outAD3 d,inAD3 a,AD1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;return d;} + A_STATIC retAD4 opAAddOneD4(outAD4 d,inAD4 a,AD1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;d[3]=a[3]+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAAddOneF2(outAF2 d,inAF2 a,AF1 b){d[0]=a[0]+b;d[1]=a[1]+b;return d;} + A_STATIC retAF3 opAAddOneF3(outAF3 d,inAF3 a,AF1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;return d;} + A_STATIC retAF4 opAAddOneF4(outAF4 d,inAF4 a,AF1 b){d[0]=a[0]+b;d[1]=a[1]+b;d[2]=a[2]+b;d[3]=a[3]+b;return d;} +//============================================================================================================================== + A_STATIC retAD2 opACpyD2(outAD2 d,inAD2 a){d[0]=a[0];d[1]=a[1];return d;} + A_STATIC retAD3 opACpyD3(outAD3 d,inAD3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;} + A_STATIC retAD4 opACpyD4(outAD4 d,inAD4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opACpyF2(outAF2 d,inAF2 a){d[0]=a[0];d[1]=a[1];return d;} + A_STATIC retAF3 opACpyF3(outAF3 d,inAF3 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];return d;} + A_STATIC retAF4 opACpyF4(outAF4 d,inAF4 a){d[0]=a[0];d[1]=a[1];d[2]=a[2];d[3]=a[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);return d;} + A_STATIC retAD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);return d;} + A_STATIC retAD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d[0]=ALerpD1(a[0],b[0],c[0]);d[1]=ALerpD1(a[1],b[1],c[1]);d[2]=ALerpD1(a[2],b[2],c[2]);d[3]=ALerpD1(a[3],b[3],c[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);return d;} + A_STATIC retAF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);return d;} + A_STATIC retAF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d[0]=ALerpF1(a[0],b[0],c[0]);d[1]=ALerpF1(a[1],b[1],c[1]);d[2]=ALerpF1(a[2],b[2],c[2]);d[3]=ALerpF1(a[3],b[3],c[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);return d;} + A_STATIC retAD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);return d;} + A_STATIC retAD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d[0]=ALerpD1(a[0],b[0],c);d[1]=ALerpD1(a[1],b[1],c);d[2]=ALerpD1(a[2],b[2],c);d[3]=ALerpD1(a[3],b[3],c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);return d;} + A_STATIC retAF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);return d;} + A_STATIC retAF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d[0]=ALerpF1(a[0],b[0],c);d[1]=ALerpF1(a[1],b[1],c);d[2]=ALerpF1(a[2],b[2],c);d[3]=ALerpF1(a[3],b[3],c);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);return d;} + A_STATIC retAD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);return d;} + A_STATIC retAD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMaxD1(a[0],b[0]);d[1]=AMaxD1(a[1],b[1]);d[2]=AMaxD1(a[2],b[2]);d[3]=AMaxD1(a[3],b[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);return d;} + A_STATIC retAF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);return d;} + A_STATIC retAF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMaxF1(a[0],b[0]);d[1]=AMaxF1(a[1],b[1]);d[2]=AMaxF1(a[2],b[2]);d[3]=AMaxF1(a[3],b[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);return d;} + A_STATIC retAD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);return d;} + A_STATIC retAD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d[0]=AMinD1(a[0],b[0]);d[1]=AMinD1(a[1],b[1]);d[2]=AMinD1(a[2],b[2]);d[3]=AMinD1(a[3],b[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);return d;} + A_STATIC retAF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);return d;} + A_STATIC retAF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d[0]=AMinF1(a[0],b[0]);d[1]=AMinF1(a[1],b[1]);d[2]=AMinF1(a[2],b[2]);d[3]=AMinF1(a[3],b[3]);return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;} + A_STATIC retAD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;} + A_STATIC retAD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];return d;} + A_STATIC retAF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];return d;} + A_STATIC retAF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d[0]=a[0]*b[0];d[1]=a[1]*b[1];d[2]=a[2]*b[2];d[3]=a[3]*b[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;} + A_STATIC retAD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;} + A_STATIC retAD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;return d;} + A_STATIC retAF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;return d;} + A_STATIC retAF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d[0]=a[0]*b;d[1]=a[1]*b;d[2]=a[2]*b;d[3]=a[3]*b;return d;} +//============================================================================================================================== + A_STATIC retAD2 opANegD2(outAD2 d,inAD2 a){d[0]=-a[0];d[1]=-a[1];return d;} + A_STATIC retAD3 opANegD3(outAD3 d,inAD3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;} + A_STATIC retAD4 opANegD4(outAD4 d,inAD4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opANegF2(outAF2 d,inAF2 a){d[0]=-a[0];d[1]=-a[1];return d;} + A_STATIC retAF3 opANegF3(outAF3 d,inAF3 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];return d;} + A_STATIC retAF4 opANegF4(outAF4 d,inAF4 a){d[0]=-a[0];d[1]=-a[1];d[2]=-a[2];d[3]=-a[3];return d;} +//============================================================================================================================== + A_STATIC retAD2 opARcpD2(outAD2 d,inAD2 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);return d;} + A_STATIC retAD3 opARcpD3(outAD3 d,inAD3 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);return d;} + A_STATIC retAD4 opARcpD4(outAD4 d,inAD4 a){d[0]=ARcpD1(a[0]);d[1]=ARcpD1(a[1]);d[2]=ARcpD1(a[2]);d[3]=ARcpD1(a[3]);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + A_STATIC retAF2 opARcpF2(outAF2 d,inAF2 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);return d;} + A_STATIC retAF3 opARcpF3(outAF3 d,inAF3 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);return d;} + A_STATIC retAF4 opARcpF4(outAF4 d,inAF4 a){d[0]=ARcpF1(a[0]);d[1]=ARcpF1(a[1]);d[2]=ARcpF1(a[2]);d[3]=ARcpF1(a[3]);return d;} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HALF FLOAT PACKING +//============================================================================================================================== + // Convert float to half (in lower 16-bits of output). + // Same fast technique as documented here: ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf + // Supports denormals. + // Conversion rules are to make computations possibly "safer" on the GPU, + // -INF & -NaN -> -65504 + // +INF & +NaN -> +65504 + A_STATIC AU1 AU1_AH1_AF1(AF1 f){ + static AW1 base[512]={ + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100, + 0x0200,0x0400,0x0800,0x0c00,0x1000,0x1400,0x1800,0x1c00,0x2000,0x2400,0x2800,0x2c00,0x3000,0x3400,0x3800,0x3c00, + 0x4000,0x4400,0x4800,0x4c00,0x5000,0x5400,0x5800,0x5c00,0x6000,0x6400,0x6800,0x6c00,0x7000,0x7400,0x7800,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff,0x7bff, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8001,0x8002,0x8004,0x8008,0x8010,0x8020,0x8040,0x8080,0x8100, + 0x8200,0x8400,0x8800,0x8c00,0x9000,0x9400,0x9800,0x9c00,0xa000,0xa400,0xa800,0xac00,0xb000,0xb400,0xb800,0xbc00, + 0xc000,0xc400,0xc800,0xcc00,0xd000,0xd400,0xd800,0xdc00,0xe000,0xe400,0xe800,0xec00,0xf000,0xf400,0xf800,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff, + 0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff,0xfbff}; + static AB1 shift[512]={ + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f, + 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, + 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f, + 0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, + 0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}; + union{AF1 f;AU1 u;}bits;bits.f=f;AU1 u=bits.u;AU1 i=u>>23;return (AU1)(base[i])+((u&0x7fffff)>>shift[i]);} +//------------------------------------------------------------------------------------------------------------------------------ + // Used to output packed constant. + A_STATIC AU1 AU1_AH2_AF2(inAF2 a){return AU1_AH1_AF1(a[0])+(AU1_AH1_AF1(a[1])<<16);} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GLSL +// +// +//============================================================================================================================== +#if defined(A_GLSL) && defined(A_GPU) + #ifndef A_SKIP_EXT + #ifdef A_HALF + #extension GL_EXT_shader_16bit_storage:require + #extension GL_EXT_shader_explicit_arithmetic_types:require + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_LONG + #extension GL_ARB_gpu_shader_int64:require + #extension GL_NV_shader_atomic_int64:require + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_WAVE + #extension GL_KHR_shader_subgroup_arithmetic:require + #extension GL_KHR_shader_subgroup_ballot:require + #extension GL_KHR_shader_subgroup_quad:require + #extension GL_KHR_shader_subgroup_shuffle:require + #endif + #endif +//============================================================================================================================== + #define AP1 bool + #define AP2 bvec2 + #define AP3 bvec3 + #define AP4 bvec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float + #define AF2 vec2 + #define AF3 vec3 + #define AF4 vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint + #define AU2 uvec2 + #define AU3 uvec3 + #define AU4 uvec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int + #define ASU2 ivec2 + #define ASU3 ivec3 + #define ASU4 ivec4 +//============================================================================================================================== + #define AF1_AU1(x) uintBitsToFloat(AU1(x)) + #define AF2_AU2(x) uintBitsToFloat(AU2(x)) + #define AF3_AU3(x) uintBitsToFloat(AU3(x)) + #define AF4_AU4(x) uintBitsToFloat(AU4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AF1(x) floatBitsToUint(AF1(x)) + #define AU2_AF2(x) floatBitsToUint(AF2(x)) + #define AU3_AF3(x) floatBitsToUint(AF3(x)) + #define AU4_AF4(x) floatBitsToUint(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH1_AF1_x(AF1 a){return packHalf2x16(AF2(a,0.0));} + #define AU1_AH1_AF1(a) AU1_AH1_AF1_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AH2_AF2 packHalf2x16 + #define AU1_AW2Unorm_AF2 packUnorm2x16 + #define AU1_AB4Unorm_AF4 packUnorm4x8 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF2_AH2_AU1 unpackHalf2x16 + #define AF2_AW2Unorm_AU1 unpackUnorm2x16 + #define AF4_AB4Unorm_AU1 unpackUnorm4x8 +//============================================================================================================================== + AF1 AF1_x(AF1 a){return AF1(a);} + AF2 AF2_x(AF1 a){return AF2(a,a);} + AF3 AF3_x(AF1 a){return AF3(a,a,a);} + AF4 AF4_x(AF1 a){return AF4(a,a,a,a);} + #define AF1_(a) AF1_x(AF1(a)) + #define AF2_(a) AF2_x(AF1(a)) + #define AF3_(a) AF3_x(AF1(a)) + #define AF4_(a) AF4_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_x(AU1 a){return AU1(a);} + AU2 AU2_x(AU1 a){return AU2(a,a);} + AU3 AU3_x(AU1 a){return AU3(a,a,a);} + AU4 AU4_x(AU1 a){return AU4(a,a,a,a);} + #define AU1_(a) AU1_x(AU1(a)) + #define AU2_(a) AU2_x(AU1(a)) + #define AU3_(a) AU3_x(AU1(a)) + #define AU4_(a) AU4_x(AU1(a)) +//============================================================================================================================== + AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));} + AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));} + AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));} + AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABfe(AU1 src,AU1 off,AU1 bits){return bitfieldExtract(src,ASU1(off),ASU1(bits));} + AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));} + // Proxy for V_BFI_B32 where the 'mask' is set as 'bits', 'mask=(1<>ASU1(b));} + AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));} + AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));} + AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL BYTE +//============================================================================================================================== + #ifdef A_BYTE + #define AB1 uint8_t + #define AB2 u8vec2 + #define AB3 u8vec3 + #define AB4 u8vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASB1 int8_t + #define ASB2 i8vec2 + #define ASB3 i8vec3 + #define ASB4 i8vec4 +//------------------------------------------------------------------------------------------------------------------------------ + AB1 AB1_x(AB1 a){return AB1(a);} + AB2 AB2_x(AB1 a){return AB2(a,a);} + AB3 AB3_x(AB1 a){return AB3(a,a,a);} + AB4 AB4_x(AB1 a){return AB4(a,a,a,a);} + #define AB1_(a) AB1_x(AB1(a)) + #define AB2_(a) AB2_x(AB1(a)) + #define AB3_(a) AB3_x(AB1(a)) + #define AB4_(a) AB4_x(AB1(a)) + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL HALF +//============================================================================================================================== + #ifdef A_HALF + #define AH1 float16_t + #define AH2 f16vec2 + #define AH3 f16vec3 + #define AH4 f16vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 uint16_t + #define AW2 u16vec2 + #define AW3 u16vec3 + #define AW4 u16vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 int16_t + #define ASW2 i16vec2 + #define ASW3 i16vec3 + #define ASW4 i16vec4 +//============================================================================================================================== + #define AH2_AU1(x) unpackFloat2x16(AU1(x)) + AH4 AH4_AU2_x(AU2 x){return AH4(unpackFloat2x16(x.x),unpackFloat2x16(x.y));} + #define AH4_AU2(x) AH4_AU2_x(AU2(x)) + #define AW2_AU1(x) unpackUint2x16(AU1(x)) + #define AW4_AU2(x) unpackUint4x16(pack64(AU2(x))) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AH2(x) packFloat2x16(AH2(x)) + AU2 AU2_AH4_x(AH4 x){return AU2(packFloat2x16(x.xy),packFloat2x16(x.zw));} + #define AU2_AH4(x) AU2_AH4_x(AH4(x)) + #define AU1_AW2(x) packUint2x16(AW2(x)) + #define AU2_AW4(x) unpack32(packUint4x16(AW4(x))) +//============================================================================================================================== + #define AW1_AH1(x) halfBitsToUint16(AH1(x)) + #define AW2_AH2(x) halfBitsToUint16(AH2(x)) + #define AW3_AH3(x) halfBitsToUint16(AH3(x)) + #define AW4_AH4(x) halfBitsToUint16(AH4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AH1_AW1(x) uint16BitsToHalf(AW1(x)) + #define AH2_AW2(x) uint16BitsToHalf(AW2(x)) + #define AH3_AW3(x) uint16BitsToHalf(AW3(x)) + #define AH4_AW4(x) uint16BitsToHalf(AW4(x)) +//============================================================================================================================== + AH1 AH1_x(AH1 a){return AH1(a);} + AH2 AH2_x(AH1 a){return AH2(a,a);} + AH3 AH3_x(AH1 a){return AH3(a,a,a);} + AH4 AH4_x(AH1 a){return AH4(a,a,a,a);} + #define AH1_(a) AH1_x(AH1(a)) + #define AH2_(a) AH2_x(AH1(a)) + #define AH3_(a) AH3_x(AH1(a)) + #define AH4_(a) AH4_x(AH1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AW1_x(AW1 a){return AW1(a);} + AW2 AW2_x(AW1 a){return AW2(a,a);} + AW3 AW3_x(AW1 a){return AW3(a,a,a);} + AW4 AW4_x(AW1 a){return AW4(a,a,a,a);} + #define AW1_(a) AW1_x(AW1(a)) + #define AW2_(a) AW2_x(AW1(a)) + #define AW3_(a) AW3_x(AW1(a)) + #define AW4_(a) AW4_x(AW1(a)) +//============================================================================================================================== + AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));} + AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));} + AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));} + AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AClampH1(AH1 x,AH1 n,AH1 m){return clamp(x,n,m);} + AH2 AClampH2(AH2 x,AH2 n,AH2 m){return clamp(x,n,m);} + AH3 AClampH3(AH3 x,AH3 n,AH3 m){return clamp(x,n,m);} + AH4 AClampH4(AH4 x,AH4 n,AH4 m){return clamp(x,n,m);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFractH1(AH1 x){return fract(x);} + AH2 AFractH2(AH2 x){return fract(x);} + AH3 AFractH3(AH3 x){return fract(x);} + AH4 AFractH4(AH4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return mix(x,y,a);} + AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return mix(x,y,a);} + AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return mix(x,y,a);} + AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + // No packed version of max3. + AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));} + AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));} + AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));} + AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));} + AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));} + AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));} + AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + // No packed version of min3. + AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));} + AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));} + AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));} + AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));} + AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));} + AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));} + AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARcpH1(AH1 x){return AH1_(1.0)/x;} + AH2 ARcpH2(AH2 x){return AH2_(1.0)/x;} + AH3 ARcpH3(AH3 x){return AH3_(1.0)/x;} + AH4 ARcpH4(AH4 x){return AH4_(1.0)/x;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARsqH1(AH1 x){return AH1_(1.0)/sqrt(x);} + AH2 ARsqH2(AH2 x){return AH2_(1.0)/sqrt(x);} + AH3 ARsqH3(AH3 x){return AH3_(1.0)/sqrt(x);} + AH4 ARsqH4(AH4 x){return AH4_(1.0)/sqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASatH1(AH1 x){return clamp(x,AH1_(0.0),AH1_(1.0));} + AH2 ASatH2(AH2 x){return clamp(x,AH2_(0.0),AH2_(1.0));} + AH3 ASatH3(AH3 x){return clamp(x,AH3_(0.0),AH3_(1.0));} + AH4 ASatH4(AH4 x){return clamp(x,AH4_(0.0),AH4_(1.0));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));} + AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));} + AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));} + AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL DOUBLE +//============================================================================================================================== + #ifdef A_DUBL + #define AD1 double + #define AD2 dvec2 + #define AD3 dvec3 + #define AD4 dvec4 +//------------------------------------------------------------------------------------------------------------------------------ + AD1 AD1_x(AD1 a){return AD1(a);} + AD2 AD2_x(AD1 a){return AD2(a,a);} + AD3 AD3_x(AD1 a){return AD3(a,a,a);} + AD4 AD4_x(AD1 a){return AD4(a,a,a,a);} + #define AD1_(a) AD1_x(AD1(a)) + #define AD2_(a) AD2_x(AD1(a)) + #define AD3_(a) AD3_x(AD1(a)) + #define AD4_(a) AD4_x(AD1(a)) +//============================================================================================================================== + AD1 AFractD1(AD1 x){return fract(x);} + AD2 AFractD2(AD2 x){return fract(x);} + AD3 AFractD3(AD3 x){return fract(x);} + AD4 AFractD4(AD4 x){return fract(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return mix(x,y,a);} + AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return mix(x,y,a);} + AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return mix(x,y,a);} + AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return mix(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARcpD1(AD1 x){return AD1_(1.0)/x;} + AD2 ARcpD2(AD2 x){return AD2_(1.0)/x;} + AD3 ARcpD3(AD3 x){return AD3_(1.0)/x;} + AD4 ARcpD4(AD4 x){return AD4_(1.0)/x;} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARsqD1(AD1 x){return AD1_(1.0)/sqrt(x);} + AD2 ARsqD2(AD2 x){return AD2_(1.0)/sqrt(x);} + AD3 ARsqD3(AD3 x){return AD3_(1.0)/sqrt(x);} + AD4 ARsqD4(AD4 x){return AD4_(1.0)/sqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ASatD1(AD1 x){return clamp(x,AD1_(0.0),AD1_(1.0));} + AD2 ASatD2(AD2 x){return clamp(x,AD2_(0.0),AD2_(1.0));} + AD3 ASatD3(AD3 x){return clamp(x,AD3_(0.0),AD3_(1.0));} + AD4 ASatD4(AD4 x){return clamp(x,AD4_(0.0),AD4_(1.0));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// GLSL LONG +//============================================================================================================================== + #ifdef A_LONG + #define AL1 uint64_t + #define AL2 u64vec2 + #define AL3 u64vec3 + #define AL4 u64vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASL1 int64_t + #define ASL2 i64vec2 + #define ASL3 i64vec3 + #define ASL4 i64vec4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AL1_AU2(x) packUint2x32(AU2(x)) + #define AU2_AL1(x) unpackUint2x32(AL1(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AL1_x(AL1 a){return AL1(a);} + AL2 AL2_x(AL1 a){return AL2(a,a);} + AL3 AL3_x(AL1 a){return AL3(a,a,a);} + AL4 AL4_x(AL1 a){return AL4(a,a,a,a);} + #define AL1_(a) AL1_x(AL1(a)) + #define AL2_(a) AL2_x(AL1(a)) + #define AL3_(a) AL3_x(AL1(a)) + #define AL4_(a) AL4_x(AL1(a)) +//============================================================================================================================== + AL1 AAbsSL1(AL1 a){return AL1(abs(ASL1(a)));} + AL2 AAbsSL2(AL2 a){return AL2(abs(ASL2(a)));} + AL3 AAbsSL3(AL3 a){return AL3(abs(ASL3(a)));} + AL4 AAbsSL4(AL4 a){return AL4(abs(ASL4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AMaxSL1(AL1 a,AL1 b){return AL1(max(ASU1(a),ASU1(b)));} + AL2 AMaxSL2(AL2 a,AL2 b){return AL2(max(ASU2(a),ASU2(b)));} + AL3 AMaxSL3(AL3 a,AL3 b){return AL3(max(ASU3(a),ASU3(b)));} + AL4 AMaxSL4(AL4 a,AL4 b){return AL4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AL1 AMinSL1(AL1 a,AL1 b){return AL1(min(ASU1(a),ASU1(b)));} + AL2 AMinSL2(AL2 a,AL2 b){return AL2(min(ASU2(a),ASU2(b)));} + AL3 AMinSL3(AL3 a,AL3 b){return AL3(min(ASU3(a),ASU3(b)));} + AL4 AMinSL4(AL4 a,AL4 b){return AL4(min(ASU4(a),ASU4(b)));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// WAVE OPERATIONS +//============================================================================================================================== + #ifdef A_WAVE + // Where 'x' must be a compile time literal. + AF1 AWaveXorF1(AF1 v,AU1 x){return subgroupShuffleXor(v,x);} + AF2 AWaveXorF2(AF2 v,AU1 x){return subgroupShuffleXor(v,x);} + AF3 AWaveXorF3(AF3 v,AU1 x){return subgroupShuffleXor(v,x);} + AF4 AWaveXorF4(AF4 v,AU1 x){return subgroupShuffleXor(v,x);} + AU1 AWaveXorU1(AU1 v,AU1 x){return subgroupShuffleXor(v,x);} + AU2 AWaveXorU2(AU2 v,AU1 x){return subgroupShuffleXor(v,x);} + AU3 AWaveXorU3(AU3 v,AU1 x){return subgroupShuffleXor(v,x);} + AU4 AWaveXorU4(AU4 v,AU1 x){return subgroupShuffleXor(v,x);} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + AH2 AWaveXorH2(AH2 v,AU1 x){return AH2_AU1(subgroupShuffleXor(AU1_AH2(v),x));} + AH4 AWaveXorH4(AH4 v,AU1 x){return AH4_AU2(subgroupShuffleXor(AU2_AH4(v),x));} + AW2 AWaveXorW2(AW2 v,AU1 x){return AW2_AU1(subgroupShuffleXor(AU1_AW2(v),x));} + AW4 AWaveXorW4(AW4 v,AU1 x){return AW4_AU2(subgroupShuffleXor(AU2_AW4(v),x));} + #endif + #endif +//============================================================================================================================== +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// HLSL +// +// +//============================================================================================================================== +#if defined(A_HLSL) && defined(A_GPU) + #ifdef A_HLSL_6_2 + #define AP1 bool + #define AP2 bool2 + #define AP3 bool3 + #define AP4 bool4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float32_t + #define AF2 float32_t2 + #define AF3 float32_t3 + #define AF4 float32_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint32_t + #define AU2 uint32_t2 + #define AU3 uint32_t3 + #define AU4 uint32_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int32_t + #define ASU2 int32_t2 + #define ASU3 int32_t3 + #define ASU4 int32_t4 + #else + #define AP1 bool + #define AP2 bool2 + #define AP3 bool3 + #define AP4 bool4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AF1 float + #define AF2 float2 + #define AF3 float3 + #define AF4 float4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1 uint + #define AU2 uint2 + #define AU3 uint3 + #define AU4 uint4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASU1 int + #define ASU2 int2 + #define ASU3 int3 + #define ASU4 int4 + #endif +//============================================================================================================================== + #define AF1_AU1(x) asfloat(AU1(x)) + #define AF2_AU2(x) asfloat(AU2(x)) + #define AF3_AU3(x) asfloat(AU3(x)) + #define AF4_AU4(x) asfloat(AU4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AU1_AF1(x) asuint(AF1(x)) + #define AU2_AF2(x) asuint(AF2(x)) + #define AU3_AF3(x) asuint(AF3(x)) + #define AU4_AF4(x) asuint(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH1_AF1_x(AF1 a){return f32tof16(a);} + #define AU1_AH1_AF1(a) AU1_AH1_AF1_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH2_AF2_x(AF2 a){return f32tof16(a.x)|(f32tof16(a.y)<<16);} + #define AU1_AH2_AF2(a) AU1_AH2_AF2_x(AF2(a)) + #define AU1_AB4Unorm_AF4(x) D3DCOLORtoUBYTE4(AF4(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AF2 AF2_AH2_AU1_x(AU1 x){return AF2(f16tof32(x&0xFFFF),f16tof32(x>>16));} + #define AF2_AH2_AU1(x) AF2_AH2_AU1_x(AU1(x)) +//============================================================================================================================== + AF1 AF1_x(AF1 a){return AF1(a);} + AF2 AF2_x(AF1 a){return AF2(a,a);} + AF3 AF3_x(AF1 a){return AF3(a,a,a);} + AF4 AF4_x(AF1 a){return AF4(a,a,a,a);} + #define AF1_(a) AF1_x(AF1(a)) + #define AF2_(a) AF2_x(AF1(a)) + #define AF3_(a) AF3_x(AF1(a)) + #define AF4_(a) AF4_x(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_x(AU1 a){return AU1(a);} + AU2 AU2_x(AU1 a){return AU2(a,a);} + AU3 AU3_x(AU1 a){return AU3(a,a,a);} + AU4 AU4_x(AU1 a){return AU4(a,a,a,a);} + #define AU1_(a) AU1_x(AU1(a)) + #define AU2_(a) AU2_x(AU1(a)) + #define AU3_(a) AU3_x(AU1(a)) + #define AU4_(a) AU4_x(AU1(a)) +//============================================================================================================================== + AU1 AAbsSU1(AU1 a){return AU1(abs(ASU1(a)));} + AU2 AAbsSU2(AU2 a){return AU2(abs(ASU2(a)));} + AU3 AAbsSU3(AU3 a){return AU3(abs(ASU3(a)));} + AU4 AAbsSU4(AU4 a){return AU4(abs(ASU4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABfe(AU1 src,AU1 off,AU1 bits){AU1 mask=(1u<>off)&mask;} + AU1 ABfi(AU1 src,AU1 ins,AU1 mask){return (ins&mask)|(src&(~mask));} + AU1 ABfiM(AU1 src,AU1 ins,AU1 bits){AU1 mask=(1u<>ASU1(b));} + AU2 AShrSU2(AU2 a,AU2 b){return AU2(ASU2(a)>>ASU2(b));} + AU3 AShrSU3(AU3 a,AU3 b){return AU3(ASU3(a)>>ASU3(b));} + AU4 AShrSU4(AU4 a,AU4 b){return AU4(ASU4(a)>>ASU4(b));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL BYTE +//============================================================================================================================== + #ifdef A_BYTE + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL HALF +//============================================================================================================================== + #ifdef A_HALF + #ifdef A_HLSL_6_2 + #define AH1 float16_t + #define AH2 float16_t2 + #define AH3 float16_t3 + #define AH4 float16_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 uint16_t + #define AW2 uint16_t2 + #define AW3 uint16_t3 + #define AW4 uint16_t4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 int16_t + #define ASW2 int16_t2 + #define ASW3 int16_t3 + #define ASW4 int16_t4 + #else + #define AH1 min16float + #define AH2 min16float2 + #define AH3 min16float3 + #define AH4 min16float4 +//------------------------------------------------------------------------------------------------------------------------------ + #define AW1 min16uint + #define AW2 min16uint2 + #define AW3 min16uint3 + #define AW4 min16uint4 +//------------------------------------------------------------------------------------------------------------------------------ + #define ASW1 min16int + #define ASW2 min16int2 + #define ASW3 min16int3 + #define ASW4 min16int4 + #endif +//============================================================================================================================== + // Need to use manual unpack to get optimal execution (don't use packed types in buffers directly). + // Unpack requires this pattern: https://gpuopen.com/first-steps-implementing-fp16/ + AH2 AH2_AU1_x(AU1 x){AF2 t=f16tof32(AU2(x&0xFFFF,x>>16));return AH2(t);} + AH4 AH4_AU2_x(AU2 x){return AH4(AH2_AU1_x(x.x),AH2_AU1_x(x.y));} + AW2 AW2_AU1_x(AU1 x){AU2 t=AU2(x&0xFFFF,x>>16);return AW2(t);} + AW4 AW4_AU2_x(AU2 x){return AW4(AW2_AU1_x(x.x),AW2_AU1_x(x.y));} + #define AH2_AU1(x) AH2_AU1_x(AU1(x)) + #define AH4_AU2(x) AH4_AU2_x(AU2(x)) + #define AW2_AU1(x) AW2_AU1_x(AU1(x)) + #define AW4_AU2(x) AW4_AU2_x(AU2(x)) +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AU1_AH2_x(AH2 x){return f32tof16(x.x)+(f32tof16(x.y)<<16);} + AU2 AU2_AH4_x(AH4 x){return AU2(AU1_AH2_x(x.xy),AU1_AH2_x(x.zw));} + AU1 AU1_AW2_x(AW2 x){return AU1(x.x)+(AU1(x.y)<<16);} + AU2 AU2_AW4_x(AW4 x){return AU2(AU1_AW2_x(x.xy),AU1_AW2_x(x.zw));} + #define AU1_AH2(x) AU1_AH2_x(AH2(x)) + #define AU2_AH4(x) AU2_AH4_x(AH4(x)) + #define AU1_AW2(x) AU1_AW2_x(AW2(x)) + #define AU2_AW4(x) AU2_AW4_x(AW4(x)) +//============================================================================================================================== + #if defined(A_HLSL_6_2) && !defined(A_NO_16_BIT_CAST) + #define AW1_AH1(x) asuint16(x) + #define AW2_AH2(x) asuint16(x) + #define AW3_AH3(x) asuint16(x) + #define AW4_AH4(x) asuint16(x) + #else + #define AW1_AH1(a) AW1(f32tof16(AF1(a))) + #define AW2_AH2(a) AW2(AW1_AH1((a).x),AW1_AH1((a).y)) + #define AW3_AH3(a) AW3(AW1_AH1((a).x),AW1_AH1((a).y),AW1_AH1((a).z)) + #define AW4_AH4(a) AW4(AW1_AH1((a).x),AW1_AH1((a).y),AW1_AH1((a).z),AW1_AH1((a).w)) + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #if defined(A_HLSL_6_2) && !defined(A_NO_16_BIT_CAST) + #define AH1_AW1(x) asfloat16(x) + #define AH2_AW2(x) asfloat16(x) + #define AH3_AW3(x) asfloat16(x) + #define AH4_AW4(x) asfloat16(x) + #else + #define AH1_AW1(a) AH1(f16tof32(AU1(a))) + #define AH2_AW2(a) AH2(AH1_AW1((a).x),AH1_AW1((a).y)) + #define AH3_AW3(a) AH3(AH1_AW1((a).x),AH1_AW1((a).y),AH1_AW1((a).z)) + #define AH4_AW4(a) AH4(AH1_AW1((a).x),AH1_AW1((a).y),AH1_AW1((a).z),AH1_AW1((a).w)) + #endif +//============================================================================================================================== + AH1 AH1_x(AH1 a){return AH1(a);} + AH2 AH2_x(AH1 a){return AH2(a,a);} + AH3 AH3_x(AH1 a){return AH3(a,a,a);} + AH4 AH4_x(AH1 a){return AH4(a,a,a,a);} + #define AH1_(a) AH1_x(AH1(a)) + #define AH2_(a) AH2_x(AH1(a)) + #define AH3_(a) AH3_x(AH1(a)) + #define AH4_(a) AH4_x(AH1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AW1_x(AW1 a){return AW1(a);} + AW2 AW2_x(AW1 a){return AW2(a,a);} + AW3 AW3_x(AW1 a){return AW3(a,a,a);} + AW4 AW4_x(AW1 a){return AW4(a,a,a,a);} + #define AW1_(a) AW1_x(AW1(a)) + #define AW2_(a) AW2_x(AW1(a)) + #define AW3_(a) AW3_x(AW1(a)) + #define AW4_(a) AW4_x(AW1(a)) +//============================================================================================================================== + AW1 AAbsSW1(AW1 a){return AW1(abs(ASW1(a)));} + AW2 AAbsSW2(AW2 a){return AW2(abs(ASW2(a)));} + AW3 AAbsSW3(AW3 a){return AW3(abs(ASW3(a)));} + AW4 AAbsSW4(AW4 a){return AW4(abs(ASW4(a)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AClampH1(AH1 x,AH1 n,AH1 m){return max(n,min(x,m));} + AH2 AClampH2(AH2 x,AH2 n,AH2 m){return max(n,min(x,m));} + AH3 AClampH3(AH3 x,AH3 n,AH3 m){return max(n,min(x,m));} + AH4 AClampH4(AH4 x,AH4 n,AH4 m){return max(n,min(x,m));} +//------------------------------------------------------------------------------------------------------------------------------ + // V_FRACT_F16 (note DX frac() is different). + AH1 AFractH1(AH1 x){return x-floor(x);} + AH2 AFractH2(AH2 x){return x-floor(x);} + AH3 AFractH3(AH3 x){return x-floor(x);} + AH4 AFractH4(AH4 x){return x-floor(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ALerpH1(AH1 x,AH1 y,AH1 a){return lerp(x,y,a);} + AH2 ALerpH2(AH2 x,AH2 y,AH2 a){return lerp(x,y,a);} + AH3 ALerpH3(AH3 x,AH3 y,AH3 a){return lerp(x,y,a);} + AH4 ALerpH4(AH4 x,AH4 y,AH4 a){return lerp(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AMax3H1(AH1 x,AH1 y,AH1 z){return max(x,max(y,z));} + AH2 AMax3H2(AH2 x,AH2 y,AH2 z){return max(x,max(y,z));} + AH3 AMax3H3(AH3 x,AH3 y,AH3 z){return max(x,max(y,z));} + AH4 AMax3H4(AH4 x,AH4 y,AH4 z){return max(x,max(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMaxSW1(AW1 a,AW1 b){return AW1(max(ASU1(a),ASU1(b)));} + AW2 AMaxSW2(AW2 a,AW2 b){return AW2(max(ASU2(a),ASU2(b)));} + AW3 AMaxSW3(AW3 a,AW3 b){return AW3(max(ASU3(a),ASU3(b)));} + AW4 AMaxSW4(AW4 a,AW4 b){return AW4(max(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AMin3H1(AH1 x,AH1 y,AH1 z){return min(x,min(y,z));} + AH2 AMin3H2(AH2 x,AH2 y,AH2 z){return min(x,min(y,z));} + AH3 AMin3H3(AH3 x,AH3 y,AH3 z){return min(x,min(y,z));} + AH4 AMin3H4(AH4 x,AH4 y,AH4 z){return min(x,min(y,z));} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AMinSW1(AW1 a,AW1 b){return AW1(min(ASU1(a),ASU1(b)));} + AW2 AMinSW2(AW2 a,AW2 b){return AW2(min(ASU2(a),ASU2(b)));} + AW3 AMinSW3(AW3 a,AW3 b){return AW3(min(ASU3(a),ASU3(b)));} + AW4 AMinSW4(AW4 a,AW4 b){return AW4(min(ASU4(a),ASU4(b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARcpH1(AH1 x){return rcp(x);} + AH2 ARcpH2(AH2 x){return rcp(x);} + AH3 ARcpH3(AH3 x){return rcp(x);} + AH4 ARcpH4(AH4 x){return rcp(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ARsqH1(AH1 x){return rsqrt(x);} + AH2 ARsqH2(AH2 x){return rsqrt(x);} + AH3 ARsqH3(AH3 x){return rsqrt(x);} + AH4 ARsqH4(AH4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASatH1(AH1 x){return saturate(x);} + AH2 ASatH2(AH2 x){return saturate(x);} + AH3 ASatH3(AH3 x){return saturate(x);} + AH4 ASatH4(AH4 x){return saturate(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AShrSW1(AW1 a,AW1 b){return AW1(ASW1(a)>>ASW1(b));} + AW2 AShrSW2(AW2 a,AW2 b){return AW2(ASW2(a)>>ASW2(b));} + AW3 AShrSW3(AW3 a,AW3 b){return AW3(ASW3(a)>>ASW3(b));} + AW4 AShrSW4(AW4 a,AW4 b){return AW4(ASW4(a)>>ASW4(b));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HLSL DOUBLE +//============================================================================================================================== + #ifdef A_DUBL + #ifdef A_HLSL_6_2 + #define AD1 float64_t + #define AD2 float64_t2 + #define AD3 float64_t3 + #define AD4 float64_t4 + #else + #define AD1 double + #define AD2 double2 + #define AD3 double3 + #define AD4 double4 + #endif +//------------------------------------------------------------------------------------------------------------------------------ + AD1 AD1_x(AD1 a){return AD1(a);} + AD2 AD2_x(AD1 a){return AD2(a,a);} + AD3 AD3_x(AD1 a){return AD3(a,a,a);} + AD4 AD4_x(AD1 a){return AD4(a,a,a,a);} + #define AD1_(a) AD1_x(AD1(a)) + #define AD2_(a) AD2_x(AD1(a)) + #define AD3_(a) AD3_x(AD1(a)) + #define AD4_(a) AD4_x(AD1(a)) +//============================================================================================================================== + AD1 AFractD1(AD1 a){return a-floor(a);} + AD2 AFractD2(AD2 a){return a-floor(a);} + AD3 AFractD3(AD3 a){return a-floor(a);} + AD4 AFractD4(AD4 a){return a-floor(a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ALerpD1(AD1 x,AD1 y,AD1 a){return lerp(x,y,a);} + AD2 ALerpD2(AD2 x,AD2 y,AD2 a){return lerp(x,y,a);} + AD3 ALerpD3(AD3 x,AD3 y,AD3 a){return lerp(x,y,a);} + AD4 ALerpD4(AD4 x,AD4 y,AD4 a){return lerp(x,y,a);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARcpD1(AD1 x){return rcp(x);} + AD2 ARcpD2(AD2 x){return rcp(x);} + AD3 ARcpD3(AD3 x){return rcp(x);} + AD4 ARcpD4(AD4 x){return rcp(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ARsqD1(AD1 x){return rsqrt(x);} + AD2 ARsqD2(AD2 x){return rsqrt(x);} + AD3 ARsqD3(AD3 x){return rsqrt(x);} + AD4 ARsqD4(AD4 x){return rsqrt(x);} +//------------------------------------------------------------------------------------------------------------------------------ + AD1 ASatD1(AD1 x){return saturate(x);} + AD2 ASatD2(AD2 x){return saturate(x);} + AD3 ASatD3(AD3 x){return saturate(x);} + AD4 ASatD4(AD4 x){return saturate(x);} + #endif +//============================================================================================================================== +// HLSL WAVE +//============================================================================================================================== + #ifdef A_WAVE + // Where 'x' must be a compile time literal. + AF1 AWaveXorF1(AF1 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AF2 AWaveXorF2(AF2 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AF3 AWaveXorF3(AF3 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AF4 AWaveXorF4(AF4 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU1 AWaveXorU1(AU1 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU2 AWaveXorU1(AU2 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU3 AWaveXorU1(AU3 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} + AU4 AWaveXorU1(AU4 v,AU1 x){return WaveReadLaneAt(v,WaveGetLaneIndex()^x);} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + AH2 AWaveXorH2(AH2 v,AU1 x){return AH2_AU1(WaveReadLaneAt(AU1_AH2(v),WaveGetLaneIndex()^x));} + AH4 AWaveXorH4(AH4 v,AU1 x){return AH4_AU2(WaveReadLaneAt(AU2_AH4(v),WaveGetLaneIndex()^x));} + AW2 AWaveXorW2(AW2 v,AU1 x){return AW2_AU1(WaveReadLaneAt(AU1_AW2(v),WaveGetLaneIndex()^x));} + AW4 AWaveXorW4(AW4 v,AU1 x){return AW4_AU1(WaveReadLaneAt(AU1_AW4(v),WaveGetLaneIndex()^x));} + #endif + #endif +//============================================================================================================================== +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GPU COMMON +// +// +//============================================================================================================================== +#ifdef A_GPU + // Negative and positive infinity. + #define A_INFP_F AF1_AU1(0x7f800000u) + #define A_INFN_F AF1_AU1(0xff800000u) +//------------------------------------------------------------------------------------------------------------------------------ + // Copy sign from 's' to positive 'd'. + AF1 ACpySgnF1(AF1 d,AF1 s){return AF1_AU1(AU1_AF1(d)|(AU1_AF1(s)&AU1_(0x80000000u)));} + AF2 ACpySgnF2(AF2 d,AF2 s){return AF2_AU2(AU2_AF2(d)|(AU2_AF2(s)&AU2_(0x80000000u)));} + AF3 ACpySgnF3(AF3 d,AF3 s){return AF3_AU3(AU3_AF3(d)|(AU3_AF3(s)&AU3_(0x80000000u)));} + AF4 ACpySgnF4(AF4 d,AF4 s){return AF4_AU4(AU4_AF4(d)|(AU4_AF4(s)&AU4_(0x80000000u)));} +//------------------------------------------------------------------------------------------------------------------------------ + // Single operation to return (useful to create a mask to use in lerp for branch free logic), + // m=NaN := 0 + // m>=0 := 0 + // m<0 := 1 + // Uses the following useful floating point logic, + // saturate(+a*(-INF)==-INF) := 0 + // saturate( 0*(-INF)== NaN) := 0 + // saturate(-a*(-INF)==+INF) := 1 + AF1 ASignedF1(AF1 m){return ASatF1(m*AF1_(A_INFN_F));} + AF2 ASignedF2(AF2 m){return ASatF2(m*AF2_(A_INFN_F));} + AF3 ASignedF3(AF3 m){return ASatF3(m*AF3_(A_INFN_F));} + AF4 ASignedF4(AF4 m){return ASatF4(m*AF4_(A_INFN_F));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AGtZeroF1(AF1 m){return ASatF1(m*AF1_(A_INFP_F));} + AF2 AGtZeroF2(AF2 m){return ASatF2(m*AF2_(A_INFP_F));} + AF3 AGtZeroF3(AF3 m){return ASatF3(m*AF3_(A_INFP_F));} + AF4 AGtZeroF4(AF4 m){return ASatF4(m*AF4_(A_INFP_F));} +//============================================================================================================================== + #ifdef A_HALF + #ifdef A_HLSL_6_2 + #define A_INFP_H AH1_AW1((uint16_t)0x7c00u) + #define A_INFN_H AH1_AW1((uint16_t)0xfc00u) + #else + #define A_INFP_H AH1_AW1(0x7c00u) + #define A_INFN_H AH1_AW1(0xfc00u) + #endif + +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ACpySgnH1(AH1 d,AH1 s){return AH1_AW1(AW1_AH1(d)|(AW1_AH1(s)&AW1_(0x8000u)));} + AH2 ACpySgnH2(AH2 d,AH2 s){return AH2_AW2(AW2_AH2(d)|(AW2_AH2(s)&AW2_(0x8000u)));} + AH3 ACpySgnH3(AH3 d,AH3 s){return AH3_AW3(AW3_AH3(d)|(AW3_AH3(s)&AW3_(0x8000u)));} + AH4 ACpySgnH4(AH4 d,AH4 s){return AH4_AW4(AW4_AH4(d)|(AW4_AH4(s)&AW4_(0x8000u)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASignedH1(AH1 m){return ASatH1(m*AH1_(A_INFN_H));} + AH2 ASignedH2(AH2 m){return ASatH2(m*AH2_(A_INFN_H));} + AH3 ASignedH3(AH3 m){return ASatH3(m*AH3_(A_INFN_H));} + AH4 ASignedH4(AH4 m){return ASatH4(m*AH4_(A_INFN_H));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AGtZeroH1(AH1 m){return ASatH1(m*AH1_(A_INFP_H));} + AH2 AGtZeroH2(AH2 m){return ASatH2(m*AH2_(A_INFP_H));} + AH3 AGtZeroH3(AH3 m){return ASatH3(m*AH3_(A_INFP_H));} + AH4 AGtZeroH4(AH4 m){return ASatH4(m*AH4_(A_INFP_H));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [FIS] FLOAT INTEGER SORTABLE +//------------------------------------------------------------------------------------------------------------------------------ +// Float to integer sortable. +// - If sign bit=0, flip the sign bit (positives). +// - If sign bit=1, flip all bits (negatives). +// Integer sortable to float. +// - If sign bit=1, flip the sign bit (positives). +// - If sign bit=0, flip all bits (negatives). +// Has nice side effects. +// - Larger integers are more positive values. +// - Float zero is mapped to center of integers (so clear to integer zero is a nice default for atomic max usage). +// Burns 3 ops for conversion {shift,or,xor}. +//============================================================================================================================== + AU1 AFisToU1(AU1 x){return x^(( AShrSU1(x,AU1_(31)))|AU1_(0x80000000));} + AU1 AFisFromU1(AU1 x){return x^((~AShrSU1(x,AU1_(31)))|AU1_(0x80000000));} +//------------------------------------------------------------------------------------------------------------------------------ + // Just adjust high 16-bit value (useful when upper part of 32-bit word is a 16-bit float value). + AU1 AFisToHiU1(AU1 x){return x^(( AShrSU1(x,AU1_(15)))|AU1_(0x80000000));} + AU1 AFisFromHiU1(AU1 x){return x^((~AShrSU1(x,AU1_(15)))|AU1_(0x80000000));} +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + AW1 AFisToW1(AW1 x){return x^(( AShrSW1(x,AW1_(15)))|AW1_(0x8000));} + AW1 AFisFromW1(AW1 x){return x^((~AShrSW1(x,AW1_(15)))|AW1_(0x8000));} +//------------------------------------------------------------------------------------------------------------------------------ + AW2 AFisToW2(AW2 x){return x^(( AShrSW2(x,AW2_(15)))|AW2_(0x8000));} + AW2 AFisFromW2(AW2 x){return x^((~AShrSW2(x,AW2_(15)))|AW2_(0x8000));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [PERM] V_PERM_B32 +//------------------------------------------------------------------------------------------------------------------------------ +// Support for V_PERM_B32 started in the 3rd generation of GCN. +//------------------------------------------------------------------------------------------------------------------------------ +// yyyyxxxx - The 'i' input. +// 76543210 +// ======== +// HGFEDCBA - Naming on permutation. +//------------------------------------------------------------------------------------------------------------------------------ +// TODO +// ==== +// - Make sure compiler optimizes this. +//============================================================================================================================== + #ifdef A_HALF + AU1 APerm0E0A(AU2 i){return((i.x )&0xffu)|((i.y<<16)&0xff0000u);} + AU1 APerm0F0B(AU2 i){return((i.x>> 8)&0xffu)|((i.y<< 8)&0xff0000u);} + AU1 APerm0G0C(AU2 i){return((i.x>>16)&0xffu)|((i.y )&0xff0000u);} + AU1 APerm0H0D(AU2 i){return((i.x>>24)&0xffu)|((i.y>> 8)&0xff0000u);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 APermHGFA(AU2 i){return((i.x )&0x000000ffu)|(i.y&0xffffff00u);} + AU1 APermHGFC(AU2 i){return((i.x>>16)&0x000000ffu)|(i.y&0xffffff00u);} + AU1 APermHGAE(AU2 i){return((i.x<< 8)&0x0000ff00u)|(i.y&0xffff00ffu);} + AU1 APermHGCE(AU2 i){return((i.x>> 8)&0x0000ff00u)|(i.y&0xffff00ffu);} + AU1 APermHAFE(AU2 i){return((i.x<<16)&0x00ff0000u)|(i.y&0xff00ffffu);} + AU1 APermHCFE(AU2 i){return((i.x )&0x00ff0000u)|(i.y&0xff00ffffu);} + AU1 APermAGFE(AU2 i){return((i.x<<24)&0xff000000u)|(i.y&0x00ffffffu);} + AU1 APermCGFE(AU2 i){return((i.x<< 8)&0xff000000u)|(i.y&0x00ffffffu);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 APermGCEA(AU2 i){return((i.x)&0x00ff00ffu)|((i.y<<8)&0xff00ff00u);} + AU1 APermGECA(AU2 i){return(((i.x)&0xffu)|((i.x>>8)&0xff00u)|((i.y<<16)&0xff0000u)|((i.y<<8)&0xff000000u));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [BUC] BYTE UNSIGNED CONVERSION +//------------------------------------------------------------------------------------------------------------------------------ +// Designed to use the optimal conversion, enables the scaling to possibly be factored into other computation. +// Works on a range of {0 to A_BUC_<32,16>}, for <32-bit, and 16-bit> respectively. +//------------------------------------------------------------------------------------------------------------------------------ +// OPCODE NOTES +// ============ +// GCN does not do UNORM or SNORM for bytes in opcodes. +// - V_CVT_F32_UBYTE{0,1,2,3} - Unsigned byte to float. +// - V_CVT_PKACC_U8_F32 - Float to unsigned byte (does bit-field insert into 32-bit integer). +// V_PERM_B32 does byte packing with ability to zero fill bytes as well. +// - Can pull out byte values from two sources, and zero fill upper 8-bits of packed hi and lo. +//------------------------------------------------------------------------------------------------------------------------------ +// BYTE : FLOAT - ABuc{0,1,2,3}{To,From}U1() - Designed for V_CVT_F32_UBYTE* and V_CVT_PKACCUM_U8_F32 ops. +// ==== ===== +// 0 : 0 +// 1 : 1 +// ... +// 255 : 255 +// : 256 (just outside the encoding range) +//------------------------------------------------------------------------------------------------------------------------------ +// BYTE : FLOAT - ABuc{0,1,2,3}{To,From}U2() - Designed for 16-bit denormal tricks and V_PERM_B32. +// ==== ===== +// 0 : 0 +// 1 : 1/512 +// 2 : 1/256 +// ... +// 64 : 1/8 +// 128 : 1/4 +// 255 : 255/512 +// : 1/2 (just outside the encoding range) +//------------------------------------------------------------------------------------------------------------------------------ +// OPTIMAL IMPLEMENTATIONS ON AMD ARCHITECTURES +// ============================================ +// r=ABuc0FromU1(i) +// V_CVT_F32_UBYTE0 r,i +// -------------------------------------------- +// r=ABuc0ToU1(d,i) +// V_CVT_PKACCUM_U8_F32 r,i,0,d +// -------------------------------------------- +// d=ABuc0FromU2(i) +// Where 'k0' is an SGPR with 0x0E0A +// Where 'k1' is an SGPR with {32768.0} packed into the lower 16-bits +// V_PERM_B32 d,i.x,i.y,k0 +// V_PK_FMA_F16 d,d,k1.x,0 +// -------------------------------------------- +// r=ABuc0ToU2(d,i) +// Where 'k0' is an SGPR with {1.0/32768.0} packed into the lower 16-bits +// Where 'k1' is an SGPR with 0x???? +// Where 'k2' is an SGPR with 0x???? +// V_PK_FMA_F16 i,i,k0.x,0 +// V_PERM_B32 r.x,i,i,k1 +// V_PERM_B32 r.y,i,i,k2 +//============================================================================================================================== + // Peak range for 32-bit and 16-bit operations. + #define A_BUC_32 (255.0) + #define A_BUC_16 (255.0/512.0) +//============================================================================================================================== + #if 1 + // Designed to be one V_CVT_PKACCUM_U8_F32. + // The extra min is required to pattern match to V_CVT_PKACCUM_U8_F32. + AU1 ABuc0ToU1(AU1 d,AF1 i){return (d&0xffffff00u)|((min(AU1(i),255u) )&(0x000000ffu));} + AU1 ABuc1ToU1(AU1 d,AF1 i){return (d&0xffff00ffu)|((min(AU1(i),255u)<< 8)&(0x0000ff00u));} + AU1 ABuc2ToU1(AU1 d,AF1 i){return (d&0xff00ffffu)|((min(AU1(i),255u)<<16)&(0x00ff0000u));} + AU1 ABuc3ToU1(AU1 d,AF1 i){return (d&0x00ffffffu)|((min(AU1(i),255u)<<24)&(0xff000000u));} +//------------------------------------------------------------------------------------------------------------------------------ + // Designed to be one V_CVT_F32_UBYTE*. + AF1 ABuc0FromU1(AU1 i){return AF1((i )&255u);} + AF1 ABuc1FromU1(AU1 i){return AF1((i>> 8)&255u);} + AF1 ABuc2FromU1(AU1 i){return AF1((i>>16)&255u);} + AF1 ABuc3FromU1(AU1 i){return AF1((i>>24)&255u);} + #endif +//============================================================================================================================== + #ifdef A_HALF + // Takes {x0,x1} and {y0,y1} and builds {{x0,y0},{x1,y1}}. + AW2 ABuc01ToW2(AH2 x,AH2 y){x*=AH2_(1.0/32768.0);y*=AH2_(1.0/32768.0); + return AW2_AU1(APermGCEA(AU2(AU1_AW2(AW2_AH2(x)),AU1_AW2(AW2_AH2(y)))));} +//------------------------------------------------------------------------------------------------------------------------------ + // Designed for 3 ops to do SOA to AOS and conversion. + AU2 ABuc0ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermHGFA(AU2(d.x,b)),APermHGFC(AU2(d.y,b)));} + AU2 ABuc1ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermHGAE(AU2(d.x,b)),APermHGCE(AU2(d.y,b)));} + AU2 ABuc2ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermHAFE(AU2(d.x,b)),APermHCFE(AU2(d.y,b)));} + AU2 ABuc3ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0))); + return AU2(APermAGFE(AU2(d.x,b)),APermCGFE(AU2(d.y,b)));} +//------------------------------------------------------------------------------------------------------------------------------ + // Designed for 2 ops to do both AOS to SOA, and conversion. + AH2 ABuc0FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0E0A(i)))*AH2_(32768.0);} + AH2 ABuc1FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0F0B(i)))*AH2_(32768.0);} + AH2 ABuc2FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0G0C(i)))*AH2_(32768.0);} + AH2 ABuc3FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0H0D(i)))*AH2_(32768.0);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [BSC] BYTE SIGNED CONVERSION +//------------------------------------------------------------------------------------------------------------------------------ +// Similar to [BUC]. +// Works on a range of {-/+ A_BSC_<32,16>}, for <32-bit, and 16-bit> respectively. +//------------------------------------------------------------------------------------------------------------------------------ +// ENCODING (without zero-based encoding) +// ======== +// 0 = unused (can be used to mean something else) +// 1 = lowest value +// 128 = exact zero center (zero based encoding +// 255 = highest value +//------------------------------------------------------------------------------------------------------------------------------ +// Zero-based [Zb] flips the MSB bit of the byte (making 128 "exact zero" actually zero). +// This is useful if there is a desire for cleared values to decode as zero. +//------------------------------------------------------------------------------------------------------------------------------ +// BYTE : FLOAT - ABsc{0,1,2,3}{To,From}U2() - Designed for 16-bit denormal tricks and V_PERM_B32. +// ==== ===== +// 0 : -127/512 (unused) +// 1 : -126/512 +// 2 : -125/512 +// ... +// 128 : 0 +// ... +// 255 : 127/512 +// : 1/4 (just outside the encoding range) +//============================================================================================================================== + // Peak range for 32-bit and 16-bit operations. + #define A_BSC_32 (127.0) + #define A_BSC_16 (127.0/512.0) +//============================================================================================================================== + #if 1 + AU1 ABsc0ToU1(AU1 d,AF1 i){return (d&0xffffff00u)|((min(AU1(i+128.0),255u) )&(0x000000ffu));} + AU1 ABsc1ToU1(AU1 d,AF1 i){return (d&0xffff00ffu)|((min(AU1(i+128.0),255u)<< 8)&(0x0000ff00u));} + AU1 ABsc2ToU1(AU1 d,AF1 i){return (d&0xff00ffffu)|((min(AU1(i+128.0),255u)<<16)&(0x00ff0000u));} + AU1 ABsc3ToU1(AU1 d,AF1 i){return (d&0x00ffffffu)|((min(AU1(i+128.0),255u)<<24)&(0xff000000u));} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 ABsc0ToZbU1(AU1 d,AF1 i){return ((d&0xffffff00u)|((min(AU1(trunc(i)+128.0),255u) )&(0x000000ffu)))^0x00000080u;} + AU1 ABsc1ToZbU1(AU1 d,AF1 i){return ((d&0xffff00ffu)|((min(AU1(trunc(i)+128.0),255u)<< 8)&(0x0000ff00u)))^0x00008000u;} + AU1 ABsc2ToZbU1(AU1 d,AF1 i){return ((d&0xff00ffffu)|((min(AU1(trunc(i)+128.0),255u)<<16)&(0x00ff0000u)))^0x00800000u;} + AU1 ABsc3ToZbU1(AU1 d,AF1 i){return ((d&0x00ffffffu)|((min(AU1(trunc(i)+128.0),255u)<<24)&(0xff000000u)))^0x80000000u;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 ABsc0FromU1(AU1 i){return AF1((i )&255u)-128.0;} + AF1 ABsc1FromU1(AU1 i){return AF1((i>> 8)&255u)-128.0;} + AF1 ABsc2FromU1(AU1 i){return AF1((i>>16)&255u)-128.0;} + AF1 ABsc3FromU1(AU1 i){return AF1((i>>24)&255u)-128.0;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 ABsc0FromZbU1(AU1 i){return AF1(((i )&255u)^0x80u)-128.0;} + AF1 ABsc1FromZbU1(AU1 i){return AF1(((i>> 8)&255u)^0x80u)-128.0;} + AF1 ABsc2FromZbU1(AU1 i){return AF1(((i>>16)&255u)^0x80u)-128.0;} + AF1 ABsc3FromZbU1(AU1 i){return AF1(((i>>24)&255u)^0x80u)-128.0;} + #endif +//============================================================================================================================== + #ifdef A_HALF + // Takes {x0,x1} and {y0,y1} and builds {{x0,y0},{x1,y1}}. + AW2 ABsc01ToW2(AH2 x,AH2 y){x=x*AH2_(1.0/32768.0)+AH2_(0.25/32768.0);y=y*AH2_(1.0/32768.0)+AH2_(0.25/32768.0); + return AW2_AU1(APermGCEA(AU2(AU1_AW2(AW2_AH2(x)),AU1_AW2(AW2_AH2(y)))));} +//------------------------------------------------------------------------------------------------------------------------------ + AU2 ABsc0ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermHGFA(AU2(d.x,b)),APermHGFC(AU2(d.y,b)));} + AU2 ABsc1ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermHGAE(AU2(d.x,b)),APermHGCE(AU2(d.y,b)));} + AU2 ABsc2ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermHAFE(AU2(d.x,b)),APermHCFE(AU2(d.y,b)));} + AU2 ABsc3ToU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0))); + return AU2(APermAGFE(AU2(d.x,b)),APermCGFE(AU2(d.y,b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AU2 ABsc0ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermHGFA(AU2(d.x,b)),APermHGFC(AU2(d.y,b)));} + AU2 ABsc1ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermHGAE(AU2(d.x,b)),APermHGCE(AU2(d.y,b)));} + AU2 ABsc2ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermHAFE(AU2(d.x,b)),APermHCFE(AU2(d.y,b)));} + AU2 ABsc3ToZbU2(AU2 d,AH2 i){AU1 b=AU1_AW2(AW2_AH2(i*AH2_(1.0/32768.0)+AH2_(0.25/32768.0)))^0x00800080u; + return AU2(APermAGFE(AU2(d.x,b)),APermCGFE(AU2(d.y,b)));} +//------------------------------------------------------------------------------------------------------------------------------ + AH2 ABsc0FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0E0A(i)))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc1FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0F0B(i)))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc2FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0G0C(i)))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc3FromU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0H0D(i)))*AH2_(32768.0)-AH2_(0.25);} +//------------------------------------------------------------------------------------------------------------------------------ + AH2 ABsc0FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0E0A(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc1FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0F0B(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc2FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0G0C(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + AH2 ABsc3FromZbU2(AU2 i){return AH2_AW2(AW2_AU1(APerm0H0D(i)^0x00800080u))*AH2_(32768.0)-AH2_(0.25);} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// HALF APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// These support only positive inputs. +// Did not see value yet in specialization for range. +// Using quick testing, ended up mostly getting the same "best" approximation for various ranges. +// With hardware that can co-execute transcendentals, the value in approximations could be less than expected. +// However from a latency perspective, if execution of a transcendental is 4 clk, with no packed support, -> 8 clk total. +// And co-execution would require a compiler interleaving a lot of independent work for packed usage. +//------------------------------------------------------------------------------------------------------------------------------ +// The one Newton Raphson iteration form of rsq() was skipped (requires 6 ops total). +// Same with sqrt(), as this could be x*rsq() (7 ops). +//============================================================================================================================== + #ifdef A_HALF + // Minimize squared error across full positive range, 2 ops. + // The 0x1de2 based approximation maps {0 to 1} input maps to < 1 output. + AH1 APrxLoSqrtH1(AH1 a){return AH1_AW1((AW1_AH1(a)>>AW1_(1))+AW1_(0x1de2));} + AH2 APrxLoSqrtH2(AH2 a){return AH2_AW2((AW2_AH2(a)>>AW2_(1))+AW2_(0x1de2));} + AH3 APrxLoSqrtH3(AH3 a){return AH3_AW3((AW3_AH3(a)>>AW3_(1))+AW3_(0x1de2));} + AH4 APrxLoSqrtH4(AH4 a){return AH4_AW4((AW4_AH4(a)>>AW4_(1))+AW4_(0x1de2));} +//------------------------------------------------------------------------------------------------------------------------------ + // Lower precision estimation, 1 op. + // Minimize squared error across {smallest normal to 16384.0}. + AH1 APrxLoRcpH1(AH1 a){return AH1_AW1(AW1_(0x7784)-AW1_AH1(a));} + AH2 APrxLoRcpH2(AH2 a){return AH2_AW2(AW2_(0x7784)-AW2_AH2(a));} + AH3 APrxLoRcpH3(AH3 a){return AH3_AW3(AW3_(0x7784)-AW3_AH3(a));} + AH4 APrxLoRcpH4(AH4 a){return AH4_AW4(AW4_(0x7784)-AW4_AH4(a));} +//------------------------------------------------------------------------------------------------------------------------------ + // Medium precision estimation, one Newton Raphson iteration, 3 ops. + AH1 APrxMedRcpH1(AH1 a){AH1 b=AH1_AW1(AW1_(0x778d)-AW1_AH1(a));return b*(-b*a+AH1_(2.0));} + AH2 APrxMedRcpH2(AH2 a){AH2 b=AH2_AW2(AW2_(0x778d)-AW2_AH2(a));return b*(-b*a+AH2_(2.0));} + AH3 APrxMedRcpH3(AH3 a){AH3 b=AH3_AW3(AW3_(0x778d)-AW3_AH3(a));return b*(-b*a+AH3_(2.0));} + AH4 APrxMedRcpH4(AH4 a){AH4 b=AH4_AW4(AW4_(0x778d)-AW4_AH4(a));return b*(-b*a+AH4_(2.0));} +//------------------------------------------------------------------------------------------------------------------------------ + // Minimize squared error across {smallest normal to 16384.0}, 2 ops. + AH1 APrxLoRsqH1(AH1 a){return AH1_AW1(AW1_(0x59a3)-(AW1_AH1(a)>>AW1_(1)));} + AH2 APrxLoRsqH2(AH2 a){return AH2_AW2(AW2_(0x59a3)-(AW2_AH2(a)>>AW2_(1)));} + AH3 APrxLoRsqH3(AH3 a){return AH3_AW3(AW3_(0x59a3)-(AW3_AH3(a)>>AW3_(1)));} + AH4 APrxLoRsqH4(AH4 a){return AH4_AW4(AW4_(0x59a3)-(AW4_AH4(a)>>AW4_(1)));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// FLOAT APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// Michal Drobot has an excellent presentation on these: "Low Level Optimizations For GCN", +// - Idea dates back to SGI, then to Quake 3, etc. +// - https://michaldrobot.files.wordpress.com/2014/05/gcn_alu_opt_digitaldragons2014.pdf +// - sqrt(x)=rsqrt(x)*x +// - rcp(x)=rsqrt(x)*rsqrt(x) for positive x +// - https://github.com/michaldrobot/ShaderFastLibs/blob/master/ShaderFastMathLib.h +//------------------------------------------------------------------------------------------------------------------------------ +// These below are from perhaps less complete searching for optimal. +// Used FP16 normal range for testing with +4096 32-bit step size for sampling error. +// So these match up well with the half approximations. +//============================================================================================================================== + AF1 APrxLoSqrtF1(AF1 a){return AF1_AU1((AU1_AF1(a)>>AU1_(1))+AU1_(0x1fbc4639));} + AF1 APrxLoRcpF1(AF1 a){return AF1_AU1(AU1_(0x7ef07ebb)-AU1_AF1(a));} + AF1 APrxMedRcpF1(AF1 a){AF1 b=AF1_AU1(AU1_(0x7ef19fff)-AU1_AF1(a));return b*(-b*a+AF1_(2.0));} + AF1 APrxLoRsqF1(AF1 a){return AF1_AU1(AU1_(0x5f347d74)-(AU1_AF1(a)>>AU1_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 APrxLoSqrtF2(AF2 a){return AF2_AU2((AU2_AF2(a)>>AU2_(1))+AU2_(0x1fbc4639));} + AF2 APrxLoRcpF2(AF2 a){return AF2_AU2(AU2_(0x7ef07ebb)-AU2_AF2(a));} + AF2 APrxMedRcpF2(AF2 a){AF2 b=AF2_AU2(AU2_(0x7ef19fff)-AU2_AF2(a));return b*(-b*a+AF2_(2.0));} + AF2 APrxLoRsqF2(AF2 a){return AF2_AU2(AU2_(0x5f347d74)-(AU2_AF2(a)>>AU2_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + AF3 APrxLoSqrtF3(AF3 a){return AF3_AU3((AU3_AF3(a)>>AU3_(1))+AU3_(0x1fbc4639));} + AF3 APrxLoRcpF3(AF3 a){return AF3_AU3(AU3_(0x7ef07ebb)-AU3_AF3(a));} + AF3 APrxMedRcpF3(AF3 a){AF3 b=AF3_AU3(AU3_(0x7ef19fff)-AU3_AF3(a));return b*(-b*a+AF3_(2.0));} + AF3 APrxLoRsqF3(AF3 a){return AF3_AU3(AU3_(0x5f347d74)-(AU3_AF3(a)>>AU3_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + AF4 APrxLoSqrtF4(AF4 a){return AF4_AU4((AU4_AF4(a)>>AU4_(1))+AU4_(0x1fbc4639));} + AF4 APrxLoRcpF4(AF4 a){return AF4_AU4(AU4_(0x7ef07ebb)-AU4_AF4(a));} + AF4 APrxMedRcpF4(AF4 a){AF4 b=AF4_AU4(AU4_(0x7ef19fff)-AU4_AF4(a));return b*(-b*a+AF4_(2.0));} + AF4 APrxLoRsqF4(AF4 a){return AF4_AU4(AU4_(0x5f347d74)-(AU4_AF4(a)>>AU4_(1)));} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PQ APPROXIMATIONS +//------------------------------------------------------------------------------------------------------------------------------ +// PQ is very close to x^(1/8). The functions below Use the fast float approximation method to do +// PQ<~>Gamma2 (4th power and fast 4th root) and PQ<~>Linear (8th power and fast 8th root). Maximum error is ~0.2%. +//============================================================================================================================== +// Helpers + AF1 Quart(AF1 a) { a = a * a; return a * a;} + AF1 Oct(AF1 a) { a = a * a; a = a * a; return a * a; } + AF2 Quart(AF2 a) { a = a * a; return a * a; } + AF2 Oct(AF2 a) { a = a * a; a = a * a; return a * a; } + AF3 Quart(AF3 a) { a = a * a; return a * a; } + AF3 Oct(AF3 a) { a = a * a; a = a * a; return a * a; } + AF4 Quart(AF4 a) { a = a * a; return a * a; } + AF4 Oct(AF4 a) { a = a * a; a = a * a; return a * a; } + //------------------------------------------------------------------------------------------------------------------------------ + AF1 APrxPQToGamma2(AF1 a) { return Quart(a); } + AF1 APrxPQToLinear(AF1 a) { return Oct(a); } + AF1 APrxLoGamma2ToPQ(AF1 a) { return AF1_AU1((AU1_AF1(a) >> AU1_(2)) + AU1_(0x2F9A4E46)); } + AF1 APrxMedGamma2ToPQ(AF1 a) { AF1 b = AF1_AU1((AU1_AF1(a) >> AU1_(2)) + AU1_(0x2F9A4E46)); AF1 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF1 APrxHighGamma2ToPQ(AF1 a) { return sqrt(sqrt(a)); } + AF1 APrxLoLinearToPQ(AF1 a) { return AF1_AU1((AU1_AF1(a) >> AU1_(3)) + AU1_(0x378D8723)); } + AF1 APrxMedLinearToPQ(AF1 a) { AF1 b = AF1_AU1((AU1_AF1(a) >> AU1_(3)) + AU1_(0x378D8723)); AF1 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF1 APrxHighLinearToPQ(AF1 a) { return sqrt(sqrt(sqrt(a))); } + //------------------------------------------------------------------------------------------------------------------------------ + AF2 APrxPQToGamma2(AF2 a) { return Quart(a); } + AF2 APrxPQToLinear(AF2 a) { return Oct(a); } + AF2 APrxLoGamma2ToPQ(AF2 a) { return AF2_AU2((AU2_AF2(a) >> AU2_(2)) + AU2_(0x2F9A4E46)); } + AF2 APrxMedGamma2ToPQ(AF2 a) { AF2 b = AF2_AU2((AU2_AF2(a) >> AU2_(2)) + AU2_(0x2F9A4E46)); AF2 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF2 APrxHighGamma2ToPQ(AF2 a) { return sqrt(sqrt(a)); } + AF2 APrxLoLinearToPQ(AF2 a) { return AF2_AU2((AU2_AF2(a) >> AU2_(3)) + AU2_(0x378D8723)); } + AF2 APrxMedLinearToPQ(AF2 a) { AF2 b = AF2_AU2((AU2_AF2(a) >> AU2_(3)) + AU2_(0x378D8723)); AF2 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF2 APrxHighLinearToPQ(AF2 a) { return sqrt(sqrt(sqrt(a))); } + //------------------------------------------------------------------------------------------------------------------------------ + AF3 APrxPQToGamma2(AF3 a) { return Quart(a); } + AF3 APrxPQToLinear(AF3 a) { return Oct(a); } + AF3 APrxLoGamma2ToPQ(AF3 a) { return AF3_AU3((AU3_AF3(a) >> AU3_(2)) + AU3_(0x2F9A4E46)); } + AF3 APrxMedGamma2ToPQ(AF3 a) { AF3 b = AF3_AU3((AU3_AF3(a) >> AU3_(2)) + AU3_(0x2F9A4E46)); AF3 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF3 APrxHighGamma2ToPQ(AF3 a) { return sqrt(sqrt(a)); } + AF3 APrxLoLinearToPQ(AF3 a) { return AF3_AU3((AU3_AF3(a) >> AU3_(3)) + AU3_(0x378D8723)); } + AF3 APrxMedLinearToPQ(AF3 a) { AF3 b = AF3_AU3((AU3_AF3(a) >> AU3_(3)) + AU3_(0x378D8723)); AF3 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF3 APrxHighLinearToPQ(AF3 a) { return sqrt(sqrt(sqrt(a))); } + //------------------------------------------------------------------------------------------------------------------------------ + AF4 APrxPQToGamma2(AF4 a) { return Quart(a); } + AF4 APrxPQToLinear(AF4 a) { return Oct(a); } + AF4 APrxLoGamma2ToPQ(AF4 a) { return AF4_AU4((AU4_AF4(a) >> AU4_(2)) + AU4_(0x2F9A4E46)); } + AF4 APrxMedGamma2ToPQ(AF4 a) { AF4 b = AF4_AU4((AU4_AF4(a) >> AU4_(2)) + AU4_(0x2F9A4E46)); AF4 b4 = Quart(b); return b - b * (b4 - a) / (AF1_(4.0) * b4); } + AF4 APrxHighGamma2ToPQ(AF4 a) { return sqrt(sqrt(a)); } + AF4 APrxLoLinearToPQ(AF4 a) { return AF4_AU4((AU4_AF4(a) >> AU4_(3)) + AU4_(0x378D8723)); } + AF4 APrxMedLinearToPQ(AF4 a) { AF4 b = AF4_AU4((AU4_AF4(a) >> AU4_(3)) + AU4_(0x378D8723)); AF4 b8 = Oct(b); return b - b * (b8 - a) / (AF1_(8.0) * b8); } + AF4 APrxHighLinearToPQ(AF4 a) { return sqrt(sqrt(sqrt(a))); } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PARABOLIC SIN & COS +//------------------------------------------------------------------------------------------------------------------------------ +// Approximate answers to transcendental questions. +//------------------------------------------------------------------------------------------------------------------------------ +//============================================================================================================================== + #if 1 + // Valid input range is {-1 to 1} representing {0 to 2 pi}. + // Output range is {-1/4 to 1/4} representing {-1 to 1}. + AF1 APSinF1(AF1 x){return x*abs(x)-x;} // MAD. + AF2 APSinF2(AF2 x){return x*abs(x)-x;} + AF1 APCosF1(AF1 x){x=AFractF1(x*AF1_(0.5)+AF1_(0.75));x=x*AF1_(2.0)-AF1_(1.0);return APSinF1(x);} // 3x MAD, FRACT + AF2 APCosF2(AF2 x){x=AFractF2(x*AF2_(0.5)+AF2_(0.75));x=x*AF2_(2.0)-AF2_(1.0);return APSinF2(x);} + AF2 APSinCosF1(AF1 x){AF1 y=AFractF1(x*AF1_(0.5)+AF1_(0.75));y=y*AF1_(2.0)-AF1_(1.0);return APSinF2(AF2(x,y));} + #endif +//------------------------------------------------------------------------------------------------------------------------------ + #ifdef A_HALF + // For a packed {sin,cos} pair, + // - Native takes 16 clocks and 4 issue slots (no packed transcendentals). + // - Parabolic takes 8 clocks and 8 issue slots (only fract is non-packed). + AH1 APSinH1(AH1 x){return x*abs(x)-x;} + AH2 APSinH2(AH2 x){return x*abs(x)-x;} // AND,FMA + AH1 APCosH1(AH1 x){x=AFractH1(x*AH1_(0.5)+AH1_(0.75));x=x*AH1_(2.0)-AH1_(1.0);return APSinH1(x);} + AH2 APCosH2(AH2 x){x=AFractH2(x*AH2_(0.5)+AH2_(0.75));x=x*AH2_(2.0)-AH2_(1.0);return APSinH2(x);} // 3x FMA, 2xFRACT, AND + AH2 APSinCosH1(AH1 x){AH1 y=AFractH1(x*AH1_(0.5)+AH1_(0.75));y=y*AH1_(2.0)-AH1_(1.0);return APSinH2(AH2(x,y));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// [ZOL] ZERO ONE LOGIC +//------------------------------------------------------------------------------------------------------------------------------ +// Conditional free logic designed for easy 16-bit packing, and backwards porting to 32-bit. +//------------------------------------------------------------------------------------------------------------------------------ +// 0 := false +// 1 := true +//------------------------------------------------------------------------------------------------------------------------------ +// AndNot(x,y) -> !(x&y) .... One op. +// AndOr(x,y,z) -> (x&y)|z ... One op. +// GtZero(x) -> x>0.0 ..... One op. +// Sel(x,y,z) -> x?y:z ..... Two ops, has no precision loss. +// Signed(x) -> x<0.0 ..... One op. +// ZeroPass(x,y) -> x?0:y ..... Two ops, 'y' is a pass through safe for aliasing as integer. +//------------------------------------------------------------------------------------------------------------------------------ +// OPTIMIZATION NOTES +// ================== +// - On Vega to use 2 constants in a packed op, pass in as one AW2 or one AH2 'k.xy' and use as 'k.xx' and 'k.yy'. +// For example 'a.xy*k.xx+k.yy'. +//============================================================================================================================== + #if 1 + AU1 AZolAndU1(AU1 x,AU1 y){return min(x,y);} + AU2 AZolAndU2(AU2 x,AU2 y){return min(x,y);} + AU3 AZolAndU3(AU3 x,AU3 y){return min(x,y);} + AU4 AZolAndU4(AU4 x,AU4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AZolNotU1(AU1 x){return x^AU1_(1);} + AU2 AZolNotU2(AU2 x){return x^AU2_(1);} + AU3 AZolNotU3(AU3 x){return x^AU3_(1);} + AU4 AZolNotU4(AU4 x){return x^AU4_(1);} +//------------------------------------------------------------------------------------------------------------------------------ + AU1 AZolOrU1(AU1 x,AU1 y){return max(x,y);} + AU2 AZolOrU2(AU2 x,AU2 y){return max(x,y);} + AU3 AZolOrU3(AU3 x,AU3 y){return max(x,y);} + AU4 AZolOrU4(AU4 x,AU4 y){return max(x,y);} +//============================================================================================================================== + AU1 AZolF1ToU1(AF1 x){return AU1(x);} + AU2 AZolF2ToU2(AF2 x){return AU2(x);} + AU3 AZolF3ToU3(AF3 x){return AU3(x);} + AU4 AZolF4ToU4(AF4 x){return AU4(x);} +//------------------------------------------------------------------------------------------------------------------------------ + // 2 ops, denormals don't work in 32-bit on PC (and if they are enabled, OMOD is disabled). + AU1 AZolNotF1ToU1(AF1 x){return AU1(AF1_(1.0)-x);} + AU2 AZolNotF2ToU2(AF2 x){return AU2(AF2_(1.0)-x);} + AU3 AZolNotF3ToU3(AF3 x){return AU3(AF3_(1.0)-x);} + AU4 AZolNotF4ToU4(AF4 x){return AU4(AF4_(1.0)-x);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolU1ToF1(AU1 x){return AF1(x);} + AF2 AZolU2ToF2(AU2 x){return AF2(x);} + AF3 AZolU3ToF3(AU3 x){return AF3(x);} + AF4 AZolU4ToF4(AU4 x){return AF4(x);} +//============================================================================================================================== + AF1 AZolAndF1(AF1 x,AF1 y){return min(x,y);} + AF2 AZolAndF2(AF2 x,AF2 y){return min(x,y);} + AF3 AZolAndF3(AF3 x,AF3 y){return min(x,y);} + AF4 AZolAndF4(AF4 x,AF4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 ASolAndNotF1(AF1 x,AF1 y){return (-x)*y+AF1_(1.0);} + AF2 ASolAndNotF2(AF2 x,AF2 y){return (-x)*y+AF2_(1.0);} + AF3 ASolAndNotF3(AF3 x,AF3 y){return (-x)*y+AF3_(1.0);} + AF4 ASolAndNotF4(AF4 x,AF4 y){return (-x)*y+AF4_(1.0);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolAndOrF1(AF1 x,AF1 y,AF1 z){return ASatF1(x*y+z);} + AF2 AZolAndOrF2(AF2 x,AF2 y,AF2 z){return ASatF2(x*y+z);} + AF3 AZolAndOrF3(AF3 x,AF3 y,AF3 z){return ASatF3(x*y+z);} + AF4 AZolAndOrF4(AF4 x,AF4 y,AF4 z){return ASatF4(x*y+z);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolGtZeroF1(AF1 x){return ASatF1(x*AF1_(A_INFP_F));} + AF2 AZolGtZeroF2(AF2 x){return ASatF2(x*AF2_(A_INFP_F));} + AF3 AZolGtZeroF3(AF3 x){return ASatF3(x*AF3_(A_INFP_F));} + AF4 AZolGtZeroF4(AF4 x){return ASatF4(x*AF4_(A_INFP_F));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolNotF1(AF1 x){return AF1_(1.0)-x;} + AF2 AZolNotF2(AF2 x){return AF2_(1.0)-x;} + AF3 AZolNotF3(AF3 x){return AF3_(1.0)-x;} + AF4 AZolNotF4(AF4 x){return AF4_(1.0)-x;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolOrF1(AF1 x,AF1 y){return max(x,y);} + AF2 AZolOrF2(AF2 x,AF2 y){return max(x,y);} + AF3 AZolOrF3(AF3 x,AF3 y){return max(x,y);} + AF4 AZolOrF4(AF4 x,AF4 y){return max(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolSelF1(AF1 x,AF1 y,AF1 z){AF1 r=(-x)*z+z;return x*y+r;} + AF2 AZolSelF2(AF2 x,AF2 y,AF2 z){AF2 r=(-x)*z+z;return x*y+r;} + AF3 AZolSelF3(AF3 x,AF3 y,AF3 z){AF3 r=(-x)*z+z;return x*y+r;} + AF4 AZolSelF4(AF4 x,AF4 y,AF4 z){AF4 r=(-x)*z+z;return x*y+r;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolSignedF1(AF1 x){return ASatF1(x*AF1_(A_INFN_F));} + AF2 AZolSignedF2(AF2 x){return ASatF2(x*AF2_(A_INFN_F));} + AF3 AZolSignedF3(AF3 x){return ASatF3(x*AF3_(A_INFN_F));} + AF4 AZolSignedF4(AF4 x){return ASatF4(x*AF4_(A_INFN_F));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AZolZeroPassF1(AF1 x,AF1 y){return AF1_AU1((AU1_AF1(x)!=AU1_(0))?AU1_(0):AU1_AF1(y));} + AF2 AZolZeroPassF2(AF2 x,AF2 y){return AF2_AU2((AU2_AF2(x)!=AU2_(0))?AU2_(0):AU2_AF2(y));} + AF3 AZolZeroPassF3(AF3 x,AF3 y){return AF3_AU3((AU3_AF3(x)!=AU3_(0))?AU3_(0):AU3_AF3(y));} + AF4 AZolZeroPassF4(AF4 x,AF4 y){return AF4_AU4((AU4_AF4(x)!=AU4_(0))?AU4_(0):AU4_AF4(y));} + #endif +//============================================================================================================================== + #ifdef A_HALF + AW1 AZolAndW1(AW1 x,AW1 y){return min(x,y);} + AW2 AZolAndW2(AW2 x,AW2 y){return min(x,y);} + AW3 AZolAndW3(AW3 x,AW3 y){return min(x,y);} + AW4 AZolAndW4(AW4 x,AW4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AZolNotW1(AW1 x){return x^AW1_(1);} + AW2 AZolNotW2(AW2 x){return x^AW2_(1);} + AW3 AZolNotW3(AW3 x){return x^AW3_(1);} + AW4 AZolNotW4(AW4 x){return x^AW4_(1);} +//------------------------------------------------------------------------------------------------------------------------------ + AW1 AZolOrW1(AW1 x,AW1 y){return max(x,y);} + AW2 AZolOrW2(AW2 x,AW2 y){return max(x,y);} + AW3 AZolOrW3(AW3 x,AW3 y){return max(x,y);} + AW4 AZolOrW4(AW4 x,AW4 y){return max(x,y);} +//============================================================================================================================== + // Uses denormal trick. + AW1 AZolH1ToW1(AH1 x){return AW1_AH1(x*AH1_AW1(AW1_(1)));} + AW2 AZolH2ToW2(AH2 x){return AW2_AH2(x*AH2_AW2(AW2_(1)));} + AW3 AZolH3ToW3(AH3 x){return AW3_AH3(x*AH3_AW3(AW3_(1)));} + AW4 AZolH4ToW4(AH4 x){return AW4_AH4(x*AH4_AW4(AW4_(1)));} +//------------------------------------------------------------------------------------------------------------------------------ + // AMD arch lacks a packed conversion opcode. + AH1 AZolW1ToH1(AW1 x){return AH1_AW1(x*AW1_AH1(AH1_(1.0)));} + AH2 AZolW2ToH2(AW2 x){return AH2_AW2(x*AW2_AH2(AH2_(1.0)));} + AH3 AZolW1ToH3(AW3 x){return AH3_AW3(x*AW3_AH3(AH3_(1.0)));} + AH4 AZolW2ToH4(AW4 x){return AH4_AW4(x*AW4_AH4(AH4_(1.0)));} +//============================================================================================================================== + AH1 AZolAndH1(AH1 x,AH1 y){return min(x,y);} + AH2 AZolAndH2(AH2 x,AH2 y){return min(x,y);} + AH3 AZolAndH3(AH3 x,AH3 y){return min(x,y);} + AH4 AZolAndH4(AH4 x,AH4 y){return min(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 ASolAndNotH1(AH1 x,AH1 y){return (-x)*y+AH1_(1.0);} + AH2 ASolAndNotH2(AH2 x,AH2 y){return (-x)*y+AH2_(1.0);} + AH3 ASolAndNotH3(AH3 x,AH3 y){return (-x)*y+AH3_(1.0);} + AH4 ASolAndNotH4(AH4 x,AH4 y){return (-x)*y+AH4_(1.0);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolAndOrH1(AH1 x,AH1 y,AH1 z){return ASatH1(x*y+z);} + AH2 AZolAndOrH2(AH2 x,AH2 y,AH2 z){return ASatH2(x*y+z);} + AH3 AZolAndOrH3(AH3 x,AH3 y,AH3 z){return ASatH3(x*y+z);} + AH4 AZolAndOrH4(AH4 x,AH4 y,AH4 z){return ASatH4(x*y+z);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolGtZeroH1(AH1 x){return ASatH1(x*AH1_(A_INFP_H));} + AH2 AZolGtZeroH2(AH2 x){return ASatH2(x*AH2_(A_INFP_H));} + AH3 AZolGtZeroH3(AH3 x){return ASatH3(x*AH3_(A_INFP_H));} + AH4 AZolGtZeroH4(AH4 x){return ASatH4(x*AH4_(A_INFP_H));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolNotH1(AH1 x){return AH1_(1.0)-x;} + AH2 AZolNotH2(AH2 x){return AH2_(1.0)-x;} + AH3 AZolNotH3(AH3 x){return AH3_(1.0)-x;} + AH4 AZolNotH4(AH4 x){return AH4_(1.0)-x;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolOrH1(AH1 x,AH1 y){return max(x,y);} + AH2 AZolOrH2(AH2 x,AH2 y){return max(x,y);} + AH3 AZolOrH3(AH3 x,AH3 y){return max(x,y);} + AH4 AZolOrH4(AH4 x,AH4 y){return max(x,y);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolSelH1(AH1 x,AH1 y,AH1 z){AH1 r=(-x)*z+z;return x*y+r;} + AH2 AZolSelH2(AH2 x,AH2 y,AH2 z){AH2 r=(-x)*z+z;return x*y+r;} + AH3 AZolSelH3(AH3 x,AH3 y,AH3 z){AH3 r=(-x)*z+z;return x*y+r;} + AH4 AZolSelH4(AH4 x,AH4 y,AH4 z){AH4 r=(-x)*z+z;return x*y+r;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AZolSignedH1(AH1 x){return ASatH1(x*AH1_(A_INFN_H));} + AH2 AZolSignedH2(AH2 x){return ASatH2(x*AH2_(A_INFN_H));} + AH3 AZolSignedH3(AH3 x){return ASatH3(x*AH3_(A_INFN_H));} + AH4 AZolSignedH4(AH4 x){return ASatH4(x*AH4_(A_INFN_H));} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// COLOR CONVERSIONS +//------------------------------------------------------------------------------------------------------------------------------ +// These are all linear to/from some other space (where 'linear' has been shortened out of the function name). +// So 'ToGamma' is 'LinearToGamma', and 'FromGamma' is 'LinearFromGamma'. +// These are branch free implementations. +// The AToSrgbF1() function is useful for stores for compute shaders for GPUs without hardware linear->sRGB store conversion. +//------------------------------------------------------------------------------------------------------------------------------ +// TRANSFER FUNCTIONS +// ================== +// 709 ..... Rec709 used for some HDTVs +// Gamma ... Typically 2.2 for some PC displays, or 2.4-2.5 for CRTs, or 2.2 FreeSync2 native +// Pq ...... PQ native for HDR10 +// Srgb .... The sRGB output, typical of PC displays, useful for 10-bit output, or storing to 8-bit UNORM without SRGB type +// Two ..... Gamma 2.0, fastest conversion (useful for intermediate pass approximations) +// Three ... Gamma 3.0, less fast, but good for HDR. +//------------------------------------------------------------------------------------------------------------------------------ +// KEEPING TO SPEC +// =============== +// Both Rec.709 and sRGB have a linear segment which as spec'ed would intersect the curved segment 2 times. +// (a.) For 8-bit sRGB, steps {0 to 10.3} are in the linear region (4% of the encoding range). +// (b.) For 8-bit 709, steps {0 to 20.7} are in the linear region (8% of the encoding range). +// Also there is a slight step in the transition regions. +// Precision of the coefficients in the spec being the likely cause. +// Main usage case of the sRGB code is to do the linear->sRGB converstion in a compute shader before store. +// This is to work around lack of hardware (typically only ROP does the conversion for free). +// To "correct" the linear segment, would be to introduce error, because hardware decode of sRGB->linear is fixed (and free). +// So this header keeps with the spec. +// For linear->sRGB transforms, the linear segment in some respects reduces error, because rounding in that region is linear. +// Rounding in the curved region in hardware (and fast software code) introduces error due to rounding in non-linear. +//------------------------------------------------------------------------------------------------------------------------------ +// FOR PQ +// ====== +// Both input and output is {0.0-1.0}, and where output 1.0 represents 10000.0 cd/m^2. +// All constants are only specified to FP32 precision. +// External PQ source reference, +// - https://github.com/ampas/aces-dev/blob/master/transforms/ctl/utilities/ACESlib.Utilities_Color.a1.0.1.ctl +//------------------------------------------------------------------------------------------------------------------------------ +// PACKED VERSIONS +// =============== +// These are the A*H2() functions. +// There is no PQ functions as FP16 seemed to not have enough precision for the conversion. +// The remaining functions are "good enough" for 8-bit, and maybe 10-bit if not concerned about a few 1-bit errors. +// Precision is lowest in the 709 conversion, higher in sRGB, higher still in Two and Gamma (when using 2.2 at least). +//------------------------------------------------------------------------------------------------------------------------------ +// NOTES +// ===== +// Could be faster for PQ conversions to be in ALU or a texture lookup depending on usage case. +//============================================================================================================================== + #if 1 + AF1 ATo709F1(AF1 c){AF3 j=AF3(0.018*4.5,4.5,0.45);AF2 k=AF2(1.099,-0.099); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AF2 ATo709F2(AF2 c){AF3 j=AF3(0.018*4.5,4.5,0.45);AF2 k=AF2(1.099,-0.099); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AF3 ATo709F3(AF3 c){AF3 j=AF3(0.018*4.5,4.5,0.45);AF2 k=AF2(1.099,-0.099); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + // Note 'rcpX' is '1/x', where the 'x' is what would be used in AFromGamma(). + AF1 AToGammaF1(AF1 c,AF1 rcpX){return pow(c,AF1_(rcpX));} + AF2 AToGammaF2(AF2 c,AF1 rcpX){return pow(c,AF2_(rcpX));} + AF3 AToGammaF3(AF3 c,AF1 rcpX){return pow(c,AF3_(rcpX));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToPqF1(AF1 x){AF1 p=pow(x,AF1_(0.159302)); + return pow((AF1_(0.835938)+AF1_(18.8516)*p)/(AF1_(1.0)+AF1_(18.6875)*p),AF1_(78.8438));} + AF2 AToPqF1(AF2 x){AF2 p=pow(x,AF2_(0.159302)); + return pow((AF2_(0.835938)+AF2_(18.8516)*p)/(AF2_(1.0)+AF2_(18.6875)*p),AF2_(78.8438));} + AF3 AToPqF1(AF3 x){AF3 p=pow(x,AF3_(0.159302)); + return pow((AF3_(0.835938)+AF3_(18.8516)*p)/(AF3_(1.0)+AF3_(18.6875)*p),AF3_(78.8438));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToSrgbF1(AF1 c){AF3 j=AF3(0.0031308*12.92,12.92,1.0/2.4);AF2 k=AF2(1.055,-0.055); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AF2 AToSrgbF2(AF2 c){AF3 j=AF3(0.0031308*12.92,12.92,1.0/2.4);AF2 k=AF2(1.055,-0.055); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AF3 AToSrgbF3(AF3 c){AF3 j=AF3(0.0031308*12.92,12.92,1.0/2.4);AF2 k=AF2(1.055,-0.055); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToTwoF1(AF1 c){return sqrt(c);} + AF2 AToTwoF2(AF2 c){return sqrt(c);} + AF3 AToTwoF3(AF3 c){return sqrt(c);} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AToThreeF1(AF1 c){return pow(c,AF1_(1.0/3.0));} + AF2 AToThreeF2(AF2 c){return pow(c,AF2_(1.0/3.0));} + AF3 AToThreeF3(AF3 c){return pow(c,AF3_(1.0/3.0));} + #endif +//============================================================================================================================== + #if 1 + // Unfortunately median won't work here. + AF1 AFrom709F1(AF1 c){AF3 j=AF3(0.081/4.5,1.0/4.5,1.0/0.45);AF2 k=AF2(1.0/1.099,0.099/1.099); + return AZolSelF1(AZolSignedF1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AF2 AFrom709F2(AF2 c){AF3 j=AF3(0.081/4.5,1.0/4.5,1.0/0.45);AF2 k=AF2(1.0/1.099,0.099/1.099); + return AZolSelF2(AZolSignedF2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AF3 AFrom709F3(AF3 c){AF3 j=AF3(0.081/4.5,1.0/4.5,1.0/0.45);AF2 k=AF2(1.0/1.099,0.099/1.099); + return AZolSelF3(AZolSignedF3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromGammaF1(AF1 c,AF1 x){return pow(c,AF1_(x));} + AF2 AFromGammaF2(AF2 c,AF1 x){return pow(c,AF2_(x));} + AF3 AFromGammaF3(AF3 c,AF1 x){return pow(c,AF3_(x));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromPqF1(AF1 x){AF1 p=pow(x,AF1_(0.0126833)); + return pow(ASatF1(p-AF1_(0.835938))/(AF1_(18.8516)-AF1_(18.6875)*p),AF1_(6.27739));} + AF2 AFromPqF1(AF2 x){AF2 p=pow(x,AF2_(0.0126833)); + return pow(ASatF2(p-AF2_(0.835938))/(AF2_(18.8516)-AF2_(18.6875)*p),AF2_(6.27739));} + AF3 AFromPqF1(AF3 x){AF3 p=pow(x,AF3_(0.0126833)); + return pow(ASatF3(p-AF3_(0.835938))/(AF3_(18.8516)-AF3_(18.6875)*p),AF3_(6.27739));} +//------------------------------------------------------------------------------------------------------------------------------ + // Unfortunately median won't work here. + AF1 AFromSrgbF1(AF1 c){AF3 j=AF3(0.04045/12.92,1.0/12.92,2.4);AF2 k=AF2(1.0/1.055,0.055/1.055); + return AZolSelF1(AZolSignedF1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AF2 AFromSrgbF2(AF2 c){AF3 j=AF3(0.04045/12.92,1.0/12.92,2.4);AF2 k=AF2(1.0/1.055,0.055/1.055); + return AZolSelF2(AZolSignedF2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AF3 AFromSrgbF3(AF3 c){AF3 j=AF3(0.04045/12.92,1.0/12.92,2.4);AF2 k=AF2(1.0/1.055,0.055/1.055); + return AZolSelF3(AZolSignedF3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromTwoF1(AF1 c){return c*c;} + AF2 AFromTwoF2(AF2 c){return c*c;} + AF3 AFromTwoF3(AF3 c){return c*c;} +//------------------------------------------------------------------------------------------------------------------------------ + AF1 AFromThreeF1(AF1 c){return c*c*c;} + AF2 AFromThreeF2(AF2 c){return c*c*c;} + AF3 AFromThreeF3(AF3 c){return c*c*c;} + #endif +//============================================================================================================================== + #ifdef A_HALF + AH1 ATo709H1(AH1 c){AH3 j=AH3(0.018*4.5,4.5,0.45);AH2 k=AH2(1.099,-0.099); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AH2 ATo709H2(AH2 c){AH3 j=AH3(0.018*4.5,4.5,0.45);AH2 k=AH2(1.099,-0.099); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AH3 ATo709H3(AH3 c){AH3 j=AH3(0.018*4.5,4.5,0.45);AH2 k=AH2(1.099,-0.099); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToGammaH1(AH1 c,AH1 rcpX){return pow(c,AH1_(rcpX));} + AH2 AToGammaH2(AH2 c,AH1 rcpX){return pow(c,AH2_(rcpX));} + AH3 AToGammaH3(AH3 c,AH1 rcpX){return pow(c,AH3_(rcpX));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToSrgbH1(AH1 c){AH3 j=AH3(0.0031308*12.92,12.92,1.0/2.4);AH2 k=AH2(1.055,-0.055); + return clamp(j.x ,c*j.y ,pow(c,j.z )*k.x +k.y );} + AH2 AToSrgbH2(AH2 c){AH3 j=AH3(0.0031308*12.92,12.92,1.0/2.4);AH2 k=AH2(1.055,-0.055); + return clamp(j.xx ,c*j.yy ,pow(c,j.zz )*k.xx +k.yy );} + AH3 AToSrgbH3(AH3 c){AH3 j=AH3(0.0031308*12.92,12.92,1.0/2.4);AH2 k=AH2(1.055,-0.055); + return clamp(j.xxx,c*j.yyy,pow(c,j.zzz)*k.xxx+k.yyy);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToTwoH1(AH1 c){return sqrt(c);} + AH2 AToTwoH2(AH2 c){return sqrt(c);} + AH3 AToTwoH3(AH3 c){return sqrt(c);} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AToThreeF1(AH1 c){return pow(c,AH1_(1.0/3.0));} + AH2 AToThreeF2(AH2 c){return pow(c,AH2_(1.0/3.0));} + AH3 AToThreeF3(AH3 c){return pow(c,AH3_(1.0/3.0));} + #endif +//============================================================================================================================== + #ifdef A_HALF + AH1 AFrom709H1(AH1 c){AH3 j=AH3(0.081/4.5,1.0/4.5,1.0/0.45);AH2 k=AH2(1.0/1.099,0.099/1.099); + return AZolSelH1(AZolSignedH1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AH2 AFrom709H2(AH2 c){AH3 j=AH3(0.081/4.5,1.0/4.5,1.0/0.45);AH2 k=AH2(1.0/1.099,0.099/1.099); + return AZolSelH2(AZolSignedH2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AH3 AFrom709H3(AH3 c){AH3 j=AH3(0.081/4.5,1.0/4.5,1.0/0.45);AH2 k=AH2(1.0/1.099,0.099/1.099); + return AZolSelH3(AZolSignedH3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFromGammaH1(AH1 c,AH1 x){return pow(c,AH1_(x));} + AH2 AFromGammaH2(AH2 c,AH1 x){return pow(c,AH2_(x));} + AH3 AFromGammaH3(AH3 c,AH1 x){return pow(c,AH3_(x));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AHromSrgbF1(AH1 c){AH3 j=AH3(0.04045/12.92,1.0/12.92,2.4);AH2 k=AH2(1.0/1.055,0.055/1.055); + return AZolSelH1(AZolSignedH1(c-j.x ),c*j.y ,pow(c*k.x +k.y ,j.z ));} + AH2 AHromSrgbF2(AH2 c){AH3 j=AH3(0.04045/12.92,1.0/12.92,2.4);AH2 k=AH2(1.0/1.055,0.055/1.055); + return AZolSelH2(AZolSignedH2(c-j.xx ),c*j.yy ,pow(c*k.xx +k.yy ,j.zz ));} + AH3 AHromSrgbF3(AH3 c){AH3 j=AH3(0.04045/12.92,1.0/12.92,2.4);AH2 k=AH2(1.0/1.055,0.055/1.055); + return AZolSelH3(AZolSignedH3(c-j.xxx),c*j.yyy,pow(c*k.xxx+k.yyy,j.zzz));} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFromTwoH1(AH1 c){return c*c;} + AH2 AFromTwoH2(AH2 c){return c*c;} + AH3 AFromTwoH3(AH3 c){return c*c;} +//------------------------------------------------------------------------------------------------------------------------------ + AH1 AFromThreeH1(AH1 c){return c*c*c;} + AH2 AFromThreeH2(AH2 c){return c*c*c;} + AH3 AFromThreeH3(AH3 c){return c*c*c;} + #endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// CS REMAP +//============================================================================================================================== + // Simple remap 64x1 to 8x8 with rotated 2x2 pixel quads in quad linear. + // 543210 + // ====== + // ..xxx. + // yy...y + AU2 ARmp8x8(AU1 a){return AU2(ABfe(a,1u,3u),ABfiM(ABfe(a,3u,3u),a,1u));} +//============================================================================================================================== + // More complex remap 64x1 to 8x8 which is necessary for 2D wave reductions. + // 543210 + // ====== + // .xx..x + // y..yy. + // Details, + // LANE TO 8x8 MAPPING + // =================== + // 00 01 08 09 10 11 18 19 + // 02 03 0a 0b 12 13 1a 1b + // 04 05 0c 0d 14 15 1c 1d + // 06 07 0e 0f 16 17 1e 1f + // 20 21 28 29 30 31 38 39 + // 22 23 2a 2b 32 33 3a 3b + // 24 25 2c 2d 34 35 3c 3d + // 26 27 2e 2f 36 37 3e 3f + AU2 ARmpRed8x8(AU1 a){return AU2(ABfiM(ABfe(a,2u,3u),a,1u),ABfiM(ABfe(a,3u,3u),ABfe(a,1u,2u),2u));} +//============================================================================================================================== + #ifdef A_HALF + AW2 ARmp8x8H(AU1 a){return AW2(ABfe(a,1u,3u),ABfiM(ABfe(a,3u,3u),a,1u));} + AW2 ARmpRed8x8H(AU1 a){return AW2(ABfiM(ABfe(a,2u,3u),a,1u),ABfiM(ABfe(a,3u,3u),ABfe(a,1u,2u),2u));} + #endif +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// REFERENCE +// +//------------------------------------------------------------------------------------------------------------------------------ +// IEEE FLOAT RULES +// ================ +// - saturate(NaN)=0, saturate(-INF)=0, saturate(+INF)=1 +// - {+/-}0 * {+/-}INF = NaN +// - -INF + (+INF) = NaN +// - {+/-}0 / {+/-}0 = NaN +// - {+/-}INF / {+/-}INF = NaN +// - a<(-0) := sqrt(a) = NaN (a=-0.0 won't NaN) +// - 0 == -0 +// - 4/0 = +INF +// - 4/-0 = -INF +// - 4+INF = +INF +// - 4-INF = -INF +// - 4*(+INF) = +INF +// - 4*(-INF) = -INF +// - -4*(+INF) = -INF +// - sqrt(+INF) = +INF +//------------------------------------------------------------------------------------------------------------------------------ +// FP16 ENCODING +// ============= +// fedcba9876543210 +// ---------------- +// ......mmmmmmmmmm 10-bit mantissa (encodes 11-bit 0.5 to 1.0 except for denormals) +// .eeeee.......... 5-bit exponent +// .00000.......... denormals +// .00001.......... -14 exponent +// .11110.......... 15 exponent +// .111110000000000 infinity +// .11111nnnnnnnnnn NaN with n!=0 +// s............... sign +//------------------------------------------------------------------------------------------------------------------------------ +// FP16/INT16 ALIASING DENORMAL +// ============================ +// 11-bit unsigned integers alias with half float denormal/normal values, +// 1 = 2^(-24) = 1/16777216 ....................... first denormal value +// 2 = 2^(-23) +// ... +// 1023 = 2^(-14)*(1-2^(-10)) = 2^(-14)*(1-1/1024) ... last denormal value +// 1024 = 2^(-14) = 1/16384 .......................... first normal value that still maps to integers +// 2047 .............................................. last normal value that still maps to integers +// Scaling limits, +// 2^15 = 32768 ...................................... largest power of 2 scaling +// Largest pow2 conversion mapping is at *32768, +// 1 : 2^(-9) = 1/512 +// 2 : 1/256 +// 4 : 1/128 +// 8 : 1/64 +// 16 : 1/32 +// 32 : 1/16 +// 64 : 1/8 +// 128 : 1/4 +// 256 : 1/2 +// 512 : 1 +// 1024 : 2 +// 2047 : a little less than 4 +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// GPU/CPU PORTABILITY +// +// +//------------------------------------------------------------------------------------------------------------------------------ +// This is the GPU implementation. +// See the CPU implementation for docs. +//============================================================================================================================== +#ifdef A_GPU + #define A_TRUE true + #define A_FALSE false + #define A_STATIC +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR ARGUMENT/RETURN/INITIALIZATION PORTABILITY +//============================================================================================================================== + #define retAD2 AD2 + #define retAD3 AD3 + #define retAD4 AD4 + #define retAF2 AF2 + #define retAF3 AF3 + #define retAF4 AF4 + #define retAL2 AL2 + #define retAL3 AL3 + #define retAL4 AL4 + #define retAU2 AU2 + #define retAU3 AU3 + #define retAU4 AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define inAD2 in AD2 + #define inAD3 in AD3 + #define inAD4 in AD4 + #define inAF2 in AF2 + #define inAF3 in AF3 + #define inAF4 in AF4 + #define inAL2 in AL2 + #define inAL3 in AL3 + #define inAL4 in AL4 + #define inAU2 in AU2 + #define inAU3 in AU3 + #define inAU4 in AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define inoutAD2 inout AD2 + #define inoutAD3 inout AD3 + #define inoutAD4 inout AD4 + #define inoutAF2 inout AF2 + #define inoutAF3 inout AF3 + #define inoutAF4 inout AF4 + #define inoutAL2 inout AL2 + #define inoutAL3 inout AL3 + #define inoutAL4 inout AL4 + #define inoutAU2 inout AU2 + #define inoutAU3 inout AU3 + #define inoutAU4 inout AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define outAD2 out AD2 + #define outAD3 out AD3 + #define outAD4 out AD4 + #define outAF2 out AF2 + #define outAF3 out AF3 + #define outAF4 out AF4 + #define outAL2 out AL2 + #define outAL3 out AL3 + #define outAL4 out AL4 + #define outAU2 out AU2 + #define outAU3 out AU3 + #define outAU4 out AU4 +//------------------------------------------------------------------------------------------------------------------------------ + #define varAD2(x) AD2 x + #define varAD3(x) AD3 x + #define varAD4(x) AD4 x + #define varAF2(x) AF2 x + #define varAF3(x) AF3 x + #define varAF4(x) AF4 x + #define varAL2(x) AL2 x + #define varAL3(x) AL3 x + #define varAL4(x) AL4 x + #define varAU2(x) AU2 x + #define varAU3(x) AU3 x + #define varAU4(x) AU4 x +//------------------------------------------------------------------------------------------------------------------------------ + #define initAD2(x,y) AD2(x,y) + #define initAD3(x,y,z) AD3(x,y,z) + #define initAD4(x,y,z,w) AD4(x,y,z,w) + #define initAF2(x,y) AF2(x,y) + #define initAF3(x,y,z) AF3(x,y,z) + #define initAF4(x,y,z,w) AF4(x,y,z,w) + #define initAL2(x,y) AL2(x,y) + #define initAL3(x,y,z) AL3(x,y,z) + #define initAL4(x,y,z,w) AL4(x,y,z,w) + #define initAU2(x,y) AU2(x,y) + #define initAU3(x,y,z) AU3(x,y,z) + #define initAU4(x,y,z,w) AU4(x,y,z,w) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS +//============================================================================================================================== + #define AAbsD1(a) abs(AD1(a)) + #define AAbsF1(a) abs(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ACosD1(a) cos(AD1(a)) + #define ACosF1(a) cos(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ADotD2(a,b) dot(AD2(a),AD2(b)) + #define ADotD3(a,b) dot(AD3(a),AD3(b)) + #define ADotD4(a,b) dot(AD4(a),AD4(b)) + #define ADotF2(a,b) dot(AF2(a),AF2(b)) + #define ADotF3(a,b) dot(AF3(a),AF3(b)) + #define ADotF4(a,b) dot(AF4(a),AF4(b)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AExp2D1(a) exp2(AD1(a)) + #define AExp2F1(a) exp2(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AFloorD1(a) floor(AD1(a)) + #define AFloorF1(a) floor(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ALog2D1(a) log2(AD1(a)) + #define ALog2F1(a) log2(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define AMaxD1(a,b) max(a,b) + #define AMaxF1(a,b) max(a,b) + #define AMaxL1(a,b) max(a,b) + #define AMaxU1(a,b) max(a,b) +//------------------------------------------------------------------------------------------------------------------------------ + #define AMinD1(a,b) min(a,b) + #define AMinF1(a,b) min(a,b) + #define AMinL1(a,b) min(a,b) + #define AMinU1(a,b) min(a,b) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASinD1(a) sin(AD1(a)) + #define ASinF1(a) sin(AF1(a)) +//------------------------------------------------------------------------------------------------------------------------------ + #define ASqrtD1(a) sqrt(AD1(a)) + #define ASqrtF1(a) sqrt(AF1(a)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// SCALAR RETURN OPS - DEPENDENT +//============================================================================================================================== + #define APowD1(a,b) pow(AD1(a),AF1(b)) + #define APowF1(a,b) pow(AF1(a),AF1(b)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// VECTOR OPS +//------------------------------------------------------------------------------------------------------------------------------ +// These are added as needed for production or prototyping, so not necessarily a complete set. +// They follow a convention of taking in a destination and also returning the destination value to increase utility. +//============================================================================================================================== + #ifdef A_DUBL + AD2 opAAbsD2(outAD2 d,inAD2 a){d=abs(a);return d;} + AD3 opAAbsD3(outAD3 d,inAD3 a){d=abs(a);return d;} + AD4 opAAbsD4(outAD4 d,inAD4 a){d=abs(a);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAAddD2(outAD2 d,inAD2 a,inAD2 b){d=a+b;return d;} + AD3 opAAddD3(outAD3 d,inAD3 a,inAD3 b){d=a+b;return d;} + AD4 opAAddD4(outAD4 d,inAD4 a,inAD4 b){d=a+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAAddOneD2(outAD2 d,inAD2 a,AD1 b){d=a+AD2_(b);return d;} + AD3 opAAddOneD3(outAD3 d,inAD3 a,AD1 b){d=a+AD3_(b);return d;} + AD4 opAAddOneD4(outAD4 d,inAD4 a,AD1 b){d=a+AD4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opACpyD2(outAD2 d,inAD2 a){d=a;return d;} + AD3 opACpyD3(outAD3 d,inAD3 a){d=a;return d;} + AD4 opACpyD4(outAD4 d,inAD4 a){d=a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opALerpD2(outAD2 d,inAD2 a,inAD2 b,inAD2 c){d=ALerpD2(a,b,c);return d;} + AD3 opALerpD3(outAD3 d,inAD3 a,inAD3 b,inAD3 c){d=ALerpD3(a,b,c);return d;} + AD4 opALerpD4(outAD4 d,inAD4 a,inAD4 b,inAD4 c){d=ALerpD4(a,b,c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opALerpOneD2(outAD2 d,inAD2 a,inAD2 b,AD1 c){d=ALerpD2(a,b,AD2_(c));return d;} + AD3 opALerpOneD3(outAD3 d,inAD3 a,inAD3 b,AD1 c){d=ALerpD3(a,b,AD3_(c));return d;} + AD4 opALerpOneD4(outAD4 d,inAD4 a,inAD4 b,AD1 c){d=ALerpD4(a,b,AD4_(c));return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMaxD2(outAD2 d,inAD2 a,inAD2 b){d=max(a,b);return d;} + AD3 opAMaxD3(outAD3 d,inAD3 a,inAD3 b){d=max(a,b);return d;} + AD4 opAMaxD4(outAD4 d,inAD4 a,inAD4 b){d=max(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMinD2(outAD2 d,inAD2 a,inAD2 b){d=min(a,b);return d;} + AD3 opAMinD3(outAD3 d,inAD3 a,inAD3 b){d=min(a,b);return d;} + AD4 opAMinD4(outAD4 d,inAD4 a,inAD4 b){d=min(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMulD2(outAD2 d,inAD2 a,inAD2 b){d=a*b;return d;} + AD3 opAMulD3(outAD3 d,inAD3 a,inAD3 b){d=a*b;return d;} + AD4 opAMulD4(outAD4 d,inAD4 a,inAD4 b){d=a*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opAMulOneD2(outAD2 d,inAD2 a,AD1 b){d=a*AD2_(b);return d;} + AD3 opAMulOneD3(outAD3 d,inAD3 a,AD1 b){d=a*AD3_(b);return d;} + AD4 opAMulOneD4(outAD4 d,inAD4 a,AD1 b){d=a*AD4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opANegD2(outAD2 d,inAD2 a){d=-a;return d;} + AD3 opANegD3(outAD3 d,inAD3 a){d=-a;return d;} + AD4 opANegD4(outAD4 d,inAD4 a){d=-a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AD2 opARcpD2(outAD2 d,inAD2 a){d=ARcpD2(a);return d;} + AD3 opARcpD3(outAD3 d,inAD3 a){d=ARcpD3(a);return d;} + AD4 opARcpD4(outAD4 d,inAD4 a){d=ARcpD4(a);return d;} + #endif +//============================================================================================================================== + AF2 opAAbsF2(outAF2 d,inAF2 a){d=abs(a);return d;} + AF3 opAAbsF3(outAF3 d,inAF3 a){d=abs(a);return d;} + AF4 opAAbsF4(outAF4 d,inAF4 a){d=abs(a);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAAddF2(outAF2 d,inAF2 a,inAF2 b){d=a+b;return d;} + AF3 opAAddF3(outAF3 d,inAF3 a,inAF3 b){d=a+b;return d;} + AF4 opAAddF4(outAF4 d,inAF4 a,inAF4 b){d=a+b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAAddOneF2(outAF2 d,inAF2 a,AF1 b){d=a+AF2_(b);return d;} + AF3 opAAddOneF3(outAF3 d,inAF3 a,AF1 b){d=a+AF3_(b);return d;} + AF4 opAAddOneF4(outAF4 d,inAF4 a,AF1 b){d=a+AF4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opACpyF2(outAF2 d,inAF2 a){d=a;return d;} + AF3 opACpyF3(outAF3 d,inAF3 a){d=a;return d;} + AF4 opACpyF4(outAF4 d,inAF4 a){d=a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opALerpF2(outAF2 d,inAF2 a,inAF2 b,inAF2 c){d=ALerpF2(a,b,c);return d;} + AF3 opALerpF3(outAF3 d,inAF3 a,inAF3 b,inAF3 c){d=ALerpF3(a,b,c);return d;} + AF4 opALerpF4(outAF4 d,inAF4 a,inAF4 b,inAF4 c){d=ALerpF4(a,b,c);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opALerpOneF2(outAF2 d,inAF2 a,inAF2 b,AF1 c){d=ALerpF2(a,b,AF2_(c));return d;} + AF3 opALerpOneF3(outAF3 d,inAF3 a,inAF3 b,AF1 c){d=ALerpF3(a,b,AF3_(c));return d;} + AF4 opALerpOneF4(outAF4 d,inAF4 a,inAF4 b,AF1 c){d=ALerpF4(a,b,AF4_(c));return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMaxF2(outAF2 d,inAF2 a,inAF2 b){d=max(a,b);return d;} + AF3 opAMaxF3(outAF3 d,inAF3 a,inAF3 b){d=max(a,b);return d;} + AF4 opAMaxF4(outAF4 d,inAF4 a,inAF4 b){d=max(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMinF2(outAF2 d,inAF2 a,inAF2 b){d=min(a,b);return d;} + AF3 opAMinF3(outAF3 d,inAF3 a,inAF3 b){d=min(a,b);return d;} + AF4 opAMinF4(outAF4 d,inAF4 a,inAF4 b){d=min(a,b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMulF2(outAF2 d,inAF2 a,inAF2 b){d=a*b;return d;} + AF3 opAMulF3(outAF3 d,inAF3 a,inAF3 b){d=a*b;return d;} + AF4 opAMulF4(outAF4 d,inAF4 a,inAF4 b){d=a*b;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opAMulOneF2(outAF2 d,inAF2 a,AF1 b){d=a*AF2_(b);return d;} + AF3 opAMulOneF3(outAF3 d,inAF3 a,AF1 b){d=a*AF3_(b);return d;} + AF4 opAMulOneF4(outAF4 d,inAF4 a,AF1 b){d=a*AF4_(b);return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opANegF2(outAF2 d,inAF2 a){d=-a;return d;} + AF3 opANegF3(outAF3 d,inAF3 a){d=-a;return d;} + AF4 opANegF4(outAF4 d,inAF4 a){d=-a;return d;} +//------------------------------------------------------------------------------------------------------------------------------ + AF2 opARcpF2(outAF2 d,inAF2 a){d=ARcpF2(a);return d;} + AF3 opARcpF3(outAF3 d,inAF3 a){d=ARcpF3(a);return d;} + AF4 opARcpF4(outAF4 d,inAF4 a){d=ARcpF4(a);return d;} +#endif diff --git a/src/video_core/host_shaders/fsr/ffx_fsr1.h b/src/video_core/host_shaders/fsr/ffx_fsr1.h new file mode 100644 index 000000000..b0fe75ea9 --- /dev/null +++ b/src/video_core/host_shaders/fsr/ffx_fsr1.h @@ -0,0 +1,1200 @@ +// clang-format off +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// +// AMD FidelityFX SUPER RESOLUTION [FSR 1] ::: SPATIAL SCALING & EXTRAS - v1.20210629 +// +// +//------------------------------------------------------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------------------------------------------------ +// FidelityFX Super Resolution Sample +// +// Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files(the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +//------------------------------------------------------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------------------------------------------------ +// ABOUT +// ===== +// FSR is a collection of algorithms relating to generating a higher resolution image. +// This specific header focuses on single-image non-temporal image scaling, and related tools. +// +// The core functions are EASU and RCAS: +// [EASU] Edge Adaptive Spatial Upsampling ....... 1x to 4x area range spatial scaling, clamped adaptive elliptical filter. +// [RCAS] Robust Contrast Adaptive Sharpening .... A non-scaling variation on CAS. +// RCAS needs to be applied after EASU as a separate pass. +// +// Optional utility functions are: +// [LFGA] Linear Film Grain Applicator ........... Tool to apply film grain after scaling. +// [SRTM] Simple Reversible Tone-Mapper .......... Linear HDR {0 to FP16_MAX} to {0 to 1} and back. +// [TEPD] Temporal Energy Preserving Dither ...... Temporally energy preserving dithered {0 to 1} linear to gamma 2.0 conversion. +// See each individual sub-section for inline documentation. +//------------------------------------------------------------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//------------------------------------------------------------------------------------------------------------------------------ +// FUNCTION PERMUTATIONS +// ===================== +// *F() ..... Single item computation with 32-bit. +// *H() ..... Single item computation with 16-bit, with packing (aka two 16-bit ops in parallel) when possible. +// *Hx2() ... Processing two items in parallel with 16-bit, easier packing. +// Not all interfaces in this file have a *Hx2() form. +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [EASU] EDGE ADAPTIVE SPATIAL UPSAMPLING +// +//------------------------------------------------------------------------------------------------------------------------------ +// EASU provides a high quality spatial-only scaling at relatively low cost. +// Meaning EASU is appropiate for laptops and other low-end GPUs. +// Quality from 1x to 4x area scaling is good. +//------------------------------------------------------------------------------------------------------------------------------ +// The scalar uses a modified fast approximation to the standard lanczos(size=2) kernel. +// EASU runs in a single pass, so it applies a directionally and anisotropically adaptive radial lanczos. +// This is also kept as simple as possible to have minimum runtime. +//------------------------------------------------------------------------------------------------------------------------------ +// The lanzcos filter has negative lobes, so by itself it will introduce ringing. +// To remove all ringing, the algorithm uses the nearest 2x2 input texels as a neighborhood, +// and limits output to the minimum and maximum of that neighborhood. +//------------------------------------------------------------------------------------------------------------------------------ +// Input image requirements: +// +// Color needs to be encoded as 3 channel[red, green, blue](e.g.XYZ not supported) +// Each channel needs to be in the range[0, 1] +// Any color primaries are supported +// Display / tonemapping curve needs to be as if presenting to sRGB display or similar(e.g.Gamma 2.0) +// There should be no banding in the input +// There should be no high amplitude noise in the input +// There should be no noise in the input that is not at input pixel granularity +// For performance purposes, use 32bpp formats +//------------------------------------------------------------------------------------------------------------------------------ +// Best to apply EASU at the end of the frame after tonemapping +// but before film grain or composite of the UI. +//------------------------------------------------------------------------------------------------------------------------------ +// Example of including this header for D3D HLSL : +// +// #define A_GPU 1 +// #define A_HLSL 1 +// #define A_HALF 1 +// #include "ffx_a.h" +// #define FSR_EASU_H 1 +// #define FSR_RCAS_H 1 +// //declare input callbacks +// #include "ffx_fsr1.h" +// +// Example of including this header for Vulkan GLSL : +// +// #define A_GPU 1 +// #define A_GLSL 1 +// #define A_HALF 1 +// #include "ffx_a.h" +// #define FSR_EASU_H 1 +// #define FSR_RCAS_H 1 +// //declare input callbacks +// #include "ffx_fsr1.h" +// +// Example of including this header for Vulkan HLSL : +// +// #define A_GPU 1 +// #define A_HLSL 1 +// #define A_HLSL_6_2 1 +// #define A_NO_16_BIT_CAST 1 +// #define A_HALF 1 +// #include "ffx_a.h" +// #define FSR_EASU_H 1 +// #define FSR_RCAS_H 1 +// //declare input callbacks +// #include "ffx_fsr1.h" +// +// Example of declaring the required input callbacks for GLSL : +// The callbacks need to gather4 for each color channel using the specified texture coordinate 'p'. +// EASU uses gather4 to reduce position computation logic and for free Arrays of Structures to Structures of Arrays conversion. +// +// AH4 FsrEasuRH(AF2 p){return AH4(textureGather(sampler2D(tex,sam),p,0));} +// AH4 FsrEasuGH(AF2 p){return AH4(textureGather(sampler2D(tex,sam),p,1));} +// AH4 FsrEasuBH(AF2 p){return AH4(textureGather(sampler2D(tex,sam),p,2));} +// ... +// The FsrEasuCon function needs to be called from the CPU or GPU to set up constants. +// The difference in viewport and input image size is there to support Dynamic Resolution Scaling. +// To use FsrEasuCon() on the CPU, define A_CPU before including ffx_a and ffx_fsr1. +// Including a GPU example here, the 'con0' through 'con3' values would be stored out to a constant buffer. +// AU4 con0,con1,con2,con3; +// FsrEasuCon(con0,con1,con2,con3, +// 1920.0,1080.0, // Viewport size (top left aligned) in the input image which is to be scaled. +// 3840.0,2160.0, // The size of the input image. +// 2560.0,1440.0); // The output resolution. +//============================================================================================================================== +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// CONSTANT SETUP +//============================================================================================================================== +// Call to setup required constant values (works on CPU or GPU). +A_STATIC void FsrEasuCon( +outAU4 con0, +outAU4 con1, +outAU4 con2, +outAU4 con3, +// This the rendered image resolution being upscaled +AF1 inputViewportInPixelsX, +AF1 inputViewportInPixelsY, +// This is the resolution of the resource containing the input image (useful for dynamic resolution) +AF1 inputSizeInPixelsX, +AF1 inputSizeInPixelsY, +// This is the display resolution which the input image gets upscaled to +AF1 outputSizeInPixelsX, +AF1 outputSizeInPixelsY){ + // Output integer position to a pixel position in viewport. + con0[0]=AU1_AF1(inputViewportInPixelsX*ARcpF1(outputSizeInPixelsX)); + con0[1]=AU1_AF1(inputViewportInPixelsY*ARcpF1(outputSizeInPixelsY)); + con0[2]=AU1_AF1(AF1_(0.5)*inputViewportInPixelsX*ARcpF1(outputSizeInPixelsX)-AF1_(0.5)); + con0[3]=AU1_AF1(AF1_(0.5)*inputViewportInPixelsY*ARcpF1(outputSizeInPixelsY)-AF1_(0.5)); + // Viewport pixel position to normalized image space. + // This is used to get upper-left of 'F' tap. + con1[0]=AU1_AF1(ARcpF1(inputSizeInPixelsX)); + con1[1]=AU1_AF1(ARcpF1(inputSizeInPixelsY)); + // Centers of gather4, first offset from upper-left of 'F'. + // +---+---+ + // | | | + // +--(0)--+ + // | b | c | + // +---F---+---+---+ + // | e | f | g | h | + // +--(1)--+--(2)--+ + // | i | j | k | l | + // +---+---+---+---+ + // | n | o | + // +--(3)--+ + // | | | + // +---+---+ + con1[2]=AU1_AF1(AF1_( 1.0)*ARcpF1(inputSizeInPixelsX)); + con1[3]=AU1_AF1(AF1_(-1.0)*ARcpF1(inputSizeInPixelsY)); + // These are from (0) instead of 'F'. + con2[0]=AU1_AF1(AF1_(-1.0)*ARcpF1(inputSizeInPixelsX)); + con2[1]=AU1_AF1(AF1_( 2.0)*ARcpF1(inputSizeInPixelsY)); + con2[2]=AU1_AF1(AF1_( 1.0)*ARcpF1(inputSizeInPixelsX)); + con2[3]=AU1_AF1(AF1_( 2.0)*ARcpF1(inputSizeInPixelsY)); + con3[0]=AU1_AF1(AF1_( 0.0)*ARcpF1(inputSizeInPixelsX)); + con3[1]=AU1_AF1(AF1_( 4.0)*ARcpF1(inputSizeInPixelsY)); + con3[2]=con3[3]=0;} + +//If the an offset into the input image resource +A_STATIC void FsrEasuConOffset( + outAU4 con0, + outAU4 con1, + outAU4 con2, + outAU4 con3, + // This the rendered image resolution being upscaled + AF1 inputViewportInPixelsX, + AF1 inputViewportInPixelsY, + // This is the resolution of the resource containing the input image (useful for dynamic resolution) + AF1 inputSizeInPixelsX, + AF1 inputSizeInPixelsY, + // This is the display resolution which the input image gets upscaled to + AF1 outputSizeInPixelsX, + AF1 outputSizeInPixelsY, + // This is the input image offset into the resource containing it (useful for dynamic resolution) + AF1 inputOffsetInPixelsX, + AF1 inputOffsetInPixelsY) { + FsrEasuCon(con0, con1, con2, con3, inputViewportInPixelsX, inputViewportInPixelsY, inputSizeInPixelsX, inputSizeInPixelsY, outputSizeInPixelsX, outputSizeInPixelsY); + con0[2] = AU1_AF1(AF1_(0.5) * inputViewportInPixelsX * ARcpF1(outputSizeInPixelsX) - AF1_(0.5) + inputOffsetInPixelsX); + con0[3] = AU1_AF1(AF1_(0.5) * inputViewportInPixelsY * ARcpF1(outputSizeInPixelsY) - AF1_(0.5) + inputOffsetInPixelsY); +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// NON-PACKED 32-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(FSR_EASU_F) + // Input callback prototypes, need to be implemented by calling shader + AF4 FsrEasuRF(AF2 p); + AF4 FsrEasuGF(AF2 p); + AF4 FsrEasuBF(AF2 p); +//------------------------------------------------------------------------------------------------------------------------------ + // Filtering for a given tap for the scalar. + void FsrEasuTapF( + inout AF3 aC, // Accumulated color, with negative lobe. + inout AF1 aW, // Accumulated weight. + AF2 off, // Pixel offset from resolve position to tap. + AF2 dir, // Gradient direction. + AF2 len, // Length. + AF1 lob, // Negative lobe strength. + AF1 clp, // Clipping point. + AF3 c){ // Tap color. + // Rotate offset by direction. + AF2 v; + v.x=(off.x*( dir.x))+(off.y*dir.y); + v.y=(off.x*(-dir.y))+(off.y*dir.x); + // Anisotropy. + v*=len; + // Compute distance^2. + AF1 d2=v.x*v.x+v.y*v.y; + // Limit to the window as at corner, 2 taps can easily be outside. + d2=min(d2,clp); + // Approximation of lancos2 without sin() or rcp(), or sqrt() to get x. + // (25/16 * (2/5 * x^2 - 1)^2 - (25/16 - 1)) * (1/4 * x^2 - 1)^2 + // |_______________________________________| |_______________| + // base window + // The general form of the 'base' is, + // (a*(b*x^2-1)^2-(a-1)) + // Where 'a=1/(2*b-b^2)' and 'b' moves around the negative lobe. + AF1 wB=AF1_(2.0/5.0)*d2+AF1_(-1.0); + AF1 wA=lob*d2+AF1_(-1.0); + wB*=wB; + wA*=wA; + wB=AF1_(25.0/16.0)*wB+AF1_(-(25.0/16.0-1.0)); + AF1 w=wB*wA; + // Do weighted average. + aC+=c*w;aW+=w;} +//------------------------------------------------------------------------------------------------------------------------------ + // Accumulate direction and length. + void FsrEasuSetF( + inout AF2 dir, + inout AF1 len, + AF2 pp, + AP1 biS,AP1 biT,AP1 biU,AP1 biV, + AF1 lA,AF1 lB,AF1 lC,AF1 lD,AF1 lE){ + // Compute bilinear weight, branches factor out as predicates are compiler time immediates. + // s t + // u v + AF1 w = AF1_(0.0); + if(biS)w=(AF1_(1.0)-pp.x)*(AF1_(1.0)-pp.y); + if(biT)w= pp.x *(AF1_(1.0)-pp.y); + if(biU)w=(AF1_(1.0)-pp.x)* pp.y ; + if(biV)w= pp.x * pp.y ; + // Direction is the '+' diff. + // a + // b c d + // e + // Then takes magnitude from abs average of both sides of 'c'. + // Length converts gradient reversal to 0, smoothly to non-reversal at 1, shaped, then adding horz and vert terms. + AF1 dc=lD-lC; + AF1 cb=lC-lB; + AF1 lenX=max(abs(dc),abs(cb)); + lenX=APrxLoRcpF1(lenX); + AF1 dirX=lD-lB; + dir.x+=dirX*w; + lenX=ASatF1(abs(dirX)*lenX); + lenX*=lenX; + len+=lenX*w; + // Repeat for the y axis. + AF1 ec=lE-lC; + AF1 ca=lC-lA; + AF1 lenY=max(abs(ec),abs(ca)); + lenY=APrxLoRcpF1(lenY); + AF1 dirY=lE-lA; + dir.y+=dirY*w; + lenY=ASatF1(abs(dirY)*lenY); + lenY*=lenY; + len+=lenY*w;} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrEasuF( + out AF3 pix, + AU2 ip, // Integer pixel position in output. + AU4 con0, // Constants generated by FsrEasuCon(). + AU4 con1, + AU4 con2, + AU4 con3){ +//------------------------------------------------------------------------------------------------------------------------------ + // Get position of 'f'. + AF2 pp=AF2(ip)*AF2_AU2(con0.xy)+AF2_AU2(con0.zw); + AF2 fp=floor(pp); + pp-=fp; +//------------------------------------------------------------------------------------------------------------------------------ + // 12-tap kernel. + // b c + // e f g h + // i j k l + // n o + // Gather 4 ordering. + // a b + // r g + // For packed FP16, need either {rg} or {ab} so using the following setup for gather in all versions, + // a b <- unused (z) + // r g + // a b a b + // r g r g + // a b + // r g <- unused (z) + // Allowing dead-code removal to remove the 'z's. + AF2 p0=fp*AF2_AU2(con1.xy)+AF2_AU2(con1.zw); + // These are from p0 to avoid pulling two constants on pre-Navi hardware. + AF2 p1=p0+AF2_AU2(con2.xy); + AF2 p2=p0+AF2_AU2(con2.zw); + AF2 p3=p0+AF2_AU2(con3.xy); + AF4 bczzR=FsrEasuRF(p0); + AF4 bczzG=FsrEasuGF(p0); + AF4 bczzB=FsrEasuBF(p0); + AF4 ijfeR=FsrEasuRF(p1); + AF4 ijfeG=FsrEasuGF(p1); + AF4 ijfeB=FsrEasuBF(p1); + AF4 klhgR=FsrEasuRF(p2); + AF4 klhgG=FsrEasuGF(p2); + AF4 klhgB=FsrEasuBF(p2); + AF4 zzonR=FsrEasuRF(p3); + AF4 zzonG=FsrEasuGF(p3); + AF4 zzonB=FsrEasuBF(p3); +//------------------------------------------------------------------------------------------------------------------------------ + // Simplest multi-channel approximate luma possible (luma times 2, in 2 FMA/MAD). + AF4 bczzL=bczzB*AF4_(0.5)+(bczzR*AF4_(0.5)+bczzG); + AF4 ijfeL=ijfeB*AF4_(0.5)+(ijfeR*AF4_(0.5)+ijfeG); + AF4 klhgL=klhgB*AF4_(0.5)+(klhgR*AF4_(0.5)+klhgG); + AF4 zzonL=zzonB*AF4_(0.5)+(zzonR*AF4_(0.5)+zzonG); + // Rename. + AF1 bL=bczzL.x; + AF1 cL=bczzL.y; + AF1 iL=ijfeL.x; + AF1 jL=ijfeL.y; + AF1 fL=ijfeL.z; + AF1 eL=ijfeL.w; + AF1 kL=klhgL.x; + AF1 lL=klhgL.y; + AF1 hL=klhgL.z; + AF1 gL=klhgL.w; + AF1 oL=zzonL.z; + AF1 nL=zzonL.w; + // Accumulate for bilinear interpolation. + AF2 dir=AF2_(0.0); + AF1 len=AF1_(0.0); + FsrEasuSetF(dir,len,pp,true, false,false,false,bL,eL,fL,gL,jL); + FsrEasuSetF(dir,len,pp,false,true ,false,false,cL,fL,gL,hL,kL); + FsrEasuSetF(dir,len,pp,false,false,true ,false,fL,iL,jL,kL,nL); + FsrEasuSetF(dir,len,pp,false,false,false,true ,gL,jL,kL,lL,oL); +//------------------------------------------------------------------------------------------------------------------------------ + // Normalize with approximation, and cleanup close to zero. + AF2 dir2=dir*dir; + AF1 dirR=dir2.x+dir2.y; + AP1 zro=dirR w = -m/(n+e+w+s) +// 1 == (w*(n+e+w+s)+m)/(4*w+1) -> w = (1-m)/(n+e+w+s-4*1) +// Then chooses the 'w' which results in no clipping, limits 'w', and multiplies by the 'sharp' amount. +// This solution above has issues with MSAA input as the steps along the gradient cause edge detection issues. +// So RCAS uses 4x the maximum and 4x the minimum (depending on equation)in place of the individual taps. +// As well as switching from 'm' to either the minimum or maximum (depending on side), to help in energy conservation. +// This stabilizes RCAS. +// RCAS does a simple highpass which is normalized against the local contrast then shaped, +// 0.25 +// 0.25 -1 0.25 +// 0.25 +// This is used as a noise detection filter, to reduce the effect of RCAS on grain, and focus on real edges. +// +// GLSL example for the required callbacks : +// +// AH4 FsrRcasLoadH(ASW2 p){return AH4(imageLoad(imgSrc,ASU2(p)));} +// void FsrRcasInputH(inout AH1 r,inout AH1 g,inout AH1 b) +// { +// //do any simple input color conversions here or leave empty if none needed +// } +// +// FsrRcasCon need to be called from the CPU or GPU to set up constants. +// Including a GPU example here, the 'con' value would be stored out to a constant buffer. +// +// AU4 con; +// FsrRcasCon(con, +// 0.0); // The scale is {0.0 := maximum sharpness, to N>0, where N is the number of stops (halving) of the reduction of sharpness}. +// --------------- +// RCAS sharpening supports a CAS-like pass-through alpha via, +// #define FSR_RCAS_PASSTHROUGH_ALPHA 1 +// RCAS also supports a define to enable a more expensive path to avoid some sharpening of noise. +// Would suggest it is better to apply film grain after RCAS sharpening (and after scaling) instead of using this define, +// #define FSR_RCAS_DENOISE 1 +//============================================================================================================================== +// This is set at the limit of providing unnatural results for sharpening. +#define FSR_RCAS_LIMIT (0.25-(1.0/16.0)) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// CONSTANT SETUP +//============================================================================================================================== +// Call to setup required constant values (works on CPU or GPU). +A_STATIC void FsrRcasCon( +outAU4 con, +// The scale is {0.0 := maximum, to N>0, where N is the number of stops (halving) of the reduction of sharpness}. +AF1 sharpness){ + // Transform from stops to linear value. + sharpness=AExp2F1(-sharpness); + varAF2(hSharp)=initAF2(sharpness,sharpness); + con[0]=AU1_AF1(sharpness); + con[1]=AU1_AH2_AF2(hSharp); + con[2]=0; + con[3]=0;} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// NON-PACKED 32-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(FSR_RCAS_F) + // Input callback prototypes that need to be implemented by calling shader + AF4 FsrRcasLoadF(ASU2 p); + void FsrRcasInputF(inout AF1 r,inout AF1 g,inout AF1 b); +//------------------------------------------------------------------------------------------------------------------------------ + void FsrRcasF( + out AF1 pixR, // Output values, non-vector so port between RcasFilter() and RcasFilterH() is easy. + out AF1 pixG, + out AF1 pixB, + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + out AF1 pixA, + #endif + AU2 ip, // Integer pixel position in output. + AU4 con){ // Constant generated by RcasSetup(). + // Algorithm uses minimal 3x3 pixel neighborhood. + // b + // d e f + // h + ASU2 sp=ASU2(ip); + AF3 b=FsrRcasLoadF(sp+ASU2( 0,-1)).rgb; + AF3 d=FsrRcasLoadF(sp+ASU2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AF4 ee=FsrRcasLoadF(sp); + AF3 e=ee.rgb;pixA=ee.a; + #else + AF3 e=FsrRcasLoadF(sp).rgb; + #endif + AF3 f=FsrRcasLoadF(sp+ASU2( 1, 0)).rgb; + AF3 h=FsrRcasLoadF(sp+ASU2( 0, 1)).rgb; + // Rename (32-bit) or regroup (16-bit). + AF1 bR=b.r; + AF1 bG=b.g; + AF1 bB=b.b; + AF1 dR=d.r; + AF1 dG=d.g; + AF1 dB=d.b; + AF1 eR=e.r; + AF1 eG=e.g; + AF1 eB=e.b; + AF1 fR=f.r; + AF1 fG=f.g; + AF1 fB=f.b; + AF1 hR=h.r; + AF1 hG=h.g; + AF1 hB=h.b; + // Run optional input transform. + FsrRcasInputF(bR,bG,bB); + FsrRcasInputF(dR,dG,dB); + FsrRcasInputF(eR,eG,eB); + FsrRcasInputF(fR,fG,fB); + FsrRcasInputF(hR,hG,hB); + // Luma times 2. + AF1 bL=bB*AF1_(0.5)+(bR*AF1_(0.5)+bG); + AF1 dL=dB*AF1_(0.5)+(dR*AF1_(0.5)+dG); + AF1 eL=eB*AF1_(0.5)+(eR*AF1_(0.5)+eG); + AF1 fL=fB*AF1_(0.5)+(fR*AF1_(0.5)+fG); + AF1 hL=hB*AF1_(0.5)+(hR*AF1_(0.5)+hG); + // Noise detection. + AF1 nz=AF1_(0.25)*bL+AF1_(0.25)*dL+AF1_(0.25)*fL+AF1_(0.25)*hL-eL; + nz=ASatF1(abs(nz)*APrxMedRcpF1(AMax3F1(AMax3F1(bL,dL,eL),fL,hL)-AMin3F1(AMin3F1(bL,dL,eL),fL,hL))); + nz=AF1_(-0.5)*nz+AF1_(1.0); + // Min and max of ring. + AF1 mn4R=min(AMin3F1(bR,dR,fR),hR); + AF1 mn4G=min(AMin3F1(bG,dG,fG),hG); + AF1 mn4B=min(AMin3F1(bB,dB,fB),hB); + AF1 mx4R=max(AMax3F1(bR,dR,fR),hR); + AF1 mx4G=max(AMax3F1(bG,dG,fG),hG); + AF1 mx4B=max(AMax3F1(bB,dB,fB),hB); + // Immediate constants for peak range. + AF2 peakC=AF2(1.0,-1.0*4.0); + // Limiters, these need to be high precision RCPs. + AF1 hitMinR=min(mn4R,eR)*ARcpF1(AF1_(4.0)*mx4R); + AF1 hitMinG=min(mn4G,eG)*ARcpF1(AF1_(4.0)*mx4G); + AF1 hitMinB=min(mn4B,eB)*ARcpF1(AF1_(4.0)*mx4B); + AF1 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpF1(AF1_(4.0)*mn4R+peakC.y); + AF1 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpF1(AF1_(4.0)*mn4G+peakC.y); + AF1 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpF1(AF1_(4.0)*mn4B+peakC.y); + AF1 lobeR=max(-hitMinR,hitMaxR); + AF1 lobeG=max(-hitMinG,hitMaxG); + AF1 lobeB=max(-hitMinB,hitMaxB); + AF1 lobe=max(AF1_(-FSR_RCAS_LIMIT),min(AMax3F1(lobeR,lobeG,lobeB),AF1_(0.0)))*AF1_AU1(con.x); + // Apply noise removal. + #ifdef FSR_RCAS_DENOISE + lobe*=nz; + #endif + // Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes. + AF1 rcpL=APrxMedRcpF1(AF1_(4.0)*lobe+AF1_(1.0)); + pixR=(lobe*bR+lobe*dR+lobe*hR+lobe*fR+eR)*rcpL; + pixG=(lobe*bG+lobe*dG+lobe*hG+lobe*fG+eG)*rcpL; + pixB=(lobe*bB+lobe*dB+lobe*hB+lobe*fB+eB)*rcpL; + return;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// NON-PACKED 16-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF)&&defined(FSR_RCAS_H) + // Input callback prototypes that need to be implemented by calling shader + AH4 FsrRcasLoadH(ASW2 p); + void FsrRcasInputH(inout AH1 r,inout AH1 g,inout AH1 b); +//------------------------------------------------------------------------------------------------------------------------------ + void FsrRcasH( + out AH1 pixR, // Output values, non-vector so port between RcasFilter() and RcasFilterH() is easy. + out AH1 pixG, + out AH1 pixB, + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + out AH1 pixA, + #endif + AU2 ip, // Integer pixel position in output. + AU4 con){ // Constant generated by RcasSetup(). + // Sharpening algorithm uses minimal 3x3 pixel neighborhood. + // b + // d e f + // h + ASW2 sp=ASW2(ip); + AH3 b=FsrRcasLoadH(sp+ASW2( 0,-1)).rgb; + AH3 d=FsrRcasLoadH(sp+ASW2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AH4 ee=FsrRcasLoadH(sp); + AH3 e=ee.rgb;pixA=ee.a; + #else + AH3 e=FsrRcasLoadH(sp).rgb; + #endif + AH3 f=FsrRcasLoadH(sp+ASW2( 1, 0)).rgb; + AH3 h=FsrRcasLoadH(sp+ASW2( 0, 1)).rgb; + // Rename (32-bit) or regroup (16-bit). + AH1 bR=b.r; + AH1 bG=b.g; + AH1 bB=b.b; + AH1 dR=d.r; + AH1 dG=d.g; + AH1 dB=d.b; + AH1 eR=e.r; + AH1 eG=e.g; + AH1 eB=e.b; + AH1 fR=f.r; + AH1 fG=f.g; + AH1 fB=f.b; + AH1 hR=h.r; + AH1 hG=h.g; + AH1 hB=h.b; + // Run optional input transform. + FsrRcasInputH(bR,bG,bB); + FsrRcasInputH(dR,dG,dB); + FsrRcasInputH(eR,eG,eB); + FsrRcasInputH(fR,fG,fB); + FsrRcasInputH(hR,hG,hB); + // Luma times 2. + AH1 bL=bB*AH1_(0.5)+(bR*AH1_(0.5)+bG); + AH1 dL=dB*AH1_(0.5)+(dR*AH1_(0.5)+dG); + AH1 eL=eB*AH1_(0.5)+(eR*AH1_(0.5)+eG); + AH1 fL=fB*AH1_(0.5)+(fR*AH1_(0.5)+fG); + AH1 hL=hB*AH1_(0.5)+(hR*AH1_(0.5)+hG); + // Noise detection. + AH1 nz=AH1_(0.25)*bL+AH1_(0.25)*dL+AH1_(0.25)*fL+AH1_(0.25)*hL-eL; + nz=ASatH1(abs(nz)*APrxMedRcpH1(AMax3H1(AMax3H1(bL,dL,eL),fL,hL)-AMin3H1(AMin3H1(bL,dL,eL),fL,hL))); + nz=AH1_(-0.5)*nz+AH1_(1.0); + // Min and max of ring. + AH1 mn4R=min(AMin3H1(bR,dR,fR),hR); + AH1 mn4G=min(AMin3H1(bG,dG,fG),hG); + AH1 mn4B=min(AMin3H1(bB,dB,fB),hB); + AH1 mx4R=max(AMax3H1(bR,dR,fR),hR); + AH1 mx4G=max(AMax3H1(bG,dG,fG),hG); + AH1 mx4B=max(AMax3H1(bB,dB,fB),hB); + // Immediate constants for peak range. + AH2 peakC=AH2(1.0,-1.0*4.0); + // Limiters, these need to be high precision RCPs. + AH1 hitMinR=min(mn4R,eR)*ARcpH1(AH1_(4.0)*mx4R); + AH1 hitMinG=min(mn4G,eG)*ARcpH1(AH1_(4.0)*mx4G); + AH1 hitMinB=min(mn4B,eB)*ARcpH1(AH1_(4.0)*mx4B); + AH1 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpH1(AH1_(4.0)*mn4R+peakC.y); + AH1 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpH1(AH1_(4.0)*mn4G+peakC.y); + AH1 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpH1(AH1_(4.0)*mn4B+peakC.y); + AH1 lobeR=max(-hitMinR,hitMaxR); + AH1 lobeG=max(-hitMinG,hitMaxG); + AH1 lobeB=max(-hitMinB,hitMaxB); + AH1 lobe=max(AH1_(-FSR_RCAS_LIMIT),min(AMax3H1(lobeR,lobeG,lobeB),AH1_(0.0)))*AH2_AU1(con.y).x; + // Apply noise removal. + #ifdef FSR_RCAS_DENOISE + lobe*=nz; + #endif + // Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes. + AH1 rcpL=APrxMedRcpH1(AH1_(4.0)*lobe+AH1_(1.0)); + pixR=(lobe*bR+lobe*dR+lobe*hR+lobe*fR+eR)*rcpL; + pixG=(lobe*bG+lobe*dG+lobe*hG+lobe*fG+eG)*rcpL; + pixB=(lobe*bB+lobe*dB+lobe*hB+lobe*fB+eB)*rcpL;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// PACKED 16-BIT VERSION +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF)&&defined(FSR_RCAS_HX2) + // Input callback prototypes that need to be implemented by the calling shader + AH4 FsrRcasLoadHx2(ASW2 p); + void FsrRcasInputHx2(inout AH2 r,inout AH2 g,inout AH2 b); +//------------------------------------------------------------------------------------------------------------------------------ + // Can be used to convert from packed Structures of Arrays to Arrays of Structures for store. + void FsrRcasDepackHx2(out AH4 pix0,out AH4 pix1,AH2 pixR,AH2 pixG,AH2 pixB){ + #ifdef A_HLSL + // Invoke a slower path for DX only, since it won't allow uninitialized values. + pix0.a=pix1.a=0.0; + #endif + pix0.rgb=AH3(pixR.x,pixG.x,pixB.x); + pix1.rgb=AH3(pixR.y,pixG.y,pixB.y);} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrRcasHx2( + // Output values are for 2 8x8 tiles in a 16x8 region. + // pix.x = left 8x8 tile + // pix.y = right 8x8 tile + // This enables later processing to easily be packed as well. + out AH2 pixR, + out AH2 pixG, + out AH2 pixB, + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + out AH2 pixA, + #endif + AU2 ip, // Integer pixel position in output. + AU4 con){ // Constant generated by RcasSetup(). + // No scaling algorithm uses minimal 3x3 pixel neighborhood. + ASW2 sp0=ASW2(ip); + AH3 b0=FsrRcasLoadHx2(sp0+ASW2( 0,-1)).rgb; + AH3 d0=FsrRcasLoadHx2(sp0+ASW2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AH4 ee0=FsrRcasLoadHx2(sp0); + AH3 e0=ee0.rgb;pixA.r=ee0.a; + #else + AH3 e0=FsrRcasLoadHx2(sp0).rgb; + #endif + AH3 f0=FsrRcasLoadHx2(sp0+ASW2( 1, 0)).rgb; + AH3 h0=FsrRcasLoadHx2(sp0+ASW2( 0, 1)).rgb; + ASW2 sp1=sp0+ASW2(8,0); + AH3 b1=FsrRcasLoadHx2(sp1+ASW2( 0,-1)).rgb; + AH3 d1=FsrRcasLoadHx2(sp1+ASW2(-1, 0)).rgb; + #ifdef FSR_RCAS_PASSTHROUGH_ALPHA + AH4 ee1=FsrRcasLoadHx2(sp1); + AH3 e1=ee1.rgb;pixA.g=ee1.a; + #else + AH3 e1=FsrRcasLoadHx2(sp1).rgb; + #endif + AH3 f1=FsrRcasLoadHx2(sp1+ASW2( 1, 0)).rgb; + AH3 h1=FsrRcasLoadHx2(sp1+ASW2( 0, 1)).rgb; + // Arrays of Structures to Structures of Arrays conversion. + AH2 bR=AH2(b0.r,b1.r); + AH2 bG=AH2(b0.g,b1.g); + AH2 bB=AH2(b0.b,b1.b); + AH2 dR=AH2(d0.r,d1.r); + AH2 dG=AH2(d0.g,d1.g); + AH2 dB=AH2(d0.b,d1.b); + AH2 eR=AH2(e0.r,e1.r); + AH2 eG=AH2(e0.g,e1.g); + AH2 eB=AH2(e0.b,e1.b); + AH2 fR=AH2(f0.r,f1.r); + AH2 fG=AH2(f0.g,f1.g); + AH2 fB=AH2(f0.b,f1.b); + AH2 hR=AH2(h0.r,h1.r); + AH2 hG=AH2(h0.g,h1.g); + AH2 hB=AH2(h0.b,h1.b); + // Run optional input transform. + FsrRcasInputHx2(bR,bG,bB); + FsrRcasInputHx2(dR,dG,dB); + FsrRcasInputHx2(eR,eG,eB); + FsrRcasInputHx2(fR,fG,fB); + FsrRcasInputHx2(hR,hG,hB); + // Luma times 2. + AH2 bL=bB*AH2_(0.5)+(bR*AH2_(0.5)+bG); + AH2 dL=dB*AH2_(0.5)+(dR*AH2_(0.5)+dG); + AH2 eL=eB*AH2_(0.5)+(eR*AH2_(0.5)+eG); + AH2 fL=fB*AH2_(0.5)+(fR*AH2_(0.5)+fG); + AH2 hL=hB*AH2_(0.5)+(hR*AH2_(0.5)+hG); + // Noise detection. + AH2 nz=AH2_(0.25)*bL+AH2_(0.25)*dL+AH2_(0.25)*fL+AH2_(0.25)*hL-eL; + nz=ASatH2(abs(nz)*APrxMedRcpH2(AMax3H2(AMax3H2(bL,dL,eL),fL,hL)-AMin3H2(AMin3H2(bL,dL,eL),fL,hL))); + nz=AH2_(-0.5)*nz+AH2_(1.0); + // Min and max of ring. + AH2 mn4R=min(AMin3H2(bR,dR,fR),hR); + AH2 mn4G=min(AMin3H2(bG,dG,fG),hG); + AH2 mn4B=min(AMin3H2(bB,dB,fB),hB); + AH2 mx4R=max(AMax3H2(bR,dR,fR),hR); + AH2 mx4G=max(AMax3H2(bG,dG,fG),hG); + AH2 mx4B=max(AMax3H2(bB,dB,fB),hB); + // Immediate constants for peak range. + AH2 peakC=AH2(1.0,-1.0*4.0); + // Limiters, these need to be high precision RCPs. + AH2 hitMinR=min(mn4R,eR)*ARcpH2(AH2_(4.0)*mx4R); + AH2 hitMinG=min(mn4G,eG)*ARcpH2(AH2_(4.0)*mx4G); + AH2 hitMinB=min(mn4B,eB)*ARcpH2(AH2_(4.0)*mx4B); + AH2 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpH2(AH2_(4.0)*mn4R+peakC.y); + AH2 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpH2(AH2_(4.0)*mn4G+peakC.y); + AH2 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpH2(AH2_(4.0)*mn4B+peakC.y); + AH2 lobeR=max(-hitMinR,hitMaxR); + AH2 lobeG=max(-hitMinG,hitMaxG); + AH2 lobeB=max(-hitMinB,hitMaxB); + AH2 lobe=max(AH2_(-FSR_RCAS_LIMIT),min(AMax3H2(lobeR,lobeG,lobeB),AH2_(0.0)))*AH2_(AH2_AU1(con.y).x); + // Apply noise removal. + #ifdef FSR_RCAS_DENOISE + lobe*=nz; + #endif + // Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes. + AH2 rcpL=APrxMedRcpH2(AH2_(4.0)*lobe+AH2_(1.0)); + pixR=(lobe*bR+lobe*dR+lobe*hR+lobe*fR+eR)*rcpL; + pixG=(lobe*bG+lobe*dG+lobe*hG+lobe*fG+eG)*rcpL; + pixB=(lobe*bB+lobe*dB+lobe*hB+lobe*fB+eB)*rcpL;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [LFGA] LINEAR FILM GRAIN APPLICATOR +// +//------------------------------------------------------------------------------------------------------------------------------ +// Adding output-resolution film grain after scaling is a good way to mask both rendering and scaling artifacts. +// Suggest using tiled blue noise as film grain input, with peak noise frequency set for a specific look and feel. +// The 'Lfga*()' functions provide a convenient way to introduce grain. +// These functions limit grain based on distance to signal limits. +// This is done so that the grain is temporally energy preserving, and thus won't modify image tonality. +// Grain application should be done in a linear colorspace. +// The grain should be temporally changing, but have a temporal sum per pixel that adds to zero (non-biased). +//------------------------------------------------------------------------------------------------------------------------------ +// Usage, +// FsrLfga*( +// color, // In/out linear colorspace color {0 to 1} ranged. +// grain, // Per pixel grain texture value {-0.5 to 0.5} ranged, input is 3-channel to support colored grain. +// amount); // Amount of grain (0 to 1} ranged. +//------------------------------------------------------------------------------------------------------------------------------ +// Example if grain texture is monochrome: 'FsrLfgaF(color,AF3_(grain),amount)' +//============================================================================================================================== +#if defined(A_GPU) + // Maximum grain is the minimum distance to the signal limit. + void FsrLfgaF(inout AF3 c,AF3 t,AF1 a){c+=(t*AF3_(a))*min(AF3_(1.0)-c,c);} +#endif +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF) + // Half precision version (slower). + void FsrLfgaH(inout AH3 c,AH3 t,AH1 a){c+=(t*AH3_(a))*min(AH3_(1.0)-c,c);} +//------------------------------------------------------------------------------------------------------------------------------ + // Packed half precision version (faster). + void FsrLfgaHx2(inout AH2 cR,inout AH2 cG,inout AH2 cB,AH2 tR,AH2 tG,AH2 tB,AH1 a){ + cR+=(tR*AH2_(a))*min(AH2_(1.0)-cR,cR);cG+=(tG*AH2_(a))*min(AH2_(1.0)-cG,cG);cB+=(tB*AH2_(a))*min(AH2_(1.0)-cB,cB);} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [SRTM] SIMPLE REVERSIBLE TONE-MAPPER +// +//------------------------------------------------------------------------------------------------------------------------------ +// This provides a way to take linear HDR color {0 to FP16_MAX} and convert it into a temporary {0 to 1} ranged post-tonemapped linear. +// The tonemapper preserves RGB ratio, which helps maintain HDR color bleed during filtering. +//------------------------------------------------------------------------------------------------------------------------------ +// Reversible tonemapper usage, +// FsrSrtm*(color); // {0 to FP16_MAX} converted to {0 to 1}. +// FsrSrtmInv*(color); // {0 to 1} converted into {0 to 32768, output peak safe for FP16}. +//============================================================================================================================== +#if defined(A_GPU) + void FsrSrtmF(inout AF3 c){c*=AF3_(ARcpF1(AMax3F1(c.r,c.g,c.b)+AF1_(1.0)));} + // The extra max solves the c=1.0 case (which is a /0). + void FsrSrtmInvF(inout AF3 c){c*=AF3_(ARcpF1(max(AF1_(1.0/32768.0),AF1_(1.0)-AMax3F1(c.r,c.g,c.b))));} +#endif +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF) + void FsrSrtmH(inout AH3 c){c*=AH3_(ARcpH1(AMax3H1(c.r,c.g,c.b)+AH1_(1.0)));} + void FsrSrtmInvH(inout AH3 c){c*=AH3_(ARcpH1(max(AH1_(1.0/32768.0),AH1_(1.0)-AMax3H1(c.r,c.g,c.b))));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrSrtmHx2(inout AH2 cR,inout AH2 cG,inout AH2 cB){ + AH2 rcp=ARcpH2(AMax3H2(cR,cG,cB)+AH2_(1.0));cR*=rcp;cG*=rcp;cB*=rcp;} + void FsrSrtmInvHx2(inout AH2 cR,inout AH2 cG,inout AH2 cB){ + AH2 rcp=ARcpH2(max(AH2_(1.0/32768.0),AH2_(1.0)-AMax3H2(cR,cG,cB)));cR*=rcp;cG*=rcp;cB*=rcp;} +#endif +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//_____________________________________________________________/\_______________________________________________________________ +//============================================================================================================================== +// +// FSR - [TEPD] TEMPORAL ENERGY PRESERVING DITHER +// +//------------------------------------------------------------------------------------------------------------------------------ +// Temporally energy preserving dithered {0 to 1} linear to gamma 2.0 conversion. +// Gamma 2.0 is used so that the conversion back to linear is just to square the color. +// The conversion comes in 8-bit and 10-bit modes, designed for output to 8-bit UNORM or 10:10:10:2 respectively. +// Given good non-biased temporal blue noise as dither input, +// the output dither will temporally conserve energy. +// This is done by choosing the linear nearest step point instead of perceptual nearest. +// See code below for details. +//------------------------------------------------------------------------------------------------------------------------------ +// DX SPEC RULES FOR FLOAT->UNORM 8-BIT CONVERSION +// =============================================== +// - Output is 'uint(floor(saturate(n)*255.0+0.5))'. +// - Thus rounding is to nearest. +// - NaN gets converted to zero. +// - INF is clamped to {0.0 to 1.0}. +//============================================================================================================================== +#if defined(A_GPU) + // Hand tuned integer position to dither value, with more values than simple checkerboard. + // Only 32-bit has enough precision for this compddation. + // Output is {0 to <1}. + AF1 FsrTepdDitF(AU2 p,AU1 f){ + AF1 x=AF1_(p.x+f); + AF1 y=AF1_(p.y); + // The 1.61803 golden ratio. + AF1 a=AF1_((1.0+sqrt(5.0))/2.0); + // Number designed to provide a good visual pattern. + AF1 b=AF1_(1.0/3.69); + x=x*a+(y*b); + return AFractF1(x);} +//------------------------------------------------------------------------------------------------------------------------------ + // This version is 8-bit gamma 2.0. + // The 'c' input is {0 to 1}. + // Output is {0 to 1} ready for image store. + void FsrTepdC8F(inout AF3 c,AF1 dit){ + AF3 n=sqrt(c); + n=floor(n*AF3_(255.0))*AF3_(1.0/255.0); + AF3 a=n*n; + AF3 b=n+AF3_(1.0/255.0);b=b*b; + // Ratio of 'a' to 'b' required to produce 'c'. + // APrxLoRcpF1() won't work here (at least for very high dynamic ranges). + // APrxMedRcpF1() is an IADD,FMA,MUL. + AF3 r=(c-b)*APrxMedRcpF3(a-b); + // Use the ratio as a cutoff to choose 'a' or 'b'. + // AGtZeroF1() is a MUL. + c=ASatF3(n+AGtZeroF3(AF3_(dit)-r)*AF3_(1.0/255.0));} +//------------------------------------------------------------------------------------------------------------------------------ + // This version is 10-bit gamma 2.0. + // The 'c' input is {0 to 1}. + // Output is {0 to 1} ready for image store. + void FsrTepdC10F(inout AF3 c,AF1 dit){ + AF3 n=sqrt(c); + n=floor(n*AF3_(1023.0))*AF3_(1.0/1023.0); + AF3 a=n*n; + AF3 b=n+AF3_(1.0/1023.0);b=b*b; + AF3 r=(c-b)*APrxMedRcpF3(a-b); + c=ASatF3(n+AGtZeroF3(AF3_(dit)-r)*AF3_(1.0/1023.0));} +#endif +//============================================================================================================================== +#if defined(A_GPU)&&defined(A_HALF) + AH1 FsrTepdDitH(AU2 p,AU1 f){ + AF1 x=AF1_(p.x+f); + AF1 y=AF1_(p.y); + AF1 a=AF1_((1.0+sqrt(5.0))/2.0); + AF1 b=AF1_(1.0/3.69); + x=x*a+(y*b); + return AH1(AFractF1(x));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC8H(inout AH3 c,AH1 dit){ + AH3 n=sqrt(c); + n=floor(n*AH3_(255.0))*AH3_(1.0/255.0); + AH3 a=n*n; + AH3 b=n+AH3_(1.0/255.0);b=b*b; + AH3 r=(c-b)*APrxMedRcpH3(a-b); + c=ASatH3(n+AGtZeroH3(AH3_(dit)-r)*AH3_(1.0/255.0));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC10H(inout AH3 c,AH1 dit){ + AH3 n=sqrt(c); + n=floor(n*AH3_(1023.0))*AH3_(1.0/1023.0); + AH3 a=n*n; + AH3 b=n+AH3_(1.0/1023.0);b=b*b; + AH3 r=(c-b)*APrxMedRcpH3(a-b); + c=ASatH3(n+AGtZeroH3(AH3_(dit)-r)*AH3_(1.0/1023.0));} +//============================================================================================================================== + // This computes dither for positions 'p' and 'p+{8,0}'. + AH2 FsrTepdDitHx2(AU2 p,AU1 f){ + AF2 x; + x.x=AF1_(p.x+f); + x.y=x.x+AF1_(8.0); + AF1 y=AF1_(p.y); + AF1 a=AF1_((1.0+sqrt(5.0))/2.0); + AF1 b=AF1_(1.0/3.69); + x=x*AF2_(a)+AF2_(y*b); + return AH2(AFractF2(x));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC8Hx2(inout AH2 cR,inout AH2 cG,inout AH2 cB,AH2 dit){ + AH2 nR=sqrt(cR); + AH2 nG=sqrt(cG); + AH2 nB=sqrt(cB); + nR=floor(nR*AH2_(255.0))*AH2_(1.0/255.0); + nG=floor(nG*AH2_(255.0))*AH2_(1.0/255.0); + nB=floor(nB*AH2_(255.0))*AH2_(1.0/255.0); + AH2 aR=nR*nR; + AH2 aG=nG*nG; + AH2 aB=nB*nB; + AH2 bR=nR+AH2_(1.0/255.0);bR=bR*bR; + AH2 bG=nG+AH2_(1.0/255.0);bG=bG*bG; + AH2 bB=nB+AH2_(1.0/255.0);bB=bB*bB; + AH2 rR=(cR-bR)*APrxMedRcpH2(aR-bR); + AH2 rG=(cG-bG)*APrxMedRcpH2(aG-bG); + AH2 rB=(cB-bB)*APrxMedRcpH2(aB-bB); + cR=ASatH2(nR+AGtZeroH2(dit-rR)*AH2_(1.0/255.0)); + cG=ASatH2(nG+AGtZeroH2(dit-rG)*AH2_(1.0/255.0)); + cB=ASatH2(nB+AGtZeroH2(dit-rB)*AH2_(1.0/255.0));} +//------------------------------------------------------------------------------------------------------------------------------ + void FsrTepdC10Hx2(inout AH2 cR,inout AH2 cG,inout AH2 cB,AH2 dit){ + AH2 nR=sqrt(cR); + AH2 nG=sqrt(cG); + AH2 nB=sqrt(cB); + nR=floor(nR*AH2_(1023.0))*AH2_(1.0/1023.0); + nG=floor(nG*AH2_(1023.0))*AH2_(1.0/1023.0); + nB=floor(nB*AH2_(1023.0))*AH2_(1.0/1023.0); + AH2 aR=nR*nR; + AH2 aG=nG*nG; + AH2 aB=nB*nB; + AH2 bR=nR+AH2_(1.0/1023.0);bR=bR*bR; + AH2 bG=nG+AH2_(1.0/1023.0);bG=bG*bG; + AH2 bB=nB+AH2_(1.0/1023.0);bB=bB*bB; + AH2 rR=(cR-bR)*APrxMedRcpH2(aR-bR); + AH2 rG=(cG-bG)*APrxMedRcpH2(aG-bG); + AH2 rB=(cB-bB)*APrxMedRcpH2(aB-bB); + cR=ASatH2(nR+AGtZeroH2(dit-rR)*AH2_(1.0/1023.0)); + cG=ASatH2(nG+AGtZeroH2(dit-rG)*AH2_(1.0/1023.0)); + cB=ASatH2(nB+AGtZeroH2(dit-rB)*AH2_(1.0/1023.0));} +#endif diff --git a/src/video_core/host_shaders/post_process.frag b/src/video_core/host_shaders/post_process.frag index d222d070c..fb0917528 100644 --- a/src/video_core/host_shaders/post_process.frag +++ b/src/video_core/host_shaders/post_process.frag @@ -8,7 +8,7 @@ layout (location = 0) out vec4 color; layout (binding = 0) uniform sampler2D texSampler; -layout(push_constant) uniform settings { +layout (push_constant) uniform settings { float gamma; bool hdr; } pp; diff --git a/src/video_core/host_shaders/source_shader.h.in b/src/video_core/host_shaders/source_shader.h.in index 43bf5b0c5..3472b2837 100644 --- a/src/video_core/host_shaders/source_shader.h.in +++ b/src/video_core/host_shaders/source_shader.h.in @@ -7,8 +7,8 @@ namespace HostShaders { -constexpr std::string_view @CONTENTS_NAME@ = { +constexpr std::string_view @CONTENTS_NAME@ = R"shader_src( @CONTENTS@ -}; +)shader_src"; } // namespace HostShaders diff --git a/src/video_core/renderer_vulkan/host_passes/fsr_pass.cpp b/src/video_core/renderer_vulkan/host_passes/fsr_pass.cpp new file mode 100644 index 000000000..1c54207e0 --- /dev/null +++ b/src/video_core/renderer_vulkan/host_passes/fsr_pass.cpp @@ -0,0 +1,445 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "fsr_pass.h" + +#include "common/assert.h" +#include "video_core/host_shaders/fsr_comp.h" +#include "video_core/renderer_vulkan/vk_platform.h" +#include "video_core/renderer_vulkan/vk_shader_util.h" + +#define A_CPU +#include "core/debug_state.h" +#include "video_core/host_shaders/fsr/ffx_a.h" +#include "video_core/host_shaders/fsr/ffx_fsr1.h" + +typedef u32 uvec4[4]; + +struct FSRConstants { + uvec4 Const0; + uvec4 Const1; + uvec4 Const2; + uvec4 Const3; + uvec4 Sample; +}; + +namespace Vulkan::HostPasses { + +void FsrPass::Create(vk::Device device, VmaAllocator allocator, u32 num_images) { + this->device = device; + this->num_images = num_images; + + sampler = Check<"create upscaling sampler">(device.createSamplerUnique(vk::SamplerCreateInfo{ + .magFilter = vk::Filter::eLinear, + .minFilter = vk::Filter::eLinear, + .mipmapMode = vk::SamplerMipmapMode::eNearest, + .addressModeU = vk::SamplerAddressMode::eClampToEdge, + .addressModeV = vk::SamplerAddressMode::eClampToEdge, + .addressModeW = vk::SamplerAddressMode::eClampToEdge, + .maxAnisotropy = 1.0f, + .minLod = -1000.0f, + .maxLod = 1000.0f, + })); + + std::array layoutBindings{{ + { + .binding = 0, + .descriptorType = vk::DescriptorType::eSampledImage, + .descriptorCount = 1, + .stageFlags = vk::ShaderStageFlagBits::eCompute, + }, + { + .binding = 1, + .descriptorType = vk::DescriptorType::eStorageImage, + .descriptorCount = 1, + .stageFlags = vk::ShaderStageFlagBits::eCompute, + }, + { + .binding = 2, + .descriptorType = vk::DescriptorType::eSampler, + .descriptorCount = 1, + .stageFlags = vk::ShaderStageFlagBits::eCompute, + .pImmutableSamplers = &sampler.get(), + }, + }}; + + descriptor_set_layout = + Check<"create fsr descriptor set layout">(device.createDescriptorSetLayoutUnique({ + .flags = vk::DescriptorSetLayoutCreateFlagBits::ePushDescriptor, + .bindingCount = layoutBindings.size(), + .pBindings = layoutBindings.data(), + })); + + const vk::PushConstantRange push_constants{ + .stageFlags = vk::ShaderStageFlagBits::eCompute, + .offset = 0, + .size = sizeof(FSRConstants), + }; + + const auto& cs_easu_module = + Compile(HostShaders::FSR_COMP, vk::ShaderStageFlagBits::eCompute, device, + { + "SAMPLE_EASU=1", + }); + ASSERT(cs_easu_module); + SetObjectName(device, cs_easu_module, "fsr.comp [EASU]"); + + const auto& cs_rcas_module = + Compile(HostShaders::FSR_COMP, vk::ShaderStageFlagBits::eCompute, device, + { + "SAMPLE_RCAS=1", + }); + ASSERT(cs_rcas_module); + SetObjectName(device, cs_rcas_module, "fsr.comp [RCAS]"); + + pipeline_layout = Check<"fsp pipeline layout">(device.createPipelineLayoutUnique({ + .setLayoutCount = 1, + .pSetLayouts = &descriptor_set_layout.get(), + .pushConstantRangeCount = 1, + .pPushConstantRanges = &push_constants, + })); + SetObjectName(device, pipeline_layout.get(), "fsr pipeline layout"); + + const vk::ComputePipelineCreateInfo easu_pinfo{ + .stage{ + .stage = vk::ShaderStageFlagBits::eCompute, + .module = cs_easu_module, + .pName = "main", + }, + .layout = pipeline_layout.get(), + }; + easu_pipeline = + Check<"fsp easu compute pipelines">(device.createComputePipelineUnique({}, easu_pinfo)); + SetObjectName(device, easu_pipeline.get(), "fsr easu pipeline"); + + const vk::ComputePipelineCreateInfo rcas_pinfo{ + .stage{ + .stage = vk::ShaderStageFlagBits::eCompute, + .module = cs_rcas_module, + .pName = "main", + }, + .layout = pipeline_layout.get(), + }; + rcas_pipeline = + Check<"fsp rcas compute pipelines">(device.createComputePipelineUnique({}, rcas_pinfo)); + SetObjectName(device, rcas_pipeline.get(), "fsr rcas pipeline"); + + device.destroyShaderModule(cs_easu_module); + device.destroyShaderModule(cs_rcas_module); + + available_imgs.resize(num_images); + for (int i = 0; i < num_images; ++i) { + auto& img = available_imgs[i]; + img.id = i; + img.intermediary_image = VideoCore::UniqueImage(device, allocator); + img.output_image = VideoCore::UniqueImage(device, allocator); + } +} + +vk::ImageView FsrPass::Render(vk::CommandBuffer cmdbuf, vk::ImageView input, + vk::Extent2D input_size, vk::Extent2D output_size, Settings settings, + bool hdr) { + if (!settings.enable) { + DebugState.is_using_fsr = false; + return input; + } + if (input_size.width >= output_size.width && input_size.height >= output_size.height) { + DebugState.is_using_fsr = false; + return input; + } + + DebugState.is_using_fsr = true; + + if (output_size != cur_size) { + ResizeAndInvalidate(output_size.width, output_size.height); + } + auto [width, height] = cur_size; + + auto& img = available_imgs[cur_image]; + if (++cur_image >= available_imgs.size()) { + cur_image = 0; + } + + if (img.dirty) { + CreateImages(img); + } + + static const int thread_group_work_region_dim = 16; + int dispatch_x = (width + (thread_group_work_region_dim - 1)) / thread_group_work_region_dim; + int dispatch_y = (height + (thread_group_work_region_dim - 1)) / thread_group_work_region_dim; + + constexpr vk::ImageSubresourceRange simple_subresource = { + .aspectMask = vk::ImageAspectFlagBits::eColor, + .levelCount = 1, + .layerCount = 1, + }; + const std::array enter_barrier{ + vk::ImageMemoryBarrier2{ + .srcStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .srcAccessMask = vk::AccessFlagBits2::eShaderRead, + .dstStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .dstAccessMask = vk::AccessFlagBits2::eShaderWrite, + .oldLayout = vk::ImageLayout::eUndefined, + .newLayout = vk::ImageLayout::eGeneral, + .image = img.intermediary_image, + .subresourceRange = simple_subresource, + }, + }; + cmdbuf.pipelineBarrier2({ + .imageMemoryBarrierCount = enter_barrier.size(), + .pImageMemoryBarriers = enter_barrier.data(), + }); + + FSRConstants consts{}; + FsrEasuCon(reinterpret_cast(&consts.Const0), reinterpret_cast(&consts.Const1), + reinterpret_cast(&consts.Const2), reinterpret_cast(&consts.Const3), + static_cast(input_size.width), static_cast(input_size.height), + static_cast(input_size.width), static_cast(input_size.height), (AF1)width, + (AF1)height); + consts.Sample[0] = hdr && !settings.use_rcas ? 1 : 0; + + if (settings.use_rcas) { + + { // easu + std::array img_info{{ + { + .imageView = input, + .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + }, + { + .imageView = img.intermediary_image_view.get(), + .imageLayout = vk::ImageLayout::eGeneral, + }, + { + .sampler = sampler.get(), + }, + }}; + + std::array set_writes{{ + { + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampledImage, + .pImageInfo = &img_info[0], + }, + { + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageImage, + .pImageInfo = &img_info[1], + }, + { + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampler, + .pImageInfo = &img_info[2], + }, + }}; + + cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, easu_pipeline.get()); + cmdbuf.pushDescriptorSetKHR(vk::PipelineBindPoint::eCompute, pipeline_layout.get(), 0, + set_writes); + cmdbuf.pushConstants(pipeline_layout.get(), vk::ShaderStageFlagBits::eCompute, 0, + sizeof(FSRConstants), &consts); + cmdbuf.dispatch(dispatch_x, dispatch_y, 1); + } + + std::array img_barrier{ + vk::ImageMemoryBarrier2{ + .srcStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .srcAccessMask = vk::AccessFlagBits2::eShaderStorageWrite, + .dstStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .dstAccessMask = vk::AccessFlagBits2::eShaderRead, + .oldLayout = vk::ImageLayout::eGeneral, + .newLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + .image = img.intermediary_image, + .subresourceRange = simple_subresource, + }, + vk::ImageMemoryBarrier2{ + .srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe, + .srcAccessMask = vk::AccessFlagBits2::eNone, + .dstStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .dstAccessMask = vk::AccessFlagBits2::eShaderStorageWrite, + .oldLayout = vk::ImageLayout::eUndefined, + .newLayout = vk::ImageLayout::eGeneral, + .image = img.output_image, + .subresourceRange = simple_subresource, + }, + }; + cmdbuf.pipelineBarrier2(vk::DependencyInfo{ + .imageMemoryBarrierCount = img_barrier.size(), + .pImageMemoryBarriers = img_barrier.data(), + }); + + { // rcas + consts = {}; + FsrRcasCon(reinterpret_cast(&consts.Const0), settings.rcas_attenuation); + consts.Sample[0] = hdr ? 1 : 0; + + std::array img_info{{ + { + .imageView = img.intermediary_image_view.get(), + .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + }, + { + .imageView = img.output_image_view.get(), + .imageLayout = vk::ImageLayout::eGeneral, + }, + { + .sampler = sampler.get(), + }, + }}; + + std::array set_writes{{ + { + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampledImage, + .pImageInfo = &img_info[0], + }, + { + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageImage, + .pImageInfo = &img_info[1], + }, + { + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampler, + .pImageInfo = &img_info[2], + }, + }}; + + cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, rcas_pipeline.get()); + cmdbuf.pushDescriptorSetKHR(vk::PipelineBindPoint::eCompute, pipeline_layout.get(), 0, + set_writes); + cmdbuf.pushConstants(pipeline_layout.get(), vk::ShaderStageFlagBits::eCompute, 0, + sizeof(FSRConstants), &consts); + cmdbuf.dispatch(dispatch_x, dispatch_y, 1); + } + + } else { + // only easu + std::array img_info{{ + { + .imageView = input, + .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + }, + { + .imageView = img.output_image_view.get(), + .imageLayout = vk::ImageLayout::eGeneral, + }, + { + .sampler = sampler.get(), + }, + }}; + + std::array set_writes{{ + { + .dstBinding = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampledImage, + .pImageInfo = &img_info[0], + }, + { + .dstBinding = 1, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eStorageImage, + .pImageInfo = &img_info[1], + }, + { + .dstBinding = 2, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eSampler, + .pImageInfo = &img_info[2], + }, + }}; + + cmdbuf.bindPipeline(vk::PipelineBindPoint::eCompute, easu_pipeline.get()); + cmdbuf.pushDescriptorSetKHR(vk::PipelineBindPoint::eCompute, pipeline_layout.get(), 0, + set_writes); + cmdbuf.pushConstants(pipeline_layout.get(), vk::ShaderStageFlagBits::eCompute, 0, + sizeof(FSRConstants), &consts); + cmdbuf.dispatch(dispatch_x, dispatch_y, 1); + } + + const std::array return_barrier{ + vk::ImageMemoryBarrier2{ + .srcStageMask = vk::PipelineStageFlagBits2::eComputeShader, + .srcAccessMask = vk::AccessFlagBits2::eShaderStorageWrite, + .dstStageMask = vk::PipelineStageFlagBits2::eAllCommands, + .dstAccessMask = vk::AccessFlagBits2::eShaderRead, + .oldLayout = vk::ImageLayout::eGeneral, + .newLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + .image = img.output_image, + .subresourceRange = simple_subresource, + }, + }; + cmdbuf.pipelineBarrier2({ + .imageMemoryBarrierCount = return_barrier.size(), + .pImageMemoryBarriers = return_barrier.data(), + }); + + return img.output_image_view.get(); +} + +void FsrPass::ResizeAndInvalidate(u32 width, u32 height) { + this->cur_size = vk::Extent2D{ + .width = width, + .height = height, + }; + for (int i = 0; i < num_images; ++i) { + available_imgs[i].dirty = true; + } +} + +void FsrPass::CreateImages(Img& img) const { + img.dirty = false; + + vk::ImageCreateInfo image_create_info{ + .imageType = vk::ImageType::e2D, + .format = vk::Format::eR16G16B16A16Sfloat, + .extent{ + .width = cur_size.width, + .height = cur_size.height, + .depth = 1, + }, + .mipLevels = 1, + .arrayLayers = 1, + .samples = vk::SampleCountFlagBits::e1, + // .tiling = vk::ImageTiling::eOptimal, + .usage = vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eStorage, + .initialLayout = vk::ImageLayout::eUndefined, + }; + img.intermediary_image.Create(image_create_info); + SetObjectName(device, static_cast(img.intermediary_image), + "FSR Intermediary Image #{}", img.id); + image_create_info.usage = vk::ImageUsageFlagBits::eTransferSrc | + vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eStorage | + vk::ImageUsageFlagBits::eColorAttachment; + img.output_image.Create(image_create_info); + SetObjectName(device, static_cast(img.output_image), "FSR Output Image #{}", img.id); + + vk::ImageViewCreateInfo image_view_create_info{ + .image = img.intermediary_image, + .viewType = vk::ImageViewType::e2D, + .format = vk::Format::eR16G16B16A16Sfloat, + .subresourceRange{ + .aspectMask = vk::ImageAspectFlagBits::eColor, + .levelCount = 1, + .layerCount = 1, + }, + }; + img.intermediary_image_view = Check<"create fsr intermediary image view">( + device.createImageViewUnique(image_view_create_info)); + SetObjectName(device, img.intermediary_image_view.get(), "FSR Intermediary ImageView #{}", + img.id); + + image_view_create_info.image = img.output_image; + img.output_image_view = + Check<"create fsr output image view">(device.createImageViewUnique(image_view_create_info)); + SetObjectName(device, img.output_image_view.get(), "FSR Output ImageView #{}", img.id); +} + +} // namespace Vulkan::HostPasses \ No newline at end of file diff --git a/src/video_core/renderer_vulkan/host_passes/fsr_pass.h b/src/video_core/renderer_vulkan/host_passes/fsr_pass.h new file mode 100644 index 000000000..3d48d85be --- /dev/null +++ b/src/video_core/renderer_vulkan/host_passes/fsr_pass.h @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" +#include "video_core/renderer_vulkan/vk_common.h" +#include "video_core/texture_cache/image.h" + +namespace Vulkan::HostPasses { + +class FsrPass { +public: + struct Settings { + bool enable{true}; + bool use_rcas{true}; + float rcas_attenuation{0.25f}; + }; + + void Create(vk::Device device, VmaAllocator allocator, u32 num_images); + + vk::ImageView Render(vk::CommandBuffer cmdbuf, vk::ImageView input, vk::Extent2D input_size, + vk::Extent2D output_size, Settings settings, bool hdr); + +private: + struct Img { + u8 id{}; + bool dirty{true}; + + VideoCore::UniqueImage intermediary_image; + vk::UniqueImageView intermediary_image_view; + + VideoCore::UniqueImage output_image; + vk::UniqueImageView output_image_view; + }; + + void ResizeAndInvalidate(u32 width, u32 height); + void CreateImages(Img& img) const; + + vk::Device device{}; + u32 num_images{}; + + vk::UniqueDescriptorSetLayout descriptor_set_layout{}; + vk::UniqueDescriptorSet easu_descriptor_set{}; + vk::UniqueDescriptorSet rcas_descriptor_set{}; + vk::UniqueSampler sampler{}; + vk::UniquePipelineLayout pipeline_layout{}; + vk::UniquePipeline easu_pipeline{}; + vk::UniquePipeline rcas_pipeline{}; + + vk::Extent2D cur_size{}; + u32 cur_image{}; + std::vector available_imgs; +}; + +} // namespace Vulkan::HostPasses diff --git a/src/video_core/renderer_vulkan/host_passes/pp_pass.cpp b/src/video_core/renderer_vulkan/host_passes/pp_pass.cpp new file mode 100644 index 000000000..c854e124f --- /dev/null +++ b/src/video_core/renderer_vulkan/host_passes/pp_pass.cpp @@ -0,0 +1,255 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "pp_pass.h" + +#include "common/assert.h" +#include "video_core/host_shaders/fs_tri_vert.h" +#include "video_core/host_shaders/post_process_frag.h" +#include "video_core/renderer_vulkan/vk_platform.h" +#include "video_core/renderer_vulkan/vk_presenter.h" +#include "video_core/renderer_vulkan/vk_shader_util.h" + +#include + +namespace Vulkan::HostPasses { + +void PostProcessingPass::Create(vk::Device device) { + static const std::array pp_shaders{ + HostShaders::FS_TRI_VERT, + HostShaders::POST_PROCESS_FRAG, + }; + + boost::container::static_vector bindings{ + { + .binding = 0, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .descriptorCount = 1, + .stageFlags = vk::ShaderStageFlagBits::eFragment, + }, + }; + + const vk::DescriptorSetLayoutCreateInfo desc_layout_ci{ + .flags = vk::DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR, + .bindingCount = static_cast(bindings.size()), + .pBindings = bindings.data(), + }; + + desc_set_layout = Check<"create pp descriptor set layout">( + device.createDescriptorSetLayoutUnique(desc_layout_ci)); + + const vk::PushConstantRange push_constants{ + .stageFlags = vk::ShaderStageFlagBits::eFragment, + .offset = 0, + .size = sizeof(Settings), + }; + + const auto& vs_module = Compile(pp_shaders[0], vk::ShaderStageFlagBits::eVertex, device); + ASSERT(vs_module); + SetObjectName(device, vs_module, "fs_tri.vert"); + + const auto& fs_module = Compile(pp_shaders[1], vk::ShaderStageFlagBits::eFragment, device); + ASSERT(fs_module); + SetObjectName(device, fs_module, "post_process.frag"); + + const std::array shaders_ci{ + vk::PipelineShaderStageCreateInfo{ + .stage = vk::ShaderStageFlagBits::eVertex, + .module = vs_module, + .pName = "main", + }, + vk::PipelineShaderStageCreateInfo{ + .stage = vk::ShaderStageFlagBits::eFragment, + .module = fs_module, + .pName = "main", + }, + }; + + const vk::PipelineLayoutCreateInfo layout_info{ + .setLayoutCount = 1U, + .pSetLayouts = &*desc_set_layout, + .pushConstantRangeCount = 1, + .pPushConstantRanges = &push_constants, + }; + + pipeline_layout = + Check<"create pp pipeline layout">(device.createPipelineLayoutUnique(layout_info)); + + const std::array pp_color_formats{ + vk::Format::eB8G8R8A8Unorm, // swapchain.GetSurfaceFormat().format, + }; + const vk::PipelineRenderingCreateInfoKHR pipeline_rendering_ci{ + .colorAttachmentCount = pp_color_formats.size(), + .pColorAttachmentFormats = pp_color_formats.data(), + }; + + const vk::PipelineVertexInputStateCreateInfo vertex_input_info{ + .vertexBindingDescriptionCount = 0u, + .vertexAttributeDescriptionCount = 0u, + }; + + const vk::PipelineInputAssemblyStateCreateInfo input_assembly{ + .topology = vk::PrimitiveTopology::eTriangleList, + }; + + const vk::Viewport viewport{ + .x = 0.0f, + .y = 0.0f, + .width = 1.0f, + .height = 1.0f, + .minDepth = 0.0f, + .maxDepth = 1.0f, + }; + + const vk::Rect2D scissor = { + .offset = {0, 0}, + .extent = {1, 1}, + }; + + const vk::PipelineViewportStateCreateInfo viewport_info{ + .viewportCount = 1, + .pViewports = &viewport, + .scissorCount = 1, + .pScissors = &scissor, + }; + + const vk::PipelineRasterizationStateCreateInfo raster_state{ + .depthClampEnable = false, + .rasterizerDiscardEnable = false, + .polygonMode = vk::PolygonMode::eFill, + .cullMode = vk::CullModeFlagBits::eBack, + .frontFace = vk::FrontFace::eClockwise, + .depthBiasEnable = false, + .lineWidth = 1.0f, + }; + + const vk::PipelineMultisampleStateCreateInfo multisampling{ + .rasterizationSamples = vk::SampleCountFlagBits::e1, + }; + + const std::array attachments{ + vk::PipelineColorBlendAttachmentState{ + .blendEnable = false, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | + vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA, + }, + }; + + const vk::PipelineColorBlendStateCreateInfo color_blending{ + .logicOpEnable = false, + .logicOp = vk::LogicOp::eCopy, + .attachmentCount = attachments.size(), + .pAttachments = attachments.data(), + .blendConstants = std::array{1.0f, 1.0f, 1.0f, 1.0f}, + }; + + const std::array dynamic_states{ + vk::DynamicState::eViewport, + vk::DynamicState::eScissor, + }; + + const vk::PipelineDynamicStateCreateInfo dynamic_info{ + .dynamicStateCount = dynamic_states.size(), + .pDynamicStates = dynamic_states.data(), + }; + + const vk::GraphicsPipelineCreateInfo pipeline_info{ + .pNext = &pipeline_rendering_ci, + .stageCount = shaders_ci.size(), + .pStages = shaders_ci.data(), + .pVertexInputState = &vertex_input_info, + .pInputAssemblyState = &input_assembly, + .pViewportState = &viewport_info, + .pRasterizationState = &raster_state, + .pMultisampleState = &multisampling, + .pColorBlendState = &color_blending, + .pDynamicState = &dynamic_info, + .layout = *pipeline_layout, + }; + + pipeline = Check<"create post process pipeline">(device.createGraphicsPipelineUnique( + /*pipeline_cache*/ {}, pipeline_info)); + + // Once pipeline is compiled, we don't need the shader module anymore + device.destroyShaderModule(vs_module); + device.destroyShaderModule(fs_module); + + // Create sampler resource + const vk::SamplerCreateInfo sampler_ci{ + .magFilter = vk::Filter::eLinear, + .minFilter = vk::Filter::eLinear, + .mipmapMode = vk::SamplerMipmapMode::eNearest, + .addressModeU = vk::SamplerAddressMode::eClampToEdge, + .addressModeV = vk::SamplerAddressMode::eClampToEdge, + }; + sampler = Check<"create pp sampler">(device.createSamplerUnique(sampler_ci)); +} + +void PostProcessingPass::Render(vk::CommandBuffer cmdbuf, vk::ImageView input, + vk::Extent2D input_size, Frame& frame, Settings settings) { + const std::array attachments{{ + { + .imageView = frame.image_view, + .imageLayout = vk::ImageLayout::eColorAttachmentOptimal, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eStore, + }, + }}; + const vk::RenderingInfo rendering_info{ + .renderArea{ + .extent{ + .width = frame.width, + .height = frame.height, + }, + }, + .layerCount = 1, + .colorAttachmentCount = attachments.size(), + .pColorAttachments = attachments.data(), + }; + + vk::DescriptorImageInfo image_info{ + .sampler = *sampler, + .imageView = input, + .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal, + }; + + const std::array set_writes{ + vk::WriteDescriptorSet{ + .dstSet = VK_NULL_HANDLE, + .dstBinding = 0, + .dstArrayElement = 0, + .descriptorCount = 1, + .descriptorType = vk::DescriptorType::eCombinedImageSampler, + .pImageInfo = &image_info, + }, + }; + + cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, *pipeline); + + const std::array viewports = { + vk::Viewport{ + .width = static_cast(frame.width), + .height = static_cast(frame.height), + .minDepth = 0.0f, + .maxDepth = 1.0f, + }, + }; + + cmdbuf.setViewport(0, viewports); + cmdbuf.setScissor(0, vk::Rect2D{ + .extent{ + .width = frame.width, + .height = frame.height, + }, + }); + + cmdbuf.pushDescriptorSetKHR(vk::PipelineBindPoint::eGraphics, *pipeline_layout, 0, set_writes); + cmdbuf.pushConstants(*pipeline_layout, vk::ShaderStageFlagBits::eFragment, 0, sizeof(Settings), + &settings); + + cmdbuf.beginRendering(rendering_info); + cmdbuf.draw(3, 1, 0, 0); + cmdbuf.endRendering(); +} + +} // namespace Vulkan::HostPasses \ No newline at end of file diff --git a/src/video_core/renderer_vulkan/host_passes/pp_pass.h b/src/video_core/renderer_vulkan/host_passes/pp_pass.h new file mode 100644 index 000000000..6127bb5c1 --- /dev/null +++ b/src/video_core/renderer_vulkan/host_passes/pp_pass.h @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" +#include "video_core/renderer_vulkan/vk_common.h" + +namespace Vulkan { +class Frame; +} + +namespace Vulkan::HostPasses { + +class PostProcessingPass { +public: + struct Settings { + float gamma = 1.0f; + u32 hdr = 0; + }; + + void Create(vk::Device device); + + void Render(vk::CommandBuffer cmdbuf, vk::ImageView input, vk::Extent2D input_size, + Frame& output, Settings settings); + +private: + vk::UniquePipeline pipeline{}; + vk::UniquePipelineLayout pipeline_layout{}; + vk::UniqueDescriptorSetLayout desc_set_layout{}; + vk::UniqueSampler sampler{}; +}; + +} // namespace Vulkan::HostPasses diff --git a/src/video_core/renderer_vulkan/vk_platform.h b/src/video_core/renderer_vulkan/vk_platform.h index 0f70312ed..6a6ebeb15 100644 --- a/src/video_core/renderer_vulkan/vk_platform.h +++ b/src/video_core/renderer_vulkan/vk_platform.h @@ -5,7 +5,9 @@ #include +#include "common/assert.h" #include "common/logging/log.h" +#include "common/string_literal.h" #include "common/types.h" #include "video_core/renderer_vulkan/vk_common.h" @@ -48,4 +50,25 @@ void SetObjectName(vk::Device device, const HandleType& handle, const char* form SetObjectName(device, handle, debug_name); } +template +static void Check(vk::Result r) { + if constexpr (msg.len <= 1) { + ASSERT_MSG(r == vk::Result::eSuccess, "vk::Result={}", vk::to_string(r)); + } else { + ASSERT_MSG(r == vk::Result::eSuccess, "Failed to {}: vk::Result={}", msg.value, + vk::to_string(r)); + } +} + +template +static T Check(vk::ResultValue r) { + if constexpr (msg.len <= 1) { + ASSERT_MSG(r.result == vk::Result::eSuccess, "vk::Result={}", vk::to_string(r.result)); + } else { + ASSERT_MSG(r.result == vk::Result::eSuccess, "Failed to {}: vk::Result={}", msg.value, + vk::to_string(r.result)); + } + return std::move(r.value); +} + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index 04d0e7ac9..dc7fa8860 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -10,13 +10,13 @@ #include "core/libraries/system/systemservice.h" #include "imgui/renderer/imgui_core.h" #include "sdl_window.h" +#include "video_core/renderer_vulkan/vk_platform.h" #include "video_core/renderer_vulkan/vk_presenter.h" #include "video_core/renderer_vulkan/vk_rasterizer.h" #include "video_core/renderer_vulkan/vk_shader_util.h" #include "video_core/texture_cache/image.h" #include "video_core/host_shaders/fs_tri_vert.h" -#include "video_core/host_shaders/post_process_frag.h" #include @@ -106,191 +106,6 @@ static vk::Rect2D FitImage(s32 frame_width, s32 frame_height, s32 swapchain_widt dst_rect.offset.x, dst_rect.offset.y); } -void Presenter::CreatePostProcessPipeline() { - static const std::array pp_shaders{ - HostShaders::FS_TRI_VERT, - HostShaders::POST_PROCESS_FRAG, - }; - - boost::container::static_vector bindings{ - { - .binding = 0, - .descriptorType = vk::DescriptorType::eCombinedImageSampler, - .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eFragment, - }, - }; - - const vk::DescriptorSetLayoutCreateInfo desc_layout_ci = { - .flags = vk::DescriptorSetLayoutCreateFlagBits::ePushDescriptorKHR, - .bindingCount = static_cast(bindings.size()), - .pBindings = bindings.data(), - }; - auto desc_layout_result = instance.GetDevice().createDescriptorSetLayoutUnique(desc_layout_ci); - ASSERT_MSG(desc_layout_result.result == vk::Result::eSuccess, - "Failed to create descriptor set layout: {}", - vk::to_string(desc_layout_result.result)); - pp_desc_set_layout = std::move(desc_layout_result.value); - - const vk::PushConstantRange push_constants = { - .stageFlags = vk::ShaderStageFlagBits::eFragment, - .offset = 0, - .size = sizeof(PostProcessSettings), - }; - - const auto& vs_module = - Vulkan::Compile(pp_shaders[0], vk::ShaderStageFlagBits::eVertex, instance.GetDevice()); - ASSERT(vs_module); - Vulkan::SetObjectName(instance.GetDevice(), vs_module, "fs_tri.vert"); - - const auto& fs_module = - Vulkan::Compile(pp_shaders[1], vk::ShaderStageFlagBits::eFragment, instance.GetDevice()); - ASSERT(fs_module); - Vulkan::SetObjectName(instance.GetDevice(), fs_module, "post_process.frag"); - - const std::array shaders_ci{ - vk::PipelineShaderStageCreateInfo{ - .stage = vk::ShaderStageFlagBits::eVertex, - .module = vs_module, - .pName = "main", - }, - vk::PipelineShaderStageCreateInfo{ - .stage = vk::ShaderStageFlagBits::eFragment, - .module = fs_module, - .pName = "main", - }, - }; - - const vk::DescriptorSetLayout set_layout = *pp_desc_set_layout; - const vk::PipelineLayoutCreateInfo layout_info = { - .setLayoutCount = 1U, - .pSetLayouts = &set_layout, - .pushConstantRangeCount = 1, - .pPushConstantRanges = &push_constants, - }; - auto [layout_result, layout] = instance.GetDevice().createPipelineLayoutUnique(layout_info); - ASSERT_MSG(layout_result == vk::Result::eSuccess, "Failed to create pipeline layout: {}", - vk::to_string(layout_result)); - pp_pipeline_layout = std::move(layout); - - const std::array pp_color_formats{ - vk::Format::eB8G8R8A8Unorm, // swapchain.GetSurfaceFormat().format, - }; - const vk::PipelineRenderingCreateInfoKHR pipeline_rendering_ci = { - .colorAttachmentCount = 1u, - .pColorAttachmentFormats = pp_color_formats.data(), - }; - - const vk::PipelineVertexInputStateCreateInfo vertex_input_info = { - .vertexBindingDescriptionCount = 0u, - .vertexAttributeDescriptionCount = 0u, - }; - - const vk::PipelineInputAssemblyStateCreateInfo input_assembly = { - .topology = vk::PrimitiveTopology::eTriangleList, - }; - - const vk::Viewport viewport = { - .x = 0.0f, - .y = 0.0f, - .width = 1.0f, - .height = 1.0f, - .minDepth = 0.0f, - .maxDepth = 1.0f, - }; - - const vk::Rect2D scissor = { - .offset = {0, 0}, - .extent = {1, 1}, - }; - - const vk::PipelineViewportStateCreateInfo viewport_info = { - .viewportCount = 1, - .pViewports = &viewport, - .scissorCount = 1, - .pScissors = &scissor, - }; - - const vk::PipelineRasterizationStateCreateInfo raster_state = { - .depthClampEnable = false, - .rasterizerDiscardEnable = false, - .polygonMode = vk::PolygonMode::eFill, - .cullMode = vk::CullModeFlagBits::eBack, - .frontFace = vk::FrontFace::eClockwise, - .depthBiasEnable = false, - .lineWidth = 1.0f, - }; - - const vk::PipelineMultisampleStateCreateInfo multisampling = { - .rasterizationSamples = vk::SampleCountFlagBits::e1, - }; - - const std::array attachments{ - vk::PipelineColorBlendAttachmentState{ - .blendEnable = false, - .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | - vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA, - }, - }; - - const vk::PipelineColorBlendStateCreateInfo color_blending = { - .logicOpEnable = false, - .logicOp = vk::LogicOp::eCopy, - .attachmentCount = attachments.size(), - .pAttachments = attachments.data(), - .blendConstants = std::array{1.0f, 1.0f, 1.0f, 1.0f}, - }; - - const std::array dynamic_states = { - vk::DynamicState::eViewport, - vk::DynamicState::eScissor, - }; - - const vk::PipelineDynamicStateCreateInfo dynamic_info = { - .dynamicStateCount = static_cast(dynamic_states.size()), - .pDynamicStates = dynamic_states.data(), - }; - - const vk::GraphicsPipelineCreateInfo pipeline_info = { - .pNext = &pipeline_rendering_ci, - .stageCount = static_cast(shaders_ci.size()), - .pStages = shaders_ci.data(), - .pVertexInputState = &vertex_input_info, - .pInputAssemblyState = &input_assembly, - .pViewportState = &viewport_info, - .pRasterizationState = &raster_state, - .pMultisampleState = &multisampling, - .pColorBlendState = &color_blending, - .pDynamicState = &dynamic_info, - .layout = *pp_pipeline_layout, - }; - - auto result = instance.GetDevice().createGraphicsPipelineUnique( - /*pipeline_cache*/ {}, pipeline_info); - if (result.result == vk::Result::eSuccess) { - pp_pipeline = std::move(result.value); - } else { - UNREACHABLE_MSG("Post process pipeline creation failed!"); - } - - // Once pipeline is compiled, we don't need the shader module anymore - instance.GetDevice().destroyShaderModule(vs_module); - instance.GetDevice().destroyShaderModule(fs_module); - - // Create sampler resource - const vk::SamplerCreateInfo sampler_ci = { - .magFilter = vk::Filter::eLinear, - .minFilter = vk::Filter::eLinear, - .mipmapMode = vk::SamplerMipmapMode::eNearest, - .addressModeU = vk::SamplerAddressMode::eClampToEdge, - .addressModeV = vk::SamplerAddressMode::eClampToEdge, - }; - auto [sampler_result, smplr] = instance.GetDevice().createSamplerUnique(sampler_ci); - ASSERT_MSG(sampler_result == vk::Result::eSuccess, "Failed to create sampler: {}", - vk::to_string(sampler_result)); - pp_sampler = std::move(smplr); -} - Presenter::Presenter(Frontend::WindowSDL& window_, AmdGpu::Liverpool* liverpool_) : window{window_}, liverpool{liverpool_}, instance{window, Config::getGpuId(), Config::vkValidationEnabled(), @@ -306,15 +121,15 @@ Presenter::Presenter(Frontend::WindowSDL& window_, AmdGpu::Liverpool* liverpool_ present_frames.resize(num_images); for (u32 i = 0; i < num_images; i++) { Frame& frame = present_frames[i]; - auto [fence_result, fence] = - device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled}); - ASSERT_MSG(fence_result == vk::Result::eSuccess, "Failed to create present done fence: {}", - vk::to_string(fence_result)); + frame.id = i; + auto fence = Check<"create present done fence">( + device.createFence({.flags = vk::FenceCreateFlagBits::eSignaled})); frame.present_done = fence; free_queue.push(&frame); } - CreatePostProcessPipeline(); + fsr_pass.Create(device, instance.GetAllocator(), num_images); + pp_pass.Create(device); ImGui::Layer::AddLayer(Common::Singleton::Instance()); } @@ -376,6 +191,7 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { UNREACHABLE(); } frame->image = vk::Image{unsafe_image}; + SetObjectName(device, frame->image, "Frame image #{}", frame->id); const vk::ImageViewCreateInfo view_info = { .image = frame->image, @@ -389,9 +205,7 @@ void Presenter::RecreateFrame(Frame* frame, u32 width, u32 height) { .layerCount = 1, }, }; - auto [view_result, view] = device.createImageView(view_info); - ASSERT_MSG(view_result == vk::Result::eSuccess, "Failed to create frame image view: {}", - vk::to_string(view_result)); + auto view = Check<"create frame image view">(device.createImageView(view_info)); frame->image_view = view; frame->width = width; frame->height = height; @@ -560,13 +374,9 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) // Request a free presentation frame. Frame* frame = GetRenderFrame(); - if (image_id != VideoCore::NULL_IMAGE_ID) { - const auto& image = texture_cache.GetImage(image_id); - const auto extent = image.info.size; - if (frame->width != extent.width || frame->height != extent.height || - frame->is_hdr != swapchain.GetHDR()) { - RecreateFrame(frame, extent.width, extent.height); - } + if (frame->width != expected_frame_width || frame->height != expected_frame_height || + frame->is_hdr != swapchain.GetHDR()) { + RecreateFrame(frame, expected_frame_width, expected_frame_height); } // EOP flips are triggered from GPU thread so use the drawing scheduler to record @@ -575,7 +385,9 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) auto& scheduler = is_eop ? draw_scheduler : flip_scheduler; scheduler.EndRendering(); const auto cmdbuf = scheduler.CommandBuffer(); - if (Config::getVkHostMarkersEnabled()) { + + bool vk_host_markers_enabled = Config::getVkHostMarkersEnabled(); + if (vk_host_markers_enabled) { const auto label = fmt::format("PrepareFrameInternal:{}", image_id.index); cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ .pLabelName = label.c_str(), @@ -605,33 +417,12 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) .pImageMemoryBarriers = &pre_barrier, }); - const std::array attachments = {vk::RenderingAttachmentInfo{ - .imageView = frame->image_view, - .imageLayout = vk::ImageLayout::eColorAttachmentOptimal, - .loadOp = vk::AttachmentLoadOp::eClear, - .storeOp = vk::AttachmentStoreOp::eStore, - }}; - const vk::RenderingInfo rendering_info{ - .renderArea = - vk::Rect2D{ - .offset = {0, 0}, - .extent = {frame->width, frame->height}, - }, - .layerCount = 1, - .colorAttachmentCount = attachments.size(), - .pColorAttachments = attachments.data(), - }; - if (image_id != VideoCore::NULL_IMAGE_ID) { auto& image = texture_cache.GetImage(image_id); + vk::Extent2D image_size = {image.info.size.width, image.info.size.height}; image.Transit(vk::ImageLayout::eShaderReadOnlyOptimal, vk::AccessFlagBits2::eShaderRead, {}, cmdbuf); - static vk::DescriptorImageInfo image_info{ - .sampler = *pp_sampler, - .imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal, - }; - VideoCore::ImageViewInfo info{}; info.format = image.info.pixel_format; // Exclude alpha from output frame to avoid blending with UI. @@ -641,52 +432,53 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) .b = vk::ComponentSwizzle::eIdentity, .a = vk::ComponentSwizzle::eOne, }; + vk::ImageView imageView; if (auto view = image.FindView(info)) { - image_info.imageView = *texture_cache.GetImageView(view).image_view; + imageView = *texture_cache.GetImageView(view).image_view; } else { - image_info.imageView = *texture_cache.RegisterImageView(image_id, info).image_view; + imageView = *texture_cache.RegisterImageView(image_id, info).image_view; } - static const std::array set_writes{ - vk::WriteDescriptorSet{ - .dstSet = VK_NULL_HANDLE, - .dstBinding = 0, - .dstArrayElement = 0, - .descriptorCount = 1, - .descriptorType = vk::DescriptorType::eCombinedImageSampler, - .pImageInfo = &image_info, - }, - }; + if (vk_host_markers_enabled) { + cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ + .pLabelName = "Host/FSR", + }); + } - cmdbuf.bindPipeline(vk::PipelineBindPoint::eGraphics, *pp_pipeline); + imageView = fsr_pass.Render(cmdbuf, imageView, image_size, {frame->width, frame->height}, + fsr_settings, frame->is_hdr); - const auto& dst_rect = - FitImage(image.info.size.width, image.info.size.height, frame->width, frame->height); + if (vk_host_markers_enabled) { + cmdbuf.endDebugUtilsLabelEXT(); + cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ + .pLabelName = "Host/Post processing", + }); + } + pp_pass.Render(cmdbuf, imageView, image_size, *frame, pp_settings); + if (vk_host_markers_enabled) { + cmdbuf.endDebugUtilsLabelEXT(); + } - const std::array viewports = { - vk::Viewport{ - .x = 1.0f * dst_rect.offset.x, - .y = 1.0f * dst_rect.offset.y, - .width = 1.0f * dst_rect.extent.width, - .height = 1.0f * dst_rect.extent.height, - .minDepth = 0.0f, - .maxDepth = 1.0f, - }, - }; - - cmdbuf.setViewport(0, viewports); - cmdbuf.setScissor(0, {dst_rect}); - - cmdbuf.pushDescriptorSetKHR(vk::PipelineBindPoint::eGraphics, *pp_pipeline_layout, 0, - set_writes); - cmdbuf.pushConstants(*pp_pipeline_layout, vk::ShaderStageFlagBits::eFragment, 0, - sizeof(PostProcessSettings), &pp_settings); - - cmdbuf.beginRendering(rendering_info); - cmdbuf.draw(3, 1, 0, 0); - cmdbuf.endRendering(); + DebugState.game_resolution = {image_size.width, image_size.height}; + DebugState.output_resolution = {frame->width, frame->height}; } else { // Fix display of garbage images on startup on some drivers + const std::array attachments = {{ + { + .imageView = frame->image_view, + .imageLayout = vk::ImageLayout::eColorAttachmentOptimal, + .loadOp = vk::AttachmentLoadOp::eClear, + .storeOp = vk::AttachmentStoreOp::eStore, + }, + }}; + const vk::RenderingInfo rendering_info{ + .renderArea{ + .extent{frame->width, frame->height}, + }, + .layerCount = 1, + .colorAttachmentCount = attachments.size(), + .pColorAttachments = attachments.data(), + }; cmdbuf.beginRendering(rendering_info); cmdbuf.endRendering(); } @@ -706,7 +498,7 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) .pImageMemoryBarriers = &post_barrier, }); - if (Config::getVkHostMarkersEnabled()) { + if (vk_host_markers_enabled) { cmdbuf.endDebugUtilsLabelEXT(); } @@ -836,6 +628,7 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { ImVec2 contentArea = ImGui::GetContentRegionAvail(); const vk::Rect2D imgRect = FitImage(frame->width, frame->height, (s32)contentArea.x, (s32)contentArea.y); + SetExpectedGameSize((s32)contentArea.x, (s32)contentArea.y); ImGui::SetCursorPos(ImGui::GetCursorStartPos() + ImVec2{ (float)imgRect.offset.x, (float)imgRect.offset.y, @@ -914,12 +707,20 @@ Frame* Presenter::GetRenderFrame() { } } - // Initialize default frame image - if (frame->width == 0 || frame->height == 0 || frame->is_hdr != swapchain.GetHDR()) { - RecreateFrame(frame, Config::getScreenWidth(), Config::getScreenHeight()); - } - return frame; } +void Presenter::SetExpectedGameSize(s32 width, s32 height) { + constexpr float expectedRatio = 1920.0 / 1080.0f; + const float ratio = (float)width / (float)height; + + expected_frame_height = height; + expected_frame_width = width; + if (ratio > expectedRatio) { + expected_frame_width = static_cast(height * expectedRatio); + } else { + expected_frame_height = static_cast(width / expectedRatio); + } +} + } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 2bfe6e66c..892112397 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -7,6 +7,8 @@ #include "imgui/imgui_config.h" #include "video_core/amdgpu/liverpool.h" +#include "video_core/renderer_vulkan/host_passes/fsr_pass.h" +#include "video_core/renderer_vulkan/host_passes/pp_pass.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_swapchain.h" @@ -32,6 +34,7 @@ struct Frame { vk::Semaphore ready_semaphore; u64 ready_tick; bool is_hdr{false}; + u8 id{}; ImTextureID imgui_texture; }; @@ -45,17 +48,16 @@ enum SchedulerType { class Rasterizer; class Presenter { - struct PostProcessSettings { - float gamma = 1.0f; - u32 hdr = 0; - }; - public: Presenter(Frontend::WindowSDL& window, AmdGpu::Liverpool* liverpool); ~Presenter(); - float& GetGammaRef() { - return pp_settings.gamma; + HostPasses::PostProcessingPass::Settings& GetPPSettingsRef() { + return pp_settings; + } + + HostPasses::FsrPass::Settings& GetFsrSettingsRef() { + return fsr_settings; } Frontend::WindowSDL& GetWindow() const { @@ -117,16 +119,19 @@ public: } private: - void CreatePostProcessPipeline(); Frame* PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop = true); Frame* GetRenderFrame(); + void SetExpectedGameSize(s32 width, s32 height); + private: - PostProcessSettings pp_settings{}; - vk::UniquePipeline pp_pipeline{}; - vk::UniquePipelineLayout pp_pipeline_layout{}; - vk::UniqueDescriptorSetLayout pp_desc_set_layout{}; - vk::UniqueSampler pp_sampler{}; + u32 expected_frame_width{1920}; + u32 expected_frame_height{1080}; + + HostPasses::FsrPass fsr_pass; + HostPasses::FsrPass::Settings fsr_settings{}; + HostPasses::PostProcessingPass::Settings pp_settings{}; + HostPasses::PostProcessingPass pp_pass; Frontend::WindowSDL& window; AmdGpu::Liverpool* liverpool; Instance instance; diff --git a/src/video_core/renderer_vulkan/vk_shader_util.cpp b/src/video_core/renderer_vulkan/vk_shader_util.cpp index 08703c3de..1eb9b27c6 100644 --- a/src/video_core/renderer_vulkan/vk_shader_util.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_util.cpp @@ -159,7 +159,8 @@ bool InitializeCompiler() { } } // Anonymous namespace -vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device) { +vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device, + std::vector defines) { if (!InitializeCompiler()) { return {}; } @@ -178,12 +179,46 @@ vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, v glslang::EShTargetLanguageVersion::EShTargetSpv_1_3); shader->setStringsWithLengths(&pass_source_code, &pass_source_code_length, 1); + std::string preambleString; + std::vector processes; + + for (auto& def : defines) { + processes.push_back("define-macro "); + processes.back().append(def); + + preambleString.append("#define "); + if (const size_t equal = def.find_first_of("="); equal != def.npos) { + def[equal] = ' '; + } + preambleString.append(def); + preambleString.append("\n"); + } + + shader->setPreamble(preambleString.c_str()); + shader->addProcesses(processes); + glslang::TShader::ForbidIncluder includer; + + std::string preprocessedStr; + if (!shader->preprocess(&DefaultTBuiltInResource, default_version, profile, false, true, + messages, &preprocessedStr, includer)) [[unlikely]] { + LOG_ERROR(Render_Vulkan, + "Shader preprocess error\n" + "Shader Info Log:\n" + "{}\n{}", + shader->getInfoLog(), shader->getInfoDebugLog()); + LOG_ERROR(Render_Vulkan, "Shader Source:\n{}", code); + return {}; + } + if (!shader->parse(&DefaultTBuiltInResource, default_version, profile, false, true, messages, includer)) [[unlikely]] { - LOG_INFO(Render_Vulkan, "Shader Info Log:\n{}\n{}", shader->getInfoLog(), - shader->getInfoDebugLog()); - LOG_INFO(Render_Vulkan, "Shader Source:\n{}", code); + LOG_ERROR(Render_Vulkan, + "Shader parse error\n" + "Shader Info Log:\n" + "{}\n{}", + shader->getInfoLog(), shader->getInfoDebugLog()); + LOG_ERROR(Render_Vulkan, "Shader Source:\n{}", code); return {}; } @@ -191,8 +226,11 @@ vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, v auto program = std::make_unique(); program->addShader(shader.get()); if (!program->link(messages)) { - LOG_INFO(Render_Vulkan, "Program Info Log:\n{}\n{}", program->getInfoLog(), - program->getInfoDebugLog()); + LOG_ERROR(Render_Vulkan, + "Shader link error\n" + "Program Info Log:\n" + "{}\n{}", + program->getInfoLog(), program->getInfoDebugLog()); return {}; } diff --git a/src/video_core/renderer_vulkan/vk_shader_util.h b/src/video_core/renderer_vulkan/vk_shader_util.h index 3a86acf2b..14b929782 100644 --- a/src/video_core/renderer_vulkan/vk_shader_util.h +++ b/src/video_core/renderer_vulkan/vk_shader_util.h @@ -16,7 +16,8 @@ namespace Vulkan { * @param stage The pipeline stage the shader will be used in. * @param device The vulkan device handle. */ -vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device); +vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device, + std::vector defines = {}); /** * @brief Creates a vulkan shader module from SPIR-V bytecode. diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp index 3c85c451c..522e6fd5b 100644 --- a/src/video_core/texture_cache/image.cpp +++ b/src/video_core/texture_cache/image.cpp @@ -113,6 +113,8 @@ static vk::FormatFeatureFlags2 FormatFeatureFlags(const vk::ImageUsageFlags usag return feature_flags; } +UniqueImage::UniqueImage() {} + UniqueImage::UniqueImage(vk::Device device_, VmaAllocator allocator_) : device{device_}, allocator{allocator_} {} @@ -123,6 +125,9 @@ UniqueImage::~UniqueImage() { } void UniqueImage::Create(const vk::ImageCreateInfo& image_ci) { + if (image) { + vmaDestroyImage(allocator, image, allocation); + } const VmaAllocationCreateInfo alloc_info = { .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT, .usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, diff --git a/src/video_core/texture_cache/image.h b/src/video_core/texture_cache/image.h index 66d65ceec..404e25e88 100644 --- a/src/video_core/texture_cache/image.h +++ b/src/video_core/texture_cache/image.h @@ -35,6 +35,7 @@ enum ImageFlagBits : u32 { DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits) struct UniqueImage { + explicit UniqueImage(); explicit UniqueImage(vk::Device device, VmaAllocator allocator); ~UniqueImage(); From 4d0c03fd4af6c498d03e185295c6b82a92afa5e4 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 12 Mar 2025 13:36:01 -0500 Subject: [PATCH 412/455] Properly implement sceVideoOutGetBufferLabelAddress (#2642) * Export sceVideoOutGetBufferLabelAddress It's an exported function, used by red_prig's BLACKSQUAR2 homebrew sample. This also fixes the function's return type accordingly. * More sceVideoOutGetBufferLabelAddress fixups Library decomp shows a hardcoded return 16 on success. Not sure why it does that, but it never hurts to be accurate. Also needs to have an openOrbis-specific export to get it to work with the homebrew sample I'm testing. * Final fixups Removed the port assert and added asserts in libSceGnmDriver for when sceVideoOutGetBufferLabelAddress calls fail. --- src/core/libraries/gnmdriver/gnmdriver.cpp | 6 ++++-- src/core/libraries/videoout/video_out.cpp | 14 ++++++++++++-- src/core/libraries/videoout/video_out.h | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index e2e865def..e8560b2b8 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -1087,7 +1087,8 @@ s32 PS4_SYSV_ABI sceGnmInsertWaitFlipDone(u32* cmdbuf, u32 size, s32 vo_handle, } uintptr_t label_addr{}; - VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr); + ASSERT_MSG(VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr) == 16, + "sceVideoOutGetBufferLabelAddress call failed"); auto* wait_reg_mem = reinterpret_cast(cmdbuf); wait_reg_mem->header = PM4Type3Header{PM4ItOpcode::WaitRegMem, 5}; @@ -2041,7 +2042,8 @@ static inline s32 PatchFlipRequest(u32* cmdbuf, u32 size, u32 vo_handle, u32 buf } uintptr_t label_addr{}; - VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr); + ASSERT_MSG(VideoOut::sceVideoOutGetBufferLabelAddress(vo_handle, &label_addr) == 16, + "sceVideoOutGetBufferLabelAddress call failed"); // Write event to lock the VO surface auto* write_lock = reinterpret_cast(cmdbuf); diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 4d6972d14..219d0886b 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -295,10 +295,16 @@ s32 PS4_SYSV_ABI sceVideoOutUnregisterBuffers(s32 handle, s32 attributeIndex) { return driver->UnregisterBuffers(port, attributeIndex); } -void sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr) { +s32 PS4_SYSV_ABI sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr) { + if (label_addr == nullptr) { + return ORBIS_VIDEO_OUT_ERROR_INVALID_ADDRESS; + } auto* port = driver->GetPort(handle); - ASSERT(port); + if (!port) { + return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE; + } *label_addr = reinterpret_cast(port->buffer_labels.data()); + return 16; } s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** unk) { @@ -430,6 +436,8 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { sceVideoOutIsFlipPending); LIB_FUNCTION("N5KDtkIjjJ4", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutUnregisterBuffers); + LIB_FUNCTION("OcQybQejHEY", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, + sceVideoOutGetBufferLabelAddress); LIB_FUNCTION("uquVH4-Du78", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutClose); LIB_FUNCTION("1FZBKy8HeNU", "libSceVideoOut", 1, "libSceVideoOut", 0, 0, sceVideoOutGetVblankStatus); @@ -460,6 +468,8 @@ void RegisterLib(Core::Loader::SymbolsResolver* sym) { sceVideoOutSetBufferAttribute); LIB_FUNCTION("w3BY+tAEiQY", "libSceVideoOut", 1, "libSceVideoOut", 1, 1, sceVideoOutRegisterBuffers); + LIB_FUNCTION("OcQybQejHEY", "libSceVideoOut", 1, "libSceVideoOut", 1, 1, + sceVideoOutGetBufferLabelAddress); LIB_FUNCTION("U46NwOiJpys", "libSceVideoOut", 1, "libSceVideoOut", 1, 1, sceVideoOutSubmitFlip); LIB_FUNCTION("SbU3dwp80lQ", "libSceVideoOut", 1, "libSceVideoOut", 1, 1, sceVideoOutGetFlipStatus); diff --git a/src/core/libraries/videoout/video_out.h b/src/core/libraries/videoout/video_out.h index ad8ce9ed2..f3e661de4 100644 --- a/src/core/libraries/videoout/video_out.h +++ b/src/core/libraries/videoout/video_out.h @@ -118,6 +118,7 @@ s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(Kernel::SceKernelEqueue eq, s32 handle, s32 PS4_SYSV_ABI sceVideoOutAddVblankEvent(Kernel::SceKernelEqueue eq, s32 handle, void* udata); s32 PS4_SYSV_ABI sceVideoOutRegisterBuffers(s32 handle, s32 startIndex, void* const* addresses, s32 bufferNum, const BufferAttribute* attribute); +s32 PS4_SYSV_ABI sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr); s32 PS4_SYSV_ABI sceVideoOutSetFlipRate(s32 handle, s32 rate); s32 PS4_SYSV_ABI sceVideoOutIsFlipPending(s32 handle); s32 PS4_SYSV_ABI sceVideoOutWaitVblank(s32 handle); @@ -133,7 +134,6 @@ s32 PS4_SYSV_ABI sceVideoOutColorSettingsSetGamma(SceVideoOutColorSettings* sett s32 PS4_SYSV_ABI sceVideoOutAdjustColor(s32 handle, const SceVideoOutColorSettings* settings); // Internal system functions -void sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_addr); s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** unk); void RegisterLib(Core::Loader::SymbolsResolver* sym); From 36927a7bbd68b7c374853330cd309617e1db4627 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 12 Mar 2025 20:36:14 +0200 Subject: [PATCH 413/455] New Crowdin updates (#2638) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (French) * New translations en_us.ts (Italian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Russian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Albanian) --- src/qt_gui/translations/ar_SA.ts | 32 +++++++ src/qt_gui/translations/da_DK.ts | 32 +++++++ src/qt_gui/translations/de_DE.ts | 32 +++++++ src/qt_gui/translations/el_GR.ts | 32 +++++++ src/qt_gui/translations/es_ES.ts | 32 +++++++ src/qt_gui/translations/fa_IR.ts | 32 +++++++ src/qt_gui/translations/fi_FI.ts | 32 +++++++ src/qt_gui/translations/fr_FR.ts | 32 +++++++ src/qt_gui/translations/hu_HU.ts | 32 +++++++ src/qt_gui/translations/id_ID.ts | 32 +++++++ src/qt_gui/translations/it_IT.ts | 32 +++++++ src/qt_gui/translations/ja_JP.ts | 32 +++++++ src/qt_gui/translations/ko_KR.ts | 32 +++++++ src/qt_gui/translations/lt_LT.ts | 32 +++++++ src/qt_gui/translations/nb_NO.ts | 138 +++++++++++++++++++------------ src/qt_gui/translations/nl_NL.ts | 32 +++++++ src/qt_gui/translations/pl_PL.ts | 32 +++++++ src/qt_gui/translations/pt_BR.ts | 32 +++++++ src/qt_gui/translations/pt_PT.ts | 32 +++++++ src/qt_gui/translations/ro_RO.ts | 32 +++++++ src/qt_gui/translations/ru_RU.ts | 32 +++++++ src/qt_gui/translations/sq_AL.ts | 32 +++++++ src/qt_gui/translations/sv_SE.ts | 32 +++++++ src/qt_gui/translations/tr_TR.ts | 32 +++++++ src/qt_gui/translations/uk_UA.ts | 32 +++++++ src/qt_gui/translations/vi_VN.ts | 32 +++++++ src/qt_gui/translations/zh_CN.ts | 32 +++++++ src/qt_gui/translations/zh_TW.ts | 32 +++++++ 28 files changed, 949 insertions(+), 53 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index d45af76b8..090cd4c26 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index bc9ed1d39..113d13019 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 931f93905..d366d1116 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index e09bf7192..a61d84022 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index a727792ba..8861185cb 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index f58d691ad..6984b29f8 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 5e1c20d47..81274ae80 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 75a770c09..ff1646f9e 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Impossible de lier les valeurs de l'axe plusieurs fois + + Save + Enregistrer + + + Apply + Appliquer + + + Restore Defaults + Réinitialiser par défaut + + + Cancel + Annuler + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs La molette de la souris ne peut pas être affectée aux sorties de la manette + + Save + Enregistrer + + + Apply + Appliquer + + + Restore Defaults + Réinitialiser par défaut + + + Cancel + Annuler + MainWindow diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index bb510a479..c22d74257 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index e6a8aabd9..1a8b085cf 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 2e6dcf14a..5f57efca3 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Impossibile associare i valori degli assi più di una volta + + Save + Salva + + + Apply + Applica + + + Restore Defaults + Ripristina Impostazioni Predefinite + + + Cancel + Annulla + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs La rotella del mouse non può essere associata ai comandi della levetta analogica + + Save + Salva + + + Apply + Applica + + + Restore Defaults + Ripristina Impostazioni Predefinite + + + Cancel + Annulla + MainWindow diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 981b7cf3b..d93e36770 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index d76a16430..dc5b61038 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 41b203e2b..2f4b6e59b 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 9f71e0aa5..e7c48e426 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -90,7 +90,7 @@ Patches - Programrettelse + Programrettelser Error @@ -146,11 +146,11 @@ Failed to save file: - Kunne ikke lagre fila: + Klarte ikke lagre fila: Failed to download file: - Kunne ikke laste ned fila: + Klarte ikke laste ned fila: Cheats Not Found @@ -170,11 +170,11 @@ Failed to save: - Kunne ikke lagre: + Klarte ikke lagre: Failed to download: - Kunne ikke laste ned: + Klarte ikke laste ned: Download Complete @@ -186,11 +186,11 @@ Failed to parse JSON data from HTML. - Kunne ikke analysere JSON-data fra HTML. + Klarte ikke analysere JSON-data fra HTML. Failed to retrieve HTML page. - Kunne ikke hente HTML-side. + Klarte ikke hente HTML-siden. The game is in version: %1 @@ -210,7 +210,7 @@ Failed to open file: - Kunne ikke åpne fila: + Klarte ikke åpne fila: XML ERROR: @@ -230,7 +230,7 @@ Failed to open files.json for reading. - Kunne ikke åpne files.json for lesing. + Klarte ikke åpne files.json for lesing. Name: @@ -265,7 +265,7 @@ Failed to parse update information. - Kunne ikke analysere oppdaterings-informasjonen. + Klarte ikke analysere oppdateringsinformasjon. No pre-releases found. @@ -341,22 +341,22 @@ Failed to save the update file at - Kunne ikke lagre oppdateringsfila på + Klarte ikke lagre oppdateringsfila på Starting Update... - Starter oppdatering... + Starter oppdatering … Failed to create the update script file - Kunne ikke opprette oppdateringsskriptfila + Klarte ikke opprette oppdateringsskriptfila CompatibilityInfoClass Fetching compatibility data, please wait - Henter kompatibilitetsdata, vennligst vent + Henter kompatibilitetsdata, vent litt. Cancel @@ -364,7 +364,7 @@ Loading... - Laster... + Laster … Error @@ -547,18 +547,34 @@ Cannot bind axis values more than once - Cannot bind axis values more than once + Kan ikke tildele akseverdier mer enn en gang + + + Save + Lagre + + + Apply + Bruk + + + Restore Defaults + Gjenopprett standardinnstillinger + + + Cancel + Avbryt EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Rediger oppsett for tastatur, mus og kontroller Use Per-Game configs - Use Per-Game configs + Bruk oppsett per spill Error @@ -566,11 +582,11 @@ Could not open the file for reading - Could not open the file for reading + Klarte ikke åpne fila for lesing Could not open the file for writing - Could not open the file for writing + Klarte ikke åpne fila for skriving Save Changes @@ -586,11 +602,11 @@ Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Vil du tilbakestille alle dine tilpassede innstillinger til standarden? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Vil du tilbakestille dette oppsettet til standard oppsett? Reset to Default @@ -608,7 +624,7 @@ GameInfoClass Loading game list, please wait :3 - Laster spilliste, vennligst vent :3 + Laster spilliste, vent litt :3 Cancel @@ -616,7 +632,7 @@ Loading... - Laster... + Laster … @@ -706,7 +722,7 @@ Game does not initialize properly / crashes the emulator - Spillet initialiseres ikke riktig / krasjer emulatoren + Spillet initialiseres ikke riktig eller krasjer emulatoren Game boots, but only displays a blank screen @@ -726,7 +742,7 @@ Click to see details on github - Klikk for å se detaljer på GitHub + Trykk for å se detaljer på GitHub Last updated @@ -768,7 +784,7 @@ SFO Viewer - SFO viser + SFO-viser Trophy Viewer @@ -776,7 +792,7 @@ Open Folder... - Åpne mappe... + Åpne mappe … Open Game Folder @@ -792,7 +808,7 @@ Copy info... - Kopier info... + Kopier info … Copy Name @@ -816,7 +832,7 @@ Delete... - Slett... + Slett … Delete Game @@ -836,7 +852,7 @@ Compatibility... - Kompatibilitet... + Kompatibilitet … Update database @@ -943,7 +959,7 @@ HelpDialog Quickstart - Quickstart + Hurtigstart FAQ @@ -955,7 +971,7 @@ Special Bindings - Special Bindings + Spesielle hurtigtaster Keybindings @@ -1065,7 +1081,7 @@ Touchpad Click - Berøringsplate knapp + Berøringsplateknapp Mouse to Joystick @@ -1137,23 +1153,23 @@ Speed Multiplier (def 1.0): - Hurtighetsmultiplikator (def 1.0): + Hastighetsmultiplikator (def 1.0): Common Config Selected - Common Config Selected + Felles oppsett valgt This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Denne knappen kopierer oppsettet fra felles oppsettet til den valgte profilen, og kan ikke brukes når den gjeldende brukte profilen er felles oppsettet. Copy values from Common Config - Copy values from Common Config + Kopier verdier fra felles oppsettet Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Vil du overskrive eksisterende valg av oppsett med felles oppsettet? Unable to Save @@ -1161,26 +1177,42 @@ Cannot bind any unique input more than once - Cannot bind any unique input more than once + Kan ikke tildele unike oppsett mer enn en gang Press a key - Press a key + Trykk på en tast Cannot set mapping - Cannot set mapping + Klarte ikke tildele Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Musehjulet kan ikke tildeles analogstikkene + + + Save + Lagre + + + Apply + Bruk + + + Restore Defaults + Gjenopprett standardinnstillinger + + + Cancel + Avbryt MainWindow Open/Add Elf Folder - Åpne/Legg til Elf-mappe + Åpne eller legg til Elf-mappe Install Packages (PKG) @@ -1200,7 +1232,7 @@ Configure... - Sett opp... + Sett opp … Install application from a .pkg file @@ -1280,7 +1312,7 @@ Search... - Søk... + Søk … File @@ -1694,7 +1726,7 @@ Add... - Legg til... + Legg til … Remove @@ -1786,7 +1818,7 @@ Play title music - Spill tittelmusikk + Spill av tittelmusikk Update Compatibility Database On Startup @@ -1878,7 +1910,7 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Deaktiver trofé hurtigmeny:\nDeaktiver trofévarsler i spillet. Trofé-fremgang kan fortsatt ved help av troféviseren (høyreklikk på spillet i hovedvinduet). + Slå av trofévarsler:\nFjerner trofévarsler i spillet. Troféfremgang kan fortsatt vises ved hjelp av troféviseren (høyreklikk på spillet i hovedvinduet). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. @@ -1938,7 +1970,7 @@ Width/Height:\nSets the size of the emulator window at launch, which can be resized during gameplay.\nThis is different from the in-game resolution. - Bredde/Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er forskjellig fra oppløsningen i spillet. + Bredde / Høyde:\nAngir størrelsen på emulatorvinduet ved oppstart, som kan endres under spillingen.\nDette er annerledes fra oppløsningen i spillet. Vblank Divider:\nThe frame rate at which the emulator refreshes at is multiplied by this number. Changing this may have adverse effects, such as increasing the game speed, or breaking critical game functionality that does not expect this to change! @@ -2134,7 +2166,7 @@ Cannot create portable user folder - Cannot create portable user folder + Klarte ikke opprette separat brukermappe %1 already exists @@ -2142,7 +2174,7 @@ Portable user folder created - Portable user folder created + Separat brukermappe opprettet %1 successfully created. @@ -2150,7 +2182,7 @@ Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Åpne mappa med tilpassede bilder og lyder for trofé:\nDu kan legge til tilpassede bilder til trofeer og en lyd.\nLegg filene til custom_trophy med følgende navn:\ntrophy.wav ELLER trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nMerk: Lyden avspilles kun i Qt-versjonen. diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 8596c7e71..f6c062da3 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index faa464792..4c4a33ec2 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 8f3975cb1..794215401 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Não é possível vincular os valores do eixo mais de uma vez + + Save + Salvar + + + Apply + Aplicar + + + Restore Defaults + Restaurar Padrões + + + Cancel + Cancelar + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs A rolagem do mouse não pode ser mapeada para saídas do analógico + + Save + Salvar + + + Apply + Aplicar + + + Restore Defaults + Restaurar Padrões + + + Cancel + Cancelar + MainWindow diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 0667447e1..dc0059b86 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index ded417640..4261bf9e2 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index ecf155dbf..6ca16121f 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Невозможно привязать значения оси более одного раза + + Save + Сохранить + + + Apply + Применить + + + Restore Defaults + По умолчанию + + + Cancel + Отмена + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Колесо не может быть назначено для вывода стиков + + Save + Сохранить + + + Apply + Применить + + + Restore Defaults + По умолчанию + + + Cancel + Отмена + MainWindow diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index da64729d0..3d1f1a222 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Nuk mund të caktohen vlerat e boshtit më shumë se një herë + + Save + Ruaj + + + Apply + Zbato + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Rrota e miut nuk mund të caktohet për daljet e levës + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index eb453b4d9..de3781414 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Kan inte binda axelvärden fler än en gång + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mushjulet kan inte mappas till spakutmatningar + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 095c73c7b..fd4669369 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Eksen değerleri birden fazla kez bağlanamaz + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mouse tekerleği analog çıkışlarına atanamaz + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 688cedf9d..1c074be6a 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Неможливо пере назначити кнопку більше одного разу + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Коліщатко миші не можна прив'язати зі значенням стиків + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index d20c07dd9..8fa0889bc 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index f761fe8c4..80b322112 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once 摇杆 X/Y 轴的操作绑定不在同一直线 + + Save + 保存 + + + Apply + 应用 + + + Restore Defaults + 恢复默认设置 + + + Cancel + 取消 + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs 鼠标滚轮无法映射到摇杆 + + Save + 保存 + + + Apply + 应用 + + + Restore Defaults + 恢复默认设置 + + + Cancel + 取消 + MainWindow diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 311ce3ab8..2950f541f 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -549,6 +549,22 @@ Cannot bind axis values more than once Cannot bind axis values more than once + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + EditorDialog @@ -1175,6 +1191,22 @@ Mousewheel cannot be mapped to stick outputs Mousewheel cannot be mapped to stick outputs + + Save + Save + + + Apply + Apply + + + Restore Defaults + Restore Defaults + + + Cancel + Cancel + MainWindow From 5691046dcc2c1bd57f5b6f21fc5ced8735771f41 Mon Sep 17 00:00:00 2001 From: Vinicius Rangel Date: Thu, 13 Mar 2025 13:10:24 -0300 Subject: [PATCH 414/455] Renderer fixes (Splash + Aspect Ratio) (#2645) * rewrite splash removed Splash class rewrite using imgui texture manager fix crashes & old validation error * handle games with abnormal aspect ratios --- CMakeLists.txt | 2 - src/common/elf_info.h | 7 + src/core/devtools/layer.cpp | 4 +- src/core/file_format/splash.cpp | 38 ---- src/core/file_format/splash.h | 42 ----- src/core/libraries/videoout/driver.cpp | 10 +- src/emulator.cpp | 8 +- src/imgui/renderer/texture_manager.cpp | 1 + .../renderer_vulkan/vk_presenter.cpp | 171 +++++------------- src/video_core/renderer_vulkan/vk_presenter.h | 5 +- 10 files changed, 66 insertions(+), 222 deletions(-) delete mode 100644 src/core/file_format/splash.cpp delete mode 100644 src/core/file_format/splash.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 99620e7d3..f4c23b7c6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -644,8 +644,6 @@ set(CORE src/core/aerolib/stubs.cpp src/core/file_format/playgo_chunk.h src/core/file_format/trp.cpp src/core/file_format/trp.h - src/core/file_format/splash.h - src/core/file_format/splash.cpp src/core/file_sys/fs.cpp src/core/file_sys/fs.h src/core/loader.cpp diff --git a/src/common/elf_info.h b/src/common/elf_info.h index d885709cd..062cee012 100644 --- a/src/common/elf_info.h +++ b/src/common/elf_info.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include @@ -69,6 +70,8 @@ class ElfInfo { u32 raw_firmware_ver = 0; PSFAttributes psf_attributes{}; + std::filesystem::path splash_path{}; + public: static constexpr u32 FW_15 = 0x1500000; static constexpr u32 FW_16 = 0x1600000; @@ -116,6 +119,10 @@ public: ASSERT(initialized); return psf_attributes; } + + [[nodiscard]] const std::filesystem::path& GetSplashPath() const { + return splash_path; + } }; } // namespace Common diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index 5f0fd0c95..87fd9ffb3 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -21,8 +21,8 @@ extern std::unique_ptr presenter; using namespace ImGui; -using namespace Core::Devtools; -using L = Core::Devtools::Layer; +using namespace ::Core::Devtools; +using L = ::Core::Devtools::Layer; static bool show_simple_fps = false; static bool visibility_toggled = false; diff --git a/src/core/file_format/splash.cpp b/src/core/file_format/splash.cpp deleted file mode 100644 index 4eb701cf7..000000000 --- a/src/core/file_format/splash.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include "common/assert.h" -#include "common/io_file.h" -#include "common/stb.h" -#include "splash.h" - -bool Splash::Open(const std::filesystem::path& filepath) { - ASSERT_MSG(filepath.extension().string() == ".png", "Unexpected file format passed"); - - Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - - std::vector png_file{}; - const auto png_size = file.GetSize(); - png_file.resize(png_size); - file.Seek(0); - file.Read(png_file); - - auto* img_mem = stbi_load_from_memory(png_file.data(), png_file.size(), - reinterpret_cast(&img_info.width), - reinterpret_cast(&img_info.height), - reinterpret_cast(&img_info.num_channels), 4); - if (!img_mem) { - return false; - } - - const auto img_size = img_info.GetSizeBytes(); - img_data.resize(img_size); - std::memcpy(img_data.data(), img_mem, img_size); - stbi_image_free(img_mem); - return true; -} diff --git a/src/core/file_format/splash.h b/src/core/file_format/splash.h deleted file mode 100644 index 7c563f317..000000000 --- a/src/core/file_format/splash.h +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include "common/types.h" - -class Splash { -public: - struct ImageInfo { - u32 width; - u32 height; - u32 num_channels; - - u32 GetSizeBytes() const { - return width * height * 4; // we always forcing rgba8 for simplicity - } - }; - - Splash() = default; - ~Splash() = default; - - bool Open(const std::filesystem::path& filepath); - [[nodiscard]] bool IsLoaded() const { - return img_data.size(); - } - - const auto& GetImageData() const { - return img_data; - } - - ImageInfo GetImageInfo() const { - return img_info; - } - -private: - ImageInfo img_info{}; - std::vector img_data{}; -}; diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index 0f832910c..d2c980882 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -160,11 +160,8 @@ int VideoOutDriver::UnregisterBuffers(VideoOutPort* port, s32 attributeIndex) { } void VideoOutDriver::Flip(const Request& req) { - // Whatever the game is rendering show splash if it is active - if (!presenter->ShowSplash(req.frame)) { - // Present the frame. - presenter->Present(req.frame); - } + // Present the frame. + presenter->Present(req.frame); // Update flip status. auto* port = req.port; @@ -201,9 +198,6 @@ void VideoOutDriver::Flip(const Request& req) { } void VideoOutDriver::DrawBlankFrame() { - if (presenter->ShowSplash(nullptr)) { - return; - } const auto empty_frame = presenter->PrepareBlankFrame(false); presenter->Present(empty_frame); } diff --git a/src/emulator.cpp b/src/emulator.cpp index 758720325..b6586ecfd 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -24,7 +24,6 @@ #include "common/singleton.h" #include "common/version.h" #include "core/file_format/psf.h" -#include "core/file_format/splash.h" #include "core/file_format/trp.h" #include "core/file_sys/fs.h" #include "core/libraries/disc_map/disc_map.h" @@ -185,12 +184,7 @@ void Emulator::Run(const std::filesystem::path& file, const std::vectorGetHostPath("/app0/sce_sys/pic1.png"); if (std::filesystem::exists(pic1_path)) { - auto* splash = Common::Singleton::Instance(); - if (!splash->IsLoaded()) { - if (!splash->Open(pic1_path)) { - LOG_ERROR(Loader, "Game splash: unable to open file"); - } - } + game_info.splash_path = pic1_path; } game_info.initialized = true; diff --git a/src/imgui/renderer/texture_manager.cpp b/src/imgui/renderer/texture_manager.cpp index e217cd130..49f912a92 100644 --- a/src/imgui/renderer/texture_manager.cpp +++ b/src/imgui/renderer/texture_manager.cpp @@ -175,6 +175,7 @@ void WorkerLoop() { auto texture = Vulkan::UploadTexture(pixels, vk::Format::eR8G8B8A8Unorm, width, height, width * height * 4 * sizeof(stbi_uc)); + stbi_image_free((void*)pixels); core->upload_data = texture; core->width = width; diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index dc7fa8860..4a6a5c7c2 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -6,7 +6,6 @@ #include "common/singleton.h" #include "core/debug_state.h" #include "core/devtools/layer.h" -#include "core/file_format/splash.h" #include "core/libraries/system/systemservice.h" #include "imgui/renderer/imgui_core.h" #include "sdl_window.h" @@ -21,6 +20,8 @@ #include #include + +#include "common/elf_info.h" #include "imgui/renderer/imgui_impl_vulkan.h" namespace Vulkan { @@ -269,116 +270,10 @@ Frame* Presenter::PrepareLastFrame() { return frame; } -bool Presenter::ShowSplash(Frame* frame /*= nullptr*/) { - const auto* splash = Common::Singleton::Instance(); - if (splash->GetImageData().empty()) { - return false; - } - - if (!Libraries::SystemService::IsSplashVisible()) { - return false; - } - - draw_scheduler.EndRendering(); - const auto cmdbuf = draw_scheduler.CommandBuffer(); - - if (Config::getVkHostMarkersEnabled()) { - cmdbuf.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT{ - .pLabelName = "ShowSplash", - }); - } - - if (!frame) { - if (!splash_img.has_value()) { - VideoCore::ImageInfo info{}; - info.pixel_format = vk::Format::eR8G8B8A8Unorm; - info.type = vk::ImageType::e2D; - info.size = - VideoCore::Extent3D{splash->GetImageInfo().width, splash->GetImageInfo().height, 1}; - info.pitch = splash->GetImageInfo().width; - info.guest_address = VAddr(splash->GetImageData().data()); - info.guest_size = splash->GetImageData().size(); - info.mips_layout.emplace_back(splash->GetImageData().size(), - splash->GetImageInfo().width, - splash->GetImageInfo().height, 0); - splash_img.emplace(instance, present_scheduler, info); - splash_img->flags &= ~VideoCore::GpuDirty; - texture_cache.RefreshImage(*splash_img); - - splash_img->Transit(vk::ImageLayout::eTransferSrcOptimal, - vk::AccessFlagBits2::eTransferRead, {}, cmdbuf); - } - - frame = GetRenderFrame(); - } - - const auto frame_subresources = vk::ImageSubresourceRange{ - .aspectMask = vk::ImageAspectFlagBits::eColor, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = VK_REMAINING_ARRAY_LAYERS, - }; - - const auto pre_barrier = - vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eTransfer, - .srcAccessMask = vk::AccessFlagBits2::eTransferRead, - .dstStageMask = vk::PipelineStageFlagBits2::eTransfer, - .dstAccessMask = vk::AccessFlagBits2::eTransferWrite, - .oldLayout = vk::ImageLayout::eUndefined, - .newLayout = vk::ImageLayout::eTransferDstOptimal, - .image = frame->image, - .subresourceRange{frame_subresources}}; - - cmdbuf.pipelineBarrier2(vk::DependencyInfo{ - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &pre_barrier, - }); - - cmdbuf.blitImage(splash_img->image, vk::ImageLayout::eTransferSrcOptimal, frame->image, - vk::ImageLayout::eTransferDstOptimal, - MakeImageBlitFit(splash->GetImageInfo().width, splash->GetImageInfo().height, - frame->width, frame->height), - vk::Filter::eLinear); - - const auto post_barrier = - vk::ImageMemoryBarrier2{.srcStageMask = vk::PipelineStageFlagBits2::eTransfer, - .srcAccessMask = vk::AccessFlagBits2::eTransferWrite, - .dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput, - .dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite, - .oldLayout = vk::ImageLayout::eTransferDstOptimal, - .newLayout = vk::ImageLayout::eGeneral, - .image = frame->image, - .subresourceRange{frame_subresources}}; - - cmdbuf.pipelineBarrier2(vk::DependencyInfo{ - .imageMemoryBarrierCount = 1, - .pImageMemoryBarriers = &post_barrier, - }); - - if (Config::getVkHostMarkersEnabled()) { - cmdbuf.endDebugUtilsLabelEXT(); - } - - // Flush frame creation commands. - frame->ready_semaphore = draw_scheduler.GetMasterSemaphore()->Handle(); - frame->ready_tick = draw_scheduler.CurrentTick(); - SubmitInfo info{}; - draw_scheduler.Flush(info); - - Present(frame); - return true; -} - Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) { // Request a free presentation frame. Frame* frame = GetRenderFrame(); - if (frame->width != expected_frame_width || frame->height != expected_frame_height || - frame->is_hdr != swapchain.GetHDR()) { - RecreateFrame(frame, expected_frame_width, expected_frame_height); - } - // EOP flips are triggered from GPU thread so use the drawing scheduler to record // commands. Otherwise we are dealing with a CPU flip which could have arrived // from any guest thread. Use a separate scheduler for that. @@ -420,6 +315,11 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) if (image_id != VideoCore::NULL_IMAGE_ID) { auto& image = texture_cache.GetImage(image_id); vk::Extent2D image_size = {image.info.size.width, image.info.size.height}; + float ratio = (float)image_size.width / (float)image_size.height; + if (ratio != expected_ratio) { + expected_ratio = ratio; + } + image.Transit(vk::ImageLayout::eShaderReadOnlyOptimal, vk::AccessFlagBits2::eShaderRead, {}, cmdbuf); @@ -625,18 +525,43 @@ void Presenter::Present(Frame* frame, bool is_reusing_frame) { ImGui::SetNextWindowDockID(dockId, ImGuiCond_Once); ImGui::Begin("Display##game_display", nullptr, ImGuiWindowFlags_NoNav); + auto game_texture = frame->imgui_texture; + auto game_width = frame->width; + auto game_height = frame->height; + + if (Libraries::SystemService::IsSplashVisible()) { // draw splash + if (!splash_img.has_value()) { + splash_img.emplace(); + auto splash_path = Common::ElfInfo::Instance().GetSplashPath(); + if (!splash_path.empty()) { + splash_img = ImGui::RefCountedTexture::DecodePngFile(splash_path); + } + } + if (auto& splash_image = this->splash_img.value()) { + auto [im_id, width, height] = splash_image.GetTexture(); + game_texture = im_id; + game_width = width; + game_height = height; + } + } + ImVec2 contentArea = ImGui::GetContentRegionAvail(); - const vk::Rect2D imgRect = - FitImage(frame->width, frame->height, (s32)contentArea.x, (s32)contentArea.y); SetExpectedGameSize((s32)contentArea.x, (s32)contentArea.y); - ImGui::SetCursorPos(ImGui::GetCursorStartPos() + ImVec2{ - (float)imgRect.offset.x, - (float)imgRect.offset.y, - }); - ImGui::Image(frame->imgui_texture, { - static_cast(imgRect.extent.width), - static_cast(imgRect.extent.height), - }); + + const auto imgRect = + FitImage(game_width, game_height, (s32)contentArea.x, (s32)contentArea.y); + ImVec2 offset{ + static_cast(imgRect.offset.x), + static_cast(imgRect.offset.y), + }; + ImVec2 size{ + static_cast(imgRect.extent.width), + static_cast(imgRect.extent.height), + }; + + ImGui::SetCursorPos(ImGui::GetCursorStartPos() + offset); + ImGui::Image(game_texture, size); + ImGui::End(); ImGui::PopStyleVar(3); ImGui::PopStyleColor(); @@ -707,19 +632,23 @@ Frame* Presenter::GetRenderFrame() { } } + if (frame->width != expected_frame_width || frame->height != expected_frame_height || + frame->is_hdr != swapchain.GetHDR()) { + RecreateFrame(frame, expected_frame_width, expected_frame_height); + } + return frame; } void Presenter::SetExpectedGameSize(s32 width, s32 height) { - constexpr float expectedRatio = 1920.0 / 1080.0f; const float ratio = (float)width / (float)height; expected_frame_height = height; expected_frame_width = width; - if (ratio > expectedRatio) { - expected_frame_width = static_cast(height * expectedRatio); + if (ratio > expected_ratio) { + expected_frame_width = static_cast(height * expected_ratio); } else { - expected_frame_height = static_cast(width / expectedRatio); + expected_frame_height = static_cast(width / expected_ratio); } } diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 892112397..ad2708474 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -6,6 +6,7 @@ #include #include "imgui/imgui_config.h" +#include "imgui/imgui_texture.h" #include "video_core/amdgpu/liverpool.h" #include "video_core/renderer_vulkan/host_passes/fsr_pass.h" #include "video_core/renderer_vulkan/host_passes/pp_pass.h" @@ -92,7 +93,6 @@ public: }) != vo_buffers_addr.cend(); } - bool ShowSplash(Frame* frame = nullptr); void Present(Frame* frame, bool is_reusing_frame = false); void RecreateFrame(Frame* frame, u32 width, u32 height); Frame* PrepareLastFrame(); @@ -125,6 +125,7 @@ private: void SetExpectedGameSize(s32 width, s32 height); private: + float expected_ratio{1920.0 / 1080.0f}; u32 expected_frame_width{1920}; u32 expected_frame_height{1080}; @@ -148,7 +149,7 @@ private: std::mutex free_mutex; std::condition_variable free_cv; std::condition_variable_any frame_cv; - std::optional splash_img; + std::optional splash_img; std::vector vo_buffers_addr; }; From 171f755c139764d83e6fc712fcbbcc9d4c5c5956 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:02:34 -0700 Subject: [PATCH 415/455] build: Compile for Sandy Bridge CPU target. (#2651) --- .gitmodules | 4 ---- CMakeLists.txt | 19 ++++++++++--------- externals/CMakeLists.txt | 29 +++++++++++++---------------- externals/cryptopp | 2 +- externals/cryptoppwin | 1 - 5 files changed, 24 insertions(+), 31 deletions(-) delete mode 160000 externals/cryptoppwin diff --git a/.gitmodules b/.gitmodules index 3d0d21c5b..ca229bedd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,10 +6,6 @@ path = externals/cryptopp url = https://github.com/shadps4-emu/ext-cryptopp.git shallow = true -[submodule "externals/cryptoppwin"] - path = externals/cryptoppwin - url = https://github.com/shadps4-emu/ext-cryptoppwin.git - shallow = true [submodule "externals/zlib-ng"] path = externals/zlib-ng url = https://github.com/shadps4-emu/ext-zlib-ng.git diff --git a/CMakeLists.txt b/CMakeLists.txt index f4c23b7c6..f05587d38 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,8 +37,10 @@ option(ENABLE_UPDATER "Enables the options to updater" ON) # First, determine whether to use CMAKE_OSX_ARCHITECTURES or CMAKE_SYSTEM_PROCESSOR. if (APPLE AND CMAKE_OSX_ARCHITECTURES) set(BASE_ARCHITECTURE "${CMAKE_OSX_ARCHITECTURES}") -else() +elseif (CMAKE_SYSTEM_PROCESSOR) set(BASE_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") +else() + set(BASE_ARCHITECTURE "${CMAKE_HOST_SYSTEM_PROCESSOR}") endif() # Next, match common architecture strings down to a known common value. @@ -50,7 +52,12 @@ else() message(FATAL_ERROR "Unsupported CPU architecture: ${BASE_ARCHITECTURE}") endif() -if (APPLE AND ARCHITECTURE STREQUAL "x86_64" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") +if (ARCHITECTURE STREQUAL "x86_64") + # Set x86_64 target level to Sandy Bridge to generally match what is supported for PS4 guest code with CPU patches. + add_compile_options(-march=sandybridge) +endif() + +if (APPLE AND ARCHITECTURE STREQUAL "x86_64" AND CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64") # Exclude ARM homebrew path to avoid conflicts when cross compiling. list(APPEND CMAKE_IGNORE_PREFIX_PATH "/opt/homebrew") @@ -995,7 +1002,7 @@ endif() create_target_directory_groups(shadps4) target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui gcn half::half ZLIB::ZLIB PNG::PNG) -target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers) +target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers cryptopp::cryptopp) target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h") target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h") @@ -1044,12 +1051,6 @@ if (NOT ENABLE_QT_GUI) target_link_libraries(shadps4 PRIVATE SDL3::SDL3) endif() -if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND MSVC) - target_link_libraries(shadps4 PRIVATE cryptoppwin) -else() - target_link_libraries(shadps4 PRIVATE cryptopp::cryptopp) -endif() - if (ENABLE_QT_GUI) target_link_libraries(shadps4 PRIVATE Qt6::Widgets Qt6::Concurrent Qt6::Network Qt6::Multimedia) add_definitions(-DENABLE_QT_GUI) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index bb434677d..3b29a838e 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -26,22 +26,19 @@ if (NOT TARGET fmt::fmt) add_subdirectory(fmt) endif() -if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND MSVC) - # If it is clang and MSVC we will add a static lib - # CryptoPP - add_subdirectory(cryptoppwin) - target_include_directories(cryptoppwin INTERFACE cryptoppwin/include) -else() - # CryptoPP - if (NOT TARGET cryptopp::cryptopp) - set(CRYPTOPP_INSTALL OFF) - set(CRYPTOPP_BUILD_TESTING OFF) - set(CRYPTOPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cryptopp) - add_subdirectory(cryptopp-cmake) - file(COPY cryptopp DESTINATION cryptopp FILES_MATCHING PATTERN "*.h") - # remove externals/cryptopp from include directories because it contains a conflicting zlib.h file - set_target_properties(cryptopp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/cryptopp") - endif() +# CryptoPP +if (NOT TARGET cryptopp::cryptopp) + set(CRYPTOPP_INSTALL OFF) + set(CRYPTOPP_BUILD_TESTING OFF) + set(CRYPTOPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cryptopp) + # cryptopp instruction set checks do not account for added compile options, + # so disable extensions in the library config to match our chosen target CPU. + set(CRYPTOPP_DISABLE_AESNI ON) + set(CRYPTOPP_DISABLE_AVX2 ON) + add_subdirectory(cryptopp-cmake) + file(COPY cryptopp DESTINATION cryptopp FILES_MATCHING PATTERN "*.h") + # remove externals/cryptopp from include directories because it contains a conflicting zlib.h file + set_target_properties(cryptopp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/cryptopp") endif() if (NOT TARGET FFmpeg::ffmpeg) diff --git a/externals/cryptopp b/externals/cryptopp index 60f81a77e..ee84a3144 160000 --- a/externals/cryptopp +++ b/externals/cryptopp @@ -1 +1 @@ -Subproject commit 60f81a77e0c9a0e7ffc1ca1bc438ddfa2e43b78e +Subproject commit ee84a3144137ac0a1294c0b4a342dca13b66923f diff --git a/externals/cryptoppwin b/externals/cryptoppwin deleted file mode 160000 index bc3441dd2..000000000 --- a/externals/cryptoppwin +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bc3441dd2d6a9728e747dc0180bc8b9065a2923c From b520994960700e565c56fc722db06be688716a7b Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 19 Mar 2025 12:28:55 +0200 Subject: [PATCH 416/455] New Crowdin updates (#2644) * New translations en_us.ts (Albanian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Spanish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Swedish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Ukrainian) --- src/qt_gui/translations/es_ES.ts | 332 +++++++++++++++---------------- src/qt_gui/translations/nb_NO.ts | 14 +- src/qt_gui/translations/sq_AL.ts | 16 +- src/qt_gui/translations/sv_SE.ts | 16 +- src/qt_gui/translations/uk_UA.ts | 16 +- src/qt_gui/translations/zh_CN.ts | 2 +- 6 files changed, 198 insertions(+), 198 deletions(-) diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 8861185cb..be3c701a9 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -443,15 +443,15 @@ Config Selection - Config Selection + Selección de Configuraciones Common Config - Common Config + Configuración Estándar Use per-game configs - Use per-game configs + Usar configuraciones por juego L1 / LB @@ -535,78 +535,78 @@ Override Lightbar Color - Override Lightbar Color + Reemplazar el Color de la Barra de Luz Override Color - Override Color + Reemplazar Color Unable to Save - Unable to Save + No se Pudo Guardar Cannot bind axis values more than once - Cannot bind axis values more than once + No se pueden vincular valores del eje más de una vez Save - Save + Guardar Apply - Apply + Aplicar Restore Defaults - Restore Defaults + Restaurar Valores Por Defecto Cancel - Cancel + Cancelar EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Editar Asignaciones de Teclado + Ratón y Mando Use Per-Game configs - Use Per-Game configs + Usar Configuraciones por Juego Error - Error + Error Could not open the file for reading - Could not open the file for reading + No se pudo abrir el archivo para la lectura Could not open the file for writing - Could not open the file for writing + No se pudo abrir el archivo para escritura Save Changes - Save Changes + Guardar Cambios Do you want to save changes? - Do you want to save changes? + ¿Quieres guardar los cambios? Help - Help + Ayuda Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + ¿Desea restablecer su configuración predeterminada personalizada a la configuración por defecto original? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + ¿Quieres restablecer esta configuración a tu configuración por defecto personalizada? Reset to Default @@ -702,7 +702,7 @@ Never Played - Never Played + Nunca Jugado h @@ -788,7 +788,7 @@ Trophy Viewer - Ver trofeos + Expositor de Trofeos Open Folder... @@ -848,7 +848,7 @@ Delete Trophy - Delete Trophy + Eliminar Trofeo Compatibility... @@ -928,7 +928,7 @@ No log file found for this game! - No log file found for this game! + ¡No se encontró un archivo de registro para este juego! Failed to convert icon. @@ -940,7 +940,7 @@ This game has no saved trophies to delete! - This game has no saved trophies to delete! + ¡Este juego no tiene trofeos guardados para eliminar! Save Data @@ -948,7 +948,7 @@ Trophy - Trophy + Trofeo SFO Viewer for @@ -959,23 +959,23 @@ HelpDialog Quickstart - Quickstart + Inicio Rápido FAQ - FAQ + Preguntas Frecuentes (FAQ) Syntax - Syntax + Sintaxis Special Bindings - Special Bindings + Asignación de Teclas Especiales Keybindings - Keybindings + Asignación de Teclas @@ -1001,55 +1001,55 @@ KBMSettings Configure Controls - Configure Controls + Configurar Controles D-Pad - D-Pad + Cruceta Up - Up + Arriba unmapped - unmapped + sin vincular Left - Left + Izquierda Right - Right + Derecha Down - Down + Abajo Left Analog Halfmode - Left Analog Halfmode + Modo Reducido del Stick Izquierdo hold to move left stick at half-speed - hold to move left stick at half-speed + manten para mover el stick izquierdo a la mitad de la velocidad Left Stick - Left Stick + Stick Izquierdo Config Selection - Config Selection + Selección de Configuraciones Common Config - Common Config + Configuración Estándar Use per-game configs - Use per-game configs + Usar configuraciones por juego L1 @@ -1061,11 +1061,11 @@ Text Editor - Text Editor + Editor de Texto Help - Help + Ayuda R1 @@ -1085,127 +1085,127 @@ Mouse to Joystick - Ratón A Joystick + Ratón a Joystick *press F7 ingame to activate - *press F7 ingame to activate + * presiona F7 en el juego para activar R3 - R3 + R3 Options - Options + Opciones Mouse Movement Parameters - Mouse Movement Parameters + Parámetros Movimiento del Ratón note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + nota: haga clic en Botón de ayuda/Asignación de Teclas Especiales para más información Face Buttons - Face Buttons + Botones de Acción Triangle - Triangle + Triángulo Square - Square + Cuadrado Circle - Circle + Círculo Cross - Cross + Equis Right Analog Halfmode - Right Analog Halfmode + Modo Reducido del Stick Derecho hold to move right stick at half-speed - hold to move right stick at half-speed + manten para mover el stick derecho a la mitad de la velocidad Right Stick - Right Stick + Stick Derecho Speed Offset (def 0.125): - Speed Offset (def 0.125): + Compensación de Velocidad (def 0.125): Copy from Common Config - Copy from Common Config + Copiar desde la Configuración Estándar Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Zona Muerta (def 0.50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Multiplicador de Velocidad (def 1.0): Common Config Selected - Common Config Selected + Configuración Estándar Seleccionada This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Este botón copia mapeos de la Configuración Estándar al perfil seleccionado actualmente, y no se puede utilizar cuando el perfil seleccionado es la Configuración Estándar. Copy values from Common Config - Copy values from Common Config + Copiar valores de la Configuración Estándar Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + ¿Quiere sobrescribir los mapeos existentes con los mapeos de la Configuración Estándar? Unable to Save - Unable to Save + No se Pudo Guardar Cannot bind any unique input more than once - Cannot bind any unique input more than once + No se puede vincular ninguna entrada única más de una vez Press a key - Press a key + Pulsa una tecla Cannot set mapping - Cannot set mapping + No se pudo asignar el mapeo Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + La rueda del ratón no puede ser mapeada al stick Save - Save + Guardar Apply - Apply + Aplicar Restore Defaults - Restore Defaults + Restaurar Valores Por Defecto Cancel - Cancel + Cancelar @@ -1284,11 +1284,11 @@ List View - Vista de lista + Vista de Lista Grid View - Vista de cuadrícula + Vista de Cuadrícula Elf Viewer @@ -1296,7 +1296,7 @@ Game Install Directory - Carpeta de instalación de los juegos + Carpeta de Instalación de Juegos Download Cheats/Patches @@ -1304,7 +1304,7 @@ Dump Game List - Volcar lista de juegos + Volcar Lista de Juegos PKG Viewer @@ -1324,11 +1324,11 @@ Game List Icons - Iconos de los juegos + Iconos de Juegos Game List Mode - Tipo de lista + Tipo de Lista Settings @@ -1372,7 +1372,7 @@ Game List - Lista de juegos + Lista de Juegos * Unsupported Vulkan Version @@ -1496,7 +1496,7 @@ PKG is a patch or DLC, please install the game first! - El archivo PKG es un parche o un DLC, ¡debes instalar el juego primero! + El archivo PKG es un parche o DLC, ¡debes instalar el juego primero! Game is already running! @@ -1511,7 +1511,7 @@ PKGViewer Open Folder - Abrir carpeta + Abrir Carpeta PKG ERROR @@ -1523,7 +1523,7 @@ Serial - Numero de serie + Número de Serie Installed @@ -1543,7 +1543,7 @@ App Ver - Versión de aplicación + Versión de la Aplicación FW @@ -1590,7 +1590,7 @@ Console Language - Idioma de la consola + Idioma de la Consola Emulator Language @@ -1602,7 +1602,7 @@ Enable Separate Update Folder - Habilitar carpeta independiente de actualizaciones + Habilitar Carpeta Independiente de Actualizaciones Default tab when opening settings @@ -1614,7 +1614,7 @@ Show Splash - Mostrar splash + Mostrar Pantalla de Bienvenida Enable Discord Rich Presence @@ -1622,11 +1622,11 @@ Username - Nombre de usuario + Nombre de Usuario Trophy Key - Clave de trofeos + Clave de Trofeos Trophy @@ -1634,7 +1634,7 @@ Open the custom trophy images/sounds folder - Open the custom trophy images/sounds folder + Abrir la carpeta de trofeos/sonidos personalizados Logger @@ -1642,15 +1642,15 @@ Log Type - Tipo de registro + Tipo de Registro Log Filter - Filtro de registro + Filtro de Registro Open Log Location - Abrir ubicación del registro + Abrir Ubicación del registro Input @@ -1662,11 +1662,11 @@ Hide Cursor - Ocultar cursor + Ocultar Cursor Hide Cursor Idle Timeout - Tiempo de espera para ocultar cursor inactivo + Tiempo de Espera para Ocultar Cursor Inactivo s @@ -1678,7 +1678,7 @@ Back Button Behavior - Comportamiento del botón de retroceso + Comportamiento del Botón de Retroceso Graphics @@ -1694,7 +1694,7 @@ Graphics Device - Dispositivo gráfico + Dispositivo Gráfico Vblank Divider @@ -1706,7 +1706,7 @@ Enable Shaders Dumping - Habilitar volcado de shaders + Habilitar volcado de Shaders Enable NULL GPU @@ -1722,7 +1722,7 @@ Game Folders - Carpetas de juego + Carpetas de Juegos Add... @@ -1738,27 +1738,27 @@ Enable Debug Dumping - Habilitar volcado de depuración + Habilitar Volcado de Depuración Enable Vulkan Validation Layers - Habilitar capas de validación de Vulkan + Habilitar Capas de Validación de Vulkan Enable Vulkan Synchronization Validation - Habilitar validación de sincronización de Vulkan + Habilitar Validación de Sincronización de Vulkan Enable RenderDoc Debugging - Habilitar depuración de RenderDoc + Habilitar Depuración de RenderDoc Enable Crash Diagnostics - Habilitar diagnóstico de fallos + Habilitar Diagnóstico de Fallos Collect Shaders - Recopilar shaders + Recopilar Shaders Copy GPU Buffers @@ -1766,11 +1766,11 @@ Host Debug Markers - Host Debug Markers + Marcadores de Depuración del Host Guest Debug Markers - Guest Debug Markers + Marcadores de Depuración del Invitado Update @@ -1778,11 +1778,11 @@ Check for Updates at Startup - Buscar actualizaciones al iniciar + Buscar Actualizaciones al Iniciar Always Show Changelog - Mostrar siempre el registro de cambios + Mostrar Siempre el Registro de Cambios Update Channel @@ -1790,7 +1790,7 @@ Check for Updates - Verificar actualizaciones + Buscar Actualizaciones GUI Settings @@ -1802,11 +1802,11 @@ Disable Trophy Notification - Disable Trophy Notification + Desactivar Notificaciones de Trofeos Background Image - Imagen de fondo + Imagen de Fondo Show Background Image @@ -1826,7 +1826,7 @@ Game Compatibility - Game Compatibility + Compatibilidad Display Compatibility Data @@ -1858,7 +1858,7 @@ Point your mouse at an option to display its description. - Coloque el mouse sobre una opción para mostrar su descripción. + Coloque el ratón sobre una opción para mostrar su descripción. Console Language:\nSets the language that the PS4 game uses.\nIt's recommended to set this to a language the game supports, which will vary by region. @@ -1870,7 +1870,7 @@ Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. - Enable Separate Update Folder:\nEnables installing game updates into a separate folder for easy management.\nThis can be manually created by adding the extracted update to the game folder with the name "CUSA00000-UPDATE" where the CUSA ID matches the game's ID. + Habilitar Carpeta Independiente de Actualizaciónes:\nHabilita el instalar actualizaciones del juego en una carpeta separada para mas facilidad en la gestión.\nPuede crearse manualmente añadiendo la actualización extraída a la carpeta del juego con el nombre "CUSA00000-UPDATE" donde el CUSA ID coincide con el ID del juego. Show Splash Screen:\nShows the game's splash screen (a special image) while the game is starting. @@ -1886,7 +1886,7 @@ Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. - Trophy Key:\nKey used to decrypt trophies. Must be obtained from your jailbroken console.\nMust contain only hex characters. + Clave de Trofeos:\nClave utilizada para descifrar trofeos. Debe obtenerse de tu consola desbloqueada.\nSolo debe contener caracteres hexadecimales. Log Type:\nSets whether to synchronize the output of the log window for performance. May have adverse effects on emulation. @@ -1910,15 +1910,15 @@ Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). - Disable Trophy Pop-ups:\nDisable in-game trophy notifications. Trophy progress can still be tracked using the Trophy Viewer (right-click the game in the main window). + Desactivar Notificaciones de trofeos:\nDesactiva las notificaciones de trofeos en el juego. El progreso de trofeos todavía puede ser rastreado usando el Expositor de Trofeos (haz clic derecho en el juego en la ventana principal). Hide Cursor:\nChoose when the cursor will disappear:\nNever: You will always see the mouse.\nidle: Set a time for it to disappear after being idle.\nAlways: you will never see the mouse. - Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el mouse.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el mouse. + Ocultar Cursor:\nElija cuándo desaparecerá el cursor:\nNunca: Siempre verá el ratón.\nInactivo: Establezca un tiempo para que desaparezca después de estar inactivo.\nSiempre: nunca verá el ratón. Hide Idle Cursor Timeout:\nThe duration (seconds) after which the cursor that has been idle hides itself. - Establezca un tiempo para que el mouse desaparezca después de estar inactivo. + Establezca un tiempo para que el ratón desaparezca después de estar inactivo. Back Button Behavior:\nSets the controller's back button to emulate tapping the specified position on the PS4 touchpad. @@ -1926,15 +1926,15 @@ Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. - Display Compatibility Data:\nDisplays game compatibility information in table view. Enable "Update Compatibility On Startup" to get up-to-date information. + Mostrar Datos de Compatibilidad:\nMuestra información de compatibilidad de juegos en vista de tabla. Habilite "Actualizar Compatibilidad al Iniciar" para obtener información actualizada. Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. - Update Compatibility On Startup:\nAutomatically update the compatibility database when shadPS4 starts. + Actualizar Compatibilidad al Iniciar:\nActualiza automáticamente la base de datos de compatibilidad cuando shadPS4 se inicia. Update Compatibility Database:\nImmediately update the compatibility database. - Update Compatibility Database:\nImmediately update the compatibility database. + Actualizar Base de Datos de Compatibilidad:\nActualizar inmediatamente la base de datos de compatibilidad. Never @@ -1978,7 +1978,7 @@ Enable Shaders Dumping:\nFor the sake of technical debugging, saves the games shaders to a folder as they render. - Habilitar la Volcadura de Sombras:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. + Habilitar la Volcadura de Shaders:\nPor el bien de la depuración técnica, guarda las sombras del juego en una carpeta mientras se renderizan. Enable Null GPU:\nFor the sake of technical debugging, disables game rendering as if there were no graphics card. @@ -1986,7 +1986,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + Habilitar HDR:\nHabilita HDR en juegos que lo soporten.\nTu monitor debe tener soporte para el espacio de color PQ BT2020 y el formato RGB10A2 de cadena de intercambio. Game Folders:\nThe list of folders to check for installed games. @@ -2018,31 +2018,31 @@ Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). - Collect Shaders:\nYou need this enabled to edit shaders with the debug menu (Ctrl + F10). + Recopilar Shaders:\nNecesitas esto habilitado para editar shaders con el menú de depuración (Ctrl + F10). Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. - Crash Diagnostics:\nCreates a .yaml file with info about the Vulkan state at the time of crashing.\nUseful for debugging 'Device lost' errors. If you have this enabled, you should enable Host AND Guest Debug Markers.\nDoes not work on Intel GPUs.\nYou need Vulkan Validation Layers enabled and the Vulkan SDK for this to work. + Diagnóstico de cuelgues:\nCrea un archivo .yaml con información sobre el estado de Vulkan en el momento del cuelgue.\nÚtil para depurar errores de tipo 'Dispositivo perdido' . Con esto activado, deberías habilitar los marcadores de depuración de Host E Invitado.\nNo funciona en GPUs de Intel.\nNecesitas activar las Capas de Validación de Vulkan y el SDK de Vulkan para que funcione. Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. - Copy GPU Buffers:\nGets around race conditions involving GPU submits.\nMay or may not help with PM4 type 0 crashes. + Copiar Búferes de GPU:\nSortea condiciones de carrera que implican envíos de GPU.\nPuede o no ayudar con cuelgues del tipo 0 de PM4. Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marcadores de Depuración del Host:\n Inserta información del emulador como marcadores para comandos AMDGPU específicos, además de proporcionar nombres de depuración.\nCon esto activado, deberías habilitar el diagnóstico de fallos.\nUtil para programas como RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Marcadores de Depuración del Invitado:\n Inserta cualquier marcador que el propio juego ha añadido al búfer de comandos.\nCon esto activado, deberías habilitar el diagnóstico de fallos.\nUtil para programas como RenderDoc. Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Ruta de Guardado de Datos:\nLa carpeta donde se guardarán los datos del juego. Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Buscar:\nBusque una carpeta para establecer como ruta de datos guardados. Release @@ -2054,11 +2054,11 @@ Set the volume of the background music. - Set the volume of the background music. + Establece el volumen de la música de fondo. Enable Motion Controls - Habilitar controles de movimiento + Habilitar Controles de Movimiento Save Data Path @@ -2070,15 +2070,15 @@ async - async + asíncrono sync - sync + síncrono Auto Select - Selección automática + Selección Automática Directory to install games @@ -2094,7 +2094,7 @@ Display Mode - Modo de imagen + Modo de Imagen Windowed @@ -2102,15 +2102,15 @@ Fullscreen - Pantalla completa + Pantalla Completa Fullscreen (Borderless) - Pantalla completa (sin bordes) + Pantalla Completa (sin bordes) Window Size - Tamaño de ventana + Tamaño de Ventana W: @@ -2122,90 +2122,90 @@ Separate Log Files - Separate Log Files + Archivos de Registro Independientes Separate Log Files:\nWrites a separate logfile for each game. - Separate Log Files:\nWrites a separate logfile for each game. + Archivos de Registro Independientes:\nEscribe un archivo de registro separado para cada juego. Trophy Notification Position - Trophy Notification Position + Posición de Notificación de Trofeos Left - Left + Izquierda Right - Right + Derecha Top - Top + Arriba Bottom - Bottom + Abajo Notification Duration - Notification Duration + Duración de Notificaciones Portable User Folder - Portable User Folder + Carpeta Portable de Usuario Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Crear Carpeta Portable de Usuario a partir de la Carpeta de Usuario Estándar Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Carpeta portable de usuario:\nAlmacena la configuración de shadPS4 y los datos que se aplicarán sólo a la compilación shadPS4 ubicada en la carpeta actual. Reinicia la aplicación después de crear la carpeta portable de usuario para empezar a usarla. Cannot create portable user folder - Cannot create portable user folder + No se pudo crear la carpeta portable de usuario %1 already exists - %1 already exists + %1 ya existe Portable user folder created - Portable user folder created + Carpeta Portable de Usuario Creada %1 successfully created. - %1 successfully created. + %1 creado correctamente. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Abre la carpeta de trofeos/sonidos personalizados:\nPuedes añadir imágenes y un audio personalizados a los trofeos.\nAñade los archivos a custom_trophy con los siguientes nombres:\ntrophy.wav o trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNota: El sonido sólo funcionará en versiones QT. TrophyViewer Trophy Viewer - Vista de trofeos + Expositor de Trofeos Progress - Progress + Progreso Show Earned Trophies - Show Earned Trophies + Mostrar Trofeos Obtenidos Show Not Earned Trophies - Show Not Earned Trophies + Mostrar Trofeos No Obtenidos Show Hidden Trophies - Show Hidden Trophies + Mostrar Trofeos Ocultos diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index e7c48e426..f627ff640 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1734,11 +1734,11 @@ Debug - Feilretting + Feilsøking Enable Debug Dumping - Bruk feilrettingsdumping + Bruk feilsøkingsdumping Enable Vulkan Validation Layers @@ -1950,15 +1950,15 @@ Touchpad Left - Berøringsplate Venstre + Berøringsplate venstre Touchpad Right - Berøringsplate Høyre + Berøringsplate høyre Touchpad Center - Berøringsplate Midt + Berøringsplate midten None @@ -2002,7 +2002,7 @@ Enable Debug Dumping:\nSaves the import and export symbols and file header information of the currently running PS4 program to a directory. - Bruk feilrettingsdumping:\nLagrer import- og eksport-symbolene og filoverskrifts-informasjonen til det nåværende kjørende PS4-programmet i en mappe. + Bruk feilsøkingsdumping:\nLagrer import- og eksport-symbolene og filoverskrifts-informasjonen til det nåværende kjørende PS4-programmet i en mappe. Enable Vulkan Validation Layers:\nEnables a system that validates the state of the Vulkan renderer and logs information about its internal state.\nThis will reduce performance and likely change the behavior of emulation. @@ -2058,7 +2058,7 @@ Enable Motion Controls - Bruk bevegelseskontroller + Bruk bevegelsesstyring Save Data Path diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 3d1f1a222..bf58dc60d 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -559,11 +559,11 @@ Restore Defaults - Restore Defaults + Rikthe Paracaktimet Cancel - Cancel + Anulo @@ -1193,19 +1193,19 @@ Save - Save + Ruaj Apply - Apply + Zbato Restore Defaults - Restore Defaults + Rikthe Paracaktimet Cancel - Cancel + Anulo @@ -1606,7 +1606,7 @@ Default tab when opening settings - Skeda e parazgjedhur kur hapen cilësimet + Skeda e paracaktuar kur hapen cilësimet Show Game Size In List @@ -1850,7 +1850,7 @@ Restore Defaults - Rikthe paracaktimet + Rikthe Paracaktimet Close diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index de3781414..d631859d4 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -551,19 +551,19 @@ Save - Save + Spara Apply - Apply + Tillämpa Restore Defaults - Restore Defaults + Återställ till standard Cancel - Cancel + Avbryt @@ -1193,19 +1193,19 @@ Save - Save + Spara Apply - Apply + Tillämpa Restore Defaults - Restore Defaults + Återställ till standard Cancel - Cancel + Avbryt diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 1c074be6a..6083577fa 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -551,19 +551,19 @@ Save - Save + Зберегти Apply - Apply + Застосувати Restore Defaults - Restore Defaults + За замовчуванням Cancel - Cancel + Відмінити @@ -1193,19 +1193,19 @@ Save - Save + Зберегти Apply - Apply + Застосувати Restore Defaults - Restore Defaults + За замовчуванням Cancel - Cancel + Відмінити diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 80b322112..6e1fcdc95 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1105,7 +1105,7 @@ note: click Help Button/Special Keybindings for more information - 注意:点击帮助按钮 -> Special Bindings 获取更多信息 + 注意:点击帮助按钮 -> 获取更多关于映射特殊键位的信息 Face Buttons From 9298b074fc0b1641d263eecbeeb429ec21566acc Mon Sep 17 00:00:00 2001 From: Missake212 Date: Wed, 19 Mar 2025 20:09:29 +0000 Subject: [PATCH 417/455] Changing "submit report" button behavior in the GUI (#2654) * change code to serial * delete emulator version function * Adding the line back, someone else will need to look into it * fix epic fail --- src/qt_gui/gui_context_menus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 24b421b9d..c49fc99b6 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -521,7 +521,7 @@ public: "title", QString("%1 - %2").arg(QString::fromStdString(m_games[itemID].serial), QString::fromStdString(m_games[itemID].name))); query.addQueryItem("game-name", QString::fromStdString(m_games[itemID].name)); - query.addQueryItem("game-code", QString::fromStdString(m_games[itemID].serial)); + query.addQueryItem("game-serial", QString::fromStdString(m_games[itemID].serial)); query.addQueryItem("game-version", QString::fromStdString(m_games[itemID].version)); query.addQueryItem("emulator-version", QString(Common::VERSION)); url.setQuery(query); From 4eb6304076dc77f589ae293e39a8f0400b8565eb Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 19 Mar 2025 22:18:51 +0100 Subject: [PATCH 418/455] Only display the "Submit a report" button for release builds (#2656) Co-authored-by: Missake212 --- src/qt_gui/gui_context_menus.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index c49fc99b6..d3c51be85 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -116,7 +116,9 @@ public: compatibilityMenu->addAction(updateCompatibility); compatibilityMenu->addAction(viewCompatibilityReport); - compatibilityMenu->addAction(submitCompatibilityReport); + if (Common::isRelease) { + compatibilityMenu->addAction(submitCompatibilityReport); + } menu.addMenu(compatibilityMenu); From 2a05af22e17d3ece3cf04746799c710a60f31334 Mon Sep 17 00:00:00 2001 From: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Wed, 19 Mar 2025 23:20:00 +0200 Subject: [PATCH 419/455] emit_spirv: Fix comparison type (#2658) --- src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp index e2d702389..9f8784797 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp @@ -236,7 +236,7 @@ Id EmitFindILsb64(EmitContext& ctx, Id value) { const Id hi{ctx.OpCompositeExtract(ctx.U32[1], unpacked, 1U)}; const Id lo_lsb{ctx.OpFindILsb(ctx.U32[1], lo)}; const Id hi_lsb{ctx.OpFindILsb(ctx.U32[1], hi)}; - const Id found_lo{ctx.OpINotEqual(ctx.U32[1], lo_lsb, ctx.ConstU32(u32(-1)))}; + const Id found_lo{ctx.OpINotEqual(ctx.U1[1], lo_lsb, ctx.ConstU32(u32(-1)))}; return ctx.OpSelect(ctx.U32[1], found_lo, lo_lsb, hi_lsb); } From b1885baddaffd6f7c8f26e42e9754b7c71ce8aed Mon Sep 17 00:00:00 2001 From: Dmugetsu <168934208+diegolix29@users.noreply.github.com> Date: Thu, 20 Mar 2025 14:24:47 -0600 Subject: [PATCH 420/455] clock_gettime fixes for windows (#2659) * Using OrbisKernelTimespec under clock_gettime, orbis_clock_gettime, sceKernelClockGettime to fix compatibility issues. * final fix test * Roamic suggestions --- src/core/libraries/kernel/time.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/core/libraries/kernel/time.cpp b/src/core/libraries/kernel/time.cpp index 42d959885..b7e4c1756 100644 --- a/src/core/libraries/kernel/time.cpp +++ b/src/core/libraries/kernel/time.cpp @@ -172,7 +172,7 @@ static s32 clock_gettime(u32 clock_id, struct timespec* ts) { } #endif -int PS4_SYSV_ABI orbis_clock_gettime(s32 clock_id, struct timespec* ts) { +int PS4_SYSV_ABI orbis_clock_gettime(s32 clock_id, struct OrbisKernelTimespec* ts) { if (ts == nullptr) { return ORBIS_KERNEL_ERROR_EFAULT; } @@ -265,17 +265,18 @@ int PS4_SYSV_ABI orbis_clock_gettime(s32 clock_id, struct timespec* ts) { return EINVAL; } - return clock_gettime(pclock_id, ts); + timespec t{}; + int result = clock_gettime(pclock_id, &t); + ts->tv_sec = t.tv_sec; + ts->tv_nsec = t.tv_nsec; + return result; } int PS4_SYSV_ABI sceKernelClockGettime(s32 clock_id, OrbisKernelTimespec* tp) { - struct timespec ts; - const auto res = orbis_clock_gettime(clock_id, &ts); + const auto res = orbis_clock_gettime(clock_id, tp); if (res < 0) { return ErrnoToSceKernelError(res); } - tp->tv_sec = ts.tv_sec; - tp->tv_nsec = ts.tv_nsec; return ORBIS_OK; } @@ -469,4 +470,4 @@ void RegisterTime(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("-o5uEDpN+oY", "libkernel", 1, "libkernel", 1, 1, sceKernelConvertUtcToLocaltime); } -} // namespace Libraries::Kernel +} // namespace Libraries::Kernel \ No newline at end of file From c19b692a66b9c1ff8c9036c92fae38aff9ff0ee4 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Fri, 21 Mar 2025 04:26:00 +0800 Subject: [PATCH 421/455] Sync text editor changes to KBM GUI (#2660) Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/qt_gui/kbm_gui.cpp | 13 +++++-------- src/qt_gui/kbm_gui.h | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/qt_gui/kbm_gui.cpp b/src/qt_gui/kbm_gui.cpp index c148884e9..8777dda95 100644 --- a/src/qt_gui/kbm_gui.cpp +++ b/src/qt_gui/kbm_gui.cpp @@ -15,7 +15,6 @@ #include "ui_kbm_gui.h" HelpDialog* HelpWindow; - KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* parent) : QDialog(parent), m_game_info(game_info_get), ui(new Ui::KBMSettings) { @@ -48,6 +47,7 @@ KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* ui->ProfileComboBox->setCurrentText("Common Config"); ui->TitleLabel->setText("Common Config"); + config_id = "default"; connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton* button) { if (button == ui->buttonBox->button(QDialogButtonBox::Save)) { @@ -72,6 +72,7 @@ KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* connect(ui->TextEditorButton, &QPushButton::clicked, this, [this]() { auto kbmWindow = new EditorDialog(this); kbmWindow->exec(); + SetUIValuestoMappings(config_id); }); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, [this] { @@ -84,9 +85,6 @@ KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* connect(ui->ProfileComboBox, &QComboBox::currentTextChanged, this, [this] { GetGameTitle(); - std::string config_id = (ui->ProfileComboBox->currentText() == "Common Config") - ? "default" - : ui->ProfileComboBox->currentText().toStdString(); SetUIValuestoMappings(config_id); }); @@ -385,10 +383,6 @@ void KBMSettings::SaveKBMConfig(bool CloseOnSave) { lines.push_back(output_string + " = " + input_string); lines.push_back(""); - - std::string config_id = (ui->ProfileComboBox->currentText() == "Common Config") - ? "default" - : ui->ProfileComboBox->currentText().toStdString(); const auto config_file = Config::GetFoolproofKbmConfigFile(config_id); std::fstream file(config_file); int lineCount = 0; @@ -626,6 +620,9 @@ void KBMSettings::GetGameTitle() { } } } + config_id = (ui->ProfileComboBox->currentText() == "Common Config") + ? "default" + : ui->ProfileComboBox->currentText().toStdString(); } void KBMSettings::onHelpClicked() { diff --git a/src/qt_gui/kbm_gui.h b/src/qt_gui/kbm_gui.h index e63d7bd43..06e58eef6 100644 --- a/src/qt_gui/kbm_gui.h +++ b/src/qt_gui/kbm_gui.h @@ -42,7 +42,7 @@ private: QTimer* timer; QPushButton* MappingButton; QList ButtonsList; - + std::string config_id; const std::vector ControllerInputs = { "cross", "circle", "square", "triangle", "l1", "r1", "l2", "r2", "l3", From 2e54afb295035e601e5b7189cda56441f201397d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 21 Mar 2025 16:12:14 +0200 Subject: [PATCH 422/455] fix debug version for cryptopp (#2664) --- externals/cryptopp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/cryptopp b/externals/cryptopp index ee84a3144..effed0d0b 160000 --- a/externals/cryptopp +++ b/externals/cryptopp @@ -1 +1 @@ -Subproject commit ee84a3144137ac0a1294c0b4a342dca13b66923f +Subproject commit effed0d0b865afc23ed67e0916f83734e4b9b3b7 From 3b2c01272383e1fcd0b82c7873e1ebf1a641aada Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 23 Mar 2025 00:14:04 +0200 Subject: [PATCH 423/455] tagged v0.7.0 --- dist/net.shadps4.shadPS4.metainfo.xml | 3 +++ src/common/version.h | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dist/net.shadps4.shadPS4.metainfo.xml b/dist/net.shadps4.shadPS4.metainfo.xml index c8c9d5c23..99f9e070d 100644 --- a/dist/net.shadps4.shadPS4.metainfo.xml +++ b/dist/net.shadps4.shadPS4.metainfo.xml @@ -37,6 +37,9 @@ Game + + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.7.0 + https://github.com/shadps4-emu/shadPS4/releases/tag/v.0.6.0 diff --git a/src/common/version.h b/src/common/version.h index e7f6cc817..e27ed505d 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -8,7 +8,7 @@ namespace Common { -constexpr char VERSION[] = "0.6.1 WIP"; -constexpr bool isRelease = false; +constexpr char VERSION[] = "0.7.0"; +constexpr bool isRelease = true; } // namespace Common From d7b947dd796bf80422340f6a58756ede8d1be2a3 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 23 Mar 2025 00:27:20 +0200 Subject: [PATCH 424/455] starting v0.7.1 WIP --- src/common/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/version.h b/src/common/version.h index e27ed505d..652f36e6d 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -8,7 +8,7 @@ namespace Common { -constexpr char VERSION[] = "0.7.0"; -constexpr bool isRelease = true; +constexpr char VERSION[] = "0.7.1 WIP"; +constexpr bool isRelease = false; } // namespace Common From 0fa1220eca95514812682140221917af1b8e4932 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sat, 22 Mar 2025 19:27:42 -0300 Subject: [PATCH 425/455] Add option to enable/disable game folders individually (#2662) * Add option to enable/disable game folders individually A checkbox (button to select) game folders has been added to the menu, allowing you to Enable/Disable them without having to remove the folder. config.toml is now saved in alphabetical order * ordering is separation in a function * remove my comment in portuguese :) --- src/common/config.cpp | 137 +++++++++++++++++++++++++++++---- src/common/config.h | 14 +++- src/qt_gui/settings_dialog.cpp | 48 +++++++++--- 3 files changed, 170 insertions(+), 29 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 514024c30..0b5fb8be1 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -81,7 +81,7 @@ static std::string trophyKey; // Gui static bool load_game_size = true; -std::vector settings_install_dirs = {}; +static std::vector settings_install_dirs = {}; std::filesystem::path settings_addon_install_dir = {}; std::filesystem::path save_data_path = {}; u32 main_window_geometry_x = 400; @@ -519,22 +519,34 @@ void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h) { main_window_geometry_h = h; } -bool addGameInstallDir(const std::filesystem::path& dir) { - if (std::find(settings_install_dirs.begin(), settings_install_dirs.end(), dir) == - settings_install_dirs.end()) { - settings_install_dirs.push_back(dir); - return true; +bool addGameInstallDir(const std::filesystem::path& dir, bool enabled) { + for (const auto& install_dir : settings_install_dirs) { + if (install_dir.path == dir) { + return false; + } } - return false; + settings_install_dirs.push_back({dir, enabled}); + return true; } void removeGameInstallDir(const std::filesystem::path& dir) { - auto iterator = std::find(settings_install_dirs.begin(), settings_install_dirs.end(), dir); + auto iterator = + std::find_if(settings_install_dirs.begin(), settings_install_dirs.end(), + [&dir](const GameInstallDir& install_dir) { return install_dir.path == dir; }); if (iterator != settings_install_dirs.end()) { settings_install_dirs.erase(iterator); } } +void setGameInstallDirEnabled(const std::filesystem::path& dir, bool enabled) { + auto iterator = + std::find_if(settings_install_dirs.begin(), settings_install_dirs.end(), + [&dir](const GameInstallDir& install_dir) { return install_dir.path == dir; }); + if (iterator != settings_install_dirs.end()) { + iterator->enabled = enabled; + } +} + void setAddonInstallDir(const std::filesystem::path& dir) { settings_addon_install_dir = dir; } @@ -590,8 +602,15 @@ void setEmulatorLanguage(std::string language) { emulator_language = language; } -void setGameInstallDirs(const std::vector& settings_install_dirs_config) { - settings_install_dirs = settings_install_dirs_config; +void setGameInstallDirs(const std::vector& dirs_config) { + settings_install_dirs.clear(); + for (const auto& dir : dirs_config) { + settings_install_dirs.push_back({dir, true}); + } +} + +void setAllGameInstallDirs(const std::vector& dirs_config) { + settings_install_dirs = dirs_config; } void setSaveDataPath(const std::filesystem::path& path) { @@ -614,7 +633,17 @@ u32 getMainWindowGeometryH() { return main_window_geometry_h; } -const std::vector& getGameInstallDirs() { +const std::vector getGameInstallDirs() { + std::vector enabled_dirs; + for (const auto& dir : settings_install_dirs) { + if (dir.enabled) { + enabled_dirs.push_back(dir.path); + } + } + return enabled_dirs; +} + +const std::vector& getAllGameInstallDirs() { return settings_install_dirs; } @@ -809,8 +838,23 @@ void load(const std::filesystem::path& path) { const auto install_dir_array = toml::find_or>(gui, "installDirs", {}); - for (const auto& dir : install_dir_array) { - addGameInstallDir(std::filesystem::path{dir}); + + std::vector install_dirs_enabled; + try { + install_dirs_enabled = toml::find>(gui, "installDirsEnabled"); + } catch (...) { + // If it does not exist, assume that all are enabled. + install_dirs_enabled.resize(install_dir_array.size(), true); + } + + if (install_dirs_enabled.size() < install_dir_array.size()) { + install_dirs_enabled.resize(install_dir_array.size(), true); + } + + settings_install_dirs.clear(); + for (size_t i = 0; i < install_dir_array.size(); i++) { + settings_install_dirs.push_back( + {std::filesystem::path{install_dir_array[i]}, install_dirs_enabled[i]}); } save_data_path = toml::find_fs_path_or(gui, "saveDataPath", {}); @@ -853,6 +897,37 @@ void load(const std::filesystem::path& path) { } } +void sortTomlSections(toml::ordered_value& data) { + toml::ordered_value ordered_data; + std::vector section_order = {"General", "Input", "GPU", "Vulkan", + "Debug", "Keys", "GUI", "Settings"}; + + for (const auto& section : section_order) { + if (data.contains(section)) { + std::vector keys; + for (const auto& item : data.at(section).as_table()) { + keys.push_back(item.first); + } + + std::sort(keys.begin(), keys.end(), [](const std::string& a, const std::string& b) { + return std::lexicographical_compare( + a.begin(), a.end(), b.begin(), b.end(), [](char a_char, char b_char) { + return std::tolower(a_char) < std::tolower(b_char); + }); + }); + + toml::ordered_value ordered_section; + for (const auto& key : keys) { + ordered_section[key] = data.at(section).at(key); + } + + ordered_data[section] = ordered_section; + } + } + + data = ordered_data; +} + void save(const std::filesystem::path& path) { toml::ordered_value data; @@ -922,14 +997,37 @@ void save(const std::filesystem::path& path) { data["Debug"]["CollectShader"] = isShaderDebug; data["Debug"]["isSeparateLogFilesEnabled"] = isSeparateLogFilesEnabled; data["Debug"]["FPSColor"] = isFpsColor; - data["Keys"]["TrophyKey"] = trophyKey; std::vector install_dirs; - for (const auto& dirString : settings_install_dirs) { - install_dirs.emplace_back(std::string{fmt::UTF(dirString.u8string()).data}); + std::vector install_dirs_enabled; + + // temporary structure for ordering + struct DirEntry { + std::string path_str; + bool enabled; + }; + + std::vector sorted_dirs; + for (const auto& dirInfo : settings_install_dirs) { + sorted_dirs.push_back( + {std::string{fmt::UTF(dirInfo.path.u8string()).data}, dirInfo.enabled}); } + + // Sort directories alphabetically + std::sort(sorted_dirs.begin(), sorted_dirs.end(), [](const DirEntry& a, const DirEntry& b) { + return std::lexicographical_compare( + a.path_str.begin(), a.path_str.end(), b.path_str.begin(), b.path_str.end(), + [](char a_char, char b_char) { return std::tolower(a_char) < std::tolower(b_char); }); + }); + + for (const auto& entry : sorted_dirs) { + install_dirs.push_back(entry.path_str); + install_dirs_enabled.push_back(entry.enabled); + } + data["GUI"]["installDirs"] = install_dirs; + data["GUI"]["installDirsEnabled"] = install_dirs_enabled; data["GUI"]["saveDataPath"] = std::string{fmt::UTF(save_data_path.u8string()).data}; data["GUI"]["loadGameSizeEnabled"] = load_game_size; @@ -940,9 +1038,13 @@ void save(const std::filesystem::path& path) { data["GUI"]["showBackgroundImage"] = showBackgroundImage; data["Settings"]["consoleLanguage"] = m_language; + // Sorting of TOML sections + sortTomlSections(data); + std::ofstream file(path, std::ios::binary); file << data; file.close(); + saveMainWindow(path); } @@ -984,6 +1086,9 @@ void saveMainWindow(const std::filesystem::path& path) { data["GUI"]["elfDirs"] = m_elf_viewer; data["GUI"]["recentFiles"] = m_recent_files; + // Sorting of TOML sections + sortTomlSections(data); + std::ofstream file(path, std::ios::binary); file << data; file.close(); diff --git a/src/common/config.h b/src/common/config.h index 82d65d30e..e495be52a 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -9,6 +9,11 @@ namespace Config { +struct GameInstallDir { + std::filesystem::path path; + bool enabled; +}; + enum HideCursorState : s16 { Never, Idle, Always }; void load(const std::filesystem::path& path); @@ -98,7 +103,8 @@ void setUserName(const std::string& type); void setUpdateChannel(const std::string& type); void setChooseHomeTab(const std::string& type); void setSeparateUpdateEnabled(bool use); -void setGameInstallDirs(const std::vector& settings_install_dirs_config); +void setGameInstallDirs(const std::vector& dirs_config); +void setAllGameInstallDirs(const std::vector& dirs_config); void setSaveDataPath(const std::filesystem::path& path); void setCompatibilityEnabled(bool use); void setCheckCompatibilityOnStartup(bool use); @@ -133,8 +139,9 @@ void setVkGuestMarkersEnabled(bool enable); // Gui void setMainWindowGeometry(u32 x, u32 y, u32 w, u32 h); -bool addGameInstallDir(const std::filesystem::path& dir); +bool addGameInstallDir(const std::filesystem::path& dir, bool enabled = true); void removeGameInstallDir(const std::filesystem::path& dir); +void setGameInstallDirEnabled(const std::filesystem::path& dir, bool enabled); void setAddonInstallDir(const std::filesystem::path& dir); void setMainWindowTheme(u32 theme); void setIconSize(u32 size); @@ -153,7 +160,8 @@ u32 getMainWindowGeometryX(); u32 getMainWindowGeometryY(); u32 getMainWindowGeometryW(); u32 getMainWindowGeometryH(); -const std::vector& getGameInstallDirs(); +const std::vector getGameInstallDirs(); +const std::vector& getAllGameInstallDirs(); std::filesystem::path getAddonInstallDir(); u32 getMainWindowTheme(); u32 getIconSize(); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 41caccec9..a8beef8da 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -246,12 +246,13 @@ SettingsDialog::SettingsDialog(std::span physical_devices, // PATH TAB { connect(ui->addFolderButton, &QPushButton::clicked, this, [this]() { - const auto config_dir = Config::getGameInstallDirs(); QString file_path_string = QFileDialog::getExistingDirectory(this, tr("Directory to install games")); auto file_path = Common::FS::PathFromQString(file_path_string); - if (!file_path.empty() && Config::addGameInstallDir(file_path)) { + if (!file_path.empty() && Config::addGameInstallDir(file_path, true)) { QListWidgetItem* item = new QListWidgetItem(file_path_string); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(Qt::Checked); ui->gameFoldersListWidget->addItem(item); } }); @@ -783,6 +784,17 @@ void SettingsDialog::UpdateSettings() { emit BackgroundOpacityChanged(ui->backgroundImageOpacitySlider->value()); Config::setShowBackgroundImage(ui->showBackgroundImageCheckBox->isChecked()); + std::vector dirs_with_states; + for (int i = 0; i < ui->gameFoldersListWidget->count(); i++) { + QListWidgetItem* item = ui->gameFoldersListWidget->item(i); + QString path_string = item->text(); + auto path = Common::FS::PathFromQString(path_string); + bool enabled = (item->checkState() == Qt::Checked); + + dirs_with_states.push_back({path, enabled}); + } + Config::setAllGameInstallDirs(dirs_with_states); + #ifdef ENABLE_DISCORD_RPC auto* rpc = Common::Singleton::Instance(); if (Config::getEnableDiscordRPC()) { @@ -797,6 +809,7 @@ void SettingsDialog::UpdateSettings() { } void SettingsDialog::ResetInstallFolders() { + ui->gameFoldersListWidget->clear(); std::filesystem::path userdir = Common::FS::GetUserPath(Common::FS::PathType::UserDir); const toml::value data = toml::parse(userdir / "config.toml"); @@ -805,21 +818,36 @@ void SettingsDialog::ResetInstallFolders() { const toml::value& gui = data.at("GUI"); const auto install_dir_array = toml::find_or>(gui, "installDirs", {}); - std::vector settings_install_dirs_config = {}; - for (const auto& dir : install_dir_array) { - if (std::find(settings_install_dirs_config.begin(), settings_install_dirs_config.end(), - dir) == settings_install_dirs_config.end()) { - settings_install_dirs_config.push_back(dir); - } + std::vector install_dirs_enabled; + try { + install_dirs_enabled = toml::find>(gui, "installDirsEnabled"); + } catch (...) { + // If it does not exist, assume that all are enabled. + install_dirs_enabled.resize(install_dir_array.size(), true); } - for (const auto& dir : settings_install_dirs_config) { + if (install_dirs_enabled.size() < install_dir_array.size()) { + install_dirs_enabled.resize(install_dir_array.size(), true); + } + + std::vector settings_install_dirs_config; + + for (size_t i = 0; i < install_dir_array.size(); i++) { + std::filesystem::path dir = install_dir_array[i]; + bool enabled = install_dirs_enabled[i]; + + settings_install_dirs_config.push_back({dir, enabled}); + QString path_string; Common::FS::PathToQString(path_string, dir); + QListWidgetItem* item = new QListWidgetItem(path_string); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(enabled ? Qt::Checked : Qt::Unchecked); ui->gameFoldersListWidget->addItem(item); } - Config::setGameInstallDirs(settings_install_dirs_config); + + Config::setAllGameInstallDirs(settings_install_dirs_config); } } From a80c4a7f482efd5278daa08c374e78149226942c Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Sun, 23 Mar 2025 01:27:57 +0300 Subject: [PATCH 426/455] Reset previous buffer label instead of current one (#2663) * Reset previous buffer label * Reset flip label also when registering buffer --- src/core/libraries/videoout/driver.cpp | 13 ++++++++++--- src/core/libraries/videoout/driver.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index d2c980882..8f725e549 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -63,6 +63,7 @@ void VideoOutDriver::Close(s32 handle) { main_port.is_open = false; main_port.flip_rate = 0; + main_port.prev_index = -1; ASSERT(main_port.flip_events.empty()); } @@ -133,6 +134,10 @@ int VideoOutDriver::RegisterBuffers(VideoOutPort* port, s32 startIndex, void* co .address_right = 0, }; + // Reset flip label also when registering buffer + port->buffer_labels[startIndex + i] = 0; + port->SignalVoLabel(); + presenter->RegisterVideoOutSurface(group, address); LOG_INFO(Lib_VideoOut, "buffers[{}] = {:#x}", i + startIndex, address); } @@ -190,11 +195,13 @@ void VideoOutDriver::Flip(const Request& req) { } } - // Reset flip label - if (req.index != -1) { - port->buffer_labels[req.index] = 0; + // Reset prev flip label + if (port->prev_index != -1) { + port->buffer_labels[port->prev_index] = 0; port->SignalVoLabel(); } + // save to prev buf index + port->prev_index = req.index; } void VideoOutDriver::DrawBlankFrame() { diff --git a/src/core/libraries/videoout/driver.h b/src/core/libraries/videoout/driver.h index e57b189b5..3b0df43b9 100644 --- a/src/core/libraries/videoout/driver.h +++ b/src/core/libraries/videoout/driver.h @@ -32,6 +32,7 @@ struct VideoOutPort { std::condition_variable vo_cv; std::condition_variable vblank_cv; int flip_rate = 0; + int prev_index = -1; bool is_open = false; bool is_mode_changing = false; // Used to prevent flip during mode change From 1f9ac53c28a12f2ebd33f0b080c342e34a4ed110 Mon Sep 17 00:00:00 2001 From: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Sun, 23 Mar 2025 00:35:42 +0200 Subject: [PATCH 427/455] shader_recompiler: Improve divergence handling and readlane elimintation (#2667) * control_flow_graph: Improve divergence handling * recompiler: Simplify optimization passes Removes a redudant constant propagation and cleans up the passes a little * ir_passes: Add new readlane elimination pass The algorithm has grown complex enough where it deserves its own pass. The old implementation could only handle a single phi level properly, however this one should be able to eliminate vast majority of lane cases remaining. It first performs a traversal of the phi tree to ensure that all phi sources can be rewritten into an expected value and then performs elimintation by recursively duplicating the phi nodes at each step, in order to preserve control flow. * clang format * control_flow_graph: Remove debug code --- CMakeLists.txt | 2 +- .../frontend/control_flow_graph.cpp | 151 ++++++++++-------- .../frontend/control_flow_graph.h | 2 +- .../ir/passes/constant_propagation_pass.cpp | 50 ------ .../ir/passes/hull_shader_transform.cpp | 4 + src/shader_recompiler/ir/passes/ir_passes.h | 4 +- .../ir/passes/readlane_elimination_pass.cpp | 115 +++++++++++++ .../ir/passes/ring_access_elimination.cpp | 5 +- src/shader_recompiler/recompiler.cpp | 17 +- 9 files changed, 211 insertions(+), 139 deletions(-) create mode 100644 src/shader_recompiler/ir/passes/readlane_elimination_pass.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f05587d38..185205221 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -771,6 +771,7 @@ set(SHADER_RECOMPILER src/shader_recompiler/exception.h src/shader_recompiler/ir/passes/identity_removal_pass.cpp src/shader_recompiler/ir/passes/ir_passes.h src/shader_recompiler/ir/passes/lower_buffer_format_to_raw.cpp + src/shader_recompiler/ir/passes/readlane_elimination_pass.cpp src/shader_recompiler/ir/passes/resource_tracking_pass.cpp src/shader_recompiler/ir/passes/ring_access_elimination.cpp src/shader_recompiler/ir/passes/shader_info_collection_pass.cpp @@ -1121,7 +1122,6 @@ cmrc_add_resource_library(embedded-resources src/images/gold.png src/images/platinum.png src/images/silver.png) - target_link_libraries(shadps4 PRIVATE res::embedded) # ImGui resources diff --git a/src/shader_recompiler/frontend/control_flow_graph.cpp b/src/shader_recompiler/frontend/control_flow_graph.cpp index 126cb4eb6..cf1882b8c 100644 --- a/src/shader_recompiler/frontend/control_flow_graph.cpp +++ b/src/shader_recompiler/frontend/control_flow_graph.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "common/assert.h" #include "shader_recompiler/frontend/control_flow_graph.h" @@ -39,9 +40,6 @@ static IR::Condition MakeCondition(const GcnInst& inst) { return IR::Condition::Execz; case Opcode::S_CBRANCH_EXECNZ: return IR::Condition::Execnz; - case Opcode::S_AND_SAVEEXEC_B64: - case Opcode::S_ANDN2_B64: - return IR::Condition::Execnz; default: return IR::Condition::True; } @@ -76,9 +74,9 @@ CFG::CFG(Common::ObjectPool& block_pool_, std::span inst_l index_to_pc.resize(inst_list.size() + 1); labels.reserve(LabelReserveSize); EmitLabels(); - EmitDivergenceLabels(); EmitBlocks(); LinkBlocks(); + SplitDivergenceScopes(); } void CFG::EmitLabels() { @@ -112,7 +110,7 @@ void CFG::EmitLabels() { std::ranges::sort(labels); } -void CFG::EmitDivergenceLabels() { +void CFG::SplitDivergenceScopes() { const auto is_open_scope = [](const GcnInst& inst) { // An open scope instruction is an instruction that modifies EXEC // but also saves the previous value to restore later. This indicates @@ -136,64 +134,97 @@ void CFG::EmitDivergenceLabels() { (inst.opcode == Opcode::S_ANDN2_B64 && inst.dst[0].field == OperandField::ExecLo); }; - // Since we will be adding new labels, avoid iterating those as well. - const size_t end_size = labels.size(); - for (u32 l = 0; l < end_size; l++) { - const Label start = labels[l]; - // Stop if we reached end of existing labels. - if (l == end_size - 1) { - break; - } - const Label end = labels[l + 1]; - const size_t end_index = GetIndex(end); - + for (auto blk = blocks.begin(); blk != blocks.end(); blk++) { + auto next_blk = std::next(blk); s32 curr_begin = -1; - s32 last_exec_idx = -1; - for (size_t index = GetIndex(start); index < end_index; index++) { + for (size_t index = blk->begin_index; index <= blk->end_index; index++) { const auto& inst = inst_list[index]; - if (curr_begin != -1) { - // Keep note of the last instruction that does not ignore exec, so we know where - // to end the divergence block without impacting trailing instructions that do. - if (!IgnoresExecMask(inst)) { - last_exec_idx = index; - } - // Consider a close scope on certain instruction types or at the last instruction - // before the next label. - if (is_close_scope(inst) || index == end_index - 1) { - // Only insert a scope if, since the open-scope instruction, there is at least - // one instruction that does not ignore exec. - if (index - curr_begin > 1 && last_exec_idx != -1) { - // Add a label to the instruction right after the open scope call. - // It is the start of a new basic block. - const auto& save_inst = inst_list[curr_begin]; - AddLabel(index_to_pc[curr_begin] + save_inst.length); - // Add a label to the close scope instruction. - // There are 3 cases where we need to close a scope. - // * Close scope instruction inside the block - // * Close scope instruction at the end of the block (cbranch or endpgm) - // * Normal instruction at the end of the block - // If the instruction we want to close the scope at is at the end of the - // block, we do not need to insert a new label. - if (last_exec_idx != end_index - 1) { - // Add the label after the last instruction affected by exec. - const auto& last_exec_inst = inst_list[last_exec_idx]; - AddLabel(index_to_pc[last_exec_idx] + last_exec_inst.length); - } - } - // Reset scope begin. + const bool is_close = is_close_scope(inst); + if ((is_close || index == blk->end_index) && curr_begin != -1) { + // If there are no instructions inside scope don't do anything. + if (index - curr_begin == 1) { curr_begin = -1; + continue; } + // If all instructions in the scope ignore exec masking, we shouldn't insert a + // scope. + const auto start = inst_list.begin() + curr_begin + 1; + if (!std::ranges::all_of(start, inst_list.begin() + index, IgnoresExecMask)) { + // Determine the first instruction affected by the exec mask. + do { + ++curr_begin; + } while (IgnoresExecMask(inst_list[curr_begin])); + + // Determine the last instruction affected by the exec mask. + s32 curr_end = index; + while (IgnoresExecMask(inst_list[curr_end])) { + --curr_end; + } + + // Create a new block for the divergence scope. + Block* block = block_pool.Create(); + block->begin = index_to_pc[curr_begin]; + block->end = index_to_pc[curr_end]; + block->begin_index = curr_begin; + block->end_index = curr_end; + block->end_inst = inst_list[curr_end]; + blocks.insert_before(next_blk, *block); + + // If we are inside the parent block, make an epilogue block and jump to it. + if (curr_end != blk->end_index) { + Block* epi_block = block_pool.Create(); + epi_block->begin = index_to_pc[curr_end + 1]; + epi_block->end = blk->end; + epi_block->begin_index = curr_end + 1; + epi_block->end_index = blk->end_index; + epi_block->end_inst = blk->end_inst; + epi_block->cond = blk->cond; + epi_block->end_class = blk->end_class; + epi_block->branch_true = blk->branch_true; + epi_block->branch_false = blk->branch_false; + blocks.insert_before(next_blk, *epi_block); + + // Have divergence block always jump to epilogue block. + block->cond = IR::Condition::True; + block->branch_true = epi_block; + block->branch_false = nullptr; + + // If the parent block fails to enter divergence block make it jump to + // epilogue too + blk->branch_false = epi_block; + } else { + // No epilogue block is needed since the divergence block + // also ends the parent block. Inherit the end condition. + auto& parent_blk = *blk; + ASSERT(blk->cond == IR::Condition::True && blk->branch_true); + block->cond = IR::Condition::True; + block->branch_true = blk->branch_true; + block->branch_false = nullptr; + + // If the parent block didn't enter the divergence scope + // have it jump directly to the next one + blk->branch_false = blk->branch_true; + } + + // Shrink parent block to end right before curr_begin + // and make it jump to divergence block + --curr_begin; + blk->end = index_to_pc[curr_begin]; + blk->end_index = curr_begin; + blk->end_inst = inst_list[curr_begin]; + blk->cond = IR::Condition::Execnz; + blk->end_class = EndClass::Branch; + blk->branch_true = block; + } + // Reset scope begin. + curr_begin = -1; } // Mark a potential start of an exec scope. if (is_open_scope(inst)) { curr_begin = index; - last_exec_idx = -1; } } } - - // Sort labels to make sure block insertion is correct. - std::ranges::sort(labels); } void CFG::EmitBlocks() { @@ -234,22 +265,6 @@ void CFG::LinkBlocks() { for (auto it = blocks.begin(); it != blocks.end(); it++) { auto& block = *it; const auto end_inst{block.end_inst}; - // Handle divergence block inserted here. - if (end_inst.opcode == Opcode::S_AND_SAVEEXEC_B64 || - end_inst.opcode == Opcode::S_ANDN2_B64 || end_inst.IsCmpx()) { - // Blocks are stored ordered by address in the set - auto next_it = std::next(it); - auto* target_block = &(*next_it); - ++target_block->num_predecessors; - block.branch_true = target_block; - - auto merge_it = std::next(next_it); - auto* merge_block = &(*merge_it); - ++merge_block->num_predecessors; - block.branch_false = merge_block; - block.end_class = EndClass::Branch; - continue; - } // If the block doesn't end with a branch we simply // need to link with the next block. diff --git a/src/shader_recompiler/frontend/control_flow_graph.h b/src/shader_recompiler/frontend/control_flow_graph.h index d98d4b05d..0acce3306 100644 --- a/src/shader_recompiler/frontend/control_flow_graph.h +++ b/src/shader_recompiler/frontend/control_flow_graph.h @@ -57,9 +57,9 @@ public: private: void EmitLabels(); - void EmitDivergenceLabels(); void EmitBlocks(); void LinkBlocks(); + void SplitDivergenceScopes(); void AddLabel(Label address) { const auto it = std::ranges::find(labels, address); diff --git a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp index c8a4b13cb..5c66b1115 100644 --- a/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir/passes/constant_propagation_pass.cpp @@ -251,54 +251,6 @@ void FoldCmpClass(IR::Block& block, IR::Inst& inst) { } } -void FoldReadLane(IR::Block& block, IR::Inst& inst) { - const u32 lane = inst.Arg(1).U32(); - IR::Inst* prod = inst.Arg(0).InstRecursive(); - - const auto search_chain = [lane](const IR::Inst* prod) -> IR::Value { - while (prod->GetOpcode() == IR::Opcode::WriteLane) { - if (prod->Arg(2).U32() == lane) { - return prod->Arg(1); - } - prod = prod->Arg(0).InstRecursive(); - } - return {}; - }; - - if (prod->GetOpcode() == IR::Opcode::WriteLane) { - if (const IR::Value value = search_chain(prod); !value.IsEmpty()) { - inst.ReplaceUsesWith(value); - } - return; - } - - if (prod->GetOpcode() == IR::Opcode::Phi) { - boost::container::small_vector phi_args; - for (size_t arg_index = 0; arg_index < prod->NumArgs(); ++arg_index) { - const IR::Inst* arg{prod->Arg(arg_index).InstRecursive()}; - if (arg->GetOpcode() != IR::Opcode::WriteLane) { - return; - } - const IR::Value value = search_chain(arg); - if (value.IsEmpty()) { - continue; - } - phi_args.emplace_back(value); - } - if (std::ranges::all_of(phi_args, [&](IR::Value value) { return value == phi_args[0]; })) { - inst.ReplaceUsesWith(phi_args[0]); - return; - } - const auto insert_point = IR::Block::InstructionList::s_iterator_to(*prod); - IR::Inst* const new_phi{&*block.PrependNewInst(insert_point, IR::Opcode::Phi)}; - new_phi->SetFlags(IR::Type::U32); - for (size_t arg_index = 0; arg_index < phi_args.size(); arg_index++) { - new_phi->AddPhiOperand(prod->PhiBlock(arg_index), phi_args[arg_index]); - } - inst.ReplaceUsesWith(IR::Value{new_phi}); - } -} - void ConstantPropagation(IR::Block& block, IR::Inst& inst) { switch (inst.GetOpcode()) { case IR::Opcode::IAdd32: @@ -408,8 +360,6 @@ void ConstantPropagation(IR::Block& block, IR::Inst& inst) { case IR::Opcode::SelectF32: case IR::Opcode::SelectF64: return FoldSelect(inst); - case IR::Opcode::ReadLane: - return FoldReadLane(block, inst); case IR::Opcode::FPNeg32: FoldWhenAllImmediates(inst, [](f32 a) { return -a; }); return; diff --git a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp index 48727e32a..5cf8a1525 100644 --- a/src/shader_recompiler/ir/passes/hull_shader_transform.cpp +++ b/src/shader_recompiler/ir/passes/hull_shader_transform.cpp @@ -1,11 +1,13 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later + #include "common/assert.h" #include "shader_recompiler/info.h" #include "shader_recompiler/ir/attribute.h" #include "shader_recompiler/ir/breadth_first_search.h" #include "shader_recompiler/ir/ir_emitter.h" #include "shader_recompiler/ir/opcodes.h" +#include "shader_recompiler/ir/passes/ir_passes.h" #include "shader_recompiler/ir/pattern_matching.h" #include "shader_recompiler/ir/program.h" #include "shader_recompiler/runtime_info.h" @@ -734,6 +736,8 @@ void TessellationPreprocess(IR::Program& program, RuntimeInfo& runtime_info) { } } } + + ConstantPropagationPass(program.post_order_blocks); } } // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir/passes/ir_passes.h b/src/shader_recompiler/ir/passes/ir_passes.h index 69628dbfd..760dbb112 100644 --- a/src/shader_recompiler/ir/passes/ir_passes.h +++ b/src/shader_recompiler/ir/passes/ir_passes.h @@ -17,11 +17,11 @@ void IdentityRemovalPass(IR::BlockList& program); void DeadCodeEliminationPass(IR::Program& program); void ConstantPropagationPass(IR::BlockList& program); void FlattenExtendedUserdataPass(IR::Program& program); +void ReadLaneEliminationPass(IR::Program& program); void ResourceTrackingPass(IR::Program& program); void CollectShaderInfoPass(IR::Program& program); void LowerBufferFormatToRaw(IR::Program& program); -void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info, - Stage stage); +void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info); void TessellationPreprocess(IR::Program& program, RuntimeInfo& runtime_info); void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info); void DomainShaderTransform(IR::Program& program, RuntimeInfo& runtime_info); diff --git a/src/shader_recompiler/ir/passes/readlane_elimination_pass.cpp b/src/shader_recompiler/ir/passes/readlane_elimination_pass.cpp new file mode 100644 index 000000000..fbe382d41 --- /dev/null +++ b/src/shader_recompiler/ir/passes/readlane_elimination_pass.cpp @@ -0,0 +1,115 @@ +// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "shader_recompiler/ir/program.h" + +namespace Shader::Optimization { + +static IR::Inst* SearchChain(IR::Inst* inst, u32 lane) { + while (inst->GetOpcode() == IR::Opcode::WriteLane) { + if (inst->Arg(2).U32() == lane) { + // We found a possible write lane source, return it. + return inst; + } + inst = inst->Arg(0).InstRecursive(); + } + return inst; +} + +static bool IsPossibleToEliminate(IR::Inst* inst, u32 lane) { + // Breadth-first search visiting the right most arguments first + boost::container::small_vector visited; + std::queue queue; + queue.push(inst); + + while (!queue.empty()) { + // Pop one instruction from the queue + IR::Inst* inst{queue.front()}; + queue.pop(); + + // If it's a WriteLane search for possible candidates + if (inst = SearchChain(inst, lane); inst->GetOpcode() == IR::Opcode::WriteLane) { + // We found a possible write lane source, stop looking here. + continue; + } + // If there are other instructions in-between that use the value we can't eliminate. + if (inst->GetOpcode() != IR::Opcode::ReadLane && inst->GetOpcode() != IR::Opcode::Phi) { + return false; + } + // Visit the right most arguments first + for (size_t arg = inst->NumArgs(); arg--;) { + auto arg_value{inst->Arg(arg)}; + if (arg_value.IsImmediate()) { + continue; + } + // Queue instruction if it hasn't been visited + IR::Inst* arg_inst{arg_value.InstRecursive()}; + if (std::ranges::find(visited, arg_inst) == visited.end()) { + visited.push_back(arg_inst); + queue.push(arg_inst); + } + } + } + return true; +} + +using PhiMap = std::unordered_map; + +static IR::Value GetRealValue(PhiMap& phi_map, IR::Inst* inst, u32 lane) { + // If this is a WriteLane op search the chain for a possible candidate. + if (inst = SearchChain(inst, lane); inst->GetOpcode() == IR::Opcode::WriteLane) { + return inst->Arg(1); + } + + // If this is a phi, duplicate it and populate its arguments with real values. + if (inst->GetOpcode() == IR::Opcode::Phi) { + // We are in a phi cycle, use the already duplicated phi. + const auto [it, is_new_phi] = phi_map.try_emplace(inst); + if (!is_new_phi) { + return IR::Value{it->second}; + } + + // Create new phi and insert it right before the old one. + const auto insert_point = IR::Block::InstructionList::s_iterator_to(*inst); + IR::Block* block = inst->GetParent(); + IR::Inst* new_phi{&*block->PrependNewInst(insert_point, IR::Opcode::Phi)}; + new_phi->SetFlags(IR::Type::U32); + it->second = new_phi; + + // Gather all arguments. + for (size_t arg_index = 0; arg_index < inst->NumArgs(); arg_index++) { + IR::Inst* arg_prod = inst->Arg(arg_index).InstRecursive(); + const IR::Value arg = GetRealValue(phi_map, arg_prod, lane); + new_phi->AddPhiOperand(inst->PhiBlock(arg_index), arg); + } + return IR::Value{new_phi}; + } + UNREACHABLE(); +} + +void ReadLaneEliminationPass(IR::Program& program) { + PhiMap phi_map; + for (IR::Block* const block : program.blocks) { + for (IR::Inst& inst : block->Instructions()) { + if (inst.GetOpcode() != IR::Opcode::ReadLane) { + continue; + } + const u32 lane = inst.Arg(1).U32(); + IR::Inst* prod = inst.Arg(0).InstRecursive(); + + // Check simple case of no control flow and phis + if (prod = SearchChain(prod, lane); prod->GetOpcode() == IR::Opcode::WriteLane) { + inst.ReplaceUsesWith(prod->Arg(1)); + continue; + } + + // Traverse the phi tree to see if it's possible to eliminate + if (prod->GetOpcode() == IR::Opcode::Phi && IsPossibleToEliminate(prod, lane)) { + inst.ReplaceUsesWith(GetRealValue(phi_map, prod, lane)); + phi_map.clear(); + } + } + } +} + +} // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir/passes/ring_access_elimination.cpp b/src/shader_recompiler/ir/passes/ring_access_elimination.cpp index d6f1efb12..071b94ac0 100644 --- a/src/shader_recompiler/ir/passes/ring_access_elimination.cpp +++ b/src/shader_recompiler/ir/passes/ring_access_elimination.cpp @@ -11,8 +11,7 @@ namespace Shader::Optimization { -void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info, - Stage stage) { +void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtime_info) { auto& info = program.info; const auto& ForEachInstruction = [&](auto func) { @@ -24,7 +23,7 @@ void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtim } }; - switch (stage) { + switch (program.info.stage) { case Stage::Local: { ForEachInstruction([=](IR::IREmitter& ir, IR::Inst& inst) { const auto opcode = inst.GetOpcode(); diff --git a/src/shader_recompiler/recompiler.cpp b/src/shader_recompiler/recompiler.cpp index 1c132ebbb..5004e0beb 100644 --- a/src/shader_recompiler/recompiler.cpp +++ b/src/shader_recompiler/recompiler.cpp @@ -1,9 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/config.h" -#include "common/io_file.h" -#include "common/path_util.h" #include "shader_recompiler/frontend/control_flow_graph.h" #include "shader_recompiler/frontend/decode.h" #include "shader_recompiler/frontend/structured_control_flow.h" @@ -63,26 +60,18 @@ IR::Program TranslateProgram(std::span code, Pools& pools, Info& info program.post_order_blocks = Shader::IR::PostOrder(program.syntax_list.front()); // Run optimization passes - const auto stage = program.info.stage; - Shader::Optimization::SsaRewritePass(program.post_order_blocks); + Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::IdentityRemovalPass(program.blocks); if (info.l_stage == LogicalStage::TessellationControl) { - // Tess passes require previous const prop passes for now (for simplicity). TODO allow - // fine grained folding or opportunistic folding we set an operand to an immediate - Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::TessellationPreprocess(program, runtime_info); - Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::HullShaderTransform(program, runtime_info); } else if (info.l_stage == LogicalStage::TessellationEval) { - Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::TessellationPreprocess(program, runtime_info); - Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); Shader::Optimization::DomainShaderTransform(program, runtime_info); } - Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); - Shader::Optimization::RingAccessElimination(program, runtime_info, stage); - Shader::Optimization::ConstantPropagationPass(program.post_order_blocks); + Shader::Optimization::RingAccessElimination(program, runtime_info); + Shader::Optimization::ReadLaneEliminationPass(program); Shader::Optimization::FlattenExtendedUserdataPass(program); Shader::Optimization::ResourceTrackingPass(program); Shader::Optimization::LowerBufferFormatToRaw(program); From 6f944ab1173eb478f7d83db3c637badef2289aaf Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Sun, 23 Mar 2025 22:39:15 +0800 Subject: [PATCH 428/455] Fix spacing for translated KBM GUI (#2670) --- src/qt_gui/kbm_gui.ui | 290 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 262 insertions(+), 28 deletions(-) diff --git a/src/qt_gui/kbm_gui.ui b/src/qt_gui/kbm_gui.ui index 0eac88105..c8d63cd00 100644 --- a/src/qt_gui/kbm_gui.ui +++ b/src/qt_gui/kbm_gui.ui @@ -11,10 +11,16 @@ 0 0 - 1193 - 754 + 1234 + 796 + + + 0 + 0 + + Qt::FocusPolicy::StrongFocus @@ -38,8 +44,8 @@ 0 0 - 1173 - 704 + 1214 + 746 @@ -47,8 +53,8 @@ 0 0 - 1171 - 703 + 1211 + 741 @@ -63,7 +69,7 @@ true - + 0 0 @@ -149,6 +155,12 @@ + + + 160 + 0 + + Left @@ -180,6 +192,12 @@ + + + 160 + 0 + + Right @@ -282,11 +300,17 @@ - + 0 0 + + + 344 + 16777215 + + Left Analog Halfmode @@ -319,7 +343,7 @@ - + 0 0 @@ -405,6 +429,12 @@ + + + 160 + 0 + + Left @@ -436,6 +466,12 @@ + + + 160 + 0 + + 179 @@ -528,18 +564,24 @@ - + 0 - + 0 0 + + + 0 + 0 + + 12 @@ -652,6 +694,18 @@ + + + 0 + 0 + + + + + 160 + 0 + + L1 @@ -670,6 +724,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -683,6 +743,12 @@ + + + 0 + 0 + + 160 @@ -707,6 +773,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -724,6 +796,18 @@ + + + 0 + 0 + + + + + 0 + 0 + + true @@ -735,6 +819,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -745,6 +835,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -762,6 +858,12 @@ + + + 0 + 0 + + 160 @@ -786,6 +888,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -799,6 +907,18 @@ + + + 0 + 0 + + + + + 160 + 0 + + R2 @@ -817,6 +937,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -857,7 +983,7 @@ - 420 + 500 200 @@ -887,6 +1013,12 @@ + + + 0 + 0 + + 160 @@ -911,6 +1043,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -924,12 +1062,30 @@ + + + 0 + 0 + + + + + 160 + 0 + + Touchpad Click + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -947,6 +1103,18 @@ + + + 0 + 0 + + + + + 0 + 0 + + Mouse to Joystick @@ -982,6 +1150,12 @@ + + + 0 + 0 + + 160 @@ -1006,6 +1180,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -1019,9 +1199,15 @@ + + + 0 + 0 + + - 145 + 160 0 @@ -1043,6 +1229,12 @@ + + + 0 + 0 + + Qt::FocusPolicy::NoFocus @@ -1064,6 +1256,12 @@ + + + 0 + 0 + + false @@ -1196,6 +1394,25 @@ + + + + + 0 + 0 + + + + + true + false + + + + note: click Help Button/Special Keybindings for more information + + + @@ -1203,19 +1420,6 @@ - - - - - true - false - - - - note: click Help Button/Special Keybindings for more information - - - @@ -1226,7 +1430,7 @@ - + 0 0 @@ -1306,6 +1510,12 @@ + + + 160 + 0 + + Square @@ -1337,6 +1547,12 @@ + + + 160 + 0 + + Circle @@ -1444,6 +1660,12 @@ 0 + + + 344 + 16777215 + + Right Analog Halfmode @@ -1476,7 +1698,7 @@ - + 0 0 @@ -1568,6 +1790,12 @@ + + + 160 + 0 + + Left @@ -1599,6 +1827,12 @@ + + + 160 + 0 + + Right From 99332e4ec281dc6541948cd94c8f7dad83dacee4 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Sun, 23 Mar 2025 22:24:49 +0100 Subject: [PATCH 429/455] Handle "-patch" as the suffix for game update folders (#2674) * Handle "-patch" as the suffix for game update folders * clang * clang 2 --- src/core/file_format/pkg.cpp | 2 +- src/core/file_sys/fs.cpp | 4 ++++ src/emulator.cpp | 2 +- src/qt_gui/game_info.cpp | 2 +- src/qt_gui/game_info.h | 6 ++++++ src/qt_gui/gui_context_menus.h | 23 +++++++++++++++++++++-- src/qt_gui/kbm_config_dialog.cpp | 3 ++- src/qt_gui/main_window.cpp | 6 +++--- 8 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/core/file_format/pkg.cpp b/src/core/file_format/pkg.cpp index a6b5eb9a8..ecc5f10a4 100644 --- a/src/core/file_format/pkg.cpp +++ b/src/core/file_format/pkg.cpp @@ -350,7 +350,7 @@ bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem:: auto title_id = GetTitleID(); if (parent_path.filename() != title_id && - !fmt::UTF(extract_path.u8string()).data.ends_with("-UPDATE")) { + !fmt::UTF(extract_path.u8string()).data.ends_with("-patch")) { extractPaths[ndinode_counter] = parent_path / title_id; } else { // DLCs path has different structure diff --git a/src/core/file_sys/fs.cpp b/src/core/file_sys/fs.cpp index ec940503f..4dad44874 100644 --- a/src/core/file_sys/fs.cpp +++ b/src/core/file_sys/fs.cpp @@ -70,6 +70,10 @@ std::filesystem::path MntPoints::GetHostPath(std::string_view path, bool* is_rea std::filesystem::path host_path = mount->host_path / rel_path; std::filesystem::path patch_path = mount->host_path; patch_path += "-UPDATE"; + if (!std::filesystem::exists(patch_path)) { + patch_path = mount->host_path; + patch_path += "-patch"; + } patch_path /= rel_path; if ((corrected_path.starts_with("/app0") || corrected_path.starts_with("/hostapp")) && diff --git a/src/emulator.cpp b/src/emulator.cpp index b6586ecfd..4ec62995b 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -80,7 +80,7 @@ void Emulator::Run(const std::filesystem::path& file, const std::vectorshow(); @@ -434,6 +450,9 @@ public: QString folder_path, game_update_path, dlc_path, save_data_path, trophy_data_path; Common::FS::PathToQString(folder_path, m_games[itemID].path); game_update_path = folder_path + "-UPDATE"; + if (!std::filesystem::exists(Common::FS::PathFromQString(game_update_path))) { + game_update_path = folder_path + "-patch"; + } Common::FS::PathToQString( dlc_path, Config::getAddonInstallDir() / Common::FS::PathFromQString(folder_path).parent_path().filename()); diff --git a/src/qt_gui/kbm_config_dialog.cpp b/src/qt_gui/kbm_config_dialog.cpp index 49a6bcd89..1851c591d 100644 --- a/src/qt_gui/kbm_config_dialog.cpp +++ b/src/qt_gui/kbm_config_dialog.cpp @@ -225,7 +225,8 @@ void EditorDialog::loadInstalledGames() { QDir parentFolder(installDir); QFileInfoList fileList = parentFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); for (const auto& fileInfo : fileList) { - if (fileInfo.isDir() && !fileInfo.filePath().endsWith("-UPDATE")) { + if (fileInfo.isDir() && (!fileInfo.filePath().endsWith("-UPDATE") || + !fileInfo.filePath().endsWith("-patch"))) { gameComboBox->addItem(fileInfo.fileName()); // Add game name to combo box } } diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index bde32a52d..68135048e 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -840,7 +840,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int // Default paths auto game_folder_path = game_install_dir / pkg.GetTitleID(); auto game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-UPDATE") + (std::string{pkg.GetTitleID()} + "-patch") : game_folder_path; const int max_depth = 5; @@ -851,7 +851,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int if (found_game.has_value()) { game_folder_path = found_game.value().parent_path(); game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-UPDATE") + (std::string{pkg.GetTitleID()} + "-patch") : game_folder_path; } } else { @@ -866,7 +866,7 @@ void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int game_folder_path = game_install_dir / pkg.GetTitleID(); } game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-UPDATE") + (std::string{pkg.GetTitleID()} + "-patch") : game_folder_path; } From 10bf3d383c80e3bd5436a9ea99e7d2c96ed4fa96 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Sun, 23 Mar 2025 18:25:11 -0300 Subject: [PATCH 430/455] QT: Fix PR 2662 (#2676) --- src/common/config.cpp | 6 +++--- src/common/config.h | 2 +- src/qt_gui/main.cpp | 7 ++++++- src/qt_gui/settings_dialog.cpp | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 0b5fb8be1..fd6538f85 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -82,6 +82,7 @@ static std::string trophyKey; // Gui static bool load_game_size = true; static std::vector settings_install_dirs = {}; +std::vector install_dirs_enabled = {}; std::filesystem::path settings_addon_install_dir = {}; std::filesystem::path save_data_path = {}; u32 main_window_geometry_x = 400; @@ -643,8 +644,8 @@ const std::vector getGameInstallDirs() { return enabled_dirs; } -const std::vector& getAllGameInstallDirs() { - return settings_install_dirs; +const std::vector getGameInstallDirsEnabled() { + return install_dirs_enabled; } std::filesystem::path getAddonInstallDir() { @@ -839,7 +840,6 @@ void load(const std::filesystem::path& path) { const auto install_dir_array = toml::find_or>(gui, "installDirs", {}); - std::vector install_dirs_enabled; try { install_dirs_enabled = toml::find>(gui, "installDirsEnabled"); } catch (...) { diff --git a/src/common/config.h b/src/common/config.h index e495be52a..4202da88a 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -161,7 +161,7 @@ u32 getMainWindowGeometryY(); u32 getMainWindowGeometryW(); u32 getMainWindowGeometryH(); const std::vector getGameInstallDirs(); -const std::vector& getAllGameInstallDirs(); +const std::vector getGameInstallDirsEnabled(); std::filesystem::path getAddonInstallDir(); u32 getMainWindowTheme(); u32 getIconSize(); diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 36dc226ae..d70294e40 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -157,8 +157,13 @@ int main(int argc, char* argv[]) { } } + bool allInstallDirsDisabled = + std::all_of(Config::getGameInstallDirsEnabled().begin(), + Config::getGameInstallDirsEnabled().end(), [](bool val) { return !val; }); + // If no game directory is set and no command line argument, prompt for it - if (Config::getGameInstallDirs().empty() && !has_command_line_argument) { + if (Config::getGameInstallDirs().empty() && allInstallDirsDisabled && + !has_command_line_argument) { GameInstallDialog dlg; dlg.exec(); } diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index a8beef8da..d789f6f48 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -821,7 +821,7 @@ void SettingsDialog::ResetInstallFolders() { std::vector install_dirs_enabled; try { - install_dirs_enabled = toml::find>(gui, "installDirsEnabled"); + install_dirs_enabled = Config::getGameInstallDirsEnabled(); } catch (...) { // If it does not exist, assume that all are enabled. install_dirs_enabled.resize(install_dir_array.size(), true); From 4f8e5dfd7c03b89bc133d96bb19adb28cb62d074 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 24 Mar 2025 10:25:37 +0200 Subject: [PATCH 431/455] New Crowdin updates (#2671) * New translations en_us.ts (German) * New translations en_us.ts (German) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Norwegian Bokmal) --- src/qt_gui/translations/de_DE.ts | 364 +++++++++++++++---------------- src/qt_gui/translations/nb_NO.ts | 2 +- src/qt_gui/translations/pt_BR.ts | 10 +- src/qt_gui/translations/tr_TR.ts | 40 ++-- 4 files changed, 208 insertions(+), 208 deletions(-) diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index d366d1116..7f395c1c8 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -38,7 +38,7 @@ Version: - Version: + Version: Size: @@ -50,7 +50,7 @@ Repository: - Repository: + Quellen: Download Cheats @@ -86,11 +86,11 @@ Cheats - Cheats + Cheats Patches - Patches + Patches Error @@ -407,59 +407,59 @@ ControlSettings Configure Controls - Configure Controls + Steuerung einrichten D-Pad - D-Pad + Steuerkreuz Up - Up + Oben Left - Left + Links Right - Right + Rechts Down - Down + Runter Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Linker Stick tote Zone (def:2 max:127) Left Deadzone - Left Deadzone + Linke Deadzone Left Stick - Left Stick + Linker Analogstick Config Selection - Config Selection + Konfigurationsauswahl Common Config - Common Config + Standard Konfiguration Use per-game configs - Use per-game configs + Benutze Per-Game Einstellungen L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT Back @@ -467,59 +467,59 @@ R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons - Face Buttons + Aktionstasten Triangle / Y - Triangle / Y + Dreieck / Y Square / X - Square / X + Quadrat / X Circle / B - Circle / B + Kreis / B Cross / A - Cross / A + Kreuz / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Rechter Stick tote Zone (def:2, max:127) Right Deadzone - Right Deadzone + Rechte tote Zone Right Stick - Right Stick + Rechter Analogstick Color Adjustment - Color Adjustment + Farbanpassung R: @@ -535,46 +535,46 @@ Override Lightbar Color - Override Lightbar Color + Farbe der Leuchtleiste überschreiben Override Color - Override Color + Farbe überschreiben Unable to Save - Unable to Save + Speichern nicht möglich Cannot bind axis values more than once - Cannot bind axis values more than once + Achsenwerte können nicht mehr als einmal gebunden werden Save - Save + Speichern Apply - Apply + Übernehmen Restore Defaults - Restore Defaults + Werkseinstellungen wiederherstellen Cancel - Cancel + Abbrechen EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Tastatur + Maus und Controller Eingabezuordnungen bearbeiten Use Per-Game configs - Use Per-Game configs + Benutze Per-Game Einstellungen Error @@ -582,19 +582,19 @@ Could not open the file for reading - Could not open the file for reading + Datei konnte nicht zum Lesen geöffnet werden Could not open the file for writing - Could not open the file for writing + Datei konnte nicht zum Schreiben geöffnet werden Save Changes - Save Changes + Änderungen Speichern Do you want to save changes? - Do you want to save changes? + Sollen die Änderungen gespeichert werden? Help @@ -602,15 +602,15 @@ Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Möchten Sie Ihre eigene Standardkonfiguration auf die ursprüngliche Standardkonfiguration zurücksetzen? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Möchten Sie diese Konfiguration auf Ihre eigene Standardkonfiguration zurücksetzen? Reset to Default - Reset to Default + Auf Standard zurücksetzen @@ -655,7 +655,7 @@ Directory to install DLC - Directory to install DLC + Verzeichnis zum Installieren von DLC @@ -666,7 +666,7 @@ Name - Name + Name Serial @@ -678,11 +678,11 @@ Region - Region + Region Firmware - Firmware + Firmware Size @@ -690,7 +690,7 @@ Version - Version + Version Path @@ -706,15 +706,15 @@ h - h + h m - m + m s - s + s Compatibility is untested @@ -753,23 +753,23 @@ GameListUtils B - B + B KB - KB + KB MB - MB + MB GB - GB + GB TB - TB + TB @@ -780,7 +780,7 @@ Cheats / Patches - Cheats / Patches + Cheats / Patches SFO Viewer @@ -848,7 +848,7 @@ Delete Trophy - Delete Trophy + Trophäe löschen Compatibility... @@ -904,7 +904,7 @@ DLC - DLC + DLC Delete %1 @@ -924,27 +924,27 @@ This game has no update folder to open! - This game has no update folder to open! + Dieses Spiel hat keinen Update-Ordner zum öffnen! No log file found for this game! - No log file found for this game! + Keine Protokolldatei für dieses Spiel gefunden! Failed to convert icon. - Failed to convert icon. + Fehler beim Konvertieren des Symbols. This game has no save data to delete! - This game has no save data to delete! + Dieses Spiel hat keine Speicherdaten zum Löschen! This game has no saved trophies to delete! - This game has no saved trophies to delete! + Dieses Spiel hat keine gespeicherten Trophäen zum Löschen! Save Data - Save Data + Gespeicherte Daten Trophy @@ -952,7 +952,7 @@ SFO Viewer for - SFO Viewer for + SFO-Betrachter für @@ -963,19 +963,19 @@ FAQ - FAQ + Häufig gestellte Fragen Syntax - Syntax + Syntax Special Bindings - Special Bindings + Spezielle Zuordnungen Keybindings - Keybindings + Tastenbelegung @@ -990,78 +990,78 @@ Install All Queued to Selected Folder - Install All Queued to Selected Folder + Installieren Sie alles aus der Warteschlange in den ausgewählten Ordner Delete PKG File on Install - Delete PKG File on Install + PKG-Datei beim Installieren löschen KBMSettings Configure Controls - Configure Controls + Steuerung konfigurieren D-Pad - D-Pad + Steuerkreuz Up - Up + Oben unmapped - unmapped + nicht zugeordnet Left - Left + Links Right - Right + Rechts Down - Down + Runter Left Analog Halfmode - Left Analog Halfmode + Linker Analog-Halbmodus hold to move left stick at half-speed - hold to move left stick at half-speed + Halten um den linken Analogstick mit Halbgeschwindigkeit zu bewegen Left Stick - Left Stick + Linker Analogstick Config Selection - Config Selection + Konfigurationsauswahl Common Config - Common Config + Allgemeine Konfiguration Use per-game configs - Use per-game configs + Benutze Per-Game Einstellungen L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Textbearbeiter Help @@ -1069,143 +1069,143 @@ R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Touchpad-Klick Mouse to Joystick - Mouse to Joystick + Maus zu Joystick *press F7 ingame to activate - *press F7 ingame to activate + *Zum Aktivieren F7 ingame drücken R3 - R3 + R3 Options - Options + Options Mouse Movement Parameters - Mouse Movement Parameters + Mausbewegungsparameter note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + Hinweis: Klicken Sie auf Hilfe-Button/Special Tastaturbelegungen für weitere Informationen Face Buttons - Face Buttons + Aktionstasten Triangle - Triangle + Dreieck Square - Square + Quadrat Circle - Circle + Kreis Cross - Cross + Kreuz Right Analog Halfmode - Right Analog Halfmode + Rechter Analog-Halbmodus hold to move right stick at half-speed - hold to move right stick at half-speed + Halten um den rechten Analogstick mit Halbgeschwindigkeit zu bewegen Right Stick - Right Stick + Rechter Analogstick Speed Offset (def 0.125): - Speed Offset (def 0.125): + Geschwindigkeitsversatz (Def 0.125): Copy from Common Config - Copy from Common Config + Von allgemeiner Konfiguration kopieren Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Tote Zone Versatz (Def 0.50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Geschwindigkeit Multiplikator (def 1.0): Common Config Selected - Common Config Selected + Allgemeine Konfiguration ausgewählt This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Diese Schaltfläche kopiert Zuordnungen aus der allgemeinen Konfiguration in das aktuell ausgewählte Profil, und kann nicht verwendet werden, wenn das aktuell ausgewählte Profil die allgemeine Konfiguration ist. Copy values from Common Config - Copy values from Common Config + Werte von allgemeiner Konfiguration kopieren Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Möchten Sie die vorhandenen Zuordnungen mit den Zuordnungen der allgemeinen Konfigurationen überschreiben? Unable to Save - Unable to Save + Speichern nicht möglich Cannot bind any unique input more than once - Cannot bind any unique input more than once + Kann keine eindeutige Eingabe mehr als einmal zuordnen Press a key - Press a key + Drücken Sie eine Taste Cannot set mapping - Cannot set mapping + Kann Zuordnung nicht festlegen Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Mausrad kann nicht zu Analogstick Ausgabe zugeordnet werden Save - Save + Speichern Apply - Apply + Übernehmen Restore Defaults - Restore Defaults + Werkseinstellungen wiederherstellen Cancel - Cancel + Abbrechen @@ -1484,27 +1484,27 @@ Run Game - Run Game + Spiel ausführen Eboot.bin file not found - Eboot.bin file not found + Eboot.bin Datei nicht gefunden PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + PKG-Datei (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG ist ein Patch oder DLC, bitte installieren Sie zuerst das Spiel! Game is already running! - Game is already running! + Spiel läuft bereits! shadPS4 - shadPS4 + shadPS4 @@ -1527,7 +1527,7 @@ Installed - Installed + Installiert Size @@ -1543,11 +1543,11 @@ App Ver - App Ver + App Ver FW - FW + FW Region @@ -1555,7 +1555,7 @@ Flags - Flags + Markierungen Path @@ -1571,7 +1571,7 @@ Package - Package + Paket @@ -1598,7 +1598,7 @@ Emulator - Emulator + Emulator Enable Separate Update Folder @@ -1634,11 +1634,11 @@ Open the custom trophy images/sounds folder - Open the custom trophy images/sounds folder + Öffne den benutzerdefinierten Ordner für Trophäenbilder/Sounds Logger - Logger + Protokollführer Log Type @@ -1658,7 +1658,7 @@ Cursor - Cursor + Mauszeiger Hide Cursor @@ -1670,11 +1670,11 @@ s - s + s Controller - Controller + Kontroller Back Button Behavior @@ -1714,7 +1714,7 @@ Enable HDR - Enable HDR + HDR aktivieren Paths @@ -1734,7 +1734,7 @@ Debug - Debug + Debug Enable Debug Dumping @@ -1802,19 +1802,19 @@ Disable Trophy Notification - Disable Trophy Notification + Trophäen-Benachrichtigung deaktivieren Background Image - Background Image + Hintergrundbild Show Background Image - Show Background Image + Hintergrundbild anzeigen Opacity - Opacity + Transparenz Play title music @@ -1902,7 +1902,7 @@ Background Image:\nControl the opacity of the game background image. - Background Image:\nControl the opacity of the game background image. + Hintergrundbild:\nSteuere die Deckkraft des Spiel-Hintergrundbilds. Play Title Music:\nIf a game supports it, enable playing special music when selecting the game in the GUI. @@ -1986,7 +1986,7 @@ Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. - Enable HDR:\nEnables HDR in games that support it.\nYour monitor must have support for the BT2020 PQ color space and the RGB10A2 swapchain format. + HDR:\nAktiviert HDR in Spielen, die es unterstützen.\nIhr Monitor muss Unterstützung für den BT2020 PQ Farbraum und das RGB10A2 Swapchain Format haben. Game Folders:\nThe list of folders to check for installed games. @@ -2038,23 +2038,23 @@ Save Data Path:\nThe folder where game save data will be saved. - Save Data Path:\nThe folder where game save data will be saved. + Datenpfad speichern:\nDer Ordner, in dem Spieldaten gespeichert werden. Browse:\nBrowse for a folder to set as the save data path. - Browse:\nBrowse for a folder to set as the save data path. + Durchsuchen:\nDurchsuchen eines Ordners, um den Speicherdatenpfad festzulegen. Release - Release + Veröffentlichung Nightly - Nightly + Nightly Set the volume of the background music. - Set the volume of the background music. + Legen Sie die Lautstärke der Hintergrundmusik fest. Enable Motion Controls @@ -2070,11 +2070,11 @@ async - async + asynchron sync - sync + syncron Auto Select @@ -2086,7 +2086,7 @@ Directory to save data - Directory to save data + Verzeichnis um Daten zu speichern Video @@ -2094,43 +2094,43 @@ Display Mode - Display Mode + Anzeigemodus Windowed - Windowed + Fenster Fullscreen - Fullscreen + Vollbild Fullscreen (Borderless) - Fullscreen (Borderless) + Vollbild (randlos) Window Size - Window Size + Fenstergröße W: - W: + W: H: - H: + H: Separate Log Files - Separate Log Files + Separate Protokolldateien Separate Log Files:\nWrites a separate logfile for each game. - Separate Log Files:\nWrites a separate logfile for each game. + Separate Protokolldateien:\nSchreibt für jedes Spiel eine separate Logdatei. Trophy Notification Position - Trophy Notification Position + Trophäen-Benachrichtigungsposition Left @@ -2142,43 +2142,43 @@ Top - Top + Zuoberst Bottom - Bottom + Zuunterst Notification Duration - Notification Duration + Benachrichtigungsdauer Portable User Folder - Portable User Folder + Portable Benutzerordner Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Erstellen eines portablen Benutzerordners aus dem allgemeinen Benutzer Ordner Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portablen Benutzerordner:\nspeichert ShadPS4 Einstellungen und Daten, die nur auf den ShadPS4 Build im aktuellen Ordner angewendet werden. Starten Sie die App nach dem Erstellen des tragbaren Benutzerordners neu, um sie zu verwenden. Cannot create portable user folder - Cannot create portable user folder + Kann keinen portablen Benutzerordner erstellen %1 already exists - %1 already exists + %1 existiert bereits Portable user folder created - Portable user folder created + Portablen Benutzerordner erstellt %1 successfully created. - %1 successfully created. + %1 erfolgreich erstellt. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index f627ff640..b257b548b 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1602,7 +1602,7 @@ Enable Separate Update Folder - Bruk seperat oppdateringsmappe + Bruk separat oppdateringsmappe Default tab when opening settings diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 794215401..e37a3fe96 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -730,7 +730,7 @@ Game displays an image but does not go past the menu - Jogo exibe imagem mas não passa do menu + O jogo exibe imagem mas não passa do menu Game has game-breaking glitches or unplayable performance @@ -1284,11 +1284,11 @@ List View - Visualizar em Lista + Visualização em Lista Grid View - Visualizar em Grade + Visualização em Grade Elf Viewer @@ -2030,11 +2030,11 @@ Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Marcadores de Depuração de Host:\nInsere informações vindo do emulador como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, ative os Diagnósticos de Falha.\nÚtil para programas como o RenderDoc. + Marcadores de Depuração do Host:\nInsere informações vindo do emulador como marcadores para comandos AMDGPU específicos em torno de comandos Vulkan, além de fornecer nomes de depuração aos recursos.\nSe isso estiver habilitado, ative os Diagnósticos de Falhas.\nÚtil para programas como o RenderDoc. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Marcadores de Depuração de Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, ative os Diagnósticos de Falha.\nÚtil para programas como o RenderDoc. + Marcadores de Depuração do Convidado:\nInsere quaisquer marcadores de depuração que o próprio jogo adicionou ao buffer de comando.\nSe isso estiver habilitado, ative os Diagnósticos de Falhas.\nÚtil para programas como o RenderDoc. Save Data Path:\nThe folder where game save data will be saved. diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index fd4669369..394704274 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -26,11 +26,11 @@ Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n - Cheats/Patches deneysel niteliktedir.\nDikkatli kullanın.\n\nCheat'leri ayrı ayrı indirerek, depo seçerek ve indirme düğmesine tıklayarak indirin.\nPatches sekmesinde tüm patch'leri bir kerede indirebilir, hangi patch'leri kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nCheats/Patches'i geliştirmediğimiz için,\nproblemleri cheat yazarına bildirin.\n\nYeni bir cheat mi oluşturduğunuz? Şu adresi ziyaret edin:\n + Hileler/Yamalar deneysel özelliklerdir.\nDikkatli kullanın.\n\nHileleri depo seçerek ve indirme düğmesine tıklayarak ayrı ayrı indirin.\nYamalar sekmesinde tüm yamaları tek seferde indirebilir, hangi yamaları kullanmak istediğinizi seçebilir ve seçiminizi kaydedebilirsiniz.\n\nHileleri ve yamaları biz geliştirmediğimiz için\nsorunlarınızı hile geliştiricisine bildirin.\n\nYeni bir hile oluşturduysanız şu adresi ziyaret edin:\n No Image Available - Görüntü Mevcut Değil + Kaynak Mevcut Değil Serial: @@ -70,7 +70,7 @@ Do you want to delete the selected file?\n%1 - Seçilen dosyayı silmek istiyor musunuz?\n%1 + Seçili dosyayı silmek istiyor musunuz?\n%1 Select Patch File: @@ -122,7 +122,7 @@ Success - Başarı + Başarılı Options saved successfully. @@ -138,11 +138,11 @@ File Exists - Dosya Var + Dosya mevcut File already exists. Do you want to replace it? - Dosya zaten var. Üzerine yazmak ister misiniz? + Dosya zaten mevcut. Var olan dosyayı değiştirmek istiyor musunuz? Failed to save file: @@ -313,7 +313,7 @@ Update - Güncelleme + Güncelle No @@ -551,26 +551,26 @@ Save - Save + Kaydet Apply - Apply + Uygula Restore Defaults - Restore Defaults + Varsayılanlara Sıfırla Cancel - Cancel + İptal EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Klavye + Fare ve Kontrolcü tuş atamalarını düzenle Use Per-Game configs @@ -1141,7 +1141,7 @@ Speed Offset (def 0.125): - Speed Offset (def 0.125): + Hız Sapması (varsayılan 0.125): Copy from Common Config @@ -1149,7 +1149,7 @@ Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Ölü Bölge Sapması (varsayılan 0.50): Speed Multiplier (def 1.0): @@ -1161,7 +1161,7 @@ This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Bu tuş, Ortak Yapılandırma'daki atamaları seçili profile kopyalar ve seçili profil Ortak Yapılandırma ise kullanılamaz. Copy values from Common Config @@ -1193,19 +1193,19 @@ Save - Save + Kaydet Apply - Apply + Uygula Restore Defaults - Restore Defaults + Varsayılanlara Sıfırla Cancel - Cancel + İptal @@ -2030,7 +2030,7 @@ Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. - Host Debug Markers:\nInserts emulator-side information like markers for specific AMDGPU commands around Vulkan commands, as well as giving resources debug names.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. + Ana Bilgisayar Hata Ayıklama Göstergeleri:\nVulkan komutlarının etrafına belirli AMDGPU komutları için göstergeler gibi emülatör tarafı bilgileri ekler ve kaynaklara hata ayıklama adları verir.\nBunu etkinleştirdiyseniz, Çökme Tanılamaları'nı etkinleştirmelisiniz.\nRenderDoc gibi programlar için faydalıdır. Guest Debug Markers:\nInserts any debug markers the game itself has added to the command buffer.\nIf you have this enabled, you should enable Crash Diagnostics.\nUseful for programs like RenderDoc. From 16a68d78eb71c8b3cfa697ba9989d27f3c4ef961 Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Mon, 24 Mar 2025 05:25:51 -0300 Subject: [PATCH 432/455] Trophy Viewer - Select Game (#2678) * Trophy Viewer - Select Game * TR - Button in Utils +icon TR - Button in Utils +icon I also made a small correction to the game folder list, where the checkboxes were being filled in incorrectly. --- REUSE.toml | 1 + src/common/config.cpp | 6 ++- src/images/trophy_icon.png | Bin 0 -> 16958 bytes src/qt_gui/gui_context_menus.h | 28 +++++++++++- src/qt_gui/main_window.cpp | 55 ++++++++++++++++++++++ src/qt_gui/main_window_ui.h | 8 ++++ src/qt_gui/translations/en_US.ts | 12 +++++ src/qt_gui/trophy_viewer.cpp | 76 +++++++++++++++++++++++++++---- src/qt_gui/trophy_viewer.h | 20 +++++++- src/shadps4.qrc | 1 + 10 files changed, 193 insertions(+), 14 deletions(-) create mode 100644 src/images/trophy_icon.png diff --git a/REUSE.toml b/REUSE.toml index d9b307d39..793990bd8 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -30,6 +30,7 @@ path = [ "src/images/dump_icon.png", "src/images/exit_icon.png", "src/images/file_icon.png", + "src/images/trophy_icon.png", "src/images/flag_china.png", "src/images/flag_eu.png", "src/images/flag_jp.png", diff --git a/src/common/config.cpp b/src/common/config.cpp index fd6538f85..e0a348fbe 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -645,7 +645,11 @@ const std::vector getGameInstallDirs() { } const std::vector getGameInstallDirsEnabled() { - return install_dirs_enabled; + std::vector enabled_dirs; + for (const auto& dir : settings_install_dirs) { + enabled_dirs.push_back(dir.enabled); + } + return enabled_dirs; } std::filesystem::path getAddonInstallDir() { diff --git a/src/images/trophy_icon.png b/src/images/trophy_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..559e7dbb2c1e2d4b5c5cb3a066a08209b7054839 GIT binary patch literal 16958 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 Xb9M+i^O$<{P6LDsqXhfsB allTrophyGames; + for (const auto& game : m_games) { + TrophyGameInfo gameInfo; + gameInfo.name = QString::fromStdString(game.name); + Common::FS::PathToQString(gameInfo.trophyPath, game.serial); + Common::FS::PathToQString(gameInfo.gameTrpPath, game.path); + + auto update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath); + update_path += "-UPDATE"; + if (std::filesystem::exists(update_path)) { + Common::FS::PathToQString(gameInfo.gameTrpPath, update_path); + } else { + update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath); + update_path += "-patch"; + if (std::filesystem::exists(update_path)) { + Common::FS::PathToQString(gameInfo.gameTrpPath, update_path); + } + } + + allTrophyGames.append(gameInfo); + } + + QString gameName = QString::fromStdString(m_games[itemID].name); + TrophyViewer* trophyViewer = + new TrophyViewer(trophyPath, gameTrpPath, gameName, allTrophyGames); trophyViewer->show(); connect(widget->parent(), &QWidget::destroyed, trophyViewer, [trophyViewer]() { trophyViewer->deleteLater(); }); diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 68135048e..27551e997 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -593,6 +593,60 @@ void MainWindow::CreateConnects() { pkgViewer->show(); }); + // Trophy Viewer + connect(ui->trophyViewerAct, &QAction::triggered, this, [this]() { + if (m_game_info->m_games.empty()) { + QMessageBox::information( + this, tr("Trophy Viewer"), + tr("No games found. Please add your games to your library first.")); + return; + } + + const auto& firstGame = m_game_info->m_games[0]; + QString trophyPath, gameTrpPath; + Common::FS::PathToQString(trophyPath, firstGame.serial); + Common::FS::PathToQString(gameTrpPath, firstGame.path); + + auto game_update_path = Common::FS::PathFromQString(gameTrpPath); + game_update_path += "-UPDATE"; + if (std::filesystem::exists(game_update_path)) { + Common::FS::PathToQString(gameTrpPath, game_update_path); + } else { + game_update_path = Common::FS::PathFromQString(gameTrpPath); + game_update_path += "-patch"; + if (std::filesystem::exists(game_update_path)) { + Common::FS::PathToQString(gameTrpPath, game_update_path); + } + } + + QVector allTrophyGames; + for (const auto& game : m_game_info->m_games) { + TrophyGameInfo gameInfo; + gameInfo.name = QString::fromStdString(game.name); + Common::FS::PathToQString(gameInfo.trophyPath, game.serial); + Common::FS::PathToQString(gameInfo.gameTrpPath, game.path); + + auto update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath); + update_path += "-UPDATE"; + if (std::filesystem::exists(update_path)) { + Common::FS::PathToQString(gameInfo.gameTrpPath, update_path); + } else { + update_path = Common::FS::PathFromQString(gameInfo.gameTrpPath); + update_path += "-patch"; + if (std::filesystem::exists(update_path)) { + Common::FS::PathToQString(gameInfo.gameTrpPath, update_path); + } + } + + allTrophyGames.append(gameInfo); + } + + QString gameName = QString::fromStdString(firstGame.name); + TrophyViewer* trophyViewer = + new TrophyViewer(trophyPath, gameTrpPath, gameName, allTrophyGames); + trophyViewer->show(); + }); + // Themes connect(ui->setThemeDark, &QAction::triggered, &m_window_themes, [this]() { m_window_themes.SetWindowTheme(Theme::Dark, ui->mw_searchbar); @@ -1169,6 +1223,7 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite)); ui->menuGame_List_Mode->setIcon(RecolorIcon(ui->menuGame_List_Mode->icon(), isWhite)); ui->pkgViewerAct->setIcon(RecolorIcon(ui->pkgViewerAct->icon(), isWhite)); + ui->trophyViewerAct->setIcon(RecolorIcon(ui->trophyViewerAct->icon(), isWhite)); ui->configureAct->setIcon(RecolorIcon(ui->configureAct->icon(), isWhite)); ui->addElfFolderAct->setIcon(RecolorIcon(ui->addElfFolderAct->icon(), isWhite)); } diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 3ebfcee9e..246c2afd6 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -27,6 +27,7 @@ public: QAction* downloadCheatsPatchesAct; QAction* dumpGameListAct; QAction* pkgViewerAct; + QAction* trophyViewerAct; #ifdef ENABLE_UPDATER QAction* updaterAct; #endif @@ -139,6 +140,10 @@ public: pkgViewerAct = new QAction(MainWindow); pkgViewerAct->setObjectName("pkgViewer"); pkgViewerAct->setIcon(QIcon(":images/file_icon.png")); + trophyViewerAct = new QAction(MainWindow); + trophyViewerAct->setObjectName("trophyViewer"); + trophyViewerAct->setIcon(QIcon(":images/trophy_icon.png")); + #ifdef ENABLE_UPDATER updaterAct = new QAction(MainWindow); updaterAct->setObjectName("updaterAct"); @@ -321,6 +326,7 @@ public: menuUtils->addAction(downloadCheatsPatchesAct); menuUtils->addAction(dumpGameListAct); menuUtils->addAction(pkgViewerAct); + menuUtils->addAction(trophyViewerAct); #ifdef ENABLE_UPDATER menuHelp->addAction(updaterAct); #endif @@ -379,6 +385,8 @@ public: dumpGameListAct->setText( QCoreApplication::translate("MainWindow", "Dump Game List", nullptr)); pkgViewerAct->setText(QCoreApplication::translate("MainWindow", "PKG Viewer", nullptr)); + trophyViewerAct->setText( + QCoreApplication::translate("MainWindow", "Trophy Viewer", nullptr)); mw_searchbar->setPlaceholderText( QCoreApplication::translate("MainWindow", "Search...", nullptr)); menuFile->setTitle(QCoreApplication::translate("MainWindow", "File", nullptr)); diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 9c9d56076..20cba0378 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + + Progress diff --git a/src/qt_gui/trophy_viewer.cpp b/src/qt_gui/trophy_viewer.cpp index bfa47e3cc..bed487605 100644 --- a/src/qt_gui/trophy_viewer.cpp +++ b/src/qt_gui/trophy_viewer.cpp @@ -104,8 +104,10 @@ void TrophyViewer::updateTableFilters() { } } -TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindow() { - this->setWindowTitle(tr("Trophy Viewer")); +TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath, QString gameName, + const QVector& allTrophyGames) + : QMainWindow(), allTrophyGames_(allTrophyGames), currentGameName_(gameName) { + this->setWindowTitle(tr("Trophy Viewer") + " - " + currentGameName_); this->setAttribute(Qt::WA_DeleteOnClose); tabWidget = new QTabWidget(this); @@ -127,11 +129,40 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo << "PID"; PopulateTrophyWidget(trophyPath); - QDockWidget* trophyInfoDock = new QDockWidget("", this); + trophyInfoDock = new QDockWidget("", this); QWidget* dockWidget = new QWidget(trophyInfoDock); QVBoxLayout* dockLayout = new QVBoxLayout(dockWidget); dockLayout->setAlignment(Qt::AlignTop); + // ComboBox for game selection + if (!allTrophyGames_.isEmpty()) { + QLabel* gameSelectionLabel = new QLabel(tr("Select Game:"), dockWidget); + dockLayout->addWidget(gameSelectionLabel); + + gameSelectionComboBox = new QComboBox(dockWidget); + for (const auto& game : allTrophyGames_) { + gameSelectionComboBox->addItem(game.name); + } + + // Select current game in ComboBox + if (!currentGameName_.isEmpty()) { + int index = gameSelectionComboBox->findText(currentGameName_); + if (index >= 0) { + gameSelectionComboBox->setCurrentIndex(index); + } + } + + dockLayout->addWidget(gameSelectionComboBox); + + connect(gameSelectionComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, + &TrophyViewer::onGameSelectionChanged); + + QFrame* line = new QFrame(dockWidget); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + dockLayout->addWidget(line); + } + trophyInfoLabel = new QLabel(tr("Progress") + ": 0% (0/0)", dockWidget); trophyInfoLabel->setStyleSheet( "font-weight: bold; font-size: 16px; color: white; background: #333; padding: 5px;"); @@ -162,7 +193,7 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo expandButton->setGeometry(80, 0, 27, 27); expandButton->hide(); - connect(expandButton, &QPushButton::clicked, this, [this, trophyInfoDock] { + connect(expandButton, &QPushButton::clicked, this, [this] { trophyInfoDock->setVisible(true); expandButton->hide(); }); @@ -184,13 +215,13 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo updateTrophyInfo(); updateTableFilters(); - connect(trophyInfoDock, &QDockWidget::topLevelChanged, this, [this, trophyInfoDock] { + connect(trophyInfoDock, &QDockWidget::topLevelChanged, this, [this] { if (!trophyInfoDock->isVisible()) { expandButton->show(); } }); - connect(trophyInfoDock, &QDockWidget::visibilityChanged, this, [this, trophyInfoDock] { + connect(trophyInfoDock, &QDockWidget::visibilityChanged, this, [this] { if (!trophyInfoDock->isVisible()) { expandButton->show(); } else { @@ -199,6 +230,29 @@ TrophyViewer::TrophyViewer(QString trophyPath, QString gameTrpPath) : QMainWindo }); } +void TrophyViewer::onGameSelectionChanged(int index) { + if (index < 0 || index >= allTrophyGames_.size()) { + return; + } + + while (tabWidget->count() > 0) { + QWidget* widget = tabWidget->widget(0); + tabWidget->removeTab(0); + delete widget; + } + + const TrophyGameInfo& selectedGame = allTrophyGames_[index]; + currentGameName_ = selectedGame.name; + gameTrpPath_ = selectedGame.gameTrpPath; + + this->setWindowTitle(tr("Trophy Viewer") + " - " + currentGameName_); + + PopulateTrophyWidget(selectedGame.trophyPath); + + updateTrophyInfo(); + updateTableFilters(); +} + void TrophyViewer::onDockClosed() { if (!trophyInfoDock->isVisible()) { reopenButton->setVisible(true); @@ -389,13 +443,15 @@ void TrophyViewer::PopulateTrophyWidget(QString title) { tabWidget->addTab(tableWidget, tabName.insert(6, " ").replace(0, 1, tabName.at(0).toUpper())); - this->resize(width + 400, 720); - QSize mainWindowSize = QApplication::activeWindow()->size(); - this->resize(mainWindowSize.width() * 0.8, mainWindowSize.height() * 0.8); + if (!this->isMaximized()) { + this->resize(width + 400, 720); + QSize mainWindowSize = QApplication::activeWindow()->size(); + this->resize(mainWindowSize.width() * 0.8, mainWindowSize.height() * 0.8); + } this->show(); tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed); - tableWidget->setColumnWidth(3, 650); + tableWidget->setColumnWidth(3, 500); } this->setCentralWidget(tabWidget); } diff --git a/src/qt_gui/trophy_viewer.h b/src/qt_gui/trophy_viewer.h index 75fb500e7..c63171774 100644 --- a/src/qt_gui/trophy_viewer.h +++ b/src/qt_gui/trophy_viewer.h @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -12,26 +13,38 @@ #include #include #include +#include #include #include #include #include +#include #include #include "common/types.h" #include "core/file_format/trp.h" +struct TrophyGameInfo { + QString name; + QString trophyPath; + QString gameTrpPath; +}; + class TrophyViewer : public QMainWindow { Q_OBJECT public: - explicit TrophyViewer(QString trophyPath, QString gameTrpPath); + explicit TrophyViewer( + QString trophyPath, QString gameTrpPath, QString gameName = "", + const QVector& allTrophyGames = QVector()); void updateTrophyInfo(); - void updateTableFilters(); void onDockClosed(); void reopenLeftDock(); +private slots: + void onGameSelectionChanged(int index); + private: void PopulateTrophyWidget(QString title); void SetTableItem(QTableWidget* parent, int row, int column, QString str); @@ -39,14 +52,17 @@ private: QTabWidget* tabWidget = nullptr; QStringList headers; QString gameTrpPath_; + QString currentGameName_; TRP trp; QLabel* trophyInfoLabel; QCheckBox* showEarnedCheck; QCheckBox* showNotEarnedCheck; QCheckBox* showHiddenCheck; + QComboBox* gameSelectionComboBox; QPushButton* expandButton; QDockWidget* trophyInfoDock; QPushButton* reopenButton; + QVector allTrophyGames_; std::string GetTrpType(const QChar trp_) { switch (trp_.toLatin1()) { diff --git a/src/shadps4.qrc b/src/shadps4.qrc index a1ff680ed..340756f5c 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -8,6 +8,7 @@ images/stop_icon.png images/utils_icon.png images/file_icon.png + images/trophy_icon.png images/folder_icon.png images/themes_icon.png images/iconsize_icon.png From 1908d26093fcdf409b74eef83cffbb812d447a3f Mon Sep 17 00:00:00 2001 From: mailwl Date: Mon, 24 Mar 2025 16:51:36 +0300 Subject: [PATCH 433/455] lseek: let the host OS set lseek errors (#2370) * Fix lseek(fd, -1, SEEK_SET) for XNA * be sure, if seek really return error * refactoring * let host os set lseek errors --- src/common/io_file.cpp | 14 -------------- src/core/libraries/kernel/file_system.cpp | 1 + 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/common/io_file.cpp b/src/common/io_file.cpp index 067010a26..3db78a145 100644 --- a/src/common/io_file.cpp +++ b/src/common/io_file.cpp @@ -377,20 +377,6 @@ bool IOFile::Seek(s64 offset, SeekOrigin origin) const { return false; } - if (False(file_access_mode & (FileAccessMode::Write | FileAccessMode::Append))) { - u64 size = GetSize(); - if (origin == SeekOrigin::CurrentPosition && Tell() + offset > size) { - LOG_ERROR(Common_Filesystem, "Seeking past the end of the file"); - return false; - } else if (origin == SeekOrigin::SetOrigin && (u64)offset > size) { - LOG_ERROR(Common_Filesystem, "Seeking past the end of the file"); - return false; - } else if (origin == SeekOrigin::End && offset > 0) { - LOG_ERROR(Common_Filesystem, "Seeking past the end of the file"); - return false; - } - } - errno = 0; const auto seek_result = fseeko(file, offset, ToSeekOrigin(origin)) == 0; diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 0150c11f5..ef3c2fe70 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -289,6 +289,7 @@ size_t PS4_SYSV_ABI _writev(int fd, const SceKernelIovec* iov, int iovcn) { } s64 PS4_SYSV_ABI sceKernelLseek(int d, s64 offset, int whence) { + LOG_TRACE(Kernel_Fs, "called: offset {} whence {}", offset, whence); auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(d); if (file == nullptr) { From 5c72030fb8cc5227b877e2c84a633eea76ff25aa Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 25 Mar 2025 23:54:32 +0200 Subject: [PATCH 434/455] HLE discmap (#2686) * HLE discmap * improved parameters naming * fixed typo --- src/core/libraries/disc_map/disc_map.cpp | 22 +++++++++++----------- src/core/libraries/disc_map/disc_map.h | 10 ++++++---- src/core/libraries/libs.cpp | 1 + src/emulator.cpp | 3 +-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/core/libraries/disc_map/disc_map.cpp b/src/core/libraries/disc_map/disc_map.cpp index bb566a149..e8b40e624 100644 --- a/src/core/libraries/disc_map/disc_map.cpp +++ b/src/core/libraries/disc_map/disc_map.cpp @@ -9,29 +9,29 @@ namespace Libraries::DiscMap { -int PS4_SYSV_ABI sceDiscMapGetPackageSize() { - LOG_WARNING(Lib_DiscMap, "(DUMMY) called"); +int PS4_SYSV_ABI sceDiscMapGetPackageSize(s64 fflags, int* ret1, int* ret2) { return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } -int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD() { - LOG_WARNING(Lib_DiscMap, "(DUMMY) called"); +int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD(char* path, s64 offset, s64 nbytes, int* ret) { return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } -int PS4_SYSV_ABI Func_7C980FFB0AA27E7A() { - LOG_ERROR(Lib_DiscMap, "(STUBBED) called"); +int PS4_SYSV_ABI Func_7C980FFB0AA27E7A(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2) { + *flags = 0; + *ret1 = 0; + *ret2 = 0; return ORBIS_OK; } -int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9() { - LOG_ERROR(Lib_DiscMap, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2) { + return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } int PS4_SYSV_ABI Func_E7EBCE96E92F91F8() { - LOG_ERROR(Lib_DiscMap, "(STUBBED) called"); - return ORBIS_OK; + return ORBIS_DISC_MAP_ERROR_NO_BITMAP_INFO; } void RegisterlibSceDiscMap(Core::Loader::SymbolsResolver* sym) { diff --git a/src/core/libraries/disc_map/disc_map.h b/src/core/libraries/disc_map/disc_map.h index 08abee632..dc8b875ac 100644 --- a/src/core/libraries/disc_map/disc_map.h +++ b/src/core/libraries/disc_map/disc_map.h @@ -10,10 +10,12 @@ class SymbolsResolver; } namespace Libraries::DiscMap { -int PS4_SYSV_ABI sceDiscMapGetPackageSize(); -int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD(); -int PS4_SYSV_ABI Func_7C980FFB0AA27E7A(); -int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9(); +int PS4_SYSV_ABI sceDiscMapGetPackageSize(s64 fflags, int* ret1, int* ret2); +int PS4_SYSV_ABI sceDiscMapIsRequestOnHDD(char* path, s64 offset, s64 nbytes, int* ret); +int PS4_SYSV_ABI Func_7C980FFB0AA27E7A(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2); +int PS4_SYSV_ABI Func_8A828CAEE7EDD5E9(char* path, s64 offset, s64 nbytes, int* flags, int* ret1, + int* ret2); int PS4_SYSV_ABI Func_E7EBCE96E92F91F8(); void RegisterlibSceDiscMap(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/libraries/libs.cpp b/src/core/libraries/libs.cpp index 074cf524e..cd0fe650b 100644 --- a/src/core/libraries/libs.cpp +++ b/src/core/libraries/libs.cpp @@ -115,6 +115,7 @@ void InitHLELibs(Core::Loader::SymbolsResolver* sym) { Libraries::NpParty::RegisterlibSceNpParty(sym); Libraries::Zlib::RegisterlibSceZlib(sym); Libraries::Hmd::RegisterlibSceHmd(sym); + Libraries::DiscMap::RegisterlibSceDiscMap(sym); } } // namespace Libraries diff --git a/src/emulator.cpp b/src/emulator.cpp index 4ec62995b..5f94f008a 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -289,13 +289,12 @@ void Emulator::Run(const std::filesystem::path& file, const std::vector ModulesToLoad{ + constexpr std::array ModulesToLoad{ {{"libSceNgs2.sprx", &Libraries::Ngs2::RegisterlibSceNgs2}, {"libSceUlt.sprx", nullptr}, {"libSceJson.sprx", nullptr}, {"libSceJson2.sprx", nullptr}, {"libSceLibcInternal.sprx", &Libraries::LibcInternal::RegisterlibSceLibcInternal}, - {"libSceDiscMap.sprx", &Libraries::DiscMap::RegisterlibSceDiscMap}, {"libSceRtc.sprx", &Libraries::Rtc::RegisterlibSceRtc}, {"libSceCesCs.sprx", nullptr}, {"libSceFont.sprx", nullptr}, From a1ec8b0a88f8a14fdecc0de83b8e20cbbc9b2e32 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:01:21 +0100 Subject: [PATCH 435/455] Handle compute packets that are split between the ends of two command buffers (#2476) * Squashed initial implementation * Logging for checking if buffers are memory contiguous * Add check to see if first instruction is valid in the next buffer to avoid false positives * Oof * Replace old code with IndecisiveTurtle's new, better implementation * Add `unlikely` keyword to the split packet handling branches Co-authored-by: TheTurtle <47210458+raphaelthegreat@users.noreply.github.com> --------- Co-authored-by: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> --- src/video_core/amdgpu/liverpool.cpp | 55 +++++++++++++++++++---------- src/video_core/amdgpu/liverpool.h | 5 ++- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 246c8c947..bfe99c754 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -726,20 +726,39 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span -Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { +Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vqid) { FIBER_ENTER(acb_task_name[vqid]); - const auto& queue = asc_queues[{vqid}]; + auto& queue = asc_queues[{vqid}]; - auto base_addr = reinterpret_cast(acb.data()); - while (!acb.empty()) { - const auto* header = reinterpret_cast(acb.data()); - const u32 type = header->type; - if (type != 3) { - // No other types of packets were spotted so far - UNREACHABLE_MSG("Invalid PM4 type {}", type); + auto base_addr = reinterpret_cast(acb); + while (acb_dwords > 0) { + auto* header = reinterpret_cast(acb); + u32 next_dw_off = header->type3.NumWords() + 1; + + // If we have a buffered packet, use it. + if (queue.tmp_dwords > 0) [[unlikely]] { + header = reinterpret_cast(queue.tmp_packet.data()); + next_dw_off = header->type3.NumWords() + 1 - queue.tmp_dwords; + std::memcpy(queue.tmp_packet.data() + queue.tmp_dwords, acb, next_dw_off * sizeof(u32)); + queue.tmp_dwords = 0; + } + + // If the packet is split across ring boundary, buffer until next submission + if (next_dw_off > acb_dwords) [[unlikely]] { + std::memcpy(queue.tmp_packet.data(), acb, acb_dwords * sizeof(u32)); + queue.tmp_dwords = acb_dwords; + if constexpr (!is_indirect) { + *queue.read_addr += acb_dwords; + *queue.read_addr %= queue.ring_size_dw; + } + break; + } + + if (header->type != 3) { + // No other types of packets were spotted so far + UNREACHABLE_MSG("Invalid PM4 type {}", header->type.Value()); } - const u32 count = header->type3.NumWords(); const PM4ItOpcode opcode = header->type3.opcode; const auto* it_body = reinterpret_cast(header) + 1; switch (opcode) { @@ -749,8 +768,8 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } case PM4ItOpcode::IndirectBuffer: { const auto* indirect_buffer = reinterpret_cast(header); - auto task = ProcessCompute( - {indirect_buffer->Address(), indirect_buffer->ib_size}, vqid); + auto task = ProcessCompute(indirect_buffer->Address(), + indirect_buffer->ib_size, vqid); RESUME_ASC(task, vqid); while (!task.handle.done()) { @@ -800,7 +819,7 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } case PM4ItOpcode::SetShReg: { const auto* set_data = reinterpret_cast(header); - const auto set_size = (count - 1) * sizeof(u32); + const auto set_size = (header->type3.NumWords() - 1) * sizeof(u32); if (set_data->reg_offset >= 0x200 && set_data->reg_offset <= (0x200 + sizeof(ComputeProgram) / 4)) { @@ -895,14 +914,14 @@ Liverpool::Task Liverpool::ProcessCompute(std::span acb, u32 vqid) { } default: UNREACHABLE_MSG("Unknown PM4 type 3 opcode {:#x} with count {}", - static_cast(opcode), count); + static_cast(opcode), header->type3.NumWords()); } - const auto packet_size_dw = header->type3.NumWords() + 1; - acb = NextPacket(acb, packet_size_dw); + acb += next_dw_off; + acb_dwords -= next_dw_off; if constexpr (!is_indirect) { - *queue.read_addr += packet_size_dw; + *queue.read_addr += next_dw_off; *queue.read_addr %= queue.ring_size_dw; } } @@ -969,7 +988,7 @@ void Liverpool::SubmitAsc(u32 gnm_vqid, std::span acb) { auto& queue = mapped_queues[gnm_vqid]; const auto vqid = gnm_vqid - 1; - const auto& task = ProcessCompute(acb, vqid); + const auto& task = ProcessCompute(acb.data(), acb.size(), vqid); { std::scoped_lock lock{queue.m_access}; queue.submits.emplace(task.handle); diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index c18bcd57b..474c04ec2 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -1496,10 +1496,13 @@ public: } struct AscQueueInfo { + static constexpr size_t Pm4BufferSize = 1024; VAddr map_addr; u32* read_addr; u32 ring_size_dw; u32 pipe_id; + std::array tmp_packet; + u32 tmp_dwords; }; Common::SlotVector asc_queues{}; @@ -1541,7 +1544,7 @@ private: Task ProcessGraphics(std::span dcb, std::span ccb); Task ProcessCeUpdate(std::span ccb); template - Task ProcessCompute(std::span acb, u32 vqid); + Task ProcessCompute(const u32* acb, u32 acb_dwords, u32 vqid); void Process(std::stop_token stoken); From 7d0631cf26f983c035c1df9a071a69a28d619001 Mon Sep 17 00:00:00 2001 From: Ked <58560148+k3dr1@users.noreply.github.com> Date: Wed, 26 Mar 2025 20:35:43 +0800 Subject: [PATCH 436/455] Slightly changed how allInstallDirsDisabled is determined (#2688) --- src/qt_gui/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index d70294e40..34e429368 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -158,8 +158,7 @@ int main(int argc, char* argv[]) { } bool allInstallDirsDisabled = - std::all_of(Config::getGameInstallDirsEnabled().begin(), - Config::getGameInstallDirsEnabled().end(), [](bool val) { return !val; }); + std::ranges::all_of(Config::getGameInstallDirsEnabled(), [](bool val) { return !val; }); // If no game directory is set and no command line argument, prompt for it if (Config::getGameInstallDirs().empty() && allInstallDirsDisabled && From d8204641fafe6d1d23c561434328d9fecdb194be Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Wed, 26 Mar 2025 11:03:35 -0500 Subject: [PATCH 437/455] libkernel: Filesystem code cleanup (#2554) * sceKernelOpen: Clean up flag handling * sceKernelOpen: fix params Based on decompilation, the second parameter of _open should be flags. Additionally swaps the return and parameter types to align with our current standards. * sceKernelOpen: Fix errors Based on POSIX spec, if part of the path is missing, ENOENT is the correct return. Additionally, decompilation suggests that open sets errno too. * Fix exports Fixes function exports to align with what they should be, based on what I've seen from decompilation and our module generator. * Proper errno behavior on open Since sceKernelOpen calls posix_open, errno should be set during this process. Simplest way to handle that is to move the actual open code to posix_open and adjust error cases accordingly. * Reorganize open calls, add error log * Improve close Removes the EPERM return, as it makes no sense, and swaps sceKernelClose with posix_close to properly emulate errno behavior. * Fix log on close * posix_open fixups * Readd hack in posix_close It's either this, or removing LLE DiscMap. Or shadow implements posix sockets. * Missing exports Commented out while I gradually work through them all * Remaining placeholder exports * Swap some stuff around I see nothing that suggests "open" only takes two parameters, so this should be completely safe. It's also more accurate to how these are handled in libkernel, and means I won't need to reorganize anything for readv and writev. * Update file_system.cpp * Implement write and posix_write * Oops * Implement posix_readv and sceKernelReadv Also fixes error behavior on readv, as that function shouldn't be returning any kernel error codes. * Move sceKernelUnlink Will deal with this one later, was just annoyed by how it's location doesn't align with the export order. * Cleanup readv * Implement posix_writev and sceKernelWritev Also fixes error behavior on writev, since it shouldn't ever return kernel errors (since our device files return those) * More cleanup on older functions * Swap around sceKernelLseek and posix_lseek This ensures that these have the correct error behavior, and makes their behavior align with the updated implementations for earlier functions. * Update file_system.cpp * Implement read Also fixes error behavior * Swap sceKernelMkdir and posix_mkdir Fixes errno behavior on kernel calls, also fixed some incorrect error returns. * Fix errno behavior on sceKernelRmdir Also reduces function logging to bring it closer to the level of logging seen in other filesystem functions. * Slight clean up of sceKernelStat Fixes error behavior and changes some of the old data types. * Refactor fstat Fixes errno behavior, implements fstat, and shifts exports around based on file position. Might reorganize function locations later though. * Implement posix_ftruncate Implements posix_ftruncate and fixes errno behavior for sceKernelFtruncate * Add missing error conversions for more device functions * Implement posix_rename, fix sceKernelRename errno behavior * Add posix_preadv and posix_pread Also fixes some incorrect error returns, fixes errno behavior, and removes an unnecessary hack. * Fix compile * Implement posix_getdents, getdirentries, and posix_getdirentries Also fixes errno behavior for the kernel variants of these functions. * Fix errno behavior of sceKernelFsync * Implement posix_pwrite and posix_unlink Also fixes errno behavior in related functions. * Update file_system.cpp * Remove SetPosixErrno Ideally, we've handled all possible error conditions before calling these functions, so treat errors in platform-specific code as IO errors and return POSIX_EIO instead. * Update header exports Not sure where these get used, but might as well keep them consistent with the rest of this. * Check if file exists before calling platform-specific code Bloodborne checks if a file doesn't exist using open, checking if it specifically failed with error code ENOENT. To avoid working with platform-specific errnos, add a proper error return for if the file doesn't exist. Fixes a regression in Bloodborne. * Clang Out of all the changes, this is apparently the only thing Clang-Format doesn't like. I'm honestly surprised. * Improve error checks on posix_unlink Just because a file isn't opened doesn't mean the file doesn't exist. Fixes the error returned if host_path.empty(), and removes the error return for when GetFile fails. * Fix the Bloodborne fix * Limit exports to tested functions * More confirmed working exports * Remaining stuff my games can test * FS exports from firmware tests * Bring back missing exports from main I don't have any bootable things that call these, but since they were working well enough on main, they should be fine to readd. * Add export for posix_pread Spotted in Dreams a while back, might as well add it. * Revert "Remove SetPosixErrno" This reverts commit bdfc0c246ce35cde015f3e48a284052ca4caf45e. * Revert SetPosixErrno changes shadow's using it for posix sockets, so significant modifications would introduce unnecessary merge conflicts. * Update comment * Add EACCES errno to SetPosixErrno Seen in Gravity Rush. Also reorganizes the switch case based on the posix errno value, since ordering by errno makes no sense on some OSes. * More export fixups Missed these during my initial pass through FS stuff because they were in kernel.cpp for some reason. * Symbols from FS tests Tested by messing around with firmware elfs, these atleast don't cause any crashes. * Remove inaccurate error behavior Seek can have offsets past the end of a file. Also add logging for two valid whence values that are unsupported on Windows. I'll need to verify that SEEK_HOLE and SEEK_DATA correspond to 3 and 4 respectively, I've yet to check source to verify. * Fix error log Oops * Clang Clang * Remove close hack Since LLE libSceDiscMap is no longer a concern, this hack shouldn't be needed. Since sockets are still stubbed, and close can be used on sockets, I've added a warning log just in case this still occurs in some titles. * Change SetPosixErrno unreachable to warning I changed it to an unreachable in an earlier commit to make testing easier. At this point, having an unreachable for this seems unnecessary, so change it to a warning instead. * Remove Bloodborne hack Games should be able to unlink files that aren't opened file descriptors. As far as I've tested, this doesn't break Bloodborne. --- src/common/io_file.cpp | 5 +- src/common/io_file.h | 2 + src/core/libraries/kernel/file_system.cpp | 862 ++++++++++++++-------- src/core/libraries/kernel/file_system.h | 8 +- src/core/libraries/kernel/kernel.cpp | 28 +- 5 files changed, 570 insertions(+), 335 deletions(-) diff --git a/src/common/io_file.cpp b/src/common/io_file.cpp index 3db78a145..3efadc6ea 100644 --- a/src/common/io_file.cpp +++ b/src/common/io_file.cpp @@ -125,12 +125,15 @@ namespace { [[nodiscard]] constexpr int ToSeekOrigin(SeekOrigin origin) { switch (origin) { case SeekOrigin::SetOrigin: - default: return SEEK_SET; case SeekOrigin::CurrentPosition: return SEEK_CUR; case SeekOrigin::End: return SEEK_END; + default: + LOG_ERROR(Common_Filesystem, "Unsupported origin {}, defaulting to SEEK_SET", + static_cast(origin)); + return SEEK_SET; } } diff --git a/src/common/io_file.h b/src/common/io_file.h index 45787a092..fb20a2bc5 100644 --- a/src/common/io_file.h +++ b/src/common/io_file.h @@ -61,6 +61,8 @@ enum class SeekOrigin : u32 { SetOrigin, // Seeks from the start of the file. CurrentPosition, // Seeks from the current file pointer position. End, // Seeks from the end of the file. + SeekHole, // Seeks from the start of the next hole in the file. + SeekData, // Seeks from the start of the next non-hole region in the file. }; class IOFile final { diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index ef3c2fe70..3321559ed 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -18,6 +18,7 @@ #include "core/file_sys/fs.h" #include "core/libraries/kernel/file_system.h" #include "core/libraries/kernel/orbis_error.h" +#include "core/libraries/kernel/posix_error.h" #include "core/libraries/libs.h" #include "core/memory.h" #include "kernel.h" @@ -57,7 +58,7 @@ static std::map available_device = { namespace Libraries::Kernel { -int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { +s32 PS4_SYSV_ABI open(const char* raw_path, s32 flags, u16 mode) { LOG_INFO(Kernel_Fs, "path = {} flags = {:#x} mode = {}", raw_path, flags, mode); auto* h = Common::Singleton::Instance(); auto* mnt = Common::Singleton::Instance(); @@ -99,7 +100,8 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { file->m_host_name = mnt->GetHostPath(file->m_guest_name); if (!std::filesystem::is_directory(file->m_host_name)) { // directory doesn't exist h->DeleteHandle(handle); - return ORBIS_KERNEL_ERROR_ENOTDIR; + *__Error() = POSIX_ENOENT; + return -1; } else { if (create) { return handle; // dir already exists @@ -116,61 +118,87 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) { } else { file->m_guest_name = path; file->m_host_name = mnt->GetHostPath(file->m_guest_name); + bool exists = std::filesystem::exists(file->m_host_name); int e = 0; - if (read) { - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read); - } else if (write && (create || truncate)) { - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); - } else if (write && create && append) { // CUSA04729 (appends app0/shaderlist.txt) - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append); - } else if (rdwr) { - if (create) { // Create an empty file first. - Common::FS::IOFile out(file->m_host_name, Common::FS::FileAccessMode::Write); + + if (create) { + if (excl && exists) { + // Error if file exists + h->DeleteHandle(handle); + *__Error() = POSIX_EEXIST; + return -1; } - // RW, then scekernelWrite is called and savedata is written just fine now. - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::ReadWrite); - } else if (write) { - e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); - } else { - UNREACHABLE(); - } - if (e != 0) { + // Create file if it doesn't exist + Common::FS::IOFile out(file->m_host_name, Common::FS::FileAccessMode::Write); + } else if (!exists) { + // File to open doesn't exist, return ENOENT h->DeleteHandle(handle); - return ErrnoToSceKernelError(e); + *__Error() = POSIX_ENOENT; + return -1; + } + + if (read) { + // Read only + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read); + } else if (write) { + // Write only + if (append) { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append); + } else { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); + } + } else if (rdwr) { + // Read and write + if (append) { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append); + } else { + e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::ReadWrite); + } + } else { + // Invalid flags + *__Error() = POSIX_EINVAL; + return -1; + } + + if (truncate && e == 0) { + // If the file was opened successfully and truncate was enabled, reduce size to 0 + file->f.SetSize(0); + } + + if (e != 0) { + // Open failed in platform-specific code, errno needs to be converted. + h->DeleteHandle(handle); + SetPosixErrno(e); + return -1; } } file->is_opened = true; return handle; } -int PS4_SYSV_ABI posix_open(const char* path, int flags, /* SceKernelMode*/ u16 mode) { - LOG_INFO(Kernel_Fs, "posix open redirect to sceKernelOpen"); - int result = sceKernelOpen(path, flags, mode); - // Posix calls different only for their return values +s32 PS4_SYSV_ABI posix_open(const char* filename, s32 flags, u16 mode) { + return open(filename, flags, mode); +} + +s32 PS4_SYSV_ABI sceKernelOpen(const char* path, s32 flags, /* SceKernelMode*/ u16 mode) { + s32 result = open(path, flags, mode); if (result < 0) { - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI open(const char* filename, const char* mode) { - LOG_INFO(Kernel_Fs, "open redirect to sceKernelOpen"); - int result = sceKernelOpen(filename, ORBIS_KERNEL_O_RDWR, 0); - if (result < 0) { - return -1; - } - return result; -} - -int PS4_SYSV_ABI sceKernelClose(int d) { - if (d < 3) { // d probably hold an error code - return ORBIS_KERNEL_ERROR_EPERM; +s32 PS4_SYSV_ABI close(s32 fd) { + if (fd < 3) { + // This is technically possible, but it's usually caused by some stubbed function instead. + LOG_WARNING(Kernel_Fs, "called on an std handle, fd = {}", fd); } auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } if (file->type == Core::FileSys::FileType::Regular) { file->f.Close(); @@ -178,63 +206,54 @@ int PS4_SYSV_ABI sceKernelClose(int d) { file->is_opened = false; LOG_INFO(Kernel_Fs, "Closing {}", file->m_guest_name); // FIXME: Lock file mutex before deleting it? - h->DeleteHandle(d); + h->DeleteHandle(fd); return ORBIS_OK; } -int PS4_SYSV_ABI posix_close(int d) { - int result = sceKernelClose(d); +s32 PS4_SYSV_ABI posix_close(s32 fd) { + return close(fd); +} + +s32 PS4_SYSV_ABI sceKernelClose(s32 fd) { + s32 result = close(fd); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_close: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -s64 PS4_SYSV_ABI sceKernelWrite(int d, const void* buf, size_t nbytes) { +s64 PS4_SYSV_ABI write(s32 fd, const void* buf, size_t nbytes) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->write(buf, nbytes); + s64 result = file->device->write(buf, nbytes); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } return file->f.WriteRaw(buf, nbytes); } -int PS4_SYSV_ABI sceKernelUnlink(const char* path) { - if (path == nullptr) { - return ORBIS_KERNEL_ERROR_EINVAL; +s64 PS4_SYSV_ABI posix_write(s32 fd, const void* buf, size_t nbytes) { + return write(fd, buf, nbytes); +} + +s64 PS4_SYSV_ABI sceKernelWrite(s32 fd, const void* buf, size_t nbytes) { + s64 result = write(fd, buf, nbytes); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } - - auto* h = Common::Singleton::Instance(); - auto* mnt = Common::Singleton::Instance(); - - bool ro = false; - const auto host_path = mnt->GetHostPath(path, &ro); - if (host_path.empty()) { - return ORBIS_KERNEL_ERROR_EACCES; - } - - if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; - } - - if (std::filesystem::is_directory(host_path)) { - return ORBIS_KERNEL_ERROR_EPERM; - } - - auto* file = h->GetFile(host_path); - if (file != nullptr) { - file->f.Unlink(); - } - - LOG_INFO(Kernel_Fs, "Unlinked {}", path); - return ORBIS_OK; + return result; } size_t ReadFile(Common::FS::IOFile& file, void* buf, size_t nbytes) { @@ -246,59 +265,97 @@ size_t ReadFile(Common::FS::IOFile& file, void* buf, size_t nbytes) { return file.ReadRaw(buf, nbytes); } -size_t PS4_SYSV_ABI _readv(int d, const SceKernelIovec* iov, int iovcnt) { +size_t PS4_SYSV_ABI readv(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - int r = file->device->readv(iov, iovcnt); - if (r < 0) { - ErrSceToPosix(r); + size_t result = file->device->readv(iov, iovcnt); + if (result < 0) { + ErrSceToPosix(result); return -1; } - return r; + return result; } size_t total_read = 0; - for (int i = 0; i < iovcnt; i++) { + for (s32 i = 0; i < iovcnt; i++) { total_read += ReadFile(file->f, iov[i].iov_base, iov[i].iov_len); } return total_read; } -size_t PS4_SYSV_ABI _writev(int fd, const SceKernelIovec* iov, int iovcn) { +size_t PS4_SYSV_ABI posix_readv(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + return readv(fd, iov, iovcnt); +} + +size_t PS4_SYSV_ABI sceKernelReadv(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + size_t result = readv(fd, iov, iovcnt); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +size_t PS4_SYSV_ABI writev(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->writev(iov, iovcn); + size_t result = file->device->writev(iov, iovcnt); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } size_t total_written = 0; - for (int i = 0; i < iovcn; i++) { + for (s32 i = 0; i < iovcnt; i++) { total_written += file->f.WriteRaw(iov[i].iov_base, iov[i].iov_len); } return total_written; } -s64 PS4_SYSV_ABI sceKernelLseek(int d, s64 offset, int whence) { - LOG_TRACE(Kernel_Fs, "called: offset {} whence {}", offset, whence); +size_t PS4_SYSV_ABI posix_writev(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + return writev(fd, iov, iovcnt); +} + +size_t PS4_SYSV_ABI sceKernelWritev(s32 fd, const SceKernelIovec* iov, s32 iovcnt) { + size_t result = writev(fd, iov, iovcnt); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s64 PS4_SYSV_ABI posix_lseek(s32 fd, s64 offset, s32 whence) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->lseek(offset, whence); + s64 result = file->device->lseek(offset, whence); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } Common::FS::SeekOrigin origin{}; @@ -308,53 +365,82 @@ s64 PS4_SYSV_ABI sceKernelLseek(int d, s64 offset, int whence) { origin = Common::FS::SeekOrigin::CurrentPosition; } else if (whence == 2) { origin = Common::FS::SeekOrigin::End; + } else if (whence == 3) { + origin = Common::FS::SeekOrigin::SeekHole; + } else if (whence == 4) { + origin = Common::FS::SeekOrigin::SeekData; + } else { + // whence parameter is invalid + *__Error() = POSIX_EINVAL; + return -1; } if (!file->f.Seek(offset, origin)) { - LOG_CRITICAL(Kernel_Fs, "sceKernelLseek: failed to seek"); - return ORBIS_KERNEL_ERROR_EINVAL; + if (errno != 0) { + // Seek failed in platform-specific code, errno needs to be converted. + SetPosixErrno(errno); + return -1; + } + // Shouldn't be possible, but just in case. + return -1; } - return file->f.Tell(); -} -s64 PS4_SYSV_ABI posix_lseek(int d, s64 offset, int whence) { - s64 result = sceKernelLseek(d, offset, whence); + s64 result = file->f.Tell(); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_lseek: error = {}", result); - ErrSceToPosix(result); + // Tell failed in platform-specific code, errno needs to be converted. + SetPosixErrno(errno); return -1; } return result; } -s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes) { +s64 PS4_SYSV_ABI sceKernelLseek(s32 fd, s64 offset, s32 whence) { + s64 result = posix_lseek(fd, offset, whence); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s64 PS4_SYSV_ABI read(s32 fd, void* buf, size_t nbytes) { auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->read(buf, nbytes); + s64 result = file->device->read(buf, nbytes); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } return ReadFile(file->f, buf, nbytes); } -int PS4_SYSV_ABI posix_read(int d, void* buf, size_t nbytes) { - int result = sceKernelRead(d, buf, nbytes); +s64 PS4_SYSV_ABI posix_read(s32 fd, void* buf, size_t nbytes) { + return read(fd, buf, nbytes); +} + +s64 PS4_SYSV_ABI sceKernelRead(s32 fd, void* buf, size_t nbytes) { + s64 result = read(fd, buf, nbytes); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_read: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelMkdir(const char* path, u16 mode) { +s32 PS4_SYSV_ABI posix_mkdir(const char* path, u16 mode) { LOG_INFO(Kernel_Fs, "path = {} mode = {}", path, mode); if (path == nullptr) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_ENOTDIR; + return -1; } auto* mnt = Common::Singleton::Instance(); @@ -362,88 +448,79 @@ int PS4_SYSV_ABI sceKernelMkdir(const char* path, u16 mode) { const auto dir_name = mnt->GetHostPath(path, &ro); if (std::filesystem::exists(dir_name)) { - return ORBIS_KERNEL_ERROR_EEXIST; + *__Error() = POSIX_EEXIST; + return -1; } if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; + *__Error() = POSIX_EROFS; + return -1; } // CUSA02456: path = /aotl after sceSaveDataMount(mode = 1) std::error_code ec; if (dir_name.empty() || !std::filesystem::create_directory(dir_name, ec)) { - return ORBIS_KERNEL_ERROR_EIO; + *__Error() = POSIX_EIO; + return -1; } if (!std::filesystem::exists(dir_name)) { - return ORBIS_KERNEL_ERROR_ENOENT; + *__Error() = POSIX_ENOENT; + return -1; } return ORBIS_OK; } -int PS4_SYSV_ABI posix_mkdir(const char* path, u16 mode) { - int result = sceKernelMkdir(path, mode); +s32 PS4_SYSV_ABI sceKernelMkdir(const char* path, u16 mode) { + s32 result = posix_mkdir(path, mode); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_mkdir: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelRmdir(const char* path) { +s32 PS4_SYSV_ABI posix_rmdir(const char* path) { auto* mnt = Common::Singleton::Instance(); bool ro = false; const std::filesystem::path dir_name = mnt->GetHostPath(path, &ro); - if (dir_name.empty()) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, permission denied", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_EACCES; + if (dir_name.empty() || !std::filesystem::is_directory(dir_name)) { + *__Error() = POSIX_ENOTDIR; + return -1; } if (ro) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, directory is read only", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_EROFS; - } - - if (!std::filesystem::is_directory(dir_name)) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, path is not a directory", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_ENOTDIR; + *__Error() = POSIX_EROFS; + return -1; } if (!std::filesystem::exists(dir_name)) { - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, no such file or directory", - fmt::UTF(dir_name.u8string())); - return ORBIS_KERNEL_ERROR_ENOENT; + *__Error() = POSIX_ENOENT; + return -1; } std::error_code ec; - int result = std::filesystem::remove_all(dir_name, ec); + s32 result = std::filesystem::remove_all(dir_name, ec); - if (!ec) { - LOG_INFO(Kernel_Fs, "Removed directory: {}", fmt::UTF(dir_name.u8string())); - return ORBIS_OK; + if (ec) { + *__Error() = POSIX_EIO; + return -1; } - LOG_ERROR(Kernel_Fs, "Failed to remove directory: {}, error_code={}", - fmt::UTF(dir_name.u8string()), ec.message()); - return ErrnoToSceKernelError(ec.value()); + return ORBIS_OK; } -int PS4_SYSV_ABI posix_rmdir(const char* path) { - int result = sceKernelRmdir(path); +s32 PS4_SYSV_ABI sceKernelRmdir(const char* path) { + s32 result = posix_rmdir(path); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_rmdir: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { +s32 PS4_SYSV_ABI posix_stat(const char* path, OrbisKernelStat* sb) { LOG_INFO(Kernel_Fs, "(PARTIAL) path = {}", path); auto* mnt = Common::Singleton::Instance(); bool ro = false; @@ -452,7 +529,8 @@ int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { const bool is_dir = std::filesystem::is_directory(path_name); const bool is_file = std::filesystem::is_regular_file(path_name); if (!is_dir && !is_file) { - return ORBIS_KERNEL_ERROR_ENOENT; + *__Error() = POSIX_ENOENT; + return -1; } if (std::filesystem::is_directory(path_name)) { sb->st_mode = 0000777u | 0040000u; @@ -462,7 +540,7 @@ int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { // TODO incomplete } else { sb->st_mode = 0000777u | 0100000u; - sb->st_size = static_cast(std::filesystem::file_size(path_name)); + sb->st_size = static_cast(std::filesystem::file_size(path_name)); sb->st_blksize = 512; sb->st_blocks = (sb->st_size + 511) / 512; // TODO incomplete @@ -474,17 +552,16 @@ int PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { return ORBIS_OK; } -int PS4_SYSV_ABI posix_stat(const char* path, OrbisKernelStat* sb) { - int result = sceKernelStat(path, sb); +s32 PS4_SYSV_ABI sceKernelStat(const char* path, OrbisKernelStat* sb) { + s32 result = posix_stat(path, sb); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_stat: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelCheckReachability(const char* path) { +s32 PS4_SYSV_ABI sceKernelCheckReachability(const char* path) { auto* mnt = Common::Singleton::Instance(); std::string_view guest_path{path}; for (const auto& prefix : available_device | std::views::keys) { @@ -499,23 +576,165 @@ int PS4_SYSV_ABI sceKernelCheckReachability(const char* path) { return ORBIS_OK; } -s64 PS4_SYSV_ABI sceKernelPreadv(int d, SceKernelIovec* iov, int iovcnt, s64 offset) { - if (d < 3) { - return ORBIS_KERNEL_ERROR_EPERM; +s32 PS4_SYSV_ABI fstat(s32 fd, OrbisKernelStat* sb) { + LOG_INFO(Kernel_Fs, "(PARTIAL) fd = {}", fd); + if (sb == nullptr) { + *__Error() = POSIX_EFAULT; + return -1; } + auto* h = Common::Singleton::Instance(); + auto* file = h->GetFile(fd); + if (file == nullptr) { + *__Error() = POSIX_EBADF; + return -1; + } + std::memset(sb, 0, sizeof(OrbisKernelStat)); + + switch (file->type) { + case Core::FileSys::FileType::Device: { + s32 result = file->device->fstat(sb); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; + } + case Core::FileSys::FileType::Regular: { + sb->st_mode = 0000777u | 0100000u; + sb->st_size = file->f.GetSize(); + sb->st_blksize = 512; + sb->st_blocks = (sb->st_size + 511) / 512; + // TODO incomplete + break; + } + case Core::FileSys::FileType::Directory: { + sb->st_mode = 0000777u | 0040000u; + sb->st_size = 0; + sb->st_blksize = 512; + sb->st_blocks = 0; + // TODO incomplete + break; + } + default: + UNREACHABLE(); + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI posix_fstat(s32 fd, OrbisKernelStat* sb) { + return fstat(fd, sb); +} + +s32 PS4_SYSV_ABI sceKernelFstat(s32 fd, OrbisKernelStat* sb) { + s32 result = fstat(fd, sb); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI posix_ftruncate(s32 fd, s64 length) { + auto* h = Common::Singleton::Instance(); + auto* file = h->GetFile(fd); + + if (file == nullptr) { + *__Error() = POSIX_EBADF; + return -1; + } + + if (file->type == Core::FileSys::FileType::Device) { + s32 result = file->device->ftruncate(length); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; + } + + if (file->m_host_name.empty()) { + *__Error() = POSIX_EACCES; + return -1; + } + + file->f.SetSize(length); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceKernelFtruncate(s32 fd, s64 length) { + s32 result = posix_ftruncate(fd, length); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI posix_rename(const char* from, const char* to) { + auto* mnt = Common::Singleton::Instance(); + bool ro = false; + const auto src_path = mnt->GetHostPath(from, &ro); + if (!std::filesystem::exists(src_path)) { + *__Error() = POSIX_ENOENT; + return -1; + } + if (ro) { + *__Error() = POSIX_EROFS; + return -1; + } + const auto dst_path = mnt->GetHostPath(to, &ro); + if (ro) { + *__Error() = POSIX_EROFS; + return -1; + } + const bool src_is_dir = std::filesystem::is_directory(src_path); + const bool dst_is_dir = std::filesystem::is_directory(dst_path); + if (src_is_dir && !dst_is_dir) { + *__Error() = POSIX_ENOTDIR; + return -1; + } + if (!src_is_dir && dst_is_dir) { + *__Error() = POSIX_EISDIR; + return -1; + } + if (dst_is_dir && !std::filesystem::is_empty(dst_path)) { + *__Error() = POSIX_ENOTEMPTY; + return -1; + } + std::filesystem::copy(src_path, dst_path, std::filesystem::copy_options::overwrite_existing); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceKernelRename(const char* from, const char* to) { + s32 result = posix_rename(from, to); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s64 PS4_SYSV_ABI posix_preadv(s32 fd, SceKernelIovec* iov, s32 iovcnt, s64 offset) { if (offset < 0) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EINVAL; + return -1; } auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->preadv(iov, iovcnt, offset); + s64 result = file->device->preadv(iov, iovcnt, offset); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } const s64 pos = file->f.Tell(); @@ -523,8 +742,8 @@ s64 PS4_SYSV_ABI sceKernelPreadv(int d, SceKernelIovec* iov, int iovcnt, s64 off file->f.Seek(pos); }; if (!file->f.Seek(offset)) { - LOG_CRITICAL(Kernel_Fs, "failed to seek"); - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EIO; + return -1; } size_t total_read = 0; for (int i = 0; i < iovcnt; i++) { @@ -533,118 +752,72 @@ s64 PS4_SYSV_ABI sceKernelPreadv(int d, SceKernelIovec* iov, int iovcnt, s64 off return total_read; } -s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset) { - SceKernelIovec iovec{buf, nbytes}; - return sceKernelPreadv(d, &iovec, 1, offset); -} - -int PS4_SYSV_ABI sceKernelFStat(int fd, OrbisKernelStat* sb) { - LOG_INFO(Kernel_Fs, "(PARTIAL) fd = {}", fd); - if (fd < 3) { - return ORBIS_KERNEL_ERROR_EPERM; - } - if (sb == nullptr) { - return ORBIS_KERNEL_ERROR_EFAULT; - } - auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(fd); - if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; - } - std::memset(sb, 0, sizeof(OrbisKernelStat)); - - switch (file->type) { - case Core::FileSys::FileType::Device: - return file->device->fstat(sb); - case Core::FileSys::FileType::Regular: - sb->st_mode = 0000777u | 0100000u; - sb->st_size = file->f.GetSize(); - sb->st_blksize = 512; - sb->st_blocks = (sb->st_size + 511) / 512; - // TODO incomplete - break; - case Core::FileSys::FileType::Directory: - sb->st_mode = 0000777u | 0040000u; - sb->st_size = 0; - sb->st_blksize = 512; - sb->st_blocks = 0; - // TODO incomplete - break; - default: - UNREACHABLE(); - } - return ORBIS_OK; -} - -int PS4_SYSV_ABI posix_fstat(int fd, OrbisKernelStat* sb) { - int result = sceKernelFStat(fd, sb); +s64 PS4_SYSV_ABI sceKernelPreadv(s32 fd, SceKernelIovec* iov, s32 iovcnt, s64 offset) { + s64 result = posix_preadv(fd, iov, iovcnt, offset); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_fstat: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -s32 PS4_SYSV_ABI sceKernelFsync(int fd) { +s64 PS4_SYSV_ABI posix_pread(s32 fd, void* buf, size_t nbytes, s64 offset) { + SceKernelIovec iovec{buf, nbytes}; + return posix_preadv(fd, &iovec, 1, offset); +} + +s64 PS4_SYSV_ABI sceKernelPread(s32 fd, void* buf, size_t nbytes, s64 offset) { + SceKernelIovec iovec{buf, nbytes}; + return sceKernelPreadv(fd, &iovec, 1, offset); +} + +s32 PS4_SYSV_ABI posix_fsync(s32 fd) { auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } if (file->type == Core::FileSys::FileType::Device) { - return file->device->fsync(); + s32 result = file->device->fsync(); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } file->f.Flush(); return ORBIS_OK; } -s32 PS4_SYSV_ABI posix_fsync(int fd) { - s32 result = sceKernelFsync(fd); +s32 PS4_SYSV_ABI sceKernelFsync(s32 fd) { + s32 result = posix_fsync(fd); if (result < 0) { - LOG_ERROR(Kernel_Pthread, "posix_fsync: error = {}", result); - ErrSceToPosix(result); - return -1; + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } return result; } -int PS4_SYSV_ABI sceKernelFtruncate(int fd, s64 length) { - auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(fd); - - if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; - } - - if (file->type == Core::FileSys::FileType::Device) { - return file->device->ftruncate(length); - } - - if (file->m_host_name.empty()) { - return ORBIS_KERNEL_ERROR_EACCES; - } - - file->f.SetSize(length); - return ORBIS_OK; -} - -static int GetDents(int fd, char* buf, int nbytes, s64* basep) { - if (fd < 3) { - return ORBIS_KERNEL_ERROR_EBADF; - } - +static s32 GetDents(s32 fd, char* buf, s32 nbytes, s64* basep) { if (buf == nullptr) { - return ORBIS_KERNEL_ERROR_EFAULT; + *__Error() = POSIX_EFAULT; + return -1; } auto* h = Common::Singleton::Instance(); auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } if (file->type == Core::FileSys::FileType::Device) { - return file->device->getdents(buf, nbytes, basep); + s32 result = file->device->getdents(buf, nbytes, basep); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } if (file->dirents_index == file->dirents.size()) { @@ -652,7 +825,8 @@ static int GetDents(int fd, char* buf, int nbytes, s64* basep) { } if (file->type != Core::FileSys::FileType::Directory || nbytes < 512 || file->dirents_index > file->dirents.size()) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EINVAL; + return -1; } const auto& entry = file->dirents.at(file->dirents_index++); auto str = entry.name; @@ -673,118 +847,178 @@ static int GetDents(int fd, char* buf, int nbytes, s64* basep) { return sizeof(OrbisKernelDirent); } -int PS4_SYSV_ABI sceKernelGetdents(int fd, char* buf, int nbytes) { +s32 PS4_SYSV_ABI posix_getdents(s32 fd, char* buf, s32 nbytes) { return GetDents(fd, buf, nbytes, nullptr); } -int PS4_SYSV_ABI sceKernelGetdirentries(int fd, char* buf, int nbytes, s64* basep) { +s32 PS4_SYSV_ABI sceKernelGetdents(s32 fd, char* buf, s32 nbytes) { + s32 result = GetDents(fd, buf, nbytes, nullptr); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI getdirentries(s32 fd, char* buf, s32 nbytes, s64* basep) { return GetDents(fd, buf, nbytes, basep); } -s64 PS4_SYSV_ABI sceKernelPwrite(int d, void* buf, size_t nbytes, s64 offset) { - if (d < 3) { - return ORBIS_KERNEL_ERROR_EPERM; +s32 PS4_SYSV_ABI posix_getdirentries(s32 fd, char* buf, s32 nbytes, s64* basep) { + return GetDents(fd, buf, nbytes, basep); +} + +s32 PS4_SYSV_ABI sceKernelGetdirentries(s32 fd, char* buf, s32 nbytes, s64* basep) { + s32 result = GetDents(fd, buf, nbytes, basep); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); } + return result; +} + +s64 PS4_SYSV_ABI posix_pwrite(s32 fd, void* buf, size_t nbytes, s64 offset) { if (offset < 0) { - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EINVAL; + return -1; } auto* h = Common::Singleton::Instance(); - auto* file = h->GetFile(d); + auto* file = h->GetFile(fd); if (file == nullptr) { - return ORBIS_KERNEL_ERROR_EBADF; + *__Error() = POSIX_EBADF; + return -1; } std::scoped_lock lk{file->m_mutex}; if (file->type == Core::FileSys::FileType::Device) { - return file->device->pwrite(buf, nbytes, offset); + s64 result = file->device->pwrite(buf, nbytes, offset); + if (result < 0) { + ErrSceToPosix(result); + return -1; + } + return result; } const s64 pos = file->f.Tell(); SCOPE_EXIT { file->f.Seek(pos); }; if (!file->f.Seek(offset)) { - LOG_CRITICAL(Kernel_Fs, "sceKernelPwrite: failed to seek"); - return ORBIS_KERNEL_ERROR_EINVAL; + *__Error() = POSIX_EIO; + return -1; } return file->f.WriteRaw(buf, nbytes); } -s32 PS4_SYSV_ABI sceKernelRename(const char* from, const char* to) { +s64 PS4_SYSV_ABI sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset) { + s64 result = posix_pwrite(fd, buf, nbytes, offset); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} + +s32 PS4_SYSV_ABI posix_unlink(const char* path) { + if (path == nullptr) { + *__Error() = POSIX_EINVAL; + return -1; + } + + auto* h = Common::Singleton::Instance(); auto* mnt = Common::Singleton::Instance(); + bool ro = false; - const auto src_path = mnt->GetHostPath(from, &ro); - if (!std::filesystem::exists(src_path)) { - return ORBIS_KERNEL_ERROR_ENOENT; + const auto host_path = mnt->GetHostPath(path, &ro); + if (host_path.empty()) { + *__Error() = POSIX_ENOENT; + return -1; } + if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; + *__Error() = POSIX_EROFS; + return -1; } - const auto dst_path = mnt->GetHostPath(to, &ro); - if (ro) { - return ORBIS_KERNEL_ERROR_EROFS; + + if (std::filesystem::is_directory(host_path)) { + *__Error() = POSIX_EPERM; + return -1; } - const bool src_is_dir = std::filesystem::is_directory(src_path); - const bool dst_is_dir = std::filesystem::is_directory(dst_path); - if (src_is_dir && !dst_is_dir) { - return ORBIS_KERNEL_ERROR_ENOTDIR; + + auto* file = h->GetFile(host_path); + if (file == nullptr) { + // File to unlink hasn't been opened, manually open and unlink it. + Common::FS::IOFile file(host_path, Common::FS::FileAccessMode::ReadWrite); + file.Unlink(); + } else { + file->f.Unlink(); } - if (!src_is_dir && dst_is_dir) { - return ORBIS_KERNEL_ERROR_EISDIR; - } - if (dst_is_dir && !std::filesystem::is_empty(dst_path)) { - return ORBIS_KERNEL_ERROR_ENOTEMPTY; - } - std::filesystem::copy(src_path, dst_path, std::filesystem::copy_options::overwrite_existing); + + LOG_INFO(Kernel_Fs, "Unlinked {}", path); return ORBIS_OK; } -void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) { - LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); - LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open); - LIB_FUNCTION("wuCroIGjt2g", "libkernel", 1, "libkernel", 1, 1, open); - LIB_FUNCTION("UK2Tl2DWUns", "libkernel", 1, "libkernel", 1, 1, sceKernelClose); - LIB_FUNCTION("bY-PO6JhzhQ", "libkernel", 1, "libkernel", 1, 1, posix_close); - LIB_FUNCTION("bY-PO6JhzhQ", "libScePosix", 1, "libkernel", 1, 1, posix_close); - LIB_FUNCTION("4wSze92BhLI", "libkernel", 1, "libkernel", 1, 1, sceKernelWrite); +s32 PS4_SYSV_ABI sceKernelUnlink(const char* path) { + s32 result = posix_unlink(path); + if (result < 0) { + LOG_ERROR(Kernel_Fs, "error = {}", *__Error()); + return ErrnoToSceKernelError(*__Error()); + } + return result; +} - LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, _readv); - LIB_FUNCTION("YSHRBRLn2pI", "libkernel", 1, "libkernel", 1, 1, _writev); - LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, posix_lseek); +void RegisterFileSystem(Core::Loader::SymbolsResolver* sym) { + LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1, open); + LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open); + LIB_FUNCTION("wuCroIGjt2g", "libkernel", 1, "libkernel", 1, 1, posix_open); + LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); + LIB_FUNCTION("NNtFaKJbPt0", "libkernel", 1, "libkernel", 1, 1, close); + LIB_FUNCTION("bY-PO6JhzhQ", "libScePosix", 1, "libkernel", 1, 1, posix_close); + LIB_FUNCTION("bY-PO6JhzhQ", "libkernel", 1, "libkernel", 1, 1, posix_close); + LIB_FUNCTION("UK2Tl2DWUns", "libkernel", 1, "libkernel", 1, 1, sceKernelClose); + LIB_FUNCTION("FxVZqBAA7ks", "libkernel", 1, "libkernel", 1, 1, write); + LIB_FUNCTION("FN4gaPmuFV8", "libScePosix", 1, "libkernel", 1, 1, posix_write); + LIB_FUNCTION("FN4gaPmuFV8", "libkernel", 1, "libkernel", 1, 1, posix_write); + LIB_FUNCTION("4wSze92BhLI", "libkernel", 1, "libkernel", 1, 1, sceKernelWrite); + LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, readv); + LIB_FUNCTION("YSHRBRLn2pI", "libkernel", 1, "libkernel", 1, 1, writev); LIB_FUNCTION("Oy6IpwgtYOk", "libScePosix", 1, "libkernel", 1, 1, posix_lseek); + LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, posix_lseek); LIB_FUNCTION("oib76F-12fk", "libkernel", 1, "libkernel", 1, 1, sceKernelLseek); - LIB_FUNCTION("Cg4srZ6TKbU", "libkernel", 1, "libkernel", 1, 1, sceKernelRead); + LIB_FUNCTION("DRuBt2pvICk", "libkernel", 1, "libkernel", 1, 1, read); LIB_FUNCTION("AqBioC2vF3I", "libScePosix", 1, "libkernel", 1, 1, posix_read); - LIB_FUNCTION("1-LFLmRFxxM", "libkernel", 1, "libkernel", 1, 1, sceKernelMkdir); + LIB_FUNCTION("AqBioC2vF3I", "libkernel", 1, "libkernel", 1, 1, posix_read); + LIB_FUNCTION("Cg4srZ6TKbU", "libkernel", 1, "libkernel", 1, 1, sceKernelRead); LIB_FUNCTION("JGMio+21L4c", "libScePosix", 1, "libkernel", 1, 1, posix_mkdir); LIB_FUNCTION("JGMio+21L4c", "libkernel", 1, "libkernel", 1, 1, posix_mkdir); - LIB_FUNCTION("naInUjYt3so", "libkernel", 1, "libkernel", 1, 1, sceKernelRmdir); + LIB_FUNCTION("1-LFLmRFxxM", "libkernel", 1, "libkernel", 1, 1, sceKernelMkdir); LIB_FUNCTION("c7ZnT7V1B98", "libScePosix", 1, "libkernel", 1, 1, posix_rmdir); LIB_FUNCTION("c7ZnT7V1B98", "libkernel", 1, "libkernel", 1, 1, posix_rmdir); - LIB_FUNCTION("eV9wAD2riIA", "libkernel", 1, "libkernel", 1, 1, sceKernelStat); - LIB_FUNCTION("kBwCPsYX-m4", "libkernel", 1, "libkernel", 1, 1, sceKernelFStat); - LIB_FUNCTION("mqQMh1zPPT8", "libScePosix", 1, "libkernel", 1, 1, posix_fstat); - LIB_FUNCTION("mqQMh1zPPT8", "libkernel", 1, "libkernel", 1, 1, posix_fstat); - LIB_FUNCTION("VW3TVZiM4-E", "libkernel", 1, "libkernel", 1, 1, sceKernelFtruncate); - LIB_FUNCTION("52NcYU9+lEo", "libkernel", 1, "libkernel", 1, 1, sceKernelRename); - + LIB_FUNCTION("naInUjYt3so", "libkernel", 1, "libkernel", 1, 1, sceKernelRmdir); LIB_FUNCTION("E6ao34wPw+U", "libScePosix", 1, "libkernel", 1, 1, posix_stat); LIB_FUNCTION("E6ao34wPw+U", "libkernel", 1, "libkernel", 1, 1, posix_stat); - LIB_FUNCTION("+r3rMFwItV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPread); - LIB_FUNCTION("yTj62I7kw4s", "libkernel", 1, "libkernel", 1, 1, sceKernelPreadv); + LIB_FUNCTION("eV9wAD2riIA", "libkernel", 1, "libkernel", 1, 1, sceKernelStat); LIB_FUNCTION("uWyW3v98sU4", "libkernel", 1, "libkernel", 1, 1, sceKernelCheckReachability); - LIB_FUNCTION("fTx66l5iWIA", "libkernel", 1, "libkernel", 1, 1, sceKernelFsync); - LIB_FUNCTION("juWbTNM+8hw", "libkernel", 1, "libkernel", 1, 1, posix_fsync); + LIB_FUNCTION("mqQMh1zPPT8", "libScePosix", 1, "libkernel", 1, 1, posix_fstat); + LIB_FUNCTION("mqQMh1zPPT8", "libkernel", 1, "libkernel", 1, 1, posix_fstat); + LIB_FUNCTION("kBwCPsYX-m4", "libkernel", 1, "libkernel", 1, 1, sceKernelFstat); + LIB_FUNCTION("ih4CD9-gghM", "libkernel", 1, "libkernel", 1, 1, posix_ftruncate); + LIB_FUNCTION("VW3TVZiM4-E", "libkernel", 1, "libkernel", 1, 1, sceKernelFtruncate); + LIB_FUNCTION("52NcYU9+lEo", "libkernel", 1, "libkernel", 1, 1, sceKernelRename); + LIB_FUNCTION("yTj62I7kw4s", "libkernel", 1, "libkernel", 1, 1, sceKernelPreadv); + LIB_FUNCTION("ezv-RSBNKqI", "libScePosix", 1, "libkernel", 1, 1, posix_pread); + LIB_FUNCTION("ezv-RSBNKqI", "libkernel", 1, "libkernel", 1, 1, posix_pread); + LIB_FUNCTION("+r3rMFwItV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPread); LIB_FUNCTION("juWbTNM+8hw", "libScePosix", 1, "libkernel", 1, 1, posix_fsync); + LIB_FUNCTION("juWbTNM+8hw", "libkernel", 1, "libkernel", 1, 1, posix_fsync); + LIB_FUNCTION("fTx66l5iWIA", "libkernel", 1, "libkernel", 1, 1, sceKernelFsync); LIB_FUNCTION("j2AIqSqJP0w", "libkernel", 1, "libkernel", 1, 1, sceKernelGetdents); + LIB_FUNCTION("sfKygSjIbI8", "libkernel", 1, "libkernel", 1, 1, getdirentries); LIB_FUNCTION("taRWhTJFTgE", "libkernel", 1, "libkernel", 1, 1, sceKernelGetdirentries); + LIB_FUNCTION("C2kJ-byS5rM", "libkernel", 1, "libkernel", 1, 1, posix_pwrite); LIB_FUNCTION("nKWi-N2HBV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPwrite); LIB_FUNCTION("AUXVxWeJU-A", "libkernel", 1, "libkernel", 1, 1, sceKernelUnlink); - - // openOrbis (to check if it is valid out of OpenOrbis - LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1, - posix_open); // _open should be equal to open function } } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/file_system.h b/src/core/libraries/kernel/file_system.h index 1838df2fe..77ce3ec3d 100644 --- a/src/core/libraries/kernel/file_system.h +++ b/src/core/libraries/kernel/file_system.h @@ -65,10 +65,10 @@ constexpr int ORBIS_KERNEL_O_DSYNC = 0x1000; constexpr int ORBIS_KERNEL_O_DIRECT = 0x00010000; constexpr int ORBIS_KERNEL_O_DIRECTORY = 0x00020000; -s64 PS4_SYSV_ABI sceKernelWrite(int d, const void* buf, size_t nbytes); -s64 PS4_SYSV_ABI sceKernelRead(int d, void* buf, size_t nbytes); -s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset); -s64 PS4_SYSV_ABI sceKernelPwrite(int d, void* buf, size_t nbytes, s64 offset); +s64 PS4_SYSV_ABI sceKernelWrite(s32 fd, const void* buf, size_t nbytes); +s64 PS4_SYSV_ABI sceKernelRead(s32 fd, void* buf, size_t nbytes); +s64 PS4_SYSV_ABI sceKernelPread(s32 fd, void* buf, size_t nbytes, s64 offset); +s64 PS4_SYSV_ABI sceKernelPwrite(s32 fd, void* buf, size_t nbytes, s64 offset); void RegisterFileSystem(Core::Loader::SymbolsResolver* sym); } // namespace Libraries::Kernel diff --git a/src/core/libraries/kernel/kernel.cpp b/src/core/libraries/kernel/kernel.cpp index 2b7735219..9227cf45a 100644 --- a/src/core/libraries/kernel/kernel.cpp +++ b/src/core/libraries/kernel/kernel.cpp @@ -85,17 +85,23 @@ int ErrnoToSceKernelError(int error) { } void SetPosixErrno(int e) { - // Some error numbers are different between supported OSes or the PS4 + // Some error numbers are different between supported OSes switch (e) { case EPERM: g_posix_errno = POSIX_EPERM; break; - case EAGAIN: - g_posix_errno = POSIX_EAGAIN; + case ENOENT: + g_posix_errno = POSIX_ENOENT; + break; + case EDEADLK: + g_posix_errno = POSIX_EDEADLK; break; case ENOMEM: g_posix_errno = POSIX_ENOMEM; break; + case EACCES: + g_posix_errno = POSIX_EACCES; + break; case EINVAL: g_posix_errno = POSIX_EINVAL; break; @@ -105,13 +111,14 @@ void SetPosixErrno(int e) { case ERANGE: g_posix_errno = POSIX_ERANGE; break; - case EDEADLK: - g_posix_errno = POSIX_EDEADLK; + case EAGAIN: + g_posix_errno = POSIX_EAGAIN; break; case ETIMEDOUT: g_posix_errno = POSIX_ETIMEDOUT; break; default: + LOG_WARNING(Kernel, "Unhandled errno {}", e); g_posix_errno = e; } } @@ -133,14 +140,6 @@ void PS4_SYSV_ABI sceLibcHeapGetTraceInfo(HeapInfoInfo* info) { info->getSegmentInfo = 0; } -s64 PS4_SYSV_ABI ps4__write(int d, const char* buf, std::size_t nbytes) { - return sceKernelWrite(d, buf, nbytes); -} - -s64 PS4_SYSV_ABI ps4__read(int d, void* buf, u64 nbytes) { - return sceKernelRead(d, buf, nbytes); -} - struct OrbisKernelUuid { u32 timeLow; u16 timeMid; @@ -229,13 +228,10 @@ void RegisterKernel(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("Xjoosiw+XPI", "libkernel", 1, "libkernel", 1, 1, sceKernelUuidCreate); LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail); LIB_FUNCTION("9BcDykPmo1I", "libkernel", 1, "libkernel", 1, 1, __Error); - LIB_FUNCTION("DRuBt2pvICk", "libkernel", 1, "libkernel", 1, 1, ps4__read); LIB_FUNCTION("k+AXqu2-eBc", "libkernel", 1, "libkernel", 1, 1, posix_getpagesize); LIB_FUNCTION("k+AXqu2-eBc", "libScePosix", 1, "libkernel", 1, 1, posix_getpagesize); LIB_FUNCTION("NWtTN10cJzE", "libSceLibcInternalExt", 1, "libSceLibcInternal", 1, 1, sceLibcHeapGetTraceInfo); - LIB_FUNCTION("FxVZqBAA7ks", "libkernel", 1, "libkernel", 1, 1, ps4__write); - LIB_FUNCTION("FN4gaPmuFV8", "libScePosix", 1, "libkernel", 1, 1, ps4__write); } } // namespace Libraries::Kernel From 69cb4d5787a25c98ec7e89a6c17f0c2acef1b1c8 Mon Sep 17 00:00:00 2001 From: Ked <58560148+k3dr1@users.noreply.github.com> Date: Thu, 27 Mar 2025 00:04:05 +0800 Subject: [PATCH 438/455] Show a dialog only if no game directories are set (#2690) * Slightly changed how allInstallDirsDisabled is determined * Show a dialog only if no game directories are set * Changed a comment * Fixed formatting --- src/qt_gui/main.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/qt_gui/main.cpp b/src/qt_gui/main.cpp index 34e429368..bd9dca6ce 100644 --- a/src/qt_gui/main.cpp +++ b/src/qt_gui/main.cpp @@ -157,12 +157,8 @@ int main(int argc, char* argv[]) { } } - bool allInstallDirsDisabled = - std::ranges::all_of(Config::getGameInstallDirsEnabled(), [](bool val) { return !val; }); - - // If no game directory is set and no command line argument, prompt for it - if (Config::getGameInstallDirs().empty() && allInstallDirsDisabled && - !has_command_line_argument) { + // If no game directories are set and no command line argument, prompt for it + if (Config::getGameInstallDirsEnabled().empty() && !has_command_line_argument) { GameInstallDialog dlg; dlg.exec(); } From 90b949b8ceded997d3066201fe07d6e04fd439fb Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 26 Mar 2025 18:04:49 +0200 Subject: [PATCH 439/455] New Crowdin updates (#2679) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Russian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Swedish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Arabic) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Arabic) * New translations en_us.ts (Turkish) * New translations en_us.ts (Turkish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Albanian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Arabic) * New translations en_us.ts (Arabic) * New translations en_us.ts (Polish) * New translations en_us.ts (Polish) * New translations en_us.ts (Arabic) --- src/qt_gui/translations/ar_SA.ts | 382 ++++++++++++++++--------------- src/qt_gui/translations/da_DK.ts | 12 + src/qt_gui/translations/de_DE.ts | 12 + src/qt_gui/translations/el_GR.ts | 12 + src/qt_gui/translations/es_ES.ts | 12 + src/qt_gui/translations/fa_IR.ts | 12 + src/qt_gui/translations/fi_FI.ts | 12 + src/qt_gui/translations/fr_FR.ts | 12 + src/qt_gui/translations/hu_HU.ts | 12 + src/qt_gui/translations/id_ID.ts | 12 + src/qt_gui/translations/it_IT.ts | 12 + src/qt_gui/translations/ja_JP.ts | 12 + src/qt_gui/translations/ko_KR.ts | 12 + src/qt_gui/translations/lt_LT.ts | 34 ++- src/qt_gui/translations/nb_NO.ts | 12 + src/qt_gui/translations/nl_NL.ts | 12 + src/qt_gui/translations/pl_PL.ts | 166 +++++++------- src/qt_gui/translations/pt_BR.ts | 12 + src/qt_gui/translations/pt_PT.ts | 98 ++++---- src/qt_gui/translations/ro_RO.ts | 12 + src/qt_gui/translations/ru_RU.ts | 12 + src/qt_gui/translations/sq_AL.ts | 12 + src/qt_gui/translations/sv_SE.ts | 12 + src/qt_gui/translations/tr_TR.ts | 12 + src/qt_gui/translations/uk_UA.ts | 12 + src/qt_gui/translations/vi_VN.ts | 12 + src/qt_gui/translations/zh_CN.ts | 12 + src/qt_gui/translations/zh_TW.ts | 12 + 28 files changed, 652 insertions(+), 316 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 090cd4c26..ac6920ea0 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -22,7 +22,7 @@ CheatsPatches Cheats / Patches for - Cheats / Patches for + الغِشّ / التصحيحات Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -407,194 +407,194 @@ ControlSettings Configure Controls - Configure Controls + تعديل عناصر التحكم D-Pad - D-Pad + الأسهم+عصا التحكم Up - Up + فوق Left - Left + يسار Right - Right + يمين Down - Down + تحت Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + مدى تسجيل الإدخال للعصا اليسرى (التلقائي:2 حد أقصى:127) Left Deadzone - Left Deadzone + إعدادات مدى تسجيل الإدخال لعصا التحكم اليسرى Left Stick - Left Stick + عصا التحكم اليسرى Config Selection - Config Selection + تحديد الإعدادات Common Config - Common Config + إعدادات عامة Use per-game configs - Use per-game configs + استخدام إعدادات كل لُعْبَة L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT Back - Back + رجوع R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + الخيارات / البَدْء R3 - R3 + R3 Face Buttons - Face Buttons + الأزرار Triangle / Y - Triangle / Y + مثلث / Y Square / X - Square / X + مربع / X Circle / B - Circle / B + دائرة / B Cross / A - Cross / A + إكس / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + مدى تسجيل الإدخال للعصا اليمنى (التلقائي:2 حد أقصى:127) Right Deadzone - Right Deadzone + إعدادات مدى تسجيل الإدخال لعصا التحكم اليمنى Right Stick - Right Stick + عصا التحكم اليمنى Color Adjustment - Color Adjustment + تعديل الألوان R: - R: + أحمر: G: - G: + أخضر: B: - B: + أزرق: Override Lightbar Color - Override Lightbar Color + تجاوز لون شريط الإضاءة Override Color - Override Color + تجاوز اللون Unable to Save - Unable to Save + غير قادر على الحفظ Cannot bind axis values more than once - Cannot bind axis values more than once + لا يمكن ربط قيم المحور أكثر من مرة Save - Save + حفظ Apply - Apply + تطبيق Restore Defaults - Restore Defaults + استعادة الإعدادات الافتراضية Cancel - Cancel + إلغاء EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + تحرير أزرار الإدخال للوحة المفاتيح و الفأرة ووحدة التحكم Use Per-Game configs - Use Per-Game configs + استخدام إعدادات كل لُعْبَة Error - Error + خطأ Could not open the file for reading - Could not open the file for reading + تعذر فتح المِلَفّ للقراءة Could not open the file for writing - Could not open the file for writing + تعذر فتح المِلَفّ للكتابة Save Changes - Save Changes + حفظ التغييرات Do you want to save changes? - Do you want to save changes? + هل تريد حفظ التغييرات؟ Help @@ -602,15 +602,15 @@ Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + هل تريد إعادة تعيين الإعدادات الافتراضية المخصصة الخاصة بك إلى الإعدادات الافتراضية الأصلية؟ Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + هل تريد إعادة تعيين هذا الإعداد إلى الإعداد الافتراضي المخصص لك؟ Reset to Default - Reset to Default + إعادة تعيين إلى الافتراضي @@ -702,43 +702,43 @@ Never Played - Never Played + لم تلعب أبداً h - h + ا m - m + ة s - s + ثانية/ثواني Compatibility is untested - Compatibility is untested + التوافق غير مختبر Game does not initialize properly / crashes the emulator - Game does not initialize properly / crashes the emulator + اللعبة لا تهيئ بشكل صحيح / تعطل المحاكي Game boots, but only displays a blank screen - Game boots, but only displays a blank screen + اللعبة تبدأ بالعمل، ولكن فقط تعرض شاشة فارغة Game displays an image but does not go past the menu - Game displays an image but does not go past the menu + اللعبة تعرض صورة ولكن لا تتجاوز القائمة Game has game-breaking glitches or unplayable performance - Game has game-breaking glitches or unplayable performance + اللعبة بها قلتشات أو أداء غير قابل للتشغيل Game can be completed with playable performance and no major glitches - Game can be completed with playable performance and no major glitches + يمكن الانتهاء من اللعبة مع الأداء القابل للتشغيل و لا توجد قلتشات كبيرة Click to see details on github @@ -753,23 +753,23 @@ GameListUtils B - B + بايت KB - KB + كيلو بايت MB - MB + ميغابايت GB - GB + جيجابايت TB - TB + تيرابايت @@ -820,11 +820,11 @@ Copy Version - Copy Version + إصدار النسخة Copy Size - Copy Size + حجم النسخة Copy All @@ -832,39 +832,39 @@ Delete... - Delete... + حذف... Delete Game - Delete Game + حذف اللعبة Delete Update - Delete Update + حذف التحديث Delete DLC - Delete DLC + حذف DLC Delete Trophy - Delete Trophy + حذف الكؤوس Compatibility... - Compatibility... + التوافق... Update database - Update database + تحديث قاعدة البيانات View report - View report + عرض التقرير Submit a report - Submit a report + إرسال بلاغ Shortcut creation @@ -888,94 +888,94 @@ Game - Game + اللعبة This game has no update to delete! - This game has no update to delete! + لا تحتوي اللعبة على تحديث لحذفه! Update - Update + تحديث This game has no DLC to delete! - This game has no DLC to delete! + لا تحتوي اللعبة على DLC لحذفه! DLC - DLC + DLC Delete %1 - Delete %1 + حذف %1 Are you sure you want to delete %1's %2 directory? - Are you sure you want to delete %1's %2 directory? + هل أنت متأكد من أنك تريد حذف دليل %1's %2؟ Open Update Folder - Open Update Folder + فتح مجلد التحديث Delete Save Data - Delete Save Data + حذف التخزينه This game has no update folder to open! - This game has no update folder to open! + لا تحتوي اللعبة على تحديث لفتحه! No log file found for this game! - No log file found for this game! + لم يتم العثور على ملف سجل لهذه اللعبة! Failed to convert icon. - Failed to convert icon. + فشل تحويل الأيقونة. This game has no save data to delete! - This game has no save data to delete! + هذه اللعبة لا تحتوي على أي تخزينات لحذفها! This game has no saved trophies to delete! - This game has no saved trophies to delete! + هذه اللعبة ليس لديها كؤوس محفوظة للحذف! Save Data - Save Data + حفظ البيانات Trophy - Trophy + الكؤوس SFO Viewer for - SFO Viewer for + عارض SFO لـ HelpDialog Quickstart - Quickstart + التشغيل السريع FAQ - FAQ + الأسئلة الأكثر شيوعاً Syntax - Syntax + الصّيغة Special Bindings - Special Bindings + إدخالات خاصة Keybindings - Keybindings + أزرار التحكم @@ -986,178 +986,178 @@ Select which directory you want to install to. - Select which directory you want to install to. + حدد الدليل الذي تريد تثبيت إليه. Install All Queued to Selected Folder - Install All Queued to Selected Folder + تثبيت كل قائمة الانتظار إلى المجلد المحدد Delete PKG File on Install - Delete PKG File on Install + حذف مِلَفّ PKG عند التثبيت KBMSettings Configure Controls - Configure Controls + تعديل عناصر التحكم D-Pad - D-Pad + الأسهم+عصا التحكم Up - Up + أعلى unmapped - unmapped + غير معين Left - Left + يسار Right - Right + يمين Down - Down + أسفل Left Analog Halfmode - Left Analog Halfmode + تقليل سرعة عصا التحكم اليسرى للنصف hold to move left stick at half-speed - hold to move left stick at half-speed + الاستمرار للتحرك إلى اليسار بنصف السرعة Left Stick - Left Stick + عصا التحكم اليسرى Config Selection - Config Selection + تحديد الإعدادات Common Config - Common Config + إعدادات عامة Use per-game configs - Use per-game configs + استخدام إعدادات كل لُعْبَة L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + محرر النص Help - Help + المساعدة R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + النقر على لوحة اللمس Mouse to Joystick - Mouse to Joystick + الفأرة إلى عصا التحكم *press F7 ingame to activate - *press F7 ingame to activate + * اضغط على F7 للتفعيل R3 - R3 + R3 Options - Options + الخيارات Mouse Movement Parameters - Mouse Movement Parameters + معطيات حركة الفأرة note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + ملاحظة: انقر فوق زر المساعدة/روابط المفاتيح الخاصة للحصول على مزيد من المعلومات Face Buttons - Face Buttons + أزرار الوجه Triangle - Triangle + مثلث Square - Square + مربع Circle - Circle + دائرة Cross - Cross + اكس Right Analog Halfmode - Right Analog Halfmode + تقليل سرعة عصا التحكم اليمنى للنصف hold to move right stick at half-speed - hold to move right stick at half-speed + الضغط باستمرار لتحريك العصا اليمنى بنصف السرعة Right Stick - Right Stick + عصا التحكم اليمنى Speed Offset (def 0.125): - Speed Offset (def 0.125): + إزاحة السرعة (تلقائي 0.125): Copy from Common Config - Copy from Common Config + نسخ من الإعدادات الشائعة Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + معدل مضاعفة السرعة (التلقائي 1.0): Common Config Selected - Common Config Selected + الإعدادات الشائعة محدده This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. @@ -1165,7 +1165,7 @@ Copy values from Common Config - Copy values from Common Config + نسخ من الإعدادات الشائعة Do you want to overwrite existing mappings with the mappings from the Common Config? @@ -1173,39 +1173,39 @@ Unable to Save - Unable to Save + غير قادر على الحفظ Cannot bind any unique input more than once - Cannot bind any unique input more than once + لا يمكن ربط أي إدخال فريد أكثر من مرة Press a key - Press a key + اضغط على مفتاح Cannot set mapping - Cannot set mapping + لا يمكن تعيين الأزرار Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + عجلة الفأرة لا يمكن تعيينها لعصا التحكم Save - Save + حفظ Apply - Apply + تطبيق Restore Defaults - Restore Defaults + استعادة الإعدادات الافتراضية Cancel - Cancel + إلغاء @@ -1244,7 +1244,7 @@ Open shadPS4 Folder - Open shadPS4 Folder + فتح مجلد shadPS4 Exit @@ -1306,6 +1306,14 @@ Dump Game List تفريغ قائمة الألعاب + + Trophy Viewer + عارض الجوائز + + + No games found. Please add your games to your library first. + لم يتم العثور على ألعاب. الرجاء إضافة ألعابك إلى مكتبتك أولاً. + PKG Viewer عارض PKG @@ -1484,27 +1492,27 @@ Run Game - Run Game + تشغيل اللعبة Eboot.bin file not found - Eboot.bin file not found + لم يتم العثور على ملف Eboot.bin PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) + ملف PKG (*.PKG *.pkg) PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! + PKG هو تصحيح أو DLC، يرجى تثبيت اللعبة أولاً! Game is already running! - Game is already running! + اللعبة قيد التشغيل بالفعل! shadPS4 - shadPS4 + shadPS4 @@ -1527,7 +1535,7 @@ Installed - Installed + مثبت Size @@ -1535,15 +1543,15 @@ Category - Category + الفئة Type - Type + النوع App Ver - App Ver + إصدار FW @@ -1630,7 +1638,7 @@ Trophy - Trophy + الكؤوس Open the custom trophy images/sounds folder @@ -2094,23 +2102,23 @@ Display Mode - Display Mode + طريقة العرض Windowed - Windowed + نافذة Fullscreen - Fullscreen + شاشة كاملة Fullscreen (Borderless) - Fullscreen (Borderless) + شاشة كاملة (دون حدود) Window Size - Window Size + حجم النافذة W: @@ -2122,7 +2130,7 @@ Separate Log Files - Separate Log Files + ملفات السجل المنفصل Separate Log Files:\nWrites a separate logfile for each game. @@ -2130,35 +2138,35 @@ Trophy Notification Position - Trophy Notification Position + موقع إشعار الكأس Left - Left + يسار Right - Right + يمين Top - Top + في الأعلى Bottom - Bottom + الأسفل Notification Duration - Notification Duration + مدة الإشعار Portable User Folder - Portable User Folder + مجلد المستخدم المتنقل Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + إنشاء مجلد مستخدم المتنقل من مجلد المستخدم الشائع Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. @@ -2166,11 +2174,11 @@ Cannot create portable user folder - Cannot create portable user folder + لا يمكن إنشاء مجلد المستخدم المتنقل %1 already exists - %1 already exists + %1 موجود مسبقاً Portable user folder created @@ -2178,7 +2186,7 @@ %1 successfully created. - %1 successfully created. + تم إنشاء %1 بنجاح. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. @@ -2191,21 +2199,25 @@ Trophy Viewer عارض الجوائز + + Select Game: + اختر الُعْبَه: + Progress - Progress + مقدار التقدُّم Show Earned Trophies - Show Earned Trophies + عرض الكؤوس المكتسبة Show Not Earned Trophies - Show Not Earned Trophies + عرض الكؤوس غير المكتسبة Show Hidden Trophies - Show Hidden Trophies + عرض الكؤوس المخفية diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 113d13019..1835ba84c 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 7f395c1c8..6717a93ef 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -1306,6 +1306,14 @@ Dump Game List Spielliste ausgeben + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG-Anschauer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophäenansicht + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index a61d84022..6e1adaac9 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index be3c701a9..24844d0a2 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1306,6 +1306,14 @@ Dump Game List Volcar Lista de Juegos + + Trophy Viewer + Expositor de Trofeos + + + No games found. Please add your games to your library first. + No se encontraron juegos. Por favor, añade tus juegos a tu biblioteca primero. + PKG Viewer Vista PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Expositor de Trofeos + + Select Game: + Selecciona un Juego: + Progress Progreso diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 6984b29f8..6b7af042e 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1306,6 +1306,14 @@ Dump Game List استخراج لیست بازی ها + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG مشاهده گر @@ -2191,6 +2199,10 @@ Trophy Viewer مشاهده جوایز + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 81274ae80..324cb6c49 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -1306,6 +1306,14 @@ Dump Game List Kirjoita Pelilista Tiedostoon + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Selain @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Selain + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index ff1646f9e..ec3f9f8b5 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -1306,6 +1306,14 @@ Dump Game List Dumper la liste des jeux + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer Visionneuse PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Visionneuse de trophées + + Select Game: + Select Game: + Progress Progression diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index c22d74257..6672337a6 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1306,6 +1306,14 @@ Dump Game List Játéklista Dumpolása + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Nézegető @@ -2191,6 +2199,10 @@ Trophy Viewer Trófeák Megtekintése + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 1a8b085cf..e43d31976 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 5f57efca3..e63da05b8 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -1306,6 +1306,14 @@ Dump Game List Scarica Lista Giochi + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer Visualizzatore PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Visualizzatore Trofei + + Select Game: + Select Game: + Progress Progresso diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index d93e36770..7cf9fc5c2 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1306,6 +1306,14 @@ Dump Game List ゲームリストをダンプ + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKGビューアー @@ -2191,6 +2199,10 @@ Trophy Viewer トロフィービューアー + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index dc5b61038..d5289ace9 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 2f4b6e59b..17133da35 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -7,7 +7,7 @@ AboutDialog About shadPS4 - About shadPS4 + Apie shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. @@ -15,7 +15,7 @@ This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + Ši programa neturėtų būti naudojama žaidimams kurių neturite legaliai įsigiję. @@ -463,7 +463,7 @@ Back - Back + Atgal R1 / RB @@ -519,7 +519,7 @@ Color Adjustment - Color Adjustment + Spalvų Reguliavimas R: @@ -543,7 +543,7 @@ Unable to Save - Unable to Save + Nepavyko Išsaugoti Cannot bind axis values more than once @@ -563,7 +563,7 @@ Cancel - Cancel + Atšaukti @@ -590,15 +590,15 @@ Save Changes - Save Changes + Išsaugoti Pakeitimus Do you want to save changes? - Do you want to save changes? + Ar norite išsaugoti pakeitimus? Help - Help + Pagalba Do you want to reset your custom default config to the original default config? @@ -876,7 +876,7 @@ Error - Error + Klaida Error creating shortcut! @@ -888,7 +888,7 @@ Game - Game + Žaidimas This game has no update to delete! @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index b257b548b..e8ce99f90 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump spilliste + + Trophy Viewer + Troféviser + + + No games found. Please add your games to your library first. + Fant ingen spill. Legg til spillene dine i biblioteket først. + PKG Viewer PKG-viser @@ -2191,6 +2199,10 @@ Trophy Viewer Troféviser + + Select Game: + Velg spill: + Progress Fremdrift diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index f6c062da3..5c1725bd5 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 4c4a33ec2..033412efa 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -543,38 +543,38 @@ Unable to Save - Unable to Save + Zapisywanie nie powiodło się Cannot bind axis values more than once - Cannot bind axis values more than once + Nie można powiązać wartości osi więcej niż raz Save - Save + Zapisz Apply - Apply + Zastosuj Restore Defaults - Restore Defaults + Przywróć ustawienia domyślne Cancel - Cancel + Anuluj EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Edytuj przypisanie klawiszy klawiatury + myszy oraz kontrolera Use Per-Game configs - Use Per-Game configs + Użyj osobnej konfiguracji dla każdej gry Error @@ -582,11 +582,11 @@ Could not open the file for reading - Could not open the file for reading + Nie można otworzyć pliku do odczytu Could not open the file for writing - Could not open the file for writing + Nie można otworzyć pliku do zapisu Save Changes @@ -602,11 +602,11 @@ Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Czy chcesz zresetować Twoją domyślną konfigurację do oryginalnej domyślnej konfiguracji? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Czy chcesz zresetować tę konfigurację do Twojej domyślnej konfiguracji? Reset to Default @@ -959,23 +959,23 @@ HelpDialog Quickstart - Quickstart + Szybki start FAQ - FAQ + Najczęściej zadawane pytania Syntax - Syntax + Składnia Special Bindings - Special Bindings + Specjalne wiązania Keybindings - Keybindings + Przypisanie klawiszy @@ -1001,211 +1001,211 @@ KBMSettings Configure Controls - Configure Controls + Skonfiguruj sterowanie D-Pad - D-Pad + Krzyżak Up - Up + Strzałka w górę unmapped - unmapped + nieprzypisane Left - Left + Strzałka w lewo Right - Right + Strzałka w prawo Down - Down + Strzałka w dół Left Analog Halfmode - Left Analog Halfmode + Połowiczny tryb lewego drążka hold to move left stick at half-speed - hold to move left stick at half-speed + przytrzymaj, aby przesuwać lewy drążek dwa razy wolniej Left Stick - Left Stick + Lewy drążek Config Selection - Config Selection + Wybór konfiguracji Common Config - Common Config + Typowa konfiguracja Use per-game configs - Use per-game configs + Użyj osobnej konfiguracji dla każdej gry L1 - L1 + L1 L2 - L2 + L2 Text Editor - Text Editor + Edytor tekstu Help - Help + Pomoc R1 - R1 + R1 R2 - R2 + R2 L3 - L3 + L3 Touchpad Click - Touchpad Click + Kliknięcie Touchpada Mouse to Joystick - Mouse to Joystick + Mysz na Joystick *press F7 ingame to activate - *press F7 ingame to activate + *naciśnij F7 w grze aby aktywować R3 - R3 + R3 Options - Options + Opcje Mouse Movement Parameters - Mouse Movement Parameters + Parametry ruchu myszy note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + uwaga: kliknij przycisk Pomoc/Specjalne skróty klawiszowe, aby uzyskać więcej informacji Face Buttons - Face Buttons + Przednie przyciski Triangle - Triangle + Trójkąt Square - Square + Kwadrat Circle - Circle + Kółko Cross - Cross + Krzyżyk Right Analog Halfmode - Right Analog Halfmode + Połowiczny tryb prawego drążka hold to move right stick at half-speed - hold to move right stick at half-speed + przytrzymaj, aby przesuwać prawy drążek dwa razy wolniej Right Stick - Right Stick + Prawy drążek Speed Offset (def 0.125): - Speed Offset (def 0.125): + Offset prędkości (def 0,125): Copy from Common Config - Copy from Common Config + Kopiuj z typowej konfiguracji Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Offset martwych stref (def 0,50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Mnożnik prędkości (def1.0): Common Config Selected - Common Config Selected + Wybrano typową konfigurację This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Przycisk ten kopiuje mapowanie z typowej konfiguracji do aktualnie wybranego profilu, i nie może być użyty, gdy aktualnie wybranym profilem jest typowa konfiguracja. Copy values from Common Config - Copy values from Common Config + Kopiuj z typowej konfiguracji Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Czy chcesz nadpisać istniejące mapowania mapowaniem z typowej konfiguracji? Unable to Save - Unable to Save + Zapisywanie nie powiodło się Cannot bind any unique input more than once - Cannot bind any unique input more than once + Nie można powiązać żadnych unikalnych danych wejściowych więcej niż raz Press a key - Press a key + Naciśnij klawisz Cannot set mapping - Cannot set mapping + Nie można ustawić mapowania Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Kółko myszy nie może być przypisane do sterowania drążkiem Save - Save + Zapisz Apply - Apply + Zastosuj Restore Defaults - Restore Defaults + Przywróć ustawienia domyślne Cancel - Cancel + Anuluj @@ -1306,6 +1306,14 @@ Dump Game List Zgraj listę gier + + Trophy Viewer + Menedżer trofeów + + + No games found. Please add your games to your library first. + Nie znaleziono gier. Najpierw dodaj swoje gry do swojej biblioteki. + PKG Viewer Menedżer plików PKG @@ -2154,35 +2162,35 @@ Portable User Folder - Portable User Folder + Przenośny folder użytkownika Create Portable User Folder from Common User Folder - Create Portable User Folder from Common User Folder + Utwórz przenośny folder użytkownika ze zwykłego folderu użytkownika Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. - Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Przenośny folder użytkownika:\nPrzechowuje ustawienia shadPS4 i dane, które zostaną zastosowane tylko do kompilacji shadPS4 znajdującej się w bieżącym folderze. Uruchom ponownie aplikację po utworzeniu przenośnego folderu użytkownika, aby zacząć z niego korzystać. Cannot create portable user folder - Cannot create portable user folder + Nie można utworzyć przenośnego folderu użytkownika %1 already exists - %1 already exists + %1 już istnieje Portable user folder created - Portable user folder created + Utworzono przenośny folder użytkownika %1 successfully created. - %1 successfully created. + %1 prawidłowo utworzony. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Otwórz niestandardowy folder obrazów/dźwięków:\nMożesz dodać własne obrazy dla trofeów i ich dźwięki.\nDodaj pliki do custom_trophy o następujących nazwach:\ntrophy.wav LUB trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nUwaga: Dźwięki działają tylko w wersji QT. @@ -2191,6 +2199,10 @@ Trophy Viewer Menedżer trofeów + + Select Game: + Wybierz grę: + Progress Postęp diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index e37a3fe96..d44efce5d 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -1306,6 +1306,14 @@ Dump Game List Exportar Lista de Jogos + + Trophy Viewer + Visualizador de Troféus + + + No games found. Please add your games to your library first. + Nenhum jogo encontrado. Adicione seus jogos à sua biblioteca primeiro. + PKG Viewer Visualizador de PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Visualizador de Troféus + + Select Game: + Selecionar Jogo: + Progress Progresso diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index dc0059b86..455955fad 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -543,74 +543,74 @@ Unable to Save - Unable to Save + Não é possível salvar Cannot bind axis values more than once - Cannot bind axis values more than once + Não foi possível atribuir os valores do eixo X ou Y mais de uma vez Save - Save + Salvar Apply - Apply + Aplicar Restore Defaults - Restore Defaults + Restaurar o Padrão Cancel - Cancel + Cancelar EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Editar comandos do Teclado + Mouse e do Controle Use Per-Game configs - Use Per-Game configs + Use uma configuração para cada jogo Error - Error + Erro Could not open the file for reading - Could not open the file for reading + Não foi possível abrir o arquivo para ler Could not open the file for writing - Could not open the file for writing + Não foi possível abrir o arquivo para escrever Save Changes - Save Changes + Salvar mudanças Do you want to save changes? - Do you want to save changes? + Salvar as mudanças? Help - Help + Ajuda Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Restaurar a configuração customizada padrão para a configuração original padrão? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Deseja redefinir esta configuração para a configuração padrão personalizada? Reset to Default - Reset to Default + Resetar ao Padrão @@ -959,23 +959,23 @@ HelpDialog Quickstart - Quickstart + Início Rápido FAQ - FAQ + Perguntas Frequentes Syntax - Syntax + Sintaxe Special Bindings - Special Bindings + Atalhos Especiais Keybindings - Keybindings + Combinações de Teclas @@ -1145,67 +1145,67 @@ Copy from Common Config - Copy from Common Config + Copiar da Configuração Comum Deadzone Offset (def 0.50): - Deadzone Offset (def 0.50): + Deslocamento da Zona Morta (def 0,50): Speed Multiplier (def 1.0): - Speed Multiplier (def 1.0): + Multiplicador de Velocidade (def 1,0): Common Config Selected - Common Config Selected + Configuração Comum Selecionada This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. - This button copies mappings from the Common Config to the currently selected profile, and cannot be used when the currently selected profile is the Common Config. + Este botão copia mapeamentos da Configuração Comum para o perfil atualmente selecionado, e não pode ser usado quando o perfil atualmente selecionado é a Configuração Comum. Copy values from Common Config - Copy values from Common Config + Copiar valores da Configuração Comum Do you want to overwrite existing mappings with the mappings from the Common Config? - Do you want to overwrite existing mappings with the mappings from the Common Config? + Substituir mapeamentos existentes com os mapeamentos da Configuração Comum? Unable to Save - Unable to Save + Não é possível salvar Cannot bind any unique input more than once - Cannot bind any unique input more than once + Não é possível vincular qualquer entrada única mais de uma vez Press a key - Press a key + Pressione uma tecla Cannot set mapping - Cannot set mapping + Não é possível definir o mapeamento Mousewheel cannot be mapped to stick outputs - Mousewheel cannot be mapped to stick outputs + Roda do rato não pode ser mapeada para saídas empates Save - Save + Salvar Apply - Apply + Aplicar Restore Defaults - Restore Defaults + Restaurar Definições Cancel - Cancel + Cancelar @@ -1306,6 +1306,14 @@ Dump Game List Exportar Lista de Jogos + + Trophy Viewer + Visualizador de Troféus + + + No games found. Please add your games to your library first. + Nenhum jogo encontrado. Por favor, adicione os seus jogos à sua biblioteca primeiro. + PKG Viewer Visualizador PKG @@ -2166,23 +2174,23 @@ Cannot create portable user folder - Cannot create portable user folder + Não é possível criar pasta de utilizador portátil %1 already exists - %1 already exists + %1 já existe Portable user folder created - Portable user folder created + Pasta de utilizador portátil criada %1 successfully created. - %1 successfully created. + %1 criado com sucesso. Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.wav OR trophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Abra a pasta de imagens/sons de troféus personalizados:\nPoderá adicionar imagens personalizadas aos troféus e um áudio.\nAdicione os arquivos na pasta custom_trophy com os seguintes nomes:\ntrophy.mp3 ou trophy.wav, bronze.png, gold.png, platinum.png, silver.png\nObservação: O som funcionará apenas nas versões Qt. @@ -2191,6 +2199,10 @@ Trophy Viewer Visualizador de Troféus + + Select Game: + Escolha o Jogo: + Progress Progresso diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 4261bf9e2..9c7720e17 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 6ca16121f..68eaabc34 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1306,6 +1306,14 @@ Dump Game List Дамп списка игр + + Trophy Viewer + Просмотр трофеев + + + No games found. Please add your games to your library first. + Не найдено ни одной игры. Пожалуйста, сначала добавьте игры в библиотеку. + PKG Viewer Просмотр PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Просмотр трофеев + + Select Game: + Выберите игру: + Progress Прогресс diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index bf58dc60d..657f78d0d 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -1306,6 +1306,14 @@ Dump Game List Zbraz Listën e Lojërave + + Trophy Viewer + Shikuesi i Trofeve + + + No games found. Please add your games to your library first. + Nuk u gjetën lojëra. Shto lojërat në librarinë tënde fillimisht. + PKG Viewer Shikuesi i PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Shikuesi i Trofeve + + Select Game: + Zgjidh Lojën: + Progress Ecuria diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index d631859d4..a002b150a 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1306,6 +1306,14 @@ Dump Game List Dumpa spellista + + Trophy Viewer + Trofévisare + + + No games found. Please add your games to your library first. + Inga spel hittades. Lägg till dina spel till biblioteket först. + PKG Viewer PKG-visare @@ -2191,6 +2199,10 @@ Trophy Viewer Trofé-visare + + Select Game: + Välj spel: + Progress Förlopp diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 394704274..48ce4254d 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1306,6 +1306,14 @@ Dump Game List Oyun Listesini Kaydet + + Trophy Viewer + Kupa Görüntüleyici + + + No games found. Please add your games to your library first. + Oyun bulunamadı. Oyunlarınızı lütfen önce kütüphanenize ekleyin. + PKG Viewer PKG Görüntüleyici @@ -2191,6 +2199,10 @@ Trophy Viewer Kupa Görüntüleyici + + Select Game: + Oyun Seç: + Progress İlerleme diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 6083577fa..06c88428b 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1306,6 +1306,14 @@ Dump Game List Дамп списку ігор + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer Перегляд PKG @@ -2191,6 +2199,10 @@ Trophy Viewer Трофеї + + Select Game: + Select Game: + Progress Прогрес diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 8fa0889bc..c16604b85 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trình xem chiến tích + + Select Game: + Select Game: + Progress Progress diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 6e1fcdc95..6364ae1d6 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1306,6 +1306,14 @@ Dump Game List 导出游戏列表 + + Trophy Viewer + 奖杯查看器 + + + No games found. Please add your games to your library first. + 未找到游戏。请先将您的游戏添加到您的资料库。 + PKG Viewer PKG 查看器 @@ -2191,6 +2199,10 @@ Trophy Viewer 奖杯查看器 + + Select Game: + 选择游戏: + Progress 进度 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index 2950f541f..bd546380a 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1306,6 +1306,14 @@ Dump Game List Dump Game List + + Trophy Viewer + Trophy Viewer + + + No games found. Please add your games to your library first. + No games found. Please add your games to your library first. + PKG Viewer PKG Viewer @@ -2191,6 +2199,10 @@ Trophy Viewer Trophy Viewer + + Select Game: + Select Game: + Progress Progress From 3abe5b0d5774e2d7b959d85f51657144b3d822c7 Mon Sep 17 00:00:00 2001 From: Lizardy <6063922+lzardy@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:42:49 +0000 Subject: [PATCH 440/455] [Libs] Ngs2 (#1604) * [libSceNgs2] Logging & Structs * clang * clang * stdarg incl * proper logs * ngs2 latest * [libSceNgs2] Logging & Structs * clang * latest * fix includes * clang * clang --------- Co-authored-by: microsoftv <6063922+microsoftv@users.noreply.github.com> --- CMakeLists.txt | 18 + src/core/libraries/ngs2/ngs2.cpp | 682 ++++++++++++++------- src/core/libraries/ngs2/ngs2.h | 283 +++++++-- src/core/libraries/ngs2/ngs2_custom.cpp | 12 + src/core/libraries/ngs2/ngs2_custom.h | 444 ++++++++++++++ src/core/libraries/ngs2/ngs2_eq.cpp | 12 + src/core/libraries/ngs2/ngs2_eq.h | 41 ++ src/core/libraries/ngs2/ngs2_geom.cpp | 12 + src/core/libraries/ngs2/ngs2_geom.h | 80 +++ src/core/libraries/ngs2/ngs2_impl.cpp | 208 ++++--- src/core/libraries/ngs2/ngs2_impl.h | 179 +++++- src/core/libraries/ngs2/ngs2_mastering.cpp | 12 + src/core/libraries/ngs2/ngs2_mastering.h | 81 +++ src/core/libraries/ngs2/ngs2_pan.cpp | 12 + src/core/libraries/ngs2/ngs2_pan.h | 25 + src/core/libraries/ngs2/ngs2_report.cpp | 12 + src/core/libraries/ngs2/ngs2_report.h | 78 +++ src/core/libraries/ngs2/ngs2_reverb.cpp | 12 + src/core/libraries/ngs2/ngs2_reverb.h | 61 ++ src/core/libraries/ngs2/ngs2_sampler.cpp | 12 + src/core/libraries/ngs2/ngs2_sampler.h | 162 +++++ src/core/libraries/ngs2/ngs2_submixer.cpp | 12 + src/core/libraries/ngs2/ngs2_submixer.h | 126 ++++ 23 files changed, 2206 insertions(+), 370 deletions(-) create mode 100644 src/core/libraries/ngs2/ngs2_custom.cpp create mode 100644 src/core/libraries/ngs2/ngs2_custom.h create mode 100644 src/core/libraries/ngs2/ngs2_eq.cpp create mode 100644 src/core/libraries/ngs2/ngs2_eq.h create mode 100644 src/core/libraries/ngs2/ngs2_geom.cpp create mode 100644 src/core/libraries/ngs2/ngs2_geom.h create mode 100644 src/core/libraries/ngs2/ngs2_mastering.cpp create mode 100644 src/core/libraries/ngs2/ngs2_mastering.h create mode 100644 src/core/libraries/ngs2/ngs2_pan.cpp create mode 100644 src/core/libraries/ngs2/ngs2_pan.h create mode 100644 src/core/libraries/ngs2/ngs2_report.cpp create mode 100644 src/core/libraries/ngs2/ngs2_report.h create mode 100644 src/core/libraries/ngs2/ngs2_reverb.cpp create mode 100644 src/core/libraries/ngs2/ngs2_reverb.h create mode 100644 src/core/libraries/ngs2/ngs2_sampler.cpp create mode 100644 src/core/libraries/ngs2/ngs2_sampler.h create mode 100644 src/core/libraries/ngs2/ngs2_submixer.cpp create mode 100644 src/core/libraries/ngs2/ngs2_submixer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 185205221..1c0932b5c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -378,6 +378,24 @@ set(SYSTEM_LIBS src/core/libraries/system/commondialog.cpp src/core/libraries/ngs2/ngs2_error.h src/core/libraries/ngs2/ngs2_impl.cpp src/core/libraries/ngs2/ngs2_impl.h + src/core/libraries/ngs2/ngs2_custom.cpp + src/core/libraries/ngs2/ngs2_custom.h + src/core/libraries/ngs2/ngs2_reverb.cpp + src/core/libraries/ngs2/ngs2_reverb.h + src/core/libraries/ngs2/ngs2_geom.cpp + src/core/libraries/ngs2/ngs2_geom.h + src/core/libraries/ngs2/ngs2_pan.cpp + src/core/libraries/ngs2/ngs2_pan.h + src/core/libraries/ngs2/ngs2_report.cpp + src/core/libraries/ngs2/ngs2_report.h + src/core/libraries/ngs2/ngs2_eq.cpp + src/core/libraries/ngs2/ngs2_eq.h + src/core/libraries/ngs2/ngs2_mastering.cpp + src/core/libraries/ngs2/ngs2_mastering.h + src/core/libraries/ngs2/ngs2_sampler.cpp + src/core/libraries/ngs2/ngs2_sampler.h + src/core/libraries/ngs2/ngs2_submixer.cpp + src/core/libraries/ngs2/ngs2_submixer.h src/core/libraries/ajm/ajm_error.h src/core/libraries/audio3d/audio3d.cpp src/core/libraries/audio3d/audio3d.h diff --git a/src/core/libraries/ngs2/ngs2.cpp b/src/core/libraries/ngs2/ngs2.cpp index 7eb663413..0b42e2471 100644 --- a/src/core/libraries/ngs2/ngs2.cpp +++ b/src/core/libraries/ngs2/ngs2.cpp @@ -5,21 +5,480 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/ngs2/ngs2.h" +#include "core/libraries/ngs2/ngs2_custom.h" #include "core/libraries/ngs2/ngs2_error.h" +#include "core/libraries/ngs2/ngs2_geom.h" #include "core/libraries/ngs2/ngs2_impl.h" +#include "core/libraries/ngs2/ngs2_pan.h" +#include "core/libraries/ngs2/ngs2_report.h" namespace Libraries::Ngs2 { -int PS4_SYSV_ABI sceNgs2CalcWaveformBlock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); +// Ngs2 + +s32 PS4_SYSV_ABI sceNgs2CalcWaveformBlock(const OrbisNgs2WaveformFormat* format, u32 samplePos, + u32 numSamples, OrbisNgs2WaveformBlock* outBlock) { + LOG_INFO(Lib_Ngs2, "samplePos = {}, numSamples = {}", samplePos, numSamples); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2CustomRackGetModuleInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); +s32 PS4_SYSV_ABI sceNgs2GetWaveformFrameInfo(const OrbisNgs2WaveformFormat* format, + u32* outFrameSize, u32* outNumFrameSamples, + u32* outUnitsPerFrame, u32* outNumDelaySamples) { + LOG_INFO(Lib_Ngs2, "called"); return ORBIS_OK; } +s32 PS4_SYSV_ABI sceNgs2ParseWaveformData(const void* data, size_t dataSize, + OrbisNgs2WaveformInfo* outInfo) { + LOG_INFO(Lib_Ngs2, "dataSize = {}", dataSize); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2ParseWaveformFile(const char* path, u64 offset, + OrbisNgs2WaveformInfo* outInfo) { + LOG_INFO(Lib_Ngs2, "path = {}, offset = {}", path, offset); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2ParseWaveformUser(OrbisNgs2ParseReadHandler handler, uintptr_t userData, + OrbisNgs2WaveformInfo* outInfo) { + LOG_INFO(Lib_Ngs2, "userData = {}", userData); + if (!handler) { + LOG_ERROR(Lib_Ngs2, "handler is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackCreate(OrbisNgs2Handle systemHandle, u32 rackId, + const OrbisNgs2RackOption* option, + const OrbisNgs2ContextBufferInfo* bufferInfo, + OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "rackId = {}", rackId); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackCreateWithAllocator(OrbisNgs2Handle systemHandle, u32 rackId, + const OrbisNgs2RackOption* option, + const OrbisNgs2BufferAllocator* allocator, + OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "rackId = {}", rackId); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackDestroy(OrbisNgs2Handle rackHandle, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackGetInfo(OrbisNgs2Handle rackHandle, OrbisNgs2RackInfo* outInfo, + size_t infoSize) { + LOG_INFO(Lib_Ngs2, "infoSize = {}", infoSize); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackGetUserData(OrbisNgs2Handle rackHandle, uintptr_t* outUserData) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackGetVoiceHandle(OrbisNgs2Handle rackHandle, u32 voiceIndex, + OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "voiceIndex = {}", voiceIndex); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackLock(OrbisNgs2Handle rackHandle) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackQueryBufferSize(u32 rackId, const OrbisNgs2RackOption* option, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + LOG_INFO(Lib_Ngs2, "rackId = {}", rackId); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackSetUserData(OrbisNgs2Handle rackHandle, uintptr_t userData) { + LOG_INFO(Lib_Ngs2, "userData = {}", userData); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2RackUnlock(OrbisNgs2Handle rackHandle) { + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemCreate(const OrbisNgs2SystemOption* option, + const OrbisNgs2ContextBufferInfo* bufferInfo, + OrbisNgs2Handle* outHandle) { + s32 result; + OrbisNgs2ContextBufferInfo localInfo; + if (!bufferInfo || !outHandle) { + if (!bufferInfo) { + result = ORBIS_NGS2_ERROR_INVALID_BUFFER_INFO; + LOG_ERROR(Lib_Ngs2, "Invalid system buffer info {}", (void*)bufferInfo); + } else { + result = ORBIS_NGS2_ERROR_INVALID_OUT_ADDRESS; + LOG_ERROR(Lib_Ngs2, "Invalid system handle address {}", (void*)outHandle); + } + + // TODO: Report errors? + } else { + // Make bufferInfo copy + localInfo.hostBuffer = bufferInfo->hostBuffer; + localInfo.hostBufferSize = bufferInfo->hostBufferSize; + for (int i = 0; i < 5; i++) { + localInfo.reserved[i] = bufferInfo->reserved[i]; + } + localInfo.userData = bufferInfo->userData; + + result = SystemSetup(option, &localInfo, 0, outHandle); + } + + // TODO: API reporting? + + LOG_INFO(Lib_Ngs2, "called"); + return result; +} + +s32 PS4_SYSV_ABI sceNgs2SystemCreateWithAllocator(const OrbisNgs2SystemOption* option, + const OrbisNgs2BufferAllocator* allocator, + OrbisNgs2Handle* outHandle) { + s32 result; + if (allocator && allocator->allocHandler != 0) { + OrbisNgs2BufferAllocHandler hostAlloc = allocator->allocHandler; + if (outHandle) { + OrbisNgs2BufferFreeHandler hostFree = allocator->freeHandler; + OrbisNgs2ContextBufferInfo* bufferInfo = 0; + result = SystemSetup(option, bufferInfo, 0, 0); + if (result >= 0) { + uintptr_t sysUserData = allocator->userData; + result = hostAlloc(bufferInfo); + if (result >= 0) { + OrbisNgs2Handle* handleCopy = outHandle; + result = SystemSetup(option, bufferInfo, hostFree, handleCopy); + if (result < 0) { + if (hostFree) { + hostFree(bufferInfo); + } + } + } + } + } else { + result = ORBIS_NGS2_ERROR_INVALID_OUT_ADDRESS; + LOG_ERROR(Lib_Ngs2, "Invalid system handle address {}", (void*)outHandle); + } + } else { + result = ORBIS_NGS2_ERROR_INVALID_BUFFER_ALLOCATOR; + LOG_ERROR(Lib_Ngs2, "Invalid system buffer allocator {}", (void*)allocator); + } + LOG_INFO(Lib_Ngs2, "called"); + return result; +} + +s32 PS4_SYSV_ABI sceNgs2SystemDestroy(OrbisNgs2Handle systemHandle, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemEnumHandles(OrbisNgs2Handle* aOutHandle, u32 maxHandles) { + LOG_INFO(Lib_Ngs2, "maxHandles = {}", maxHandles); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemEnumRackHandles(OrbisNgs2Handle systemHandle, + OrbisNgs2Handle* aOutHandle, u32 maxHandles) { + LOG_INFO(Lib_Ngs2, "maxHandles = {}", maxHandles); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemGetInfo(OrbisNgs2Handle rackHandle, OrbisNgs2SystemInfo* outInfo, + size_t infoSize) { + LOG_INFO(Lib_Ngs2, "infoSize = {}", infoSize); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemGetUserData(OrbisNgs2Handle systemHandle, uintptr_t* outUserData) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemLock(OrbisNgs2Handle systemHandle) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemQueryBufferSize(const OrbisNgs2SystemOption* option, + OrbisNgs2ContextBufferInfo* outBufferInfo) { + s32 result; + if (outBufferInfo) { + result = SystemSetup(option, outBufferInfo, 0, 0); + LOG_INFO(Lib_Ngs2, "called"); + } else { + result = ORBIS_NGS2_ERROR_INVALID_OUT_ADDRESS; + LOG_ERROR(Lib_Ngs2, "Invalid system buffer info {}", (void*)outBufferInfo); + } + + return result; +} + +s32 PS4_SYSV_ABI sceNgs2SystemRender(OrbisNgs2Handle systemHandle, + const OrbisNgs2RenderBufferInfo* aBufferInfo, + u32 numBufferInfo) { + LOG_INFO(Lib_Ngs2, "numBufferInfo = {}", numBufferInfo); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +static s32 PS4_SYSV_ABI sceNgs2SystemResetOption(OrbisNgs2SystemOption* outOption) { + static const OrbisNgs2SystemOption option = { + sizeof(OrbisNgs2SystemOption), "", 0, 512, 256, 48000, {0}}; + + if (!outOption) { + LOG_ERROR(Lib_Ngs2, "Invalid system option address {}", (void*)outOption); + return ORBIS_NGS2_ERROR_INVALID_OPTION_ADDRESS; + } + *outOption = option; + + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemSetGrainSamples(OrbisNgs2Handle systemHandle, u32 numSamples) { + LOG_INFO(Lib_Ngs2, "numSamples = {}", numSamples); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemSetSampleRate(OrbisNgs2Handle systemHandle, u32 sampleRate) { + LOG_INFO(Lib_Ngs2, "sampleRate = {}", sampleRate); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemSetUserData(OrbisNgs2Handle systemHandle, uintptr_t userData) { + LOG_INFO(Lib_Ngs2, "userData = {}", userData); + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2SystemUnlock(OrbisNgs2Handle systemHandle) { + if (!systemHandle) { + LOG_ERROR(Lib_Ngs2, "systemHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceControl(OrbisNgs2Handle voiceHandle, + const OrbisNgs2VoiceParamHeader* paramList) { + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetMatrixInfo(OrbisNgs2Handle voiceHandle, u32 matrixId, + OrbisNgs2VoiceMatrixInfo* outInfo, size_t outInfoSize) { + LOG_INFO(Lib_Ngs2, "matrixId = {}, outInfoSize = {}", matrixId, outInfoSize); + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetOwner(OrbisNgs2Handle voiceHandle, OrbisNgs2Handle* outRackHandle, + u32* outVoiceId) { + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetPortInfo(OrbisNgs2Handle voiceHandle, u32 port, + OrbisNgs2VoicePortInfo* outInfo, size_t outInfoSize) { + LOG_INFO(Lib_Ngs2, "port = {}, outInfoSize = {}", port, outInfoSize); + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetState(OrbisNgs2Handle voiceHandle, OrbisNgs2VoiceState* outState, + size_t stateSize) { + LOG_INFO(Lib_Ngs2, "stateSize = {}", stateSize); + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2VoiceGetStateFlags(OrbisNgs2Handle voiceHandle, u32* outStateFlags) { + if (!voiceHandle) { + LOG_ERROR(Lib_Ngs2, "voiceHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +// Ngs2Custom + +s32 PS4_SYSV_ABI sceNgs2CustomRackGetModuleInfo(OrbisNgs2Handle rackHandle, u32 moduleIndex, + OrbisNgs2CustomModuleInfo* outInfo, + size_t infoSize) { + LOG_INFO(Lib_Ngs2, "moduleIndex = {}, infoSize = {}", moduleIndex, infoSize); + if (!rackHandle) { + LOG_ERROR(Lib_Ngs2, "rackHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; + } + return ORBIS_OK; +} + +// Ngs2Geom + +s32 PS4_SYSV_ABI sceNgs2GeomResetListenerParam(OrbisNgs2GeomListenerParam* outListenerParam) { + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2GeomResetSourceParam(OrbisNgs2GeomSourceParam* outSourceParam) { + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2GeomCalcListener(const OrbisNgs2GeomListenerParam* param, + OrbisNgs2GeomListenerWork* outWork, u32 flags) { + LOG_INFO(Lib_Ngs2, "flags = {}", flags); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2GeomApply(const OrbisNgs2GeomListenerWork* listener, + const OrbisNgs2GeomSourceParam* source, + OrbisNgs2GeomAttribute* outAttrib, u32 flags) { + LOG_INFO(Lib_Ngs2, "flags = {}", flags); + return ORBIS_OK; +} + +// Ngs2Pan + +s32 PS4_SYSV_ABI sceNgs2PanInit(OrbisNgs2PanWork* work, const float* aSpeakerAngle, float unitAngle, + u32 numSpeakers) { + LOG_INFO(Lib_Ngs2, "aSpeakerAngle = {}, unitAngle = {}, numSpeakers = {}", *aSpeakerAngle, + unitAngle, numSpeakers); + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2PanGetVolumeMatrix(OrbisNgs2PanWork* work, const OrbisNgs2PanParam* aParam, + u32 numParams, u32 matrixFormat, + float* outVolumeMatrix) { + LOG_INFO(Lib_Ngs2, "numParams = {}, matrixFormat = {}", numParams, matrixFormat); + return ORBIS_OK; +} + +// Ngs2Report + +s32 PS4_SYSV_ABI sceNgs2ReportRegisterHandler(u32 reportType, OrbisNgs2ReportHandler handler, + uintptr_t userData, OrbisNgs2Handle* outHandle) { + LOG_INFO(Lib_Ngs2, "reportType = {}, userData = {}", reportType, userData); + if (!handler) { + LOG_ERROR(Lib_Ngs2, "handler is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_REPORT_HANDLE; + } + return ORBIS_OK; +} + +s32 PS4_SYSV_ABI sceNgs2ReportUnregisterHandler(OrbisNgs2Handle reportHandle) { + if (!reportHandle) { + LOG_ERROR(Lib_Ngs2, "reportHandle is nullptr"); + return ORBIS_NGS2_ERROR_INVALID_REPORT_HANDLE; + } + LOG_INFO(Lib_Ngs2, "called"); + return ORBIS_OK; +} + +// Unknown + int PS4_SYSV_ABI sceNgs2FftInit() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -35,31 +494,6 @@ int PS4_SYSV_ABI sceNgs2FftQuerySize() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2GeomApply() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GeomCalcListener() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GeomResetListenerParam() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GeomResetSourceParam() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2GetWaveformFrameInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2JobSchedulerResetOption() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -80,71 +514,6 @@ int PS4_SYSV_ABI sceNgs2ModuleQueueEnumItems() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2PanGetVolumeMatrix() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2PanInit() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ParseWaveformData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ParseWaveformFile() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ParseWaveformUser() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackCreate() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackCreateWithAllocator() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackDestroy() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackGetInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackGetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackGetVoiceHandle() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackLock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackQueryBufferSize() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2RackQueryInfo() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -155,116 +524,21 @@ int PS4_SYSV_ABI sceNgs2RackRunCommands() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2RackSetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2RackUnlock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ReportRegisterHandler() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2ReportUnregisterHandler() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemCreate() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemCreateWithAllocator() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemDestroy() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemEnumHandles() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemEnumRackHandles() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemGetInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemGetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemLock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemQueryBufferSize() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2SystemQueryInfo() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2SystemRender() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemResetOption() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2SystemRunCommands() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2SystemSetGrainSamples() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2SystemSetLoudThreshold() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2SystemSetSampleRate() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemSetUserData() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2SystemUnlock() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2StreamCreate() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; @@ -300,36 +574,6 @@ int PS4_SYSV_ABI sceNgs2StreamRunCommands() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNgs2VoiceControl() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetMatrixInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetOwner() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetPortInfo() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetState() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI sceNgs2VoiceGetStateFlags() { - LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); - return ORBIS_OK; -} - int PS4_SYSV_ABI sceNgs2VoiceQueryInfo() { LOG_ERROR(Lib_Ngs2, "(STUBBED) called"); return ORBIS_OK; diff --git a/src/core/libraries/ngs2/ngs2.h b/src/core/libraries/ngs2/ngs2.h index a5f1f52a6..a34bf21d4 100644 --- a/src/core/libraries/ngs2/ngs2.h +++ b/src/core/libraries/ngs2/ngs2.h @@ -3,7 +3,11 @@ #pragma once +#include "core/libraries/ngs2/ngs2_impl.h" + #include +#include +#include #include "common/types.h" namespace Core::Loader { @@ -12,60 +16,253 @@ class SymbolsResolver; namespace Libraries::Ngs2 { -class Ngs2; +typedef s32 (*OrbisNgs2ParseReadHandler)(uintptr_t userData, u32 offset, void* data, size_t size); -using SceNgs2Handle = Ngs2*; - -enum class SceNgs2HandleType : u32 { - System = 0, +enum class OrbisNgs2HandleType : u32 { + Invalid = 0, + System = 1, + Rack = 2, + Voice = 3, + VoiceControl = 6 }; -struct Ngs2Handle { - void* selfPointer; - void* dataPointer; - std::atomic* atomicPtr; - u32 handleType; - u32 flags_unk; +static const int ORBIS_NGS2_MAX_VOICE_CHANNELS = 8; +static const int ORBIS_NGS2_WAVEFORM_INFO_MAX_BLOCKS = 4; +static const int ORBIS_NGS2_MAX_MATRIX_LEVELS = + (ORBIS_NGS2_MAX_VOICE_CHANNELS * ORBIS_NGS2_MAX_VOICE_CHANNELS); - u32 uid; - u16 maxGrainSamples; - u16 minGrainSamples; - u16 currentGrainSamples; - u16 numGrainSamples; - u16 unknown2; +struct OrbisNgs2WaveformFormat { + u32 waveformType; + u32 numChannels; u32 sampleRate; - u32 unknown3; - - void* flushMutex; - u32 flushMutexInitialized; - void* processMutex; - u32 processMutexInitialized; - - // Linked list pointers for system list - Ngs2Handle* prev; - Ngs2Handle* next; + u32 configData; + u32 frameOffset; + u32 frameMargin; }; -struct SystemOptions { - char padding[6]; - s32 maxGrainSamples; - s32 numGrainSamples; - s32 sampleRate; +struct OrbisNgs2WaveformBlock { + u32 dataOffset; + u32 dataSize; + u32 numRepeats; + u32 numSkipSamples; + u32 numSamples; + u32 reserved; + uintptr_t userData; }; -struct SystemState { - // TODO +struct OrbisNgs2WaveformInfo { + OrbisNgs2WaveformFormat format; + + u32 dataOffset; + u32 dataSize; + + u32 loopBeginPosition; + u32 loopEndPosition; + u32 numSamples; + + u32 audioUnitSize; + u32 numAudioUnitSamples; + u32 numAudioUnitPerFrame; + + u32 audioFrameSize; + u32 numAudioFrameSamples; + + u32 numDelaySamples; + + u32 numBlocks; + OrbisNgs2WaveformBlock aBlock[ORBIS_NGS2_WAVEFORM_INFO_MAX_BLOCKS]; }; -struct StackBuffer { - void** top; - void* base; - void* curr; - size_t usedSize; - size_t totalSize; - size_t alignment; - char isVerifyEnabled; - char padding[7]; +struct OrbisNgs2EnvelopePoint { + u32 curve; + u32 duration; + float height; +}; + +struct OrbisNgs2UserFxProcessContext { + float** aChannelData; + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; + u32 flags; + u32 numChannels; + u32 numGrainSamples; + u32 sampleRate; +}; + +typedef s32 (*OrbisNgs2UserFxProcessHandler)(OrbisNgs2UserFxProcessContext* context); + +struct OrbisNgs2UserFx2SetupContext { + void* common; + void* param; + void* work; + uintptr_t userData; + u32 maxVoices; + u32 voiceIndex; + u64 reserved[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2SetupHandler)(OrbisNgs2UserFx2SetupContext* context); + +struct OrbisNgs2UserFx2CleanupContext { + void* common; + void* param; + void* work; + uintptr_t userData; + u32 maxVoices; + u32 voiceIndex; + u64 reserved[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2CleanupHandler)(OrbisNgs2UserFx2CleanupContext* context); + +struct OrbisNgs2UserFx2ControlContext { + const void* data; + size_t dataSize; + void* common; + void* param; + uintptr_t userData; + u64 reserved[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2ControlHandler)(OrbisNgs2UserFx2ControlContext* context); + +struct OrbisNgs2UserFx2ProcessContext { + float** aChannelData; + void* common; + const void* param; + void* work; + void* state; + uintptr_t userData; + u32 flags; + u32 numInputChannels; + u32 numOutputChannels; + u32 numGrainSamples; + u32 sampleRate; + u32 reserved; + u64 reserved2[4]; +}; + +typedef s32 (*OrbisNgs2UserFx2ProcessHandler)(OrbisNgs2UserFx2ProcessContext* context); + +struct OrbisNgs2BufferAllocator { + OrbisNgs2BufferAllocHandler allocHandler; + OrbisNgs2BufferFreeHandler freeHandler; + uintptr_t userData; +}; + +struct OrbisNgs2RenderBufferInfo { + void* buffer; + size_t bufferSize; + u32 waveformType; + u32 numChannels; +}; + +struct OrbisNgs2RackOption { + size_t size; + char name[ORBIS_NGS2_RACK_NAME_LENGTH]; + + u32 flags; + u32 maxGrainSamples; + u32 maxVoices; + u32 maxInputDelayBlocks; + u32 maxMatrices; + u32 maxPorts; + u32 aReserved[20]; +}; + +struct OrbisNgs2VoiceParamHeader { + u16 size; + s16 next; + u32 id; +}; + +struct OrbisNgs2VoiceMatrixLevelsParam { + OrbisNgs2VoiceParamHeader header; + + u32 matrixId; + u32 numLevels; + const float* aLevel; +}; + +struct OrbisNgs2VoicePortMatrixParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + s32 matrixId; +}; + +struct OrbisNgs2VoicePortVolumeParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + float level; +}; + +struct OrbisNgs2VoicePortDelayParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + u32 numSamples; +}; + +struct OrbisNgs2VoicePatchParam { + OrbisNgs2VoiceParamHeader header; + + u32 port; + u32 destInputId; + OrbisNgs2Handle destHandle; +}; + +struct OrbisNgs2VoiceEventParam { + OrbisNgs2VoiceParamHeader header; + + u32 eventId; +}; + +struct OrbisNgs2VoiceCallbackInfo { + uintptr_t callbackData; + OrbisNgs2Handle voiceHandle; + u32 flag; + u32 reserved; + union { + struct { + uintptr_t userData; + const void* data; + u32 dataSize; + u32 repeatedCount; + u32 attributeFlags; + u32 reserved2; + } waveformBlock; + } param; +}; + +typedef void (*OrbisNgs2VoiceCallbackHandler)(const OrbisNgs2VoiceCallbackInfo* info); + +struct OrbisNgs2VoiceCallbackParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2VoiceCallbackHandler callbackHandler; + + uintptr_t callbackData; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2VoicePortInfo { + s32 matrixId; + float volume; + u32 numDelaySamples; + u32 destInputId; + OrbisNgs2Handle destHandle; +}; + +struct OrbisNgs2VoiceMatrixInfo { + u32 numLevels; + float aLevel[ORBIS_NGS2_MAX_MATRIX_LEVELS]; +}; + +struct OrbisNgs2VoiceState { + u32 stateFlags; }; void RegisterlibSceNgs2(Core::Loader::SymbolsResolver* sym); diff --git a/src/core/libraries/ngs2/ngs2_custom.cpp b/src/core/libraries/ngs2/ngs2_custom.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_custom.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_custom.h b/src/core/libraries/ngs2/ngs2_custom.h new file mode 100644 index 000000000..0c45a5d81 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_custom.h @@ -0,0 +1,444 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" +#include "ngs2_reverb.h" + +namespace Libraries::Ngs2 { + +class Ngs2Custom; + +static const int ORBIS_NGS2_CUSTOM_MAX_MODULES = 24; +static const int ORBIS_NGS2_CUSTOM_MAX_PORTS = 16; +static const int ORBIS_NGS2_CUSTOM_DELAY_MAX_TAPS = 8; + +struct OrbisNgs2CustomModuleOption { + u32 size; +}; + +struct OrbisNgs2CustomEnvelopeModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 maxPoints; + u32 reserved; +}; + +struct OrbisNgs2CustomReverbModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 reverbSize; + u32 reserved; +}; + +struct OrbisNgs2CustomChorusModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 maxPhases; + u32 reserved; +} OrbisNgs2CustomChorusModuleOption; + +struct OrbisNgs2CustomPeakMeterModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + u32 numBlocks; + u32 reserved; +}; + +struct OrbisNgs2CustomDelayModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 type; + u32 maxTaps; + float maxLength; + u32 reserved; +}; + +struct OrbisNgs2CustomPitchShiftModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + u32 quality; +}; + +struct OrbisNgs2CustomUserFx2ModuleOption { + OrbisNgs2CustomModuleOption customModuleOption; + + OrbisNgs2UserFx2SetupHandler setupHandler; + OrbisNgs2UserFx2CleanupHandler cleanupHandler; + OrbisNgs2UserFx2ControlHandler controlHandler; + OrbisNgs2UserFx2ProcessHandler processHandler; + + size_t commonSize; + size_t paramSize; + size_t workSize; + uintptr_t userData; +}; + +struct OrbisNgs2CustomRackModuleInfo { + const OrbisNgs2CustomModuleOption* option; + + u32 moduleId; + u32 sourceBufferId; + u32 extraBufferId; + u32 destBufferId; + u32 stateOffset; + u32 stateSize; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomRackPortInfo { + u32 sourceBufferId; + u32 reserved; +}; + +struct OrbisNgs2CustomRackOption { + OrbisNgs2RackOption rackOption; + u32 stateSize; + u32 numBuffers; + u32 numModules; + u32 reserved; + OrbisNgs2CustomRackModuleInfo aModule[ORBIS_NGS2_CUSTOM_MAX_MODULES]; + OrbisNgs2CustomRackPortInfo aPort[ORBIS_NGS2_CUSTOM_MAX_PORTS]; +}; + +struct OrbisNgs2CustomSamplerRackOption { + OrbisNgs2CustomRackOption customRackOption; + + u32 maxChannelWorks; + u32 maxWaveformBlocks; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; + u32 maxCodecCaches; +}; + +struct OrbisNgs2CustomSubmixerRackOption { + OrbisNgs2CustomRackOption customRackOption; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomMasteringRackOption { + OrbisNgs2CustomRackOption customRackOption; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomSamplerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2WaveformFormat format; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2CustomSamplerVoiceWaveformBlocksParam { + OrbisNgs2VoiceParamHeader header; + const void* data; + u32 flags; + u32 numBlocks; + const OrbisNgs2WaveformBlock* aBlock; +}; + +struct OrbisNgs2CustomSamplerVoiceWaveformAddressParam { + OrbisNgs2VoiceParamHeader header; + const void* from; + const void* to; +}; + +struct OrbisNgs2CustomSamplerVoiceWaveformFrameOffsetParam { + OrbisNgs2VoiceParamHeader header; + u32 frameOffset; + u32 reserved; +}; + +struct OrbisNgs2CustomSamplerVoiceExitLoopParam { + OrbisNgs2VoiceParamHeader header; +}; + +struct OrbisNgs2CustomSamplerVoicePitchParam { + OrbisNgs2VoiceParamHeader header; + float ratio; + u32 reserved; +}; + +struct OrbisNgs2CustomSamplerVoiceState { + OrbisNgs2VoiceState voiceState; + char padding[32]; + const void* waveformData; + u64 numDecodedSamples; + u64 decodedDataSize; + u64 userData; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomSubmixerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + u32 numInputChannels; + u32 numOutputChannels; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2CustomSubmixerVoiceState { + OrbisNgs2VoiceState voiceState; // Voice state + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomMasteringVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + u32 numInputChannels; + u32 flags; +}; + +struct OrbisNgs2CustomMasteringVoiceOutputParam { + OrbisNgs2VoiceParamHeader header; + u32 outputId; + u32 reserved; +}; + +struct OrbisNgs2CustomMasteringVoiceState { + OrbisNgs2VoiceState voiceState; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomVoiceEnvelopeParam { + OrbisNgs2VoiceParamHeader header; + u32 numForwardPoints; + u32 numReleasePoints; + const OrbisNgs2EnvelopePoint* aPoint; +}; + +struct OrbisNgs2CustomVoiceDistortionParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + float a; + float b; + float clip; + float gate; + float wetLevel; + float dryLevel; + u32 reserved; +}; + +struct OrbisNgs2CustomVoiceCompressorParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + float threshold; + float ratio; + float knee; + float attackTime; + float releaseTime; + float level; + u32 reserved; +}; + +struct OrbisNgs2CustomVoiceFilterParam { + OrbisNgs2VoiceParamHeader header; + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; + u32 reserved3; +}; + +struct OrbisNgs2CustomVoiceLfeFilterParam { + OrbisNgs2VoiceParamHeader header; + u32 enableFlag; + u32 fc; +}; + +struct OrbisNgs2CustomVoiceGainParam { + OrbisNgs2VoiceParamHeader header; + float aLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2CustomVoiceMixerParam { + OrbisNgs2VoiceParamHeader header; + float aSourceLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + float aDestLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2CustomVoiceChannelMixerParam { + OrbisNgs2VoiceParamHeader header; + float aLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS][ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2CustomVoiceUserFxParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2UserFxProcessHandler handler; + + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; +}; + +struct OrbisNgs2CustomVoiceUserFx2Param { + OrbisNgs2VoiceParamHeader header; + const void* data; + size_t dataSize; +}; + +struct OrbisNgs2CustomVoiceOutputParam { + OrbisNgs2VoiceParamHeader header; + u32 outputId; + u32 reserved; +}; + +struct OrbisNgs2CustomVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + u32 enableFlag; + u32 reserved; +} OrbisNgs2CustomVoicePeakMeterParam; + +struct OrbisNgs2CustomVoiceReverbParam { + OrbisNgs2VoiceParamHeader header; + OrbisNgs2ReverbI3DL2Param i3dl2; +}; + +struct OrbisNgs2CustomVoiceChorusParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + u32 numPhases; + u32 channelMask; + float inputLevel; + float delayTime; + float modulationRatio; + float modulationDepth; + float feedbackLevel; + float wetLevel; + float dryLevel; +}; + +struct OrbisNgs2DelayTapInfo { + float tapLevel; + float delayTime; +}; + +struct OrbisNgs2CustomVoiceDelayParam { + OrbisNgs2VoiceParamHeader header; + float dryLevel; + float wetLevel; + float inputLevel; + float feedbackLevel; + float lowpassFc; + u32 numTaps; + OrbisNgs2DelayTapInfo aTap[ORBIS_NGS2_CUSTOM_DELAY_MAX_TAPS]; + float aInputMixLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + u32 channelMask; + u32 flags; +}; + +struct OrbisNgs2CustomVoiceNoiseGateParam { + OrbisNgs2VoiceParamHeader header; + u32 flags; + float threshold; + float attackTime; + float releaseTime; +}; + +struct OrbisNgs2CustomVoicePitchShiftParam { + OrbisNgs2VoiceParamHeader header; + s32 cent; +}; + +struct OrbisNgs2CustomEnvelopeModuleState { + float height; + u32 reserved; +}; + +struct OrbisNgs2CustomCompressorModuleState { + float peakHeight; + float compressorHeight; +}; + +struct OrbisNgs2CustomPeakMeterModuleState { + float peak; + float aChannelPeak[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + u32 reserved; +}; + +struct OrbisNgs2CustomNoiseGateModuleState { + float gateHeight; +}; + +struct OrbisNgs2CustomRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 stateSize; + u32 numBuffers; + u32 numModules; + u32 reserved; + OrbisNgs2CustomRackModuleInfo aModule[ORBIS_NGS2_CUSTOM_MAX_MODULES]; + OrbisNgs2CustomRackPortInfo aPort[ORBIS_NGS2_CUSTOM_MAX_PORTS]; +}; + +struct OrbisNgs2CustomSamplerRackInfo { + OrbisNgs2CustomRackInfo customRackInfo; + + u32 maxChannelWorks; + u32 maxWaveformBlocks; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; + u32 maxCodecCaches; +}; + +struct OrbisNgs2CustomSubmixerRackInfo { + OrbisNgs2CustomRackInfo customRackInfo; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomMasteringRackInfo { + OrbisNgs2CustomRackInfo customRackInfo; + + u32 maxChannels; + u32 maxInputs; +}; + +struct OrbisNgs2CustomModuleInfo { + u32 moduleId; + u32 sourceBufferId; + u32 extraBufferId; + u32 destBufferId; + u32 stateOffset; + u32 stateSize; + u32 reserved; + u32 reserved2; +}; + +struct OrbisNgs2CustomEnvelopeModuleInfo { + OrbisNgs2CustomModuleInfo moduleInfo; + + u32 maxPoints; + u32 reserved; +}; + +struct OrbisNgs2CustomReverbModuleInfo { + OrbisNgs2CustomModuleInfo moduleInfo; + + u32 reverbSize; + u32 reserved; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_eq.cpp b/src/core/libraries/ngs2/ngs2_eq.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_eq.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_eq.h b/src/core/libraries/ngs2/ngs2_eq.h new file mode 100644 index 000000000..99688f24e --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_eq.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Eq; + +struct OrbisNgs2EqVoiceSetupParam { + u32 numChannels; +}; + +struct OrbisNgs2EqVoiceFilterParam { + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; +}; + +struct OrbisNgs2EqVoiceState { + u32 stateFlags; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_geom.cpp b/src/core/libraries/ngs2/ngs2_geom.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_geom.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_geom.h b/src/core/libraries/ngs2/ngs2_geom.h new file mode 100644 index 000000000..93af99d8d --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_geom.h @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Geom; + +struct OrbisNgs2GeomVector { + float x; + float y; + float z; +}; + +struct OrbisNgs2GeomCone { + float innerLevel; + float innerAngle; + float outerLevel; + float outerAngle; +}; + +struct OrbisNgs2GeomRolloff { + u32 model; + float maxDistance; + float rolloffFactor; + float referenceDistance; +}; + +struct OrbisNgs2GeomListenerParam { + OrbisNgs2GeomVector position; + OrbisNgs2GeomVector orientFront; + OrbisNgs2GeomVector orientUp; + OrbisNgs2GeomVector velocity; + float soundSpeed; + u32 reserved[2]; +}; + +struct OrbisNgs2GeomListenerWork { + float matrix[4][4]; + OrbisNgs2GeomVector velocity; + float soundSpeed; + u32 coordinate; + u32 reserved[3]; +}; + +struct OrbisNgs2GeomSourceParam { + OrbisNgs2GeomVector position; + OrbisNgs2GeomVector velocity; + OrbisNgs2GeomVector direction; + OrbisNgs2GeomCone cone; + OrbisNgs2GeomRolloff rolloff; + float dopplerFactor; + float fbwLevel; + float lfeLevel; + float maxLevel; + float minLevel; + float radius; + u32 numSpeakers; + u32 matrixFormat; + u32 reserved[2]; +}; + +struct OrbisNgs2GeomA3dAttribute { + OrbisNgs2GeomVector position; + float volume; + u32 reserved[4]; +}; + +struct OrbisNgs2GeomAttribute { + float pitchRatio; + float aLevel[ORBIS_NGS2_MAX_VOICE_CHANNELS * ORBIS_NGS2_MAX_VOICE_CHANNELS]; + + OrbisNgs2GeomA3dAttribute a3dAttrib; + u32 reserved[4]; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_impl.cpp b/src/core/libraries/ngs2/ngs2_impl.cpp index b358a05f7..1248f76d7 100644 --- a/src/core/libraries/ngs2/ngs2_impl.cpp +++ b/src/core/libraries/ngs2/ngs2_impl.cpp @@ -12,153 +12,171 @@ using namespace Libraries::Kernel; namespace Libraries::Ngs2 { -s32 Ngs2::ReportInvalid(Ngs2Handle* handle, u32 handle_type) const { - uintptr_t hAddress = reinterpret_cast(handle); - switch (handle_type) { +s32 HandleReportInvalid(OrbisNgs2Handle handle, u32 handleType) { + switch (handleType) { case 1: - LOG_ERROR(Lib_Ngs2, "Invalid system handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid system handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_SYSTEM_HANDLE; case 2: - LOG_ERROR(Lib_Ngs2, "Invalid rack handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid rack handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_RACK_HANDLE; case 4: - LOG_ERROR(Lib_Ngs2, "Invalid voice handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid voice handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_VOICE_HANDLE; case 8: - LOG_ERROR(Lib_Ngs2, "Invalid report handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid report handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_REPORT_HANDLE; default: - LOG_ERROR(Lib_Ngs2, "Invalid handle {}", hAddress); + LOG_ERROR(Lib_Ngs2, "Invalid handle {}", handle); return ORBIS_NGS2_ERROR_INVALID_HANDLE; } } -s32 Ngs2::HandleSetup(Ngs2Handle* handle, void* data, std::atomic* atomic, u32 type, - u32 flags) { - handle->dataPointer = data; - handle->atomicPtr = atomic; - handle->handleType = type; - handle->flags_unk = flags; - return ORBIS_OK; +void* MemoryClear(void* buffer, size_t size) { + return memset(buffer, 0, size); } -s32 Ngs2::HandleCleanup(Ngs2Handle* handle, u32 hType, void* dataOut) { - if (handle && handle->selfPointer == handle) { - std::atomic* tmp_atomic = handle->atomicPtr; - if (tmp_atomic && handle->handleType == hType) { - while (tmp_atomic->load() != 0) { - u32 expected = 1; - if (tmp_atomic->compare_exchange_strong(expected, 0)) { - if (dataOut) { - dataOut = handle->dataPointer; - } - // sceNgs2MemoryClear(handle, 32); - return ORBIS_OK; - } - tmp_atomic = handle->atomicPtr; - } - } - } - return this->ReportInvalid(handle, hType); -} - -s32 Ngs2::HandleEnter(Ngs2Handle* handle, u32 hType, Ngs2Handle* handleOut) { - if (!handle) { - return this->ReportInvalid(handle, 0); - } - - if (handle->selfPointer != handle || !handle->atomicPtr || !handle->dataPointer || - (~hType & handle->handleType)) { - return this->ReportInvalid(handle, handle->handleType); - } - - std::atomic* atomic = handle->atomicPtr; - while (true) { - u32 i = atomic->load(); - if (i == 0) { - return this->ReportInvalid(handle, handle->handleType); - } - if (atomic->compare_exchange_strong(i, i + 1)) { - break; - } - } - - if (handleOut) { - handleOut = handle; +s32 StackBufferClose(StackBuffer* stackBuffer, size_t* outTotalSize) { + if (outTotalSize) { + *outTotalSize = stackBuffer->usedSize + stackBuffer->alignment; } return ORBIS_OK; } -s32 Ngs2::HandleLeave(Ngs2Handle* handle) { - std::atomic* tmp_atomic; - u32 i; - do { - tmp_atomic = handle->atomicPtr; - i = tmp_atomic->load(); - } while (!tmp_atomic->compare_exchange_strong(i, i - 1)); - return ORBIS_OK; -} +s32 StackBufferOpen(StackBuffer* stackBuffer, void* bufferStart, size_t bufferSize, + void** outBuffer, u8 flags) { + stackBuffer->top = outBuffer; + stackBuffer->base = bufferStart; + stackBuffer->size = (size_t)bufferStart; + stackBuffer->currentOffset = (size_t)bufferStart; + stackBuffer->usedSize = 0; + stackBuffer->totalSize = bufferSize; + stackBuffer->alignment = 8; // this is a fixed value + stackBuffer->flags = flags; -s32 Ngs2::StackBufferOpen(StackBuffer* buf, void* base_addr, size_t size, void** stackTop, - bool verify) { - buf->top = stackTop; - buf->base = base_addr; - buf->curr = base_addr; - buf->usedSize = 0; - buf->totalSize = size; - buf->alignment = 8; - buf->isVerifyEnabled = verify; - - if (stackTop) { - *stackTop = nullptr; + if (outBuffer != NULL) { + *outBuffer = NULL; } return ORBIS_OK; } -s32 Ngs2::StackBufferClose(StackBuffer* buf, size_t* usedSize) { - if (usedSize) { - *usedSize = buf->usedSize + buf->alignment; +s32 SystemCleanup(OrbisNgs2Handle systemHandle, OrbisNgs2ContextBufferInfo* outInfo) { + if (!systemHandle) { + return ORBIS_NGS2_ERROR_INVALID_HANDLE; } + // TODO + return ORBIS_OK; } -s32 Ngs2::SystemSetupCore(StackBuffer* buf, SystemOptions* options, Ngs2Handle** sysOut) { +s32 SystemSetupCore(StackBuffer* stackBuffer, const OrbisNgs2SystemOption* option, + SystemInternal* outSystem) { u32 maxGrainSamples = 512; u32 numGrainSamples = 256; u32 sampleRate = 48000; - if (options) { - maxGrainSamples = options->maxGrainSamples; - numGrainSamples = options->numGrainSamples; - sampleRate = options->sampleRate; + if (option) { + sampleRate = option->sampleRate; + maxGrainSamples = option->maxGrainSamples; + numGrainSamples = option->numGrainSamples; } - // Validate maxGrainSamples - if (maxGrainSamples < 64 || maxGrainSamples > 1024 || (maxGrainSamples & 0x3F) != 0) { + if (maxGrainSamples < 64 || maxGrainSamples > 1024 || (maxGrainSamples & 63) != 0) { LOG_ERROR(Lib_Ngs2, "Invalid system option (maxGrainSamples={},x64)", maxGrainSamples); return ORBIS_NGS2_ERROR_INVALID_MAX_GRAIN_SAMPLES; } - // Validate numGrainSamples - if (numGrainSamples < 64 || numGrainSamples > 1024 || (numGrainSamples & 0x3F) != 0) { + if (numGrainSamples < 64 || numGrainSamples > 1024 || (numGrainSamples & 63) != 0) { LOG_ERROR(Lib_Ngs2, "Invalid system option (numGrainSamples={},x64)", numGrainSamples); return ORBIS_NGS2_ERROR_INVALID_NUM_GRAIN_SAMPLES; } - // Validate sampleRate if (sampleRate != 11025 && sampleRate != 12000 && sampleRate != 22050 && sampleRate != 24000 && - sampleRate != 44100 && sampleRate != 48000 && sampleRate != 88200 && sampleRate != 96000) { + sampleRate != 44100 && sampleRate != 48000 && sampleRate != 88200 && sampleRate != 96000 && + sampleRate != 176400 && sampleRate != 192000) { LOG_ERROR(Lib_Ngs2, "Invalid system option(sampleRate={}:44.1/48kHz series)", sampleRate); return ORBIS_NGS2_ERROR_INVALID_SAMPLE_RATE; } - int result = ORBIS_OK; + return ORBIS_OK; +} +s32 SystemSetup(const OrbisNgs2SystemOption* option, OrbisNgs2ContextBufferInfo* hostBufferInfo, + OrbisNgs2BufferFreeHandler hostFree, OrbisNgs2Handle* outHandle) { + u8 optionFlags = 0; + StackBuffer stackBuffer; + SystemInternal setupResult; + void* systemList = NULL; + size_t requiredBufferSize = 0; + u32 result = ORBIS_NGS2_ERROR_INVALID_BUFFER_SIZE; + + if (option) { + if (option->size != 64) { + LOG_ERROR(Lib_Ngs2, "Invalid system option size ({})", option->size); + return ORBIS_NGS2_ERROR_INVALID_OPTION_SIZE; + } + optionFlags = option->flags >> 31; + } + + // Init + StackBufferOpen(&stackBuffer, NULL, 0, NULL, optionFlags); + result = SystemSetupCore(&stackBuffer, option, 0); + + if (result < 0) { + return result; + } + + StackBufferClose(&stackBuffer, &requiredBufferSize); + + // outHandle unprovided + if (!outHandle) { + hostBufferInfo->hostBuffer = NULL; + hostBufferInfo->hostBufferSize = requiredBufferSize; + MemoryClear(&hostBufferInfo->reserved, sizeof(hostBufferInfo->reserved)); + return ORBIS_OK; + } + + if (!hostBufferInfo->hostBuffer) { + LOG_ERROR(Lib_Ngs2, "Invalid system buffer address ({})", hostBufferInfo->hostBuffer); + return ORBIS_NGS2_ERROR_INVALID_BUFFER_ADDRESS; + } + + if (hostBufferInfo->hostBufferSize < requiredBufferSize) { + LOG_ERROR(Lib_Ngs2, "Invalid system buffer size ({}<{}[byte])", + hostBufferInfo->hostBufferSize, requiredBufferSize); + return ORBIS_NGS2_ERROR_INVALID_BUFFER_SIZE; + } + + // Setup + StackBufferOpen(&stackBuffer, hostBufferInfo->hostBuffer, hostBufferInfo->hostBufferSize, + &systemList, optionFlags); + result = SystemSetupCore(&stackBuffer, option, &setupResult); + + if (result < 0) { + return result; + } + + StackBufferClose(&stackBuffer, &requiredBufferSize); + + // Copy buffer results + setupResult.bufferInfo = *hostBufferInfo; + setupResult.hostFree = hostFree; // TODO + // setupResult.systemList = systemList; - return result; // Success + OrbisNgs2Handle systemHandle = setupResult.systemHandle; + if (hostBufferInfo->hostBufferSize >= requiredBufferSize) { + *outHandle = systemHandle; + return ORBIS_OK; + } + + SystemCleanup(systemHandle, 0); + + LOG_ERROR(Lib_Ngs2, "Invalid system buffer size ({}<{}[byte])", hostBufferInfo->hostBufferSize, + requiredBufferSize); + return ORBIS_NGS2_ERROR_INVALID_BUFFER_SIZE; } } // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_impl.h b/src/core/libraries/ngs2/ngs2_impl.h index fea87c51c..7be0f89cc 100644 --- a/src/core/libraries/ngs2/ngs2_impl.h +++ b/src/core/libraries/ngs2/ngs2_impl.h @@ -3,23 +3,176 @@ #pragma once -#include "ngs2.h" +#include "core/libraries/kernel/threads/pthread.h" namespace Libraries::Ngs2 { -class Ngs2 { -public: - s32 ReportInvalid(Ngs2Handle* handle, u32 handle_type) const; - s32 HandleSetup(Ngs2Handle* handle, void* data, std::atomic* atomic, u32 type, u32 flags); - s32 HandleCleanup(Ngs2Handle* handle, u32 hType, void* dataOut); - s32 HandleEnter(Ngs2Handle* handle, u32 hType, Ngs2Handle* handleOut); - s32 HandleLeave(Ngs2Handle* handle); - s32 StackBufferOpen(StackBuffer* buf, void* base_addr, size_t size, void** stackTop, - bool verify); - s32 StackBufferClose(StackBuffer* buf, size_t* usedSize); - s32 SystemSetupCore(StackBuffer* buf, SystemOptions* options, Ngs2Handle** sysOut); +static const int ORBIS_NGS2_SYSTEM_NAME_LENGTH = 16; +static const int ORBIS_NGS2_RACK_NAME_LENGTH = 16; -private: +typedef uintptr_t OrbisNgs2Handle; + +struct OrbisNgs2ContextBufferInfo { + void* hostBuffer; + size_t hostBufferSize; + uintptr_t reserved[5]; + uintptr_t userData; }; +struct OrbisNgs2SystemOption { + size_t size; + char name[ORBIS_NGS2_SYSTEM_NAME_LENGTH]; + + u32 flags; + u32 maxGrainSamples; + u32 numGrainSamples; + u32 sampleRate; + u32 aReserved[6]; +}; + +typedef s32 (*OrbisNgs2BufferAllocHandler)(OrbisNgs2ContextBufferInfo* ioBufferInfo); +typedef s32 (*OrbisNgs2BufferFreeHandler)(OrbisNgs2ContextBufferInfo* ioBufferInfo); + +struct OrbisNgs2SystemInfo { + char name[ORBIS_NGS2_SYSTEM_NAME_LENGTH]; // 0 + + OrbisNgs2Handle systemHandle; // 16 + OrbisNgs2ContextBufferInfo bufferInfo; // 24 + + u32 uid; // 88 + u32 minGrainSamples; // 92 + u32 maxGrainSamples; // 96 + + u32 stateFlags; // 100 + u32 rackCount; // 104 + float lastRenderRatio; // 108 + s64 lastRenderTick; // 112 + s64 renderCount; // 120 + u32 sampleRate; // 128 + u32 numGrainSamples; // 132 +}; + +struct OrbisNgs2RackInfo { + char name[ORBIS_NGS2_RACK_NAME_LENGTH]; // 0 + + OrbisNgs2Handle rackHandle; // 16 + OrbisNgs2ContextBufferInfo bufferInfo; // 24 + + OrbisNgs2Handle ownerSystemHandle; // 88 + + u32 type; // 96 + u32 rackId; // 100 + u32 uid; // 104 + u32 minGrainSamples; // 108 + u32 maxGrainSamples; // 112 + u32 maxVoices; // 116 + u32 maxChannelWorks; // 120 + u32 maxInputs; // 124 + u32 maxMatrices; // 128 + u32 maxPorts; // 132 + + u32 stateFlags; // 136 + float lastProcessRatio; // 140 + u64 lastProcessTick; // 144 + u64 renderCount; // 152 + u32 activeVoiceCount; // 160 + u32 activeChannelWorkCount; // 164 +}; + +struct StackBuffer { + void** top; + void* base; + size_t size; + size_t currentOffset; + size_t usedSize; + size_t totalSize; + size_t alignment; + u8 flags; + char padding[7]; +}; + +struct SystemInternal { + // setup init + char name[ORBIS_NGS2_SYSTEM_NAME_LENGTH]; // 0 + OrbisNgs2ContextBufferInfo bufferInfo; // 16 + OrbisNgs2BufferFreeHandler hostFree; // 80 + OrbisNgs2Handle systemHandle; // 88 + void* unknown1; // 96 + void* unknown2; // 104 + OrbisNgs2Handle rackHandle; // 112 + uintptr_t* userData; // 120 + SystemInternal* systemList; // 128 + StackBuffer* stackBuffer; // 136 + OrbisNgs2SystemInfo ownerSystemInfo; // 144 + + struct rackList { + void* prev; + void* next; + void* unknown; + }; + + rackList rackListPreset; // 152 + rackList rackListNormal; // 176 + rackList rackListMaster; // 200 + + void* unknown3; // 208 + void* systemListPrev; // 216 + void* unknown4; // 224 + void* systemListNext; // 232 + void* rackFunction; // 240 + + Kernel::PthreadMutex processLock; // 248 + u32 hasProcessMutex; // 256 + u32 unknown5; // 260 + Kernel::PthreadMutex flushLock; // 264 + u32 hasFlushMutex; // 272 + u32 unknown6; // 276 + + // info + u64 lastRenderTick; // 280 + u64 renderCount; // 288 + u32 isActive; // 296 + std::atomic lockCount; // 300 + u32 uid; // 304 + u32 systemType; // 308 + + struct { + u8 isBufferValid : 1; + u8 isRendering : 1; + u8 isSorted : 1; + u8 isFlushReady : 1; + } flags; // 312 + + u16 currentMaxGrainSamples; // 316 + u16 minGrainSamples; // 318 + u16 maxGrainSamples; // 320 + u16 numGrainSamples; // 322 + u32 currentNumGrainSamples; // 324 + u32 sampleRate; // 328 + u32 currentSampleRate; // 332 + u32 rackCount; // 336 + float lastRenderRatio; // 340 + float cpuLoad; // 344 +}; + +struct HandleInternal { + HandleInternal* selfPtr; // 0 + SystemInternal* systemData; // 8 + std::atomic refCount; // 16 + u32 handleType; // 24 + u32 handleID; // 28 +}; + +s32 StackBufferClose(StackBuffer* stackBuffer, size_t* outTotalSize); +s32 StackBufferOpen(StackBuffer* stackBuffer, void* buffer, size_t bufferSize, void** outBuffer, + u8 flags); +s32 SystemSetupCore(StackBuffer* stackBuffer, const OrbisNgs2SystemOption* option, + SystemInternal* outSystem); + +s32 HandleReportInvalid(OrbisNgs2Handle handle, u32 handleType); +void* MemoryClear(void* buffer, size_t size); +s32 SystemCleanup(OrbisNgs2Handle systemHandle, OrbisNgs2ContextBufferInfo* outInfo); +s32 SystemSetup(const OrbisNgs2SystemOption* option, OrbisNgs2ContextBufferInfo* hostBufferInfo, + OrbisNgs2BufferFreeHandler hostFree, OrbisNgs2Handle* outHandle); + } // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_mastering.cpp b/src/core/libraries/ngs2/ngs2_mastering.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_mastering.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_mastering.h b/src/core/libraries/ngs2/ngs2_mastering.h new file mode 100644 index 000000000..e0ba478c3 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_mastering.h @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Mastering; + +struct OrbisNgs2MasteringRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannels; + u32 numPeakMeterBlocks; +}; + +struct OrbisNgs2MasteringVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + + u32 numInputChannels; + u32 flags; +}; + +struct OrbisNgs2MasteringVoiceMatrixParam { + OrbisNgs2VoiceParamHeader header; + + u32 type; + u32 numLevels; + const float* aLevel; +}; + +struct OrbisNgs2MasteringVoiceLfeParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + u32 fc; +}; + +struct OrbisNgs2MasteringVoiceLimiterParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + float threshold; +}; + +struct OrbisNgs2MasteringVoiceGainParam { + OrbisNgs2VoiceParamHeader header; + + float fbwLevel; + float lfeLevel; +}; + +struct OrbisNgs2MasteringVoiceOutputParam { + OrbisNgs2VoiceParamHeader header; + + u32 outputId; + u32 reserved; +}; + +struct OrbisNgs2MasteringVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + u32 enableFlag; + u32 reserved; +}; + +struct OrbisNgs2MasteringVoiceState { + OrbisNgs2VoiceState voiceState; + float limiterPeakLevel; + float limiterPressLevel; + float aInputPeakHeight[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + float aOutputPeakHeight[ORBIS_NGS2_MAX_VOICE_CHANNELS]; +}; + +struct OrbisNgs2MasteringRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannels; + u32 reserved; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_pan.cpp b/src/core/libraries/ngs2/ngs2_pan.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_pan.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_pan.h b/src/core/libraries/ngs2/ngs2_pan.h new file mode 100644 index 000000000..d39ec67cd --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_pan.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Pan; + +struct OrbisNgs2PanParam { + float angle; + float distance; + float fbwLevel; + float lfeLevel; +}; + +struct OrbisNgs2PanWork { + float aSpeakerAngle[ORBIS_NGS2_MAX_VOICE_CHANNELS]; + float unitAngle; + u32 numSpeakers; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_report.cpp b/src/core/libraries/ngs2/ngs2_report.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_report.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_report.h b/src/core/libraries/ngs2/ngs2_report.h new file mode 100644 index 000000000..88f6d1df0 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_report.h @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +#include // va_list + +namespace Libraries::Ngs2 { + +class Ngs2Report; + +struct OrbisNgs2ReportDataHeader { + size_t size; + OrbisNgs2Handle handle; + u32 type; + s32 result; +}; + +typedef void (*OrbisNgs2ReportHandler)(const OrbisNgs2ReportDataHeader* data, uintptr_t userData); + +struct OrbisNgs2ReportMessageData { + OrbisNgs2ReportDataHeader header; + const char* message; +}; + +struct OrbisNgs2ReportApiData { + OrbisNgs2ReportDataHeader header; + const char* functionName; + const char* format; + va_list argument; +}; + +struct OrbisNgs2ReportControlData { + OrbisNgs2ReportDataHeader header; + const OrbisNgs2VoiceParamHeader* param; +}; + +struct OrbisNgs2ReportOutputData { + OrbisNgs2ReportDataHeader header; + const OrbisNgs2RenderBufferInfo* bufferInfo; + + u32 bufferIndex; + u32 sampleRate; + u32 numGrainSamples; + u32 reserved; +}; + +struct OrbisNgs2ReportCpuLoadData { + OrbisNgs2ReportDataHeader header; + float totalRatio; + float flushRatio; + float processRatio; + float feedbackRatio; +}; + +struct OrbisNgs2ReportRenderStateData { + OrbisNgs2ReportDataHeader header; + u32 state; + u32 reserved; +}; + +struct OrbisNgs2ReportVoiceWaveformData { + OrbisNgs2ReportDataHeader header; + u32 location; + u32 waveformType; + u32 numChannels; + u32 sampleRate; + u32 numGrainSamples; + u32 reserved; + void* const* aData; +}; + +s32 PS4_SYSV_ABI sceNgs2ReportRegisterHandler(u32 reportType, OrbisNgs2ReportHandler handler, + uintptr_t userData, OrbisNgs2Handle* outHandle); + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_reverb.cpp b/src/core/libraries/ngs2/ngs2_reverb.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_reverb.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_reverb.h b/src/core/libraries/ngs2/ngs2_reverb.h new file mode 100644 index 000000000..715d7480a --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_reverb.h @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Reverb; + +struct OrbisNgs2ReverbRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannels; + u32 reverbSize; +}; + +struct OrbisNgs2ReverbI3DL2Param { + float wet; + float dry; + s32 room; + s32 roomHF; + u32 reflectionPattern; + float decayTime; + float decayHFRatio; + s32 reflections; + float reflectionsDelay; + s32 reverb; + float reverbDelay; + float diffusion; + float density; + float HFReference; + u32 reserve[8]; +}; + +struct OrbisNgs2ReverbVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + + u32 numInputChannels; + u32 numOutputChannels; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2ReverbVoiceI3DL2Param { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2ReverbI3DL2Param i3dl2; +}; + +struct OrbisNgs2ReverbVoiceState { + OrbisNgs2VoiceState voiceState; +}; + +struct OrbisNgs2ReverbRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannels; + u32 reverbSize; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_sampler.cpp b/src/core/libraries/ngs2/ngs2_sampler.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_sampler.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_sampler.h b/src/core/libraries/ngs2/ngs2_sampler.h new file mode 100644 index 000000000..0842b9cb2 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_sampler.h @@ -0,0 +1,162 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Sampler; + +struct OrbisNgs2SamplerRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannelWorks; + u32 maxCodecCaches; + u32 maxWaveformBlocks; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; + u32 numPeakMeterBlocks; +}; + +struct OrbisNgs2SamplerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2WaveformFormat format; + u32 flags; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceWaveformBlocksParam { + OrbisNgs2VoiceParamHeader header; + + const void* data; + u32 flags; + u32 numBlocks; + const OrbisNgs2WaveformBlock* aBlock; + // Blocks +}; + +struct OrbisNgs2SamplerVoiceWaveformAddressParam { + OrbisNgs2VoiceParamHeader header; + + const void* from; + const void* to; +}; + +struct OrbisNgs2SamplerVoiceWaveformFrameOffsetParam { + OrbisNgs2VoiceParamHeader header; + + u32 frameOffset; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceExitLoopParam { + OrbisNgs2VoiceParamHeader header; +}; + +struct OrbisNgs2SamplerVoicePitchParam { + OrbisNgs2VoiceParamHeader header; + + float ratio; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceEnvelopeParam { + OrbisNgs2VoiceParamHeader header; + + u32 numForwardPoints; + u32 numReleasePoints; + const OrbisNgs2EnvelopePoint* aPoint; +}; + +struct OrbisNgs2SamplerVoiceDistortionParam { + OrbisNgs2VoiceParamHeader header; + + u32 flags; + float a; + float b; + float clip; + float gate; + float wetLevel; + float dryLevel; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceUserFxParam { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2UserFxProcessHandler handler; + + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; +}; + +struct OrbisNgs2SamplerVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceFilterParam { + OrbisNgs2VoiceParamHeader header; + + u32 index; + u32 location; + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; + u32 reserved3; +}; + +struct OrbisNgs2SamplerVoiceNumFilters { + OrbisNgs2VoiceParamHeader header; + + u32 numFilters; + u32 reserved; +}; + +struct OrbisNgs2SamplerVoiceState { + OrbisNgs2VoiceState voiceState; + float envelopeHeight; + float peakHeight; + u32 reserved; + u64 numDecodedSamples; + u64 decodedDataSize; + u64 userData; + const void* waveformData; +}; + +struct OrbisNgs2SamplerRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannelWorks; + u32 maxCodecCaches; + u32 maxWaveformBlocks; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxAtrac9Decoders; + u32 maxAtrac9ChannelWorks; + u32 maxAjmAtrac9Decoders; +}; + +} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_submixer.cpp b/src/core/libraries/ngs2/ngs2_submixer.cpp new file mode 100644 index 000000000..8c82e4e49 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_submixer.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "ngs2_error.h" +#include "ngs2_impl.h" + +#include "common/logging/log.h" +#include "core/libraries/error_codes.h" + +using namespace Libraries::Kernel; + +namespace Libraries::Ngs2 {} // namespace Libraries::Ngs2 diff --git a/src/core/libraries/ngs2/ngs2_submixer.h b/src/core/libraries/ngs2/ngs2_submixer.h new file mode 100644 index 000000000..df2d8a835 --- /dev/null +++ b/src/core/libraries/ngs2/ngs2_submixer.h @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "ngs2.h" + +namespace Libraries::Ngs2 { + +class Ngs2Submixer; + +struct OrbisNgs2SubmixerRackOption { + OrbisNgs2RackOption rackOption; + u32 maxChannels; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxInputs; + u32 numPeakMeterBlocks; +}; + +struct OrbisNgs2SubmixerVoiceSetupParam { + OrbisNgs2VoiceParamHeader header; + u32 numIoChannels; + u32 flags; +}; + +struct OrbisNgs2SubmixerVoiceEnvelopeParam { + OrbisNgs2VoiceParamHeader header; + + u32 numForwardPoints; + u32 numReleasePoints; + const OrbisNgs2EnvelopePoint* aPoint; +}; + +struct OrbisNgs2SubmixerVoiceCompressorParam { + OrbisNgs2VoiceParamHeader header; + + u32 flags; + float threshold; + float ratio; + float knee; + float attackTime; + float releaseTime; + float level; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceDistortionParam { + OrbisNgs2VoiceParamHeader header; + + u32 flags; + float a; + float b; + float clip; + float gate; + float wetLevel; + float dryLevel; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceUserFxParam { + OrbisNgs2VoiceParamHeader header; + + OrbisNgs2UserFxProcessHandler handler; + + uintptr_t userData0; + uintptr_t userData1; + uintptr_t userData2; +}; + +struct OrbisNgs2SubmixerVoicePeakMeterParam { + OrbisNgs2VoiceParamHeader header; + + u32 enableFlag; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceFilterParam { + OrbisNgs2VoiceParamHeader header; + + u32 index; + u32 location; + u32 type; + u32 channelMask; + union { + struct { + float i0; + float i1; + float i2; + float o1; + float o2; + } direct; + struct { + float fc; + float q; + float level; + u32 reserved; + u32 reserved2; + } fcq; + } param; + u32 reserved3; +}; + +struct OrbisNgs2SubmixerVoiceNumFilters { + OrbisNgs2VoiceParamHeader header; + + u32 numFilters; + u32 reserved; +}; + +struct OrbisNgs2SubmixerVoiceState { + OrbisNgs2VoiceState voiceState; + float envelopeHeight; + float peakHeight; + float compressorHeight; +}; + +struct OrbisNgs2SubmixerRackInfo { + OrbisNgs2RackInfo rackInfo; + u32 maxChannels; + u32 maxEnvelopePoints; + u32 maxFilters; + u32 maxInputs; +}; + +} // namespace Libraries::Ngs2 From 9c37aa039bff93a2dd11f1aeb500cc047bc6d817 Mon Sep 17 00:00:00 2001 From: illusion0001 <37698908+illusion0001@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:50:21 +1300 Subject: [PATCH 441/455] Add isDevKit bool (#2685) --- src/common/config.cpp | 8 ++++++++ src/common/config.h | 1 + src/core/memory.cpp | 10 ++++++++++ 3 files changed, 19 insertions(+) diff --git a/src/common/config.cpp b/src/common/config.cpp index e0a348fbe..16d9e5724 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -32,6 +32,7 @@ std::filesystem::path find_fs_path_or(const basic_value& v, const K& ky, namespace Config { static bool isNeo = false; +static bool isDevKit = false; static bool playBGM = false; static bool isTrophyPopupDisabled = false; static int BGMvolume = 50; @@ -167,6 +168,10 @@ bool isNeoModeConsole() { return isNeo; } +bool isDevKitConsole() { + return isDevKit; +} + bool getIsFullscreen() { return isFullscreen; } @@ -755,6 +760,7 @@ void load(const std::filesystem::path& path) { const toml::value& general = data.at("General"); isNeo = toml::find_or(general, "isPS4Pro", false); + isDevKit = toml::find_or(general, "isDevKit", false); playBGM = toml::find_or(general, "playBGM", false); isTrophyPopupDisabled = toml::find_or(general, "isTrophyPopupDisabled", false); trophyNotificationDuration = @@ -955,6 +961,7 @@ void save(const std::filesystem::path& path) { } data["General"]["isPS4Pro"] = isNeo; + data["General"]["isDevKit"] = isDevKit; data["General"]["isTrophyPopupDisabled"] = isTrophyPopupDisabled; data["General"]["trophyNotificationDuration"] = trophyNotificationDuration; data["General"]["playBGM"] = playBGM; @@ -1101,6 +1108,7 @@ void saveMainWindow(const std::filesystem::path& path) { void setDefaultValues() { isHDRAllowed = false; isNeo = false; + isDevKit = false; isFullscreen = false; isTrophyPopupDisabled = false; playBGM = false; diff --git a/src/common/config.h b/src/common/config.h index 4202da88a..1025e9956 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -28,6 +28,7 @@ void setLoadGameSizeEnabled(bool enable); bool getIsFullscreen(); std::string getFullscreenMode(); bool isNeoModeConsole(); +bool isDevKitConsole(); bool getPlayBGM(); int getBGMvolume(); bool getisTrophyPopupDisabled(); diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 98d587e00..8b108a654 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -38,6 +38,16 @@ void MemoryManager::SetupMemoryRegions(u64 flexible_size, bool use_extended_mem1 bool use_extended_mem2) { const bool is_neo = ::Libraries::Kernel::sceKernelIsNeoMode(); auto total_size = is_neo ? SCE_KERNEL_TOTAL_MEM_PRO : SCE_KERNEL_TOTAL_MEM; + if (Config::isDevKitConsole()) { + const auto old_size = total_size; + // Assuming 2gb is neo for now, will need to link it with sceKernelIsDevKit + total_size += is_neo ? 2_GB : 768_MB; + LOG_WARNING(Kernel_Vmm, + "Config::isDevKitConsole is enabled! Added additional {:s} of direct memory.", + is_neo ? "2 GB" : "768 MB"); + LOG_WARNING(Kernel_Vmm, "Old Direct Size: {:#x} -> New Direct Size: {:#x}", old_size, + total_size); + } if (!use_extended_mem1 && is_neo) { total_size -= 256_MB; } From 5caab76a4557b2721898e1257356ad3b3356dd2f Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 26 Mar 2025 22:03:50 +0100 Subject: [PATCH 442/455] Implement DmaDataSrc::MemoryUsingL2 and DmaDataDst::MemoryUsingL2 (#2680) * Implement DmaDataSrc::MemoryUsingL2 and DmaDataDst::MemoryUsingL2 * Add L2 handling to the other place it's used --- src/video_core/amdgpu/liverpool.cpp | 30 +++++++++++++++++++---------- src/video_core/amdgpu/pm4_cmds.h | 2 ++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index bfe99c754..967b952c6 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -602,20 +602,25 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::spansrc_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32), true); - } else if (dma_data->src_sel == DmaDataSrc::Memory && + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress(), dma_data->NumBytes(), true); } else if (dma_data->src_sel == DmaDataSrc::Data && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), &dma_data->data, sizeof(u32), false); } else if (dma_data->src_sel == DmaDataSrc::Gds && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { // LOG_WARNING(Render_Vulkan, "GDS memory read"); - } else if (dma_data->src_sel == DmaDataSrc::Memory && - dma_data->dst_sel == DmaDataDst::Memory) { + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), dma_data->SrcAddress(), dma_data->NumBytes(), false); @@ -785,19 +790,24 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq } if (dma_data->src_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32), true); - } else if (dma_data->src_sel == DmaDataSrc::Memory && + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && dma_data->dst_sel == DmaDataDst::Gds) { rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress(), dma_data->NumBytes(), true); } else if (dma_data->src_sel == DmaDataSrc::Data && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), &dma_data->data, sizeof(u32), false); } else if (dma_data->src_sel == DmaDataSrc::Gds && - dma_data->dst_sel == DmaDataDst::Memory) { + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { // LOG_WARNING(Render_Vulkan, "GDS memory read"); - } else if (dma_data->src_sel == DmaDataSrc::Memory && - dma_data->dst_sel == DmaDataDst::Memory) { + } else if ((dma_data->src_sel == DmaDataSrc::Memory || + dma_data->src_sel == DmaDataSrc::MemoryUsingL2) && + (dma_data->dst_sel == DmaDataDst::Memory || + dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) { rasterizer->InlineData(dma_data->DstAddress(), dma_data->SrcAddress(), dma_data->NumBytes(), false); diff --git a/src/video_core/amdgpu/pm4_cmds.h b/src/video_core/amdgpu/pm4_cmds.h index e92ba17fa..ae1d32e00 100644 --- a/src/video_core/amdgpu/pm4_cmds.h +++ b/src/video_core/amdgpu/pm4_cmds.h @@ -377,12 +377,14 @@ struct PM4CmdAcquireMem { enum class DmaDataDst : u32 { Memory = 0, Gds = 1, + MemoryUsingL2 = 3, }; enum class DmaDataSrc : u32 { Memory = 0, Gds = 1, Data = 2, + MemoryUsingL2 = 3, }; struct PM4DmaData { From ae2c9a745e43a1156405ba84ebf646882a744d71 Mon Sep 17 00:00:00 2001 From: Dmugetsu <168934208+diegolix29@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:50:52 -0600 Subject: [PATCH 443/455] Gui: Adding Pause button working, full screen button and labels to buttons on main window gui (#2634) * Adding names to gui buttoms and adjusting spacing. * moving refresh button to last slot. * Changing the implementation to tooltips for hover over them - qstring to detect background color. * Fixing some themes with inverted tooltip base * Suggestions / Fixes - Pause and FullScreen Buttons * Update REUSE.toml * cleaning up * Icons stuff * clang * Buttons toggle - Cleaning code - Fixing Icons * cleaning boolean * Toggle pause and play icons and label to "Resume" when paused. * Simplifying the toggles. * New icons and final Push to review * Reuse * Icon rename, adding f9 press for pause game when no gui is on without needed of debug menu * clang + reuse * clang dosent work on this part * again Clang * Last fix for review. Light theme white resume icon fix. * Proper fix for Resume icon * New Rebase * Fixed Orientation with docking issues and cleaning boxlayout code * Adding spacer to separate actions, sizeslider on top of search bar. And adding margins * Fixed Background not showing on OLED Theme * Fixing check marks * Adding all Daniel Suggestions and fixed F9 not working with debug menu open. * Clang * reverting all OLED theme changes * Final suggestions --- REUSE.toml | 4 +- src/common/config.cpp | 12 +++ src/common/config.h | 2 + src/core/devtools/layer.cpp | 43 +++++--- src/core/devtools/layer.h | 1 + src/images/controller_icon.png | Bin 9102 -> 4142 bytes src/images/fullscreen_icon.png | Bin 0 -> 2590 bytes src/images/pause_icon.png | Bin 965 -> 1972 bytes src/images/play_icon.png | Bin 1150 -> 2875 bytes src/images/refresh_icon.png | Bin 3381 -> 0 bytes src/images/refreshlist_icon.png | Bin 0 -> 3247 bytes src/images/restart_game_icon.png | Bin 0 -> 3935 bytes src/images/settings_icon.png | Bin 2219 -> 4543 bytes src/images/stop_icon.png | Bin 658 -> 1601 bytes src/qt_gui/main_window.cpp | 168 ++++++++++++++++++++++++++++-- src/qt_gui/main_window.h | 12 +++ src/qt_gui/main_window_themes.cpp | 45 ++++---- src/qt_gui/main_window_ui.h | 32 ++++-- src/sdl_window.cpp | 20 ++++ src/sdl_window.h | 2 + src/shadps4.qrc | 74 ++++++------- 21 files changed, 324 insertions(+), 91 deletions(-) create mode 100644 src/images/fullscreen_icon.png delete mode 100644 src/images/refresh_icon.png create mode 100644 src/images/refreshlist_icon.png create mode 100644 src/images/restart_game_icon.png diff --git a/REUSE.toml b/REUSE.toml index 793990bd8..ad2bc3678 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -49,8 +49,10 @@ path = [ "src/images/pause_icon.png", "src/images/play_icon.png", "src/images/ps4_controller.png", - "src/images/refresh_icon.png", + "src/images/restart_game_icon.png", + "src/images/refreshlist_icon.png", "src/images/settings_icon.png", + "src/images/fullscreen_icon.png", "src/images/stop_icon.png", "src/images/utils_icon.png", "src/images/shadPS4.icns", diff --git a/src/common/config.cpp b/src/common/config.cpp index 16d9e5724..09236f30c 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -107,6 +107,7 @@ static bool showBackgroundImage = true; static bool isFullscreen = false; static std::string fullscreenMode = "Windowed"; static bool isHDRAllowed = false; +static bool showLabelsUnderIcons = true; // Language u32 m_language = 1; // english @@ -176,6 +177,14 @@ bool getIsFullscreen() { return isFullscreen; } +bool getShowLabelsUnderIcons() { + return showLabelsUnderIcons; +} + +bool setShowLabelsUnderIcons() { + return false; +} + std::string getFullscreenMode() { return fullscreenMode; } @@ -427,6 +436,9 @@ void setVblankDiv(u32 value) { void setIsFullscreen(bool enable) { isFullscreen = enable; } +static void setShowLabelsUnderIcons(bool enable) { + showLabelsUnderIcons = enable; +} void setFullscreenMode(std::string mode) { fullscreenMode = mode; diff --git a/src/common/config.h b/src/common/config.h index 1025e9956..3a0bf252c 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -26,6 +26,8 @@ bool GetLoadGameSizeEnabled(); std::filesystem::path GetSaveDataPath(); void setLoadGameSizeEnabled(bool enable); bool getIsFullscreen(); +bool getShowLabelsUnderIcons(); +bool setShowLabelsUnderIcons(); std::string getFullscreenMode(); bool isNeoModeConsole(); bool isDevKitConsole(); diff --git a/src/core/devtools/layer.cpp b/src/core/devtools/layer.cpp index 87fd9ffb3..94b39e801 100644 --- a/src/core/devtools/layer.cpp +++ b/src/core/devtools/layer.cpp @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "SDL3/SDL_log.h" #include "layer.h" #include @@ -117,22 +118,6 @@ void L::DrawMenuBar() { EndMainMenuBar(); } - - if (IsKeyPressed(ImGuiKey_F9, false)) { - if (io.KeyCtrl && io.KeyAlt) { - if (!DebugState.ShouldPauseInSubmit()) { - DebugState.RequestFrameDump(dump_frame_count); - } - } - if (!io.KeyCtrl && !io.KeyAlt) { - if (isSystemPaused) { - DebugState.ResumeGuestThreads(); - } else { - DebugState.PauseGuestThreads(); - } - } - } - if (open_popup_options) { OpenPopup("GPU Tools Options"); just_opened_options = true; @@ -381,6 +366,32 @@ void L::Draw() { visibility_toggled = true; } + if (IsKeyPressed(ImGuiKey_F9, false)) { + if (io.KeyCtrl && io.KeyAlt) { + if (!DebugState.ShouldPauseInSubmit()) { + DebugState.RequestFrameDump(dump_frame_count); + } + } else { + if (DebugState.IsGuestThreadsPaused()) { + DebugState.ResumeGuestThreads(); + SDL_Log("Game resumed from Keyboard"); + show_pause_status = false; + } else { + DebugState.PauseGuestThreads(); + SDL_Log("Game paused from Keyboard"); + show_pause_status = true; + } + visibility_toggled = true; + } + } + + if (show_pause_status) { + ImVec2 pos = ImVec2(10, 10); + ImU32 color = IM_COL32(255, 255, 255, 255); + + ImGui::GetForegroundDrawList()->AddText(pos, color, "Game Paused Press F9 to Resume"); + } + if (show_simple_fps) { if (Begin("Video Info", nullptr, ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoDecoration | diff --git a/src/core/devtools/layer.h b/src/core/devtools/layer.h index 5bb53fbdb..9e949c8e9 100644 --- a/src/core/devtools/layer.h +++ b/src/core/devtools/layer.h @@ -19,6 +19,7 @@ public: static void SetupSettings(); void Draw() override; + bool show_pause_status = false; }; } // namespace Core::Devtools diff --git a/src/images/controller_icon.png b/src/images/controller_icon.png index 40c92a89bc53a9447d223c3c45286afe3b3d1673..0d5556329e55f8b1854821536a58a1ecd4d4528b 100644 GIT binary patch literal 4142 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 UN}CF^{5$l5tgc(4fqtp~1!=YDDgXcg literal 9102 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 DoToWu diff --git a/src/images/fullscreen_icon.png b/src/images/fullscreen_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..719ffe4a19b842f711a4cd6be61fcbfb668b6ef1 GIT binary patch literal 2590 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 literal 0 HcmV?d00001 diff --git a/src/images/pause_icon.png b/src/images/pause_icon.png index 5375689b7880bb46d843eca0f8494e66bee69f19..86bbc6acbd15eecfa96376cfe90511a7be46387d 100644 GIT binary patch literal 1972 zcmdT_i!arfy{iVAzJ9Gbo`tMNHA#@h>IfA7M$xv8To!iOS+ z!uBEnXs6+WaHM18#mo5Cow10st?dRo|D_QOsqwN!1e@q@-_j~Y7?#6qD};vME15Pv z(U|W@K^UBosebu>(?`bl49=V?w=HGt;NW_cMJ+i6_crQ@-wqeGY$TqDRFw)lCtBX~ zR-ZQ$3+PYG-}J4~cs!d7sm0td?I($U?R3sshp$b6G-u9=L8@n!P(%_Efm0xNq)8;9 z_0IAofiHTs*LrT1*0mYCWnVZ`yvE;**s2@xP!YWk?bvKgN$F=d;Injx$1aq9I4gy6}J(8 z`xSOLdBty+xCTAIoUyF!u!C>d9+=0XtmEBHmFI_5va!dr5~Ou&QD2$PHv`eNZ-Y~p zpN+C9f?{8XLsHZBT~8;tC?AD1r2R^D?pK5*=7aeIIO>5Q7sbptUeEq1)1hT7& z=Vs?@I3x*M(H%G^piVk5>zdC|P&cw)C4EsE;hq;k+1?pcTcp(MKJvibGsk#UOi4-K z<5}xToD55I8~B|(bm{%^S8!R|@%G9Ho#*cHCSP)cUnTK8UJ$aHkOz|`>}6d|re9jK zMM;A2deITR(nQqlwk9vWK8pZVq+hk_W$q7fsgpfFy_C^7vLGT?wQrv3EKgWB}q zfZe=4&c!kRNcK7U>s#y}VkWuEW<_-h!n)rTamnb7&fiPE_8Qew&AfBatE@0%^-l#x z$)mZ)MYJbzKF!p7;f#zO+C`?YSiiwI0=K7O27$sz}M(aUznWS^rI^g z_$#AppVG~K)b8S3u~YeH^giqUpj<>3 z@$5z$_g&Pal_hb%gx)0zYj}B8#V*#ISWIN`u0X|af*hF-1^vOkz<)vOBa7kLV`-Jf zIYBrpeCZ0u^A}AnJsbB%F$Vi;n;H)FJF`0SPUe&J`V_vJnN#7N3mzG>Fx4&w%N2_u z3t1Z!hnG&X(_-8tdIPFh_oppJMZ`)yl=h5kC@36hV1_DuB4cMs^0gSyz2;jiiY2W?XKr*L~&n`rOg yq4X_mcVRF$pQf;`3y&P1L&}yT-L$My4=tU-d1msLTBv`w>9f#KDkjb=i$8av~#YX{;OV|SJ{5L_TAEltb!0QbM7;y zxd$W{u}{pdTEZO}P* z=XB%hfAdnG|Kpj%CUzky_kag0|CjGy1vAzczRNw3!CSna!R(UK>%aW#0xy4Eyi7cG zy8Z5TJMDkOUs>|(>X&mFe;&`>wCK>zaK`yUXKd&EDt_wH)SmU@by{ojeJ_jehC)@r z1}9hyICxAdZ5fVnpPS7zEzF?!o9n~ygSE&0>YP1iYjIY*DO_dK)`Skl`K=M%jn%Br zZkAFq2JMXPm#^KX2PV@1u2pis@n4=i3V-r0m>{- zIU2ml$!l8Uq|^sf)>L?fd7Lx~*u*nulBoYlF3m_bpiJW z`Re&gZ|-bg7FqdaQcIsWPte!W#fNrQ3!kf;YA{&@cD64BQY zxBmzo-6i+Rdc)?nowu{&bS$6Qzlcs^{;;L3y^22vnA~Llv4?-Xqg=?&+KN6{`R67{1=U l`|swmAL-)I{E#;Lew559d%-E~fxvvp;OXk;vd$@?2>?c3y|VxS diff --git a/src/images/play_icon.png b/src/images/play_icon.png index 2815be39d8594b213fad22e68c7e8ac16872d639..d50d404b79bc4b5f5e7122e2f30cb5663ad3c4ad 100644 GIT binary patch delta 2848 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 LNkvXXu0mjf_p(8M diff --git a/src/images/refreshlist_icon.png b/src/images/refreshlist_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7de6685b27e195b1517d5058f11e48b079f4ee08 GIT binary patch literal 3247 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 literal 0 HcmV?d00001 diff --git a/src/images/restart_game_icon.png b/src/images/restart_game_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e549e10192135af9d1ba30522c3a405521a2259 GIT binary patch literal 3935 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 literal 0 HcmV?d00001 diff --git a/src/images/settings_icon.png b/src/images/settings_icon.png index c88cd7a6f16cbc54bbb44730d3dac206f3affe2b..81127bfa3e7856ac86bb645a79a905c4324d42b3 100644 GIT binary patch literal 4543 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 r0w|%4^SL>bXBXW&WwtaSTv9Aq5DDXYMx@8o?^} delta 2190 zcmV;92yyqnBdZaRB#}WBe+XSkL_t(|ob8=iY*s}S$N&8*%3j290Dc3|W|=7O4ghZe7#K#!ju8O z9tID6bEfxd6Zb zq?{Q5&gL}uJa0#DG0cBGfCfe9H3R5pArqC^B5a-e8PH;3xIb3Ob0NTU;SJ>j>Fk+olx`@8bA&P9ZeTc^A_|7fJ^+pfATu91i;;VQcnunf7af^&Jo|TEZG4#!m>W2IR8AQ z>4R|zwgaCFf_#d?VY|=|JChPZvN4<~FvHJ40DlYpL2tZwz7hm@9)-sXLVtYWyYjn) z%8vr*jAZBmU@F^9-s7`S75_|jjwuNq(mD(JH%b$HR=!%O_(`7?11JVClh>$AhC8EL z0Of-If6Nuq0#CLbFLV{=OWJ#P@_Yb2Y`8^L**-|E?~6{tne3D!O@pzWo6>7OD#U+| z3Y%jLMEkUf4~9N?U8vWK{eFj{GSZ?B_E6toR*kngP6t^#?V2HiM%l*ntmTZ*NK)Dj zbvzi29tI ziykiLEH-TDGTsr{vRPApGwX`RD0WX7w%}C?rrT^H{gf?Naa&FLd|$muI3r6~&sZ?JmnHrbJ^CKWOpr zf4pMQ{wD6LMCikZE=eFdybX&`=1k3-5of+H(Yz^9)cqq24yLt^4QocwYxo?13xZ%Z z4m=E-BTiE)ZWX3m>OfPZ2k`>;Ns=an|8cLd%bczDg`x*iSBEtaMn1@ zeUS?02u}^|&U8!_@{e&S=QyFB`(v&he~%+&s18PSgVxsDy~(j+FeCVnks4jcE=69l zHl~gjg;TMP6$x71b}8ywZje{CyQBvyb*Nl|$iG*|21VYr9^_Q5BXq9NabA)4AzVfS zLJrBc15%lww@jP?p|+=vFlD8TeTt`t)b=_m6nT%QY*F8-$V(fVRPjVi70MJLfB#sA za*mI=?S0wtWg;(37HlOgh6ls$f@kAehqA60PT1WH?H;Ow;Ti6Wyy04PQY#Fq=?yH2 zQG)6uikzRMQFUUXT%;%d<_Kk$3uV0dDrtw2 zo0h~h;chZ$WF;#KRVLi=ynyQ-9`bgyrI@|u^Jc;|adL36_3O!2Jd=i=VBJ*K$$_S| z-wpHDJGu~*Hzx<38xU;?T`@@GFB>;CIKDNT7dN1~gdODu8O;ASsov8Sf9Av;6r(*%}<{ zL)B=Cg5Z-3dxz8-ULd`|C-4~wTt`@#kLw7!>ue1PUfAi*%D@V?^ljj@oVB+18S187 z&_&~iOj~fTd?{3JqQbt?e^?~+2WbfMdL_CLFMXaC`h%_jCc+*;h;S_$#@;s0n4nou zJ6hl=P}sA)&^F|#HBPa$aTzP)d@sPcP+gO_?tM8|_F7oR8kV_V#DzTZzyZ)G*K$K^ zjOMe%#Ryx}@&x2BkFb?)A6nx!O=u0e9Gf`T8U&x&YuMn9(w3Mue-ITVF$4YUg3mPO zEBFl9AF0h_I$#-RQAPg<0cUKJO<+x@m|R?mllHNeATHfF>YGnleK_`69nyR^^aGE< znO#0ONgYOw_T#3PEf4c|qRM!OGoROsW+6{2$KA4JtU(aWEgX$v63g~>#2}ahF1IkT zyLo<9ZEHtrI)D~pe_LuihlzE0Wx{J9<#Vi%9FfvM%12`cQvN5+ft0h{0AL=ZRH{0STY0$P*Qc0il??Q8}O}s}M~E z*343LB7MFnD%nV*?bD+kt3LiUK(dU>D80m@ya|b3SmN zI<4&GOmF_00R=98m7Nn-a#+C4{PQyY+XDVy$`c3#0)apv5C{YU0d&m2p@aE8r}ynE Q00000NkvXX1g=70f&tk8-T(jq diff --git a/src/images/stop_icon.png b/src/images/stop_icon.png index 74c615f65a54bd8380a3e67f689d86038019edc6..55b6b01c7c4c20ce586a0145ccbbfe7db38cfc43 100644 GIT binary patch literal 1601 zcmeAS@N?(olHy`uVBq!ia0vp^DImQL70(Y)*K0-phSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo@wfhX`(y)37&w3&Rt70XRt82O%L|C5p=^+AG#Ht|;!HrcAtMum0FaIX z;>>myuy_`b4FaB$j0`WB5j2{m3_z&~>vp@3Xlx~Oh9v) zz$$|*Er2YjE<*zYknFd0hqp*vSLz3b#0O6o$B>G+w{yK$gr-Wgm4|PheXBJNS zg{G8*|NsAAllt+s$544k!o%~PJALkHT|a61 zNyzf;`(OJD{QfDQKQXz;@1Lf6(j+CJLt&N6_xRpZSU*AgiR+~=RsT=!f3p75mN`@B zpEx{eeg9Hlh47PSi@NWqy`RLAc+A=0_|w~;oPWMNbbVRc(i)F_`jL~$s_suVo;1tv z=+RHCKc}9lZI~OA^>fdXZINEp_L_FO@)ONJvToK{GtK;T_ESSoVFR&qJlj_4r|PBd zE_tqc`})+PhC2)E`fCF1CcHc5oc(?KljdEweudS4_g1}|A#D*{c6#y4yvB!2pH9n7 z)?d2YXiI_p$@eP1AD#acfAgt>h4{K@IiA-~hE8&C3bfJuesY(poZf@7pF8&G-+lV< z@ck+Jr}}Pblq*a^)#z1|HQ95I}0BA-%zNO4QeuO z&VAKgl77o!x!2hhv7A|cZ-vh~Tsw98_w-1M1D3{7U(cyIem|)_`TgZsxj5&Klguvi zw6ssXlx*wWm)FI7$A`^yaoJMy{a60X`u8+JK_%2`MP}yoFF|V_2Uus#Xr6VQzvHY! zMQ>16tYyuM4QEP1`q?a3RQ}~!E$Q)+U2E6BIU7ZeU0t`X)>uH8fnA7asG*)Tg|+|L z>x~W9s{5NTOPW7Ev^ulu*x9s|>f)x|e`f2Pot|WNf05zBWu{lwnM{~5>-y#HS&e@b z{=bOVYucE{qp9a-Y33Rs3zVERb=LnI`(=2ZO!>37e&*AvlPunCYO~4$R_jg*T%&qp z=DxS_d~8PQ{@?XC8{D2+xadrk>DwKyLB?6(O|yc3yBG^hJNJB(NpG*??lWbz5k?0u zX)op3dQ(NRd7tyNHWA~hsk5#te{EyGWBm4qn`M^h9ev4`6B}H%Svt9%6R(R8Uz_D1 z@%_~DCwi7${ZFEc%$vlIy9a8|m_x5Hj%{^aAA?sB}CnXb}Y`cq-|pL5>l z#Fnk*J8;jO=XATlkF;s`vofdkuYdabljzPDhRWg`1#$%s3Qky0dD{H>Tjts>q)s;Pb7n*6h+re$$!H6bLNxZl}X=?J*+FvB`m+GA3yobV*S1I zynHT+UObdLwfw|w)ybbM(>-K3yX!e)TdY1Eo7N{>DSJrRg1=VYyKKg;t+GeAzDXp00i_>zopr E0K^za>cWLdxmJqeaYUez~9^NjLra`DY8Sp;&0&QkN;qmtC9m^~iQ58_A_Neb2c6`26F&neh9wX8V@~tzW;(G}W2c zV$IJF8*WT}W%zvk+R3x{_4QmgG&`1`Hd{(ZYX zo~-abb2xIc_?6j@PP7%qypfAClUr`HE-8-JdPYH@YJY9&fr;+FOpnE$JACjEW5gWi zrSB!eE%{l08wvAA&-oIU`?=!$*IBc+T$q1+es!qgW6giFvT7LrzZTvs^#5YJ`tvQR mi{; #include #include @@ -132,23 +134,160 @@ void MainWindow::CreateActions() { m_theme_act_group->addAction(ui->setThemeOled); } +void MainWindow::PauseGame() { + SDL_Event event; + SDL_memset(&event, 0, sizeof(event)); + event.type = SDL_EVENT_TOGGLE_PAUSE; + is_paused = !is_paused; + UpdateToolbarButtons(); + SDL_PushEvent(&event); +} + +void MainWindow::toggleLabelsUnderIcons() { + bool showLabels = ui->toggleLabelsAct->isChecked(); + Config::setShowLabelsUnderIcons(); + UpdateToolbarLabels(); + if (isGameRunning) { + UpdateToolbarButtons(); + } +} + +void MainWindow::toggleFullscreen() { + SDL_Event event; + SDL_memset(&event, 0, sizeof(event)); + event.type = SDL_EVENT_TOGGLE_FULLSCREEN; + SDL_PushEvent(&event); +} + +QWidget* MainWindow::createButtonWithLabel(QPushButton* button, const QString& labelText, + bool showLabel) { + QWidget* container = new QWidget(this); + QVBoxLayout* layout = new QVBoxLayout(container); + layout->setAlignment(Qt::AlignCenter | Qt::AlignBottom); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(button); + + QLabel* label = nullptr; + if (showLabel && ui->toggleLabelsAct->isChecked()) { + label = new QLabel(labelText, this); + label->setAlignment(Qt::AlignCenter | Qt::AlignBottom); + layout->addWidget(label); + button->setToolTip(""); + } else { + button->setToolTip(labelText); + } + + container->setLayout(layout); + container->setProperty("buttonLabel", QVariant::fromValue(label)); + return container; +} + +QWidget* createSpacer(QWidget* parent) { + QWidget* spacer = new QWidget(parent); + spacer->setFixedWidth(15); + spacer->setFixedHeight(15); + return spacer; +} + void MainWindow::AddUiWidgets() { // add toolbar widgets QApplication::setStyle("Fusion"); - ui->toolBar->setObjectName("mw_toolbar"); - ui->toolBar->addWidget(ui->playButton); - ui->toolBar->addWidget(ui->pauseButton); - ui->toolBar->addWidget(ui->stopButton); - ui->toolBar->addWidget(ui->refreshButton); - ui->toolBar->addWidget(ui->settingsButton); - ui->toolBar->addWidget(ui->controllerButton); - ui->toolBar->addWidget(ui->keyboardButton); + + bool showLabels = ui->toggleLabelsAct->isChecked(); + ui->toolBar->clear(); + + ui->toolBar->addWidget(createSpacer(this)); + ui->toolBar->addWidget(createButtonWithLabel(ui->playButton, tr("Play"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->pauseButton, tr("Pause"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->stopButton, tr("Stop"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->restartButton, tr("Restart"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); + ui->toolBar->addWidget(createButtonWithLabel(ui->settingsButton, tr("Settings"), showLabels)); + ui->toolBar->addWidget( + createButtonWithLabel(ui->fullscreenButton, tr("Full Screen"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); + ui->toolBar->addWidget( + createButtonWithLabel(ui->controllerButton, tr("Controllers"), showLabels)); + ui->toolBar->addWidget(createButtonWithLabel(ui->keyboardButton, tr("Keyboard"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); QFrame* line = new QFrame(this); - line->setFrameShape(QFrame::StyledPanel); + line->setFrameShape(QFrame::VLine); line->setFrameShadow(QFrame::Sunken); + line->setMinimumWidth(2); ui->toolBar->addWidget(line); - ui->toolBar->addWidget(ui->sizeSliderContainer); - ui->toolBar->addWidget(ui->mw_searchbar); + ui->toolBar->addWidget(createSpacer(this)); + if (showLabels) { + QLabel* pauseButtonLabel = ui->pauseButton->parentWidget()->findChild(); + if (pauseButtonLabel) { + pauseButtonLabel->setVisible(false); + } + } + ui->toolBar->addWidget( + createButtonWithLabel(ui->refreshButton, tr("Refresh List"), showLabels)); + ui->toolBar->addWidget(createSpacer(this)); + + QBoxLayout* toolbarLayout = new QBoxLayout(QBoxLayout::TopToBottom); + toolbarLayout->setSpacing(2); + toolbarLayout->setContentsMargins(2, 2, 2, 2); + ui->sizeSliderContainer->setFixedWidth(150); + + QWidget* searchSliderContainer = new QWidget(this); + QBoxLayout* searchSliderLayout = new QBoxLayout(QBoxLayout::TopToBottom); + searchSliderLayout->setContentsMargins(0, 0, 6, 6); + searchSliderLayout->setSpacing(2); + ui->mw_searchbar->setFixedWidth(150); + + searchSliderLayout->addWidget(ui->sizeSliderContainer); + searchSliderLayout->addWidget(ui->mw_searchbar); + + searchSliderContainer->setLayout(searchSliderLayout); + + ui->toolBar->addWidget(searchSliderContainer); + + if (!showLabels) { + toolbarLayout->addWidget(searchSliderContainer); + } + + ui->playButton->setVisible(true); + ui->pauseButton->setVisible(false); +} + +void MainWindow::UpdateToolbarButtons() { + // add toolbar widgets when game is running + bool showLabels = ui->toggleLabelsAct->isChecked(); + + ui->playButton->setVisible(false); + ui->pauseButton->setVisible(true); + + if (showLabels) { + QLabel* playButtonLabel = ui->playButton->parentWidget()->findChild(); + if (playButtonLabel) + playButtonLabel->setVisible(false); + } + + if (is_paused) { + ui->pauseButton->setIcon(ui->playButton->icon()); + ui->pauseButton->setToolTip(tr("Resume")); + } else { + if (isIconBlack) { + ui->pauseButton->setIcon(QIcon(":images/pause_icon.png")); + } else { + ui->pauseButton->setIcon(RecolorIcon(QIcon(":images/pause_icon.png"), isWhite)); + } + ui->pauseButton->setToolTip(tr("Pause")); + } + + if (showLabels) { + QLabel* pauseButtonLabel = ui->pauseButton->parentWidget()->findChild(); + if (pauseButtonLabel) { + pauseButtonLabel->setText(is_paused ? tr("Resume") : tr("Pause")); + pauseButtonLabel->setVisible(true); + } + } +} + +void MainWindow::UpdateToolbarLabels() { + AddUiWidgets(); } void MainWindow::CreateDockWindows() { @@ -253,6 +392,8 @@ void MainWindow::CreateConnects() { connect(ui->refreshButton, &QPushButton::clicked, this, &MainWindow::RefreshGameTable); connect(ui->showGameListAct, &QAction::triggered, this, &MainWindow::ShowGameList); connect(this, &MainWindow::ExtractionFinished, this, &MainWindow::RefreshGameTable); + connect(ui->toggleLabelsAct, &QAction::toggled, this, &MainWindow::toggleLabelsUnderIcons); + connect(ui->fullscreenButton, &QPushButton::clicked, this, &MainWindow::toggleFullscreen); connect(ui->sizeSlider, &QSlider::valueChanged, this, [this](int value) { if (isTableList) { @@ -276,6 +417,7 @@ void MainWindow::CreateConnects() { }); connect(ui->playButton, &QPushButton::clicked, this, &MainWindow::StartGame); + connect(ui->pauseButton, &QPushButton::clicked, this, &MainWindow::PauseGame); connect(m_game_grid_frame.get(), &QTableWidget::cellDoubleClicked, this, &MainWindow::StartGame); connect(m_game_list_frame.get(), &QTableWidget::cellDoubleClicked, this, @@ -743,6 +885,8 @@ void MainWindow::StartGame() { return; } StartEmulator(path); + + UpdateToolbarButtons(); } } @@ -1217,7 +1361,9 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->pauseButton->setIcon(RecolorIcon(ui->pauseButton->icon(), isWhite)); ui->stopButton->setIcon(RecolorIcon(ui->stopButton->icon(), isWhite)); ui->refreshButton->setIcon(RecolorIcon(ui->refreshButton->icon(), isWhite)); + ui->restartButton->setIcon(RecolorIcon(ui->restartButton->icon(), isWhite)); ui->settingsButton->setIcon(RecolorIcon(ui->settingsButton->icon(), isWhite)); + ui->fullscreenButton->setIcon(RecolorIcon(ui->fullscreenButton->icon(), isWhite)); ui->controllerButton->setIcon(RecolorIcon(ui->controllerButton->icon(), isWhite)); ui->keyboardButton->setIcon(RecolorIcon(ui->keyboardButton->icon(), isWhite)); ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite)); diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h index 5ac56e44c..bcd5e53ba 100644 --- a/src/qt_gui/main_window.h +++ b/src/qt_gui/main_window.h @@ -5,6 +5,7 @@ #include #include +#include #include #include "background_music_player.h" @@ -38,6 +39,8 @@ public: void InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg); void InstallDirectory(); void StartGame(); + void PauseGame(); + bool showLabels; private Q_SLOTS: void ConfigureGuiFromSettings(); @@ -47,15 +50,21 @@ private Q_SLOTS: void RefreshGameTable(); void HandleResize(QResizeEvent* event); void OnLanguageChanged(const std::string& locale); + void toggleLabelsUnderIcons(); private: Ui_MainWindow* ui; void AddUiWidgets(); + void UpdateToolbarLabels(); + void UpdateToolbarButtons(); + QWidget* createButtonWithLabel(QPushButton* button, const QString& labelText, bool showLabel); void CreateActions(); + void toggleFullscreen(); void CreateRecentGameActions(); void CreateDockWindows(); void GetPhysicalDevices(); void LoadGameLists(); + #ifdef ENABLE_UPDATER void CheckUpdateMain(bool checkSave); #endif @@ -73,6 +82,9 @@ private: bool isIconBlack = false; bool isTableList = true; bool isGameRunning = false; + bool isWhite = false; + bool is_paused = false; + QActionGroup* m_icon_size_act_group = nullptr; QActionGroup* m_list_mode_act_group = nullptr; QActionGroup* m_theme_act_group = nullptr; diff --git a/src/qt_gui/main_window_themes.cpp b/src/qt_gui/main_window_themes.cpp index c5574fca9..624673cba 100644 --- a/src/qt_gui/main_window_themes.cpp +++ b/src/qt_gui/main_window_themes.cpp @@ -19,7 +19,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); themePalette.setColor(QPalette::Base, QColor(20, 20, 20)); themePalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53)); - themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipBase, QColor(20, 20, 20)); themePalette.setColor(QPalette::ToolTipText, Qt::white); themePalette.setColor(QPalette::Text, Qt::white); themePalette.setColor(QPalette::Button, QColor(53, 53, 53)); @@ -37,18 +37,18 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { "border-radius: 4px; padding: 5px; }" "QLineEdit:focus {" "border: 1px solid #2A82DA; }"); - themePalette.setColor(QPalette::Window, QColor(240, 240, 240)); // Light gray - themePalette.setColor(QPalette::WindowText, Qt::black); // Black - themePalette.setColor(QPalette::Base, QColor(230, 230, 230, 80)); // Grayish - themePalette.setColor(QPalette::ToolTipBase, Qt::black); // Black - themePalette.setColor(QPalette::ToolTipText, Qt::black); // Black - themePalette.setColor(QPalette::Text, Qt::black); // Black - themePalette.setColor(QPalette::Button, QColor(240, 240, 240)); // Light gray - themePalette.setColor(QPalette::ButtonText, Qt::black); // Black - themePalette.setColor(QPalette::BrightText, Qt::red); // Red - themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); // Blue - themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); // Blue - themePalette.setColor(QPalette::HighlightedText, Qt::white); // White + themePalette.setColor(QPalette::Window, QColor(240, 240, 240)); // Light gray + themePalette.setColor(QPalette::WindowText, Qt::black); // Black + themePalette.setColor(QPalette::Base, QColor(230, 230, 230, 80)); // Grayish + themePalette.setColor(QPalette::ToolTipBase, QColor(230, 230, 230, 80)); // Grayish + themePalette.setColor(QPalette::ToolTipText, Qt::black); // Black + themePalette.setColor(QPalette::Text, Qt::black); // Black + themePalette.setColor(QPalette::Button, QColor(240, 240, 240)); // Light gray + themePalette.setColor(QPalette::ButtonText, Qt::black); // Black + themePalette.setColor(QPalette::BrightText, Qt::red); // Red + themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); // Blue + themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); // Blue + themePalette.setColor(QPalette::HighlightedText, Qt::white); // White qApp->setPalette(themePalette); break; case Theme::Green: @@ -62,8 +62,9 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); // White text themePalette.setColor(QPalette::Base, QColor(25, 40, 25)); // Darker green base themePalette.setColor(QPalette::AlternateBase, - QColor(53, 69, 53)); // Dark green alternate base - themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background + QColor(53, 69, 53)); // Dark green alternate base + themePalette.setColor(QPalette::ToolTipBase, + QColor(25, 40, 25)); // White tooltip background themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text themePalette.setColor(QPalette::Text, Qt::white); // White text themePalette.setColor(QPalette::Button, QColor(53, 69, 53)); // Dark green button @@ -85,8 +86,9 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); // White text themePalette.setColor(QPalette::Base, QColor(20, 40, 60)); // Darker blue base themePalette.setColor(QPalette::AlternateBase, - QColor(40, 60, 90)); // Dark blue alternate base - themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background + QColor(40, 60, 90)); // Dark blue alternate base + themePalette.setColor(QPalette::ToolTipBase, + QColor(20, 40, 60)); // White tooltip background themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text themePalette.setColor(QPalette::Text, Qt::white); // White text themePalette.setColor(QPalette::Button, QColor(40, 60, 90)); // Dark blue button @@ -109,8 +111,9 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, Qt::white); // White text themePalette.setColor(QPalette::Base, QColor(80, 30, 90)); // Darker violet base themePalette.setColor(QPalette::AlternateBase, - QColor(100, 50, 120)); // Violet alternate base - themePalette.setColor(QPalette::ToolTipBase, Qt::white); // White tooltip background + QColor(100, 50, 120)); // Violet alternate base + themePalette.setColor(QPalette::ToolTipBase, + QColor(80, 30, 90)); // White tooltip background themePalette.setColor(QPalette::ToolTipText, Qt::white); // White tooltip text themePalette.setColor(QPalette::Text, Qt::white); // White text themePalette.setColor(QPalette::Button, QColor(100, 50, 120)); // Violet button @@ -133,7 +136,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, QColor(249, 245, 215)); themePalette.setColor(QPalette::Base, QColor(29, 32, 33)); themePalette.setColor(QPalette::AlternateBase, QColor(50, 48, 47)); - themePalette.setColor(QPalette::ToolTipBase, QColor(249, 245, 215)); + themePalette.setColor(QPalette::ToolTipBase, QColor(29, 32, 33)); themePalette.setColor(QPalette::ToolTipText, QColor(249, 245, 215)); themePalette.setColor(QPalette::Text, QColor(249, 245, 215)); themePalette.setColor(QPalette::Button, QColor(40, 40, 40)); @@ -155,7 +158,7 @@ void WindowThemes::SetWindowTheme(Theme theme, QLineEdit* mw_searchbar) { themePalette.setColor(QPalette::WindowText, QColor(192, 202, 245)); themePalette.setColor(QPalette::Base, QColor(25, 28, 39)); themePalette.setColor(QPalette::AlternateBase, QColor(36, 40, 59)); - themePalette.setColor(QPalette::ToolTipBase, QColor(192, 202, 245)); + themePalette.setColor(QPalette::ToolTipBase, QColor(25, 28, 39)); themePalette.setColor(QPalette::ToolTipText, QColor(192, 202, 245)); themePalette.setColor(QPalette::Text, QColor(192, 202, 245)); themePalette.setColor(QPalette::Button, QColor(30, 30, 41)); diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index 246c2afd6..c4f47b636 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -20,6 +20,7 @@ public: QAction* setIconSizeSmallAct; QAction* setIconSizeMediumAct; QAction* setIconSizeLargeAct; + QAction* toggleLabelsAct; QAction* setlistModeListAct; QAction* setlistModeGridAct; QAction* setlistElfAct; @@ -50,6 +51,8 @@ public: QPushButton* settingsButton; QPushButton* controllerButton; QPushButton* keyboardButton; + QPushButton* fullscreenButton; + QPushButton* restartButton; QWidget* sizeSliderContainer; QHBoxLayout* sizeSliderContainer_layout; @@ -104,7 +107,15 @@ public: showGameListAct->setCheckable(true); refreshGameListAct = new QAction(MainWindow); refreshGameListAct->setObjectName("refreshGameListAct"); - refreshGameListAct->setIcon(QIcon(":images/refresh_icon.png")); + refreshGameListAct->setIcon(QIcon(":images/refreshlist_icon.png")); + + toggleLabelsAct = new QAction(MainWindow); + toggleLabelsAct->setObjectName("toggleLabelsAct"); + toggleLabelsAct->setText( + QCoreApplication::translate("MainWindow", "Show Labels Under Icons")); + toggleLabelsAct->setCheckable(true); + toggleLabelsAct->setChecked(Config::getShowLabelsUnderIcons()); + setIconSizeTinyAct = new QAction(MainWindow); setIconSizeTinyAct->setObjectName("setIconSizeTinyAct"); setIconSizeTinyAct->setCheckable(true); @@ -210,20 +221,28 @@ public: stopButton->setIconSize(QSize(40, 40)); refreshButton = new QPushButton(centralWidget); refreshButton->setFlat(true); - refreshButton->setIcon(QIcon(":images/refresh_icon.png")); - refreshButton->setIconSize(QSize(32, 32)); + refreshButton->setIcon(QIcon(":images/refreshlist_icon.png")); + refreshButton->setIconSize(QSize(40, 40)); + fullscreenButton = new QPushButton(centralWidget); + fullscreenButton->setFlat(true); + fullscreenButton->setIcon(QIcon(":images/fullscreen_icon.png")); + fullscreenButton->setIconSize(QSize(38, 38)); settingsButton = new QPushButton(centralWidget); settingsButton->setFlat(true); settingsButton->setIcon(QIcon(":images/settings_icon.png")); - settingsButton->setIconSize(QSize(44, 44)); + settingsButton->setIconSize(QSize(40, 40)); controllerButton = new QPushButton(centralWidget); controllerButton->setFlat(true); controllerButton->setIcon(QIcon(":images/controller_icon.png")); - controllerButton->setIconSize(QSize(40, 40)); + controllerButton->setIconSize(QSize(55, 48)); keyboardButton = new QPushButton(centralWidget); keyboardButton->setFlat(true); keyboardButton->setIcon(QIcon(":images/keyboard_icon.png")); - keyboardButton->setIconSize(QSize(48, 44)); + keyboardButton->setIconSize(QSize(50, 50)); + restartButton = new QPushButton(centralWidget); + restartButton->setFlat(true); + restartButton->setIcon(QIcon(":images/restart_game_icon.png")); + restartButton->setIconSize(QSize(40, 40)); sizeSliderContainer = new QWidget(centralWidget); sizeSliderContainer->setObjectName("sizeSliderContainer"); @@ -304,6 +323,7 @@ public: menuView->addAction(refreshGameListAct); menuView->addAction(menuGame_List_Mode->menuAction()); menuView->addAction(menuGame_List_Icons->menuAction()); + menuView->addAction(toggleLabelsAct); menuView->addAction(menuThemes->menuAction()); menuThemes->addAction(setThemeDark); menuThemes->addAction(setThemeLight); diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index 80d196147..fcdde7240 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -11,6 +11,7 @@ #include "common/config.h" #include "common/elf_info.h" #include "common/version.h" +#include "core/debug_state.h" #include "core/libraries/kernel/time.h" #include "core/libraries/pad/pad.h" #include "imgui/renderer/imgui_core.h" @@ -396,6 +397,25 @@ void WindowSDL::WaitEvent() { case SDL_EVENT_QUIT: is_open = false; break; + case SDL_EVENT_TOGGLE_FULLSCREEN: { + if (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) { + SDL_SetWindowFullscreen(window, 0); + } else { + SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN); + } + break; + } + case SDL_EVENT_TOGGLE_PAUSE: + SDL_Log("Received SDL_EVENT_TOGGLE_PAUSE"); + + if (DebugState.IsGuestThreadsPaused()) { + SDL_Log("Game Resumed"); + DebugState.ResumeGuestThreads(); + } else { + SDL_Log("Game Paused"); + DebugState.PauseGuestThreads(); + } + break; default: break; } diff --git a/src/sdl_window.h b/src/sdl_window.h index 03ba0797b..48a9be58c 100644 --- a/src/sdl_window.h +++ b/src/sdl_window.h @@ -7,6 +7,8 @@ #include "core/libraries/pad/pad.h" #include "input/controller.h" #include "string" +#define SDL_EVENT_TOGGLE_FULLSCREEN (SDL_EVENT_USER + 1) +#define SDL_EVENT_TOGGLE_PAUSE (SDL_EVENT_USER + 2) struct SDL_Window; struct SDL_Gamepad; diff --git a/src/shadps4.qrc b/src/shadps4.qrc index 340756f5c..83dea01c4 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -1,38 +1,40 @@ - - images/shadps4.ico - images/about_icon.png - images/dump_icon.png - images/play_icon.png - images/pause_icon.png - images/stop_icon.png - images/utils_icon.png - images/file_icon.png - images/trophy_icon.png - images/folder_icon.png - images/themes_icon.png - images/iconsize_icon.png - images/list_icon.png - images/grid_icon.png - images/exit_icon.png - images/settings_icon.png - images/controller_icon.png - images/refresh_icon.png - images/update_icon.png - images/list_mode_icon.png - images/flag_jp.png - images/flag_eu.png - images/flag_unk.png - images/flag_us.png - images/flag_world.png - images/flag_china.png - images/github.png - images/discord.png - images/ko-fi.png - images/youtube.png - images/website.png - images/ps4_controller.png - images/keyboard_icon.png - images/KBM.png - + + images/shadps4.ico + images/about_icon.png + images/dump_icon.png + images/play_icon.png + images/pause_icon.png + images/stop_icon.png + images/utils_icon.png + images/file_icon.png + images/folder_icon.png + images/themes_icon.png + images/iconsize_icon.png + images/list_icon.png + images/grid_icon.png + images/exit_icon.png + images/settings_icon.png + images/controller_icon.png + images/restart_game_icon.png + images/update_icon.png + images/list_mode_icon.png + images/flag_jp.png + images/flag_eu.png + images/flag_unk.png + images/flag_us.png + images/flag_world.png + images/flag_china.png + images/github.png + images/discord.png + images/ko-fi.png + images/youtube.png + images/website.png + images/ps4_controller.png + images/keyboard_icon.png + images/KBM.png + images/fullscreen_icon.png + images/refreshlist_icon.png + images/trophy_icon.png + From 437af9320104011b32c34c85a6d888a78969b705 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Wed, 26 Mar 2025 23:51:17 +0200 Subject: [PATCH 444/455] New translations en_us.ts (Chinese Traditional) (#2691) --- src/qt_gui/translations/zh_TW.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index bd546380a..fb42a43b0 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -407,7 +407,7 @@ ControlSettings Configure Controls - Configure Controls + 操控設定 D-Pad @@ -519,7 +519,7 @@ Color Adjustment - Color Adjustment + 色彩調整 R: @@ -543,7 +543,7 @@ Unable to Save - Unable to Save + 無法保存 Cannot bind axis values more than once @@ -551,11 +551,11 @@ Save - Save + 保存 Apply - Apply + 套用 Restore Defaults @@ -563,7 +563,7 @@ Cancel - Cancel + 取消 @@ -578,7 +578,7 @@ Error - Error + 錯誤 Could not open the file for reading @@ -590,7 +590,7 @@ Save Changes - Save Changes + 儲存變更 Do you want to save changes? From c96853816a7d0897a113352c186ff40b94ea885c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 27 Mar 2025 12:14:09 +0200 Subject: [PATCH 445/455] [ci skip] Qt GUI: Update Translation. (#2692) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 20cba0378..d18609295 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + + + + Pause + + + + Stop + + + + Restart + + + + Full Screen + + + + Controllers + + + + Keyboard + + + + Refresh List + + + + Resume + + + + Show Labels Under Icons + + PKGViewer From 602de0c370467f75d07a7841672e8dacd09faec5 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:40:15 +0100 Subject: [PATCH 446/455] Fork detection: Fix PR actions only showing HEAD as the branch name (#2697) * I'd be very surprised if this works 1st try * More logging and cleanup * Minor fixes --- CMakeLists.txt | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c0932b5c..b3d214ec9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,28 +113,39 @@ git_describe(GIT_DESC --always --long --dirty) git_branch_name(GIT_BRANCH) string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S") +message("start git things") # Try to get the upstream remote and branch +message("check for remote and branch") execute_process( COMMAND git rev-parse --abbrev-ref --symbolic-full-name @{u} OUTPUT_VARIABLE GIT_REMOTE_NAME - RESULT_VARIABLE GIT_BRANCH_RESULT + RESULT_VARIABLE GIT_REMOTE_RESULT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) - # If there's no upstream set or the command failed, check remote.pushDefault -if (GIT_BRANCH_RESULT OR GIT_REMOTE_NAME STREQUAL "") +if (GIT_REMOTE_RESULT OR GIT_REMOTE_NAME STREQUAL "") + message("check default push") execute_process( COMMAND git config --get remote.pushDefault OUTPUT_VARIABLE GIT_REMOTE_NAME - RESULT_VARIABLE GIT_PUSH_DEFAULT_RESULT + RESULT_VARIABLE GIT_REMOTE_RESULT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) - - # If remote.pushDefault is not set or fails, default to origin - if (GIT_PUSH_DEFAULT_RESULT OR GIT_REMOTE_NAME STREQUAL "") - set(GIT_REMOTE_NAME "origin") +endif() +# If running in GitHub Actions and the above fails +if (GIT_REMOTE_RESULT OR GIT_REMOTE_NAME STREQUAL "") + message("check github") + set(GIT_REMOTE_NAME "origin") + + if (DEFINED ENV{GITHUB_HEAD_REF}) # PR branch name + set(GIT_BRANCH "pr-$ENV{GITHUB_HEAD_REF}") + elseif (DEFINED ENV{GITHUB_REF}) # Normal branch name + string(REGEX REPLACE "^refs/[^/]*/" "" GIT_BRANCH "$ENV{GITHUB_REF}") + else() + message("couldn't find branch") + set(GIT_BRANCH "detached-head") endif() else() # Extract remote name if the output contains a remote/branch format @@ -148,6 +159,7 @@ else() endif() # Get remote link +message("getting remote link") execute_process( COMMAND git config --get remote.${GIT_REMOTE_NAME}.url OUTPUT_VARIABLE GIT_REMOTE_URL @@ -156,6 +168,8 @@ execute_process( configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/common/scm_rev.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/src/common/scm_rev.cpp" @ONLY) +message("end git things, remote: ${GIT_REMOTE_NAME}, branch: ${GIT_BRANCH}") + find_package(Boost 1.84.0 CONFIG) find_package(FFmpeg 5.1.2 MODULE) find_package(fmt 10.2.0 CONFIG) From d339b3f7d663ba89bb5b3cd572ead77b41b0f0a8 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Thu, 27 Mar 2025 20:40:40 +0000 Subject: [PATCH 447/455] change async to sync (#2698) --- src/common/config.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 09236f30c..b113ac0ef 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -41,7 +41,7 @@ static u32 screenWidth = 1280; static u32 screenHeight = 720; static s32 gpuId = -1; // Vulkan physical device index. Set to negative for auto select static std::string logFilter; -static std::string logType = "async"; +static std::string logType = "sync"; static std::string userName = "shadPS4"; static std::string updateChannel; static std::string chooseHomeTab; @@ -1129,7 +1129,7 @@ void setDefaultValues() { screenWidth = 1280; screenHeight = 720; logFilter = ""; - logType = "async"; + logType = "sync"; userName = "shadPS4"; if (Common::isRelease) { updateChannel = "Release"; From be22674f8c1ac84e1cff89947ff4a6753070f21b Mon Sep 17 00:00:00 2001 From: IndecisiveTurtle <47210458+raphaelthegreat@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:15:31 +0200 Subject: [PATCH 448/455] code: Remove fpkg code Signed-off-by: georgemoralis --- CMakeLists.txt | 9 - src/core/crypto/crypto.cpp | 215 ---------- src/core/crypto/crypto.h | 63 --- src/core/crypto/keys.h | 305 -------------- src/core/file_format/pkg.h | 174 -------- src/core/file_format/pkg_type.cpp | 638 ------------------------------ src/core/file_format/pkg_type.h | 10 - src/core/file_format/trp.cpp | 30 +- src/core/file_format/trp.h | 4 +- src/qt_gui/main_window.cpp | 284 +------------ src/qt_gui/main_window.h | 18 - src/qt_gui/main_window_ui.h | 17 +- src/qt_gui/pkg_viewer.cpp | 217 ---------- src/qt_gui/pkg_viewer.h | 62 --- 14 files changed, 31 insertions(+), 2015 deletions(-) delete mode 100644 src/core/crypto/crypto.cpp delete mode 100644 src/core/crypto/crypto.h delete mode 100644 src/core/crypto/keys.h delete mode 100644 src/core/file_format/pkg.h delete mode 100644 src/core/file_format/pkg_type.cpp delete mode 100644 src/core/file_format/pkg_type.h delete mode 100644 src/qt_gui/pkg_viewer.cpp delete mode 100644 src/qt_gui/pkg_viewer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b3d214ec9..0359246c8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -653,9 +653,6 @@ set(CORE src/core/aerolib/stubs.cpp src/core/aerolib/aerolib.h src/core/address_space.cpp src/core/address_space.h - src/core/crypto/crypto.cpp - src/core/crypto/crypto.h - src/core/crypto/keys.h src/core/devices/base_device.cpp src/core/devices/base_device.h src/core/devices/ioccom.h @@ -673,10 +670,6 @@ set(CORE src/core/aerolib/stubs.cpp src/core/devices/srandom_device.cpp src/core/devices/srandom_device.h src/core/file_format/pfs.h - src/core/file_format/pkg.cpp - src/core/file_format/pkg.h - src/core/file_format/pkg_type.cpp - src/core/file_format/pkg_type.h src/core/file_format/psf.cpp src/core/file_format/psf.h src/core/file_format/playgo_chunk.cpp @@ -978,8 +971,6 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/game_install_dialog.h src/qt_gui/install_dir_select.cpp src/qt_gui/install_dir_select.h - src/qt_gui/pkg_viewer.cpp - src/qt_gui/pkg_viewer.h src/qt_gui/trophy_viewer.cpp src/qt_gui/trophy_viewer.h src/qt_gui/elf_viewer.cpp diff --git a/src/core/crypto/crypto.cpp b/src/core/crypto/crypto.cpp deleted file mode 100644 index 4020edfd8..000000000 --- a/src/core/crypto/crypto.cpp +++ /dev/null @@ -1,215 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include "crypto.h" - -CryptoPP::RSA::PrivateKey Crypto::key_pkg_derived_key3_keyset_init() { - CryptoPP::InvertibleRSAFunction params; - params.SetPrime1(CryptoPP::Integer(PkgDerivedKey3Keyset::Prime1, 0x80)); - params.SetPrime2(CryptoPP::Integer(PkgDerivedKey3Keyset::Prime2, 0x80)); - - params.SetPublicExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::PublicExponent, 4)); - params.SetPrivateExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::PrivateExponent, 0x100)); - - params.SetModPrime1PrivateExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::Exponent1, 0x80)); - params.SetModPrime2PrivateExponent(CryptoPP::Integer(PkgDerivedKey3Keyset::Exponent2, 0x80)); - - params.SetModulus(CryptoPP::Integer(PkgDerivedKey3Keyset::Modulus, 0x100)); - params.SetMultiplicativeInverseOfPrime2ModPrime1( - CryptoPP::Integer(PkgDerivedKey3Keyset::Coefficient, 0x80)); - - CryptoPP::RSA::PrivateKey privateKey(params); - - return privateKey; -} - -CryptoPP::RSA::PrivateKey Crypto::FakeKeyset_keyset_init() { - CryptoPP::InvertibleRSAFunction params; - params.SetPrime1(CryptoPP::Integer(FakeKeyset::Prime1, 0x80)); - params.SetPrime2(CryptoPP::Integer(FakeKeyset::Prime2, 0x80)); - - params.SetPublicExponent(CryptoPP::Integer(FakeKeyset::PublicExponent, 4)); - params.SetPrivateExponent(CryptoPP::Integer(FakeKeyset::PrivateExponent, 0x100)); - - params.SetModPrime1PrivateExponent(CryptoPP::Integer(FakeKeyset::Exponent1, 0x80)); - params.SetModPrime2PrivateExponent(CryptoPP::Integer(FakeKeyset::Exponent2, 0x80)); - - params.SetModulus(CryptoPP::Integer(FakeKeyset::Modulus, 0x100)); - params.SetMultiplicativeInverseOfPrime2ModPrime1( - CryptoPP::Integer(FakeKeyset::Coefficient, 0x80)); - - CryptoPP::RSA::PrivateKey privateKey(params); - - return privateKey; -} - -CryptoPP::RSA::PrivateKey Crypto::DebugRifKeyset_init() { - CryptoPP::InvertibleRSAFunction params; - params.SetPrime1(CryptoPP::Integer(DebugRifKeyset::Prime1, sizeof(DebugRifKeyset::Prime1))); - params.SetPrime2(CryptoPP::Integer(DebugRifKeyset::Prime2, sizeof(DebugRifKeyset::Prime2))); - - params.SetPublicExponent( - CryptoPP::Integer(DebugRifKeyset::PublicExponent, sizeof(DebugRifKeyset::PublicExponent))); - params.SetPrivateExponent(CryptoPP::Integer(DebugRifKeyset::PrivateExponent, - sizeof(DebugRifKeyset::PrivateExponent))); - - params.SetModPrime1PrivateExponent( - CryptoPP::Integer(DebugRifKeyset::Exponent1, sizeof(DebugRifKeyset::Exponent1))); - params.SetModPrime2PrivateExponent( - CryptoPP::Integer(DebugRifKeyset::Exponent2, sizeof(DebugRifKeyset::Exponent2))); - - params.SetModulus(CryptoPP::Integer(DebugRifKeyset::Modulus, sizeof(DebugRifKeyset::Modulus))); - params.SetMultiplicativeInverseOfPrime2ModPrime1( - CryptoPP::Integer(DebugRifKeyset::Coefficient, sizeof(DebugRifKeyset::Coefficient))); - - CryptoPP::RSA::PrivateKey privateKey(params); - - return privateKey; -} - -void Crypto::RSA2048Decrypt(std::span dec_key, - std::span ciphertext, - bool is_dk3) { // RSAES_PKCS1v15_ - // Create an RSA decryptor - CryptoPP::RSA::PrivateKey privateKey; - if (is_dk3) { - privateKey = key_pkg_derived_key3_keyset_init(); - } else { - privateKey = FakeKeyset_keyset_init(); - } - - CryptoPP::RSAES_PKCS1v15_Decryptor rsaDecryptor(privateKey); - - // Allocate memory for the decrypted data - std::array decrypted; - - // Perform the decryption - CryptoPP::AutoSeededRandomPool rng; - CryptoPP::DecodingResult result = - rsaDecryptor.Decrypt(rng, ciphertext.data(), decrypted.size(), decrypted.data()); - std::copy(decrypted.begin(), decrypted.begin() + dec_key.size(), dec_key.begin()); -} - -void Crypto::ivKeyHASH256(std::span cipher_input, - std::span ivkey_result) { - CryptoPP::SHA256 sha256; - std::array hashResult; - auto array_sink = new CryptoPP::ArraySink(hashResult.data(), CryptoPP::SHA256::DIGESTSIZE); - auto filter = new CryptoPP::HashFilter(sha256, array_sink); - CryptoPP::ArraySource r(cipher_input.data(), cipher_input.size(), true, filter); - std::copy(hashResult.begin(), hashResult.begin() + ivkey_result.size(), ivkey_result.begin()); -} - -void Crypto::aesCbcCfb128Decrypt(std::span ivkey, - std::span ciphertext, - std::span decrypted) { - std::array key; - std::array iv; - - std::copy(ivkey.begin() + 16, ivkey.begin() + 16 + key.size(), key.begin()); - std::copy(ivkey.begin(), ivkey.begin() + iv.size(), iv.begin()); - - CryptoPP::AES::Decryption aesDecryption(key.data(), CryptoPP::AES::DEFAULT_KEYLENGTH); - CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - cbcDecryption.ProcessData(decrypted.data() + i, ciphertext.data() + i, - CryptoPP::AES::BLOCKSIZE); - } -} - -void Crypto::aesCbcCfb128DecryptEntry(std::span ivkey, - std::span ciphertext, - std::span decrypted) { - std::array key; - std::array iv; - - std::copy(ivkey.begin() + 16, ivkey.begin() + 16 + key.size(), key.begin()); - std::copy(ivkey.begin(), ivkey.begin() + iv.size(), iv.begin()); - - CryptoPP::AES::Decryption aesDecryption(key.data(), CryptoPP::AES::DEFAULT_KEYLENGTH); - CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - cbcDecryption.ProcessData(decrypted.data() + i, ciphertext.data() + i, - CryptoPP::AES::BLOCKSIZE); - } -} - -void Crypto::decryptEFSM(std::span trophyKey, - std::span NPcommID, - std::span efsmIv, std::span ciphertext, - std::span decrypted) { - - // step 1: Encrypt NPcommID - CryptoPP::CBC_Mode::Encryption encrypt; - - std::vector trophyIv(16, 0); - std::vector trpKey(16); - - encrypt.SetKeyWithIV(trophyKey.data(), trophyKey.size(), trophyIv.data()); - encrypt.ProcessData(trpKey.data(), NPcommID.data(), 16); - - // step 2: decrypt efsm. - CryptoPP::CBC_Mode::Decryption decrypt; - decrypt.SetKeyWithIV(trpKey.data(), trpKey.size(), efsmIv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - decrypt.ProcessData(decrypted.data() + i, ciphertext.data() + i, CryptoPP::AES::BLOCKSIZE); - } -} - -void Crypto::PfsGenCryptoKey(std::span ekpfs, - std::span seed, - std::span dataKey, - std::span tweakKey) { - CryptoPP::HMAC hmac(ekpfs.data(), ekpfs.size()); - - CryptoPP::SecByteBlock d(20); // Use Crypto++ SecByteBlock for better memory management - - // Copy the bytes of 'index' to the 'd' array - uint32_t index = 1; - std::memcpy(d, &index, sizeof(uint32_t)); - - // Copy the bytes of 'seed' to the 'd' array starting from index 4 - std::memcpy(d + sizeof(uint32_t), seed.data(), seed.size()); - - // Allocate memory for 'u64' using new - std::vector data_tweak_key(hmac.DigestSize()); - - // Calculate the HMAC - hmac.CalculateDigest(data_tweak_key.data(), d, d.size()); - std::copy(data_tweak_key.begin(), data_tweak_key.begin() + dataKey.size(), tweakKey.begin()); - std::copy(data_tweak_key.begin() + tweakKey.size(), - data_tweak_key.begin() + tweakKey.size() + dataKey.size(), dataKey.begin()); -} - -void Crypto::decryptPFS(std::span dataKey, - std::span tweakKey, std::span src_image, - std::span dst_image, u64 sector) { - // Start at 0x10000 to keep the header when decrypting the whole pfs_image. - for (int i = 0; i < src_image.size(); i += 0x1000) { - const u64 current_sector = sector + (i / 0x1000); - CryptoPP::ECB_Mode::Encryption encrypt(tweakKey.data(), tweakKey.size()); - CryptoPP::ECB_Mode::Decryption decrypt(dataKey.data(), dataKey.size()); - - std::array tweak{}; - std::array encryptedTweak; - std::array xorBuffer; - std::memcpy(tweak.data(), ¤t_sector, sizeof(u64)); - - // Encrypt the tweak for each sector. - encrypt.ProcessData(encryptedTweak.data(), tweak.data(), 16); - - for (int plaintextOffset = 0; plaintextOffset < 0x1000; plaintextOffset += 16) { - xtsXorBlock(xorBuffer.data(), src_image.data() + i + plaintextOffset, - encryptedTweak.data()); // x, c, t - decrypt.ProcessData(xorBuffer.data(), xorBuffer.data(), 16); // x, x - xtsXorBlock(dst_image.data() + i + plaintextOffset, xorBuffer.data(), - encryptedTweak.data()); //(p) c, x , t - xtsMult(encryptedTweak); - } - } -} diff --git a/src/core/crypto/crypto.h b/src/core/crypto/crypto.h deleted file mode 100644 index b5d8104b5..000000000 --- a/src/core/crypto/crypto.h +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common/types.h" -#include "keys.h" - -class Crypto { -public: - CryptoPP::RSA::PrivateKey key_pkg_derived_key3_keyset_init(); - CryptoPP::RSA::PrivateKey FakeKeyset_keyset_init(); - CryptoPP::RSA::PrivateKey DebugRifKeyset_init(); - - void RSA2048Decrypt(std::span dk3, - std::span ciphertext, - bool is_dk3); // RSAES_PKCS1v15_ - void ivKeyHASH256(std::span cipher_input, - std::span ivkey_result); - void aesCbcCfb128Decrypt(std::span ivkey, - std::span ciphertext, - std::span decrypted); - void aesCbcCfb128DecryptEntry(std::span ivkey, - std::span ciphertext, - std::span decrypted); - void decryptEFSM(std::span trophyKey, - std::span NPcommID, std::span efsmIv, - std::span ciphertext, std::span decrypted); - void PfsGenCryptoKey(std::span ekpfs, - std::span seed, - std::span dataKey, - std::span tweakKey); - void decryptPFS(std::span dataKey, - std::span tweakKey, std::span src_image, - std::span dst_image, u64 sector); - - void xtsXorBlock(CryptoPP::byte* x, const CryptoPP::byte* a, const CryptoPP::byte* b) { - for (int i = 0; i < 16; i++) { - x[i] = a[i] ^ b[i]; - } - } - - void xtsMult(std::span encryptedTweak) { - int feedback = 0; - for (int k = 0; k < encryptedTweak.size(); k++) { - const auto tmp = (encryptedTweak[k] >> 7) & 1; - encryptedTweak[k] = ((encryptedTweak[k] << 1) + feedback) & 0xFF; - feedback = tmp; - } - if (feedback != 0) { - encryptedTweak[0] ^= 0x87; - } - } -}; diff --git a/src/core/crypto/keys.h b/src/core/crypto/keys.h deleted file mode 100644 index 441082481..000000000 --- a/src/core/crypto/keys.h +++ /dev/null @@ -1,305 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once -#include - -class FakeKeyset { -public: - // Constructor - static constexpr CryptoPP::byte Exponent1[] = { - 0x6D, 0x48, 0xE0, 0x54, 0x40, 0x25, 0xC8, 0x41, 0x29, 0x52, 0x42, 0x27, 0xEB, 0xD2, 0xC7, - 0xAB, 0x6B, 0x9C, 0x27, 0x0A, 0xB4, 0x1F, 0x94, 0x4E, 0xFA, 0x42, 0x1D, 0xB7, 0xBC, 0xB9, - 0xAE, 0xBC, 0x04, 0x6F, 0x75, 0x8F, 0x10, 0x5F, 0x89, 0xAC, 0xAB, 0x9C, 0xD2, 0xFA, 0xE6, - 0xA4, 0x13, 0x83, 0x68, 0xD4, 0x56, 0x38, 0xFE, 0xE5, 0x2B, 0x78, 0x44, 0x9C, 0x34, 0xE6, - 0x5A, 0xA0, 0xBE, 0x05, 0x70, 0xAD, 0x15, 0xC3, 0x2D, 0x31, 0xAC, 0x97, 0x5D, 0x88, 0xFC, - 0xC1, 0x62, 0x3D, 0xE2, 0xED, 0x11, 0xDB, 0xB6, 0x9E, 0xFC, 0x5A, 0x5A, 0x03, 0xF6, 0xCF, - 0x08, 0xD4, 0x5D, 0x90, 0xC9, 0x2A, 0xB9, 0x9B, 0xCF, 0xC8, 0x1A, 0x65, 0xF3, 0x5B, 0xE8, - 0x7F, 0xCF, 0xA5, 0xA6, 0x4C, 0x5C, 0x2A, 0x12, 0x0F, 0x92, 0xA5, 0xE3, 0xF0, 0x17, 0x1E, - 0x9A, 0x97, 0x45, 0x86, 0xFD, 0xDB, 0x54, 0x25}; - // exponent2 = d mod (q - 1) - static constexpr CryptoPP::byte Exponent2[] = { - 0x2A, 0x51, 0xCE, 0x02, 0x44, 0x28, 0x50, 0xE8, 0x30, 0x20, 0x7C, 0x9C, 0x55, 0xBF, 0x60, - 0x39, 0xBC, 0xD1, 0xF0, 0xE7, 0x68, 0xF8, 0x08, 0x5B, 0x61, 0x1F, 0xA7, 0xBF, 0xD0, 0xE8, - 0x8B, 0xB5, 0xB1, 0xD5, 0xD9, 0x16, 0xAC, 0x75, 0x0C, 0x6D, 0xF2, 0xE0, 0xB5, 0x97, 0x75, - 0xD2, 0x68, 0x16, 0x1F, 0x00, 0x7D, 0x8B, 0x17, 0xE8, 0x78, 0x48, 0x41, 0x71, 0x2B, 0x18, - 0x96, 0x80, 0x11, 0xDB, 0x68, 0x39, 0x9C, 0xD6, 0xE0, 0x72, 0x42, 0x86, 0xF0, 0x1B, 0x16, - 0x0D, 0x3E, 0x12, 0x94, 0x3D, 0x25, 0xA8, 0xA9, 0x30, 0x9E, 0x54, 0x5A, 0xD6, 0x36, 0x6C, - 0xD6, 0x8C, 0x20, 0x62, 0x8F, 0xA1, 0x6B, 0x1F, 0x7C, 0x6D, 0xB2, 0xB1, 0xC1, 0x2E, 0xAD, - 0x36, 0x02, 0x9C, 0x3A, 0xCA, 0x2F, 0x09, 0xD2, 0x45, 0x9E, 0xEB, 0xF2, 0xBC, 0x6C, 0xAA, - 0x3B, 0x3E, 0x90, 0xBC, 0x38, 0x67, 0x35, 0x4D}; - // e - static constexpr CryptoPP::byte PublicExponent[] = {0, 1, 0, 1}; - // (InverseQ)(q) = 1 mod p - static constexpr CryptoPP::byte Coefficient[] = { - 0x0B, 0x67, 0x1C, 0x0D, 0x6C, 0x57, 0xD3, 0xE7, 0x05, 0x65, 0x94, 0x31, 0x56, 0x55, 0xFD, - 0x28, 0x08, 0xFA, 0x05, 0x8A, 0xCC, 0x55, 0x39, 0x61, 0x97, 0x63, 0xA0, 0x16, 0x27, 0x3D, - 0xED, 0xC1, 0x16, 0x40, 0x2A, 0x12, 0xEA, 0x6F, 0xD9, 0xD8, 0x58, 0x56, 0xA8, 0x56, 0x8B, - 0x0D, 0x38, 0x5E, 0x1E, 0x80, 0x3B, 0x5F, 0x40, 0x80, 0x6F, 0x62, 0x4F, 0x28, 0xA2, 0x69, - 0xF3, 0xD3, 0xF7, 0xFD, 0xB2, 0xC3, 0x52, 0x43, 0x20, 0x92, 0x9D, 0x97, 0x8D, 0xA0, 0x15, - 0x07, 0x15, 0x6E, 0xA4, 0x0D, 0x56, 0xD3, 0x37, 0x1A, 0xC4, 0x9E, 0xDF, 0x02, 0x49, 0xB8, - 0x0A, 0x84, 0x62, 0xF5, 0xFA, 0xB9, 0x3F, 0xA4, 0x09, 0x76, 0xCC, 0xAA, 0xB9, 0x9B, 0xA6, - 0x4F, 0xC1, 0x6A, 0x64, 0xCE, 0xD8, 0x77, 0xAB, 0x4B, 0xF9, 0xA0, 0xAE, 0xDA, 0xF1, 0x67, - 0x87, 0x7C, 0x98, 0x5C, 0x7E, 0xB8, 0x73, 0xF5}; - // n = p * q - static constexpr CryptoPP::byte Modulus[] = { - 0xC6, 0xCF, 0x71, 0xE7, 0xE5, 0x9A, 0xF0, 0xD1, 0x2A, 0x2C, 0x45, 0x8B, 0xF9, 0x2A, 0x0E, - 0xC1, 0x43, 0x05, 0x8B, 0xC3, 0x71, 0x17, 0x80, 0x1D, 0xCD, 0x49, 0x7D, 0xDE, 0x35, 0x9D, - 0x25, 0x9B, 0xA0, 0xD7, 0xA0, 0xF2, 0x7D, 0x6C, 0x08, 0x7E, 0xAA, 0x55, 0x02, 0x68, 0x2B, - 0x23, 0xC6, 0x44, 0xB8, 0x44, 0x18, 0xEB, 0x56, 0xCF, 0x16, 0xA2, 0x48, 0x03, 0xC9, 0xE7, - 0x4F, 0x87, 0xEB, 0x3D, 0x30, 0xC3, 0x15, 0x88, 0xBF, 0x20, 0xE7, 0x9D, 0xFF, 0x77, 0x0C, - 0xDE, 0x1D, 0x24, 0x1E, 0x63, 0xA9, 0x4F, 0x8A, 0xBF, 0x5B, 0xBE, 0x60, 0x19, 0x68, 0x33, - 0x3B, 0xFC, 0xED, 0x9F, 0x47, 0x4E, 0x5F, 0xF8, 0xEA, 0xCB, 0x3D, 0x00, 0xBD, 0x67, 0x01, - 0xF9, 0x2C, 0x6D, 0xC6, 0xAC, 0x13, 0x64, 0xE7, 0x67, 0x14, 0xF3, 0xDC, 0x52, 0x69, 0x6A, - 0xB9, 0x83, 0x2C, 0x42, 0x30, 0x13, 0x1B, 0xB2, 0xD8, 0xA5, 0x02, 0x0D, 0x79, 0xED, 0x96, - 0xB1, 0x0D, 0xF8, 0xCC, 0x0C, 0xDF, 0x81, 0x95, 0x4F, 0x03, 0x58, 0x09, 0x57, 0x0E, 0x80, - 0x69, 0x2E, 0xFE, 0xFF, 0x52, 0x77, 0xEA, 0x75, 0x28, 0xA8, 0xFB, 0xC9, 0xBE, 0xBF, 0x9F, - 0xBB, 0xB7, 0x79, 0x8E, 0x18, 0x05, 0xE1, 0x80, 0xBD, 0x50, 0x34, 0x94, 0x81, 0xD3, 0x53, - 0xC2, 0x69, 0xA2, 0xD2, 0x4C, 0xCF, 0x6C, 0xF4, 0x57, 0x2C, 0x10, 0x4A, 0x3F, 0xFB, 0x22, - 0xFD, 0x8B, 0x97, 0xE2, 0xC9, 0x5B, 0xA6, 0x2B, 0xCD, 0xD6, 0x1B, 0x6B, 0xDB, 0x68, 0x7F, - 0x4B, 0xC2, 0xA0, 0x50, 0x34, 0xC0, 0x05, 0xE5, 0x8D, 0xEF, 0x24, 0x67, 0xFF, 0x93, 0x40, - 0xCF, 0x2D, 0x62, 0xA2, 0xA0, 0x50, 0xB1, 0xF1, 0x3A, 0xA8, 0x3D, 0xFD, 0x80, 0xD1, 0xF9, - 0xB8, 0x05, 0x22, 0xAF, 0xC8, 0x35, 0x45, 0x90, 0x58, 0x8E, 0xE3, 0x3A, 0x7C, 0xBD, 0x3E, - 0x27}; - // p - static constexpr CryptoPP::byte Prime1[] = { - 0xFE, 0xF6, 0xBF, 0x1D, 0x69, 0xAB, 0x16, 0x25, 0x08, 0x47, 0x55, 0x6B, 0x86, 0xE4, 0x35, - 0x88, 0x72, 0x2A, 0xB1, 0x3D, 0xF8, 0xB6, 0x44, 0xCA, 0xB3, 0xAB, 0x19, 0xD1, 0x04, 0x24, - 0x28, 0x0A, 0x74, 0x55, 0xB8, 0x15, 0x45, 0x09, 0xCC, 0x13, 0x1C, 0xF2, 0xBA, 0x37, 0xA9, - 0x03, 0x90, 0x8F, 0x02, 0x10, 0xFF, 0x25, 0x79, 0x86, 0xCC, 0x18, 0x50, 0x9A, 0x10, 0x5F, - 0x5B, 0x4C, 0x1C, 0x4E, 0xB0, 0xA7, 0xE3, 0x59, 0xB1, 0x2D, 0xA0, 0xC6, 0xB0, 0x20, 0x2C, - 0x21, 0x33, 0x12, 0xB3, 0xAF, 0x72, 0x34, 0x83, 0xCD, 0x52, 0x2F, 0xAF, 0x0F, 0x20, 0x5A, - 0x1B, 0xC0, 0xE2, 0xA3, 0x76, 0x34, 0x0F, 0xD7, 0xFC, 0xC1, 0x41, 0xC9, 0xF9, 0x79, 0x40, - 0x17, 0x42, 0x21, 0x3E, 0x9D, 0xFD, 0xC7, 0xC1, 0x50, 0xDE, 0x44, 0x5A, 0xC9, 0x31, 0x89, - 0x6A, 0x78, 0x05, 0xBE, 0x65, 0xB4, 0xE8, 0x2D}; - // q - static constexpr CryptoPP::byte Prime2[] = { - 0xC7, 0x9E, 0x47, 0x58, 0x00, 0x7D, 0x62, 0x82, 0xB0, 0xD2, 0x22, 0x81, 0xD4, 0xA8, 0x97, - 0x1B, 0x79, 0x0C, 0x3A, 0xB0, 0xD7, 0xC9, 0x30, 0xE3, 0xC3, 0x53, 0x8E, 0x57, 0xEF, 0xF0, - 0x9B, 0x9F, 0xB3, 0x90, 0x52, 0xC6, 0x94, 0x22, 0x36, 0xAA, 0xE6, 0x4A, 0x5F, 0x72, 0x1D, - 0x70, 0xE8, 0x76, 0x58, 0xC8, 0xB2, 0x91, 0xCE, 0x9C, 0xC3, 0xE9, 0x09, 0x7F, 0x2E, 0x47, - 0x97, 0xCC, 0x90, 0x39, 0x15, 0x35, 0x31, 0xDE, 0x1F, 0x0C, 0x8C, 0x0D, 0xC1, 0xC2, 0x92, - 0xBE, 0x97, 0xBF, 0x2F, 0x91, 0xA1, 0x8C, 0x7D, 0x50, 0xA8, 0x21, 0x2F, 0xD7, 0xA2, 0x9A, - 0x7E, 0xB5, 0xA7, 0x2A, 0x90, 0x02, 0xD9, 0xF3, 0x3D, 0xD1, 0xEB, 0xB8, 0xE0, 0x5A, 0x79, - 0x9E, 0x7D, 0x8D, 0xCA, 0x18, 0x6D, 0xBD, 0x9E, 0xA1, 0x80, 0x28, 0x6B, 0x2A, 0xFE, 0x51, - 0x24, 0x9B, 0x6F, 0x4D, 0x84, 0x77, 0x80, 0x23}; - static constexpr CryptoPP::byte PrivateExponent[] = { - 0x7F, 0x76, 0xCD, 0x0E, 0xE2, 0xD4, 0xDE, 0x05, 0x1C, 0xC6, 0xD9, 0xA8, 0x0E, 0x8D, 0xFA, - 0x7B, 0xCA, 0x1E, 0xAA, 0x27, 0x1A, 0x40, 0xF8, 0xF1, 0x22, 0x87, 0x35, 0xDD, 0xDB, 0xFD, - 0xEE, 0xF8, 0xC2, 0xBC, 0xBD, 0x01, 0xFB, 0x8B, 0xE2, 0x3E, 0x63, 0xB2, 0xB1, 0x22, 0x5C, - 0x56, 0x49, 0x6E, 0x11, 0xBE, 0x07, 0x44, 0x0B, 0x9A, 0x26, 0x66, 0xD1, 0x49, 0x2C, 0x8F, - 0xD3, 0x1B, 0xCF, 0xA4, 0xA1, 0xB8, 0xD1, 0xFB, 0xA4, 0x9E, 0xD2, 0x21, 0x28, 0x83, 0x09, - 0x8A, 0xF6, 0xA0, 0x0B, 0xA3, 0xD6, 0x0F, 0x9B, 0x63, 0x68, 0xCC, 0xBC, 0x0C, 0x4E, 0x14, - 0x5B, 0x27, 0xA4, 0xA9, 0xF4, 0x2B, 0xB9, 0xB8, 0x7B, 0xC0, 0xE6, 0x51, 0xAD, 0x1D, 0x77, - 0xD4, 0x6B, 0xB9, 0xCE, 0x20, 0xD1, 0x26, 0x66, 0x7E, 0x5E, 0x9E, 0xA2, 0xE9, 0x6B, 0x90, - 0xF3, 0x73, 0xB8, 0x52, 0x8F, 0x44, 0x11, 0x03, 0x0C, 0x13, 0x97, 0x39, 0x3D, 0x13, 0x22, - 0x58, 0xD5, 0x43, 0x82, 0x49, 0xDA, 0x6E, 0x7C, 0xA1, 0xC5, 0x8C, 0xA5, 0xB0, 0x09, 0xE0, - 0xCE, 0x3D, 0xDF, 0xF4, 0x9D, 0x3C, 0x97, 0x15, 0xE2, 0x6A, 0xC7, 0x2B, 0x3C, 0x50, 0x93, - 0x23, 0xDB, 0xBA, 0x4A, 0x22, 0x66, 0x44, 0xAC, 0x78, 0xBB, 0x0E, 0x1A, 0x27, 0x43, 0xB5, - 0x71, 0x67, 0xAF, 0xF4, 0xAB, 0x48, 0x46, 0x93, 0x73, 0xD0, 0x42, 0xAB, 0x93, 0x63, 0xE5, - 0x6C, 0x9A, 0xDE, 0x50, 0x24, 0xC0, 0x23, 0x7D, 0x99, 0x79, 0x3F, 0x22, 0x07, 0xE0, 0xC1, - 0x48, 0x56, 0x1B, 0xDF, 0x83, 0x09, 0x12, 0xB4, 0x2D, 0x45, 0x6B, 0xC9, 0xC0, 0x68, 0x85, - 0x99, 0x90, 0x79, 0x96, 0x1A, 0xD7, 0xF5, 0x4D, 0x1F, 0x37, 0x83, 0x40, 0x4A, 0xEC, 0x39, - 0x37, 0xA6, 0x80, 0x92, 0x7D, 0xC5, 0x80, 0xC7, 0xD6, 0x6F, 0xFE, 0x8A, 0x79, 0x89, 0xC6, - 0xB1}; -}; - -class DebugRifKeyset { -public: - // std::uint8_t* PrivateExponent; - static constexpr CryptoPP::byte Exponent1[] = { - 0xCD, 0x9A, 0x61, 0xB0, 0xB8, 0xD5, 0xB4, 0xE4, 0xE4, 0xF6, 0xAB, 0xF7, 0x27, 0xB7, 0x56, - 0x59, 0x6B, 0xB9, 0x11, 0xE7, 0xF4, 0x83, 0xAF, 0xB9, 0x73, 0x99, 0x7F, 0x49, 0xA2, 0x9C, - 0xF0, 0xB5, 0x6D, 0x37, 0x82, 0x14, 0x15, 0xF1, 0x04, 0x8A, 0xD4, 0x8E, 0xEB, 0x2E, 0x1F, - 0xE2, 0x81, 0xA9, 0x62, 0x6E, 0xB1, 0x68, 0x75, 0x62, 0xF3, 0x0F, 0xFE, 0xD4, 0x91, 0x87, - 0x98, 0x78, 0xBF, 0x26, 0xB5, 0x07, 0x58, 0xD0, 0xEE, 0x3F, 0x21, 0xE8, 0xC8, 0x0F, 0x5F, - 0xFA, 0x1C, 0x64, 0x74, 0x49, 0x52, 0xEB, 0xE7, 0xEE, 0xDE, 0xBA, 0x23, 0x26, 0x4A, 0xF6, - 0x9C, 0x1A, 0x09, 0x3F, 0xB9, 0x0B, 0x36, 0x26, 0x1A, 0xBE, 0xA9, 0x76, 0xE6, 0xF2, 0x69, - 0xDE, 0xFF, 0xAF, 0xCC, 0x0C, 0x9A, 0x66, 0x03, 0x86, 0x0A, 0x1F, 0x49, 0xA4, 0x10, 0xB6, - 0xBC, 0xC3, 0x7C, 0x88, 0xE8, 0xCE, 0x4B, 0xD9}; - // exponent2 = d mod (q - 1) - static constexpr CryptoPP::byte Exponent2[] = { - 0xB3, 0x73, 0xA3, 0x59, 0xE6, 0x97, 0xC0, 0xAB, 0x3B, 0x68, 0xFC, 0x39, 0xAC, 0xDB, 0x44, - 0xB1, 0xB4, 0x9E, 0x35, 0x4D, 0xBE, 0xC5, 0x36, 0x69, 0x6C, 0x3D, 0xC5, 0xFC, 0xFE, 0x4B, - 0x2F, 0xDC, 0x86, 0x80, 0x46, 0x96, 0x40, 0x1A, 0x0D, 0x6E, 0xFA, 0x8C, 0xE0, 0x47, 0x91, - 0xAC, 0xAD, 0x95, 0x2B, 0x8E, 0x1F, 0xF2, 0x0A, 0x45, 0xF8, 0x29, 0x95, 0x70, 0xC6, 0x88, - 0x5F, 0x71, 0x03, 0x99, 0x79, 0xBC, 0x84, 0x71, 0xBD, 0xE8, 0x84, 0x8C, 0x0E, 0xD4, 0x7B, - 0x30, 0x74, 0x57, 0x1A, 0x95, 0xE7, 0x90, 0x19, 0x8D, 0xAD, 0x8B, 0x4C, 0x4E, 0xC3, 0xE7, - 0x6B, 0x23, 0x86, 0x01, 0xEE, 0x9B, 0xE0, 0x2F, 0x15, 0xA2, 0x2C, 0x4C, 0x39, 0xD3, 0xDF, - 0x9C, 0x39, 0x01, 0xF1, 0x8C, 0x44, 0x4A, 0x15, 0x44, 0xDC, 0x51, 0xF7, 0x22, 0xD7, 0x7F, - 0x41, 0x7F, 0x68, 0xFA, 0xEE, 0x56, 0xE8, 0x05}; - // e - static constexpr CryptoPP::byte PublicExponent[] = {0x00, 0x01, 0x00, 0x01}; - // (InverseQ)(q) = 1 mod p - static constexpr CryptoPP::byte Coefficient[] = { - 0xC0, 0x32, 0x43, 0xD3, 0x8C, 0x3D, 0xB4, 0xD2, 0x48, 0x8C, 0x42, 0x41, 0x24, 0x94, 0x6C, - 0x80, 0xC9, 0xC1, 0x79, 0x36, 0x7F, 0xAC, 0xC3, 0xFF, 0x6A, 0x25, 0xEB, 0x2C, 0xFB, 0xD4, - 0x2B, 0xA0, 0xEB, 0xFE, 0x25, 0xE9, 0xC6, 0x77, 0xCE, 0xFE, 0x2D, 0x23, 0xFE, 0xD0, 0xF4, - 0x0F, 0xD9, 0x7E, 0xD5, 0xA5, 0x7D, 0x1F, 0xC0, 0xE8, 0xE8, 0xEC, 0x80, 0x5B, 0xC7, 0xFD, - 0xE2, 0xBD, 0x94, 0xA6, 0x2B, 0xDD, 0x6A, 0x60, 0x45, 0x54, 0xAB, 0xCA, 0x42, 0x9C, 0x6A, - 0x6C, 0xBF, 0x3C, 0x84, 0xF9, 0xA5, 0x0E, 0x63, 0x0C, 0x51, 0x58, 0x62, 0x6D, 0x5A, 0xB7, - 0x3C, 0x3F, 0x49, 0x1A, 0xD0, 0x93, 0xB8, 0x4F, 0x1A, 0x6C, 0x5F, 0xC5, 0xE5, 0xA9, 0x75, - 0xD4, 0x86, 0x9E, 0xDF, 0x87, 0x0F, 0x27, 0xB0, 0x26, 0x78, 0x4E, 0xFB, 0xC1, 0x8A, 0x4A, - 0x24, 0x3F, 0x7F, 0x8F, 0x9A, 0x12, 0x51, 0xCB}; - // n = p * q - static constexpr CryptoPP::byte Modulus[] = { - 0xC2, 0xD2, 0x44, 0xBC, 0xDD, 0x84, 0x3F, 0xD9, 0xC5, 0x22, 0xAF, 0xF7, 0xFC, 0x88, 0x8A, - 0x33, 0x80, 0xED, 0x8E, 0xE2, 0xCC, 0x81, 0xF7, 0xEC, 0xF8, 0x1C, 0x79, 0xBF, 0x02, 0xBB, - 0x12, 0x8E, 0x61, 0x68, 0x29, 0x1B, 0x15, 0xB6, 0x5E, 0xC6, 0xF8, 0xBF, 0x5A, 0xE0, 0x3B, - 0x6A, 0x6C, 0xD9, 0xD6, 0xF5, 0x75, 0xAB, 0xA0, 0x6F, 0x34, 0x81, 0x34, 0x9A, 0x5B, 0xAD, - 0xED, 0x31, 0xE3, 0xC6, 0xEA, 0x1A, 0xD1, 0x13, 0x22, 0xBB, 0xB3, 0xDA, 0xB3, 0xB2, 0x53, - 0xBD, 0x45, 0x79, 0x87, 0xAD, 0x0A, 0x01, 0x72, 0x18, 0x10, 0x29, 0x49, 0xF4, 0x41, 0x7F, - 0xD6, 0x47, 0x0C, 0x72, 0x92, 0x9E, 0xE9, 0xBB, 0x95, 0xA9, 0x5D, 0x79, 0xEB, 0xE4, 0x30, - 0x76, 0x90, 0x45, 0x4B, 0x9D, 0x9C, 0xCF, 0x92, 0x03, 0x60, 0x8C, 0x4B, 0x6C, 0xB3, 0x7A, - 0x3A, 0x05, 0x39, 0xA0, 0x66, 0xA9, 0x35, 0xCF, 0xB9, 0xFA, 0xAD, 0x9C, 0xAB, 0xEB, 0xE4, - 0x6A, 0x8C, 0xE9, 0x3B, 0xCC, 0x72, 0x12, 0x62, 0x63, 0xBD, 0x80, 0xC4, 0xEE, 0x37, 0x2B, - 0x32, 0x03, 0xA3, 0x09, 0xF7, 0xA0, 0x61, 0x57, 0xAD, 0x0D, 0xCF, 0x15, 0x98, 0x9E, 0x4E, - 0x49, 0xF8, 0xB5, 0xA3, 0x5C, 0x27, 0xEE, 0x45, 0x04, 0xEA, 0xE4, 0x4B, 0xBC, 0x8F, 0x87, - 0xED, 0x19, 0x1E, 0x46, 0x75, 0x63, 0xC4, 0x5B, 0xD5, 0xBC, 0x09, 0x2F, 0x02, 0x73, 0x19, - 0x3C, 0x58, 0x55, 0x49, 0x66, 0x4C, 0x11, 0xEC, 0x0F, 0x09, 0xFA, 0xA5, 0x56, 0x0A, 0x5A, - 0x63, 0x56, 0xAD, 0xA0, 0x0D, 0x86, 0x08, 0xC1, 0xE6, 0xB6, 0x13, 0x22, 0x49, 0x2F, 0x7C, - 0xDB, 0x4C, 0x56, 0x97, 0x0E, 0xC2, 0xD9, 0x2E, 0x87, 0xBC, 0x0E, 0x67, 0xC0, 0x1B, 0x58, - 0xBC, 0x64, 0x2B, 0xC2, 0x6E, 0xE2, 0x93, 0x2E, 0xB5, 0x6B, 0x70, 0xA4, 0x42, 0x9F, 0x64, - 0xC1}; - // p - static constexpr CryptoPP::byte Prime1[] = { - 0xE5, 0x62, 0xE1, 0x7F, 0x9F, 0x86, 0x08, 0xE2, 0x61, 0xD3, 0xD0, 0x42, 0xE2, 0xC4, 0xB6, - 0xA8, 0x51, 0x09, 0x19, 0x14, 0xA4, 0x3A, 0x11, 0x4C, 0x33, 0xA5, 0x9C, 0x01, 0x5E, 0x34, - 0xB6, 0x3F, 0x02, 0x1A, 0xCA, 0x47, 0xF1, 0x4F, 0x3B, 0x35, 0x2A, 0x07, 0x20, 0xEC, 0xD8, - 0xC1, 0x15, 0xD9, 0xCA, 0x03, 0x4F, 0xB8, 0xE8, 0x09, 0x73, 0x3F, 0x85, 0xB7, 0x41, 0xD5, - 0x51, 0x3E, 0x7B, 0xE3, 0x53, 0x2B, 0x48, 0x8B, 0x8E, 0xCB, 0xBA, 0xF7, 0xE0, 0x60, 0xF5, - 0x35, 0x0E, 0x6F, 0xB0, 0xD9, 0x2A, 0x99, 0xD0, 0xFF, 0x60, 0x14, 0xED, 0x40, 0xEA, 0xF8, - 0xD7, 0x0B, 0xC3, 0x8D, 0x8C, 0xE8, 0x81, 0xB3, 0x75, 0x93, 0x15, 0xB3, 0x7D, 0xF6, 0x39, - 0x60, 0x1A, 0x00, 0xE7, 0xC3, 0x27, 0xAD, 0xA4, 0x33, 0xD5, 0x3E, 0xA4, 0x35, 0x48, 0x6F, - 0x22, 0xEF, 0x5D, 0xDD, 0x7D, 0x7B, 0x61, 0x05}; - // q - static constexpr CryptoPP::byte Prime2[] = { - 0xD9, 0x6C, 0xC2, 0x0C, 0xF7, 0xAE, 0xD1, 0xF3, 0x3B, 0x3B, 0x49, 0x1E, 0x9F, 0x12, 0x9C, - 0xA1, 0x78, 0x1F, 0x35, 0x1D, 0x98, 0x26, 0x13, 0x71, 0xF9, 0x09, 0xFD, 0xF0, 0xAD, 0x38, - 0x55, 0xB7, 0xEE, 0x61, 0x04, 0x72, 0x51, 0x87, 0x2E, 0x05, 0x84, 0xB1, 0x1D, 0x0C, 0x0D, - 0xDB, 0xD4, 0x25, 0x3E, 0x26, 0xED, 0xEA, 0xB8, 0xF7, 0x49, 0xFE, 0xA2, 0x94, 0xE6, 0xF2, - 0x08, 0x92, 0xA7, 0x85, 0xF5, 0x30, 0xB9, 0x84, 0x22, 0xBF, 0xCA, 0xF0, 0x5F, 0xCB, 0x31, - 0x20, 0x34, 0x49, 0x16, 0x76, 0x34, 0xCC, 0x7A, 0xCB, 0x96, 0xFE, 0x78, 0x7A, 0x41, 0xFE, - 0x9A, 0xA2, 0x23, 0xF7, 0x68, 0x80, 0xD6, 0xCE, 0x4A, 0x78, 0xA5, 0xB7, 0x05, 0x77, 0x81, - 0x1F, 0xDE, 0x5E, 0xA8, 0x6E, 0x3E, 0x87, 0xEC, 0x44, 0xD2, 0x69, 0xC6, 0x54, 0x91, 0x6B, - 0x5E, 0x13, 0x8A, 0x03, 0x87, 0x05, 0x31, 0x8D}; - static constexpr CryptoPP::byte PrivateExponent[] = { - 0x01, 0x61, 0xAD, 0xD8, 0x9C, 0x06, 0x89, 0xD0, 0x60, 0xC8, 0x41, 0xF0, 0xB3, 0x83, 0x01, - 0x5D, 0xE3, 0xA2, 0x6B, 0xA2, 0xBA, 0x9A, 0x0A, 0x58, 0xCD, 0x1A, 0xA0, 0x97, 0x64, 0xEC, - 0xD0, 0x31, 0x1F, 0xCA, 0x36, 0x0E, 0x69, 0xDD, 0x40, 0xF7, 0x4E, 0xC0, 0xC6, 0xA3, 0x73, - 0xF0, 0x69, 0x84, 0xB2, 0xF4, 0x4B, 0x29, 0x14, 0x2A, 0x6D, 0xB8, 0x23, 0xD8, 0x1B, 0x61, - 0xD4, 0x9E, 0x87, 0xB3, 0xBB, 0xA9, 0xC4, 0x85, 0x4A, 0xF8, 0x03, 0x4A, 0xBF, 0xFE, 0xF9, - 0xFE, 0x8B, 0xDD, 0x54, 0x83, 0xBA, 0xE0, 0x2F, 0x3F, 0xB1, 0xEF, 0xA5, 0x05, 0x5D, 0x28, - 0x8B, 0xAB, 0xB5, 0xD0, 0x23, 0x2F, 0x8A, 0xCF, 0x48, 0x7C, 0xAA, 0xBB, 0xC8, 0x5B, 0x36, - 0x27, 0xC5, 0x16, 0xA4, 0xB6, 0x61, 0xAC, 0x0C, 0x28, 0x47, 0x79, 0x3F, 0x38, 0xAE, 0x5E, - 0x25, 0xC6, 0xAF, 0x35, 0xAE, 0xBC, 0xB0, 0xF3, 0xBC, 0xBD, 0xFD, 0xA4, 0x87, 0x0D, 0x14, - 0x3D, 0x90, 0xE4, 0xDE, 0x5D, 0x1D, 0x46, 0x81, 0xF1, 0x28, 0x6D, 0x2F, 0x2C, 0x5E, 0x97, - 0x2D, 0x89, 0x2A, 0x51, 0x72, 0x3C, 0x20, 0x02, 0x59, 0xB1, 0x98, 0x93, 0x05, 0x1E, 0x3F, - 0xA1, 0x8A, 0x69, 0x30, 0x0E, 0x70, 0x84, 0x8B, 0xAE, 0x97, 0xA1, 0x08, 0x95, 0x63, 0x4C, - 0xC7, 0xE8, 0x5D, 0x59, 0xCA, 0x78, 0x2A, 0x23, 0x87, 0xAC, 0x6F, 0x04, 0x33, 0xB1, 0x61, - 0xB9, 0xF0, 0x95, 0xDA, 0x33, 0xCC, 0xE0, 0x4C, 0x82, 0x68, 0x82, 0x14, 0x51, 0xBE, 0x49, - 0x1C, 0x58, 0xA2, 0x8B, 0x05, 0x4E, 0x98, 0x37, 0xEB, 0x94, 0x0B, 0x01, 0x22, 0xDC, 0xB3, - 0x19, 0xCA, 0x77, 0xA6, 0x6E, 0x97, 0xFF, 0x8A, 0x53, 0x5A, 0xC5, 0x24, 0xE4, 0xAF, 0x6E, - 0xA8, 0x2B, 0x53, 0xA4, 0xBE, 0x96, 0xA5, 0x7B, 0xCE, 0x22, 0x56, 0xA3, 0xF1, 0xCF, 0x14, - 0xA5}; -}; - -class PkgDerivedKey3Keyset { -public: - // std::uint8_t* PrivateExponent; - static constexpr CryptoPP::byte Exponent1[] = { - 0x52, 0xCC, 0x2D, 0xA0, 0x9C, 0x9E, 0x75, 0xE7, 0x28, 0xEE, 0x3D, 0xDE, 0xE3, 0x45, 0xD1, - 0x4F, 0x94, 0x1C, 0xCC, 0xC8, 0x87, 0x29, 0x45, 0x3B, 0x8D, 0x6E, 0xAB, 0x6E, 0x2A, 0xA7, - 0xC7, 0x15, 0x43, 0xA3, 0x04, 0x8F, 0x90, 0x5F, 0xEB, 0xF3, 0x38, 0x4A, 0x77, 0xFA, 0x36, - 0xB7, 0x15, 0x76, 0xB6, 0x01, 0x1A, 0x8E, 0x25, 0x87, 0x82, 0xF1, 0x55, 0xD8, 0xC6, 0x43, - 0x2A, 0xC0, 0xE5, 0x98, 0xC9, 0x32, 0xD1, 0x94, 0x6F, 0xD9, 0x01, 0xBA, 0x06, 0x81, 0xE0, - 0x6D, 0x88, 0xF2, 0x24, 0x2A, 0x25, 0x01, 0x64, 0x5C, 0xBF, 0xF2, 0xD9, 0x99, 0x67, 0x3E, - 0xF6, 0x72, 0xEE, 0xE4, 0xE2, 0x33, 0x5C, 0xF8, 0x00, 0x40, 0xE3, 0x2A, 0x9A, 0xF4, 0x3D, - 0x22, 0x86, 0x44, 0x3C, 0xFB, 0x0A, 0xA5, 0x7C, 0x3F, 0xCC, 0xF5, 0xF1, 0x16, 0xC4, 0xAC, - 0x88, 0xB4, 0xDE, 0x62, 0x94, 0x92, 0x6A, 0x13}; - // exponent2 = d mod (q - 1) - static constexpr CryptoPP::byte Exponent2[] = { - 0x7C, 0x9D, 0xAD, 0x39, 0xE0, 0xD5, 0x60, 0x14, 0x94, 0x48, 0x19, 0x7F, 0x88, 0x95, 0xD5, - 0x8B, 0x80, 0xAD, 0x85, 0x8A, 0x4B, 0x77, 0x37, 0x85, 0xD0, 0x77, 0xBB, 0xBF, 0x89, 0x71, - 0x4A, 0x72, 0xCB, 0x72, 0x68, 0x38, 0xEC, 0x02, 0xC6, 0x7D, 0xC6, 0x44, 0x06, 0x33, 0x51, - 0x1C, 0xC0, 0xFF, 0x95, 0x8F, 0x0D, 0x75, 0xDC, 0x25, 0xBB, 0x0B, 0x73, 0x91, 0xA9, 0x6D, - 0x42, 0xD8, 0x03, 0xB7, 0x68, 0xD4, 0x1E, 0x75, 0x62, 0xA3, 0x70, 0x35, 0x79, 0x78, 0x00, - 0xC8, 0xF5, 0xEF, 0x15, 0xB9, 0xFC, 0x4E, 0x47, 0x5A, 0xC8, 0x70, 0x70, 0x5B, 0x52, 0x98, - 0xC0, 0xC2, 0x58, 0x4A, 0x70, 0x96, 0xCC, 0xB8, 0x10, 0xE1, 0x2F, 0x78, 0x8B, 0x2B, 0xA1, - 0x7F, 0xF9, 0xAC, 0xDE, 0xF0, 0xBB, 0x2B, 0xE2, 0x66, 0xE3, 0x22, 0x92, 0x31, 0x21, 0x57, - 0x92, 0xC4, 0xB8, 0xF2, 0x3E, 0x76, 0x20, 0x37}; - // e - static constexpr CryptoPP::byte PublicExponent[] = {0, 1, 0, 1}; - // (InverseQ)(q) = 1 mod p - static constexpr CryptoPP::byte Coefficient[] = { - 0x45, 0x97, 0x55, 0xD4, 0x22, 0x08, 0x5E, 0xF3, 0x5C, 0xB4, 0x05, 0x7A, 0xFD, 0xAA, 0x42, - 0x42, 0xAD, 0x9A, 0x8C, 0xA0, 0x6C, 0xBB, 0x1D, 0x68, 0x54, 0x54, 0x6E, 0x3E, 0x32, 0xE3, - 0x53, 0x73, 0x76, 0xF1, 0x3E, 0x01, 0xEA, 0xD3, 0xCF, 0xEB, 0xEB, 0x23, 0x3E, 0xC0, 0xBE, - 0xCE, 0xEC, 0x2C, 0x89, 0x5F, 0xA8, 0x27, 0x3A, 0x4C, 0xB7, 0xE6, 0x74, 0xBC, 0x45, 0x4C, - 0x26, 0xC8, 0x25, 0xFF, 0x34, 0x63, 0x25, 0x37, 0xE1, 0x48, 0x10, 0xC1, 0x93, 0xA6, 0xAF, - 0xEB, 0xBA, 0xE3, 0xA2, 0xF1, 0x3D, 0xEF, 0x63, 0xD8, 0xF4, 0xFD, 0xD3, 0xEE, 0xE2, 0x5D, - 0xE9, 0x33, 0xCC, 0xAD, 0xBA, 0x75, 0x5C, 0x85, 0xAF, 0xCE, 0xA9, 0x3D, 0xD1, 0xA2, 0x17, - 0xF3, 0xF6, 0x98, 0xB3, 0x50, 0x8E, 0x5E, 0xF6, 0xEB, 0x02, 0x8E, 0xA1, 0x62, 0xA7, 0xD6, - 0x2C, 0xEC, 0x91, 0xFF, 0x15, 0x40, 0xD2, 0xE3}; - // n = p * q - static constexpr CryptoPP::byte Modulus[] = { - 0xd2, 0x12, 0xfc, 0x33, 0x5f, 0x6d, 0xdb, 0x83, 0x16, 0x09, 0x62, 0x8b, 0x03, 0x56, 0x27, - 0x37, 0x82, 0xd4, 0x77, 0x85, 0x35, 0x29, 0x39, 0x2d, 0x52, 0x6b, 0x8c, 0x4c, 0x8c, 0xfb, - 0x06, 0xc1, 0x84, 0x5b, 0xe7, 0xd4, 0xf7, 0xbc, 0xd2, 0x4e, 0x62, 0x45, 0xcd, 0x2a, 0xbb, - 0xd7, 0x77, 0x76, 0x45, 0x36, 0x55, 0x27, 0x3f, 0xb3, 0xf5, 0xf9, 0x8e, 0xda, 0x4b, 0xef, - 0xaa, 0x59, 0xae, 0xb3, 0x9b, 0xea, 0x54, 0x98, 0xd2, 0x06, 0x32, 0x6a, 0x58, 0x31, 0x2a, - 0xe0, 0xd4, 0x4f, 0x90, 0xb5, 0x0a, 0x7d, 0xec, 0xf4, 0x3a, 0x9c, 0x52, 0x67, 0x2d, 0x99, - 0x31, 0x8e, 0x0c, 0x43, 0xe6, 0x82, 0xfe, 0x07, 0x46, 0xe1, 0x2e, 0x50, 0xd4, 0x1f, 0x2d, - 0x2f, 0x7e, 0xd9, 0x08, 0xba, 0x06, 0xb3, 0xbf, 0x2e, 0x20, 0x3f, 0x4e, 0x3f, 0xfe, 0x44, - 0xff, 0xaa, 0x50, 0x43, 0x57, 0x91, 0x69, 0x94, 0x49, 0x15, 0x82, 0x82, 0xe4, 0x0f, 0x4c, - 0x8d, 0x9d, 0x2c, 0xc9, 0x5b, 0x1d, 0x64, 0xbf, 0x88, 0x8b, 0xd4, 0xc5, 0x94, 0xe7, 0x65, - 0x47, 0x84, 0x1e, 0xe5, 0x79, 0x10, 0xfb, 0x98, 0x93, 0x47, 0xb9, 0x7d, 0x85, 0x12, 0xa6, - 0x40, 0x98, 0x2c, 0xf7, 0x92, 0xbc, 0x95, 0x19, 0x32, 0xed, 0xe8, 0x90, 0x56, 0x0d, 0x65, - 0xc1, 0xaa, 0x78, 0xc6, 0x2e, 0x54, 0xfd, 0x5f, 0x54, 0xa1, 0xf6, 0x7e, 0xe5, 0xe0, 0x5f, - 0x61, 0xc1, 0x20, 0xb4, 0xb9, 0xb4, 0x33, 0x08, 0x70, 0xe4, 0xdf, 0x89, 0x56, 0xed, 0x01, - 0x29, 0x46, 0x77, 0x5f, 0x8c, 0xb8, 0xa9, 0xf5, 0x1e, 0x2e, 0xb3, 0xb9, 0xbf, 0xe0, 0x09, - 0xb7, 0x8d, 0x28, 0xd4, 0xa6, 0xc3, 0xb8, 0x1e, 0x1f, 0x07, 0xeb, 0xb4, 0x12, 0x0b, 0x95, - 0xb8, 0x85, 0x30, 0xfd, 0xdc, 0x39, 0x13, 0xd0, 0x7c, 0xdc, 0x8f, 0xed, 0xf9, 0xc9, 0xa3, - 0xc1}; - // p - static constexpr CryptoPP::byte Prime1[] = { - 0xF9, 0x67, 0xAD, 0x99, 0x12, 0x31, 0x0C, 0x56, 0xA2, 0x2E, 0x16, 0x1C, 0x46, 0xB3, 0x4D, - 0x5B, 0x43, 0xBE, 0x42, 0xA2, 0xF6, 0x86, 0x96, 0x80, 0x42, 0xC3, 0xC7, 0x3F, 0xC3, 0x42, - 0xF5, 0x87, 0x49, 0x33, 0x9F, 0x07, 0x5D, 0x6E, 0x2C, 0x04, 0xFD, 0xE3, 0xE1, 0xB2, 0xAE, - 0x0A, 0x0C, 0xF0, 0xC7, 0xA6, 0x1C, 0xA1, 0x63, 0x50, 0xC8, 0x09, 0x9C, 0x51, 0x24, 0x52, - 0x6C, 0x5E, 0x5E, 0xBD, 0x1E, 0x27, 0x06, 0xBB, 0xBC, 0x9E, 0x94, 0xE1, 0x35, 0xD4, 0x6D, - 0xB3, 0xCB, 0x3C, 0x68, 0xDD, 0x68, 0xB3, 0xFE, 0x6C, 0xCB, 0x8D, 0x82, 0x20, 0x76, 0x23, - 0x63, 0xB7, 0xE9, 0x68, 0x10, 0x01, 0x4E, 0xDC, 0xBA, 0x27, 0x5D, 0x01, 0xC1, 0x2D, 0x80, - 0x5E, 0x2B, 0xAF, 0x82, 0x6B, 0xD8, 0x84, 0xB6, 0x10, 0x52, 0x86, 0xA7, 0x89, 0x8E, 0xAE, - 0x9A, 0xE2, 0x89, 0xC6, 0xF7, 0xD5, 0x87, 0xFB}; - // q - static constexpr CryptoPP::byte Prime2[] = { - 0xD7, 0xA1, 0x0F, 0x9A, 0x8B, 0xF2, 0xC9, 0x11, 0x95, 0x32, 0x9A, 0x8C, 0xF0, 0xD9, 0x40, - 0x47, 0xF5, 0x68, 0xA0, 0x0D, 0xBD, 0xC1, 0xFC, 0x43, 0x2F, 0x65, 0xF9, 0xC3, 0x61, 0x0F, - 0x25, 0x77, 0x54, 0xAD, 0xD7, 0x58, 0xAC, 0x84, 0x40, 0x60, 0x8D, 0x3F, 0xF3, 0x65, 0x89, - 0x75, 0xB5, 0xC6, 0x2C, 0x51, 0x1A, 0x2F, 0x1F, 0x22, 0xE4, 0x43, 0x11, 0x54, 0xBE, 0xC9, - 0xB4, 0xC7, 0xB5, 0x1B, 0x05, 0x0B, 0xBC, 0x56, 0x9A, 0xCD, 0x4A, 0xD9, 0x73, 0x68, 0x5E, - 0x5C, 0xFB, 0x92, 0xB7, 0x8B, 0x0D, 0xFF, 0xF5, 0x07, 0xCA, 0xB4, 0xC8, 0x9B, 0x96, 0x3C, - 0x07, 0x9E, 0x3E, 0x6B, 0x2A, 0x11, 0xF2, 0x8A, 0xB1, 0x8A, 0xD7, 0x2E, 0x1B, 0xA5, 0x53, - 0x24, 0x06, 0xED, 0x50, 0xB8, 0x90, 0x67, 0xB1, 0xE2, 0x41, 0xC6, 0x92, 0x01, 0xEE, 0x10, - 0xF0, 0x61, 0xBB, 0xFB, 0xB2, 0x7D, 0x4A, 0x73}; - static constexpr CryptoPP::byte PrivateExponent[] = { - 0x32, 0xD9, 0x03, 0x90, 0x8F, 0xBD, 0xB0, 0x8F, 0x57, 0x2B, 0x28, 0x5E, 0x0B, 0x8D, 0xB3, - 0xEA, 0x5C, 0xD1, 0x7E, 0xA8, 0x90, 0x88, 0x8C, 0xDD, 0x6A, 0x80, 0xBB, 0xB1, 0xDF, 0xC1, - 0xF7, 0x0D, 0xAA, 0x32, 0xF0, 0xB7, 0x7C, 0xCB, 0x88, 0x80, 0x0E, 0x8B, 0x64, 0xB0, 0xBE, - 0x4C, 0xD6, 0x0E, 0x9B, 0x8C, 0x1E, 0x2A, 0x64, 0xE1, 0xF3, 0x5C, 0xD7, 0x76, 0x01, 0x41, - 0x5E, 0x93, 0x5C, 0x94, 0xFE, 0xDD, 0x46, 0x62, 0xC3, 0x1B, 0x5A, 0xE2, 0xA0, 0xBC, 0x2D, - 0xEB, 0xC3, 0x98, 0x0A, 0xA7, 0xB7, 0x85, 0x69, 0x70, 0x68, 0x2B, 0x64, 0x4A, 0xB3, 0x1F, - 0xCC, 0x7D, 0xDC, 0x7C, 0x26, 0xF4, 0x77, 0xF6, 0x5C, 0xF2, 0xAE, 0x5A, 0x44, 0x2D, 0xD3, - 0xAB, 0x16, 0x62, 0x04, 0x19, 0xBA, 0xFB, 0x90, 0xFF, 0xE2, 0x30, 0x50, 0x89, 0x6E, 0xCB, - 0x56, 0xB2, 0xEB, 0xC0, 0x91, 0x16, 0x92, 0x5E, 0x30, 0x8E, 0xAE, 0xC7, 0x94, 0x5D, 0xFD, - 0x35, 0xE1, 0x20, 0xF8, 0xAD, 0x3E, 0xBC, 0x08, 0xBF, 0xC0, 0x36, 0x74, 0x9F, 0xD5, 0xBB, - 0x52, 0x08, 0xFD, 0x06, 0x66, 0xF3, 0x7A, 0xB3, 0x04, 0xF4, 0x75, 0x29, 0x5D, 0xE9, 0x5F, - 0xAA, 0x10, 0x30, 0xB2, 0x0F, 0x5A, 0x1A, 0xC1, 0x2A, 0xB3, 0xFE, 0xCB, 0x21, 0xAD, 0x80, - 0xEC, 0x8F, 0x20, 0x09, 0x1C, 0xDB, 0xC5, 0x58, 0x94, 0xC2, 0x9C, 0xC6, 0xCE, 0x82, 0x65, - 0x3E, 0x57, 0x90, 0xBC, 0xA9, 0x8B, 0x06, 0xB4, 0xF0, 0x72, 0xF6, 0x77, 0xDF, 0x98, 0x64, - 0xF1, 0xEC, 0xFE, 0x37, 0x2D, 0xBC, 0xAE, 0x8C, 0x08, 0x81, 0x1F, 0xC3, 0xC9, 0x89, 0x1A, - 0xC7, 0x42, 0x82, 0x4B, 0x2E, 0xDC, 0x8E, 0x8D, 0x73, 0xCE, 0xB1, 0xCC, 0x01, 0xD9, 0x08, - 0x70, 0x87, 0x3C, 0x44, 0x08, 0xEC, 0x49, 0x8F, 0x81, 0x5A, 0xE2, 0x40, 0xFF, 0x77, 0xFC, - 0x0D}; -}; \ No newline at end of file diff --git a/src/core/file_format/pkg.h b/src/core/file_format/pkg.h deleted file mode 100644 index a488a2df8..000000000 --- a/src/core/file_format/pkg.h +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include -#include -#include "common/endian.h" -#include "core/crypto/crypto.h" -#include "pfs.h" -#include "trp.h" - -struct PKGHeader { - u32_be magic; // Magic - u32_be pkg_type; - u32_be pkg_0x8; // unknown field - u32_be pkg_file_count; - u32_be pkg_table_entry_count; - u16_be pkg_sc_entry_count; - u16_be pkg_table_entry_count_2; // same as pkg_entry_count - u32_be pkg_table_entry_offset; // file table offset - u32_be pkg_sc_entry_data_size; - u64_be pkg_body_offset; // offset of PKG entries - u64_be pkg_body_size; // length of all PKG entries - u64_be pkg_content_offset; - u64_be pkg_content_size; - u8 pkg_content_id[0x24]; // packages' content ID as a 36-byte string - u8 pkg_padding[0xC]; // padding - u32_be pkg_drm_type; // DRM type - u32_be pkg_content_type; // Content type - u32_be pkg_content_flags; // Content flags - u32_be pkg_promote_size; - u32_be pkg_version_date; - u32_be pkg_version_hash; - u32_be pkg_0x088; - u32_be pkg_0x08C; - u32_be pkg_0x090; - u32_be pkg_0x094; - u32_be pkg_iro_tag; - u32_be pkg_drm_type_version; - - u8 pkg_zeroes_1[0x60]; - - /* Digest table */ - u8 digest_entries1[0x20]; // sha256 digest for main entry 1 - u8 digest_entries2[0x20]; // sha256 digest for main entry 2 - u8 digest_table_digest[0x20]; // sha256 digest for digest table - u8 digest_body_digest[0x20]; // sha256 digest for main table - - u8 pkg_zeroes_2[0x280]; - - u32_be pkg_0x400; - - u32_be pfs_image_count; // count of PFS images - u64_be pfs_image_flags; // PFS flags - u64_be pfs_image_offset; // offset to start of external PFS image - u64_be pfs_image_size; // size of external PFS image - u64_be mount_image_offset; - u64_be mount_image_size; - u64_be pkg_size; - u32_be pfs_signed_size; - u32_be pfs_cache_size; - u8 pfs_image_digest[0x20]; - u8 pfs_signed_digest[0x20]; - u64_be pfs_split_size_nth_0; - u64_be pfs_split_size_nth_1; - - u8 pkg_zeroes_3[0xB50]; - - u8 pkg_digest[0x20]; -}; - -enum class PKGContentFlag { - FIRST_PATCH = 0x100000, - PATCHGO = 0x200000, - REMASTER = 0x400000, - PS_CLOUD = 0x800000, - GD_AC = 0x2000000, - NON_GAME = 0x4000000, - UNKNOWN_0x8000000 = 0x8000000, - SUBSEQUENT_PATCH = 0x40000000, - DELTA_PATCH = 0x41000000, - CUMULATIVE_PATCH = 0x60000000 -}; - -struct PKGEntry { - u32_be id; // File ID, useful for files without a filename entry - u32_be filename_offset; // Offset into the filenames table (ID 0x200) where this file's name is - // located - u32_be flags1; // Flags including encrypted flag, etc - u32_be flags2; // Flags including encryption key index, etc - u32_be offset; // Offset into PKG to find the file - u32_be size; // Size of the file - u64_be padding; // blank padding -}; -static_assert(sizeof(PKGEntry) == 32); - -class PKG { -public: - PKG(); - ~PKG(); - - bool Open(const std::filesystem::path& filepath, std::string& failreason); - void ExtractFiles(const int index); - bool Extract(const std::filesystem::path& filepath, const std::filesystem::path& extract, - std::string& failreason); - - std::vector sfo; - - u32 GetNumberOfFiles() { - return fsTable.size(); - } - - u64 GetPkgSize() { - return pkgSize; - } - - std::string GetPkgFlags() { - return pkgFlags; - } - - std::string_view GetTitleID() { - return std::string_view(pkgTitleID, 9); - } - - PKGHeader GetPkgHeader() { - return pkgheader; - } - - static bool isFlagSet(u32_be variable, PKGContentFlag flag) { - return (variable) & static_cast(flag); - } - - static constexpr std::array, 10> flagNames = { - {{PKGContentFlag::FIRST_PATCH, "FIRST_PATCH"}, - {PKGContentFlag::PATCHGO, "PATCHGO"}, - {PKGContentFlag::REMASTER, "REMASTER"}, - {PKGContentFlag::PS_CLOUD, "PS_CLOUD"}, - {PKGContentFlag::GD_AC, "GD_AC"}, - {PKGContentFlag::NON_GAME, "NON_GAME"}, - {PKGContentFlag::UNKNOWN_0x8000000, "UNKNOWN_0x8000000"}, - {PKGContentFlag::SUBSEQUENT_PATCH, "SUBSEQUENT_PATCH"}, - {PKGContentFlag::DELTA_PATCH, "DELTA_PATCH"}, - {PKGContentFlag::CUMULATIVE_PATCH, "CUMULATIVE_PATCH"}}}; - -private: - Crypto crypto; - TRP trp; - u64 pkgSize = 0; - char pkgTitleID[9]; - PKGHeader pkgheader; - std::string pkgFlags; - - std::unordered_map extractPaths; - std::vector fsTable; - std::vector iNodeBuf; - std::vector sectorMap; - u64 pfsc_offset; - - std::array dk3_; - std::array ivKey; - std::array imgKey; - std::array ekpfsKey; - std::array dataKey; - std::array tweakKey; - std::vector decNp; - - std::filesystem::path pkgpath; - std::filesystem::path current_dir; - std::filesystem::path extract_path; -}; diff --git a/src/core/file_format/pkg_type.cpp b/src/core/file_format/pkg_type.cpp deleted file mode 100644 index 464f0b993..000000000 --- a/src/core/file_format/pkg_type.cpp +++ /dev/null @@ -1,638 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include "pkg_type.h" - -struct PkgEntryValue { - u32 type; - std::string_view name; - - operator u32() const noexcept { - return type; - } -}; - -constexpr static std::array PkgEntries = {{ - {0x0001, "digests"}, - {0x0010, "entry_keys"}, - {0x0020, "image_key"}, - {0x0080, "general_digests"}, - {0x0100, "metas"}, - {0x0200, "entry_names"}, - {0x0400, "license.dat"}, - {0x0401, "license.info"}, - {0x0402, "nptitle.dat"}, - {0x0403, "npbind.dat"}, - {0x0404, "selfinfo.dat"}, - {0x0406, "imageinfo.dat"}, - {0x0407, "target-deltainfo.dat"}, - {0x0408, "origin-deltainfo.dat"}, - {0x0409, "psreserved.dat"}, - {0x1000, "param.sfo"}, - {0x1001, "playgo-chunk.dat"}, - {0x1002, "playgo-chunk.sha"}, - {0x1003, "playgo-manifest.xml"}, - {0x1004, "pronunciation.xml"}, - {0x1005, "pronunciation.sig"}, - {0x1006, "pic1.png"}, - {0x1007, "pubtoolinfo.dat"}, - {0x1008, "app/playgo-chunk.dat"}, - {0x1009, "app/playgo-chunk.sha"}, - {0x100A, "app/playgo-manifest.xml"}, - {0x100B, "shareparam.json"}, - {0x100C, "shareoverlayimage.png"}, - {0x100D, "save_data.png"}, - {0x100E, "shareprivacyguardimage.png"}, - {0x1200, "icon0.png"}, - {0x1201, "icon0_00.png"}, - {0x1202, "icon0_01.png"}, - {0x1203, "icon0_02.png"}, - {0x1204, "icon0_03.png"}, - {0x1205, "icon0_04.png"}, - {0x1206, "icon0_05.png"}, - {0x1207, "icon0_06.png"}, - {0x1208, "icon0_07.png"}, - {0x1209, "icon0_08.png"}, - {0x120A, "icon0_09.png"}, - {0x120B, "icon0_10.png"}, - {0x120C, "icon0_11.png"}, - {0x120D, "icon0_12.png"}, - {0x120E, "icon0_13.png"}, - {0x120F, "icon0_14.png"}, - {0x1210, "icon0_15.png"}, - {0x1211, "icon0_16.png"}, - {0x1212, "icon0_17.png"}, - {0x1213, "icon0_18.png"}, - {0x1214, "icon0_19.png"}, - {0x1215, "icon0_20.png"}, - {0x1216, "icon0_21.png"}, - {0x1217, "icon0_22.png"}, - {0x1218, "icon0_23.png"}, - {0x1219, "icon0_24.png"}, - {0x121A, "icon0_25.png"}, - {0x121B, "icon0_26.png"}, - {0x121C, "icon0_27.png"}, - {0x121D, "icon0_28.png"}, - {0x121E, "icon0_29.png"}, - {0x121F, "icon0_30.png"}, - {0x1220, "pic0.png"}, - {0x1240, "snd0.at9"}, - {0x1241, "pic1_00.png"}, - {0x1242, "pic1_01.png"}, - {0x1243, "pic1_02.png"}, - {0x1244, "pic1_03.png"}, - {0x1245, "pic1_04.png"}, - {0x1246, "pic1_05.png"}, - {0x1247, "pic1_06.png"}, - {0x1248, "pic1_07.png"}, - {0x1249, "pic1_08.png"}, - {0x124A, "pic1_09.png"}, - {0x124B, "pic1_10.png"}, - {0x124C, "pic1_11.png"}, - {0x124D, "pic1_12.png"}, - {0x124E, "pic1_13.png"}, - {0x124F, "pic1_14.png"}, - {0x1250, "pic1_15.png"}, - {0x1251, "pic1_16.png"}, - {0x1252, "pic1_17.png"}, - {0x1253, "pic1_18.png"}, - {0x1254, "pic1_19.png"}, - {0x1255, "pic1_20.png"}, - {0x1256, "pic1_21.png"}, - {0x1257, "pic1_22.png"}, - {0x1258, "pic1_23.png"}, - {0x1259, "pic1_24.png"}, - {0x125A, "pic1_25.png"}, - {0x125B, "pic1_26.png"}, - {0x125C, "pic1_27.png"}, - {0x125D, "pic1_28.png"}, - {0x125E, "pic1_29.png"}, - {0x125F, "pic1_30.png"}, - {0x1260, "changeinfo/changeinfo.xml"}, - {0x1261, "changeinfo/changeinfo_00.xml"}, - {0x1262, "changeinfo/changeinfo_01.xml"}, - {0x1263, "changeinfo/changeinfo_02.xml"}, - {0x1264, "changeinfo/changeinfo_03.xml"}, - {0x1265, "changeinfo/changeinfo_04.xml"}, - {0x1266, "changeinfo/changeinfo_05.xml"}, - {0x1267, "changeinfo/changeinfo_06.xml"}, - {0x1268, "changeinfo/changeinfo_07.xml"}, - {0x1269, "changeinfo/changeinfo_08.xml"}, - {0x126A, "changeinfo/changeinfo_09.xml"}, - {0x126B, "changeinfo/changeinfo_10.xml"}, - {0x126C, "changeinfo/changeinfo_11.xml"}, - {0x126D, "changeinfo/changeinfo_12.xml"}, - {0x126E, "changeinfo/changeinfo_13.xml"}, - {0x126F, "changeinfo/changeinfo_14.xml"}, - {0x1270, "changeinfo/changeinfo_15.xml"}, - {0x1271, "changeinfo/changeinfo_16.xml"}, - {0x1272, "changeinfo/changeinfo_17.xml"}, - {0x1273, "changeinfo/changeinfo_18.xml"}, - {0x1274, "changeinfo/changeinfo_19.xml"}, - {0x1275, "changeinfo/changeinfo_20.xml"}, - {0x1276, "changeinfo/changeinfo_21.xml"}, - {0x1277, "changeinfo/changeinfo_22.xml"}, - {0x1278, "changeinfo/changeinfo_23.xml"}, - {0x1279, "changeinfo/changeinfo_24.xml"}, - {0x127A, "changeinfo/changeinfo_25.xml"}, - {0x127B, "changeinfo/changeinfo_26.xml"}, - {0x127C, "changeinfo/changeinfo_27.xml"}, - {0x127D, "changeinfo/changeinfo_28.xml"}, - {0x127E, "changeinfo/changeinfo_29.xml"}, - {0x127F, "changeinfo/changeinfo_30.xml"}, - {0x1280, "icon0.dds"}, - {0x1281, "icon0_00.dds"}, - {0x1282, "icon0_01.dds"}, - {0x1283, "icon0_02.dds"}, - {0x1284, "icon0_03.dds"}, - {0x1285, "icon0_04.dds"}, - {0x1286, "icon0_05.dds"}, - {0x1287, "icon0_06.dds"}, - {0x1288, "icon0_07.dds"}, - {0x1289, "icon0_08.dds"}, - {0x128A, "icon0_09.dds"}, - {0x128B, "icon0_10.dds"}, - {0x128C, "icon0_11.dds"}, - {0x128D, "icon0_12.dds"}, - {0x128E, "icon0_13.dds"}, - {0x128F, "icon0_14.dds"}, - {0x1290, "icon0_15.dds"}, - {0x1291, "icon0_16.dds"}, - {0x1292, "icon0_17.dds"}, - {0x1293, "icon0_18.dds"}, - {0x1294, "icon0_19.dds"}, - {0x1295, "icon0_20.dds"}, - {0x1296, "icon0_21.dds"}, - {0x1297, "icon0_22.dds"}, - {0x1298, "icon0_23.dds"}, - {0x1299, "icon0_24.dds"}, - {0x129A, "icon0_25.dds"}, - {0x129B, "icon0_26.dds"}, - {0x129C, "icon0_27.dds"}, - {0x129D, "icon0_28.dds"}, - {0x129E, "icon0_29.dds"}, - {0x129F, "icon0_30.dds"}, - {0x12A0, "pic0.dds"}, - {0x12C0, "pic1.dds"}, - {0x12C1, "pic1_00.dds"}, - {0x12C2, "pic1_01.dds"}, - {0x12C3, "pic1_02.dds"}, - {0x12C4, "pic1_03.dds"}, - {0x12C5, "pic1_04.dds"}, - {0x12C6, "pic1_05.dds"}, - {0x12C7, "pic1_06.dds"}, - {0x12C8, "pic1_07.dds"}, - {0x12C9, "pic1_08.dds"}, - {0x12CA, "pic1_09.dds"}, - {0x12CB, "pic1_10.dds"}, - {0x12CC, "pic1_11.dds"}, - {0x12CD, "pic1_12.dds"}, - {0x12CE, "pic1_13.dds"}, - {0x12CF, "pic1_14.dds"}, - {0x12D0, "pic1_15.dds"}, - {0x12D1, "pic1_16.dds"}, - {0x12D2, "pic1_17.dds"}, - {0x12D3, "pic1_18.dds"}, - {0x12D4, "pic1_19.dds"}, - {0x12D5, "pic1_20.dds"}, - {0x12D6, "pic1_21.dds"}, - {0x12D7, "pic1_22.dds"}, - {0x12D8, "pic1_23.dds"}, - {0x12D9, "pic1_24.dds"}, - {0x12DA, "pic1_25.dds"}, - {0x12DB, "pic1_26.dds"}, - {0x12DC, "pic1_27.dds"}, - {0x12DD, "pic1_28.dds"}, - {0x12DE, "pic1_29.dds"}, - {0x12DF, "pic1_30.dds"}, - {0x1400, "trophy/trophy00.trp"}, - {0x1401, "trophy/trophy01.trp"}, - {0x1402, "trophy/trophy02.trp"}, - {0x1403, "trophy/trophy03.trp"}, - {0x1404, "trophy/trophy04.trp"}, - {0x1405, "trophy/trophy05.trp"}, - {0x1406, "trophy/trophy06.trp"}, - {0x1407, "trophy/trophy07.trp"}, - {0x1408, "trophy/trophy08.trp"}, - {0x1409, "trophy/trophy09.trp"}, - {0x140A, "trophy/trophy10.trp"}, - {0x140B, "trophy/trophy11.trp"}, - {0x140C, "trophy/trophy12.trp"}, - {0x140D, "trophy/trophy13.trp"}, - {0x140E, "trophy/trophy14.trp"}, - {0x140F, "trophy/trophy15.trp"}, - {0x1410, "trophy/trophy16.trp"}, - {0x1411, "trophy/trophy17.trp"}, - {0x1412, "trophy/trophy18.trp"}, - {0x1413, "trophy/trophy19.trp"}, - {0x1414, "trophy/trophy20.trp"}, - {0x1415, "trophy/trophy21.trp"}, - {0x1416, "trophy/trophy22.trp"}, - {0x1417, "trophy/trophy23.trp"}, - {0x1418, "trophy/trophy24.trp"}, - {0x1419, "trophy/trophy25.trp"}, - {0x141A, "trophy/trophy26.trp"}, - {0x141B, "trophy/trophy27.trp"}, - {0x141C, "trophy/trophy28.trp"}, - {0x141D, "trophy/trophy29.trp"}, - {0x141E, "trophy/trophy30.trp"}, - {0x141F, "trophy/trophy31.trp"}, - {0x1420, "trophy/trophy32.trp"}, - {0x1421, "trophy/trophy33.trp"}, - {0x1422, "trophy/trophy34.trp"}, - {0x1423, "trophy/trophy35.trp"}, - {0x1424, "trophy/trophy36.trp"}, - {0x1425, "trophy/trophy37.trp"}, - {0x1426, "trophy/trophy38.trp"}, - {0x1427, "trophy/trophy39.trp"}, - {0x1428, "trophy/trophy40.trp"}, - {0x1429, "trophy/trophy41.trp"}, - {0x142A, "trophy/trophy42.trp"}, - {0x142B, "trophy/trophy43.trp"}, - {0x142C, "trophy/trophy44.trp"}, - {0x142D, "trophy/trophy45.trp"}, - {0x142E, "trophy/trophy46.trp"}, - {0x142F, "trophy/trophy47.trp"}, - {0x1430, "trophy/trophy48.trp"}, - {0x1431, "trophy/trophy49.trp"}, - {0x1432, "trophy/trophy50.trp"}, - {0x1433, "trophy/trophy51.trp"}, - {0x1434, "trophy/trophy52.trp"}, - {0x1435, "trophy/trophy53.trp"}, - {0x1436, "trophy/trophy54.trp"}, - {0x1437, "trophy/trophy55.trp"}, - {0x1438, "trophy/trophy56.trp"}, - {0x1439, "trophy/trophy57.trp"}, - {0x143A, "trophy/trophy58.trp"}, - {0x143B, "trophy/trophy59.trp"}, - {0x143C, "trophy/trophy60.trp"}, - {0x143D, "trophy/trophy61.trp"}, - {0x143E, "trophy/trophy62.trp"}, - {0x143F, "trophy/trophy63.trp"}, - {0x1440, "trophy/trophy64.trp"}, - {0x1441, "trophy/trophy65.trp"}, - {0x1442, "trophy/trophy66.trp"}, - {0x1443, "trophy/trophy67.trp"}, - {0x1444, "trophy/trophy68.trp"}, - {0x1445, "trophy/trophy69.trp"}, - {0x1446, "trophy/trophy70.trp"}, - {0x1447, "trophy/trophy71.trp"}, - {0x1448, "trophy/trophy72.trp"}, - {0x1449, "trophy/trophy73.trp"}, - {0x144A, "trophy/trophy74.trp"}, - {0x144B, "trophy/trophy75.trp"}, - {0x144C, "trophy/trophy76.trp"}, - {0x144D, "trophy/trophy77.trp"}, - {0x144E, "trophy/trophy78.trp"}, - {0x144F, "trophy/trophy79.trp"}, - {0x1450, "trophy/trophy80.trp"}, - {0x1451, "trophy/trophy81.trp"}, - {0x1452, "trophy/trophy82.trp"}, - {0x1453, "trophy/trophy83.trp"}, - {0x1454, "trophy/trophy84.trp"}, - {0x1455, "trophy/trophy85.trp"}, - {0x1456, "trophy/trophy86.trp"}, - {0x1457, "trophy/trophy87.trp"}, - {0x1458, "trophy/trophy88.trp"}, - {0x1459, "trophy/trophy89.trp"}, - {0x145A, "trophy/trophy90.trp"}, - {0x145B, "trophy/trophy91.trp"}, - {0x145C, "trophy/trophy92.trp"}, - {0x145D, "trophy/trophy93.trp"}, - {0x145E, "trophy/trophy94.trp"}, - {0x145F, "trophy/trophy95.trp"}, - {0x1460, "trophy/trophy96.trp"}, - {0x1461, "trophy/trophy97.trp"}, - {0x1462, "trophy/trophy98.trp"}, - {0x1463, "trophy/trophy99.trp"}, - {0x1600, "keymap_rp/001.png"}, - {0x1601, "keymap_rp/002.png"}, - {0x1602, "keymap_rp/003.png"}, - {0x1603, "keymap_rp/004.png"}, - {0x1604, "keymap_rp/005.png"}, - {0x1605, "keymap_rp/006.png"}, - {0x1606, "keymap_rp/007.png"}, - {0x1607, "keymap_rp/008.png"}, - {0x1608, "keymap_rp/009.png"}, - {0x1609, "keymap_rp/010.png"}, - {0x1610, "keymap_rp/00/001.png"}, - {0x1611, "keymap_rp/00/002.png"}, - {0x1612, "keymap_rp/00/003.png"}, - {0x1613, "keymap_rp/00/004.png"}, - {0x1614, "keymap_rp/00/005.png"}, - {0x1615, "keymap_rp/00/006.png"}, - {0x1616, "keymap_rp/00/007.png"}, - {0x1617, "keymap_rp/00/008.png"}, - {0x1618, "keymap_rp/00/009.png"}, - {0x1619, "keymap_rp/00/010.png"}, - {0x1620, "keymap_rp/01/001.png"}, - {0x1621, "keymap_rp/01/002.png"}, - {0x1622, "keymap_rp/01/003.png"}, - {0x1623, "keymap_rp/01/004.png"}, - {0x1624, "keymap_rp/01/005.png"}, - {0x1625, "keymap_rp/01/006.png"}, - {0x1626, "keymap_rp/01/007.png"}, - {0x1627, "keymap_rp/01/008.png"}, - {0x1628, "keymap_rp/01/009.png"}, - {0x1629, "keymap_rp/01/010.png"}, - {0x1630, "keymap_rp/02/001.png"}, - {0x1631, "keymap_rp/02/002.png"}, - {0x1632, "keymap_rp/02/003.png"}, - {0x1633, "keymap_rp/02/004.png"}, - {0x1634, "keymap_rp/02/005.png"}, - {0x1635, "keymap_rp/02/006.png"}, - {0x1636, "keymap_rp/02/007.png"}, - {0x1637, "keymap_rp/02/008.png"}, - {0x1638, "keymap_rp/02/009.png"}, - {0x1639, "keymap_rp/02/010.png"}, - {0x1640, "keymap_rp/03/001.png"}, - {0x1641, "keymap_rp/03/002.png"}, - {0x1642, "keymap_rp/03/003.png"}, - {0x1643, "keymap_rp/03/004.png"}, - {0x1644, "keymap_rp/03/005.png"}, - {0x1645, "keymap_rp/03/006.png"}, - {0x1646, "keymap_rp/03/007.png"}, - {0x1647, "keymap_rp/03/008.png"}, - {0x1648, "keymap_rp/03/0010.png"}, - {0x1650, "keymap_rp/04/001.png"}, - {0x1651, "keymap_rp/04/002.png"}, - {0x1652, "keymap_rp/04/003.png"}, - {0x1653, "keymap_rp/04/004.png"}, - {0x1654, "keymap_rp/04/005.png"}, - {0x1655, "keymap_rp/04/006.png"}, - {0x1656, "keymap_rp/04/007.png"}, - {0x1657, "keymap_rp/04/008.png"}, - {0x1658, "keymap_rp/04/009.png"}, - {0x1659, "keymap_rp/04/010.png"}, - {0x1660, "keymap_rp/05/001.png"}, - {0x1661, "keymap_rp/05/002.png"}, - {0x1662, "keymap_rp/05/003.png"}, - {0x1663, "keymap_rp/05/004.png"}, - {0x1664, "keymap_rp/05/005.png"}, - {0x1665, "keymap_rp/05/006.png"}, - {0x1666, "keymap_rp/05/007.png"}, - {0x1667, "keymap_rp/05/008.png"}, - {0x1668, "keymap_rp/05/009.png"}, - {0x1669, "keymap_rp/05/010.png"}, - {0x1670, "keymap_rp/06/001.png"}, - {0x1671, "keymap_rp/06/002.png"}, - {0x1672, "keymap_rp/06/003.png"}, - {0x1673, "keymap_rp/06/004.png"}, - {0x1674, "keymap_rp/06/005.png"}, - {0x1675, "keymap_rp/06/006.png"}, - {0x1676, "keymap_rp/06/007.png"}, - {0x1677, "keymap_rp/06/008.png"}, - {0x1678, "keymap_rp/06/009.png"}, - {0x1679, "keymap_rp/06/010.png"}, - {0x1680, "keymap_rp/07/001.png"}, - {0x1681, "keymap_rp/07/002.png"}, - {0x1682, "keymap_rp/07/003.png"}, - {0x1683, "keymap_rp/07/004.png"}, - {0x1684, "keymap_rp/07/005.png"}, - {0x1685, "keymap_rp/07/006.png"}, - {0x1686, "keymap_rp/07/007.png"}, - {0x1687, "keymap_rp/07/008.png"}, - {0x1688, "keymap_rp/07/009.png"}, - {0x1689, "keymap_rp/07/010.png"}, - {0x1690, "keymap_rp/08/001.png"}, - {0x1691, "keymap_rp/08/002.png"}, - {0x1692, "keymap_rp/08/003.png"}, - {0x1693, "keymap_rp/08/004.png"}, - {0x1694, "keymap_rp/08/005.png"}, - {0x1695, "keymap_rp/08/006.png"}, - {0x1696, "keymap_rp/08/007.png"}, - {0x1697, "keymap_rp/08/008.png"}, - {0x1698, "keymap_rp/08/009.png"}, - {0x1699, "keymap_rp/08/010.png"}, - {0x16A0, "keymap_rp/09/001.png"}, - {0x16A1, "keymap_rp/09/002.png"}, - {0x16A2, "keymap_rp/09/003.png"}, - {0x16A3, "keymap_rp/09/004.png"}, - {0x16A4, "keymap_rp/09/005.png"}, - {0x16A5, "keymap_rp/09/006.png"}, - {0x16A6, "keymap_rp/09/007.png"}, - {0x16A7, "keymap_rp/09/008.png"}, - {0x16A8, "keymap_rp/09/009.png"}, - {0x16A9, "keymap_rp/09/010.png"}, - {0x16B0, "keymap_rp/10/001.png"}, - {0x16B1, "keymap_rp/10/002.png"}, - {0x16B2, "keymap_rp/10/003.png"}, - {0x16B3, "keymap_rp/10/004.png"}, - {0x16B4, "keymap_rp/10/005.png"}, - {0x16B5, "keymap_rp/10/006.png"}, - {0x16B6, "keymap_rp/10/007.png"}, - {0x16B7, "keymap_rp/10/008.png"}, - {0x16B8, "keymap_rp/10/009.png"}, - {0x16B9, "keymap_rp/10/010.png"}, - {0x16C0, "keymap_rp/11/001.png"}, - {0x16C1, "keymap_rp/11/002.png"}, - {0x16C2, "keymap_rp/11/003.png"}, - {0x16C3, "keymap_rp/11/004.png"}, - {0x16C4, "keymap_rp/11/005.png"}, - {0x16C5, "keymap_rp/11/006.png"}, - {0x16C6, "keymap_rp/11/007.png"}, - {0x16C7, "keymap_rp/11/008.png"}, - {0x16C8, "keymap_rp/11/009.png"}, - {0x16C9, "keymap_rp/11/010.png"}, - {0x16D0, "keymap_rp/12/001.png"}, - {0x16D1, "keymap_rp/12/002.png"}, - {0x16D2, "keymap_rp/12/003.png"}, - {0x16D3, "keymap_rp/12/004.png"}, - {0x16D4, "keymap_rp/12/005.png"}, - {0x16D5, "keymap_rp/12/006.png"}, - {0x16D6, "keymap_rp/12/007.png"}, - {0x16D7, "keymap_rp/12/008.png"}, - {0x16D8, "keymap_rp/12/009.png"}, - {0x16D9, "keymap_rp/12/010.png"}, - {0x16E0, "keymap_rp/13/001.png"}, - {0x16E1, "keymap_rp/13/002.png"}, - {0x16E2, "keymap_rp/13/003.png"}, - {0x16E3, "keymap_rp/13/004.png"}, - {0x16E4, "keymap_rp/13/005.png"}, - {0x16E5, "keymap_rp/13/006.png"}, - {0x16E6, "keymap_rp/13/007.png"}, - {0x16E7, "keymap_rp/13/008.png"}, - {0x16E8, "keymap_rp/13/009.png"}, - {0x16E9, "keymap_rp/13/010.png"}, - {0x16F0, "keymap_rp/14/001.png"}, - {0x16F1, "keymap_rp/14/002.png"}, - {0x16F2, "keymap_rp/14/003.png"}, - {0x16F3, "keymap_rp/14/004.png"}, - {0x16F4, "keymap_rp/14/005.png"}, - {0x16F5, "keymap_rp/14/006.png"}, - {0x16F6, "keymap_rp/14/007.png"}, - {0x16F7, "keymap_rp/14/008.png"}, - {0x16F8, "keymap_rp/14/009.png"}, - {0x16F9, "keymap_rp/14/010.png"}, - {0x1700, "keymap_rp/15/001.png"}, - {0x1701, "keymap_rp/15/002.png"}, - {0x1702, "keymap_rp/15/003.png"}, - {0x1703, "keymap_rp/15/004.png"}, - {0x1704, "keymap_rp/15/005.png"}, - {0x1705, "keymap_rp/15/006.png"}, - {0x1706, "keymap_rp/15/007.png"}, - {0x1707, "keymap_rp/15/008.png"}, - {0x1708, "keymap_rp/15/009.png"}, - {0x1709, "keymap_rp/15/010.png"}, - {0x1710, "keymap_rp/16/001.png"}, - {0x1711, "keymap_rp/16/002.png"}, - {0x1712, "keymap_rp/16/003.png"}, - {0x1713, "keymap_rp/16/004.png"}, - {0x1714, "keymap_rp/16/005.png"}, - {0x1715, "keymap_rp/16/006.png"}, - {0x1716, "keymap_rp/16/007.png"}, - {0x1717, "keymap_rp/16/008.png"}, - {0x1718, "keymap_rp/16/009.png"}, - {0x1719, "keymap_rp/16/010.png"}, - {0x1720, "keymap_rp/17/001.png"}, - {0x1721, "keymap_rp/17/002.png"}, - {0x1722, "keymap_rp/17/003.png"}, - {0x1723, "keymap_rp/17/004.png"}, - {0x1724, "keymap_rp/17/005.png"}, - {0x1725, "keymap_rp/17/006.png"}, - {0x1726, "keymap_rp/17/007.png"}, - {0x1727, "keymap_rp/17/008.png"}, - {0x1728, "keymap_rp/17/009.png"}, - {0x1729, "keymap_rp/17/010.png"}, - {0x1730, "keymap_rp/18/001.png"}, - {0x1731, "keymap_rp/18/002.png"}, - {0x1732, "keymap_rp/18/003.png"}, - {0x1733, "keymap_rp/18/004.png"}, - {0x1734, "keymap_rp/18/005.png"}, - {0x1735, "keymap_rp/18/006.png"}, - {0x1736, "keymap_rp/18/007.png"}, - {0x1737, "keymap_rp/18/008.png"}, - {0x1738, "keymap_rp/18/009.png"}, - {0x1739, "keymap_rp/18/010.png"}, - {0x1740, "keymap_rp/19/001.png"}, - {0x1741, "keymap_rp/19/002.png"}, - {0x1742, "keymap_rp/19/003.png"}, - {0x1743, "keymap_rp/19/004.png"}, - {0x1744, "keymap_rp/19/005.png"}, - {0x1745, "keymap_rp/19/006.png"}, - {0x1746, "keymap_rp/19/007.png"}, - {0x1747, "keymap_rp/19/008.png"}, - {0x1748, "keymap_rp/19/009.png"}, - {0x1749, "keymap_rp/19/010.png"}, - {0x1750, "keymap_rp/20/001.png"}, - {0x1751, "keymap_rp/20/002.png"}, - {0x1752, "keymap_rp/20/003.png"}, - {0x1753, "keymap_rp/20/004.png"}, - {0x1754, "keymap_rp/20/005.png"}, - {0x1755, "keymap_rp/20/006.png"}, - {0x1756, "keymap_rp/20/007.png"}, - {0x1757, "keymap_rp/20/008.png"}, - {0x1758, "keymap_rp/20/009.png"}, - {0x1759, "keymap_rp/20/010.png"}, - {0x1760, "keymap_rp/21/001.png"}, - {0x1761, "keymap_rp/21/002.png"}, - {0x1762, "keymap_rp/21/003.png"}, - {0x1763, "keymap_rp/21/004.png"}, - {0x1764, "keymap_rp/21/005.png"}, - {0x1765, "keymap_rp/21/006.png"}, - {0x1766, "keymap_rp/21/007.png"}, - {0x1767, "keymap_rp/21/008.png"}, - {0x1768, "keymap_rp/21/009.png"}, - {0x1769, "keymap_rp/21/010.png"}, - {0x1770, "keymap_rp/22/001.png"}, - {0x1771, "keymap_rp/22/002.png"}, - {0x1772, "keymap_rp/22/003.png"}, - {0x1773, "keymap_rp/22/004.png"}, - {0x1774, "keymap_rp/22/005.png"}, - {0x1775, "keymap_rp/22/006.png"}, - {0x1776, "keymap_rp/22/007.png"}, - {0x1777, "keymap_rp/22/008.png"}, - {0x1778, "keymap_rp/22/009.png"}, - {0x1779, "keymap_rp/22/010.png"}, - {0x1780, "keymap_rp/23/001.png"}, - {0x1781, "keymap_rp/23/002.png"}, - {0x1782, "keymap_rp/23/003.png"}, - {0x1783, "keymap_rp/23/004.png"}, - {0x1784, "keymap_rp/23/005.png"}, - {0x1785, "keymap_rp/23/006.png"}, - {0x1786, "keymap_rp/23/007.png"}, - {0x1787, "keymap_rp/23/008.png"}, - {0x1788, "keymap_rp/23/009.png"}, - {0x1789, "keymap_rp/23/010.png"}, - {0x1790, "keymap_rp/24/001.png"}, - {0x1791, "keymap_rp/24/002.png"}, - {0x1792, "keymap_rp/24/003.png"}, - {0x1793, "keymap_rp/24/004.png"}, - {0x1794, "keymap_rp/24/005.png"}, - {0x1795, "keymap_rp/24/006.png"}, - {0x1796, "keymap_rp/24/007.png"}, - {0x1797, "keymap_rp/24/008.png"}, - {0x1798, "keymap_rp/24/009.png"}, - {0x1799, "keymap_rp/24/010.png"}, - {0x17A0, "keymap_rp/25/001.png"}, - {0x17A1, "keymap_rp/25/002.png"}, - {0x17A2, "keymap_rp/25/003.png"}, - {0x17A3, "keymap_rp/25/004.png"}, - {0x17A4, "keymap_rp/25/005.png"}, - {0x17A5, "keymap_rp/25/006.png"}, - {0x17A6, "keymap_rp/25/007.png"}, - {0x17A7, "keymap_rp/25/008.png"}, - {0x17A8, "keymap_rp/25/009.png"}, - {0x17A9, "keymap_rp/25/010.png"}, - {0x17B0, "keymap_rp/26/001.png"}, - {0x17B1, "keymap_rp/26/002.png"}, - {0x17B2, "keymap_rp/26/003.png"}, - {0x17B3, "keymap_rp/26/004.png"}, - {0x17B4, "keymap_rp/26/005.png"}, - {0x17B5, "keymap_rp/26/006.png"}, - {0x17B6, "keymap_rp/26/007.png"}, - {0x17B7, "keymap_rp/26/008.png"}, - {0x17B8, "keymap_rp/26/009.png"}, - {0x17B9, "keymap_rp/26/010.png"}, - {0x17C0, "keymap_rp/27/001.png"}, - {0x17C1, "keymap_rp/27/002.png"}, - {0x17C2, "keymap_rp/27/003.png"}, - {0x17C3, "keymap_rp/27/004.png"}, - {0x17C4, "keymap_rp/27/005.png"}, - {0x17C5, "keymap_rp/27/006.png"}, - {0x17C6, "keymap_rp/27/007.png"}, - {0x17C7, "keymap_rp/27/008.png"}, - {0x17C8, "keymap_rp/27/009.png"}, - {0x17C9, "keymap_rp/27/010.png"}, - {0x17D0, "keymap_rp/28/001.png"}, - {0x17D1, "keymap_rp/28/002.png"}, - {0x17D2, "keymap_rp/28/003.png"}, - {0x17D3, "keymap_rp/28/004.png"}, - {0x17D4, "keymap_rp/28/005.png"}, - {0x17D5, "keymap_rp/28/006.png"}, - {0x17D6, "keymap_rp/28/007.png"}, - {0x17D7, "keymap_rp/28/008.png"}, - {0x17D8, "keymap_rp/28/009.png"}, - {0x17D9, "keymap_rp/28/010.png"}, - {0x17E0, "keymap_rp/29/001.png"}, - {0x17E1, "keymap_rp/29/002.png"}, - {0x17E2, "keymap_rp/29/003.png"}, - {0x17E3, "keymap_rp/29/004.png"}, - {0x17E4, "keymap_rp/29/005.png"}, - {0x17E5, "keymap_rp/29/006.png"}, - {0x17E6, "keymap_rp/29/007.png"}, - {0x17E7, "keymap_rp/29/008.png"}, - {0x17E8, "keymap_rp/29/009.png"}, - {0x17E9, "keymap_rp/29/010.png"}, - {0x17F0, "keymap_rp/30/001.png"}, - {0x17F1, "keymap_rp/30/002.png"}, - {0x17F2, "keymap_rp/30/003.png"}, - {0x17F3, "keymap_rp/30/004.png"}, - {0x17F4, "keymap_rp/30/005.png"}, - {0x17F5, "keymap_rp/30/006.png"}, - {0x17F6, "keymap_rp/30/007.png"}, - {0x17F7, "keymap_rp/30/008.png"}, - {0x17F8, "keymap_rp/30/009.png"}, - {0x17F9, "keymap_rp/30/010.png"}, -}}; - -std::string_view GetEntryNameByType(u32 type) { - const auto key = PkgEntryValue{type}; - const auto it = std::ranges::lower_bound(PkgEntries, key); - if (it != PkgEntries.end() && it->type == type) { - return it->name; - } - return ""; -} diff --git a/src/core/file_format/pkg_type.h b/src/core/file_format/pkg_type.h deleted file mode 100644 index 6b010e3a3..000000000 --- a/src/core/file_format/pkg_type.h +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include "common/types.h" - -/// Retrieves the PKG entry name from its type identifier. -std::string_view GetEntryNameByType(u32 type); diff --git a/src/core/file_format/trp.cpp b/src/core/file_format/trp.cpp index d25c93c3f..311bd0b9d 100644 --- a/src/core/file_format/trp.cpp +++ b/src/core/file_format/trp.cpp @@ -1,10 +1,36 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include + #include "common/config.h" #include "common/logging/log.h" #include "common/path_util.h" -#include "trp.h" +#include "core/file_format/trp.h" + +static void DecryptEFSM(std::span trophyKey, + std::span NPcommID, + std::span efsmIv, std::span ciphertext, + std::span decrypted) { + + // step 1: Encrypt NPcommID + CryptoPP::CBC_Mode::Encryption encrypt; + + std::vector trophyIv(16, 0); + std::vector trpKey(16); + + encrypt.SetKeyWithIV(trophyKey.data(), trophyKey.size(), trophyIv.data()); + encrypt.ProcessData(trpKey.data(), NPcommID.data(), 16); + + // step 2: decrypt efsm. + CryptoPP::CBC_Mode::Decryption decrypt; + decrypt.SetKeyWithIV(trpKey.data(), trpKey.size(), efsmIv.data()); + + for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { + decrypt.ProcessData(decrypted.data() + i, ciphertext.data() + i, CryptoPP::AES::BLOCKSIZE); + } +} TRP::TRP() = default; TRP::~TRP() = default; @@ -115,7 +141,7 @@ bool TRP::Extract(const std::filesystem::path& trophyPath, const std::string tit return false; } file.Read(ESFM); - crypto.decryptEFSM(user_key, np_comm_id, esfmIv, ESFM, XML); // decrypt + DecryptEFSM(user_key, np_comm_id, esfmIv, ESFM, XML); // decrypt removePadding(XML); std::string xml_name = entry.entry_name; size_t pos = xml_name.find("ESFM"); diff --git a/src/core/file_format/trp.h b/src/core/file_format/trp.h index aec129f0e..01207475b 100644 --- a/src/core/file_format/trp.h +++ b/src/core/file_format/trp.h @@ -7,7 +7,6 @@ #include "common/endian.h" #include "common/io_file.h" #include "common/types.h" -#include "core/crypto/crypto.h" struct TrpHeader { u32_be magic; // (0xDCA24D00) @@ -37,10 +36,9 @@ public: void GetNPcommID(const std::filesystem::path& trophyPath, int index); private: - Crypto crypto; std::vector NPcommID = std::vector(12); std::array np_comm_id{}; std::array esfmIv{}; std::filesystem::path trpFilesPath; static constexpr int iv_len = 16; -}; \ No newline at end of file +}; diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index 3420e933e..e92676c02 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "about_dialog.h" #include "cheats_patches.h" @@ -19,7 +20,6 @@ #include "common/string_util.h" #include "common/version.h" #include "control_settings.h" -#include "core/file_format/pkg.h" #include "core/loader.h" #include "game_install_dialog.h" #include "install_dir_select.h" @@ -718,7 +718,6 @@ void MainWindow::CreateConnects() { }); // Package install. - connect(ui->bootInstallPkgAct, &QAction::triggered, this, &MainWindow::InstallPkg); connect(ui->bootGameAct, &QAction::triggered, this, &MainWindow::BootGame); connect(ui->gameInstallPathAct, &QAction::triggered, this, &MainWindow::InstallDirectory); @@ -726,15 +725,6 @@ void MainWindow::CreateConnects() { connect(ui->addElfFolderAct, &QAction::triggered, m_elf_viewer.data(), &ElfViewer::OpenElfFolder); - // Package Viewer. - connect(ui->pkgViewerAct, &QAction::triggered, this, [this]() { - PKGViewer* pkgViewer = new PKGViewer( - m_game_info, this, [this](std::filesystem::path file, int pkgNum, int nPkg) { - this->InstallDragDropPkg(file, pkgNum, nPkg); - }); - pkgViewer->show(); - }); - // Trophy Viewer connect(ui->trophyViewerAct, &QAction::triggered, this, [this]() { if (m_game_info->m_games.empty()) { @@ -965,22 +955,6 @@ void MainWindow::SaveWindowState() const { this->geometry().width(), this->geometry().height()); } -void MainWindow::InstallPkg() { - QFileDialog dialog; - dialog.setFileMode(QFileDialog::ExistingFiles); - dialog.setNameFilter(tr("PKG File (*.PKG *.pkg)")); - if (dialog.exec()) { - QStringList fileNames = dialog.selectedFiles(); - int nPkg = fileNames.size(); - int pkgNum = 0; - for (const QString& file : fileNames) { - ++pkgNum; - std::filesystem::path path = Common::FS::PathFromQString(file); - MainWindow::InstallDragDropPkg(path, pkgNum, nPkg); - } - } -} - void MainWindow::BootGame() { QFileDialog dialog; dialog.setFileMode(QFileDialog::ExistingFile); @@ -1004,260 +978,6 @@ void MainWindow::BootGame() { } } -void MainWindow::InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg) { - if (Loader::DetectFileType(file) == Loader::FileTypes::Pkg) { - std::string failreason; - pkg = PKG(); - if (!pkg.Open(file, failreason)) { - QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); - return; - } - if (!psf.Open(pkg.sfo)) { - QMessageBox::critical(this, tr("PKG ERROR"), - "Could not read SFO. Check log for details"); - return; - } - auto category = psf.GetString("CATEGORY"); - - if (!use_for_all_queued || pkgNum == 1) { - InstallDirSelect ids; - const auto selected = ids.exec(); - if (selected == QDialog::Rejected) { - return; - } - - last_install_dir = ids.getSelectedDirectory(); - delete_file_on_install = ids.deleteFileOnInstall(); - use_for_all_queued = ids.useForAllQueued(); - } - std::filesystem::path game_install_dir = last_install_dir; - - QString pkgType = QString::fromStdString(pkg.GetPkgFlags()); - bool use_game_update = pkgType.contains("PATCH") && Config::getSeparateUpdateEnabled(); - - // Default paths - auto game_folder_path = game_install_dir / pkg.GetTitleID(); - auto game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-patch") - : game_folder_path; - const int max_depth = 5; - - if (pkgType.contains("PATCH")) { - // For patches, try to find the game recursively - auto found_game = Common::FS::FindGameByID(game_install_dir, - std::string{pkg.GetTitleID()}, max_depth); - if (found_game.has_value()) { - game_folder_path = found_game.value().parent_path(); - game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-patch") - : game_folder_path; - } - } else { - // For base games, we check if the game is already installed - auto found_game = Common::FS::FindGameByID(game_install_dir, - std::string{pkg.GetTitleID()}, max_depth); - if (found_game.has_value()) { - game_folder_path = found_game.value().parent_path(); - } - // If the game is not found, we install it in the game install directory - else { - game_folder_path = game_install_dir / pkg.GetTitleID(); - } - game_update_path = use_game_update ? game_folder_path.parent_path() / - (std::string{pkg.GetTitleID()} + "-patch") - : game_folder_path; - } - - QString gameDirPath; - Common::FS::PathToQString(gameDirPath, game_folder_path); - QDir game_dir(gameDirPath); - if (game_dir.exists()) { - QMessageBox msgBox; - msgBox.setWindowTitle(tr("PKG Extraction")); - - std::string content_id; - if (auto value = psf.GetString("CONTENT_ID"); value.has_value()) { - content_id = std::string{*value}; - } else { - QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no CONTENT_ID"); - return; - } - std::string entitlement_label = Common::SplitString(content_id, '-')[2]; - - auto addon_extract_path = - Config::getAddonInstallDir() / pkg.GetTitleID() / entitlement_label; - QString addonDirPath; - Common::FS::PathToQString(addonDirPath, addon_extract_path); - QDir addon_dir(addonDirPath); - - if (pkgType.contains("PATCH")) { - QString pkg_app_version; - if (auto app_ver = psf.GetString("APP_VER"); app_ver.has_value()) { - pkg_app_version = QString::fromStdString(std::string{*app_ver}); - } else { - QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no APP_VER"); - return; - } - std::filesystem::path sce_folder_path = - std::filesystem::exists(game_update_path / "sce_sys" / "param.sfo") - ? game_update_path / "sce_sys" / "param.sfo" - : game_folder_path / "sce_sys" / "param.sfo"; - psf.Open(sce_folder_path); - QString game_app_version; - if (auto app_ver = psf.GetString("APP_VER"); app_ver.has_value()) { - game_app_version = QString::fromStdString(std::string{*app_ver}); - } else { - QMessageBox::critical(this, tr("PKG ERROR"), "PSF file there is no APP_VER"); - return; - } - double appD = game_app_version.toDouble(); - double pkgD = pkg_app_version.toDouble(); - if (pkgD == appD) { - msgBox.setText(QString(tr("Patch detected!") + "\n" + - tr("PKG and Game versions match: ") + pkg_app_version + - "\n" + tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - } else if (pkgD < appD) { - msgBox.setText(QString(tr("Patch detected!") + "\n" + - tr("PKG Version %1 is older than installed version: ") - .arg(pkg_app_version) + - game_app_version + "\n" + - tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - } else { - msgBox.setText(QString(tr("Patch detected!") + "\n" + - tr("Game is installed: ") + game_app_version + "\n" + - tr("Would you like to install Patch: ") + - pkg_app_version + " ?")); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - } - int result = msgBox.exec(); - if (result == QMessageBox::Yes) { - // Do nothing. - } else { - return; - } - } else if (category == "ac") { - if (!addon_dir.exists()) { - QMessageBox addonMsgBox; - addonMsgBox.setWindowTitle(tr("DLC Installation")); - addonMsgBox.setText(QString(tr("Would you like to install DLC: %1?")) - .arg(QString::fromStdString(entitlement_label))); - - addonMsgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - addonMsgBox.setDefaultButton(QMessageBox::No); - int result = addonMsgBox.exec(); - if (result == QMessageBox::Yes) { - game_update_path = addon_extract_path; - } else { - return; - } - } else { - msgBox.setText(QString(tr("DLC already installed:") + "\n" + addonDirPath + - "\n\n" + tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - int result = msgBox.exec(); - if (result == QMessageBox::Yes) { - game_update_path = addon_extract_path; - } else { - return; - } - } - } else { - msgBox.setText(QString(tr("Game already installed") + "\n" + gameDirPath + "\n" + - tr("Would you like to overwrite?"))); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - msgBox.setDefaultButton(QMessageBox::No); - int result = msgBox.exec(); - if (result == QMessageBox::Yes) { - // Do nothing. - } else { - return; - } - } - } else { - // Do nothing; - if (pkgType.contains("PATCH") || category == "ac") { - QMessageBox::information( - this, tr("PKG Extraction"), - tr("PKG is a patch or DLC, please install the game first!")); - return; - } - // what else? - } - if (!pkg.Extract(file, game_update_path, failreason)) { - QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); - } else { - int nfiles = pkg.GetNumberOfFiles(); - - if (nfiles > 0) { - QVector indices; - for (int i = 0; i < nfiles; i++) { - indices.append(i); - } - - QProgressDialog dialog; - dialog.setWindowTitle(tr("PKG Extraction")); - dialog.setWindowModality(Qt::WindowModal); - QString extractmsg = QString(tr("Extracting PKG %1/%2")).arg(pkgNum).arg(nPkg); - dialog.setLabelText(extractmsg); - dialog.setAutoClose(true); - dialog.setRange(0, nfiles); - - dialog.setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, - dialog.size(), this->geometry())); - - QFutureWatcher futureWatcher; - connect(&futureWatcher, &QFutureWatcher::finished, this, [=, this]() { - if (pkgNum == nPkg) { - QString path; - - // We want to show the parent path instead of the full path - Common::FS::PathToQString(path, game_folder_path.parent_path()); - QIcon windowIcon( - Common::FS::PathToUTF8String(game_folder_path / "sce_sys/icon0.png") - .c_str()); - - QMessageBox extractMsgBox(this); - extractMsgBox.setWindowTitle(tr("Extraction Finished")); - if (!windowIcon.isNull()) { - extractMsgBox.setWindowIcon(windowIcon); - } - extractMsgBox.setText( - QString(tr("Game successfully installed at %1")).arg(path)); - extractMsgBox.addButton(QMessageBox::Ok); - extractMsgBox.setDefaultButton(QMessageBox::Ok); - connect(&extractMsgBox, &QMessageBox::buttonClicked, this, - [&](QAbstractButton* button) { - if (extractMsgBox.button(QMessageBox::Ok) == button) { - extractMsgBox.close(); - emit ExtractionFinished(); - } - }); - extractMsgBox.exec(); - } - if (delete_file_on_install) { - std::filesystem::remove(file); - } - }); - connect(&dialog, &QProgressDialog::canceled, [&]() { futureWatcher.cancel(); }); - connect(&futureWatcher, &QFutureWatcher::progressValueChanged, &dialog, - &QProgressDialog::setValue); - futureWatcher.setFuture( - QtConcurrent::map(indices, [&](int index) { pkg.ExtractFiles(index); })); - dialog.exec(); - } - } - } else { - QMessageBox::critical(this, tr("PKG ERROR"), - tr("File doesn't appear to be a valid PKG file")); - } -} - void MainWindow::InstallDirectory() { GameInstallDialog dlg; dlg.exec(); @@ -1340,7 +1060,6 @@ QIcon MainWindow::RecolorIcon(const QIcon& icon, bool isWhite) { } void MainWindow::SetUiIcons(bool isWhite) { - ui->bootInstallPkgAct->setIcon(RecolorIcon(ui->bootInstallPkgAct->icon(), isWhite)); ui->bootGameAct->setIcon(RecolorIcon(ui->bootGameAct->icon(), isWhite)); ui->shadFolderAct->setIcon(RecolorIcon(ui->shadFolderAct->icon(), isWhite)); ui->exitAct->setIcon(RecolorIcon(ui->exitAct->icon(), isWhite)); @@ -1368,7 +1087,6 @@ void MainWindow::SetUiIcons(bool isWhite) { ui->keyboardButton->setIcon(RecolorIcon(ui->keyboardButton->icon(), isWhite)); ui->refreshGameListAct->setIcon(RecolorIcon(ui->refreshGameListAct->icon(), isWhite)); ui->menuGame_List_Mode->setIcon(RecolorIcon(ui->menuGame_List_Mode->icon(), isWhite)); - ui->pkgViewerAct->setIcon(RecolorIcon(ui->pkgViewerAct->icon(), isWhite)); ui->trophyViewerAct->setIcon(RecolorIcon(ui->trophyViewerAct->icon(), isWhite)); ui->configureAct->setIcon(RecolorIcon(ui->configureAct->icon(), isWhite)); ui->addElfFolderAct->setIcon(RecolorIcon(ui->addElfFolderAct->icon(), isWhite)); diff --git a/src/qt_gui/main_window.h b/src/qt_gui/main_window.h index bcd5e53ba..5d05bfca4 100644 --- a/src/qt_gui/main_window.h +++ b/src/qt_gui/main_window.h @@ -22,7 +22,6 @@ #include "game_list_utils.h" #include "main_window_themes.h" #include "main_window_ui.h" -#include "pkg_viewer.h" class GameListFrame; @@ -36,7 +35,6 @@ public: explicit MainWindow(QWidget* parent = nullptr); ~MainWindow(); bool Init(); - void InstallDragDropPkg(std::filesystem::path file, int pkgNum, int nPkg); void InstallDirectory(); void StartGame(); void PauseGame(); @@ -72,7 +70,6 @@ private: void SetLastUsedTheme(); void SetLastIconSizeBullet(); void SetUiIcons(bool isWhite); - void InstallPkg(); void BootGame(); void AddRecentFiles(QString filePath); void LoadTranslation(); @@ -89,7 +86,6 @@ private: QActionGroup* m_list_mode_act_group = nullptr; QActionGroup* m_theme_act_group = nullptr; QActionGroup* m_recent_files_group = nullptr; - PKG pkg; // Dockable widget frames WindowThemes m_window_themes; GameListUtils m_game_list_utils; @@ -120,20 +116,6 @@ protected: } } - void dropEvent(QDropEvent* event1) override { - const QMimeData* mimeData = event1->mimeData(); - if (mimeData->hasUrls()) { - QList urlList = mimeData->urls(); - int pkgNum = 0; - int nPkg = urlList.size(); - for (const QUrl& url : urlList) { - pkgNum++; - std::filesystem::path path = Common::FS::PathFromQString(url.toLocalFile()); - InstallDragDropPkg(path, pkgNum, nPkg); - } - } - } - void resizeEvent(QResizeEvent* event) override; std::filesystem::path last_install_dir = ""; diff --git a/src/qt_gui/main_window_ui.h b/src/qt_gui/main_window_ui.h index c4f47b636..2c4d4480b 100644 --- a/src/qt_gui/main_window_ui.h +++ b/src/qt_gui/main_window_ui.h @@ -9,7 +9,6 @@ class Ui_MainWindow { public: - QAction* bootInstallPkgAct; QAction* bootGameAct; QAction* addElfFolderAct; QAction* shadFolderAct; @@ -27,7 +26,6 @@ public: QAction* gameInstallPathAct; QAction* downloadCheatsPatchesAct; QAction* dumpGameListAct; - QAction* pkgViewerAct; QAction* trophyViewerAct; #ifdef ENABLE_UPDATER QAction* updaterAct; @@ -87,9 +85,6 @@ public: MainWindow->setDockNestingEnabled(true); MainWindow->setDockOptions(QMainWindow::AllowNestedDocks | QMainWindow::AllowTabbedDocks | QMainWindow::AnimatedDocks | QMainWindow::GroupedDragging); - bootInstallPkgAct = new QAction(MainWindow); - bootInstallPkgAct->setObjectName("bootInstallPkgAct"); - bootInstallPkgAct->setIcon(QIcon(":images/file_icon.png")); bootGameAct = new QAction(MainWindow); bootGameAct->setObjectName("bootGameAct"); bootGameAct->setIcon(QIcon(":images/play_icon.png")); @@ -148,9 +143,6 @@ public: dumpGameListAct = new QAction(MainWindow); dumpGameListAct->setObjectName("dumpGameList"); dumpGameListAct->setIcon(QIcon(":images/dump_icon.png")); - pkgViewerAct = new QAction(MainWindow); - pkgViewerAct->setObjectName("pkgViewer"); - pkgViewerAct->setIcon(QIcon(":images/file_icon.png")); trophyViewerAct = new QAction(MainWindow); trophyViewerAct->setObjectName("trophyViewer"); trophyViewerAct->setIcon(QIcon(":images/trophy_icon.png")); @@ -309,7 +301,6 @@ public: menuBar->addAction(menuView->menuAction()); menuBar->addAction(menuSettings->menuAction()); menuBar->addAction(menuHelp->menuAction()); - menuFile->addAction(bootInstallPkgAct); menuFile->addAction(bootGameAct); menuFile->addSeparator(); menuFile->addAction(addElfFolderAct); @@ -345,7 +336,6 @@ public: menuSettings->addAction(menuUtils->menuAction()); menuUtils->addAction(downloadCheatsPatchesAct); menuUtils->addAction(dumpGameListAct); - menuUtils->addAction(pkgViewerAct); menuUtils->addAction(trophyViewerAct); #ifdef ENABLE_UPDATER menuHelp->addAction(updaterAct); @@ -361,8 +351,6 @@ public: MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "shadPS4", nullptr)); addElfFolderAct->setText( QCoreApplication::translate("MainWindow", "Open/Add Elf Folder", nullptr)); - bootInstallPkgAct->setText( - QCoreApplication::translate("MainWindow", "Install Packages (PKG)", nullptr)); bootGameAct->setText(QCoreApplication::translate("MainWindow", "Boot Game", nullptr)); #ifdef ENABLE_UPDATER updaterAct->setText( @@ -371,8 +359,6 @@ public: aboutAct->setText(QCoreApplication::translate("MainWindow", "About shadPS4", nullptr)); configureAct->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); #if QT_CONFIG(tooltip) - bootInstallPkgAct->setToolTip(QCoreApplication::translate( - "MainWindow", "Install application from a .pkg file", nullptr)); #endif // QT_CONFIG(tooltip) menuRecent->setTitle(QCoreApplication::translate("MainWindow", "Recent Games", nullptr)); shadFolderAct->setText( @@ -404,7 +390,6 @@ public: QCoreApplication::translate("MainWindow", "Download Cheats/Patches", nullptr)); dumpGameListAct->setText( QCoreApplication::translate("MainWindow", "Dump Game List", nullptr)); - pkgViewerAct->setText(QCoreApplication::translate("MainWindow", "PKG Viewer", nullptr)); trophyViewerAct->setText( QCoreApplication::translate("MainWindow", "Trophy Viewer", nullptr)); mw_searchbar->setPlaceholderText( @@ -433,4 +418,4 @@ public: namespace Ui { class MainWindow : public Ui_MainWindow {}; -} // namespace Ui \ No newline at end of file +} // namespace Ui diff --git a/src/qt_gui/pkg_viewer.cpp b/src/qt_gui/pkg_viewer.cpp deleted file mode 100644 index ecbc6312d..000000000 --- a/src/qt_gui/pkg_viewer.cpp +++ /dev/null @@ -1,217 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "pkg_viewer.h" - -PKGViewer::PKGViewer(std::shared_ptr game_info_get, QWidget* parent, - std::function InstallDragDropPkg) - : QMainWindow(), m_game_info(game_info_get) { - this->resize(1280, 720); - this->setAttribute(Qt::WA_DeleteOnClose); - dir_list_std = Config::getPkgViewer(); - dir_list.clear(); - for (const auto& str : dir_list_std) { - dir_list.append(QString::fromStdString(str)); - } - statusBar = new QStatusBar(treeWidget); - this->setStatusBar(statusBar); - treeWidget = new QTreeWidget(this); - treeWidget->setColumnCount(9); - QStringList headers; - headers << tr("Name") << tr("Serial") << tr("Installed") << tr("Size") << tr("Category") - << tr("Type") << tr("App Ver") << tr("FW") << tr("Region") << tr("Flags") << tr("Path"); - treeWidget->setHeaderLabels(headers); - treeWidget->header()->setDefaultAlignment(Qt::AlignCenter); - treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); - treeWidget->setColumnWidth(8, 170); - this->setCentralWidget(treeWidget); - QMenuBar* menuBar = new QMenuBar(this); - menuBar->setContextMenuPolicy(Qt::PreventContextMenu); - QMenu* fileMenu = menuBar->addMenu(tr("File")); - QAction* openFolderAct = new QAction(tr("Open Folder"), this); - fileMenu->addAction(openFolderAct); - this->setMenuBar(menuBar); - CheckPKGFolders(); // Check for new PKG files in existing folders. - ProcessPKGInfo(); - - connect(openFolderAct, &QAction::triggered, this, &PKGViewer::OpenPKGFolder); - - connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, - [=, this](const QPoint& pos) { - if (treeWidget->selectedItems().isEmpty()) { - return; - } - m_gui_context_menus.RequestGameMenuPKGViewer(pos, m_full_pkg_list, treeWidget, - InstallDragDropPkg); - }); - - connect(parent, &QWidget::destroyed, this, [this]() { this->deleteLater(); }); -} - -PKGViewer::~PKGViewer() {} - -void PKGViewer::OpenPKGFolder() { - QString folderPath = - QFileDialog::getExistingDirectory(this, tr("Open Folder"), QDir::homePath()); - if (!dir_list.contains(folderPath)) { - dir_list.append(folderPath); - QDir directory(folderPath); - QFileInfoList fileInfoList = directory.entryInfoList(QDir::Files); - for (const QFileInfo& fileInfo : fileInfoList) { - QString file_ext = fileInfo.suffix(); - if (fileInfo.isFile() && file_ext == "pkg") { - m_pkg_list.append(fileInfo.absoluteFilePath()); - } - } - std::sort(m_pkg_list.begin(), m_pkg_list.end()); - ProcessPKGInfo(); - dir_list_std.clear(); - for (auto dir : dir_list) { - dir_list_std.push_back(dir.toStdString()); - } - Config::setPkgViewer(dir_list_std); - } else { - // qDebug() << "Folder selection canceled."; - } -} - -void PKGViewer::CheckPKGFolders() { // Check for new PKG file additions. - m_pkg_list.clear(); - for (const QString& dir : dir_list) { - QDir directory(dir); - QFileInfoList fileInfoList = directory.entryInfoList(QDir::Files); - for (const QFileInfo& fileInfo : fileInfoList) { - QString file_ext = fileInfo.suffix(); - if (fileInfo.isFile() && file_ext == "pkg") { - m_pkg_list.append(fileInfo.absoluteFilePath()); - } - } - } - std::sort(m_pkg_list.begin(), m_pkg_list.end()); -} - -void PKGViewer::ProcessPKGInfo() { - treeWidget->clear(); - map_strings.clear(); - map_integers.clear(); - m_pkg_app_list.clear(); - m_pkg_patch_list.clear(); - m_full_pkg_list.clear(); - for (int i = 0; i < m_pkg_list.size(); i++) { - std::filesystem::path path = Common::FS::PathFromQString(m_pkg_list[i]); - std::string failreason; - if (!package.Open(path, failreason)) { - QMessageBox::critical(this, tr("PKG ERROR"), QString::fromStdString(failreason)); - return; - } - psf.Open(package.sfo); - QString title_name = QString::fromStdString( - std::string{psf.GetString("TITLE").value_or(std::string{tr("Unknown").toStdString()})}); - QString title_id = QString::fromStdString(std::string{ - psf.GetString("TITLE_ID").value_or(std::string{tr("Unknown").toStdString()})}); - QString app_type = GameListUtils::GetAppType(psf.GetInteger("APP_TYPE").value_or(0)); - QString app_version = QString::fromStdString(std::string{ - psf.GetString("APP_VER").value_or(std::string{tr("Unknown").toStdString()})}); - QString title_category = QString::fromStdString(std::string{ - psf.GetString("CATEGORY").value_or(std::string{tr("Unknown").toStdString()})}); - QString pkg_size = GameListUtils::FormatSize(package.GetPkgHeader().pkg_size); - pkg_content_flag = package.GetPkgHeader().pkg_content_flags; - QString flagss = ""; - for (const auto& flag : package.flagNames) { - if (package.isFlagSet(pkg_content_flag, flag.first)) { - if (!flagss.isEmpty()) - flagss += (", "); - flagss += QString::fromStdString(flag.second.data()); - } - } - - QString fw_ = tr("Unknown"); - if (const auto fw_int_opt = psf.GetInteger("SYSTEM_VER"); fw_int_opt.has_value()) { - const u32 fw_int = *fw_int_opt; - if (fw_int == 0) { - fw_ = "0.00"; - } else { - QString fw = QString::number(fw_int, 16); - fw_ = fw.length() > 7 ? QString::number(fw_int, 16).left(3).insert(2, '.') - : fw.left(3).insert(1, '.'); - } - } - char region = package.GetPkgHeader().pkg_content_id[0]; - QString pkg_info = ""; - if (title_category == "gd" && !flagss.contains("PATCH")) { - title_category = "App"; - pkg_info = title_name + ";;" + title_id + ";;" + pkg_size + ";;" + title_category + - ";;" + app_type + ";;" + app_version + ";;" + fw_ + ";;" + - game_list_util.GetRegion(region) + ";;" + flagss + ";;" + m_pkg_list[i]; - m_pkg_app_list.append(pkg_info); - } else { - title_category = "Patch"; - pkg_info = title_name + ";;" + title_id + ";;" + pkg_size + ";;" + title_category + - ";;" + app_type + ";;" + app_version + ";;" + fw_ + ";;" + - game_list_util.GetRegion(region) + ";;" + flagss + ";;" + m_pkg_list[i]; - m_pkg_patch_list.append(pkg_info); - } - } - std::sort(m_pkg_app_list.begin(), m_pkg_app_list.end()); - for (int i = 0; i < m_pkg_app_list.size(); i++) { - QTreeWidgetItem* treeItem = new QTreeWidgetItem(treeWidget); - QStringList pkg_app_ = m_pkg_app_list[i].split(";;"); - m_full_pkg_list.append(m_pkg_app_list[i]); - treeItem->setExpanded(true); - treeItem->setText(0, pkg_app_[0]); - treeItem->setText(1, pkg_app_[1]); - treeItem->setText(3, pkg_app_[2]); - treeItem->setTextAlignment(3, Qt::AlignCenter); - treeItem->setText(4, pkg_app_[3]); - treeItem->setTextAlignment(4, Qt::AlignCenter); - treeItem->setText(5, pkg_app_[4]); - treeItem->setTextAlignment(5, Qt::AlignCenter); - treeItem->setText(6, pkg_app_[5]); - treeItem->setTextAlignment(6, Qt::AlignCenter); - treeItem->setText(7, pkg_app_[6]); - treeItem->setTextAlignment(7, Qt::AlignCenter); - treeItem->setText(8, pkg_app_[7]); - treeItem->setTextAlignment(8, Qt::AlignCenter); - treeItem->setText(9, pkg_app_[8]); - treeItem->setText(10, pkg_app_[9]); - for (const GameInfo& info : m_game_info->m_games) { // Check if game is installed. - if (info.serial == pkg_app_[1].toStdString()) { - treeItem->setText(2, QChar(0x2713)); - treeItem->setTextAlignment(2, Qt::AlignCenter); - } - } - for (const QString& item : m_pkg_patch_list) { - QStringList pkg_patch_ = item.split(";;"); - if (pkg_patch_[1] == pkg_app_[1]) { // check patches with serial. - m_full_pkg_list.append(item); - QTreeWidgetItem* childItem = new QTreeWidgetItem(treeItem); - childItem->setText(0, pkg_patch_[0]); - childItem->setText(1, pkg_patch_[1]); - childItem->setText(3, pkg_patch_[2]); - childItem->setTextAlignment(3, Qt::AlignCenter); - childItem->setText(4, pkg_patch_[3]); - childItem->setTextAlignment(4, Qt::AlignCenter); - childItem->setText(5, pkg_patch_[4]); - childItem->setTextAlignment(5, Qt::AlignCenter); - childItem->setText(6, pkg_patch_[5]); - childItem->setTextAlignment(6, Qt::AlignCenter); - childItem->setText(7, pkg_patch_[6]); - childItem->setTextAlignment(7, Qt::AlignCenter); - childItem->setText(8, pkg_patch_[7]); - childItem->setTextAlignment(8, Qt::AlignCenter); - childItem->setText(9, pkg_patch_[8]); - childItem->setText(10, pkg_patch_[9]); - } - } - } - - for (int column = 0; column < treeWidget->columnCount() - 2; ++column) { - // Resize the column to fit its contents - treeWidget->resizeColumnToContents(column); - } - // Update status bar. - statusBar->clearMessage(); - int numPkgs = m_pkg_list.size(); - QString statusMessage = QString::number(numPkgs) + " " + tr("Package"); - statusBar->showMessage(statusMessage); -} \ No newline at end of file diff --git a/src/qt_gui/pkg_viewer.h b/src/qt_gui/pkg_viewer.h deleted file mode 100644 index 265a03b92..000000000 --- a/src/qt_gui/pkg_viewer.h +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include - -#include "common/io_file.h" -#include "core/file_format/pkg.h" -#include "core/file_format/pkg_type.h" -#include "core/file_format/psf.h" -#include "game_info.h" -#include "game_list_utils.h" -#include "gui_context_menus.h" - -class PKGViewer : public QMainWindow { - Q_OBJECT -public: - explicit PKGViewer( - std::shared_ptr game_info_get, QWidget* parent, - std::function InstallDragDropPkg = nullptr); - ~PKGViewer(); - void OpenPKGFolder(); - void CheckPKGFolders(); - void ProcessPKGInfo(); - -private: - GuiContextMenus m_gui_context_menus; - PKG package; - PSF psf; - PKGHeader pkgheader; - PKGEntry entry; - PSFHeader header; - char pkgTitleID[9]; - std::vector pkg; - u64 pkgSize = 0; - std::unordered_map map_strings; - std::unordered_map map_integers; - - u32_be pkg_content_flag; - std::shared_ptr m_game_info; - GameListUtils game_list_util; - // Status bar - QStatusBar* statusBar; - - std::vector> appTypes = { - {0, "FULL APP"}, - {1, "UPGRADABLE"}, - {2, "DEMO"}, - {3, "FREEMIUM"}, - }; - - QStringList m_full_pkg_list; - QStringList m_pkg_app_list; - QStringList m_pkg_patch_list; - QStringList m_pkg_list; - QStringList dir_list; - std::vector dir_list_std; - QTreeWidget* treeWidget = nullptr; -}; \ No newline at end of file From 31e1d4f839118b59398ca6f871929fc0e286e13c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Fri, 28 Mar 2025 10:32:17 -0700 Subject: [PATCH 449/455] misc: Remove dead code. (#2702) --- CMakeLists.txt | 4 - documents/Quickstart/2.png | Bin 674148 -> 0 bytes documents/Quickstart/Quickstart.md | 9 +- documents/building-linux.md | 2 +- src/common/config.cpp | 12 - src/common/config.h | 2 - src/core/file_format/pkg.cpp | 473 ----------------------------- src/core/loader.cpp | 28 -- src/core/loader.h | 18 -- src/qt_gui/gui_context_menus.h | 25 -- src/qt_gui/install_dir_select.cpp | 94 ------ src/qt_gui/install_dir_select.h | 42 --- src/qt_gui/main_window.cpp | 2 - 13 files changed, 2 insertions(+), 709 deletions(-) delete mode 100644 documents/Quickstart/2.png delete mode 100644 src/core/file_format/pkg.cpp delete mode 100644 src/core/loader.cpp delete mode 100644 src/core/loader.h delete mode 100644 src/qt_gui/install_dir_select.cpp delete mode 100644 src/qt_gui/install_dir_select.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0359246c8..13204f479 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -678,8 +678,6 @@ set(CORE src/core/aerolib/stubs.cpp src/core/file_format/trp.h src/core/file_sys/fs.cpp src/core/file_sys/fs.h - src/core/loader.cpp - src/core/loader.h src/core/loader/dwarf.cpp src/core/loader/dwarf.h src/core/loader/elf.cpp @@ -969,8 +967,6 @@ set(QT_GUI src/qt_gui/about_dialog.cpp src/qt_gui/game_grid_frame.h src/qt_gui/game_install_dialog.cpp src/qt_gui/game_install_dialog.h - src/qt_gui/install_dir_select.cpp - src/qt_gui/install_dir_select.h src/qt_gui/trophy_viewer.cpp src/qt_gui/trophy_viewer.h src/qt_gui/elf_viewer.cpp diff --git a/documents/Quickstart/2.png b/documents/Quickstart/2.png deleted file mode 100644 index 7e5bdfb155e572865777f38ef686257cedcc60de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674148 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%0D&Jaj*t^~An4&Mk>ql6akxljo4M#GxIb)kg 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%0D`scYI^AhKK6L+2_lMh$J2X{*r%hQ#Zf)uO(QM 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 bYD)h<14Wu<5jwU300000NkvXXu0mjf4H#`p diff --git a/documents/Quickstart/Quickstart.md b/documents/Quickstart/Quickstart.md index 2f2751887..9c6bc5a6f 100644 --- a/documents/Quickstart/Quickstart.md +++ b/documents/Quickstart/Quickstart.md @@ -13,7 +13,6 @@ SPDX-License-Identifier: GPL-2.0-or-later - [**RAM**](#ram) - [**OS**](#os) - [**Have the latest WIP version**](#how-to-run-the-latest-work-in-progress-builds-of-shadps4) -- [**Install PKG files (Games and Updates)**](#install-pkg-files) - [**Configure the emulator**](#configure-the-emulator) ## Minimum PC requirements @@ -48,13 +47,7 @@ SPDX-License-Identifier: GPL-2.0-or-later 2. Once downloaded, extract to its own folder, and run shadPS4's executable from the extracted folder. -3. Upon first launch, shadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that shadPS4 can use to install your PKG files to. - -## Install PKG files - -To install PKG files (game and updates), you will need the Qt application (with UI). You will have to go to "File" then to "Install Packages (PKG)", a window will open then you will have to select the files. You can install multiple PKG files at once. Once finished, the game should appear in the application. - - +3. Upon first launch, shadPS4 will prompt you to select a folder to store your installed games in. Select "Browse" and then select a folder that contains your dumped games. ## Configure the emulator diff --git a/documents/building-linux.md b/documents/building-linux.md index 18ddab0c6..cdc8ba12f 100644 --- a/documents/building-linux.md +++ b/documents/building-linux.md @@ -108,7 +108,7 @@ Now run the emulator. If Qt was enabled at configure time: ./build/shadps4 ``` -Otherwise, specify the path to your PKG's boot file: +Otherwise, specify the path to your game's boot file: ```bash ./build/shadps4 /"PATH"/"TO"/"GAME"/"FOLDER"/eboot.bin diff --git a/src/common/config.cpp b/src/common/config.cpp index b113ac0ef..8ead58686 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -98,7 +98,6 @@ u32 m_slider_pos_grid = 0; u32 m_table_mode = 0; u32 m_window_size_W = 1280; u32 m_window_size_H = 720; -std::vector m_pkg_viewer; std::vector m_elf_viewer; std::vector m_recent_files; std::string emulator_language = "en_US"; @@ -601,11 +600,6 @@ void setMainWindowHeight(u32 height) { m_window_size_H = height; } -void setPkgViewer(const std::vector& pkgList) { - m_pkg_viewer.resize(pkgList.size()); - m_pkg_viewer = pkgList; -} - void setElfViewer(const std::vector& elfList) { m_elf_viewer.resize(elfList.size()); m_elf_viewer = elfList; @@ -709,10 +703,6 @@ u32 getMainWindowHeight() { return m_window_size_H; } -std::vector getPkgViewer() { - return m_pkg_viewer; -} - std::vector getElfViewer() { return m_elf_viewer; } @@ -886,7 +876,6 @@ void load(const std::filesystem::path& path) { main_window_geometry_y = toml::find_or(gui, "geometry_y", 0); main_window_geometry_w = toml::find_or(gui, "geometry_w", 0); main_window_geometry_h = toml::find_or(gui, "geometry_h", 0); - m_pkg_viewer = toml::find_or>(gui, "pkgDirs", {}); m_elf_viewer = toml::find_or>(gui, "elfDirs", {}); m_recent_files = toml::find_or>(gui, "recentFiles", {}); m_table_mode = toml::find_or(gui, "gameTableMode", 0); @@ -1105,7 +1094,6 @@ void saveMainWindow(const std::filesystem::path& path) { data["GUI"]["geometry_y"] = main_window_geometry_y; data["GUI"]["geometry_w"] = main_window_geometry_w; data["GUI"]["geometry_h"] = main_window_geometry_h; - data["GUI"]["pkgDirs"] = m_pkg_viewer; data["GUI"]["elfDirs"] = m_elf_viewer; data["GUI"]["recentFiles"] = m_recent_files; diff --git a/src/common/config.h b/src/common/config.h index 3a0bf252c..d040aa337 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -154,7 +154,6 @@ void setSliderPositionGrid(u32 pos); void setTableMode(u32 mode); void setMainWindowWidth(u32 width); void setMainWindowHeight(u32 height); -void setPkgViewer(const std::vector& pkgList); void setElfViewer(const std::vector& elfList); void setRecentFiles(const std::vector& recentFiles); void setEmulatorLanguage(std::string language); @@ -174,7 +173,6 @@ u32 getSliderPositionGrid(); u32 getTableMode(); u32 getMainWindowWidth(); u32 getMainWindowHeight(); -std::vector getPkgViewer(); std::vector getElfViewer(); std::vector getRecentFiles(); std::string getEmulatorLanguage(); diff --git a/src/core/file_format/pkg.cpp b/src/core/file_format/pkg.cpp deleted file mode 100644 index ecc5f10a4..000000000 --- a/src/core/file_format/pkg.cpp +++ /dev/null @@ -1,473 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include "common/io_file.h" -#include "common/logging/formatter.h" -#include "core/file_format/pkg.h" -#include "core/file_format/pkg_type.h" - -static void DecompressPFSC(std::span compressed_data, std::span decompressed_data) { - z_stream decompressStream; - decompressStream.zalloc = Z_NULL; - decompressStream.zfree = Z_NULL; - decompressStream.opaque = Z_NULL; - - if (inflateInit(&decompressStream) != Z_OK) { - // std::cerr << "Error initializing zlib for deflation." << std::endl; - } - - decompressStream.avail_in = compressed_data.size(); - decompressStream.next_in = reinterpret_cast(compressed_data.data()); - decompressStream.avail_out = decompressed_data.size(); - decompressStream.next_out = reinterpret_cast(decompressed_data.data()); - - if (inflate(&decompressStream, Z_FINISH)) { - } - if (inflateEnd(&decompressStream) != Z_OK) { - // std::cerr << "Error ending zlib inflate" << std::endl; - } -} - -u32 GetPFSCOffset(std::span pfs_image) { - static constexpr u32 PfscMagic = 0x43534650; - u32 value; - for (u32 i = 0x20000; i < pfs_image.size(); i += 0x10000) { - std::memcpy(&value, &pfs_image[i], sizeof(u32)); - if (value == PfscMagic) - return i; - } - return -1; -} - -PKG::PKG() = default; - -PKG::~PKG() = default; - -bool PKG::Open(const std::filesystem::path& filepath, std::string& failreason) { - Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - pkgSize = file.GetSize(); - - file.Read(pkgheader); - if (pkgheader.magic != 0x7F434E54) - return false; - - for (const auto& flag : flagNames) { - if (isFlagSet(pkgheader.pkg_content_flags, flag.first)) { - if (!pkgFlags.empty()) - pkgFlags += (", "); - pkgFlags += (flag.second); - } - } - - // Find title id it is part of pkg_content_id starting at offset 0x40 - file.Seek(0x47); // skip first 7 characters of content_id - file.Read(pkgTitleID); - - u32 offset = pkgheader.pkg_table_entry_offset; - u32 n_files = pkgheader.pkg_table_entry_count; - - if (!file.Seek(offset)) { - failreason = "Failed to seek to PKG table entry offset"; - return false; - } - - for (int i = 0; i < n_files; i++) { - PKGEntry entry{}; - file.Read(entry.id); - file.Read(entry.filename_offset); - file.Read(entry.flags1); - file.Read(entry.flags2); - file.Read(entry.offset); - file.Read(entry.size); - file.Seek(8, Common::FS::SeekOrigin::CurrentPosition); - - // Try to figure out the name - const auto name = GetEntryNameByType(entry.id); - if (name == "param.sfo") { - sfo.clear(); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to param.sfo offset"; - return false; - } - sfo.resize(entry.size); - file.ReadRaw(sfo.data(), entry.size); - } - } - file.Close(); - - return true; -} - -bool PKG::Extract(const std::filesystem::path& filepath, const std::filesystem::path& extract, - std::string& failreason) { - extract_path = extract; - pkgpath = filepath; - Common::FS::IOFile file(filepath, Common::FS::FileAccessMode::Read); - if (!file.IsOpen()) { - return false; - } - pkgSize = file.GetSize(); - file.ReadRaw(&pkgheader, sizeof(PKGHeader)); - - if (pkgheader.magic != 0x7F434E54) - return false; - - if (pkgheader.pkg_size > pkgSize) { - failreason = "PKG file size is different"; - return false; - } - if ((pkgheader.pkg_content_size + pkgheader.pkg_content_offset) > pkgheader.pkg_size) { - failreason = "Content size is bigger than pkg size"; - return false; - } - - u32 offset = pkgheader.pkg_table_entry_offset; - u32 n_files = pkgheader.pkg_table_entry_count; - - std::array concatenated_ivkey_dk3; - std::array seed_digest; - std::array, 7> digest1; - std::array, 7> key1; - std::array imgkeydata; - - if (!file.Seek(offset)) { - failreason = "Failed to seek to PKG table entry offset"; - return false; - } - - for (int i = 0; i < n_files; i++) { - PKGEntry entry{}; - file.Read(entry.id); - file.Read(entry.filename_offset); - file.Read(entry.flags1); - file.Read(entry.flags2); - file.Read(entry.offset); - file.Read(entry.size); - file.Seek(8, Common::FS::SeekOrigin::CurrentPosition); - - auto currentPos = file.Tell(); - - // Try to figure out the name - const auto name = GetEntryNameByType(entry.id); - const auto filepath = extract_path / "sce_sys" / name; - std::filesystem::create_directories(filepath.parent_path()); - - if (name.empty()) { - // Just print with id - Common::FS::IOFile out(extract_path / "sce_sys" / std::to_string(entry.id), - Common::FS::FileAccessMode::Write); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to PKG entry offset"; - return false; - } - - std::vector data; - data.resize(entry.size); - file.ReadRaw(data.data(), entry.size); - out.WriteRaw(data.data(), entry.size); - out.Close(); - - file.Seek(currentPos); - continue; - } - - if (entry.id == 0x1) { // DIGESTS, seek; - // file.Seek(entry.offset, fsSeekSet); - } else if (entry.id == 0x10) { // ENTRY_KEYS, seek; - file.Seek(entry.offset); - file.Read(seed_digest); - - for (int i = 0; i < 7; i++) { - file.Read(digest1[i]); - } - - for (int i = 0; i < 7; i++) { - file.Read(key1[i]); - } - - PKG::crypto.RSA2048Decrypt(dk3_, key1[3], true); // decrypt DK3 - } else if (entry.id == 0x20) { // IMAGE_KEY, seek; IV_KEY - file.Seek(entry.offset); - file.Read(imgkeydata); - - // The Concatenated iv + dk3 imagekey for HASH256 - std::memcpy(concatenated_ivkey_dk3.data(), &entry, sizeof(entry)); - std::memcpy(concatenated_ivkey_dk3.data() + sizeof(entry), dk3_.data(), sizeof(dk3_)); - - PKG::crypto.ivKeyHASH256(concatenated_ivkey_dk3, ivKey); // ivkey_ - // imgkey_ to use for last step to get ekpfs - PKG::crypto.aesCbcCfb128Decrypt(ivKey, imgkeydata, imgKey); - // ekpfs key to get data and tweak keys. - PKG::crypto.RSA2048Decrypt(ekpfsKey, imgKey, false); - } else if (entry.id == 0x80) { - // GENERAL_DIGESTS, seek; - // file.Seek(entry.offset, fsSeekSet); - } - - Common::FS::IOFile out(extract_path / "sce_sys" / name, Common::FS::FileAccessMode::Write); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to PKG entry offset"; - return false; - } - - std::vector data; - data.resize(entry.size); - file.ReadRaw(data.data(), entry.size); - out.WriteRaw(data.data(), entry.size); - out.Close(); - - // Decrypt Np stuff and overwrite. - if (entry.id == 0x400 || entry.id == 0x401 || entry.id == 0x402 || - entry.id == 0x403) { // somehow 0x401 is not decrypting - decNp.resize(entry.size); - if (!file.Seek(entry.offset)) { - failreason = "Failed to seek to PKG entry offset"; - return false; - } - - std::vector data; - data.resize(entry.size); - file.ReadRaw(data.data(), entry.size); - - std::span cipherNp(data.data(), entry.size); - std::array concatenated_ivkey_dk3_; - std::memcpy(concatenated_ivkey_dk3_.data(), &entry, sizeof(entry)); - std::memcpy(concatenated_ivkey_dk3_.data() + sizeof(entry), dk3_.data(), sizeof(dk3_)); - PKG::crypto.ivKeyHASH256(concatenated_ivkey_dk3_, ivKey); - PKG::crypto.aesCbcCfb128DecryptEntry(ivKey, cipherNp, decNp); - - Common::FS::IOFile out(extract_path / "sce_sys" / name, - Common::FS::FileAccessMode::Write); - out.Write(decNp); - out.Close(); - } - - file.Seek(currentPos); - } - - // Read the seed - std::array seed; - if (!file.Seek(pkgheader.pfs_image_offset + 0x370)) { - failreason = "Failed to seek to PFS image offset"; - return false; - } - file.Read(seed); - - // Get data and tweak keys. - PKG::crypto.PfsGenCryptoKey(ekpfsKey, seed, dataKey, tweakKey); - const u32 length = pkgheader.pfs_cache_size * 0x2; // Seems to be ok. - - int num_blocks = 0; - std::vector pfsc(length); - if (length != 0) { - // Read encrypted pfs_image - std::vector pfs_encrypted(length); - file.Seek(pkgheader.pfs_image_offset); - file.Read(pfs_encrypted); - file.Close(); - // Decrypt the pfs_image. - std::vector pfs_decrypted(length); - PKG::crypto.decryptPFS(dataKey, tweakKey, pfs_encrypted, pfs_decrypted, 0); - - // Retrieve PFSC from decrypted pfs_image. - pfsc_offset = GetPFSCOffset(pfs_decrypted); - std::memcpy(pfsc.data(), pfs_decrypted.data() + pfsc_offset, length - pfsc_offset); - - PFSCHdr pfsChdr; - std::memcpy(&pfsChdr, pfsc.data(), sizeof(pfsChdr)); - - num_blocks = (int)(pfsChdr.data_length / pfsChdr.block_sz2); - sectorMap.resize(num_blocks + 1); // 8 bytes, need extra 1 to get the last offset. - - for (int i = 0; i < num_blocks + 1; i++) { - std::memcpy(§orMap[i], pfsc.data() + pfsChdr.block_offsets + i * 8, 8); - } - } - - u32 ent_size = 0; - u32 ndinode = 0; - int ndinode_counter = 0; - bool dinode_reached = false; - bool uroot_reached = false; - std::vector compressedData; - std::vector decompressedData(0x10000); - - // Get iNdoes and Dirents. - for (int i = 0; i < num_blocks; i++) { - const u64 sectorOffset = sectorMap[i]; - const u64 sectorSize = sectorMap[i + 1] - sectorOffset; - - compressedData.resize(sectorSize); - std::memcpy(compressedData.data(), pfsc.data() + sectorOffset, sectorSize); - - if (sectorSize == 0x10000) // Uncompressed data - std::memcpy(decompressedData.data(), compressedData.data(), 0x10000); - else if (sectorSize < 0x10000) // Compressed data - DecompressPFSC(compressedData, decompressedData); - - if (i == 0) { - std::memcpy(&ndinode, decompressedData.data() + 0x30, 4); // number of folders and files - } - - int occupied_blocks = - (ndinode * 0xA8) / 0x10000; // how many blocks(0x10000) are taken by iNodes. - if (((ndinode * 0xA8) % 0x10000) != 0) - occupied_blocks += 1; - - if (i >= 1 && i <= occupied_blocks) { // Get all iNodes, gives type, file size and location. - for (int p = 0; p < 0x10000; p += 0xA8) { - Inode node; - std::memcpy(&node, &decompressedData[p], sizeof(node)); - if (node.Mode == 0) { - break; - } - iNodeBuf.push_back(node); - } - } - - // let's deal with the root/uroot entries here. - // Sometimes it's more than 2 entries (Tomb Raider Remastered) - const std::string_view flat_path_table(&decompressedData[0x10], 15); - if (flat_path_table == "flat_path_table") { - uroot_reached = true; - } - - if (uroot_reached) { - for (int i = 0; i < 0x10000; i += ent_size) { - Dirent dirent; - std::memcpy(&dirent, &decompressedData[i], sizeof(dirent)); - ent_size = dirent.entsize; - if (dirent.ino != 0) { - ndinode_counter++; - } else { - // Set the the folder according to the current inode. - // Can be 2 or more (rarely) - auto parent_path = extract_path.parent_path(); - auto title_id = GetTitleID(); - - if (parent_path.filename() != title_id && - !fmt::UTF(extract_path.u8string()).data.ends_with("-patch")) { - extractPaths[ndinode_counter] = parent_path / title_id; - } else { - // DLCs path has different structure - extractPaths[ndinode_counter] = extract_path; - } - uroot_reached = false; - break; - } - } - } - - const char dot = decompressedData[0x10]; - const std::string_view dotdot(&decompressedData[0x28], 2); - if (dot == '.' && dotdot == "..") { - dinode_reached = true; - } - - // Get folder and file names. - bool end_reached = false; - if (dinode_reached) { - for (int j = 0; j < 0x10000; j += ent_size) { // Skip the first parent and child. - Dirent dirent; - std::memcpy(&dirent, &decompressedData[j], sizeof(dirent)); - - // Stop here and continue the main loop - if (dirent.ino == 0) { - break; - } - - ent_size = dirent.entsize; - auto& table = fsTable.emplace_back(); - table.name = std::string(dirent.name, dirent.namelen); - table.inode = dirent.ino; - table.type = dirent.type; - - if (table.type == PFS_CURRENT_DIR) { - current_dir = extractPaths[table.inode]; - } - extractPaths[table.inode] = current_dir / std::filesystem::path(table.name); - - if (table.type == PFS_FILE || table.type == PFS_DIR) { - if (table.type == PFS_DIR) { // Create dirs. - std::filesystem::create_directory(extractPaths[table.inode]); - } - ndinode_counter++; - if ((ndinode_counter + 1) == ndinode) // 1 for the image itself (root). - end_reached = true; - } - } - if (end_reached) { - break; - } - } - } - return true; -} - -void PKG::ExtractFiles(const int index) { - int inode_number = fsTable[index].inode; - int inode_type = fsTable[index].type; - std::string inode_name = fsTable[index].name; - - if (inode_type == PFS_FILE) { - int sector_loc = iNodeBuf[inode_number].loc; - int nblocks = iNodeBuf[inode_number].Blocks; - int bsize = iNodeBuf[inode_number].Size; - - Common::FS::IOFile inflated; - inflated.Open(extractPaths[inode_number], Common::FS::FileAccessMode::Write); - - Common::FS::IOFile pkgFile; // Open the file for each iteration to avoid conflict. - pkgFile.Open(pkgpath, Common::FS::FileAccessMode::Read); - - int size_decompressed = 0; - std::vector compressedData; - std::vector decompressedData(0x10000); - - u64 pfsc_buf_size = 0x11000; // extra 0x1000 - std::vector pfsc(pfsc_buf_size); - std::vector pfs_decrypted(pfsc_buf_size); - - for (int j = 0; j < nblocks; j++) { - u64 sectorOffset = - sectorMap[sector_loc + j]; // offset into PFSC_image and not pfs_image. - u64 sectorSize = sectorMap[sector_loc + j + 1] - - sectorOffset; // indicates if data is compressed or not. - u64 fileOffset = (pkgheader.pfs_image_offset + pfsc_offset + sectorOffset); - u64 currentSector1 = - (pfsc_offset + sectorOffset) / 0x1000; // block size is 0x1000 for xts decryption. - - int sectorOffsetMask = (sectorOffset + pfsc_offset) & 0xFFFFF000; - int previousData = (sectorOffset + pfsc_offset) - sectorOffsetMask; - - pkgFile.Seek(fileOffset - previousData); - pkgFile.Read(pfsc); - - PKG::crypto.decryptPFS(dataKey, tweakKey, pfsc, pfs_decrypted, currentSector1); - - compressedData.resize(sectorSize); - std::memcpy(compressedData.data(), pfs_decrypted.data() + previousData, sectorSize); - - if (sectorSize == 0x10000) // Uncompressed data - std::memcpy(decompressedData.data(), compressedData.data(), 0x10000); - else if (sectorSize < 0x10000) // Compressed data - DecompressPFSC(compressedData, decompressedData); - - size_decompressed += 0x10000; - - if (j < nblocks - 1) { - inflated.WriteRaw(decompressedData.data(), decompressedData.size()); - } else { - // This is to remove the zeros at the end of the file. - const u32 write_size = decompressedData.size() - (size_decompressed - bsize); - inflated.WriteRaw(decompressedData.data(), write_size); - } - } - pkgFile.Close(); - inflated.Close(); - } -} diff --git a/src/core/loader.cpp b/src/core/loader.cpp deleted file mode 100644 index f80bfbb81..000000000 --- a/src/core/loader.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/io_file.h" -#include "common/types.h" -#include "loader.h" - -namespace Loader { - -FileTypes DetectFileType(const std::filesystem::path& filepath) { - // No file loaded - if (filepath.empty()) { - return FileTypes::Unknown; - } - Common::FS::IOFile file; - file.Open(filepath, Common::FS::FileAccessMode::Read); - file.Seek(0); - u32 magic; - file.Read(magic); - file.Close(); - switch (magic) { - case PkgMagic: - return FileTypes::Pkg; - } - return FileTypes::Unknown; -} - -} // namespace Loader diff --git a/src/core/loader.h b/src/core/loader.h deleted file mode 100644 index 608970dca..000000000 --- a/src/core/loader.h +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -namespace Loader { - -constexpr static u32 PkgMagic = 0x544e437f; - -enum class FileTypes { - Unknown, - Pkg, -}; - -FileTypes DetectFileType(const std::filesystem::path& filepath); -} // namespace Loader diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 0cc0e48dc..7dcb006ba 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -599,30 +598,6 @@ public: return -1; } - void RequestGameMenuPKGViewer( - const QPoint& pos, QStringList m_pkg_app_list, QTreeWidget* treeWidget, - std::function InstallDragDropPkg) { - QPoint global_pos = treeWidget->viewport()->mapToGlobal(pos); // context menu position - QTreeWidgetItem* currentItem = treeWidget->currentItem(); // current clicked item - int itemIndex = GetRowIndex(treeWidget, currentItem); // row - - QMenu menu(treeWidget); - QAction installPackage(tr("Install PKG"), treeWidget); - - menu.addAction(&installPackage); - - auto selected = menu.exec(global_pos); - if (!selected) { - return; - } - - if (selected == &installPackage) { - QStringList pkg_app_ = m_pkg_app_list[itemIndex].split(";;"); - std::filesystem::path path = Common::FS::PathFromQString(pkg_app_[9]); - InstallDragDropPkg(path, 1, 1); - } - } - private: bool convertPngToIco(const QString& pngFilePath, const QString& icoFilePath) { // Load the PNG image diff --git a/src/qt_gui/install_dir_select.cpp b/src/qt_gui/install_dir_select.cpp deleted file mode 100644 index e90a10ee6..000000000 --- a/src/qt_gui/install_dir_select.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "install_dir_select.h" - -InstallDirSelect::InstallDirSelect() : selected_dir() { - auto install_dirs = Config::getGameInstallDirs(); - selected_dir = install_dirs.empty() ? "" : install_dirs.front(); - - if (!install_dirs.empty() && install_dirs.size() == 1) { - accept(); - } - - auto layout = new QVBoxLayout(this); - - layout->addWidget(SetupInstallDirList()); - layout->addStretch(); - layout->addWidget(SetupDialogActions()); - - setWindowTitle(tr("shadPS4 - Choose directory")); - setWindowIcon(QIcon(":images/shadps4.ico")); -} - -InstallDirSelect::~InstallDirSelect() {} - -QWidget* InstallDirSelect::SetupInstallDirList() { - auto group = new QGroupBox(tr("Select which directory you want to install to.")); - auto vlayout = new QVBoxLayout(); - - auto m_path_list = new QListWidget(); - QList qt_list; - for (const auto& str : Config::getGameInstallDirs()) { - QString installDirPath; - Common::FS::PathToQString(installDirPath, str); - qt_list.append(installDirPath); - } - m_path_list->insertItems(0, qt_list); - m_path_list->setSpacing(1); - - connect(m_path_list, &QListWidget::itemClicked, this, &InstallDirSelect::setSelectedDirectory); - connect(m_path_list, &QListWidget::itemActivated, this, - &InstallDirSelect::setSelectedDirectory); - - vlayout->addWidget(m_path_list); - - auto checkbox = new QCheckBox(tr("Install All Queued to Selected Folder")); - connect(checkbox, &QCheckBox::toggled, this, &InstallDirSelect::setUseForAllQueued); - vlayout->addWidget(checkbox); - - auto checkbox2 = new QCheckBox(tr("Delete PKG File on Install")); - connect(checkbox2, &QCheckBox::toggled, this, &InstallDirSelect::setDeleteFileOnInstall); - vlayout->addWidget(checkbox2); - - group->setLayout(vlayout); - return group; -} - -void InstallDirSelect::setSelectedDirectory(QListWidgetItem* item) { - if (item) { - const auto highlighted_path = Common::FS::PathFromQString(item->text()); - if (!highlighted_path.empty()) { - selected_dir = highlighted_path; - } - } -} - -void InstallDirSelect::setUseForAllQueued(bool enabled) { - use_for_all_queued = enabled; -} - -void InstallDirSelect::setDeleteFileOnInstall(bool enabled) { - delete_file_on_install = enabled; -} - -QWidget* InstallDirSelect::SetupDialogActions() { - auto actions = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - - connect(actions, &QDialogButtonBox::accepted, this, &InstallDirSelect::accept); - connect(actions, &QDialogButtonBox::rejected, this, &InstallDirSelect::reject); - - return actions; -} diff --git a/src/qt_gui/install_dir_select.h b/src/qt_gui/install_dir_select.h deleted file mode 100644 index e11cbf381..000000000 --- a/src/qt_gui/install_dir_select.h +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include - -#include "common/config.h" -#include "common/path_util.h" - -class QLineEdit; - -class InstallDirSelect final : public QDialog { - Q_OBJECT - -public: - InstallDirSelect(); - ~InstallDirSelect(); - - std::filesystem::path getSelectedDirectory() { - return selected_dir; - } - - bool useForAllQueued() { - return use_for_all_queued; - } - - bool deleteFileOnInstall() { - return delete_file_on_install; - } - -private: - QWidget* SetupInstallDirList(); - QWidget* SetupDialogActions(); - void setSelectedDirectory(QListWidgetItem* item); - void setDeleteFileOnInstall(bool enabled); - void setUseForAllQueued(bool enabled); - std::filesystem::path selected_dir; - bool delete_file_on_install = false; - bool use_for_all_queued = false; -}; diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index e92676c02..5d8f8e717 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -20,9 +20,7 @@ #include "common/string_util.h" #include "common/version.h" #include "control_settings.h" -#include "core/loader.h" #include "game_install_dialog.h" -#include "install_dir_select.h" #include "kbm_gui.h" #include "main_window.h" #include "settings_dialog.h" From 501f46e51518a70db4d394ebe0b1510f1e165179 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 28 Mar 2025 19:48:23 +0200 Subject: [PATCH 450/455] New Crowdin updates (#2695) * New translations en_us.ts (Albanian) * New translations en_us.ts (Polish) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Arabic) * New translations en_us.ts (Turkish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Russian) * New translations en_us.ts (Finnish) * New translations en_us.ts (Finnish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Arabic) --- src/qt_gui/translations/ar_SA.ts | 42 ++++++++- src/qt_gui/translations/da_DK.ts | 40 ++++++++ src/qt_gui/translations/de_DE.ts | 40 ++++++++ src/qt_gui/translations/el_GR.ts | 40 ++++++++ src/qt_gui/translations/es_ES.ts | 40 ++++++++ src/qt_gui/translations/fa_IR.ts | 40 ++++++++ src/qt_gui/translations/fi_FI.ts | 156 +++++++++++++++++++------------ src/qt_gui/translations/fr_FR.ts | 40 ++++++++ src/qt_gui/translations/hu_HU.ts | 40 ++++++++ src/qt_gui/translations/id_ID.ts | 40 ++++++++ src/qt_gui/translations/it_IT.ts | 46 ++++++++- src/qt_gui/translations/ja_JP.ts | 40 ++++++++ src/qt_gui/translations/ko_KR.ts | 40 ++++++++ src/qt_gui/translations/lt_LT.ts | 40 ++++++++ src/qt_gui/translations/nb_NO.ts | 40 ++++++++ src/qt_gui/translations/nl_NL.ts | 40 ++++++++ src/qt_gui/translations/pl_PL.ts | 40 ++++++++ src/qt_gui/translations/pt_BR.ts | 42 ++++++++- src/qt_gui/translations/pt_PT.ts | 40 ++++++++ src/qt_gui/translations/ro_RO.ts | 40 ++++++++ src/qt_gui/translations/ru_RU.ts | 40 ++++++++ src/qt_gui/translations/sq_AL.ts | 40 ++++++++ src/qt_gui/translations/sv_SE.ts | 40 ++++++++ src/qt_gui/translations/tr_TR.ts | 40 ++++++++ src/qt_gui/translations/uk_UA.ts | 40 ++++++++ src/qt_gui/translations/vi_VN.ts | 40 ++++++++ src/qt_gui/translations/zh_CN.ts | 40 ++++++++ src/qt_gui/translations/zh_TW.ts | 40 ++++++++ 28 files changed, 1183 insertions(+), 63 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index ac6920ea0..9808fdbe6 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -1149,7 +1149,7 @@ Deadzone Offset (def 0.50): - + Deadzone Offset (def 0.50): Speed Multiplier (def 1.0): @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + أبدأ اللعب + + + Pause + توقف مؤقت + + + Stop + إيقاف + + + Restart + إعادة تشغيل + + + Full Screen + وضع ملء الشاشة + + + Controllers + أذرعة التحكم + + + Keyboard + لوحة المفاتيح + + + Refresh List + تحديث القائمة + + + Resume + استئناف + + + Show Labels Under Icons + إظهار العلامات أسفل الأيقونات + PKGViewer diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 1835ba84c..1547a0e13 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 6717a93ef..c0e43065b 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 6e1adaac9..e6fa989aa 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 24844d0a2..288c445c3 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 6b7af042e..1b8813a80 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1514,6 +1514,46 @@ shadPS4 ShadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 324cb6c49..cd880fb23 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -407,206 +407,206 @@ ControlSettings Configure Controls - Configure Controls + Määritä Kontrollit D-Pad - D-Pad + D-Pad Up - Up + Ylös Left - Left + Vasen Right - Right + Oikea Down - Down + Alas Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Vasemman Analogin Deadzone (oletus:2 max:127) Left Deadzone - Left Deadzone + Vasen Deadzone Left Stick - Left Stick + Vasen Analogi Config Selection - Config Selection + Asetusten Valinta Common Config - Common Config + Yleinen Asetus Use per-game configs - Use per-game configs + Käytä pelikohtaisia asetuksia L1 / LB - L1 / LB + L1 / LB L2 / LT - L2 / LT + L2 / LT Back - Back + Back R1 / RB - R1 / RB + R1 / RB R2 / RT - R2 / RT + R2 / RT L3 - L3 + L3 Options / Start - Options / Start + Options / Start R3 - R3 + R3 Face Buttons - Face Buttons + Etunäppäimet Triangle / Y - Triangle / Y + Kolmio / Y Square / X - Square / X + Neliö / X Circle / B - Circle / B + Ympyrä / B Cross / A - Cross / A + Rasti / A Right Stick Deadzone (def:2, max:127) - Right Stick Deadzone (def:2, max:127) + Oikean Analogin Deadzone (oletus:2 max:127) Right Deadzone - Right Deadzone + Oikea Deadzone Right Stick - Right Stick + Oikea Analogi Color Adjustment - Color Adjustment + Värinhallinta R: - R: + R: G: - G: + G: B: - B: + B: Override Lightbar Color - Override Lightbar Color + Pakota Ohjaimen Valopalkin Väri Override Color - Override Color + Pakotettava Väri Unable to Save - Unable to Save + Tallentaminen Epäonnistui Cannot bind axis values more than once - Cannot bind axis values more than once + Akseliarvoja ei voi määrittää kertaa useammin Save - Save + Tallenna Apply - Apply + Ota Käyttöön Restore Defaults - Restore Defaults + Palauta Oletukset Cancel - Cancel + Peruuta EditorDialog Edit Keyboard + Mouse and Controller input bindings - Edit Keyboard + Mouse and Controller input bindings + Muokkaa Näppäimistön + Hiiren ja Ohjaimen näppäinasetuksia Use Per-Game configs - Use Per-Game configs + Käytä Pelikohtaisia Asetuksia Error - Error + Virhe Could not open the file for reading - Could not open the file for reading + Tiedostoa ei voitu avata luettavaksi Could not open the file for writing - Could not open the file for writing + Tiedostoa ei voitu avata kirjoitettavaksi Save Changes - Save Changes + Tallenna Muutokset Do you want to save changes? - Do you want to save changes? + Haluatko tallentaa muutokset? Help - Help + Tietoa Do you want to reset your custom default config to the original default config? - Do you want to reset your custom default config to the original default config? + Haluatko nollata oletusasetuksiin tekemäsi muutokset? Do you want to reset this config to your custom default config? - Do you want to reset this config to your custom default config? + Haluato palauttaa nämä asetukset takaisin määrittämiisi oletuksiin? Reset to Default @@ -1077,35 +1077,35 @@ L3 - L3 + L3 Touchpad Click - Touchpad Click + Kosketuslevyn Klikkaus Mouse to Joystick - Mouse to Joystick + Hiiri Joystickinä *press F7 ingame to activate - *press F7 ingame to activate + *paina F7 pelissä aktivoidaksesi R3 - R3 + R3 Options - Options + Options Mouse Movement Parameters - Mouse Movement Parameters + Hiiren Liikkeen Parametrit note: click Help Button/Special Keybindings for more information - note: click Help Button/Special Keybindings for more information + huomio: klikkaa apunappia/näppäintä saadaksesi lisää tietoa Face Buttons @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index ec3f9f8b5..1f7a726cd 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 6672337a6..8746058b3 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index e43d31976..5960715ae 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index e63da05b8..3e95e3df6 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -1308,11 +1308,11 @@ Trophy Viewer - Trophy Viewer + Visualizzatore Trofei No games found. Please add your games to your library first. - No games found. Please add your games to your library first. + Nessun gioco trovato. Aggiungi prima i tuoi giochi alla tua libreria. PKG Viewer @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer @@ -2201,7 +2241,7 @@ Select Game: - Select Game: + Seleziona Gioco: Progress diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 7cf9fc5c2..1aaa3fa7c 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index d5289ace9..9dd06028d 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 17133da35..6e98ddc45 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index e8ce99f90..6faff415e 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 5c1725bd5..376eea5ef 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 033412efa..a77b43e09 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index d44efce5d..ea82086f3 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -912,7 +912,7 @@ Are you sure you want to delete %1's %2 directory? - Tem certeza de que deseja excluir o diretório %2 de %1? + Tem certeza de que deseja excluir o diretório do %2 %1? Open Update Folder @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Jogar + + + Pause + Pausar + + + Stop + Parar + + + Restart + Reiniciar + + + Full Screen + Tela Cheia + + + Controllers + Controles + + + Keyboard + Teclado + + + Refresh List + Atualizar Lista + + + Resume + Continuar + + + Show Labels Under Icons + Mostrar Rótulos Sob Ícones + PKGViewer diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 455955fad..7ca3eebb5 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 9c7720e17..6e008ac20 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 68eaabc34..560c8c110 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Играть + + + Pause + Пауза + + + Stop + Остановить + + + Restart + Перезапустить + + + Full Screen + Полный экран + + + Controllers + Контроллеры + + + Keyboard + Клавиатура + + + Refresh List + Обновить список + + + Resume + Продолжить + + + Show Labels Under Icons + Показывать метки под значками + PKGViewer diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 657f78d0d..8a2c34c60 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index a002b150a..91b544e05 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 48ce4254d..4946874c9 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Başlat + + + Pause + Duraklat + + + Stop + Durdur + + + Restart + Yeniden Başlat + + + Full Screen + Tam Ekran + + + Controllers + Kontrolcüler + + + Keyboard + Klavye + + + Refresh List + Listeyi Yenile + + + Resume + Devam Et + + + Show Labels Under Icons + Simgelerin Altında Etiketleri Göster + PKGViewer diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 06c88428b..69e6c5fc7 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index c16604b85..14bd29896 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 6364ae1d6..7536b7d17 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + 开始游戏 + + + Pause + 暂停 + + + Stop + 关闭 + + + Restart + 重新启动 + + + Full Screen + 全屏 + + + Controllers + 控制器 + + + Keyboard + 键盘 + + + Refresh List + 刷新列表 + + + Resume + 继续游戏 + + + Show Labels Under Icons + 显示图标下的标签 + PKGViewer diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index fb42a43b0..f195ec1b7 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1514,6 +1514,46 @@ shadPS4 shadPS4 + + Play + Play + + + Pause + Pause + + + Stop + Stop + + + Restart + Restart + + + Full Screen + Full Screen + + + Controllers + Controllers + + + Keyboard + Keyboard + + + Refresh List + Refresh List + + + Resume + Resume + + + Show Labels Under Icons + Show Labels Under Icons + PKGViewer From 751a23af0f5a9612b8e28af1400896a3026ee331 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 28 Mar 2025 19:49:04 +0200 Subject: [PATCH 451/455] [ci skip] Qt GUI: Update Translation. (#2703) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 174 ------------------------------- 1 file changed, 174 deletions(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index d18609295..28d31b200 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - - - - Delete PKG File on Install - - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Only one file can be selected! - - PKG Extraction - PKG Extraction - - - Patch detected! - Patch detected! - - - PKG and Game versions match: - PKG and Game versions match: - - - Would you like to overwrite? - Would you like to overwrite? - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - Game is installed: - Game is installed: - - - Would you like to install Patch: - Would you like to install Patch: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - DLC already installed: - DLC already installed: - - - Game already installed - Game already installed - - - PKG ERROR - PKG ERROR - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - Extraction Finished - Extraction Finished - - - Game successfully installed at %1 - Game successfully installed at %1 - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found - - PKG File (*.PKG *.pkg) - - - - PKG is a patch or DLC, please install the game first! - - Game is already running! @@ -1555,73 +1448,6 @@ - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG ERROR - - - Name - Name - - - Serial - Serial - - - Installed - - - - Size - Size - - - Category - - - - Type - - - - App Ver - - - - FW - - - - Region - Region - - - Flags - - - - Path - Path - - - File - File - - - Unknown - Unknown - - - Package - - - SettingsDialog From 78c8bca2bb7a1da452ba67f4813b4d504b8b4e7b Mon Sep 17 00:00:00 2001 From: Ked <58560148+k3dr1@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:14:52 +0800 Subject: [PATCH 452/455] Fix support for unicode paths for game install directories (#2699) * Slightly changed how allInstallDirsDisabled is determined * Show a dialog only if no game directories are set * Changed a comment * Fixed formatting * Support for unicode paths for game install directories * Fixed game picture path conversion --- src/common/config.cpp | 2 +- src/qt_gui/game_list_frame.cpp | 3 ++- src/qt_gui/settings_dialog.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/common/config.cpp b/src/common/config.cpp index 8ead58686..d1bb89897 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -850,7 +850,7 @@ void load(const std::filesystem::path& path) { m_window_size_H = toml::find_or(gui, "mw_height", 0); const auto install_dir_array = - toml::find_or>(gui, "installDirs", {}); + toml::find_or>(gui, "installDirs", {}); try { install_dirs_enabled = toml::find>(gui, "installDirsEnabled"); diff --git a/src/qt_gui/game_list_frame.cpp b/src/qt_gui/game_list_frame.cpp index 4c0607571..170215f3d 100644 --- a/src/qt_gui/game_list_frame.cpp +++ b/src/qt_gui/game_list_frame.cpp @@ -185,7 +185,8 @@ void GameListFrame::SetListBackgroundImage(QTableWidgetItem* item) { // Recompute if opacity changed or we switched to a different game if (opacity != m_last_opacity || game.pic_path != m_current_game_path) { - QImage original_image(QString::fromStdString(game.pic_path.string())); + auto image_path = game.pic_path.u8string(); + QImage original_image(QString::fromStdString({image_path.begin(), image_path.end()})); if (!original_image.isNull()) { backgroundImage = m_game_list_utils.ChangeImageOpacity( original_image, original_image.rect(), opacity / 100.0f); diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index d789f6f48..383cad8fa 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -817,7 +817,7 @@ void SettingsDialog::ResetInstallFolders() { if (data.contains("GUI")) { const toml::value& gui = data.at("GUI"); const auto install_dir_array = - toml::find_or>(gui, "installDirs", {}); + toml::find_or>(gui, "installDirs", {}); std::vector install_dirs_enabled; try { From be7d646e8314ccf1f125818f3589b78d8e3262eb Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:32:06 -0700 Subject: [PATCH 453/455] externals: Remove need for cryptopp build. (#2707) --- .gitmodules | 8 - CMakeLists.txt | 4 +- externals/CMakeLists.txt | 16 +- externals/cryptopp | 1 - externals/cryptopp-cmake | 1 - src/common/aes.h | 1195 ++++++++++++++++++++++++++++++++++ src/common/sha1.h | 180 +++++ src/core/file_format/trp.cpp | 37 +- src/core/module.cpp | 11 +- 9 files changed, 1398 insertions(+), 55 deletions(-) delete mode 160000 externals/cryptopp delete mode 160000 externals/cryptopp-cmake create mode 100644 src/common/aes.h create mode 100644 src/common/sha1.h diff --git a/.gitmodules b/.gitmodules index ca229bedd..98fba2098 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,11 +1,3 @@ -[submodule "externals/cryptopp-cmake"] - path = externals/cryptopp-cmake - url = https://github.com/shadps4-emu/ext-cryptopp-cmake.git - shallow = true -[submodule "externals/cryptopp"] - path = externals/cryptopp - url = https://github.com/shadps4-emu/ext-cryptopp.git - shallow = true [submodule "externals/zlib-ng"] path = externals/zlib-ng url = https://github.com/shadps4-emu/ext-zlib-ng.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 13204f479..bd458f04e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -583,6 +583,7 @@ set(COMMON src/common/logging/backend.cpp src/common/logging/text_formatter.cpp src/common/logging/text_formatter.h src/common/logging/types.h + src/common/aes.h src/common/alignment.h src/common/arch.h src/common/assert.cpp @@ -614,6 +615,7 @@ set(COMMON src/common/logging/backend.cpp src/common/polyfill_thread.h src/common/rdtsc.cpp src/common/rdtsc.h + src/common/sha1.h src/common/signal_context.h src/common/signal_context.cpp src/common/singleton.h @@ -1022,7 +1024,7 @@ endif() create_target_directory_groups(shadps4) target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui gcn half::half ZLIB::ZLIB PNG::PNG) -target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers cryptopp::cryptopp) +target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 pugixml::pugixml stb::headers) target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h") target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 3b29a838e..d6bdda023 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -26,21 +26,7 @@ if (NOT TARGET fmt::fmt) add_subdirectory(fmt) endif() -# CryptoPP -if (NOT TARGET cryptopp::cryptopp) - set(CRYPTOPP_INSTALL OFF) - set(CRYPTOPP_BUILD_TESTING OFF) - set(CRYPTOPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cryptopp) - # cryptopp instruction set checks do not account for added compile options, - # so disable extensions in the library config to match our chosen target CPU. - set(CRYPTOPP_DISABLE_AESNI ON) - set(CRYPTOPP_DISABLE_AVX2 ON) - add_subdirectory(cryptopp-cmake) - file(COPY cryptopp DESTINATION cryptopp FILES_MATCHING PATTERN "*.h") - # remove externals/cryptopp from include directories because it contains a conflicting zlib.h file - set_target_properties(cryptopp PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/cryptopp") -endif() - +# FFmpeg if (NOT TARGET FFmpeg::ffmpeg) add_subdirectory(ffmpeg-core) add_library(FFmpeg::ffmpeg ALIAS ffmpeg) diff --git a/externals/cryptopp b/externals/cryptopp deleted file mode 160000 index effed0d0b..000000000 --- a/externals/cryptopp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit effed0d0b865afc23ed67e0916f83734e4b9b3b7 diff --git a/externals/cryptopp-cmake b/externals/cryptopp-cmake deleted file mode 160000 index 2c384c282..000000000 --- a/externals/cryptopp-cmake +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2c384c28265a93358a2455e610e76393358794df diff --git a/src/common/aes.h b/src/common/aes.h new file mode 100644 index 000000000..5ca0096bd --- /dev/null +++ b/src/common/aes.h @@ -0,0 +1,1195 @@ +// SPDX-FileCopyrightText: 2015 kkAyataka +// SPDX-License-Identifier: BSL-1.0 + +#pragma once + +#include +#include +#include +#include +#include +#include + +/** AES cipher APIs */ +namespace aes { +namespace detail { + +const int kWordSize = 4; +typedef unsigned int Word; + +const int kBlockSize = 4; +/** @private */ +struct State { + Word w[4]; + Word& operator[](const int index) { + return w[index]; + } + const Word& operator[](const int index) const { + return w[index]; + } +}; + +const int kStateSize = 16; // Word * BlockSize +typedef State RoundKey; +typedef std::vector RoundKeys; + +inline void add_round_key(const RoundKey& key, State& state) { + for (int i = 0; i < kBlockSize; ++i) { + state[i] ^= key[i]; + } +} + +const unsigned char kSbox[] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16}; + +const unsigned char kInvSbox[] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d}; + +inline Word sub_word(const Word w) { + return kSbox[(w >> 0) & 0xFF] << 0 | kSbox[(w >> 8) & 0xFF] << 8 | + kSbox[(w >> 16) & 0xFF] << 16 | kSbox[(w >> 24) & 0xFF] << 24; +} + +inline Word inv_sub_word(const Word w) { + return kInvSbox[(w >> 0) & 0xFF] << 0 | kInvSbox[(w >> 8) & 0xFF] << 8 | + kInvSbox[(w >> 16) & 0xFF] << 16 | kInvSbox[(w >> 24) & 0xFF] << 24; +} + +inline void sub_bytes(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + state[i] = sub_word(state[i]); + } +} + +inline void inv_sub_bytes(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + state[i] = inv_sub_word(state[i]); + } +} + +inline void shift_rows(State& state) { + const State ori = {state[0], state[1], state[2], state[3]}; + for (int r = 1; r < kWordSize; ++r) { + const Word m2 = 0xFF << (r * 8); + const Word m1 = ~m2; + for (int c = 0; c < kBlockSize; ++c) { + state[c] = (state[c] & m1) | (ori[(c + r) % kBlockSize] & m2); + } + } +} + +inline void inv_shift_rows(State& state) { + const State ori = {state[0], state[1], state[2], state[3]}; + for (int r = 1; r < kWordSize; ++r) { + const Word m2 = 0xFF << (r * 8); + const Word m1 = ~m2; + for (int c = 0; c < kBlockSize; ++c) { + state[c] = (state[c] & m1) | (ori[(c + kBlockSize - r) % kWordSize] & m2); + } + } +} + +inline unsigned char mul2(const unsigned char b) { + unsigned char m2 = b << 1; + if (b & 0x80) { + m2 ^= 0x011B; + } + + return m2; +} + +inline unsigned char mul(const unsigned char b, const unsigned char m) { + unsigned char v = 0; + unsigned char t = b; + for (int i = 0; i < 8; ++i) { // 8-bits + if ((m >> i) & 0x01) { + v ^= t; + } + + t = mul2(t); + } + + return v; +} + +inline void mix_columns(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + const unsigned char v0_1 = (state[i] >> 0) & 0xFF; + const unsigned char v1_1 = (state[i] >> 8) & 0xFF; + const unsigned char v2_1 = (state[i] >> 16) & 0xFF; + const unsigned char v3_1 = (state[i] >> 24) & 0xFF; + + const unsigned char v0_2 = mul2(v0_1); + const unsigned char v1_2 = mul2(v1_1); + const unsigned char v2_2 = mul2(v2_1); + const unsigned char v3_2 = mul2(v3_1); + + const unsigned char v0_3 = v0_2 ^ v0_1; + const unsigned char v1_3 = v1_2 ^ v1_1; + const unsigned char v2_3 = v2_2 ^ v2_1; + const unsigned char v3_3 = v3_2 ^ v3_1; + + state[i] = (v0_2 ^ v1_3 ^ v2_1 ^ v3_1) << 0 | (v0_1 ^ v1_2 ^ v2_3 ^ v3_1) << 8 | + (v0_1 ^ v1_1 ^ v2_2 ^ v3_3) << 16 | (v0_3 ^ v1_1 ^ v2_1 ^ v3_2) << 24; + } +} + +inline void inv_mix_columns(State& state) { + for (int i = 0; i < kBlockSize; ++i) { + const unsigned char v0 = (state[i] >> 0) & 0xFF; + const unsigned char v1 = (state[i] >> 8) & 0xFF; + const unsigned char v2 = (state[i] >> 16) & 0xFF; + const unsigned char v3 = (state[i] >> 24) & 0xFF; + + state[i] = (mul(v0, 0x0E) ^ mul(v1, 0x0B) ^ mul(v2, 0x0D) ^ mul(v3, 0x09)) << 0 | + (mul(v0, 0x09) ^ mul(v1, 0x0E) ^ mul(v2, 0x0B) ^ mul(v3, 0x0D)) << 8 | + (mul(v0, 0x0D) ^ mul(v1, 0x09) ^ mul(v2, 0x0E) ^ mul(v3, 0x0B)) << 16 | + (mul(v0, 0x0B) ^ mul(v1, 0x0D) ^ mul(v2, 0x09) ^ mul(v3, 0x0E)) << 24; + } +} + +inline Word rot_word(const Word v) { + return ((v >> 8) & 0x00FFFFFF) | ((v & 0xFF) << 24); +} + +/** + * @private + * @throws std::invalid_argument + */ +inline unsigned int get_round_count(const int key_size) { + switch (key_size) { + case 16: + return 10; + case 24: + return 12; + case 32: + return 14; + default: + throw std::invalid_argument("Invalid key size"); + } +} + +/** + * @private + * @throws std::invalid_argument + */ +inline RoundKeys expand_key(const unsigned char* key, const int key_size) { + if (key_size != 16 && key_size != 24 && key_size != 32) { + throw std::invalid_argument("Invalid key size"); + } + + const Word rcon[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36}; + + const int nb = kBlockSize; + const int nk = key_size / nb; + const int nr = get_round_count(key_size); + + std::vector w(nb * (nr + 1)); + for (int i = 0; i < nk; ++i) { + memcpy(&w[i], key + (i * kWordSize), kWordSize); + } + + for (int i = nk; i < nb * (nr + 1); ++i) { + Word t = w[i - 1]; + if (i % nk == 0) { + t = sub_word(rot_word(t)) ^ rcon[i / nk]; + } else if (nk > 6 && i % nk == 4) { + t = sub_word(t); + } + + w[i] = t ^ w[i - nk]; + } + + RoundKeys keys(nr + 1); + memcpy(&keys[0], &w[0], w.size() * kWordSize); + + return keys; +} + +inline void copy_bytes_to_state(const unsigned char data[16], State& state) { + memcpy(&state[0], data + 0, kWordSize); + memcpy(&state[1], data + 4, kWordSize); + memcpy(&state[2], data + 8, kWordSize); + memcpy(&state[3], data + 12, kWordSize); +} + +inline void copy_state_to_bytes(const State& state, unsigned char buf[16]) { + memcpy(buf + 0, &state[0], kWordSize); + memcpy(buf + 4, &state[1], kWordSize); + memcpy(buf + 8, &state[2], kWordSize); + memcpy(buf + 12, &state[3], kWordSize); +} + +inline void xor_data(unsigned char data[kStateSize], const unsigned char v[kStateSize]) { + for (int i = 0; i < kStateSize; ++i) { + data[i] ^= v[i]; + } +} + +/** increment counter (128-bit int) by 1 */ +inline void incr_counter(unsigned char counter[kStateSize]) { + unsigned n = kStateSize, c = 1; + do { + --n; + c += counter[n]; + counter[n] = c; + c >>= 8; + } while (n); +} + +inline void encrypt_state(const RoundKeys& rkeys, const unsigned char data[16], + unsigned char encrypted[16]) { + State s; + copy_bytes_to_state(data, s); + + add_round_key(rkeys[0], s); + + for (unsigned int i = 1; i < rkeys.size() - 1; ++i) { + sub_bytes(s); + shift_rows(s); + mix_columns(s); + add_round_key(rkeys[i], s); + } + + sub_bytes(s); + shift_rows(s); + add_round_key(rkeys.back(), s); + + copy_state_to_bytes(s, encrypted); +} + +inline void decrypt_state(const RoundKeys& rkeys, const unsigned char data[16], + unsigned char decrypted[16]) { + State s; + copy_bytes_to_state(data, s); + + add_round_key(rkeys.back(), s); + inv_shift_rows(s); + inv_sub_bytes(s); + + for (std::size_t i = rkeys.size() - 2; i > 0; --i) { + add_round_key(rkeys[i], s); + inv_mix_columns(s); + inv_shift_rows(s); + inv_sub_bytes(s); + } + + add_round_key(rkeys[0], s); + + copy_state_to_bytes(s, decrypted); +} + +template +std::vector key_from_string(const char (*key_str)[KeyLen]) { + std::vector key(KeyLen - 1); + memcpy(&key[0], *key_str, KeyLen - 1); + return key; +} + +inline bool is_valid_key_size(const std::size_t key_size) { + if (key_size != 16 && key_size != 24 && key_size != 32) { + return false; + } else { + return true; + } +} + +namespace gcm { + +const int kBlockBitSize = 128; +const int kBlockByteSize = kBlockBitSize / 8; + +/** + * @private + * GCM operation unit as bit. + * This library handles 128 bit little endian bit array. + * e.g. 0^127 || 1 == "000...0001" (bit string) == 1 + */ +typedef std::bitset bitset128; + +/** + * @private + * GCM operation unit. + * Little endian byte array + * + * If bitset128 is 1: 0^127 || 1 == "000...0001" (bit string) == 1 + * byte array is 0x00, 0x00, 0x00 ... 0x01 (low -> high). + * Byte array is NOT 0x01, 0x00 ... 0x00. + * + * This library handles GCM bit string in two ways. + * One is an array of bitset, which is a little endian 128-bit array's array. + * + * <- first byte + * bitset128 || bitset128 || bitset128... + * + * The other one is a byte array. + * <- first byte + * byte || byte || byte... + */ +class Block { +public: + Block() { + init_v(0, 0); + } + + Block(const unsigned char* bytes, const unsigned long bytes_size) { + init_v(bytes, bytes_size); + } + + Block(const std::vector& bytes) { + init_v(&bytes[0], bytes.size()); + } + + Block(const std::bitset<128>& bits); // implementation below + + inline unsigned char* data() { + return v_; + } + + inline const unsigned char* data() const { + return v_; + } + + inline std::bitset<128> to_bits() const { + std::bitset<128> bits; + for (int i = 0; i < 16; ++i) { + bits <<= 8; + bits |= v_[i]; + } + + return bits; + } + + inline Block operator^(const Block& b) const { + Block r; + for (int i = 0; i < 16; ++i) { + r.data()[i] = data()[i] ^ b.data()[i]; + } + return r; + } + +private: + unsigned char v_[16]; + + inline void init_v(const unsigned char* bytes, const std::size_t bytes_size) { + memset(v_, 0, sizeof(v_)); + + const std::size_t cs = (std::min)(bytes_size, static_cast(16)); + for (std::size_t i = 0; i < cs; ++i) { + v_[i] = bytes[i]; + } + } +}; + +// Workaround for clang optimization in 32-bit build via Visual Studio producing incorrect results +// (https://github.com/kkAyataka/plusaes/issues/43) +#if defined(__clang__) && defined(_WIN32) && !defined(_WIN64) +#pragma optimize("", off) +#endif +inline Block::Block(const std::bitset<128>& bits) { + init_v(0, 0); + const std::bitset<128> mask(0xFF); // 1 byte mask + for (std::size_t i = 0; i < 16; ++i) { + v_[15 - i] = static_cast(((bits >> (i * 8)) & mask).to_ulong()); + } +} +#if defined(__clang__) && defined(_WIN32) && !defined(_WIN64) +#pragma optimize("", on) +#endif + +template +unsigned long ceil(const T v) { + return static_cast(std::ceil(v) + 0.5); +} + +template +std::bitset operator||(const std::bitset& v1, const std::bitset& v2) { + std::bitset ret(v1.to_string() + v2.to_string()); + return ret; +} + +template +std::bitset lsb(const std::bitset& X) { + std::bitset r; + for (std::size_t i = 0; i < S; ++i) { + r[i] = X[i]; + } + return r; +} + +template +std::bitset msb(const std::bitset& X) { + std::bitset r; + for (std::size_t i = 0; i < S; ++i) { + r[S - 1 - i] = X[X.size() - 1 - i]; + } + return r; +} + +template +std::bitset inc32(const std::bitset X) { + const std::size_t S = 32; + + const auto a = msb(X); + const std::bitset b( + (lsb(X).to_ulong() + 1)); // % (2^32); + // lsb<32> is low 32-bit value + // Spec.'s "mod 2^S" is not necessary when S is 32 (inc32). + // ...and 2^32 is over 32-bit integer. + + return a || b; +} + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wself-assign" +#endif // __clang__ + +/** Algorithm 1 @private */ +inline Block mul_blocks(const Block X, const Block Y) { + const bitset128 R = (std::bitset<8>("11100001") || std::bitset<120>()); + + bitset128 X_bits = X.to_bits(); + bitset128 Z; + bitset128 V = Y.to_bits(); + for (int i = 127; i >= 0; --i) { + // Z + if (X_bits[i] == false) { + Z = Z; + } else { + Z = Z ^ V; + } + + // V + if (V[0] == false) { + V = V >> 1; + } else { + V = (V >> 1) ^ R; + } + } + + return Z; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif // __clang__ + +/** Algorithm 2 @private */ +inline Block ghash(const Block& H, const std::vector& X) { + const std::size_t m = X.size() / kBlockByteSize; + Block Ym; + for (std::size_t i = 0; i < m; ++i) { + const Block Xi(&X[i * kBlockByteSize], kBlockByteSize); + Ym = mul_blocks((Ym ^ Xi), H); + } + + return Ym; +} + +template +std::bitset make_bitset(const unsigned char* bytes, const std::size_t bytes_size) { + std::bitset bits; + for (auto i = 0u; i < bytes_size; ++i) { + bits <<= 8; + bits |= bytes[i]; + } + return bits; +} + +/** Algorithm 3 @private */ +inline std::vector gctr(const detail::RoundKeys& rkeys, const Block& ICB, + const unsigned char* X, const std::size_t X_size) { + if (!X || X_size == 0) { + return std::vector(); + } else { + const unsigned long n = ceil(X_size * 8.0 / kBlockBitSize); + std::vector Y(X_size); + + Block CB; + for (std::size_t i = 0; i < n; ++i) { + // CB + if (i == 0) { // first + CB = ICB; + } else { + CB = inc32(CB.to_bits()); + } + + // CIPH + Block eCB; + encrypt_state(rkeys, CB.data(), eCB.data()); + + // Y + int op_size = 0; + if (i < n - 1) { + op_size = kBlockByteSize; + } else { // last + op_size = (X_size % kBlockByteSize) ? (X_size % kBlockByteSize) : kBlockByteSize; + } + const Block Yi = Block(X + i * kBlockBitSize / 8, op_size) ^ eCB; + memcpy(&Y[i * kBlockByteSize], Yi.data(), op_size); + } + + return Y; + } +} + +inline void push_back(std::vector& bytes, const unsigned char* data, + const std::size_t data_size) { + bytes.insert(bytes.end(), data, data + data_size); +} + +inline void push_back(std::vector& bytes, const std::bitset<64>& bits) { + const std::bitset<64> mask(0xFF); // 1 byte mask + for (std::size_t i = 0; i < 8; ++i) { + bytes.push_back(static_cast(((bits >> ((7 - i) * 8)) & mask).to_ulong())); + } +} + +inline void push_back_zero_bits(std::vector& bytes, + const std::size_t zero_bits_size) { + const std::vector zero_bytes(zero_bits_size / 8); + bytes.insert(bytes.end(), zero_bytes.begin(), zero_bytes.end()); +} + +inline Block calc_H(const RoundKeys& rkeys) { + std::vector H_raw(gcm::kBlockByteSize); + encrypt_state(rkeys, &H_raw[0], &H_raw[0]); + return gcm::Block(H_raw); +} + +inline Block calc_J0(const Block& H, const unsigned char* iv, const std::size_t iv_size) { + if (iv_size == 12) { + const std::bitset<96> iv_bits = gcm::make_bitset<96>(iv, iv_size); + return iv_bits || std::bitset<31>() || std::bitset<1>(1); + } else { + const auto len_iv = iv_size * 8; + const auto s = 128 * gcm::ceil(len_iv / 128.0) - len_iv; + std::vector ghash_in; + gcm::push_back(ghash_in, iv, iv_size); + gcm::push_back_zero_bits(ghash_in, s + 64); + gcm::push_back(ghash_in, std::bitset<64>(len_iv)); + + return gcm::ghash(H, ghash_in); + } +} + +inline void calc_gcm_tag(const unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char* iv, const std::size_t iv_size, unsigned char* tag, + const std::size_t tag_size) { + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + const gcm::Block H = gcm::calc_H(rkeys); + const gcm::Block J0 = gcm::calc_J0(H, iv, iv_size); + + const auto lenC = data_size * 8; + const auto lenA = aadata_size * 8; + const std::size_t u = 128 * gcm::ceil(lenC / 128.0) - lenC; + const std::size_t v = 128 * gcm::ceil(lenA / 128.0) - lenA; + + std::vector ghash_in; + ghash_in.reserve((aadata_size + v / 8) + (data_size + u / 8) + 8 + 8); + gcm::push_back(ghash_in, aadata, aadata_size); + gcm::push_back_zero_bits(ghash_in, v); + gcm::push_back(ghash_in, data, data_size); + gcm::push_back_zero_bits(ghash_in, u); + gcm::push_back(ghash_in, std::bitset<64>(lenA)); + gcm::push_back(ghash_in, std::bitset<64>(lenC)); + const gcm::Block S = gcm::ghash(H, ghash_in); + const std::vector T = gcm::gctr(rkeys, J0, S.data(), gcm::kBlockByteSize); + + // return + memcpy(tag, &T[0], (std::min)(tag_size, static_cast(16))); +} + +/** Algorithm 4 and 5 @private */ +inline void crypt_gcm(const unsigned char* data, const std::size_t data_size, + const unsigned char* key, const std::size_t key_size, const unsigned char* iv, + const std::size_t iv_size, unsigned char* crypted) { + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + const gcm::Block H = gcm::calc_H(rkeys); + const gcm::Block J0 = gcm::calc_J0(H, iv, iv_size); + + const std::vector C = + gcm::gctr(rkeys, gcm::inc32(J0.to_bits()), data, data_size); + + if (crypted) { + memcpy(crypted, &C[0], data_size); + } +} + +} // namespace gcm + +} // namespace detail + +/** @defgroup Base Base + * Base definitions and convenient functions + * @{ */ + +/** Create 128-bit key from string. */ +inline std::vector key_from_string(const char (*key_str)[17]) { + return detail::key_from_string<17>(key_str); +} + +/** Create 192-bit key from string. */ +inline std::vector key_from_string(const char (*key_str)[25]) { + return detail::key_from_string<25>(key_str); +} + +/** Create 256-bit key from string. */ +inline std::vector key_from_string(const char (*key_str)[33]) { + return detail::key_from_string<33>(key_str); +} + +/** Calculates encrypted data size when padding is enabled. */ +inline unsigned long get_padded_encrypted_size(const unsigned long data_size) { + return data_size + detail::kStateSize - (data_size % detail::kStateSize); +} + +/** Error code */ +typedef enum { + kErrorOk = 0, + kErrorInvalidDataSize = 1, + kErrorInvalidKeySize, + kErrorInvalidBufferSize, + kErrorInvalidKey, + kErrorDeprecated, // kErrorInvalidNonceSize + kErrorInvalidIvSize, + kErrorInvalidTagSize, + kErrorInvalidTag +} Error; + +/** @} */ + +namespace detail { + +inline Error check_encrypt_cond(const unsigned long data_size, const unsigned long key_size, + const unsigned long encrypted_size, const bool pads) { + // check data size + if (!pads && (data_size % kStateSize != 0)) { + return kErrorInvalidDataSize; + } + + // check key size + if (!detail::is_valid_key_size(key_size)) { + return kErrorInvalidKeySize; + } + + // check encrypted buffer size + if (pads) { + const unsigned long required_size = get_padded_encrypted_size(data_size); + if (encrypted_size < required_size) { + return kErrorInvalidBufferSize; + } + } else { + if (encrypted_size < data_size) { + return kErrorInvalidBufferSize; + } + } + return kErrorOk; +} + +inline Error check_decrypt_cond(const unsigned long data_size, const unsigned long key_size, + const unsigned long decrypted_size, + const unsigned long* padded_size) { + // check data size + if (data_size % 16 != 0) { + return kErrorInvalidDataSize; + } + + // check key size + if (!detail::is_valid_key_size(key_size)) { + return kErrorInvalidKeySize; + } + + // check decrypted buffer size + if (!padded_size) { + if (decrypted_size < data_size) { + return kErrorInvalidBufferSize; + } + } else { + if (decrypted_size < (data_size - kStateSize)) { + return kErrorInvalidBufferSize; + } + } + + return kErrorOk; +} + +inline bool check_padding(const unsigned long padding, const unsigned char data[kStateSize]) { + if (padding > kStateSize) { + return false; + } + + for (unsigned long i = 0; i < padding; ++i) { + if (data[kStateSize - 1 - i] != padding) { + return false; + } + } + + return true; +} + +inline Error check_gcm_cond(const std::size_t key_size, const std::size_t iv_size, + const std::size_t tag_size) { + // check key size + if (!detail::is_valid_key_size(key_size)) { + return kErrorInvalidKeySize; + } + + if (iv_size < 1) { + return kErrorInvalidIvSize; + } + + // check tag size + if ((tag_size < 12 || 16 < tag_size) && (tag_size != 8) && (tag_size != 4)) { + return kErrorInvalidTagSize; + } + + return kErrorOk; +} + +} // namespace detail + +/** @defgroup ECB ECB + * ECB mode functions + * @{ */ + +/** + * Encrypts data with ECB mode. + * @param [in] data Data. + * @param [in] data_size Data size. + * If the pads is false, data size must be multiple of 16. + * @param [in] key key bytes. The key length must be 16 (128-bit), 24 (192-bit) or 32 (256-bit). + * @param [in] key_size key size. + * @param [out] encrypted Encrypted data buffer. + * @param [in] encrypted_size Encrypted data buffer size. + * @param [in] pads If this value is true, encrypted data is padded by PKCS. + * Encrypted data size must be multiple of 16. + * If the pads is true, encrypted data is padded with PKCS. + * So the data is multiple of 16, encrypted data size needs additonal 16 bytes. + * @since 1.0.0 + */ +inline Error encrypt_ecb(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + unsigned char* encrypted, const unsigned long encrypted_size, + const bool pads) { + const Error e = detail::check_encrypt_cond(data_size, key_size, encrypted_size, pads); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + const unsigned long bc = data_size / detail::kStateSize; + for (unsigned long i = 0; i < bc; ++i) { + detail::encrypt_state(rkeys, data + (i * detail::kStateSize), + encrypted + (i * detail::kStateSize)); + } + + if (pads) { + const int rem = data_size % detail::kStateSize; + const char pad_v = detail::kStateSize - rem; + + std::vector ib(detail::kStateSize, pad_v), ob(detail::kStateSize); + memcpy(&ib[0], data + data_size - rem, rem); + + detail::encrypt_state(rkeys, &ib[0], &ob[0]); + memcpy(encrypted + (data_size - rem), &ob[0], detail::kStateSize); + } + + return kErrorOk; +} + +/** + * Decrypts data with ECB mode. + * @param [in] data Data bytes. + * @param [in] data_size Data size. + * @param [in] key Key bytes. + * @param [in] key_size Key size. + * @param [out] decrypted Decrypted data buffer. + * @param [in] decrypted_size Decrypted data buffer size. + * @param [out] padded_size If this value is NULL, this function does not remove padding. + * If this value is not NULL, this function removes padding by PKCS + * and returns padded size using padded_size. + * @since 1.0.0 + */ +inline Error decrypt_ecb(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + unsigned char* decrypted, const unsigned long decrypted_size, + unsigned long* padded_size) { + const Error e = detail::check_decrypt_cond(data_size, key_size, decrypted_size, padded_size); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + const unsigned long bc = data_size / detail::kStateSize - 1; + for (unsigned long i = 0; i < bc; ++i) { + detail::decrypt_state(rkeys, data + (i * detail::kStateSize), + decrypted + (i * detail::kStateSize)); + } + + unsigned char last[detail::kStateSize] = {}; + detail::decrypt_state(rkeys, data + (bc * detail::kStateSize), last); + + if (padded_size) { + *padded_size = last[detail::kStateSize - 1]; + const unsigned long cs = detail::kStateSize - *padded_size; + + if (!detail::check_padding(*padded_size, last)) { + return kErrorInvalidKey; + } else if (decrypted_size >= (bc * detail::kStateSize) + cs) { + memcpy(decrypted + (bc * detail::kStateSize), last, cs); + } else { + return kErrorInvalidBufferSize; + } + } else { + memcpy(decrypted + (bc * detail::kStateSize), last, sizeof(last)); + } + + return kErrorOk; +} + +/** @} */ + +/** @defgroup CBC CBC + * CBC mode functions + * @{ */ + +/** + * Encrypt data with CBC mode. + * @param [in] data Data. + * @param [in] data_size Data size. + * If the pads is false, data size must be multiple of 16. + * @param [in] key key bytes. The key length must be 16 (128-bit), 24 (192-bit) or 32 (256-bit). + * @param [in] key_size key size. + * @param [in] iv Initialize vector. + * @param [out] encrypted Encrypted data buffer. + * @param [in] encrypted_size Encrypted data buffer size. + * @param [in] pads If this value is true, encrypted data is padded by PKCS. + * Encrypted data size must be multiple of 16. + * If the pads is true, encrypted data is padded with PKCS. + * So the data is multiple of 16, encrypted data size needs additonal 16 bytes. + * @since 1.0.0 + */ +inline Error encrypt_cbc(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + const unsigned char iv[16], unsigned char* encrypted, + const unsigned long encrypted_size, const bool pads) { + const Error e = detail::check_encrypt_cond(data_size, key_size, encrypted_size, pads); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + unsigned char s[detail::kStateSize] = {}; // encrypting data + + // calculate padding value + const bool ge16 = (data_size >= detail::kStateSize); + const int rem = data_size % detail::kStateSize; + const unsigned char pad_v = detail::kStateSize - rem; + + // encrypt 1st state + if (ge16) { + memcpy(s, data, detail::kStateSize); + } else { + memset(s, pad_v, detail::kStateSize); + memcpy(s, data, data_size); + } + if (iv) { + detail::xor_data(s, iv); + } + detail::encrypt_state(rkeys, s, encrypted); + + // encrypt mid + const unsigned long bc = data_size / detail::kStateSize; + for (unsigned long i = 1; i < bc; ++i) { + const long offset = i * detail::kStateSize; + memcpy(s, data + offset, detail::kStateSize); + detail::xor_data(s, encrypted + offset - detail::kStateSize); + + detail::encrypt_state(rkeys, s, encrypted + offset); + } + + // enctypt last + if (pads && ge16) { + std::vector ib(detail::kStateSize, pad_v), ob(detail::kStateSize); + memcpy(&ib[0], data + data_size - rem, rem); + + detail::xor_data(&ib[0], encrypted + (bc - 1) * detail::kStateSize); + + detail::encrypt_state(rkeys, &ib[0], &ob[0]); + memcpy(encrypted + (data_size - rem), &ob[0], detail::kStateSize); + } + + return kErrorOk; +} + +/** + * Decrypt data with CBC mode. + * @param [in] data Data bytes. + * @param [in] data_size Data size. + * @param [in] key Key bytes. + * @param [in] key_size Key size. + * @param [in] iv Initialize vector. + * @param [out] decrypted Decrypted data buffer. + * @param [in] decrypted_size Decrypted data buffer size. + * @param [out] padded_size If this value is NULL, this function does not remove padding. + * If this value is not NULL, this function removes padding by PKCS + * and returns padded size using padded_size. + * @since 1.0.0 + */ +inline Error decrypt_cbc(const unsigned char* data, const unsigned long data_size, + const unsigned char* key, const unsigned long key_size, + const unsigned char iv[16], unsigned char* decrypted, + const unsigned long decrypted_size, unsigned long* padded_size) { + const Error e = detail::check_decrypt_cond(data_size, key_size, decrypted_size, padded_size); + if (e != kErrorOk) { + return e; + } + + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + // decrypt 1st state + detail::decrypt_state(rkeys, data, decrypted); + if (iv) { + detail::xor_data(decrypted, iv); + } + + // decrypt mid + const unsigned long bc = data_size / detail::kStateSize - 1; + for (unsigned long i = 1; i < bc; ++i) { + const long offset = i * detail::kStateSize; + detail::decrypt_state(rkeys, data + offset, decrypted + offset); + detail::xor_data(decrypted + offset, data + offset - detail::kStateSize); + } + + // decrypt last + unsigned char last[detail::kStateSize] = {}; + if (data_size > detail::kStateSize) { + detail::decrypt_state(rkeys, data + (bc * detail::kStateSize), last); + detail::xor_data(last, data + (bc * detail::kStateSize - detail::kStateSize)); + } else { + memcpy(last, decrypted, data_size); + memset(decrypted, 0, decrypted_size); + } + + if (padded_size) { + *padded_size = last[detail::kStateSize - 1]; + const unsigned long cs = detail::kStateSize - *padded_size; + + if (!detail::check_padding(*padded_size, last)) { + return kErrorInvalidKey; + } else if (decrypted_size >= (bc * detail::kStateSize) + cs) { + memcpy(decrypted + (bc * detail::kStateSize), last, cs); + } else { + return kErrorInvalidBufferSize; + } + } else { + memcpy(decrypted + (bc * detail::kStateSize), last, sizeof(last)); + } + + return kErrorOk; +} + +/** @} */ + +/** @defgroup GCM GCM + * GCM mode functions + * @{ */ + +/** + * Encrypts data with GCM mode and gets an authentication tag. + * + * You can specify iv size and tag size. + * But usually you should use the other overloaded function whose iv and tag size is fixed. + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @returns kErrorInvalidIvSize + * @returns kErrorInvalidTagSize + */ +inline Error encrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char* iv, const std::size_t iv_size, unsigned char* tag, + const std::size_t tag_size) { + const Error err = detail::check_gcm_cond(key_size, iv_size, tag_size); + if (err != kErrorOk) { + return err; + } + + detail::gcm::crypt_gcm(data, data_size, key, key_size, iv, iv_size, data); + detail::gcm::calc_gcm_tag(data, data_size, aadata, aadata_size, key, key_size, iv, iv_size, tag, + tag_size); + + return kErrorOk; +} + +/** + * Encrypts data with GCM mode and gets an authentication tag. + * + * @param [in,out] data Input data and output buffer. + * This buffer is replaced with encrypted data. + * @param [in] data_size data size + * @param [in] aadata Additional Authenticated data + * @param [in] aadata_size aadata size + * @param [in] key Cipher key + * @param [in] key_size Cipher key size. This value must be 16 (128-bit), 24 (192-bit), or 32 + * (256-bit). + * @param [in] iv Initialization vector + * @param [out] tag Calculated authentication tag data + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + */ +inline Error encrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char (*iv)[12], unsigned char (*tag)[16]) { + return encrypt_gcm(data, data_size, aadata, aadata_size, key, key_size, *iv, 12, *tag, 16); +} + +/** + * Decrypts data with GCM mode and checks an authentication tag. + * + * You can specify iv size and tag size. + * But usually you should use the other overloaded function whose iv and tag size is fixed. + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @returns kErrorInvalidIvSize + * @returns kErrorInvalidTagSize + * @returns kErrorInvalidTag + */ +inline Error decrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char* iv, const std::size_t iv_size, + const unsigned char* tag, const std::size_t tag_size) { + const Error err = detail::check_gcm_cond(key_size, iv_size, tag_size); + if (err != kErrorOk) { + return err; + } + + unsigned char* C = data; + const auto C_size = data_size; + unsigned char tagd[16] = {}; + detail::gcm::calc_gcm_tag(C, C_size, aadata, aadata_size, key, key_size, iv, iv_size, tagd, 16); + + if (memcmp(tag, tagd, tag_size) != 0) { + return kErrorInvalidTag; + } else { + detail::gcm::crypt_gcm(C, C_size, key, key_size, iv, iv_size, C); + + return kErrorOk; + } +} + +/** + * Decrypts data with GCM mode and checks an authentication tag. + * + * @param [in,out] data Input data and output buffer. + * This buffer is replaced with decrypted data. + * @param [in] data_size data size + * @param [in] aadata Additional Authenticated data + * @param [in] aadata_size aadata size + * @param [in] key Cipher key + * @param [in] key_size Cipher key size. This value must be 16 (128-bit), 24 (192-bit), or 32 + * (256-bit). + * @param [in] iv Initialization vector + * @param [in] tag Authentication tag data + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @returns kErrorInvalidTag + */ +inline Error decrypt_gcm(unsigned char* data, const std::size_t data_size, + const unsigned char* aadata, const std::size_t aadata_size, + const unsigned char* key, const std::size_t key_size, + const unsigned char (*iv)[12], const unsigned char (*tag)[16]) { + return decrypt_gcm(data, data_size, aadata, aadata_size, key, key_size, *iv, 12, *tag, 16); +} + +/** @} */ + +/** @defgroup CTR CTR + * CTR mode function + * @{ */ + +/** + * Encrypts or decrypt data in-place with CTR mode. + * + * @param [in,out] data Input data and output buffer. + * This buffer is replaced with encrypted / decrypted data. + * @param [in] data_size Data size. + * @param [in] key Cipher key + * @param [in] key_size Cipher key size. This value must be 16 (128-bit), 24 (192-bit), or 32 + * (256-bit). + * @param [in] nonce Nonce of the counter initialization. + * + * @returns kErrorOk + * @returns kErrorInvalidKeySize + * @since 1.0.0 + */ +inline Error crypt_ctr(unsigned char* data, const std::size_t data_size, const unsigned char* key, + const std::size_t key_size, const unsigned char (*nonce)[16]) { + if (!detail::is_valid_key_size(key_size)) + return kErrorInvalidKeySize; + const detail::RoundKeys rkeys = detail::expand_key(key, static_cast(key_size)); + + unsigned long pos = 0; + unsigned long blkpos = detail::kStateSize; + unsigned char blk[detail::kStateSize] = {}; + unsigned char counter[detail::kStateSize] = {}; + memcpy(counter, nonce, 16); + + while (pos < data_size) { + if (blkpos == detail::kStateSize) { + detail::encrypt_state(rkeys, counter, blk); + detail::incr_counter(counter); + blkpos = 0; + } + data[pos++] ^= blk[blkpos++]; + } + + return kErrorOk; +} + +/** @} */ + +} // namespace aes diff --git a/src/common/sha1.h b/src/common/sha1.h new file mode 100644 index 000000000..fad849dcc --- /dev/null +++ b/src/common/sha1.h @@ -0,0 +1,180 @@ +// SPDX-FileCopyrightText: 2012 SAURAV MOHAPATRA +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include +#include + +namespace sha1 { +class SHA1 { +public: + typedef uint32_t digest32_t[5]; + typedef uint8_t digest8_t[20]; + inline static uint32_t LeftRotate(uint32_t value, size_t count) { + return (value << count) ^ (value >> (32 - count)); + } + SHA1() { + reset(); + } + virtual ~SHA1() {} + SHA1(const SHA1& s) { + *this = s; + } + const SHA1& operator=(const SHA1& s) { + memcpy(m_digest, s.m_digest, 5 * sizeof(uint32_t)); + memcpy(m_block, s.m_block, 64); + m_blockByteIndex = s.m_blockByteIndex; + m_byteCount = s.m_byteCount; + return *this; + } + SHA1& reset() { + m_digest[0] = 0x67452301; + m_digest[1] = 0xEFCDAB89; + m_digest[2] = 0x98BADCFE; + m_digest[3] = 0x10325476; + m_digest[4] = 0xC3D2E1F0; + m_blockByteIndex = 0; + m_byteCount = 0; + return *this; + } + SHA1& processByte(uint8_t octet) { + this->m_block[this->m_blockByteIndex++] = octet; + ++this->m_byteCount; + if (m_blockByteIndex == 64) { + this->m_blockByteIndex = 0; + processBlock(); + } + return *this; + } + SHA1& processBlock(const void* const start, const void* const end) { + const uint8_t* begin = static_cast(start); + const uint8_t* finish = static_cast(end); + while (begin != finish) { + processByte(*begin); + begin++; + } + return *this; + } + SHA1& processBytes(const void* const data, size_t len) { + const uint8_t* block = static_cast(data); + processBlock(block, block + len); + return *this; + } + const uint32_t* getDigest(digest32_t digest) { + size_t bitCount = this->m_byteCount * 8; + processByte(0x80); + if (this->m_blockByteIndex > 56) { + while (m_blockByteIndex != 0) { + processByte(0); + } + while (m_blockByteIndex < 56) { + processByte(0); + } + } else { + while (m_blockByteIndex < 56) { + processByte(0); + } + } + processByte(0); + processByte(0); + processByte(0); + processByte(0); + processByte(static_cast((bitCount >> 24) & 0xFF)); + processByte(static_cast((bitCount >> 16) & 0xFF)); + processByte(static_cast((bitCount >> 8) & 0xFF)); + processByte(static_cast((bitCount) & 0xFF)); + + memcpy(digest, m_digest, 5 * sizeof(uint32_t)); + return digest; + } + const uint8_t* getDigestBytes(digest8_t digest) { + digest32_t d32; + getDigest(d32); + size_t di = 0; + digest[di++] = ((d32[0] >> 24) & 0xFF); + digest[di++] = ((d32[0] >> 16) & 0xFF); + digest[di++] = ((d32[0] >> 8) & 0xFF); + digest[di++] = ((d32[0]) & 0xFF); + + digest[di++] = ((d32[1] >> 24) & 0xFF); + digest[di++] = ((d32[1] >> 16) & 0xFF); + digest[di++] = ((d32[1] >> 8) & 0xFF); + digest[di++] = ((d32[1]) & 0xFF); + + digest[di++] = ((d32[2] >> 24) & 0xFF); + digest[di++] = ((d32[2] >> 16) & 0xFF); + digest[di++] = ((d32[2] >> 8) & 0xFF); + digest[di++] = ((d32[2]) & 0xFF); + + digest[di++] = ((d32[3] >> 24) & 0xFF); + digest[di++] = ((d32[3] >> 16) & 0xFF); + digest[di++] = ((d32[3] >> 8) & 0xFF); + digest[di++] = ((d32[3]) & 0xFF); + + digest[di++] = ((d32[4] >> 24) & 0xFF); + digest[di++] = ((d32[4] >> 16) & 0xFF); + digest[di++] = ((d32[4] >> 8) & 0xFF); + digest[di++] = ((d32[4]) & 0xFF); + return digest; + } + +protected: + void processBlock() { + uint32_t w[80]; + for (size_t i = 0; i < 16; i++) { + w[i] = (m_block[i * 4 + 0] << 24); + w[i] |= (m_block[i * 4 + 1] << 16); + w[i] |= (m_block[i * 4 + 2] << 8); + w[i] |= (m_block[i * 4 + 3]); + } + for (size_t i = 16; i < 80; i++) { + w[i] = LeftRotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1); + } + + uint32_t a = m_digest[0]; + uint32_t b = m_digest[1]; + uint32_t c = m_digest[2]; + uint32_t d = m_digest[3]; + uint32_t e = m_digest[4]; + + for (std::size_t i = 0; i < 80; ++i) { + uint32_t f = 0; + uint32_t k = 0; + + if (i < 20) { + f = (b & c) | (~b & d); + k = 0x5A827999; + } else if (i < 40) { + f = b ^ c ^ d; + k = 0x6ED9EBA1; + } else if (i < 60) { + f = (b & c) | (b & d) | (c & d); + k = 0x8F1BBCDC; + } else { + f = b ^ c ^ d; + k = 0xCA62C1D6; + } + uint32_t temp = LeftRotate(a, 5) + f + e + k + w[i]; + e = d; + d = c; + c = LeftRotate(b, 30); + b = a; + a = temp; + } + + m_digest[0] += a; + m_digest[1] += b; + m_digest[2] += c; + m_digest[3] += d; + m_digest[4] += e; + } + +private: + digest32_t m_digest; + uint8_t m_block[64]; + size_t m_blockByteIndex; + size_t m_byteCount; +}; +} // namespace sha1 diff --git a/src/core/file_format/trp.cpp b/src/core/file_format/trp.cpp index 311bd0b9d..a5d11b0eb 100644 --- a/src/core/file_format/trp.cpp +++ b/src/core/file_format/trp.cpp @@ -1,35 +1,24 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include - +#include "common/aes.h" #include "common/config.h" #include "common/logging/log.h" #include "common/path_util.h" #include "core/file_format/trp.h" -static void DecryptEFSM(std::span trophyKey, - std::span NPcommID, - std::span efsmIv, std::span ciphertext, - std::span decrypted) { +static void DecryptEFSM(std::span trophyKey, std::span NPcommID, + std::span efsmIv, std::span ciphertext, + std::span decrypted) { + // Step 1: Encrypt NPcommID + std::array trophyIv{}; + std::array trpKey; + aes::encrypt_cbc(NPcommID.data(), NPcommID.size(), trophyKey.data(), trophyKey.size(), + trophyIv.data(), trpKey.data(), trpKey.size(), false); - // step 1: Encrypt NPcommID - CryptoPP::CBC_Mode::Encryption encrypt; - - std::vector trophyIv(16, 0); - std::vector trpKey(16); - - encrypt.SetKeyWithIV(trophyKey.data(), trophyKey.size(), trophyIv.data()); - encrypt.ProcessData(trpKey.data(), NPcommID.data(), 16); - - // step 2: decrypt efsm. - CryptoPP::CBC_Mode::Decryption decrypt; - decrypt.SetKeyWithIV(trpKey.data(), trpKey.size(), efsmIv.data()); - - for (size_t i = 0; i < decrypted.size(); i += CryptoPP::AES::BLOCKSIZE) { - decrypt.ProcessData(decrypted.data() + i, ciphertext.data() + i, CryptoPP::AES::BLOCKSIZE); - } + // Step 2: Decrypt EFSM + aes::decrypt_cbc(ciphertext.data(), ciphertext.size(), trpKey.data(), trpKey.size(), + efsmIv.data(), decrypted.data(), decrypted.size(), nullptr); } TRP::TRP() = default; @@ -80,7 +69,7 @@ bool TRP::Extract(const std::filesystem::path& trophyPath, const std::string tit return false; } - std::array user_key{}; + std::array user_key{}; hexToBytes(user_key_str.c_str(), user_key.data()); for (int index = 0; const auto& it : std::filesystem::directory_iterator(gameSysDir)) { diff --git a/src/core/module.cpp b/src/core/module.cpp index a18c1141a..1004f4404 100644 --- a/src/core/module.cpp +++ b/src/core/module.cpp @@ -1,13 +1,12 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include - #include "common/alignment.h" #include "common/arch.h" #include "common/assert.h" #include "common/logging/log.h" #include "common/memory_patcher.h" +#include "common/sha1.h" #include "common/string_util.h" #include "core/aerolib/aerolib.h" #include "core/cpu_patches.h" @@ -65,11 +64,13 @@ static std::string StringToNid(std::string_view symbol) { std::memcpy(input.data(), symbol.data(), symbol.size()); std::memcpy(input.data() + symbol.size(), Salt.data(), Salt.size()); - std::array hash; - CryptoPP::SHA1().CalculateDigest(hash.data(), input.data(), input.size()); + sha1::SHA1::digest8_t hash; + sha1::SHA1 sha; + sha.processBytes(input.data(), input.size()); + sha.getDigestBytes(hash); u64 digest; - std::memcpy(&digest, hash.data(), sizeof(digest)); + std::memcpy(&digest, hash, sizeof(digest)); static constexpr std::string_view codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-"; From df9151481c56512d05fc939313e3c944eac87819 Mon Sep 17 00:00:00 2001 From: Missake212 Date: Sat, 29 Mar 2025 08:32:57 +0000 Subject: [PATCH 454/455] Fix the "Open Update Folder" for folders ending with "-patch" (#2712) * fix open update folder * Update gui_context_menus.h --- src/qt_gui/gui_context_menus.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qt_gui/gui_context_menus.h b/src/qt_gui/gui_context_menus.h index 7dcb006ba..c13388bbc 100644 --- a/src/qt_gui/gui_context_menus.h +++ b/src/qt_gui/gui_context_menus.h @@ -141,14 +141,16 @@ public: Common::FS::PathToQString(open_update_path, m_games[itemID].path); open_update_path += "-UPDATE"; if (!std::filesystem::exists(Common::FS::PathFromQString(open_update_path))) { + QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path)); + } else { Common::FS::PathToQString(open_update_path, m_games[itemID].path); open_update_path += "-patch"; if (!std::filesystem::exists(Common::FS::PathFromQString(open_update_path))) { + QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path)); + } else { QMessageBox::critical(nullptr, tr("Error"), QString(tr("This game has no update folder to open!"))); } - } else { - QDesktopServices::openUrl(QUrl::fromLocalFile(open_update_path)); } } From 9dbc79dc96a4cf439adbead5563e46d1eb301391 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sat, 29 Mar 2025 11:03:40 +0200 Subject: [PATCH 455/455] New Crowdin updates (#2705) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Swedish) * New translations en_us.ts (French) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Norwegian Bokmal) --- src/qt_gui/translations/ar_SA.ts | 174 --------------------------- src/qt_gui/translations/da_DK.ts | 174 --------------------------- src/qt_gui/translations/de_DE.ts | 174 --------------------------- src/qt_gui/translations/el_GR.ts | 174 --------------------------- src/qt_gui/translations/es_ES.ts | 194 ++---------------------------- src/qt_gui/translations/fa_IR.ts | 174 --------------------------- src/qt_gui/translations/fi_FI.ts | 174 --------------------------- src/qt_gui/translations/fr_FR.ts | 200 ++----------------------------- src/qt_gui/translations/hu_HU.ts | 174 --------------------------- src/qt_gui/translations/id_ID.ts | 200 ++----------------------------- src/qt_gui/translations/it_IT.ts | 174 --------------------------- src/qt_gui/translations/ja_JP.ts | 174 --------------------------- src/qt_gui/translations/ko_KR.ts | 174 --------------------------- src/qt_gui/translations/lt_LT.ts | 174 --------------------------- src/qt_gui/translations/nb_NO.ts | 194 ++---------------------------- src/qt_gui/translations/nl_NL.ts | 174 --------------------------- src/qt_gui/translations/pl_PL.ts | 174 --------------------------- src/qt_gui/translations/pt_BR.ts | 174 --------------------------- src/qt_gui/translations/pt_PT.ts | 174 --------------------------- src/qt_gui/translations/ro_RO.ts | 174 --------------------------- src/qt_gui/translations/ru_RU.ts | 174 --------------------------- src/qt_gui/translations/sq_AL.ts | 174 --------------------------- src/qt_gui/translations/sv_SE.ts | 194 ++---------------------------- src/qt_gui/translations/tr_TR.ts | 174 --------------------------- src/qt_gui/translations/uk_UA.ts | 174 --------------------------- src/qt_gui/translations/vi_VN.ts | 174 --------------------------- src/qt_gui/translations/zh_CN.ts | 174 --------------------------- src/qt_gui/translations/zh_TW.ts | 174 --------------------------- 28 files changed, 56 insertions(+), 4928 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 9808fdbe6..f5503e189 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -882,10 +882,6 @@ Error creating shortcut! خطأ في إنشاء الاختصار - - Install PKG - PKG تثبيت - Game اللعبة @@ -978,25 +974,6 @@ أزرار التحكم - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - اختر المجلد - - - Select which directory you want to install to. - حدد الدليل الذي تريد تثبيت إليه. - - - Install All Queued to Selected Folder - تثبيت كل قائمة الانتظار إلى المجلد المحدد - - - Delete PKG File on Install - حذف مِلَفّ PKG عند التثبيت - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elf فتح/إضافة مجلد - - Install Packages (PKG) - (PKG) تثبيت الحزم - Boot Game تشغيل اللعبة @@ -1234,10 +1207,6 @@ Configure... ...تكوين - - Install application from a .pkg file - .pkg تثبيت التطبيق من ملف - Recent Games الألعاب الأخيرة @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. لم يتم العثور على ألعاب. الرجاء إضافة ألعابك إلى مكتبتك أولاً. - - PKG Viewer - عارض PKG - Search... ...بحث @@ -1426,70 +1391,6 @@ Only one file can be selected! !يمكن تحديد ملف واحد فقط - - PKG Extraction - PKG استخراج - - - Patch detected! - تم اكتشاف تصحيح! - - - PKG and Game versions match: - :واللعبة تتطابق إصدارات PKG - - - Would you like to overwrite? - هل ترغب في الكتابة فوق الملف الموجود؟ - - - PKG Version %1 is older than installed version: - :أقدم من الإصدار المثبت PKG Version %1 - - - Game is installed: - :اللعبة مثبتة - - - Would you like to install Patch: - :هل ترغب في تثبيت التصحيح - - - DLC Installation - تثبيت المحتوى القابل للتنزيل - - - Would you like to install DLC: %1? - هل ترغب في تثبيت المحتوى القابل للتنزيل: 1%؟ - - - DLC already installed: - :المحتوى القابل للتنزيل مثبت بالفعل - - - Game already installed - اللعبة مثبتة بالفعل - - - PKG ERROR - PKG خطأ في - - - Extracting PKG %1/%2 - PKG %1/%2 جاري استخراج - - - Extraction Finished - اكتمل الاستخراج - - - Game successfully installed at %1 - تم تثبيت اللعبة بنجاح في %1 - - - File doesn't appear to be a valid PKG file - يبدو أن الملف ليس ملف PKG صالحًا - Run Game تشغيل اللعبة @@ -1498,14 +1399,6 @@ Eboot.bin file not found لم يتم العثور على ملف Eboot.bin - - PKG File (*.PKG *.pkg) - ملف PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG هو تصحيح أو DLC، يرجى تثبيت اللعبة أولاً! - Game is already running! اللعبة قيد التشغيل بالفعل! @@ -1555,73 +1448,6 @@ إظهار العلامات أسفل الأيقونات - - PKGViewer - - Open Folder - فتح المجلد - - - PKG ERROR - PKG خطأ في - - - Name - اسم - - - Serial - سيريال - - - Installed - مثبت - - - Size - حجم - - - Category - الفئة - - - Type - النوع - - - App Ver - إصدار - - - FW - FW - - - Region - منطقة - - - Flags - Flags - - - Path - مسار - - - File - ملف - - - Unknown - غير معروف - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 1547a0e13..658ac118f 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Kun én fil kan vælges! - - PKG Extraction - PKG-udtrækning - - - Patch detected! - Opdatering detekteret! - - - PKG and Game versions match: - PKG og spilversioner matcher: - - - Would you like to overwrite? - Vil du overskrive? - - - PKG Version %1 is older than installed version: - PKG Version %1 er ældre end den installerede version: - - - Game is installed: - Spillet er installeret: - - - Would you like to install Patch: - Vil du installere opdateringen: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Vil du installere DLC: %1? - - - DLC already installed: - DLC allerede installeret: - - - Game already installed - Spillet er allerede installeret - - - PKG ERROR - PKG FEJL - - - Extracting PKG %1/%2 - Udvinding af PKG %1/%2 - - - Extraction Finished - Udvinding afsluttet - - - Game successfully installed at %1 - Spillet blev installeret succesfuldt på %1 - - - File doesn't appear to be a valid PKG file - Filen ser ikke ud til at være en gyldig PKG-fil - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG FEJL - - - Name - Navn - - - Serial - Seriel - - - Installed - Installed - - - Size - Størrelse - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Region - - - Flags - Flags - - - Path - Sti - - - File - File - - - Unknown - Ukendt - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index c0e43065b..b6cd3105f 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -882,10 +882,6 @@ Error creating shortcut! Fehler beim Erstellen der Verknüpfung! - - Install PKG - PKG installieren - Game Spiel @@ -978,25 +974,6 @@ Tastenbelegung - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Wähle Ordner - - - Select which directory you want to install to. - Wählen Sie das Verzeichnis aus, in das Sie installieren möchten. - - - Install All Queued to Selected Folder - Installieren Sie alles aus der Warteschlange in den ausgewählten Ordner - - - Delete PKG File on Install - PKG-Datei beim Installieren löschen - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elf-Ordner öffnen/hinzufügen - - Install Packages (PKG) - Pakete installieren (PKG) - Boot Game Spiel starten @@ -1234,10 +1207,6 @@ Configure... Konfigurieren... - - Install application from a .pkg file - Installiere Anwendung aus .pkg-Datei - Recent Games Zuletzt gespielt @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG-Anschauer - Search... Suchen... @@ -1426,70 +1391,6 @@ Only one file can be selected! Es kann nur eine Datei ausgewählt werden! - - PKG Extraction - PKG-Extraktion - - - Patch detected! - Patch erkannt! - - - PKG and Game versions match: - PKG- und Spielversionen stimmen überein: - - - Would you like to overwrite? - Willst du überschreiben? - - - PKG Version %1 is older than installed version: - PKG-Version %1 ist älter als die installierte Version: - - - Game is installed: - Spiel ist installiert: - - - Would you like to install Patch: - Willst du den Patch installieren: - - - DLC Installation - DLC-Installation - - - Would you like to install DLC: %1? - Willst du das DLC installieren: %1? - - - DLC already installed: - DLC bereits installiert: - - - Game already installed - Spiel bereits installiert - - - PKG ERROR - PKG-FEHLER - - - Extracting PKG %1/%2 - Extrahiere PKG %1/%2 - - - Extraction Finished - Extraktion abgeschlossen - - - Game successfully installed at %1 - Spiel erfolgreich installiert auf %1 - - - File doesn't appear to be a valid PKG file - Die Datei scheint keine gültige PKG-Datei zu sein - Run Game Spiel ausführen @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin Datei nicht gefunden - - PKG File (*.PKG *.pkg) - PKG-Datei (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG ist ein Patch oder DLC, bitte installieren Sie zuerst das Spiel! - Game is already running! Spiel läuft bereits! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Ordner öffnen - - - PKG ERROR - PKG-FEHLER - - - Name - Name - - - Serial - Seriennummer - - - Installed - Installiert - - - Size - Größe - - - Category - Kategorie - - - Type - Typ - - - App Ver - App Ver - - - FW - FW - - - Region - Region - - - Flags - Markierungen - - - Path - Pfad - - - File - Datei - - - Unknown - Unbekannt - - - Package - Paket - - SettingsDialog diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index e6fa989aa..d1cf0d4a6 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Μπορεί να επιλεγεί μόνο ένα αρχείο! - - PKG Extraction - Εξαγωγή PKG - - - Patch detected! - Αναγνώριση ενημέρωσης! - - - PKG and Game versions match: - Οι εκδόσεις PKG και παιχνιδιού ταιριάζουν: - - - Would you like to overwrite? - Θέλετε να αντικαταστήσετε; - - - PKG Version %1 is older than installed version: - Η έκδοση PKG %1 είναι παλαιότερη από την εγκατεστημένη έκδοση: - - - Game is installed: - Το παιχνίδι είναι εγκατεστημένο: - - - Would you like to install Patch: - Θέλετε να εγκαταστήσετε την ενημέρωση: - - - DLC Installation - Εγκατάσταση DLC - - - Would you like to install DLC: %1? - Θέλετε να εγκαταστήσετε το DLC: %1; - - - DLC already installed: - DLC ήδη εγκατεστημένο: - - - Game already installed - Παιχνίδι ήδη εγκατεστημένο - - - PKG ERROR - ΣΦΑΛΜΑ PKG - - - Extracting PKG %1/%2 - Εξαγωγή PKG %1/%2 - - - Extraction Finished - Η εξαγωγή ολοκληρώθηκε - - - Game successfully installed at %1 - Το παιχνίδι εγκαταστάθηκε επιτυχώς στο %1 - - - File doesn't appear to be a valid PKG file - Η αρχείο δεν φαίνεται να είναι έγκυρο αρχείο PKG - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - ΣΦΑΛΜΑ PKG - - - Name - Όνομα - - - Serial - Σειριακός αριθμός - - - Installed - Installed - - - Size - Μέγεθος - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Περιοχή - - - Flags - Flags - - - Path - Διαδρομή - - - File - File - - - Unknown - Άγνωστο - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index 288c445c3..bbd49f61d 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -882,10 +882,6 @@ Error creating shortcut! ¡Error al crear el acceso directo! - - Install PKG - Instalar PKG - Game Juego @@ -978,25 +974,6 @@ Asignación de Teclas - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Elegir carpeta - - - Select which directory you want to install to. - Selecciona el directorio de instalación. - - - Install All Queued to Selected Folder - Instalar toda la cola en la carpeta seleccionada - - - Delete PKG File on Install - Eliminar archivo PKG tras la instalación - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Abrir/Agregar carpeta Elf - - Install Packages (PKG) - Instalar paquetes (PKG) - Boot Game Iniciar juego @@ -1234,10 +1207,6 @@ Configure... Configurar... - - Install application from a .pkg file - Instalar aplicación desde un archivo .pkg - Recent Games Juegos recientes @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No se encontraron juegos. Por favor, añade tus juegos a tu biblioteca primero. - - PKG Viewer - Vista PKG - Search... Buscar... @@ -1426,70 +1391,6 @@ Only one file can be selected! ¡Solo se puede seleccionar un archivo! - - PKG Extraction - Extracción de PKG - - - Patch detected! - ¡Actualización detectada! - - - PKG and Game versions match: - Las versiones de PKG y del juego coinciden: - - - Would you like to overwrite? - ¿Desea sobrescribir? - - - PKG Version %1 is older than installed version: - La versión de PKG %1 es más antigua que la versión instalada: - - - Game is installed: - El juego está instalado: - - - Would you like to install Patch: - ¿Desea instalar la actualización: - - - DLC Installation - Instalación de DLC - - - Would you like to install DLC: %1? - ¿Desea instalar el DLC: %1? - - - DLC already installed: - DLC ya instalado: - - - Game already installed - Juego ya instalado - - - PKG ERROR - ERROR PKG - - - Extracting PKG %1/%2 - Extrayendo PKG %1/%2 - - - Extraction Finished - Extracción terminada - - - Game successfully installed at %1 - Juego instalado exitosamente en %1 - - - File doesn't appear to be a valid PKG file - El archivo parece no ser un archivo PKG válido - Run Game Ejecutar juego @@ -1498,14 +1399,6 @@ Eboot.bin file not found Archivo Eboot.bin no encontrado - - PKG File (*.PKG *.pkg) - Archivo PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - El archivo PKG es un parche o DLC, ¡debes instalar el juego primero! - Game is already running! ¡El juego ya se está ejecutando! @@ -1516,110 +1409,43 @@ Play - Play + Jugar Pause - Pause + Pausar Stop - Stop + Detener Restart - Restart + Reiniciar Full Screen - Full Screen + Pantalla completa Controllers - Controllers + Controles Keyboard - Keyboard + Teclado Refresh List - Refresh List + Actualizar lista Resume - Resume + Reanudar Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Abrir Carpeta - - - PKG ERROR - ERROR PKG - - - Name - Nombre - - - Serial - Número de Serie - - - Installed - Instalado - - - Size - Tamaño - - - Category - Categoría - - - Type - Tipo - - - App Ver - Versión de la Aplicación - - - FW - FW - - - Region - Región - - - Flags - Etiquetas - - - Path - Ruta - - - File - Archivo - - - Unknown - Desconocido - - - Package - Paquete + Mostrar etiquetas debajo de los iconos diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 1b8813a80..f1f2c62ab 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -882,10 +882,6 @@ Error creating shortcut! مشکلی در هنگام ساخت میانبر بوجود آمد! - - Install PKG - نصب PKG - Game بازی @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - ShadPS4 - انتخاب محل نصب بازی - - - Select which directory you want to install to. - محلی را که می‌خواهید در آن نصب شود، انتخاب کنید. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder ELF بازکردن/ساختن پوشه - - Install Packages (PKG) - نصب بسته (PKG) - Boot Game اجرای بازی @@ -1234,10 +1207,6 @@ Configure... ...تنظیمات - - Install application from a .pkg file - .PKG نصب بازی از فایل - Recent Games بازی های اخیر @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG مشاهده گر - Search... جست و جو... @@ -1426,70 +1391,6 @@ Only one file can be selected! فقط یک فایل انتخاب کنید! - - PKG Extraction - PKG استخراج فایل - - - Patch detected! - پچ شناسایی شد! - - - PKG and Game versions match: - و نسخه بازی همخوانی دارد PKG فایل: - - - Would you like to overwrite? - آیا مایل به جایگزینی فایل هستید؟ - - - PKG Version %1 is older than installed version: - نسخه فایل PKG %1 قدیمی تر از نسخه نصب شده است: - - - Game is installed: - بازی نصب شد: - - - Would you like to install Patch: - آیا مایل به نصب پچ هستید: - - - DLC Installation - نصب DLC - - - Would you like to install DLC: %1? - آیا مایل به نصب DLC هستید: %1 - - - DLC already installed: - قبلا نصب شده DLC این: - - - Game already installed - این بازی قبلا نصب شده - - - PKG ERROR - PKG ارور فایل - - - Extracting PKG %1/%2 - درحال استخراج PKG %1/%2 - - - Extraction Finished - استخراج به پایان رسید - - - Game successfully installed at %1 - بازی با موفقیت در %1 نصب شد - - - File doesn't appear to be a valid PKG file - این فایل یک PKG درست به نظر نمی آید - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - بازکردن پوشه - - - PKG ERROR - PKG ارور فایل - - - Name - نام - - - Serial - سریال - - - Installed - Installed - - - Size - اندازه - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - منطقه - - - Flags - Flags - - - Path - مسیر - - - File - فایل - - - Unknown - ناشناخته - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index cd880fb23..d07f82bd5 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -882,10 +882,6 @@ Error creating shortcut! Virhe pikakuvakkeen luonnissa! - - Install PKG - Asenna PKG - Game Peli @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Valitse hakemisto - - - Select which directory you want to install to. - Valitse, mihin hakemistoon haluat asentaa. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Avaa/Lisää Elf Hakemisto - - Install Packages (PKG) - Asenna Paketteja (PKG) - Boot Game Käynnistä Peli @@ -1234,10 +1207,6 @@ Configure... Asetukset... - - Install application from a .pkg file - Asenna sovellus .pkg tiedostosta - Recent Games Viimeisimmät Pelit @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Selain - Search... Hae... @@ -1426,70 +1391,6 @@ Only one file can be selected! Vain yksi tiedosto voi olla valittuna! - - PKG Extraction - PKG:n purku - - - Patch detected! - Päivitys havaittu! - - - PKG and Game versions match: - PKG- ja peliversiot vastaavat: - - - Would you like to overwrite? - Haluatko korvata? - - - PKG Version %1 is older than installed version: - PKG-versio %1 on vanhempi kuin asennettu versio: - - - Game is installed: - Peli on asennettu: - - - Would you like to install Patch: - Haluatko asentaa päivityksen: - - - DLC Installation - Lisäsisällön asennus - - - Would you like to install DLC: %1? - Haluatko asentaa lisäsisällön: %1? - - - DLC already installed: - Lisäsisältö on jo asennettu: - - - Game already installed - Peli on jo asennettu - - - PKG ERROR - PKG VIRHE - - - Extracting PKG %1/%2 - Purkaminen PKG %1/%2 - - - Extraction Finished - Purku valmis - - - Game successfully installed at %1 - Peli asennettu onnistuneesti kohtaan %1 - - - File doesn't appear to be a valid PKG file - Tiedosto ei vaikuta olevan kelvollinen PKG-tiedosto - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Avaa Hakemisto - - - PKG ERROR - PKG VIRHE - - - Name - Nimi - - - Serial - Sarjanumero - - - Installed - Installed - - - Size - Koko - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Alue - - - Flags - Flags - - - Path - Polku - - - File - Tiedosto - - - Unknown - Tuntematon - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 1f7a726cd..89599e32c 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Erreur lors de la création du raccourci ! - - Install PKG - Installer un PKG - Game Jeu @@ -978,25 +974,6 @@ Raccourcis - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choisir un répertoire - - - Select which directory you want to install to. - Sélectionnez le répertoire où vous souhaitez effectuer l'installation. - - - Install All Queued to Selected Folder - Installer toute la file d’attente dans le dossier sélectionné - - - Delete PKG File on Install - Supprimer le fichier PKG à l'installation - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Ouvrir/Ajouter un dossier ELF - - Install Packages (PKG) - Installer des packages (PKG) - Boot Game Démarrer un jeu @@ -1234,10 +1207,6 @@ Configure... Configurer... - - Install application from a .pkg file - Installer une application depuis un fichier .pkg - Recent Games Jeux récents @@ -1308,15 +1277,11 @@ Trophy Viewer - Trophy Viewer + Visionneuse de trophées No games found. Please add your games to your library first. - No games found. Please add your games to your library first. - - - PKG Viewer - Visionneuse PKG + Aucun jeu trouvé. Veuillez d'abord ajouter vos jeux à votre bibliothèque. Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Un seul fichier peut être sélectionné ! - - PKG Extraction - Extraction du PKG - - - Patch detected! - Patch détecté ! - - - PKG and Game versions match: - Les versions PKG et jeu correspondent: - - - Would you like to overwrite? - Souhaitez-vous remplacer ? - - - PKG Version %1 is older than installed version: - La version PKG %1 est plus ancienne que la version installée: - - - Game is installed: - Jeu installé: - - - Would you like to install Patch: - Souhaitez-vous installer le patch: - - - DLC Installation - Installation du DLC - - - Would you like to install DLC: %1? - Souhaitez-vous installer le DLC: %1 ? - - - DLC already installed: - DLC déjà installé: - - - Game already installed - Jeu déjà installé - - - PKG ERROR - Erreur PKG - - - Extracting PKG %1/%2 - Extraction PKG %1/%2 - - - Extraction Finished - Extraction terminée - - - Game successfully installed at %1 - Jeu installé avec succès dans %1 - - - File doesn't appear to be a valid PKG file - Le fichier ne semble pas être un PKG valide - Run Game Lancer le jeu @@ -1498,14 +1399,6 @@ Eboot.bin file not found Fichier Eboot.bin introuvable - - PKG File (*.PKG *.pkg) - Fichier PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG est un patch ou DLC, veuillez d'abord installer le jeu ! - Game is already running! Le jeu est déjà en cours ! @@ -1516,110 +1409,43 @@ Play - Play + Jouer Pause - Pause + Pause Stop - Stop + Stop Restart - Restart + Redémarrer Full Screen - Full Screen + Plein écran Controllers - Controllers + Contrôleurs Keyboard - Keyboard + Clavier Refresh List - Refresh List + Rafraîchir la liste Resume - Resume + Reprendre Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Ouvrir un dossier - - - PKG ERROR - Erreur PKG - - - Name - Nom - - - Serial - Numéro de série - - - Installed - Installé - - - Size - Taille - - - Category - Catégorie - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Région - - - Flags - Les indicateurs - - - Path - Répertoire - - - File - Fichier - - - Unknown - Inconnu - - - Package - Package + Afficher les libellés sous les icônes @@ -2241,7 +2067,7 @@ Select Game: - Select Game: + Sélectionnez un jeu: Progress diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 8746058b3..85b6f2c95 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -882,10 +882,6 @@ Error creating shortcut! Hiba a parancsikon létrehozásával! - - Install PKG - PKG telepítése - Game Játék @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Mappa kiválasztása - - - Select which directory you want to install to. - Válassza ki a mappát a játékok telepítésére. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder ELF Mappa Megnyitása/Hozzáadása - - Install Packages (PKG) - PKG-k Telepítése (PKG) - Boot Game Játék Indítása @@ -1234,10 +1207,6 @@ Configure... Konfigurálás... - - Install application from a .pkg file - Program telepítése egy .pkg fájlból - Recent Games Legutóbbi Játékok @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Nézegető - Search... Keresés... @@ -1426,70 +1391,6 @@ Only one file can be selected! Csak egy fájl választható ki! - - PKG Extraction - PKG kicsomagolás - - - Patch detected! - Frissítés észlelve! - - - PKG and Game versions match: - A PKG és a játék verziói egyeznek: - - - Would you like to overwrite? - Szeretné felülírni? - - - PKG Version %1 is older than installed version: - A(z) %1-es PKG verzió régebbi, mint a telepített verzió: - - - Game is installed: - A játék telepítve van: - - - Would you like to install Patch: - Szeretné telepíteni a frissítést: - - - DLC Installation - DLC Telepítés - - - Would you like to install DLC: %1? - Szeretné telepíteni a %1 DLC-t? - - - DLC already installed: - DLC már telepítve: - - - Game already installed - A játék már telepítve van - - - PKG ERROR - PKG HIBA - - - Extracting PKG %1/%2 - PKG kicsomagolása %1/%2 - - - Extraction Finished - Kicsomagolás befejezve - - - Game successfully installed at %1 - A játék sikeresen telepítve itt: %1 - - - File doesn't appear to be a valid PKG file - A fájl nem tűnik érvényes PKG fájlnak - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Mappa Megnyitása - - - PKG ERROR - PKG HIBA - - - Name - Név - - - Serial - Sorozatszám - - - Installed - Installed - - - Size - Méret - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Régió - - - Flags - Flags - - - Path - Útvonal - - - File - Fájl - - - Unknown - Ismeretlen - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 5960715ae..1858da2a7 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -7,22 +7,22 @@ AboutDialog About shadPS4 - About shadPS4 + Tentang shadPS4 shadPS4 is an experimental open-source emulator for the PlayStation 4. - shadPS4 is an experimental open-source emulator for the PlayStation 4. + shadPS4 adalah emulator sumber terbuka eksperimental untuk PlayStation 4. This software should not be used to play games you have not legally obtained. - This software should not be used to play games you have not legally obtained. + Perangkat lunak ini tidak boleh digunakan untuk memainkan permainan yang tidak Anda peroleh secara legal. CheatsPatches Cheats / Patches for - Cheats / Patches for + Kecurangan / Tambalan untuk Cheats/Patches are experimental.\nUse with caution.\n\nDownload cheats individually by selecting the repository and clicking the download button.\nIn the Patches tab, you can download all patches at once, choose which ones you want to use, and save your selection.\n\nSince we do not develop the Cheats/Patches,\nplease report issues to the cheat author.\n\nCreated a new cheat? Visit:\n @@ -34,7 +34,7 @@ Serial: - Serial: + Seri: Version: @@ -400,38 +400,38 @@ Playable - Playable + Dapat dimainkan ControlSettings Configure Controls - Configure Controls + Konfigurasi Kontrol D-Pad - D-Pad + Tombol arah Up - Up + Atas Left - Left + Kiri Right - Right + Kanan Down - Down + Bawah Left Stick Deadzone (def:2 max:127) - Left Stick Deadzone (def:2 max:127) + Zona Mati Stik Kiri (standar: 2, maksimum: 127) Left Deadzone @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Hanya satu file yang bisa dipilih! - - PKG Extraction - Ekstraksi PKG - - - Patch detected! - Patch terdeteksi! - - - PKG and Game versions match: - Versi PKG dan Game cocok: - - - Would you like to overwrite? - Apakah Anda ingin menimpa? - - - PKG Version %1 is older than installed version: - Versi PKG %1 lebih lama dari versi yang terpasang: - - - Game is installed: - Game telah terpasang: - - - Would you like to install Patch: - Apakah Anda ingin menginstal patch: - - - DLC Installation - Instalasi DLC - - - Would you like to install DLC: %1? - Apakah Anda ingin menginstal DLC: %1? - - - DLC already installed: - DLC sudah terpasang: - - - Game already installed - Game sudah terpasang - - - PKG ERROR - KESALAHAN PKG - - - Extracting PKG %1/%2 - Mengekstrak PKG %1/%2 - - - Extraction Finished - Ekstraksi Selesai - - - Game successfully installed at %1 - Game berhasil dipasang di %1 - - - File doesn't appear to be a valid PKG file - File tampaknya bukan file PKG yang valid - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - KESALAHAN PKG - - - Name - Nama - - - Serial - Serial - - - Installed - Installed - - - Size - Ukuran - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Wilayah - - - Flags - Flags - - - Path - Jalur - - - File - File - - - Unknown - Tidak Dikenal - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 3e95e3df6..af321bd92 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -882,10 +882,6 @@ Error creating shortcut! Errore nella creazione della scorciatoia! - - Install PKG - Installa PKG - Game Gioco @@ -978,25 +974,6 @@ Associazioni dei pulsanti - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Scegli cartella - - - Select which directory you want to install to. - Seleziona in quale cartella vuoi effettuare l'installazione. - - - Install All Queued to Selected Folder - Installa tutto in coda nella Cartella Selezionata - - - Delete PKG File on Install - Elimina file PKG dopo Installazione - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Apri/Aggiungi cartella Elf - - Install Packages (PKG) - Installa Pacchetti (PKG) - Boot Game Avvia Gioco @@ -1234,10 +1207,6 @@ Configure... Configura... - - Install application from a .pkg file - Installa applicazione da un file .pkg - Recent Games Giochi Recenti @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nessun gioco trovato. Aggiungi prima i tuoi giochi alla tua libreria. - - PKG Viewer - Visualizzatore PKG - Search... Cerca... @@ -1426,70 +1391,6 @@ Only one file can be selected! Si può selezionare solo un file! - - PKG Extraction - Estrazione file PKG - - - Patch detected! - Patch rilevata! - - - PKG and Game versions match: - Le versioni di PKG e del Gioco corrispondono: - - - Would you like to overwrite? - Vuoi sovrascrivere? - - - PKG Version %1 is older than installed version: - La versione PKG %1 è più vecchia rispetto alla versione installata: - - - Game is installed: - Gioco installato: - - - Would you like to install Patch: - Vuoi installare la patch: - - - DLC Installation - Installazione DLC - - - Would you like to install DLC: %1? - Vuoi installare il DLC: %1? - - - DLC already installed: - DLC già installato: - - - Game already installed - Gioco già installato - - - PKG ERROR - ERRORE PKG - - - Extracting PKG %1/%2 - Estrazione file PKG %1/%2 - - - Extraction Finished - Estrazione Completata - - - Game successfully installed at %1 - Gioco installato correttamente in %1 - - - File doesn't appear to be a valid PKG file - Il file sembra non essere un file PKG valido - Run Game Esegui Gioco @@ -1498,14 +1399,6 @@ Eboot.bin file not found File Eboot.bin non trovato - - PKG File (*.PKG *.pkg) - File PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - Il file PKG è una patch o DLC, si prega di installare prima il gioco! - Game is already running! Il gioco è già in esecuzione! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Apri Cartella - - - PKG ERROR - ERRORE PKG - - - Name - Nome - - - Serial - Seriale - - - Installed - Installato - - - Size - Dimensione - - - Category - Categoria - - - Type - Tipo - - - App Ver - Vers. App. - - - FW - FW - - - Region - Regione - - - Flags - Segnalazioni - - - Path - Percorso - - - File - File - - - Unknown - Sconosciuto - - - Package - Pacchetto - - SettingsDialog diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 1aaa3fa7c..d4b8fa5b7 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -882,10 +882,6 @@ Error creating shortcut! ショートカットの作成に失敗しました! - - Install PKG - PKGをインストール - Game ゲーム @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - ディレクトリを選択 - - - Select which directory you want to install to. - インストール先のディレクトリを選択してください。 - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - インストール時にPKGファイルを削除 - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elfフォルダを開く/追加する - - Install Packages (PKG) - パッケージをインストール (PKG) - Boot Game ゲームを起動 @@ -1234,10 +1207,6 @@ Configure... 設定... - - Install application from a .pkg file - .pkgファイルからアプリケーションをインストール - Recent Games 最近プレイしたゲーム @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKGビューアー - Search... 検索... @@ -1426,70 +1391,6 @@ Only one file can be selected! 1つのファイルしか選択できません! - - PKG Extraction - PKGの抽出 - - - Patch detected! - パッチが検出されました! - - - PKG and Game versions match: - PKGとゲームのバージョンが一致しています: - - - Would you like to overwrite? - 上書きしてもよろしいですか? - - - PKG Version %1 is older than installed version: - PKGバージョン %1 はインストールされているバージョンよりも古いです: - - - Game is installed: - ゲームはインストール済みです: - - - Would you like to install Patch: - パッチをインストールしてもよろしいですか: - - - DLC Installation - DLCのインストール - - - Would you like to install DLC: %1? - DLCをインストールしてもよろしいですか: %1? - - - DLC already installed: - DLCはすでにインストールされています: - - - Game already installed - ゲームはすでにインストールされています - - - PKG ERROR - PKGエラー - - - Extracting PKG %1/%2 - PKGを抽出中 %1/%2 - - - Extraction Finished - 抽出完了 - - - Game successfully installed at %1 - ゲームが %1 に正常にインストールされました - - - File doesn't appear to be a valid PKG file - ファイルが有効なPKGファイルでないようです - Run Game ゲームを実行 @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin ファイルが見つかりません - - PKG File (*.PKG *.pkg) - PKGファイル (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! ゲームは既に実行されています! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - フォルダーを開く - - - PKG ERROR - PKGエラー - - - Name - 名前 - - - Serial - シリアル - - - Installed - Installed - - - Size - サイズ - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - 地域 - - - Flags - Flags - - - Path - パス - - - File - ファイル - - - Unknown - 不明 - - - Package - パッケージ - - SettingsDialog diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 9dd06028d..9d4b58c79 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Only one file can be selected! - - PKG Extraction - PKG Extraction - - - Patch detected! - Patch detected! - - - PKG and Game versions match: - PKG and Game versions match: - - - Would you like to overwrite? - Would you like to overwrite? - - - PKG Version %1 is older than installed version: - PKG Version %1 is older than installed version: - - - Game is installed: - Game is installed: - - - Would you like to install Patch: - Would you like to install Patch: - - - DLC Installation - DLC Installation - - - Would you like to install DLC: %1? - Would you like to install DLC: %1? - - - DLC already installed: - DLC already installed: - - - Game already installed - Game already installed - - - PKG ERROR - PKG ERROR - - - Extracting PKG %1/%2 - Extracting PKG %1/%2 - - - Extraction Finished - Extraction Finished - - - Game successfully installed at %1 - Game successfully installed at %1 - - - File doesn't appear to be a valid PKG file - File doesn't appear to be a valid PKG file - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG ERROR - - - Name - Name - - - Serial - Serial - - - Installed - Installed - - - Size - Size - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Region - - - Flags - Flags - - - Path - Path - - - File - File - - - Unknown - 알 수 없음 - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index 6e98ddc45..55a9fac0c 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Žaidimas @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Galite pasirinkti tik vieną failą! - - PKG Extraction - PKG ištraukimas - - - Patch detected! - Rasta atnaujinimą! - - - PKG and Game versions match: - PKG ir žaidimo versijos sutampa: - - - Would you like to overwrite? - Ar norite perrašyti? - - - PKG Version %1 is older than installed version: - PKG versija %1 yra senesnė nei įdiegta versija: - - - Game is installed: - Žaidimas įdiegtas: - - - Would you like to install Patch: - Ar norite įdiegti atnaujinimą: - - - DLC Installation - DLC diegimas - - - Would you like to install DLC: %1? - Ar norite įdiegti DLC: %1? - - - DLC already installed: - DLC jau įdiegtas: - - - Game already installed - Žaidimas jau įdiegtas - - - PKG ERROR - PKG KLAIDA - - - Extracting PKG %1/%2 - Ekstrakcinis PKG %1/%2 - - - Extraction Finished - Ekstrakcija baigta - - - Game successfully installed at %1 - Žaidimas sėkmingai įdiegtas %1 - - - File doesn't appear to be a valid PKG file - Failas atrodo, kad nėra galiojantis PKG failas - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG KLAIDA - - - Name - Vardas - - - Serial - Serijinis numeris - - - Installed - Installed - - - Size - Dydis - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Regionas - - - Flags - Flags - - - Path - Kelias - - - File - File - - - Unknown - Nežinoma - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 6faff415e..4a0835c1c 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -882,10 +882,6 @@ Error creating shortcut! Feil ved opprettelse av snarvei! - - Install PKG - Installer PKG - Game Spill @@ -978,25 +974,6 @@ Hurtigtast - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Velg mappe - - - Select which directory you want to install to. - Velg hvilken mappe du vil installere til. - - - Install All Queued to Selected Folder - Installer alle i kø til den valgte mappa - - - Delete PKG File on Install - Slett PKG-fila ved installering - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Åpne eller legg til Elf-mappe - - Install Packages (PKG) - Installer pakker (PKG) - Boot Game Start spill @@ -1234,10 +1207,6 @@ Configure... Sett opp … - - Install application from a .pkg file - Installer fra en .pkg fil - Recent Games Nylige spill @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Fant ingen spill. Legg til spillene dine i biblioteket først. - - PKG Viewer - PKG-viser - Search... Søk … @@ -1426,70 +1391,6 @@ Only one file can be selected! Kun én fil kan velges! - - PKG Extraction - PKG-utpakking - - - Patch detected! - Programrettelse oppdaget! - - - PKG and Game versions match: - PKG og spillversjoner stemmer overens: - - - Would you like to overwrite? - Ønsker du å overskrive? - - - PKG Version %1 is older than installed version: - PKG-versjon %1 er eldre enn installert versjon: - - - Game is installed: - Spillet er installert: - - - Would you like to install Patch: - Ønsker du å installere programrettelsen: - - - DLC Installation - DLC installasjon - - - Would you like to install DLC: %1? - Ønsker du å installere DLC: %1? - - - DLC already installed: - DLC allerede installert: - - - Game already installed - Spillet er allerede installert - - - PKG ERROR - PKG FEIL - - - Extracting PKG %1/%2 - Pakker ut PKG %1/%2 - - - Extraction Finished - Utpakking fullført - - - Game successfully installed at %1 - Spillet ble installert i %1 - - - File doesn't appear to be a valid PKG file - Fila ser ikke ut til å være en gyldig PKG-fil - Run Game Kjør spill @@ -1498,14 +1399,6 @@ Eboot.bin file not found Klarte ikke finne Eboot.bin-fila - - PKG File (*.PKG *.pkg) - PKG-fil (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG er en programrettelse eller DLC. Installer spillet først! - Game is already running! Spillet kjører allerede! @@ -1516,110 +1409,43 @@ Play - Play + Spill Pause - Pause + Pause Stop - Stop + Stopp Restart - Restart + Start på nytt Full Screen - Full Screen + Fullskjerm Controllers - Controllers + Kontroller Keyboard - Keyboard + Tastatur Refresh List - Refresh List + Oppdater lista Resume - Resume + Gjenoppta Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Åpne mappe - - - PKG ERROR - PKG FEIL - - - Name - Navn - - - Serial - Serienummer - - - Installed - Installert - - - Size - Størrelse - - - Category - Kategori - - - Type - Type - - - App Ver - Programversjon - - - FW - FV - - - Region - Region - - - Flags - Flagg - - - Path - Adresse - - - File - Fil - - - Unknown - Ukjent - - - Package - Pakke + Vis merkelapp under ikoner diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 376eea5ef..918da6a67 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Je kunt slechts één bestand selecteren! - - PKG Extraction - PKG-extractie - - - Patch detected! - Patch gedetecteerd! - - - PKG and Game versions match: - PKG- en gameversies komen overeen: - - - Would you like to overwrite? - Wilt u overschrijven? - - - PKG Version %1 is older than installed version: - PKG-versie %1 is ouder dan de geïnstalleerde versie: - - - Game is installed: - Game is geïnstalleerd: - - - Would you like to install Patch: - Wilt u de patch installeren: - - - DLC Installation - DLC-installatie - - - Would you like to install DLC: %1? - Wilt u DLC installeren: %1? - - - DLC already installed: - DLC al geïnstalleerd: - - - Game already installed - Game al geïnstalleerd - - - PKG ERROR - PKG FOUT - - - Extracting PKG %1/%2 - PKG %1/%2 aan het extraheren - - - Extraction Finished - Extractie voltooid - - - Game successfully installed at %1 - Spel succesvol geïnstalleerd op %1 - - - File doesn't appear to be a valid PKG file - Het bestand lijkt geen geldig PKG-bestand te zijn - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG FOUT - - - Name - Naam - - - Serial - Serienummer - - - Installed - Installed - - - Size - Grootte - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Regio - - - Flags - Flags - - - Path - Pad - - - File - File - - - Unknown - Onbekend - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index a77b43e09..39950d6ec 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -882,10 +882,6 @@ Error creating shortcut! Utworzenie skrótu zakończone niepowodzeniem! - - Install PKG - Zainstaluj PKG - Game Gra @@ -978,25 +974,6 @@ Przypisanie klawiszy - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Wybierz katalog - - - Select which directory you want to install to. - Wybierz katalog, do którego chcesz zainstalować. - - - Install All Queued to Selected Folder - Zainstaluj wszystkie oczekujące do wybranego folderu - - - Delete PKG File on Install - Usuń plik PKG po instalacji - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Otwórz/Dodaj folder Elf - - Install Packages (PKG) - Zainstaluj paczkę (PKG) - Boot Game Uruchom grę @@ -1234,10 +1207,6 @@ Configure... Konfiguruj... - - Install application from a .pkg file - Zainstaluj aplikacje z pliku .pkg - Recent Games Ostatnie gry @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nie znaleziono gier. Najpierw dodaj swoje gry do swojej biblioteki. - - PKG Viewer - Menedżer plików PKG - Search... Szukaj... @@ -1426,70 +1391,6 @@ Only one file can be selected! Można wybrać tylko jeden plik! - - PKG Extraction - Wypakowywanie PKG - - - Patch detected! - Wykryto łatkę! - - - PKG and Game versions match: - Wersje PKG i gry są zgodne: - - - Would you like to overwrite? - Czy chcesz nadpisać? - - - PKG Version %1 is older than installed version: - Wersja PKG %1 jest starsza niż zainstalowana wersja: - - - Game is installed: - Gra jest zainstalowana: - - - Would you like to install Patch: - Czy chcesz zainstalować łatkę: - - - DLC Installation - Instalacja dodatkowej zawartości (DLC) - - - Would you like to install DLC: %1? - Czy chcesz zainstalować dodatkową zawartość (DLC): %1? - - - DLC already installed: - Dodatkowa zawartość (DLC) już zainstalowana: - - - Game already installed - Gra już zainstalowana - - - PKG ERROR - BŁĄD PKG - - - Extracting PKG %1/%2 - Wypakowywanie PKG %1/%2 - - - Extraction Finished - Wypakowywanie zakończone - - - Game successfully installed at %1 - Gra pomyślnie zainstalowana w %1 - - - File doesn't appear to be a valid PKG file - Plik nie wydaje się być prawidłowym plikiem PKG - Run Game Uruchom grę @@ -1498,14 +1399,6 @@ Eboot.bin file not found Nie znaleziono pliku EBOOT.BIN - - PKG File (*.PKG *.pkg) - Plik PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG jest aktualizacją lub dodatkową zawartością (DLC), najpierw zainstaluj grę! - Game is already running! Gra jest już uruchomiona! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Otwórz folder - - - PKG ERROR - BŁĄD PKG - - - Name - Nazwa - - - Serial - Numer seryjny - - - Installed - Zainstalowano - - - Size - Rozmiar - - - Category - Kategoria - - - Type - Typ - - - App Ver - Wersja aplikacji - - - FW - Oprogramowanie - - - Region - Region - - - Flags - Flagi - - - Path - Ścieżka - - - File - Plik - - - Unknown - Nieznany - - - Package - Paczka - - SettingsDialog diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index ea82086f3..5d1582b5a 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Erro ao criar atalho! - - Install PKG - Instalar PKG - Game Jogo @@ -978,25 +974,6 @@ Teclas de atalho - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Escolha o diretório - - - Select which directory you want to install to. - Selecione o diretório em que você deseja instalar. - - - Install All Queued to Selected Folder - Instalar Tudo da Fila para a Pasta Selecionada - - - Delete PKG File on Install - Excluir o PKG após a Instalação - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Abrir/Adicionar pasta Elf - - Install Packages (PKG) - Instalar Pacotes (PKG) - Boot Game Iniciar Jogo @@ -1234,10 +1207,6 @@ Configure... Configurar... - - Install application from a .pkg file - Instalar aplicativo de um arquivo .pkg - Recent Games Jogos Recentes @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nenhum jogo encontrado. Adicione seus jogos à sua biblioteca primeiro. - - PKG Viewer - Visualizador de PKG - Search... Pesquisar... @@ -1426,70 +1391,6 @@ Only one file can be selected! Apenas um arquivo pode ser selecionado! - - PKG Extraction - Extração de PKG - - - Patch detected! - Atualização detectada! - - - PKG and Game versions match: - As versões do PKG e do Jogo são iguais: - - - Would you like to overwrite? - Você gostaria de sobrescrever? - - - PKG Version %1 is older than installed version: - A Versão do PKG %1 é mais antiga do que a versão instalada: - - - Game is installed: - Jogo instalado: - - - Would you like to install Patch: - Você gostaria de instalar a atualização: - - - DLC Installation - Instalação de DLC - - - Would you like to install DLC: %1? - Você gostaria de instalar o DLC: %1? - - - DLC already installed: - DLC já está instalado: - - - Game already installed - O jogo já está instalado: - - - PKG ERROR - ERRO DE PKG - - - Extracting PKG %1/%2 - Extraindo PKG %1/%2 - - - Extraction Finished - Extração Concluída - - - Game successfully installed at %1 - Jogo instalado com sucesso em %1 - - - File doesn't appear to be a valid PKG file - O arquivo não parece ser um arquivo PKG válido - Run Game Executar Jogo @@ -1498,14 +1399,6 @@ Eboot.bin file not found Arquivo Eboot.bin não encontrado - - PKG File (*.PKG *.pkg) - Arquivo PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - O PKG é um patch ou DLC, por favor instale o jogo primeiro! - Game is already running! O jogo já está executando! @@ -1555,73 +1448,6 @@ Mostrar Rótulos Sob Ícones - - PKGViewer - - Open Folder - Abrir Pasta - - - PKG ERROR - ERRO DE PKG - - - Name - Nome - - - Serial - Serial - - - Installed - Instalado - - - Size - Tamanho - - - Category - Categoria - - - Type - Tipo - - - App Ver - Versão do App - - - FW - FW - - - Region - Região - - - Flags - Flags - - - Path - Caminho - - - File - Arquivo - - - Unknown - Desconhecido - - - Package - Pacote - - SettingsDialog diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 7ca3eebb5..a155a6324 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -882,10 +882,6 @@ Error creating shortcut! Erro ao criar atalho! - - Install PKG - Instalar PKG - Game Jogo @@ -978,25 +974,6 @@ Combinações de Teclas - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Escolher diretório - - - Select which directory you want to install to. - Selecione o diretório em que deseja instalar. - - - Install All Queued to Selected Folder - Instalar Todos os Pendentes para a Pasta Selecionada - - - Delete PKG File on Install - Eliminar Ficheiro PKG após Instalação - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Abrir/Adicionar pasta Elf - - Install Packages (PKG) - Instalar Pacotes (PKG) - Boot Game Iniciar Jogo @@ -1234,10 +1207,6 @@ Configure... Configurar... - - Install application from a .pkg file - Instalar aplicação através de um ficheiro .pkg - Recent Games Jogos Recentes @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nenhum jogo encontrado. Por favor, adicione os seus jogos à sua biblioteca primeiro. - - PKG Viewer - Visualizador PKG - Search... Procurar... @@ -1426,70 +1391,6 @@ Only one file can be selected! Apenas um ficheiro pode ser selecionado! - - PKG Extraction - Extração de PKG - - - Patch detected! - Patch detetado! - - - PKG and Game versions match: - As versões do PKG e do Jogo coincidem: - - - Would you like to overwrite? - Gostaria de substituir? - - - PKG Version %1 is older than installed version: - A versão do PKG %1 é mais antiga do que a versão instalada: - - - Game is installed: - O jogo está instalado: - - - Would you like to install Patch: - Gostaria de instalar o Patch: - - - DLC Installation - Instalação de DLC - - - Would you like to install DLC: %1? - Deseja instalar o DLC: %1? - - - DLC already installed: - DLC já está instalado: - - - Game already installed - O jogo já está instalado - - - PKG ERROR - ERRO PKG - - - Extracting PKG %1/%2 - A extrair PKG %1/%2 - - - Extraction Finished - Extração Finalizada - - - Game successfully installed at %1 - Jogo instalado com sucesso em %1 - - - File doesn't appear to be a valid PKG file - O ficheiro não aparenta ser um ficheiro PKG válido - Run Game Executar Jogo @@ -1498,14 +1399,6 @@ Eboot.bin file not found Ficheiro eboot.bin não encontrado - - PKG File (*.PKG *.pkg) - Ficheiro PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - Este PKG é um patch ou DLC, por favor instale o respetivo jogo primeiro! - Game is already running! O jogo já está a ser executado! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Abrir Pasta - - - PKG ERROR - ERRO PKG - - - Name - Nome - - - Serial - Número de Série - - - Installed - Instalado - - - Size - Tamanho - - - Category - Categoria - - - Type - Tipo - - - App Ver - App Ver - - - FW - FW - - - Region - Região - - - Flags - Flags - - - Path - Caminho - - - File - Ficheiro - - - Unknown - Desconhecido - - - Package - Pacote - - SettingsDialog diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index 6e008ac20..18121a204 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Numai un fișier poate fi selectat! - - PKG Extraction - Extracție PKG - - - Patch detected! - Patch detectat! - - - PKG and Game versions match: - Versiunile PKG și ale jocului sunt compatibile: - - - Would you like to overwrite? - Doriți să suprascrieți? - - - PKG Version %1 is older than installed version: - Versiunea PKG %1 este mai veche decât versiunea instalată: - - - Game is installed: - Jocul este instalat: - - - Would you like to install Patch: - Doriți să instalați patch-ul: - - - DLC Installation - Instalare DLC - - - Would you like to install DLC: %1? - Doriți să instalați DLC-ul: %1? - - - DLC already installed: - DLC deja instalat: - - - Game already installed - Jocul deja instalat - - - PKG ERROR - EROARE PKG - - - Extracting PKG %1/%2 - Extracție PKG %1/%2 - - - Extraction Finished - Extracție terminată - - - Game successfully installed at %1 - Jocul a fost instalat cu succes la %1 - - - File doesn't appear to be a valid PKG file - Fișierul nu pare să fie un fișier PKG valid - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Deschide Folder - - - PKG ERROR - EROARE PKG - - - Name - Nume - - - Serial - Serie - - - Installed - Installed - - - Size - Dimensiune - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Regiune - - - Flags - Flags - - - Path - Drum - - - File - File - - - Unknown - Necunoscut - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 560c8c110..3944af589 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -882,10 +882,6 @@ Error creating shortcut! Ошибка создания ярлыка! - - Install PKG - Установить PKG - Game Игры @@ -978,25 +974,6 @@ Бинды клавиш - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Выберите папку - - - Select which directory you want to install to. - Выберите папку, в которую вы хотите установить. - - - Install All Queued to Selected Folder - Установить все из очереди в выбранную папку - - - Delete PKG File on Install - Удалить файл PKG при установке - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Открыть/Добавить папку Elf - - Install Packages (PKG) - Установить пакеты (PKG) - Boot Game Запустить игру @@ -1234,10 +1207,6 @@ Configure... Настроить... - - Install application from a .pkg file - Установить приложение из файла .pkg - Recent Games Недавние игры @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Не найдено ни одной игры. Пожалуйста, сначала добавьте игры в библиотеку. - - PKG Viewer - Просмотр PKG - Search... Поиск... @@ -1426,70 +1391,6 @@ Only one file can be selected! Можно выбрать только один файл! - - PKG Extraction - Извлечение PKG - - - Patch detected! - Обнаружен патч! - - - PKG and Game versions match: - Версии PKG и игры совпадают: - - - Would you like to overwrite? - Хотите перезаписать? - - - PKG Version %1 is older than installed version: - Версия PKG %1 старше установленной версии: - - - Game is installed: - Игра установлена: - - - Would you like to install Patch: - Хотите установить патч: - - - DLC Installation - Установка DLC - - - Would you like to install DLC: %1? - Вы хотите установить DLC: %1? - - - DLC already installed: - DLC уже установлен: - - - Game already installed - Игра уже установлена - - - PKG ERROR - ОШИБКА PKG - - - Extracting PKG %1/%2 - Извлечение PKG %1/%2 - - - Extraction Finished - Извлечение завершено - - - Game successfully installed at %1 - Игра успешно установлена в %1 - - - File doesn't appear to be a valid PKG file - Файл не является допустимым файлом PKG - Run Game Запустить игру @@ -1498,14 +1399,6 @@ Eboot.bin file not found Файл eboot.bin не найден - - PKG File (*.PKG *.pkg) - Файл PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - Выбранный PKG является патчем или DLC, пожалуйста, сначала установите игру! - Game is already running! Игра уже запущена! @@ -1555,73 +1448,6 @@ Показывать метки под значками - - PKGViewer - - Open Folder - Открыть папку - - - PKG ERROR - ОШИБКА PKG - - - Name - Название - - - Serial - Серийный номер - - - Installed - Установлено - - - Size - Размер - - - Category - Категория - - - Type - Тип - - - App Ver - Версия приложения - - - FW - Прошивка - - - Region - Регион - - - Flags - Флаги - - - Path - Путь - - - File - Файл - - - Unknown - Неизвестно - - - Package - Пакет - - SettingsDialog diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 8a2c34c60..d59fd8c3e 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -882,10 +882,6 @@ Error creating shortcut! Gabim në krijimin e shkurtores! - - Install PKG - Instalo PKG - Game Loja @@ -978,25 +974,6 @@ Caktimet e Tasteve - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Përzgjidh dosjen - - - Select which directory you want to install to. - Përzgjidh në cilën dosje do që të instalosh. - - - Install All Queued to Selected Folder - Instalo të gjitha të radhiturat në dosjen e zgjedhur - - - Delete PKG File on Install - Fshi skedarin PKG pas instalimit - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Hap/Shto Dosje ELF - - Install Packages (PKG) - Instalo Paketat (PKG) - Boot Game Nis Lojën @@ -1234,10 +1207,6 @@ Configure... Konfiguro... - - Install application from a .pkg file - Instalo aplikacionin nga një skedar .pkg - Recent Games Lojërat e fundit @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Nuk u gjetën lojëra. Shto lojërat në librarinë tënde fillimisht. - - PKG Viewer - Shikuesi i PKG - Search... Kërko... @@ -1426,70 +1391,6 @@ Only one file can be selected! Mund të përzgjidhet vetëm një skedar! - - PKG Extraction - Nxjerrja e PKG-së - - - Patch detected! - U zbulua një arnë! - - - PKG and Game versions match: - PKG-ja dhe versioni i Lojës përputhen: - - - Would you like to overwrite? - Dëshiron të mbishkruash? - - - PKG Version %1 is older than installed version: - Versioni %1 i PKG-së është më i vjetër se versioni i instaluar: - - - Game is installed: - Loja është instaluar: - - - Would you like to install Patch: - Dëshiron të instalosh Arnën: - - - DLC Installation - Instalimi i DLC-ve - - - Would you like to install DLC: %1? - Dëshiron të instalosh DLC-në: %1? - - - DLC already installed: - DLC-ja është instaluar tashmë: - - - Game already installed - Loja është instaluar tashmë - - - PKG ERROR - GABIM PKG - - - Extracting PKG %1/%2 - Po nxirret PKG-ja %1/%2 - - - Extraction Finished - Nxjerrja Përfundoi - - - Game successfully installed at %1 - Loja u instalua me sukses në %1 - - - File doesn't appear to be a valid PKG file - Skedari nuk duket si skedar PKG i vlefshëm - Run Game Ekzekuto lojën @@ -1498,14 +1399,6 @@ Eboot.bin file not found Skedari Eboot.bin nuk u gjet - - PKG File (*.PKG *.pkg) - Skedar PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG-ja është një arnë ose DLC, të lutem instalo lojën fillimisht! - Game is already running! Loja tashmë është duke u ekzekutuar! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Hap Dosjen - - - PKG ERROR - GABIM PKG - - - Name - Emri - - - Serial - Seriku - - - Installed - Instaluar - - - Size - Madhësia - - - Category - Kategoria - - - Type - Lloji - - - App Ver - Versioni i aplikacionit - - - FW - Firmueri - - - Region - Rajoni - - - Flags - Flamurët - - - Path - Shtegu - - - File - Skedari - - - Unknown - E panjohur - - - Package - Paketa - - SettingsDialog diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 91b544e05..b570c420e 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -882,10 +882,6 @@ Error creating shortcut! Fel vid skapandet av genväg! - - Install PKG - Installera PKG - Game Spel @@ -978,25 +974,6 @@ Tangentbindningar - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Välj katalog - - - Select which directory you want to install to. - Välj vilken katalog som du vill installera till. - - - Install All Queued to Selected Folder - Installera alla köade till markerad mapp - - - Delete PKG File on Install - Ta bort PKG-fil efter installation - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Öppna/Lägg till Elf-mapp - - Install Packages (PKG) - Installera paket (PKG) - Boot Game Starta spel @@ -1234,10 +1207,6 @@ Configure... Konfigurera... - - Install application from a .pkg file - Installera program från en .pkg-fil - Recent Games Senaste spel @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Inga spel hittades. Lägg till dina spel till biblioteket först. - - PKG Viewer - PKG-visare - Search... Sök... @@ -1426,70 +1391,6 @@ Only one file can be selected! Endast en fil kan väljas! - - PKG Extraction - PKG-extrahering - - - Patch detected! - Patch upptäcktes! - - - PKG and Game versions match: - PKG och spelversioner matchar: - - - Would you like to overwrite? - Vill du skriva över? - - - PKG Version %1 is older than installed version: - PKG-versionen %1 är äldre än installerad version: - - - Game is installed: - Spelet är installerat: - - - Would you like to install Patch: - Vill du installera patch: - - - DLC Installation - DLC-installation - - - Would you like to install DLC: %1? - Vill du installera DLC: %1? - - - DLC already installed: - DLC redan installerat: - - - Game already installed - Spelet redan installerat - - - PKG ERROR - PKG-FEL - - - Extracting PKG %1/%2 - Extraherar PKG %1/%2 - - - Extraction Finished - Extrahering färdig - - - Game successfully installed at %1 - Spelet installerades i %1 - - - File doesn't appear to be a valid PKG file - Filen verkar inte vara en giltig PKG-fil - Run Game Kör spel @@ -1498,14 +1399,6 @@ Eboot.bin file not found Filen eboot.bin hittades inte - - PKG File (*.PKG *.pkg) - PKG-fil (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG är en patch eller DLC. Installera spelet först! - Game is already running! Spelet är redan igång! @@ -1516,110 +1409,43 @@ Play - Play + Spela Pause - Pause + Paus Stop - Stop + Stoppa Restart - Restart + Starta om Full Screen - Full Screen + Helskärm Controllers - Controllers + Kontroller Keyboard - Keyboard + Tangentbord Refresh List - Refresh List + Uppdatera lista Resume - Resume + Återuppta Show Labels Under Icons - Show Labels Under Icons - - - - PKGViewer - - Open Folder - Öppna mapp - - - PKG ERROR - PKG-FEL - - - Name - Namn - - - Serial - Serienummer - - - Installed - Installerat - - - Size - Storlek - - - Category - Kategori - - - Type - Typ - - - App Ver - Appver - - - FW - FW - - - Region - Region - - - Flags - Flaggor - - - Path - Sökväg - - - File - Arkiv - - - Unknown - Okänt - - - Package - Paket + Visa etiketter under ikoner diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 4946874c9..d2d018116 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -882,10 +882,6 @@ Error creating shortcut! Kısayol oluşturulurken hata oluştu! - - Install PKG - PKG Yükle - Game Oyun @@ -978,25 +974,6 @@ Tuş Atamaları - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Klasörü Seç - - - Select which directory you want to install to. - Hangi dizine yüklemek istediğinizi seçin. - - - Install All Queued to Selected Folder - Tüm Kuyruktakileri Seçili Klasöre Yükle - - - Delete PKG File on Install - Yüklemede PKG Dosyasını Sil - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Elf Klasörü Aç/Ekle - - Install Packages (PKG) - Paketleri Kur (PKG) - Boot Game Oyunu Başlat @@ -1234,10 +1207,6 @@ Configure... Yapılandır... - - Install application from a .pkg file - .pkg dosyasından uygulama yükle - Recent Games Son Oyunlar @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. Oyun bulunamadı. Oyunlarınızı lütfen önce kütüphanenize ekleyin. - - PKG Viewer - PKG Görüntüleyici - Search... Ara... @@ -1426,70 +1391,6 @@ Only one file can be selected! Sadece bir dosya seçilebilir! - - PKG Extraction - PKG Çıkartma - - - Patch detected! - Yama tespit edildi! - - - PKG and Game versions match: - PKG ve oyun sürümleri uyumlu: - - - Would you like to overwrite? - Üzerine yazmak ister misiniz? - - - PKG Version %1 is older than installed version: - PKG Sürümü %1, kurulu sürümden daha eski: - - - Game is installed: - Oyun yüklendi: - - - Would you like to install Patch: - Yamanın yüklenmesini ister misiniz: - - - DLC Installation - DLC Yükleme - - - Would you like to install DLC: %1? - DLC'yi yüklemek ister misiniz: %1? - - - DLC already installed: - DLC zaten yüklü: - - - Game already installed - Oyun zaten yüklü - - - PKG ERROR - PKG HATASI - - - Extracting PKG %1/%2 - PKG Çıkarılıyor %1/%2 - - - Extraction Finished - Çıkarma Tamamlandı - - - Game successfully installed at %1 - Oyun başarıyla %1 konumuna yüklendi - - - File doesn't appear to be a valid PKG file - Dosya geçerli bir PKG dosyası gibi görünmüyor - Run Game Oyunu Çalıştır @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin dosyası bulunamadı - - PKG File (*.PKG *.pkg) - PKG Dosyası (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG bir yama ya da DLC, lütfen önce oyunu yükleyin! - Game is already running! Oyun zaten çalışıyor! @@ -1555,73 +1448,6 @@ Simgelerin Altında Etiketleri Göster - - PKGViewer - - Open Folder - Klasörü Aç - - - PKG ERROR - PKG HATASI - - - Name - Ad - - - Serial - Seri Numarası - - - Installed - Yüklü - - - Size - Boyut - - - Category - Kategori - - - Type - Tür - - - App Ver - Uygulama Sürümü - - - FW - Sistem Yazılımı - - - Region - Bölge - - - Flags - Bayraklar - - - Path - Yol - - - File - Dosya - - - Unknown - Bilinmeyen - - - Package - Paket - - SettingsDialog diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 69e6c5fc7..890fa163e 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -882,10 +882,6 @@ Error creating shortcut! Помилка при створенні ярлика! - - Install PKG - Встановити PKG - Game гри @@ -978,25 +974,6 @@ Призначення клавіш - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Виберіть папку - - - Select which directory you want to install to. - Виберіть папку, до якої ви хочете встановити. - - - Install All Queued to Selected Folder - Встановити все з черги до вибраної папки - - - Delete PKG File on Install - Видалити файл PKG під час встановлення - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Відкрити/Додати папку Elf - - Install Packages (PKG) - Встановити пакети (PKG) - Boot Game Запустити гру @@ -1234,10 +1207,6 @@ Configure... Налаштувати... - - Install application from a .pkg file - Встановити додаток з файлу .pkg - Recent Games Нещодавні ігри @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - Перегляд PKG - Search... Пошук... @@ -1426,70 +1391,6 @@ Only one file can be selected! Можна вибрати лише один файл! - - PKG Extraction - Розпакування PKG - - - Patch detected! - Виявлено патч! - - - PKG and Game versions match: - Версії PKG та гри збігаються: - - - Would you like to overwrite? - Бажаєте перезаписати? - - - PKG Version %1 is older than installed version: - Версія PKG %1 старіша за встановлену версію: - - - Game is installed: - Встановлена гра: - - - Would you like to install Patch: - Бажаєте встановити патч: - - - DLC Installation - Встановлення DLC - - - Would you like to install DLC: %1? - Ви бажаєте встановити DLC: %1? - - - DLC already installed: - DLC вже встановлено: - - - Game already installed - Гра вже встановлена - - - PKG ERROR - ПОМИЛКА PKG - - - Extracting PKG %1/%2 - Витягування PKG %1/%2 - - - Extraction Finished - Розпакування завершено - - - Game successfully installed at %1 - Гру успішно встановлено у %1 - - - File doesn't appear to be a valid PKG file - Файл не є дійсним PKG-файлом - Run Game Запустити гру @@ -1498,14 +1399,6 @@ Eboot.bin file not found Файл Boot.bin не знайдено - - PKG File (*.PKG *.pkg) - Файл PKG (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG - це патч або DLC, будь ласка, спочатку встановіть гру! - Game is already running! Гра вже запущена! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Відкрити папку - - - PKG ERROR - ПОМИЛКА PKG - - - Name - Назва - - - Serial - Серійний номер - - - Installed - Встановлені - - - Size - Розмір - - - Category - Категорія - - - Type - Тип - - - App Ver - Версія додатку - - - FW - ПЗ - - - Region - Регіон - - - Flags - Мітки - - - Path - Шлях - - - File - Файл - - - Unknown - Невідомо - - - Package - Пакет - - SettingsDialog diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 14bd29896..b8c1759be 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! Chỉ có thể chọn một tệp duy nhất! - - PKG Extraction - Giải nén PKG - - - Patch detected! - Đã phát hiện bản vá! - - - PKG and Game versions match: - Các phiên bản PKG và trò chơi khớp nhau: - - - Would you like to overwrite? - Bạn có muốn ghi đè không? - - - PKG Version %1 is older than installed version: - Phiên bản PKG %1 cũ hơn phiên bản đã cài đặt: - - - Game is installed: - Trò chơi đã được cài đặt: - - - Would you like to install Patch: - Bạn có muốn cài đặt bản vá: - - - DLC Installation - Cài đặt DLC - - - Would you like to install DLC: %1? - Bạn có muốn cài đặt DLC: %1? - - - DLC already installed: - DLC đã được cài đặt: - - - Game already installed - Trò chơi đã được cài đặt - - - PKG ERROR - LOI PKG - - - Extracting PKG %1/%2 - Đang giải nén PKG %1/%2 - - - Extraction Finished - Giải nén hoàn tất - - - Game successfully installed at %1 - Trò chơi đã được cài đặt thành công tại %1 - - - File doesn't appear to be a valid PKG file - Tệp không có vẻ là tệp PKG hợp lệ - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - LOI PKG - - - Name - Tên - - - Serial - Số seri - - - Installed - Installed - - - Size - Kích thước - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - Khu vực - - - Flags - Flags - - - Path - Đường dẫn - - - File - File - - - Unknown - Không xác định - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index 7536b7d17..7d414a493 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -882,10 +882,6 @@ Error creating shortcut! 创建快捷方式出错! - - Install PKG - 安装 PKG - Game 游戏 @@ -978,25 +974,6 @@ 按键绑定 - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - 选择文件目录 - - - Select which directory you want to install to. - 选择您想要安装到的目录。 - - - Install All Queued to Selected Folder - 安装所有 PKG 到选定的文件夹 - - - Delete PKG File on Install - 安装后删除 PKG 文件 - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder 打开/添加 Elf 文件夹 - - Install Packages (PKG) - 安装 Packages (PKG) - Boot Game 启动游戏 @@ -1234,10 +1207,6 @@ Configure... 设置... - - Install application from a .pkg file - 从 .pkg 文件安装应用程序 - Recent Games 最近启动的游戏 @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. 未找到游戏。请先将您的游戏添加到您的资料库。 - - PKG Viewer - PKG 查看器 - Search... 搜索... @@ -1426,70 +1391,6 @@ Only one file can be selected! 只能选择一个文件! - - PKG Extraction - PKG 解压 - - - Patch detected! - 检测到补丁! - - - PKG and Game versions match: - PKG 和游戏版本匹配: - - - Would you like to overwrite? - 您想要覆盖吗? - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安装版本更旧: - - - Game is installed: - 游戏已安装: - - - Would you like to install Patch: - 您想安装补丁吗: - - - DLC Installation - DLC 安装 - - - Would you like to install DLC: %1? - 您想安装 DLC:%1 吗? - - - DLC already installed: - DLC 已经安装: - - - Game already installed - 游戏已经安装 - - - PKG ERROR - PKG 错误 - - - Extracting PKG %1/%2 - 正在解压 PKG %1/%2 - - - Extraction Finished - 解压完成 - - - Game successfully installed at %1 - 游戏成功安装在 %1 - - - File doesn't appear to be a valid PKG file - 文件似乎不是有效的 PKG 文件 - Run Game 运行游戏 @@ -1498,14 +1399,6 @@ Eboot.bin file not found 找不到 Eboot.bin 文件 - - PKG File (*.PKG *.pkg) - PKG 文件(*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG是一个补丁或 DLC,请先安装游戏! - Game is already running! 游戏已经在运行中! @@ -1555,73 +1448,6 @@ 显示图标下的标签 - - PKGViewer - - Open Folder - 打开文件夹 - - - PKG ERROR - PKG 错误 - - - Name - 名称 - - - Serial - 序列号 - - - Installed - 已安装 - - - Size - 大小 - - - Category - 分类 - - - Type - 类型 - - - App Ver - 版本 - - - FW - 固件 - - - Region - 区域 - - - Flags - 标志 - - - Path - 路径 - - - File - 文件 - - - Unknown - 未知 - - - Package - Package - - SettingsDialog diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index f195ec1b7..08aa812fb 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -882,10 +882,6 @@ Error creating shortcut! Error creating shortcut! - - Install PKG - Install PKG - Game Game @@ -978,25 +974,6 @@ Keybindings - - InstallDirSelect - - shadPS4 - Choose directory - shadPS4 - Choose directory - - - Select which directory you want to install to. - Select which directory you want to install to. - - - Install All Queued to Selected Folder - Install All Queued to Selected Folder - - - Delete PKG File on Install - Delete PKG File on Install - - KBMSettings @@ -1214,10 +1191,6 @@ Open/Add Elf Folder Open/Add Elf Folder - - Install Packages (PKG) - Install Packages (PKG) - Boot Game Boot Game @@ -1234,10 +1207,6 @@ Configure... Configure... - - Install application from a .pkg file - Install application from a .pkg file - Recent Games Recent Games @@ -1314,10 +1283,6 @@ No games found. Please add your games to your library first. No games found. Please add your games to your library first. - - PKG Viewer - PKG Viewer - Search... Search... @@ -1426,70 +1391,6 @@ Only one file can be selected! 只能選擇一個檔案! - - PKG Extraction - PKG 解壓縮 - - - Patch detected! - 檢測到補丁! - - - PKG and Game versions match: - PKG 和遊戲版本匹配: - - - Would you like to overwrite? - 您想要覆蓋嗎? - - - PKG Version %1 is older than installed version: - PKG 版本 %1 比已安裝版本更舊: - - - Game is installed: - 遊戲已安裝: - - - Would you like to install Patch: - 您想要安裝補丁嗎: - - - DLC Installation - DLC 安裝 - - - Would you like to install DLC: %1? - 您想要安裝 DLC: %1 嗎? - - - DLC already installed: - DLC 已經安裝: - - - Game already installed - 遊戲已經安裝 - - - PKG ERROR - PKG 錯誤 - - - Extracting PKG %1/%2 - 正在解壓縮 PKG %1/%2 - - - Extraction Finished - 解壓縮完成 - - - Game successfully installed at %1 - 遊戲成功安裝於 %1 - - - File doesn't appear to be a valid PKG file - 檔案似乎不是有效的 PKG 檔案 - Run Game Run Game @@ -1498,14 +1399,6 @@ Eboot.bin file not found Eboot.bin file not found - - PKG File (*.PKG *.pkg) - PKG File (*.PKG *.pkg) - - - PKG is a patch or DLC, please install the game first! - PKG is a patch or DLC, please install the game first! - Game is already running! Game is already running! @@ -1555,73 +1448,6 @@ Show Labels Under Icons - - PKGViewer - - Open Folder - Open Folder - - - PKG ERROR - PKG 錯誤 - - - Name - 名稱 - - - Serial - 序號 - - - Installed - Installed - - - Size - 大小 - - - Category - Category - - - Type - Type - - - App Ver - App Ver - - - FW - FW - - - Region - 區域 - - - Flags - Flags - - - Path - 路徑 - - - File - File - - - Unknown - 未知 - - - Package - Package - - SettingsDialog

aHH*iAmjzIlNYQ}fyp$U6# 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 +#include +#include +#include +#include +#include + +#include "common/path_util.h" +#include "kbm_config_dialog.h" +#include "kbm_gui.h" +#include "kbm_help_dialog.h" +#include "ui_kbm_gui.h" + +HelpDialog* HelpWindow; + +KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* parent) + : QDialog(parent), m_game_info(game_info_get), ui(new Ui::KBMSettings) { + + ui->setupUi(this); + ui->PerGameCheckBox->setChecked(!Config::GetUseUnifiedInputConfig()); + ui->TextEditorButton->setFocus(); + this->setFocusPolicy(Qt::StrongFocus); + + ui->MouseJoystickBox->addItem("none"); + ui->MouseJoystickBox->addItem("right"); + ui->MouseJoystickBox->addItem("left"); + + ui->ProfileComboBox->addItem("Common Config"); + for (int i = 0; i < m_game_info->m_games.size(); i++) { + ui->ProfileComboBox->addItem(QString::fromStdString(m_game_info->m_games[i].serial)); + } + + ButtonsList = { + ui->CrossButton, ui->CircleButton, ui->TriangleButton, ui->SquareButton, + ui->L1Button, ui->R1Button, ui->L2Button, ui->R2Button, + ui->L3Button, ui->R3Button, ui->TouchpadButton, ui->OptionsButton, + ui->TouchpadButton, ui->DpadUpButton, ui->DpadDownButton, ui->DpadLeftButton, + ui->DpadRightButton, ui->LStickUpButton, ui->LStickDownButton, ui->LStickLeftButton, + ui->LStickRightButton, ui->RStickUpButton, ui->RStickDownButton, ui->RStickLeftButton, + ui->RStickRightButton, ui->LHalfButton, ui->RHalfButton}; + + ButtonConnects(); + SetUIValuestoMappings("default"); + installEventFilter(this); + + ui->ProfileComboBox->setCurrentText("Common Config"); + ui->TitleLabel->setText("Common Config"); + + connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton* button) { + if (button == ui->buttonBox->button(QDialogButtonBox::Save)) { + if (HelpWindowOpen) { + HelpWindow->close(); + HelpWindowOpen = false; + } + SaveKBMConfig(true); + } else if (button == ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)) { + SetDefault(); + } else if (button == ui->buttonBox->button(QDialogButtonBox::Apply)) { + SaveKBMConfig(false); + } + }); + + connect(ui->HelpButton, &QPushButton::clicked, this, &KBMSettings::onHelpClicked); + connect(ui->TextEditorButton, &QPushButton::clicked, this, [this]() { + auto kbmWindow = new EditorDialog(this); + kbmWindow->exec(); + }); + + connect(ui->buttonBox, &QDialogButtonBox::rejected, this, [this] { + QWidget::close(); + if (HelpWindowOpen) { + HelpWindow->close(); + HelpWindowOpen = false; + } + }); + + connect(ui->ProfileComboBox, &QComboBox::currentTextChanged, this, [this] { + GetGameTitle(); + std::string config_id = (ui->ProfileComboBox->currentText() == "Common Config") + ? "default" + : ui->ProfileComboBox->currentText().toStdString(); + SetUIValuestoMappings(config_id); + }); + + connect(ui->CopyCommonButton, &QPushButton::clicked, this, [this] { + if (ui->ProfileComboBox->currentText() == "Common Config") { + QMessageBox::information(this, "Common Config Selected", + "This button copies mappings from the Common Config to the " + "currently selected profile, and cannot be used when the " + "currently selected profile is the Common Config."); + } else { + QMessageBox::StandardButton reply = + QMessageBox::question(this, "Copy values from Common Config", + "Do you want to overwrite existing mappings with the " + "mappings from the Common Config?", + QMessageBox::Yes | QMessageBox::No); + if (reply == QMessageBox::Yes) { + SetUIValuestoMappings("default"); + } + } + }); + + connect(ui->DeadzoneOffsetSlider, &QSlider::valueChanged, this, [this](int value) { + QString DOSValue = QString::number(value / 100.0, 'f', 2); + QString DOSString = tr("Deadzone Offset (def 0.50): ") + DOSValue; + ui->DeadzoneOffsetLabel->setText(DOSString); + }); + + connect(ui->SpeedMultiplierSlider, &QSlider::valueChanged, this, [this](int value) { + QString SMSValue = QString::number(value / 10.0, 'f', 1); + QString SMSString = tr("Speed Multiplier (def 1.0): ") + SMSValue; + ui->SpeedMultiplierLabel->setText(SMSString); + }); + + connect(ui->SpeedOffsetSlider, &QSlider::valueChanged, this, [this](int value) { + QString SOSValue = QString::number(value / 1000.0, 'f', 3); + QString SOSString = tr("Speed Offset (def 0.125):") + " " + SOSValue; + ui->SpeedOffsetLabel->setText(SOSString); + }); +} + +void KBMSettings::ButtonConnects() { + connect(ui->CrossButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->CrossButton); }); + connect(ui->CircleButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->CircleButton); }); + connect(ui->TriangleButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->TriangleButton); }); + connect(ui->SquareButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->SquareButton); }); + + connect(ui->L1Button, &QPushButton::clicked, this, [this]() { StartTimer(ui->L1Button); }); + connect(ui->L2Button, &QPushButton::clicked, this, [this]() { StartTimer(ui->L2Button); }); + connect(ui->L3Button, &QPushButton::clicked, this, [this]() { StartTimer(ui->L3Button); }); + connect(ui->R1Button, &QPushButton::clicked, this, [this]() { StartTimer(ui->R1Button); }); + connect(ui->R2Button, &QPushButton::clicked, this, [this]() { StartTimer(ui->R2Button); }); + connect(ui->R3Button, &QPushButton::clicked, this, [this]() { StartTimer(ui->R3Button); }); + + connect(ui->TouchpadButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->TouchpadButton); }); + connect(ui->OptionsButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->OptionsButton); }); + + connect(ui->DpadUpButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->DpadUpButton); }); + connect(ui->DpadDownButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->DpadDownButton); }); + connect(ui->DpadLeftButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->DpadLeftButton); }); + connect(ui->DpadRightButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->DpadRightButton); }); + + connect(ui->LStickUpButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->LStickUpButton); }); + connect(ui->LStickDownButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->LStickDownButton); }); + connect(ui->LStickLeftButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->LStickLeftButton); }); + connect(ui->LStickRightButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->LStickRightButton); }); + + connect(ui->RStickUpButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->RStickUpButton); }); + connect(ui->RStickDownButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->RStickDownButton); }); + connect(ui->RStickLeftButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->RStickLeftButton); }); + connect(ui->RStickRightButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->RStickRightButton); }); + + connect(ui->LHalfButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->LHalfButton); }); + connect(ui->RHalfButton, &QPushButton::clicked, this, + [this]() { StartTimer(ui->RHalfButton); }); +} + +void KBMSettings::DisableMappingButtons() { + for (const auto& i : ButtonsList) { + i->setEnabled(false); + } +} + +void KBMSettings::EnableMappingButtons() { + for (const auto& i : ButtonsList) { + i->setEnabled(true); + } +} + +void KBMSettings::SaveKBMConfig(bool CloseOnSave) { + std::string output_string = "", input_string = ""; + std::vector lines, inputs; + + lines.push_back("#Feeling lost? Check out the Help section!"); + lines.push_back(""); + lines.push_back("#Keyboard bindings"); + lines.push_back(""); + + input_string = ui->CrossButton->text().toStdString(); + output_string = "cross"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->CircleButton->text().toStdString(); + output_string = "circle"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->TriangleButton->text().toStdString(); + output_string = "triangle"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->SquareButton->text().toStdString(); + output_string = "square"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + lines.push_back(""); + + input_string = ui->DpadUpButton->text().toStdString(); + output_string = "pad_up"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->DpadDownButton->text().toStdString(); + output_string = "pad_down"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->DpadLeftButton->text().toStdString(); + output_string = "pad_left"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->DpadRightButton->text().toStdString(); + output_string = "pad_right"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + lines.push_back(""); + + input_string = ui->L1Button->text().toStdString(); + output_string = "l1"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->R1Button->text().toStdString(); + output_string = "r1"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->L2Button->text().toStdString(); + output_string = "l2"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->R2Button->text().toStdString(); + output_string = "r2"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->L3Button->text().toStdString(); + output_string = "l3"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->R3Button->text().toStdString(); + output_string = "r3"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + lines.push_back(""); + + input_string = ui->OptionsButton->text().toStdString(); + output_string = "options"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->TouchpadButton->text().toStdString(); + output_string = "touchpad"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + lines.push_back(""); + + input_string = ui->LStickUpButton->text().toStdString(); + output_string = "axis_left_y_minus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->LStickDownButton->text().toStdString(); + output_string = "axis_left_y_plus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->LStickLeftButton->text().toStdString(); + output_string = "axis_left_x_minus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->LStickRightButton->text().toStdString(); + output_string = "axis_left_x_plus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + lines.push_back(""); + + input_string = ui->RStickUpButton->text().toStdString(); + output_string = "axis_right_y_minus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->RStickDownButton->text().toStdString(); + output_string = "axis_right_y_plus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->RStickLeftButton->text().toStdString(); + output_string = "axis_right_x_minus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->RStickRightButton->text().toStdString(); + output_string = "axis_right_x_plus"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + lines.push_back(""); + + input_string = ui->MouseJoystickBox->currentText().toStdString(); + output_string = "mouse_to_joystick"; + if (input_string != "unmapped") + lines.push_back(output_string + " = " + input_string); + + input_string = ui->LHalfButton->text().toStdString(); + output_string = "leftjoystick_halfmode"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + input_string = ui->RHalfButton->text().toStdString(); + output_string = "rightjoystick_halfmode"; + lines.push_back(output_string + " = " + input_string); + if (input_string != "unmapped") + inputs.push_back(input_string); + + std::string DOString = std::format("{:.2f}", (ui->DeadzoneOffsetSlider->value() / 100.f)); + std::string SMString = std::format("{:.1f}", (ui->SpeedMultiplierSlider->value() / 10.f)); + std::string SOString = std::format("{:.3f}", (ui->SpeedOffsetSlider->value() / 1000.f)); + input_string = DOString + ", " + SMString + ", " + SOString; + output_string = "mouse_movement_params"; + lines.push_back(output_string + " = " + input_string); + + lines.push_back(""); + + std::string config_id = (ui->ProfileComboBox->currentText() == "Common Config") + ? "default" + : ui->ProfileComboBox->currentText().toStdString(); + const auto config_file = Config::GetFoolproofKbmConfigFile(config_id); + std::fstream file(config_file); + int lineCount = 0; + std::string line; + while (std::getline(file, line)) { + lineCount++; + + if (line.empty()) { + lines.push_back(line); + continue; + } + + std::size_t comment_pos = line.find('#'); + if (comment_pos != std::string::npos) { + if (!line.contains("Keyboard bindings") && !line.contains("Feeling lost") && + !line.contains("Alternatives for users")) + lines.push_back(line); + continue; + } + + std::size_t equal_pos = line.find('='); + if (equal_pos == std::string::npos) { + lines.push_back(line); + continue; + } + + output_string = line.substr(0, equal_pos - 1); + input_string = line.substr(equal_pos + 2); + + if (std::find(ControllerInputs.begin(), ControllerInputs.end(), input_string) != + ControllerInputs.end() || + output_string == "analog_deadzone" || output_string == "override_controller_color") { + lines.push_back(line); + } + } + file.close(); + + // Prevent duplicate inputs for KBM as this breaks the engine + for (auto it = inputs.begin(); it != inputs.end(); ++it) { + if (std::find(it + 1, inputs.end(), *it) != inputs.end()) { + QMessageBox::information(this, "Unable to Save", + "Cannot bind any unique input more than once"); + return; + } + } + + std::vector save; + bool CurrentLineEmpty = false, LastLineEmpty = false; + for (auto const& line : lines) { + LastLineEmpty = CurrentLineEmpty ? true : false; + CurrentLineEmpty = line.empty() ? true : false; + if (!CurrentLineEmpty || !LastLineEmpty) + save.push_back(line); + } + + std::ofstream output_file(config_file); + for (auto const& line : save) { + output_file << line << '\n'; + } + output_file.close(); + + Config::SetUseUnifiedInputConfig(!ui->PerGameCheckBox->isChecked()); + Config::save(Common::FS::GetUserPath(Common::FS::PathType::UserDir) / "config.toml"); + + if (CloseOnSave) + QWidget::close(); +} + +void KBMSettings::SetDefault() { + ui->CrossButton->setText("kp2"); + ui->CircleButton->setText("kp6"); + ui->TriangleButton->setText("kp8"); + ui->SquareButton->setText("kp4"); + + ui->L1Button->setText("q"); + ui->L2Button->setText("e"); + ui->L3Button->setText("x"); + ui->R1Button->setText("u"); + ui->R2Button->setText("o"); + ui->R3Button->setText("m"); + + ui->TouchpadButton->setText("space"); + ui->OptionsButton->setText("enter"); + + ui->DpadUpButton->setText("up"); + ui->DpadDownButton->setText("down"); + ui->DpadLeftButton->setText("left"); + ui->DpadRightButton->setText("right"); + + ui->LStickUpButton->setText("w"); + ui->LStickDownButton->setText("s"); + ui->LStickLeftButton->setText("a"); + ui->LStickRightButton->setText("d"); + + ui->RStickUpButton->setText("i"); + ui->RStickDownButton->setText("k"); + ui->RStickLeftButton->setText("j"); + ui->RStickRightButton->setText("l"); + + ui->LHalfButton->setText("unmapped"); + ui->RHalfButton->setText("unmapped"); + + ui->MouseJoystickBox->setCurrentText("none"); + ui->DeadzoneOffsetSlider->setValue(50); + ui->SpeedMultiplierSlider->setValue(10); + ui->SpeedOffsetSlider->setValue(125); +} + +void KBMSettings::SetUIValuestoMappings(std::string config_id) { + const auto config_file = Config::GetFoolproofKbmConfigFile(config_id); + std::ifstream file(config_file); + + int lineCount = 0; + std::string line = ""; + while (std::getline(file, line)) { + lineCount++; + + std::size_t comment_pos = line.find('#'); + if (comment_pos != std::string::npos) + line = line.substr(0, comment_pos); + + std::size_t equal_pos = line.find('='); + if (equal_pos == std::string::npos) + continue; + + std::string output_string = line.substr(0, equal_pos - 1); + std::string input_string = line.substr(equal_pos + 2); + + if (std::find(ControllerInputs.begin(), ControllerInputs.end(), input_string) == + ControllerInputs.end()) { + + if (output_string == "cross") { + ui->CrossButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "circle") { + ui->CircleButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "square") { + ui->SquareButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "triangle") { + ui->TriangleButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "l1") { + ui->L1Button->setText(QString::fromStdString(input_string)); + } else if (output_string == "l2") { + ui->L2Button->setText(QString::fromStdString(input_string)); + } else if (output_string == "r1") { + ui->R1Button->setText(QString::fromStdString(input_string)); + } else if (output_string == "r2") { + ui->R2Button->setText(QString::fromStdString(input_string)); + } else if (output_string == "l3") { + ui->L3Button->setText(QString::fromStdString(input_string)); + } else if (output_string == "r3") { + ui->R3Button->setText(QString::fromStdString(input_string)); + } else if (output_string == "pad_up") { + ui->DpadUpButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "pad_down") { + ui->DpadDownButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "pad_left") { + ui->DpadLeftButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "pad_right") { + ui->DpadRightButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "options") { + ui->OptionsButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "touchpad") { + ui->TouchpadButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_left_x_minus") { + ui->LStickLeftButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_left_x_plus") { + ui->LStickRightButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_left_y_minus") { + ui->LStickUpButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_left_y_plus") { + ui->LStickDownButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_right_x_minus") { + ui->RStickLeftButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_right_x_plus") { + ui->RStickRightButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_right_y_minus") { + ui->RStickUpButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "axis_right_y_plus") { + ui->RStickDownButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "mouse_to_joystick") { + ui->MouseJoystickBox->setCurrentText(QString::fromStdString(input_string)); + } else if (output_string == "leftjoystick_halfmode") { + ui->LHalfButton->setText(QString::fromStdString(input_string)); + } else if (output_string == "rightjoystick_halfmode") { + ui->RHalfButton->setText(QString::fromStdString(input_string)); + } else if (output_string.contains("mouse_movement_params")) { + std::size_t comma_pos = line.find(','); + if (comma_pos != std::string::npos) { + std::string DOstring = line.substr(equal_pos + 1, comma_pos); + float DOffsetValue = std::stof(DOstring) * 100.0; + int DOffsetInt = int(DOffsetValue); + ui->DeadzoneOffsetSlider->setValue(DOffsetInt); + QString LabelValue = QString::number(DOffsetInt / 100.0, 'f', 2); + QString LabelString = tr("Deadzone Offset (def 0.50): ") + LabelValue; + ui->DeadzoneOffsetLabel->setText(LabelString); + + std::string SMSOstring = line.substr(comma_pos + 1); + std::size_t comma_pos2 = SMSOstring.find(','); + if (comma_pos2 != std::string::npos) { + std::string SMstring = SMSOstring.substr(0, comma_pos2); + float SpeedMultValue = std::stof(SMstring) * 10.0; + int SpeedMultInt = int(SpeedMultValue); + if (SpeedMultInt < 1) + SpeedMultInt = 1; + if (SpeedMultInt > 50) + SpeedMultInt = 50; + ui->SpeedMultiplierSlider->setValue(SpeedMultInt); + LabelValue = QString::number(SpeedMultInt / 10.0, 'f', 1); + LabelString = tr("Speed Multiplier (def 1.0): ") + LabelValue; + ui->SpeedMultiplierLabel->setText(LabelString); + + std::string SOstring = SMSOstring.substr(comma_pos2 + 1); + float SOffsetValue = std::stof(SOstring) * 1000.0; + int SOffsetInt = int(SOffsetValue); + ui->SpeedOffsetSlider->setValue(SOffsetInt); + LabelValue = QString::number(SOffsetInt / 1000.0, 'f', 3); + LabelString = tr("Speed Offset (def 0.125): ") + LabelValue; + ui->SpeedOffsetLabel->setText(LabelString); + } + } + } + } + } + file.close(); +} + +void KBMSettings::GetGameTitle() { + if (ui->ProfileComboBox->currentText() == "Common Config") { + ui->TitleLabel->setText("Common Config"); + } else { + for (int i = 0; i < m_game_info->m_games.size(); i++) { + if (m_game_info->m_games[i].serial == + ui->ProfileComboBox->currentText().toStdString()) { + ui->TitleLabel->setText(QString::fromStdString(m_game_info->m_games[i].name)); + } + } + } +} + +void KBMSettings::onHelpClicked() { + if (!HelpWindowOpen) { + HelpWindow = new HelpDialog(&HelpWindowOpen, this); + HelpWindow->setWindowTitle("Help"); + HelpWindow->setAttribute(Qt::WA_DeleteOnClose); // Clean up on close + HelpWindow->show(); + HelpWindowOpen = true; + } else { + HelpWindow->close(); + HelpWindowOpen = false; + } +} + +void KBMSettings::StartTimer(QPushButton*& button) { + MappingTimer = 3; + EnableMapping = true; + MappingCompleted = false; + modifier = ""; + mapping = button->text(); + + DisableMappingButtons(); + button->setText("Press a key [" + QString::number(MappingTimer) + "]"); + timer = new QTimer(this); + MappingButton = button; + connect(timer, &QTimer::timeout, this, [this]() { CheckMapping(MappingButton); }); + timer->start(1000); +} + +void KBMSettings::CheckMapping(QPushButton*& button) { + MappingTimer -= 1; + button->setText("Press a key [" + QString::number(MappingTimer) + "]"); + + if (MappingCompleted) { + EnableMapping = false; + EnableMappingButtons(); + timer->stop(); + + if (mapping == "lshift" || mapping == "lalt" || mapping == "lctrl" || mapping == "lmeta" || + mapping == "lwin") { + modifier = ""; + } + + if (modifier != "") { + button->setText(modifier + ", " + mapping); + } else { + button->setText(mapping); + } + } + + if (MappingTimer <= 0) { + button->setText(mapping); + EnableMapping = false; + EnableMappingButtons(); + timer->stop(); + } +} + +void KBMSettings::SetMapping(QString input) { + mapping = input; + MappingCompleted = true; +} + +bool KBMSettings::eventFilter(QObject* obj, QEvent* event) { + if (event->type() == QEvent::Close) { + if (HelpWindowOpen) { + HelpWindow->close(); + HelpWindowOpen = false; + } + } + + if (EnableMapping) { + if (Qt::ShiftModifier & QApplication::keyboardModifiers()) { + modifier = "lshift"; + } else if (Qt::AltModifier & QApplication::keyboardModifiers()) { + modifier = "lalt"; + } else if (Qt::ControlModifier & QApplication::keyboardModifiers()) { + modifier = "lctrl"; + } else if (Qt::MetaModifier & QApplication::keyboardModifiers()) { +#ifdef _WIN32 + modifier = "lwin"; +#else + modifier = "lmeta"; +#endif + } + + if (event->type() == QEvent::KeyPress) { + QKeyEvent* keyEvent = static_cast(event); + + switch (keyEvent->key()) { + case Qt::Key_Space: + SetMapping("space"); + break; + case Qt::Key_Comma: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kpcomma"); + } else { + SetMapping("comma"); + } + break; + case Qt::Key_Period: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kpperiod"); + } else { + SetMapping("period"); + } + break; + case Qt::Key_Slash: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) + SetMapping("kpdivide"); + break; + case Qt::Key_Asterisk: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) + SetMapping("kpmultiply"); + break; + case Qt::Key_Question: + SetMapping("question"); + break; + case Qt::Key_Semicolon: + SetMapping("semicolon"); + break; + case Qt::Key_Minus: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kpminus"); + } else { + SetMapping("minus"); + } + break; + case Qt::Key_Plus: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kpplus"); + } else { + SetMapping("plus"); + } + break; + case Qt::Key_ParenLeft: + SetMapping("lparenthesis"); + break; + case Qt::Key_ParenRight: + SetMapping("rparenthesis"); + break; + case Qt::Key_BracketLeft: + SetMapping("lbracket"); + break; + case Qt::Key_BracketRight: + SetMapping("rbracket"); + break; + case Qt::Key_BraceLeft: + SetMapping("lbrace"); + break; + case Qt::Key_BraceRight: + SetMapping("rbrace"); + break; + case Qt::Key_Backslash: + SetMapping("backslash"); + break; + case Qt::Key_Tab: + SetMapping("tab"); + break; + case Qt::Key_Backspace: + SetMapping("backspace"); + break; + case Qt::Key_Return: + SetMapping("enter"); + break; + case Qt::Key_Enter: + SetMapping("kpenter"); + break; + case Qt::Key_Escape: + SetMapping("unmapped"); + break; + case Qt::Key_Shift: + SetMapping("lshift"); + break; + case Qt::Key_Alt: + SetMapping("lalt"); + break; + case Qt::Key_Control: + SetMapping("lctrl"); + break; + case Qt::Key_Meta: + activateWindow(); +#ifdef _WIN32 + SetMapping("lwin"); +#else + SetMapping("lmeta"); +#endif + case Qt::Key_1: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp1"); + } else { + SetMapping("1"); + } + break; + case Qt::Key_2: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp2"); + } else { + SetMapping("2"); + } + break; + case Qt::Key_3: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp3"); + } else { + SetMapping("3"); + } + break; + case Qt::Key_4: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp4"); + } else { + SetMapping("4"); + } + break; + case Qt::Key_5: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp5"); + } else { + SetMapping("5"); + } + break; + case Qt::Key_6: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp6"); + } else { + SetMapping("6"); + } + break; + case Qt::Key_7: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp7"); + } else { + SetMapping("7"); + } + break; + case Qt::Key_8: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp8"); + } else { + SetMapping("8"); + } + break; + case Qt::Key_9: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp9"); + } else { + SetMapping("9"); + } + break; + case Qt::Key_0: + if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { + SetMapping("kp0"); + } else { + SetMapping("0"); + } + break; + case Qt::Key_Up: + activateWindow(); + SetMapping("up"); + break; + case Qt::Key_Down: + SetMapping("down"); + break; + case Qt::Key_Left: + SetMapping("left"); + break; + case Qt::Key_Right: + SetMapping("right"); + break; + case Qt::Key_A: + SetMapping("a"); + break; + case Qt::Key_B: + SetMapping("b"); + break; + case Qt::Key_C: + SetMapping("c"); + break; + case Qt::Key_D: + SetMapping("d"); + break; + case Qt::Key_E: + SetMapping("e"); + break; + case Qt::Key_F: + SetMapping("f"); + break; + case Qt::Key_G: + SetMapping("g"); + break; + case Qt::Key_H: + SetMapping("h"); + break; + case Qt::Key_I: + SetMapping("i"); + break; + case Qt::Key_J: + SetMapping("j"); + break; + case Qt::Key_K: + SetMapping("k"); + break; + case Qt::Key_L: + SetMapping("l"); + break; + case Qt::Key_M: + SetMapping("m"); + break; + case Qt::Key_N: + SetMapping("n"); + break; + case Qt::Key_O: + SetMapping("o"); + break; + case Qt::Key_P: + SetMapping("p"); + break; + case Qt::Key_Q: + SetMapping("q"); + break; + case Qt::Key_R: + SetMapping("r"); + break; + case Qt::Key_S: + SetMapping("s"); + break; + case Qt::Key_T: + SetMapping("t"); + break; + case Qt::Key_U: + SetMapping("u"); + break; + case Qt::Key_V: + SetMapping("v"); + break; + case Qt::Key_W: + SetMapping("w"); + break; + case Qt::Key_X: + SetMapping("x"); + break; + case Qt::Key_Y: + SetMapping("Y"); + break; + case Qt::Key_Z: + SetMapping("z"); + break; + default: + break; + } + return true; + } + + if (event->type() == QEvent::MouseButtonPress) { + QMouseEvent* mouseEvent = static_cast(event); + switch (mouseEvent->button()) { + case Qt::LeftButton: + SetMapping("leftbutton"); + break; + case Qt::RightButton: + SetMapping("rightbutton"); + break; + case Qt::MiddleButton: + SetMapping("middlebutton"); + break; + default: + break; + } + return true; + } + + const QList AxisList = { + ui->LStickUpButton, ui->LStickDownButton, ui->LStickLeftButton, ui->LStickRightButton, + ui->RStickUpButton, ui->LStickDownButton, ui->LStickLeftButton, ui->RStickRightButton}; + + if (event->type() == QEvent::Wheel) { + QWheelEvent* wheelEvent = static_cast(event); + if (wheelEvent->angleDelta().y() > 5) { + if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { + SetMapping("mousewheelup"); + } else { + QMessageBox::information(this, "Cannot set mapping", + "Mousewheel cannot be mapped to stick outputs"); + } + } else if (wheelEvent->angleDelta().y() < -5) { + if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { + SetMapping("mousewheeldown"); + } else { + QMessageBox::information(this, "Cannot set mapping", + "Mousewheel cannot be mapped to stick outputs"); + } + } + if (wheelEvent->angleDelta().x() > 5) { + if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { + // QT changes scrolling to horizontal for all widgets with the alt modifier + if (Qt::AltModifier & QApplication::keyboardModifiers()) { + SetMapping("mousewheelup"); + } else { + SetMapping("mousewheelright"); + } + } else { + QMessageBox::information(this, "Cannot set mapping", + "Mousewheel cannot be mapped to stick outputs"); + } + } else if (wheelEvent->angleDelta().x() < -5) { + if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { + if (Qt::AltModifier & QApplication::keyboardModifiers()) { + SetMapping("mousewheeldown"); + } else { + SetMapping("mousewheelleft"); + } + } else { + QMessageBox::information(this, "Cannot set mapping", + "Mousewheel cannot be mapped to stick outputs"); + } + } + return true; + } + } + return QDialog::eventFilter(obj, event); +} + +KBMSettings::~KBMSettings() {} diff --git a/src/qt_gui/kbm_gui.h b/src/qt_gui/kbm_gui.h new file mode 100644 index 000000000..e63d7bd43 --- /dev/null +++ b/src/qt_gui/kbm_gui.h @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include "game_info.h" + +namespace Ui { +class KBMSettings; +} + +class KBMSettings : public QDialog { + Q_OBJECT +public: + explicit KBMSettings(std::shared_ptr game_info_get, QWidget* parent = nullptr); + ~KBMSettings(); + +private Q_SLOTS: + void SaveKBMConfig(bool CloseOnSave); + void SetDefault(); + void CheckMapping(QPushButton*& button); + void StartTimer(QPushButton*& button); + void onHelpClicked(); + +private: + std::unique_ptr ui; + std::shared_ptr m_game_info; + + bool eventFilter(QObject* obj, QEvent* event) override; + void ButtonConnects(); + void SetUIValuestoMappings(std::string config_id); + void GetGameTitle(); + void DisableMappingButtons(); + void EnableMappingButtons(); + void SetMapping(QString input); + + bool EnableMapping = false; + bool MappingCompleted = false; + bool HelpWindowOpen = false; + QString mapping; + QString modifier; + int MappingTimer; + QTimer* timer; + QPushButton* MappingButton; + QList ButtonsList; + + const std::vector ControllerInputs = { + "cross", "circle", "square", "triangle", "l1", + "r1", "l2", "r2", "l3", + + "r3", "options", "pad_up", + + "pad_down", + + "pad_left", "pad_right", "axis_left_x", "axis_left_y", "axis_right_x", + "axis_right_y", "back"}; +}; diff --git a/src/qt_gui/kbm_gui.ui b/src/qt_gui/kbm_gui.ui new file mode 100644 index 000000000..fb8e4882b --- /dev/null +++ b/src/qt_gui/kbm_gui.ui @@ -0,0 +1,1708 @@ + + + + KBMSettings + + + Qt::WindowModality::WindowModal + + + + 0 + 0 + 1193 + 754 + + + + Qt::FocusPolicy::StrongFocus + + + Configure Controls + + + true + + + + + + Qt::FocusPolicy::NoFocus + + + true + + + + + 0 + 0 + 1173 + 704 + + + + + + 0 + 0 + 1171 + 703 + + + + + + + 5 + + + + + true + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + D-Pad + + + + 6 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 160 + 0 + + + + + 0 + 16777215 + + + + Up + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 160 + 0 + + + + + 124 + 16777215 + + + + Down + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Maximum + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Left Analog Halfmode + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + true + + + + hold to move left stick at half-speed + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Left Stick + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 16777215 + 2121 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 160 + 0 + + + + + 124 + 16777215 + + + + Up + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + 179 + 16777215 + + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 160 + 0 + + + + + 124 + 21212 + + + + Down + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + + + + 0 + + + + + + 0 + 0 + + + + + 12 + true + + + + Config Selection + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + + 9 + false + + + + Qt::FocusPolicy::NoFocus + + + + + + -1 + + + Common Config + + + + + + + + 10 + true + + + + Common Config + + + Qt::AlignmentFlag::AlignCenter + + + true + + + + + + + + + + + + 0 + 0 + + + + + 9 + false + + + + Qt::FocusPolicy::NoFocus + + + Use per-game configs + + + + + + + + 9 + false + + + + Qt::FocusPolicy::NoFocus + + + Copy from Common Config + + + + + + + + + + + + 0 + + + + + + + L1 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + 160 + 0 + + + + L2 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + true + + + + + + + + + + Qt::FocusPolicy::NoFocus + + + Text Editor + + + + + + + Qt::FocusPolicy::NoFocus + + + Help + + + + + + + + + + + + + + + 160 + 0 + + + + R1 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + R2 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + 0 + 200 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 420 + 200 + + + + :/images/KBM.png + + + true + + + Qt::AlignmentFlag::AlignBottom|Qt::AlignmentFlag::AlignHCenter + + + + + + + + + + 0 + + + QLayout::SizeConstraint::SetDefaultConstraint + + + + + + + + 160 + 0 + + + + L3 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + Touchpad Click + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + Mouse to Joystick + + + + + + Qt::FocusPolicy::NoFocus + + + + + + + + true + + + + *press F7 ingame to activate + + + true + + + + + + + + + + + + + + + 160 + 0 + + + + R3 + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + 145 + 0 + + + + Options + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + + + + + false + + + + Mouse Movement Parameters + + + + + + + + + false + + + + Deadzone Offset (def 0.50): 0.50 + + + + + + + + 0 + 0 + + + + Qt::FocusPolicy::NoFocus + + + 100 + + + 50 + + + Qt::Orientation::Horizontal + + + + + + + + + + + + false + + + + Speed Multiplier (def 1.0): 1.0 + + + + + + + + 0 + 0 + + + + Qt::FocusPolicy::NoFocus + + + 1 + + + 50 + + + 5 + + + 10 + + + Qt::Orientation::Horizontal + + + + + + + + + + + + false + + + + Speed Offset (def 0.125): 0.125 + + + + + + + + 0 + 0 + + + + Qt::FocusPolicy::NoFocus + + + 1000 + + + 100 + + + 125 + + + Qt::Orientation::Horizontal + + + + + + + + + + + + + + + + + true + false + + + + note: click Help Button/Special Keybindings for more information + + + + + + + + + 5 + + + + + + 0 + 0 + + + + Face Buttons + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 160 + 0 + + + + + 0 + 16777215 + + + + Triangle + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + Square + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + Circle + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 160 + 0 + + + + + 124 + 16777215 + + + + Cross + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + + Qt::Orientation::Vertical + + + QSizePolicy::Policy::Maximum + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + Right Analog Halfmode + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + true + + + + hold to move right stick at half-speed + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Right Stick + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 160 + 0 + + + + + 124 + 1231321 + + + + Up + + + + + + + 0 + 0 + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + Left + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + Right + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 160 + 0 + + + + + 124 + 2121 + + + + Down + + + + + + Qt::FocusPolicy::NoFocus + + + unmapped + + + + + + + + + + + + + + + + + + + + + + + QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save + + + false + + + + + + + + + + diff --git a/src/qt_gui/main_window.cpp b/src/qt_gui/main_window.cpp index d9fb45fac..bde32a52d 100644 --- a/src/qt_gui/main_window.cpp +++ b/src/qt_gui/main_window.cpp @@ -21,11 +21,10 @@ #include "core/loader.h" #include "game_install_dialog.h" #include "install_dir_select.h" +#include "kbm_gui.h" #include "main_window.h" #include "settings_dialog.h" -#include "kbm_config_dialog.h" - #include "video_core/renderer_vulkan/vk_instance.h" #ifdef ENABLE_DISCORD_RPC #include "common/discord_rpc_handler.h" @@ -348,14 +347,13 @@ void MainWindow::CreateConnects() { settingsDialog->exec(); }); - // this is the editor for kbm keybinds connect(ui->controllerButton, &QPushButton::clicked, this, [this]() { auto configWindow = new ControlSettings(m_game_info, this); configWindow->exec(); }); connect(ui->keyboardButton, &QPushButton::clicked, this, [this]() { - auto kbmWindow = new EditorDialog(this); + auto kbmWindow = new KBMSettings(m_game_info, this); kbmWindow->exec(); }); diff --git a/src/shadps4.qrc b/src/shadps4.qrc index 14b50f7a5..a1ff680ed 100644 --- a/src/shadps4.qrc +++ b/src/shadps4.qrc @@ -32,5 +32,6 @@ images/website.png images/ps4_controller.png images/keyboard_icon.png + images/KBM.png From a4b35f275cad0555bae8ed23a8e8615dc0a849d8 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Tue, 4 Mar 2025 18:25:42 +0800 Subject: [PATCH 385/455] Add global/common user folder for Windows (#2589) * Add global windows user folder * Add button for creating portable folder * Add notice about restarting after creating the portable folder --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/common/path_util.cpp | 6 +++ src/qt_gui/settings_dialog.cpp | 19 ++++++++ src/qt_gui/settings_dialog.ui | 84 +++++++++++++++++++++++++++------- 3 files changed, 92 insertions(+), 17 deletions(-) diff --git a/src/common/path_util.cpp b/src/common/path_util.cpp index 6bc73ee43..702d0fabc 100644 --- a/src/common/path_util.cpp +++ b/src/common/path_util.cpp @@ -17,6 +17,8 @@ #ifdef _WIN32 // This is the maximum number of UTF-16 code units permissible in Windows file paths #define MAX_PATH 260 +#include +#include #else // This is the maximum number of UTF-8 code units permissible in all other OSes' file paths #define MAX_PATH 1024 @@ -106,6 +108,10 @@ static auto UserPaths = [] { } else { user_dir = std::filesystem::path(getenv("HOME")) / ".local" / "share" / "shadPS4"; } +#elif _WIN32 + TCHAR appdata[MAX_PATH] = {0}; + SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, appdata); + user_dir = std::filesystem::path(appdata) / "shadPS4"; #endif } diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index 8bd72a237..69f5d3c8a 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "common/config.h" @@ -234,6 +235,21 @@ SettingsDialog::SettingsDialog(std::span physical_devices, Common::FS::GetUserPath(Common::FS::PathType::CustomTrophy)); QDesktopServices::openUrl(QUrl::fromLocalFile(userPath)); }); + + connect(ui->PortableUserButton, &QPushButton::clicked, this, []() { + QString userDir; + Common::FS::PathToQString(userDir, std::filesystem::current_path() / "user"); + if (std::filesystem::exists(std::filesystem::current_path() / "user")) { + QMessageBox::information(NULL, "Cannot create portable user folder", + userDir + " already exists"); + } else { + std::filesystem::copy(Common::FS::GetUserPath(Common::FS::PathType::UserDir), + std::filesystem::current_path() / "user", + std::filesystem::copy_options::recursive); + QMessageBox::information(NULL, "Portable user folder created", + userDir + " successfully created"); + } + }); } // Input TAB @@ -344,6 +360,7 @@ SettingsDialog::SettingsDialog(std::span physical_devices, ui->saveDataGroupBox->installEventFilter(this); ui->currentSaveDataPath->installEventFilter(this); ui->browseButton->installEventFilter(this); + ui->PortableUserFolderGroupBox->installEventFilter(this); // Debug ui->debugDump->installEventFilter(this); @@ -650,6 +667,8 @@ void SettingsDialog::updateNoteTextEdit(const QString& elementName) { text = tr("Add:\\nAdd a folder to the list."); } else if (elementName == "removeFolderButton") { text = tr("Remove:\\nRemove a folder from the list."); + } else if (elementName == "PortableUserFolderGroupBox") { + text = tr("Portable user folder:\\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it."); } // Save Data diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 7db0afa59..5600a0db7 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -31,7 +31,7 @@ Settings - + :/images/shadps4.ico:/images/shadps4.ico @@ -59,7 +59,7 @@ - 0 + 5 @@ -74,7 +74,7 @@ 0 0 946 - 545 + 536 @@ -130,9 +130,6 @@ 9 - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop - @@ -455,7 +452,7 @@ 0 0 946 - 545 + 536 @@ -904,7 +901,7 @@ 0 0 946 - 545 + 536 @@ -1199,7 +1196,7 @@ 0 0 946 - 545 + 536 @@ -1306,14 +1303,14 @@ Top - + Bottom - + @@ -1335,8 +1332,7 @@ - - + @@ -1442,7 +1438,7 @@ 0 0 946 - 545 + 536 @@ -1726,7 +1722,7 @@ 0 0 946 - 545 + 536 @@ -1800,6 +1796,58 @@ + + + + Portable User Folder + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Create Portable User Folder from Common User Folder + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + @@ -1816,7 +1864,7 @@ 0 0 946 - 545 + 536 @@ -2068,6 +2116,8 @@ - + + + From 367f08c1b53e31c2688cc839b33e9a6bc6c14028 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 4 Mar 2025 12:39:25 +0200 Subject: [PATCH 386/455] [ci skip] Qt GUI: Update Translation. (#2590) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 175 +++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index df4abdbf0..2aa65e9d1 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -903,6 +903,169 @@ + + KBMSettings + + Configure Controls + + + + D-Pad + + + + Up + + + + unmapped + + + + Left + Left + + + Right + Right + + + Down + + + + Left Analog Halfmode + + + + hold to move left stick at half-speed + + + + Left Stick + + + + Config Selection + + + + Common Config + + + + Use per-game configs + + + + Copy from Common Config + + + + L1 + + + + L2 + + + + Text Editor + + + + Help + Help + + + R1 + + + + R2 + + + + L3 + + + + Touchpad Click + + + + Mouse to Joystick + + + + *press F7 ingame to activate + + + + R3 + + + + Options + + + + Mouse Movement Parameters + + + + note: click Help Button/Special Keybindings for more information + + + + Face Buttons + + + + Triangle + + + + Square + + + + Circle + + + + Cross + + + + Right Analog Halfmode + + + + hold to move right stick at half-speed + + + + Right Stick + + + + Deadzone Offset (def 0.50): + + + + Speed Multiplier (def 1.0): + + + + Speed Offset (def 0.125): + + + + Speed Offset (def 0.125): + + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + + + + Create Portable User Folder from Common User Folder + + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + + TrophyViewer From e82c8d2f70996e0f2eb042c41e89fb634e305567 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 4 Mar 2025 12:39:43 +0200 Subject: [PATCH 387/455] New Crowdin updates (#2584) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Italian) * New translations en_us.ts (Russian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Russian) * New translations en_us.ts (Portuguese) --- src/qt_gui/translations/ar_SA.ts | 12 ++++++++-- src/qt_gui/translations/da_DK.ts | 12 ++++++++-- src/qt_gui/translations/de_DE.ts | 12 ++++++++-- src/qt_gui/translations/el_GR.ts | 12 ++++++++-- src/qt_gui/translations/es_ES.ts | 12 ++++++++-- src/qt_gui/translations/fa_IR.ts | 12 ++++++++-- src/qt_gui/translations/fi_FI.ts | 12 ++++++++-- src/qt_gui/translations/fr_FR.ts | 12 ++++++++-- src/qt_gui/translations/hu_HU.ts | 12 ++++++++-- src/qt_gui/translations/id_ID.ts | 12 ++++++++-- src/qt_gui/translations/it_IT.ts | 12 ++++++++-- src/qt_gui/translations/ja_JP.ts | 12 ++++++++-- src/qt_gui/translations/ko_KR.ts | 12 ++++++++-- src/qt_gui/translations/lt_LT.ts | 12 ++++++++-- src/qt_gui/translations/nb_NO.ts | 12 ++++++++-- src/qt_gui/translations/nl_NL.ts | 12 ++++++++-- src/qt_gui/translations/pl_PL.ts | 12 ++++++++-- src/qt_gui/translations/pt_BR.ts | 18 ++++++++++---- src/qt_gui/translations/pt_PT.ts | 40 +++++++++++++++++++------------- src/qt_gui/translations/ro_RO.ts | 12 ++++++++-- src/qt_gui/translations/ru_RU.ts | 12 ++++++++-- src/qt_gui/translations/sq_AL.ts | 12 ++++++++-- src/qt_gui/translations/sv_SE.ts | 14 ++++++++--- src/qt_gui/translations/tr_TR.ts | 12 ++++++++-- src/qt_gui/translations/uk_UA.ts | 12 ++++++++-- src/qt_gui/translations/vi_VN.ts | 12 ++++++++-- src/qt_gui/translations/zh_CN.ts | 12 ++++++++-- src/qt_gui/translations/zh_TW.ts | 12 ++++++++-- 28 files changed, 298 insertions(+), 74 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 493a33f82..44d68dcb4 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index 6e8c8a6ff..a9871f21d 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 64b28c179..97eb99d0d 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -1632,8 +1632,8 @@ Aktualisiere Kompatibilitätsdatenbank:\nAktualisiere sofort die Kompatibilitätsdatenbank. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index 3d0b89bb8..c409d558d 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index a9db8860e..c6caed584 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index da9424a3a..17a1ecfad 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -1632,8 +1632,8 @@ به‌روزرسانی پایگاه داده سازگاری:\nپایگاه داده سازگاری را بلافاصله به‌روزرسانی می‌کند. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index f20461015..74d9bb518 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -1632,8 +1632,8 @@ Päivitä Yhteensopivuustietokanta:\nPäivitää yhteensopivuustietokannan heti. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index 41a588aee..ecbe88b1e 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -1632,8 +1632,8 @@ Mettre à jour la compatibilité au démarrage:\nMet à jour immédiatement la base de données de compatibilité. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index 35ad71d59..aa123ccf2 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index 25835f925..bd8f6b11d 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index a3f06591d..032234300 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -1632,8 +1632,8 @@ Aggiorna Database Compatibilità:\nAggiorna immediatamente il database di compatibilità. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Apri la cartella personalizzata delle immagini/suoni dei trofei:\nPuoi aggiungere immagini e audio personalizzato ai trofei.\nAggiungi i file in custom_trophy con i seguenti nomi:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Destra + + Top + In alto + + + Bottom + In basso + Notification Duration Durata Notifica diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index f9f4d6370..7350057dd 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -1632,8 +1632,8 @@ 互換性データベースを更新する:\n今すぐ互換性データベースを更新します。 - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 3e6c26dde..6bc8ddfb1 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index c9be4c048..c384da08b 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index d163396ee..89400aaa4 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -1632,8 +1632,8 @@ Oppdater kompatibilitets-database:\nOppdater kompatibilitets-databasen nå. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Åpne mappa med tilpassede bilder og lyder for trofé:\nDu kan legge til tilpassede bilder til trofeene og en lyd.\nLegg filene til custom_trophy med følgende navn:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Åpne mappa med tilpassede bilder og lyder for trofé:\nDu kan legge til tilpassede bilder til trofeer med en lyd.\nLegg filene til custom_trophy med følgende navn:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nMerk: Avspilling av lyden vil bare fungere med Qt versjonen. Never @@ -1839,6 +1839,14 @@ Right Høyre + + Top + Øverst + + + Bottom + Nederst + Notification Duration Varslingsvarighet diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index a61ca1adf..924f59ef7 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 64134d055..8a8ac83f7 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -1632,8 +1632,8 @@ Zaktualizuj bazę danych zgodności:\nNatychmiast zaktualizuj bazę danych zgodności. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Otwórz niestandardowy folder obrazów/dźwięków:\nMożesz dodać własne obrazy do trofeów i dźwięku.\nDodaj pliki do custom_trophy o następujących nazwach:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Z prawej + + Top + Z góry + + + Bottom + Z dołu + Notification Duration Czas trwania powiadomienia diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 103f0b66e..5fe1774ba 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -733,7 +733,7 @@ Open Log Folder - Abrir Pasta de Registros + Abrir Pasta de Log Copy info... @@ -1517,7 +1517,7 @@ Update Compatibility Database On Startup - Atualizar Base de Dados de Compatibilidade ao Inicializar + Atualizar Banco de Dados de Compatibilidade ao Inicializar Game Compatibility @@ -1589,7 +1589,7 @@ Log Filter:\nFilters the log to only print specific information.\nExamples: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nLevels: Trace, Debug, Info, Warning, Error, Critical - in this order, a specific level silences all levels preceding it in the list and logs every level after it. - Filtro de Registro:\nFiltra o registro para exibir apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - nesta ordem, um nível específico silencia todos os níveis anteriores na lista e registra todos os níveis após ele. + Filtro do Registro:\nFiltra o registro para exibir apenas informações específicas.\nExemplos: "Core:Trace" "Lib.Pad:Debug Common.Filesystem:Error" "*:Critical"\nNíveis: Trace, Debug, Info, Warning, Error, Critical - nesta ordem, um nível específico silencia todos os níveis anteriores na lista e registra todos os níveis após este. Update:\nRelease: Official versions released every month that may be very outdated, but are more reliable and tested.\nNightly: Development versions that have all the latest features and fixes, but may contain bugs and are less stable. @@ -1632,8 +1632,8 @@ Atualizar Lista de Compatibilidade:\nAtualiza imediatamente o banco de dados de compatibilidade. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Abrir a pasta de imagens/sons de troféus personalizados:\nVocê pode adicionar imagens e sons personalizados aos troféus.\nAdicione os arquivos em custom_trophy com os seguintes nomes:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Abrir a pasta de imagens/sons de troféus personalizados:\nVocê pode adicionar imagens personalizadas aos troféus e um áudio.\nAdicione os arquivos na pasta custom_trophy com os seguintes nomes:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservação: O som funcionará apenas em versões Qt. Never @@ -1839,6 +1839,14 @@ Right Direita + + Top + Acima + + + Bottom + Abaixo + Notification Duration Duração da Notificação diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index 8db33ca5b..b279d1c5b 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -777,7 +777,7 @@ Delete Trophy - Delete Trophy + Eliminar Troféu Compatibility... @@ -857,7 +857,7 @@ No log file found for this game! - No log file found for this game! + Não foi encontrado nenhum ficheiro de registo para este jogo! Failed to convert icon. @@ -869,7 +869,7 @@ This game has no saved trophies to delete! - This game has no saved trophies to delete! + Este jogo não tem troféus guardados para eliminar! Save Data @@ -877,7 +877,7 @@ Trophy - Trophy + Troféus SFO Viewer for @@ -1329,7 +1329,7 @@ Open the custom trophy images/sounds folder - Open the custom trophy images/sounds folder + Abrir a pasta de imagens/sons de troféus personalizados Logger @@ -1497,7 +1497,7 @@ Disable Trophy Notification - Disable Trophy Notification + Desativar Notificações de Troféus Background Image @@ -1632,8 +1632,8 @@ Atualizar Base de Dados de Compatibilidade:\nAtualiza imediatamente a base de dados de compatibilidade. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Abrir a pasta de imagens/sons de troféus personalizados:\nPoderá adicionar imagens personalizadas aos troféus e um áudio.\nAdicione os ficheiros na pasta custom_trophy com os seguintes nomes:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservação: O som funcionará apenas nas versões Qt. Never @@ -1829,19 +1829,27 @@ Trophy Notification Position - Trophy Notification Position + Posição da Notificação do Troféu Left - Left + Esquerda Right - Right + Direita + + + Top + Acima + + + Bottom + Abaixo Notification Duration - Notification Duration + Duração da Notificação @@ -1852,19 +1860,19 @@ Progress - Progress + Progresso Show Earned Trophies - Show Earned Trophies + Mostrar Troféus Conquistados Show Not Earned Trophies - Show Not Earned Trophies + Mostrar Troféus Não Conquistados Show Hidden Trophies - Show Hidden Trophies + Mostrar Troféus Ocultos diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index be1613c57..e57b23150 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index 313233c92..c454ead29 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -1632,8 +1632,8 @@ Обновить базу совместимости:\nНемедленно обновить базу данных совместимости. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Открыть пользовательскую папку с трофеями изображений/звуков:\nВы можете добавить пользовательские изображения к трофеям и аудио.\nДобавьте файлы в custom_trophy со следующими именами:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Открыть папку с пользовательскими изображениями/звуками трофеев:\nВы можете добавить пользовательские изображения к трофеям и аудио.\nДобавьте файлы в custom_trophy со следующими именами:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nПримечание: звук будет работать только в QT-версии. Never @@ -1839,6 +1839,14 @@ Right Вправо + + Top + Сверху + + + Bottom + Снизу + Notification Duration Продолжительность уведомления diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 0783fb1a7..0b75e767d 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -1632,8 +1632,8 @@ Përditëso bazën e të dhënave të përputhshmërisë:\nPërditëso menjëherë bazën e të dhënave të përputhshmërisë. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Hap dosjen e imazheve/tingujve të trofeve të personalizuar:\nMund të shtosh imazhe të personalizuara për trofetë dhe një skedar audio.\nShto skedarët në dosjen custom_trophy me emrat që vijojnë:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Hap dosjen e imazheve/tingujve të trofeve të personalizuar:\nMund të shtosh imazhe të personalizuara për trofetë dhe një audio.\nShto skedarët në dosjen custom_trophy me emrat që vijojnë:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nShënim: Tingulli do të punojë vetëm në versionet QT. Never @@ -1839,6 +1839,14 @@ Right Djathtas + + Top + Sipër + + + Bottom + Poshtë + Notification Duration Kohëzgjatja e Njoftimit diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index 6cbd33f17..f317b1974 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -1329,7 +1329,7 @@ Open the custom trophy images/sounds folder - Öppna mapp för anpassade trofébilder/ljud + Öppna mappen för anpassade trofébilder/ljud Logger @@ -1632,8 +1632,8 @@ Uppdatera kompatibilitetsdatabasen:\nUppdaterar kompatibilitetsdatabasen direkt - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Öppna mappen med anpassade trofébilder/ljud:\nDu kan lägga till anpassade bilder till troféerna och ett ljud.\nLägg till filerna i custom_trophy med följande namn:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Öppna mappen för anpassade trofébilder/ljud:\nDu kan lägga till anpassade bilder till troféerna och ett ljud.\nLägg till filerna i custom_trophy med följande namn:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nObservera: Ljudet fungerar endast i QT-versioner. Never @@ -1839,6 +1839,14 @@ Right Höger + + Top + Överst + + + Bottom + Nederst + Notification Duration Varaktighet för avisering diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index cd4f1cadd..7b979e653 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -1632,8 +1632,8 @@ Uyumluluk Veritabanını Güncelle:\nUyumluluk veri tabanını hemen güncelleyin. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Sağ + + Top + Top + + + Bottom + Bottom + Notification Duration Bildirim Süresi diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 63f8b012f..222cb9e1a 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -1632,8 +1632,8 @@ Оновити данні ігрової сумістності:\nНегайно оновить базу даних ігрової сумісності. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index fe9ad915f..5ab469b92 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index a9cf7ca19..dbfe61c16 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -1632,8 +1632,8 @@ 更新兼容性数据库:\n立即更新兼容性数据库。 - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - 打开自定义奖杯图像/声音文件夹:\n您可以自定义奖杯图像和声音。\n将文件添加到 custom_trophy 文件夹中,文件名如下:\nthophy.mp3、bronze.png、gold.png、platinum.png、silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right 右边 + + Top + Top + + + Bottom + Bottom + Notification Duration 通知显示持续时间 diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index bd3ef8f0b..cb78b7a64 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -1632,8 +1632,8 @@ Update Compatibility Database:\nImmediately update the compatibility database. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\nthophy.mp3, bronze.png, gold.png, platinum.png, silver.png + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. Never @@ -1839,6 +1839,14 @@ Right Right + + Top + Top + + + Bottom + Bottom + Notification Duration Notification Duration From 7bef4a5c70a9af9128444dda0a2c9ed8f00deb7e Mon Sep 17 00:00:00 2001 From: Paris Oplopoios Date: Tue, 4 Mar 2025 12:40:21 +0200 Subject: [PATCH 388/455] Allow our BMI1 emulation to work on non-macOS CPUs - also emulate TZCNT (#2526) * Allow our BMI1 emulation to work on non-macOS CPUs * Add TZCNT * Some changes * Subtract and add to rsp --- src/core/cpu_patches.cpp | 73 +++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/src/core/cpu_patches.cpp b/src/core/cpu_patches.cpp index 21acf1a7b..f109f0453 100644 --- a/src/core/cpu_patches.cpp +++ b/src/core/cpu_patches.cpp @@ -202,21 +202,39 @@ static void RestoreStack(Xbyak::CodeGenerator& c) { /// Switches to the patch stack, saves registers, and restores the original stack. static void SaveRegisters(Xbyak::CodeGenerator& c, const std::initializer_list regs) { + // Uses a more robust solution for saving registers on MacOS to avoid potential stack corruption + // if games decide to not follow the ABI and use the red zone. +#ifdef __APPLE__ SaveStack(c); +#else + c.lea(rsp, ptr[rsp - 128]); // red zone +#endif for (const auto& reg : regs) { c.push(reg.cvt64()); } +#ifdef __APPLE__ RestoreStack(c); +#else + c.lea(rsp, ptr[rsp + 128]); +#endif } /// Switches to the patch stack, restores registers, and restores the original stack. static void RestoreRegisters(Xbyak::CodeGenerator& c, const std::initializer_list regs) { +#ifdef __APPLE__ SaveStack(c); +#else + c.lea(rsp, ptr[rsp - 128]); // red zone +#endif for (const auto& reg : regs) { c.pop(reg.cvt64()); } +#ifdef __APPLE__ RestoreStack(c); +#else + c.lea(rsp, ptr[rsp + 128]); +#endif } /// Switches to the patch stack and stores all registers. @@ -257,12 +275,11 @@ static void RestoreContext(Xbyak::CodeGenerator& c, const Xbyak::Operand& dst, RestoreStack(c); } -#ifdef __APPLE__ - static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src1 = ZydisToXbyakRegisterOperand(operands[1]); const auto src2 = ZydisToXbyakOperand(operands[2]); + ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "ANDN overwriting the stack pointer"); // Check if src2 is a memory operand or a register different to dst. // In those cases, we don't need to use a temporary register and are free to modify dst. @@ -301,6 +318,7 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); const auto start_len = ZydisToXbyakRegisterOperand(operands[2]); + ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BEXTR overwriting the stack pointer"); const Xbyak::Reg32e shift(Xbyak::Operand::RCX, static_cast(start_len.getBit())); const auto scratch1 = @@ -338,6 +356,7 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera static void GenerateBLSI(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); + ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BLSI overwriting the stack pointer"); const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit()); @@ -367,6 +386,7 @@ static void GenerateBLSI(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat static void GenerateBLSMSK(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); + ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BLSMSK overwriting the stack pointer"); const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit()); @@ -395,9 +415,37 @@ static void GenerateBLSMSK(const ZydisDecodedOperand* operands, Xbyak::CodeGener RestoreRegisters(c, {scratch}); } +static void GenerateTZCNT(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { + const auto dst = ZydisToXbyakRegisterOperand(operands[0]); + const auto src = ZydisToXbyakOperand(operands[1]); + ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "TZCNT overwriting the stack pointer"); + + Xbyak::Label src_zero, end; + + c.cmp(*src, 0); + c.je(src_zero); + + // If src is not zero, functions like a BSF, but also clears the CF + c.bsf(dst, *src); + c.clc(); + c.jmp(end); + + c.L(src_zero); + c.mov(dst, operands[0].size); + // Since dst is not zero, also set ZF to zero. Testing dst with itself when we know + // it isn't zero is a good way to do this. + // Use cvt32 to avoid REX/Operand size prefixes. + c.test(dst.cvt32(), dst.cvt32()); + // When source is zero, TZCNT also sets CF. + c.stc(); + + c.L(end); +} + static void GenerateBLSR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); + ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BLSR overwriting the stack pointer"); const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit()); @@ -426,6 +474,8 @@ static void GenerateBLSR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat RestoreRegisters(c, {scratch}); } +#ifdef __APPLE__ + static __attribute__((sysv_abi)) void PerformVCVTPH2PS(float* out, const half_float::half* in, const u32 count) { for (u32 i = 0; i < count; i++) { @@ -616,6 +666,11 @@ static bool FilterNoSSE4a(const ZydisDecodedOperand*) { return !cpu.has(Cpu::tSSE4a); } +static bool FilterNoBMI1(const ZydisDecodedOperand*) { + Cpu cpu; + return !cpu.has(Cpu::tBMI1); +} + static void GenerateEXTRQ(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { bool immediateForm = operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE && operands[2].type == ZYDIS_OPERAND_TYPE_IMMEDIATE; @@ -897,14 +952,16 @@ static const std::unordered_map Patches = { {ZYDIS_MNEMONIC_EXTRQ, {FilterNoSSE4a, GenerateEXTRQ, true}}, {ZYDIS_MNEMONIC_INSERTQ, {FilterNoSSE4a, GenerateINSERTQ, true}}, + // BMI1 + {ZYDIS_MNEMONIC_ANDN, {FilterNoBMI1, GenerateANDN, true}}, + {ZYDIS_MNEMONIC_BEXTR, {FilterNoBMI1, GenerateBEXTR, true}}, + {ZYDIS_MNEMONIC_BLSI, {FilterNoBMI1, GenerateBLSI, true}}, + {ZYDIS_MNEMONIC_BLSMSK, {FilterNoBMI1, GenerateBLSMSK, true}}, + {ZYDIS_MNEMONIC_BLSR, {FilterNoBMI1, GenerateBLSR, true}}, + {ZYDIS_MNEMONIC_TZCNT, {FilterNoBMI1, GenerateTZCNT, true}}, + #ifdef __APPLE__ // Patches for instruction sets not supported by Rosetta 2. - // BMI1 - {ZYDIS_MNEMONIC_ANDN, {FilterRosetta2Only, GenerateANDN, true}}, - {ZYDIS_MNEMONIC_BEXTR, {FilterRosetta2Only, GenerateBEXTR, true}}, - {ZYDIS_MNEMONIC_BLSI, {FilterRosetta2Only, GenerateBLSI, true}}, - {ZYDIS_MNEMONIC_BLSMSK, {FilterRosetta2Only, GenerateBLSMSK, true}}, - {ZYDIS_MNEMONIC_BLSR, {FilterRosetta2Only, GenerateBLSR, true}}, // F16C {ZYDIS_MNEMONIC_VCVTPH2PS, {FilterRosetta2Only, GenerateVCVTPH2PS, true}}, {ZYDIS_MNEMONIC_VCVTPS2PH, {FilterRosetta2Only, GenerateVCVTPS2PH, true}}, From 3a9633f5533056853bfe6460db139bd52d950b83 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Tue, 4 Mar 2025 03:25:51 -0800 Subject: [PATCH 389/455] cpu_patches: Simplify and remove some restrictions on macOS. (#2591) --- src/core/cpu_patches.cpp | 50 +++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/core/cpu_patches.cpp b/src/core/cpu_patches.cpp index f109f0453..a9f6c67a8 100644 --- a/src/core/cpu_patches.cpp +++ b/src/core/cpu_patches.cpp @@ -180,22 +180,36 @@ static void RestoreStack(Xbyak::CodeGenerator& c) { c.mov(rsp, qword[reinterpret_cast(stack_pointer_slot * sizeof(void*))]); } +/// Validates that the dst register is supported given the SaveStack/RestoreStack implementation. +static void ValidateDst(const Xbyak::Reg& dst) { + // No restrictions. +} + #else -// These utilities are not implemented as we can't save anything to thread local storage without -// temporary registers. void InitializeThreadPatchStack() { // No-op } +// NOTE: Since stack pointer here is subtracted through safe zone and not saved anywhere, +// it must not be modified during the instruction. Otherwise, we will not be able to find +// and load registers back from where they were saved. Thus, a limitation is placed on +// instructions, that they must not use the stack pointer register as a destination. + /// Saves the stack pointer to thread local storage and loads the patch stack. static void SaveStack(Xbyak::CodeGenerator& c) { - UNIMPLEMENTED(); + c.lea(rsp, ptr[rsp - 128]); // red zone } /// Restores the stack pointer from thread local storage. static void RestoreStack(Xbyak::CodeGenerator& c) { - UNIMPLEMENTED(); + c.lea(rsp, ptr[rsp + 128]); // red zone +} + +/// Validates that the dst register is supported given the SaveStack/RestoreStack implementation. +static void ValidateDst(const Xbyak::Reg& dst) { + // Stack pointer is not preserved, so it can't be used as a dst. + ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "Stack pointer not supported as destination."); } #endif @@ -204,37 +218,21 @@ static void RestoreStack(Xbyak::CodeGenerator& c) { static void SaveRegisters(Xbyak::CodeGenerator& c, const std::initializer_list regs) { // Uses a more robust solution for saving registers on MacOS to avoid potential stack corruption // if games decide to not follow the ABI and use the red zone. -#ifdef __APPLE__ SaveStack(c); -#else - c.lea(rsp, ptr[rsp - 128]); // red zone -#endif for (const auto& reg : regs) { c.push(reg.cvt64()); } -#ifdef __APPLE__ RestoreStack(c); -#else - c.lea(rsp, ptr[rsp + 128]); -#endif } /// Switches to the patch stack, restores registers, and restores the original stack. static void RestoreRegisters(Xbyak::CodeGenerator& c, const std::initializer_list regs) { -#ifdef __APPLE__ SaveStack(c); -#else - c.lea(rsp, ptr[rsp - 128]); // red zone -#endif for (const auto& reg : regs) { c.pop(reg.cvt64()); } -#ifdef __APPLE__ RestoreStack(c); -#else - c.lea(rsp, ptr[rsp + 128]); -#endif } /// Switches to the patch stack and stores all registers. @@ -279,7 +277,7 @@ static void GenerateANDN(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src1 = ZydisToXbyakRegisterOperand(operands[1]); const auto src2 = ZydisToXbyakOperand(operands[2]); - ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "ANDN overwriting the stack pointer"); + ValidateDst(dst); // Check if src2 is a memory operand or a register different to dst. // In those cases, we don't need to use a temporary register and are free to modify dst. @@ -318,7 +316,7 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); const auto start_len = ZydisToXbyakRegisterOperand(operands[2]); - ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BEXTR overwriting the stack pointer"); + ValidateDst(dst); const Xbyak::Reg32e shift(Xbyak::Operand::RCX, static_cast(start_len.getBit())); const auto scratch1 = @@ -356,7 +354,7 @@ static void GenerateBEXTR(const ZydisDecodedOperand* operands, Xbyak::CodeGenera static void GenerateBLSI(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); - ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BLSI overwriting the stack pointer"); + ValidateDst(dst); const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit()); @@ -386,7 +384,7 @@ static void GenerateBLSI(const ZydisDecodedOperand* operands, Xbyak::CodeGenerat static void GenerateBLSMSK(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); - ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BLSMSK overwriting the stack pointer"); + ValidateDst(dst); const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit()); @@ -418,7 +416,7 @@ static void GenerateBLSMSK(const ZydisDecodedOperand* operands, Xbyak::CodeGener static void GenerateTZCNT(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); - ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "TZCNT overwriting the stack pointer"); + ValidateDst(dst); Xbyak::Label src_zero, end; @@ -445,7 +443,7 @@ static void GenerateTZCNT(const ZydisDecodedOperand* operands, Xbyak::CodeGenera static void GenerateBLSR(const ZydisDecodedOperand* operands, Xbyak::CodeGenerator& c) { const auto dst = ZydisToXbyakRegisterOperand(operands[0]); const auto src = ZydisToXbyakOperand(operands[1]); - ASSERT_MSG(dst.getIdx() != rsp.getIdx(), "BLSR overwriting the stack pointer"); + ValidateDst(dst); const auto scratch = AllocateScratchRegister({&dst, src.get()}, dst.getBit()); From ba109a4c53ac8f6905e9e62175a2d9adada2e391 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 4 Mar 2025 17:03:14 +0200 Subject: [PATCH 390/455] New Crowdin updates (#2592) * New translations en_us.ts (Albanian) * New translations en_us.ts (Swedish) * New translations en_us.ts (Polish) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Spanish) * New translations en_us.ts (Romanian) * New translations en_us.ts (French) * New translations en_us.ts (Arabic) * New translations en_us.ts (Danish) * New translations en_us.ts (German) * New translations en_us.ts (Greek) * New translations en_us.ts (Finnish) * New translations en_us.ts (Hungarian) * New translations en_us.ts (Italian) * New translations en_us.ts (Japanese) * New translations en_us.ts (Korean) * New translations en_us.ts (Lithuanian) * New translations en_us.ts (Dutch) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Russian) * New translations en_us.ts (Turkish) * New translations en_us.ts (Ukrainian) * New translations en_us.ts (Chinese Simplified) * New translations en_us.ts (Chinese Traditional) * New translations en_us.ts (Vietnamese) * New translations en_us.ts (Indonesian) * New translations en_us.ts (Persian) * New translations en_us.ts (Norwegian Bokmal) * New translations en_us.ts (Portuguese, Brazilian) * New translations en_us.ts (Italian) * New translations en_us.ts (Portuguese) * New translations en_us.ts (Chinese Simplified) --- src/qt_gui/translations/ar_SA.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/da_DK.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/de_DE.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/el_GR.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/es_ES.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/fa_IR.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/fi_FI.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/fr_FR.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/hu_HU.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/id_ID.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/it_IT.ts | 177 +++++++++++++++++++++++++++++- src/qt_gui/translations/ja_JP.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/ko_KR.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/lt_LT.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/nb_NO.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/nl_NL.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/pl_PL.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/pt_BR.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/pt_PT.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/ro_RO.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/ru_RU.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/sq_AL.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/sv_SE.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/tr_TR.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/uk_UA.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/vi_VN.ts | 175 ++++++++++++++++++++++++++++++ src/qt_gui/translations/zh_CN.ts | 181 ++++++++++++++++++++++++++++++- src/qt_gui/translations/zh_TW.ts | 175 ++++++++++++++++++++++++++++++ 28 files changed, 4904 insertions(+), 4 deletions(-) diff --git a/src/qt_gui/translations/ar_SA.ts b/src/qt_gui/translations/ar_SA.ts index 44d68dcb4..7c5cf1631 100644 --- a/src/qt_gui/translations/ar_SA.ts +++ b/src/qt_gui/translations/ar_SA.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/da_DK.ts b/src/qt_gui/translations/da_DK.ts index a9871f21d..591f9b659 100644 --- a/src/qt_gui/translations/da_DK.ts +++ b/src/qt_gui/translations/da_DK.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/de_DE.ts b/src/qt_gui/translations/de_DE.ts index 97eb99d0d..8a903070e 100644 --- a/src/qt_gui/translations/de_DE.ts +++ b/src/qt_gui/translations/de_DE.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/el_GR.ts b/src/qt_gui/translations/el_GR.ts index c409d558d..113d095fc 100644 --- a/src/qt_gui/translations/el_GR.ts +++ b/src/qt_gui/translations/el_GR.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/es_ES.ts b/src/qt_gui/translations/es_ES.ts index c6caed584..24b8a9bfe 100644 --- a/src/qt_gui/translations/es_ES.ts +++ b/src/qt_gui/translations/es_ES.ts @@ -903,6 +903,169 @@ Eliminar archivo PKG tras la instalación + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/fa_IR.ts b/src/qt_gui/translations/fa_IR.ts index 17a1ecfad..8e03ec59d 100644 --- a/src/qt_gui/translations/fa_IR.ts +++ b/src/qt_gui/translations/fa_IR.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/fi_FI.ts b/src/qt_gui/translations/fi_FI.ts index 74d9bb518..9d171b7fc 100644 --- a/src/qt_gui/translations/fi_FI.ts +++ b/src/qt_gui/translations/fi_FI.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/fr_FR.ts b/src/qt_gui/translations/fr_FR.ts index ecbe88b1e..e17ff70cb 100644 --- a/src/qt_gui/translations/fr_FR.ts +++ b/src/qt_gui/translations/fr_FR.ts @@ -903,6 +903,169 @@ Supprimer le fichier PKG à l'installation + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/hu_HU.ts b/src/qt_gui/translations/hu_HU.ts index aa123ccf2..1ee60ef19 100644 --- a/src/qt_gui/translations/hu_HU.ts +++ b/src/qt_gui/translations/hu_HU.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/id_ID.ts b/src/qt_gui/translations/id_ID.ts index bd8f6b11d..2ef26aa37 100644 --- a/src/qt_gui/translations/id_ID.ts +++ b/src/qt_gui/translations/id_ID.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/it_IT.ts b/src/qt_gui/translations/it_IT.ts index 032234300..bb357ef04 100644 --- a/src/qt_gui/translations/it_IT.ts +++ b/src/qt_gui/translations/it_IT.ts @@ -903,6 +903,169 @@ Elimina file PKG dopo Installazione + + KBMSettings + + Configure Controls + Configura Comandi + + + D-Pad + Croce direzionale + + + Up + Su + + + unmapped + non mappato + + + Left + Sinistra + + + Right + Destra + + + Down + Giù + + + Left Analog Halfmode + Mezza Modalità Analogico Sinistra + + + hold to move left stick at half-speed + tieni premuto per muovere la levetta analogica sinistra a metà velocità + + + Left Stick + Levetta Sinistra + + + Config Selection + Selezione Configurazione + + + Common Config + Configurazione Comune + + + Use per-game configs + Usa configurazioni per gioco + + + Copy from Common Config + Copia da Configurazione Comune + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Editor Testuale + + + Help + Aiuto + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Click Touchpad + + + Mouse to Joystick + Mouse a Joystick + + + *press F7 ingame to activate + *premere F7 in gioco per attivare + + + R3 + R3 + + + Options + Opzioni + + + Mouse Movement Parameters + Parametri Movimento Del Mouse + + + note: click Help Button/Special Keybindings for more information + nota: cliccare sul Pulsante Aiuto/Associazioni Speciali dei Tasti per maggiori informazioni + + + Face Buttons + Pulsanti Frontali + + + Triangle + Triangolo + + + Square + Quadrato + + + Circle + Cerchio + + + Cross + Croce + + + Right Analog Halfmode + Mezza Modalità Analogico Destra + + + hold to move right stick at half-speed + tieni premuto per muovere la levetta analogica destra a metà velocità + + + Right Stick + Levetta Destra + + + Deadzone Offset (def 0.50): + Scostamento Zona Morta (def 0,50): + + + Speed Multiplier (def 1.0): + Moltiplicatore Di Velocità (def 1,0): + + + Speed Offset (def 0.125): + Scostamento Velocità (def 0,125): + + + Speed Offset (def 0.125): + Scostamento Velocità (def 0,125): + + MainWindow @@ -1633,7 +1796,7 @@ Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + Apri la cartella personalizzata delle immagini/suoni trofei:\nÈ possibile aggiungere immagini personalizzate ai trofei e un audio.\nAggiungi i file a custom_trophy con i seguenti nomi:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNota: Il suono funzionerà solo nelle versioni QT. Never @@ -1851,6 +2014,18 @@ Notification Duration Durata Notifica + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Cartella utente portatile:\nMemorizza le impostazioni e i dati shadPS4 che saranno applicati solo alla build shadPS4 situata nella cartella attuale. Riavviare l'applicazione dopo aver creato la cartella utente portatile per iniziare a usarla. + TrophyViewer diff --git a/src/qt_gui/translations/ja_JP.ts b/src/qt_gui/translations/ja_JP.ts index 7350057dd..70264ef12 100644 --- a/src/qt_gui/translations/ja_JP.ts +++ b/src/qt_gui/translations/ja_JP.ts @@ -903,6 +903,169 @@ インストール時にPKGファイルを削除 + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/ko_KR.ts b/src/qt_gui/translations/ko_KR.ts index 6bc8ddfb1..096fef0a3 100644 --- a/src/qt_gui/translations/ko_KR.ts +++ b/src/qt_gui/translations/ko_KR.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/lt_LT.ts b/src/qt_gui/translations/lt_LT.ts index c384da08b..7d69e10b9 100644 --- a/src/qt_gui/translations/lt_LT.ts +++ b/src/qt_gui/translations/lt_LT.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/nb_NO.ts b/src/qt_gui/translations/nb_NO.ts index 89400aaa4..a3adbcc5d 100644 --- a/src/qt_gui/translations/nb_NO.ts +++ b/src/qt_gui/translations/nb_NO.ts @@ -903,6 +903,169 @@ Slett PKG-fila ved installering + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Varslingsvarighet + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/nl_NL.ts b/src/qt_gui/translations/nl_NL.ts index 924f59ef7..1b752649a 100644 --- a/src/qt_gui/translations/nl_NL.ts +++ b/src/qt_gui/translations/nl_NL.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/pl_PL.ts b/src/qt_gui/translations/pl_PL.ts index 8a8ac83f7..3b22ba9a5 100644 --- a/src/qt_gui/translations/pl_PL.ts +++ b/src/qt_gui/translations/pl_PL.ts @@ -903,6 +903,169 @@ Usuń plik PKG po instalacji + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Czas trwania powiadomienia + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/pt_BR.ts b/src/qt_gui/translations/pt_BR.ts index 5fe1774ba..9fa7c49aa 100644 --- a/src/qt_gui/translations/pt_BR.ts +++ b/src/qt_gui/translations/pt_BR.ts @@ -903,6 +903,169 @@ Excluir o PKG após a Instalação + + KBMSettings + + Configure Controls + Configurar Controles + + + D-Pad + Direcionais + + + Up + Cima + + + unmapped + não mapeado + + + Left + Esquerda + + + Right + Direita + + + Down + Baixo + + + Left Analog Halfmode + Meio Analógico Esquerdo + + + hold to move left stick at half-speed + Segure para mover o analógico esquerdo pela metade da velocidade + + + Left Stick + Analógico Esquerdo + + + Config Selection + Seleção de Configuração + + + Common Config + Configuração Comum + + + Use per-game configs + Usar configurações por jogo + + + Copy from Common Config + Copiar da Configuração Comum + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Editor de Texto + + + Help + Ajuda + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Clique do Touchpad + + + Mouse to Joystick + Mouse para Analógico + + + *press F7 ingame to activate + *Pressione F7 no jogo para ativar + + + R3 + R3 + + + Options + Opções + + + Mouse Movement Parameters + Parâmetros de Movimento do Mouse + + + note: click Help Button/Special Keybindings for more information + Nota: clique no botão de Ajuda -> Special Bindings para obter mais informações + + + Face Buttons + Botões de Ação + + + Triangle + Triângulo + + + Square + Quadrado + + + Circle + Círculo + + + Cross + Cruz + + + Right Analog Halfmode + Meio Analógico Direito + + + hold to move right stick at half-speed + Segure para mover o analógico direito pela metade da velocidade + + + Right Stick + Analógico Direito + + + Deadzone Offset (def 0.50): + Deslocamento da Zona Morta (Pad 0,50): + + + Speed Multiplier (def 1.0): + Multiplicador de Velocidade (Pad 1,0): + + + Speed Offset (def 0.125): + Deslocamento de Velocidade (Pad 0,125): + + + Speed Offset (def 0.125): + Deslocamento de Velocidade (Pad 0,125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Duração da Notificação + + Portable User Folder + Pasta de Usuário Portátil + + + Create Portable User Folder from Common User Folder + Criar Pasta de Usuário Portátil a partir da Pasta de Usuário Comum + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Pasta de usuário portátil:\nArmazena as configurações e dados do shadPS4 que serão aplicados apenas à compilação do shadPS4 localizada na pasta atual. Reinicie o aplicativo após criar a pasta de usuário portátil para começar a usá-la. + TrophyViewer diff --git a/src/qt_gui/translations/pt_PT.ts b/src/qt_gui/translations/pt_PT.ts index b279d1c5b..db7e15107 100644 --- a/src/qt_gui/translations/pt_PT.ts +++ b/src/qt_gui/translations/pt_PT.ts @@ -903,6 +903,169 @@ Eliminar Ficheiro PKG após Instalação + + KBMSettings + + Configure Controls + Configurar Comandos + + + D-Pad + Botões de Direção + + + Up + Cima + + + unmapped + não mapeado + + + Left + Esquerda + + + Right + Direita + + + Down + Baixo + + + Left Analog Halfmode + Meio Modo do Manípulo Esquerdo + + + hold to move left stick at half-speed + mantenha pressionado para mover o manípulo esquerdo à metade da velocidade + + + Left Stick + Manípulo Esquerdo + + + Config Selection + Seleção de Configuração + + + Common Config + Configuração Comum + + + Use per-game configs + Utilizar configurações por jogo + + + Copy from Common Config + Copiar da Configuração Comum + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Editor de Texto + + + Help + Ajuda + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Clique do Touchpad + + + Mouse to Joystick + Rato para Manípulo + + + *press F7 ingame to activate + *pressione F7 em jogo para ativar + + + R3 + R3 + + + Options + Opções + + + Mouse Movement Parameters + Parâmetros de Movimento do Rato + + + note: click Help Button/Special Keybindings for more information + nota: clique no Botão de Ajuda/Special Keybindings para obter mais informações + + + Face Buttons + Botões Frontais + + + Triangle + Triângulo + + + Square + Quadrado + + + Circle + Círculo + + + Cross + Cruz + + + Right Analog Halfmode + Meio Modo do Manípulo Direito + + + hold to move right stick at half-speed + mantenha pressionado para mover o manípulo direito à metade da velocidade + + + Right Stick + Manípulo Direito + + + Deadzone Offset (def 0.50): + Deslocamento da Zona Morta (def 0,50): + + + Speed Multiplier (def 1.0): + Multiplicador de Velocidade (def 1,0): + + + Speed Offset (def 0.125): + Deslocamento de Velocidade (def 0,125): + + + Speed Offset (def 0.125): + Deslocamento de Velocidade (def 0,125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Duração da Notificação + + Portable User Folder + Pasta de Utilizador Portátil + + + Create Portable User Folder from Common User Folder + Criar Pasta de Utilizador Portátil a partir da Pasta de Utilizador Comum + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Pasta de utilizador portátil:\nArmazena as definições e dados do shadPS4 que serão aplicados apenas na compilação do shadPS4 localizada na pasta atual. Reinicie a aplicação após criar a pasta de utilizador portátil para começar a usá-la. + TrophyViewer diff --git a/src/qt_gui/translations/ro_RO.ts b/src/qt_gui/translations/ro_RO.ts index e57b23150..1fc4b9e99 100644 --- a/src/qt_gui/translations/ro_RO.ts +++ b/src/qt_gui/translations/ro_RO.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/ru_RU.ts b/src/qt_gui/translations/ru_RU.ts index c454ead29..cf7fdccb9 100644 --- a/src/qt_gui/translations/ru_RU.ts +++ b/src/qt_gui/translations/ru_RU.ts @@ -903,6 +903,169 @@ Удалить файл PKG при установке + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Продолжительность уведомления + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/sq_AL.ts b/src/qt_gui/translations/sq_AL.ts index 0b75e767d..c34d3c6be 100644 --- a/src/qt_gui/translations/sq_AL.ts +++ b/src/qt_gui/translations/sq_AL.ts @@ -903,6 +903,169 @@ Fshi skedarin PKG pas instalimit + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Kohëzgjatja e Njoftimit + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/sv_SE.ts b/src/qt_gui/translations/sv_SE.ts index f317b1974..0bea6b717 100644 --- a/src/qt_gui/translations/sv_SE.ts +++ b/src/qt_gui/translations/sv_SE.ts @@ -903,6 +903,169 @@ Ta bort PKG-fil efter installation + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Varaktighet för avisering + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/tr_TR.ts b/src/qt_gui/translations/tr_TR.ts index 7b979e653..18362ae75 100644 --- a/src/qt_gui/translations/tr_TR.ts +++ b/src/qt_gui/translations/tr_TR.ts @@ -903,6 +903,169 @@ Yüklemede PKG Dosyasını Sil + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Bildirim Süresi + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/uk_UA.ts b/src/qt_gui/translations/uk_UA.ts index 222cb9e1a..96c8e7c14 100644 --- a/src/qt_gui/translations/uk_UA.ts +++ b/src/qt_gui/translations/uk_UA.ts @@ -903,6 +903,169 @@ Видалити файл PKG під час встановлення + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/vi_VN.ts b/src/qt_gui/translations/vi_VN.ts index 5ab469b92..30a69e2f3 100644 --- a/src/qt_gui/translations/vi_VN.ts +++ b/src/qt_gui/translations/vi_VN.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer diff --git a/src/qt_gui/translations/zh_CN.ts b/src/qt_gui/translations/zh_CN.ts index dbfe61c16..2dd554753 100644 --- a/src/qt_gui/translations/zh_CN.ts +++ b/src/qt_gui/translations/zh_CN.ts @@ -903,6 +903,169 @@ 安装后删除 PKG 文件 + + KBMSettings + + Configure Controls + 配置键鼠 + + + D-Pad + D-Pad + + + Up + + + + unmapped + 未映射 + + + Left + + + + Right + + + + Down + + + + Left Analog Halfmode + 左摇杆半速模式 + + + hold to move left stick at half-speed + 按住以半速移动左摇杆 + + + Left Stick + 左摇杆 + + + Config Selection + 配置选择 + + + Common Config + 通用配置 + + + Use per-game configs + 每个游戏使用单独的配置 + + + Copy from Common Config + 从通用配置中复制 + + + L1 + L1 + + + L2 + L2 + + + Text Editor + 文本编辑器 + + + Help + 帮助 + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + 触摸板点击 + + + Mouse to Joystick + 鼠标控制摇杆 + + + *press F7 ingame to activate + * 按 F7 键激活 + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + 鼠标移动参数 + + + note: click Help Button/Special Keybindings for more information + 注意:点击帮助按钮 -> Special Bindings 获取更多信息 + + + Face Buttons + 正面按钮 + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + 右摇杆半速模式 + + + hold to move right stick at half-speed + 按住以半速移动右摇杆 + + + Right Stick + 右摇杆 + + + Deadzone Offset (def 0.50): + 死区偏移量(默认 0.50): + + + Speed Multiplier (def 1.0): + 速度系数(默认 1.0): + + + Speed Offset (def 0.125): + 速度偏移量(默认 0.125): + + + Speed Offset (def 0.125): + 速度偏移量(默认 0.125): + + MainWindow @@ -1633,7 +1796,7 @@ Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. - Open the custom trophy images/sounds folder:\nYou can add custom images to the trophies and an audio.\nAdd the files to custom_trophy with the following names:\ntrophy.mp3, bronze.png, gold.png, platinum.png, silver.png\nNote: The sound will only work in QT versions. + 打开自定义奖杯图像/声音文件夹:\n您可以自定义奖杯图像和声音。\n将文件添加到 custom_trophy 文件夹中,文件名如下:\ntrophy.mp3、bronze.png、gold.png、platinum.png、silver.png。\n注意:自定义声音只能在 QT 版本中生效。 Never @@ -1841,16 +2004,28 @@ Top - Top + 顶部 Bottom - Bottom + 底部 Notification Duration 通知显示持续时间 + + Portable User Folder + 本地用户文件夹 + + + Create Portable User Folder from Common User Folder + 从公共用户文件夹创建本地用户文件夹 + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + 本地用户文件夹:\n存储 shadPS4 设置和数据,这些设置和数据仅应用于当前运行的 shadPS4。创建本地用户文件夹后,重启应用即可开始使用。 + TrophyViewer diff --git a/src/qt_gui/translations/zh_TW.ts b/src/qt_gui/translations/zh_TW.ts index cb78b7a64..913ca9aba 100644 --- a/src/qt_gui/translations/zh_TW.ts +++ b/src/qt_gui/translations/zh_TW.ts @@ -903,6 +903,169 @@ Delete PKG File on Install + + KBMSettings + + Configure Controls + Configure Controls + + + D-Pad + D-Pad + + + Up + Up + + + unmapped + unmapped + + + Left + Left + + + Right + Right + + + Down + Down + + + Left Analog Halfmode + Left Analog Halfmode + + + hold to move left stick at half-speed + hold to move left stick at half-speed + + + Left Stick + Left Stick + + + Config Selection + Config Selection + + + Common Config + Common Config + + + Use per-game configs + Use per-game configs + + + Copy from Common Config + Copy from Common Config + + + L1 + L1 + + + L2 + L2 + + + Text Editor + Text Editor + + + Help + Help + + + R1 + R1 + + + R2 + R2 + + + L3 + L3 + + + Touchpad Click + Touchpad Click + + + Mouse to Joystick + Mouse to Joystick + + + *press F7 ingame to activate + *press F7 ingame to activate + + + R3 + R3 + + + Options + Options + + + Mouse Movement Parameters + Mouse Movement Parameters + + + note: click Help Button/Special Keybindings for more information + note: click Help Button/Special Keybindings for more information + + + Face Buttons + Face Buttons + + + Triangle + Triangle + + + Square + Square + + + Circle + Circle + + + Cross + Cross + + + Right Analog Halfmode + Right Analog Halfmode + + + hold to move right stick at half-speed + hold to move right stick at half-speed + + + Right Stick + Right Stick + + + Deadzone Offset (def 0.50): + Deadzone Offset (def 0.50): + + + Speed Multiplier (def 1.0): + Speed Multiplier (def 1.0): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + + Speed Offset (def 0.125): + Speed Offset (def 0.125): + + MainWindow @@ -1851,6 +2014,18 @@ Notification Duration Notification Duration + + Portable User Folder + Portable User Folder + + + Create Portable User Folder from Common User Folder + Create Portable User Folder from Common User Folder + + + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + Portable user folder:\nStores shadPS4 settings and data that will be applied only to the shadPS4 build located in the current folder. Restart the app after creating the portable user folder to begin using it. + TrophyViewer From f4bf53402fcaffae987d717f0424682031eebfc9 Mon Sep 17 00:00:00 2001 From: rainmakerv2 <30595646+rainmakerv3@users.noreply.github.com> Date: Tue, 4 Mar 2025 23:03:30 +0800 Subject: [PATCH 391/455] Fix space (#2594) * Add missing space so only once translation is auto-generated * Use suggested format * delete an extra space --------- Co-authored-by: rainmakerv2 <30595646+jpau02@users.noreply.github.com> --- src/qt_gui/kbm_gui.cpp | 10 +++++----- src/qt_gui/kbm_gui.ui | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt_gui/kbm_gui.cpp b/src/qt_gui/kbm_gui.cpp index e43eb282f..ced9a5b0c 100644 --- a/src/qt_gui/kbm_gui.cpp +++ b/src/qt_gui/kbm_gui.cpp @@ -105,13 +105,13 @@ KBMSettings::KBMSettings(std::shared_ptr game_info_get, QWidget* connect(ui->DeadzoneOffsetSlider, &QSlider::valueChanged, this, [this](int value) { QString DOSValue = QString::number(value / 100.0, 'f', 2); - QString DOSString = tr("Deadzone Offset (def 0.50): ") + DOSValue; + QString DOSString = tr("Deadzone Offset (def 0.50):") + " " + DOSValue; ui->DeadzoneOffsetLabel->setText(DOSString); }); connect(ui->SpeedMultiplierSlider, &QSlider::valueChanged, this, [this](int value) { QString SMSValue = QString::number(value / 10.0, 'f', 1); - QString SMSString = tr("Speed Multiplier (def 1.0): ") + SMSValue; + QString SMSString = tr("Speed Multiplier (def 1.0):") + " " + SMSValue; ui->SpeedMultiplierLabel->setText(SMSString); }); @@ -576,7 +576,7 @@ void KBMSettings::SetUIValuestoMappings(std::string config_id) { int DOffsetInt = int(DOffsetValue); ui->DeadzoneOffsetSlider->setValue(DOffsetInt); QString LabelValue = QString::number(DOffsetInt / 100.0, 'f', 2); - QString LabelString = tr("Deadzone Offset (def 0.50): ") + LabelValue; + QString LabelString = tr("Deadzone Offset (def 0.50):") + " " + LabelValue; ui->DeadzoneOffsetLabel->setText(LabelString); std::string SMSOstring = line.substr(comma_pos + 1); @@ -591,7 +591,7 @@ void KBMSettings::SetUIValuestoMappings(std::string config_id) { SpeedMultInt = 50; ui->SpeedMultiplierSlider->setValue(SpeedMultInt); LabelValue = QString::number(SpeedMultInt / 10.0, 'f', 1); - LabelString = tr("Speed Multiplier (def 1.0): ") + LabelValue; + LabelString = tr("Speed Multiplier (def 1.0):") + " " + LabelValue; ui->SpeedMultiplierLabel->setText(LabelString); std::string SOstring = SMSOstring.substr(comma_pos2 + 1); @@ -599,7 +599,7 @@ void KBMSettings::SetUIValuestoMappings(std::string config_id) { int SOffsetInt = int(SOffsetValue); ui->SpeedOffsetSlider->setValue(SOffsetInt); LabelValue = QString::number(SOffsetInt / 1000.0, 'f', 3); - LabelString = tr("Speed Offset (def 0.125): ") + LabelValue; + LabelString = tr("Speed Offset (def 0.125):") + " " + LabelValue; ui->SpeedOffsetLabel->setText(LabelString); } } diff --git a/src/qt_gui/kbm_gui.ui b/src/qt_gui/kbm_gui.ui index fb8e4882b..0eac88105 100644 --- a/src/qt_gui/kbm_gui.ui +++ b/src/qt_gui/kbm_gui.ui @@ -634,7 +634,7 @@ Qt::FocusPolicy::NoFocus - Copy from Common Config + Copy from Common Config From f62884ffda84ac5b5984624034fd88d7d11e102e Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 4 Mar 2025 17:07:26 +0200 Subject: [PATCH 392/455] [ci skip] Qt GUI: Update Translation. (#2595) Co-authored-by: georgemoralis <4313123+georgemoralis@users.noreply.github.com> --- src/qt_gui/translations/en_US.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index 2aa65e9d1..8e43a9ae0 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -957,10 +957,6 @@ Use per-game configs - - Copy from Common Config - - L1 @@ -1049,20 +1045,20 @@ Right Stick - - Deadzone Offset (def 0.50): - - - - Speed Multiplier (def 1.0): - - Speed Offset (def 0.125): - Speed Offset (def 0.125): + Copy from Common Config + + + + Deadzone Offset (def 0.50): + + + + Speed Multiplier (def 1.0): From dc52cfb9bc59b99710a827526dd5a5e4d865b3ce Mon Sep 17 00:00:00 2001 From: DanielSvoboda Date: Tue, 4 Mar 2025 12:07:45 -0300 Subject: [PATCH 393/455] Clickable links for PRs in the changelog (#2588) --- src/qt_gui/check_update.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/qt_gui/check_update.cpp b/src/qt_gui/check_update.cpp index 5cae6c41a..e73a66a71 100644 --- a/src/qt_gui/check_update.cpp +++ b/src/qt_gui/check_update.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include @@ -247,7 +247,7 @@ void CheckUpdate::setupUI(const QString& downloadUrl, const QString& latestDate, bool latest_isWIP = latestRev.endsWith("WIP", Qt::CaseInsensitive); if (current_isWIP && !latest_isWIP) { } else { - QTextEdit* textField = new QTextEdit(this); + QTextBrowser* textField = new QTextBrowser(this); textField->setReadOnly(true); textField->setFixedWidth(500); textField->setFixedHeight(200); @@ -349,8 +349,28 @@ void CheckUpdate::requestChangelog(const QString& currentRev, const QString& lat } // Update the text field with the changelog - QTextEdit* textField = findChild(); + QTextBrowser* textField = findChild(); if (textField) { + QRegularExpression re("\\(\\#(\\d+)\\)"); + QString newChanges; + int lastIndex = 0; + QRegularExpressionMatchIterator i = re.globalMatch(changes); + while (i.hasNext()) { + QRegularExpressionMatch match = i.next(); + newChanges += changes.mid(lastIndex, match.capturedStart() - lastIndex); + QString num = match.captured(1); + newChanges += + QString( + "(#%1)") + .arg(num); + lastIndex = match.capturedEnd(); + } + + newChanges += changes.mid(lastIndex); + changes = newChanges; + + textField->setOpenExternalLinks(true); textField->setHtml("